-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 7b1bfed
Showing
23 changed files
with
5,523 additions
and
0 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
const Koa = require('koa'); | ||
const app = new Koa(); | ||
const views = require('koa-views'); | ||
const json = require('koa-json'); | ||
const onerror = require('koa-onerror'); | ||
const bodyparser = require('koa-bodyparser'); | ||
const logger = require('koa-logger'); | ||
const Routers = require('./routes/index'); | ||
const cors = require('koa-cors'); | ||
const jwt = require('koa-jwt'); | ||
const secret = require('./config/secret'); | ||
const JWTToken = require('./middleware/JWTToken'); | ||
|
||
//开启jwt验证 | ||
app.use(JWTToken()); | ||
app.use(cors()); | ||
//注册和登录不需要验证 | ||
app.use(jwt({secret: secret.sign}).unless({ | ||
path: [ | ||
// 注册 | ||
/^\/api\/v1\/user\/register/, | ||
// 登录 | ||
/^\/api\/v1\/user\/login/, | ||
] | ||
})) | ||
|
||
// error handler | ||
onerror(app); | ||
|
||
// middlewares | ||
app.use(bodyparser({ | ||
enableTypes: ['json', 'form', 'text'] | ||
})) | ||
app.use(json()); | ||
app.use(logger()); | ||
app.use(require('koa-static')(__dirname + '/public')); | ||
|
||
app.use(views(__dirname + '/views', { | ||
extension: 'pug' | ||
})) | ||
|
||
// logger | ||
app.use(async (ctx, next) => { | ||
const start = new Date(); | ||
await next(); | ||
const ms = new Date() - start; | ||
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`); | ||
}) | ||
|
||
// routes 注册路由 | ||
app.use(Routers.routes(), Routers.allowedMethods()); | ||
|
||
|
||
// error-handling | ||
app.on('error', (err, ctx) => { | ||
console.error('server error', err, ctx) | ||
}); | ||
|
||
module.exports = app; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
#!/usr/bin/env node | ||
|
||
/** | ||
* Module dependencies. | ||
*/ | ||
|
||
var app = require('../app'); | ||
var debug = require('debug')('demo:server'); | ||
var http = require('http'); | ||
|
||
/** | ||
* Get port from environment and store in Express. | ||
*/ | ||
|
||
var port = normalizePort(process.env.PORT || '3000'); | ||
// app.set('port', port); | ||
|
||
/** | ||
* Create HTTP server. | ||
*/ | ||
|
||
var server = http.createServer(app.callback()); | ||
|
||
/** | ||
* Listen on provided port, on all network interfaces. | ||
*/ | ||
|
||
server.listen(port); | ||
server.on('error', onError); | ||
server.on('listening', onListening); | ||
|
||
/** | ||
* Normalize a port into a number, string, or false. | ||
*/ | ||
|
||
function normalizePort(val) { | ||
var port = parseInt(val, 10); | ||
|
||
if (isNaN(port)) { | ||
// named pipe | ||
return val; | ||
} | ||
|
||
if (port >= 0) { | ||
// port number | ||
return port; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
/** | ||
* Event listener for HTTP server "error" event. | ||
*/ | ||
|
||
function onError(error) { | ||
if (error.syscall !== 'listen') { | ||
throw error; | ||
} | ||
|
||
var bind = typeof port === 'string' | ||
? 'Pipe ' + port | ||
: 'Port ' + port; | ||
|
||
// handle specific listen errors with friendly messages | ||
switch (error.code) { | ||
case 'EACCES': | ||
console.error(bind + ' requires elevated privileges'); | ||
process.exit(1); | ||
break; | ||
case 'EADDRINUSE': | ||
console.error(bind + ' is already in use'); | ||
process.exit(1); | ||
break; | ||
default: | ||
throw error; | ||
} | ||
} | ||
|
||
/** | ||
* Event listener for HTTP server "listening" event. | ||
*/ | ||
|
||
function onListening() { | ||
var addr = server.address(); | ||
var bind = typeof addr === 'string' | ||
? 'pipe ' + addr | ||
: 'port ' + addr.port; | ||
debug('Listening on ' + bind); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"sign": "secret" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,163 @@ | ||
const ArticleModel = require('../models/article'); | ||
const ServiceStatus = require('./status.config'); | ||
|
||
class articleController { | ||
/** | ||
* 创建文章 | ||
* @param ctx | ||
* @returns {Promise.<void>} | ||
*/ | ||
static async create(ctx) { | ||
// 接收客服端 | ||
let req = ctx.request.body; | ||
if (req.title // 文章标题 | ||
&& req.author // 文章作者 | ||
&& req.content // 文章内容 | ||
&& req.category // 文章分类 | ||
) { | ||
try { | ||
// 创建文章模型 | ||
const ret = await ArticleModel.createArticle(req); | ||
// 把刚刚新建的文章ID查询文章详情,且返回新创建的文章信息 | ||
const data = await ArticleModel.getArticleDetail(ret.id); | ||
|
||
ctx.response.status = 200; | ||
ctx.body = { | ||
code: 200, | ||
msg: '创建文章成功', | ||
data | ||
} | ||
|
||
} catch (err) { | ||
ctx.response.status = 412; | ||
ctx.body = { | ||
code: 200, | ||
msg: '创建文章失败', | ||
data: err | ||
} | ||
} | ||
} else { | ||
ctx.response.status = 416; | ||
ctx.body = { | ||
code: 200, | ||
msg: '参数不齐全', | ||
} | ||
} | ||
|
||
} | ||
|
||
/** | ||
* 获取文章详情 | ||
* @param ctx | ||
* @returns {Promise.<void>} | ||
*/ | ||
static async detail(ctx) { | ||
let id = ctx.params.id; | ||
if (id) { | ||
try { | ||
// 查询文章详情模型 | ||
let data = await ArticleModel.getArticleDetail(id); | ||
ctx.response.status = ServiceStatus.success.code; | ||
ctx.body = { | ||
code: ServiceStatus.success.code, | ||
msg: ServiceStatus.success.msg, | ||
data | ||
} | ||
|
||
} catch (err) { | ||
ctx.response.status = ServiceStatus.fail.code; | ||
ctx.body = { | ||
code: ServiceStatus.fail.code, | ||
msg: ServiceStatus.fail.msg, | ||
err | ||
} | ||
} | ||
} else { | ||
ctx.response.status = 416; | ||
ctx.body = { | ||
code: 416, | ||
msg: '文章ID必须传' | ||
} | ||
} | ||
} | ||
|
||
/* | ||
* 查询文章列表 | ||
* page 分页数 | ||
* limit 每页数 | ||
* | ||
* */ | ||
static async getList(ctx){ | ||
let param = ctx.request.body; | ||
try { | ||
let data = await ArticleModel.getArticleList(param); | ||
ctx.response.status = ServiceStatus.success.code; | ||
ctx.body = { | ||
code: ServiceStatus.success.code, | ||
msg: ServiceStatus.success.msg, | ||
data | ||
} | ||
} catch (err) { | ||
ctx.response.status = ServiceStatus.fail.code; | ||
ctx.body = { | ||
code: ServiceStatus.fail.code, | ||
msg: ServiceStatus.fail.msg, | ||
err | ||
|
||
} | ||
} | ||
} | ||
/* | ||
* 修改文章 | ||
* */ | ||
static async updateArticle(ctx){ | ||
let data = ctx.request.body; | ||
if(data.id){ | ||
const res = await ArticleModel.updateArticle(data); | ||
ctx.response.status = ServiceStatus.success.code; | ||
ctx.body = { | ||
code: ServiceStatus.success.code, | ||
msg: ServiceStatus.success.msg | ||
} | ||
}else{ | ||
ctx.response.status = ServiceStatus.fail.code; | ||
ctx.body = { | ||
code: ServiceStatus.fail.code, | ||
msg: 'id为必选项' | ||
} | ||
} | ||
} | ||
/* | ||
* 删除文章 id | ||
* */ | ||
static async deleteArticle(ctx){ | ||
let data = ctx.request.body; | ||
|
||
if(!isNaN(data.id)){ | ||
const res = await ArticleModel.deleteArticle(data); | ||
if(res){ | ||
ctx.response.status = ServiceStatus.success.code; | ||
ctx.body = { | ||
code: ServiceStatus.success.code, | ||
msg: ServiceStatus.success.msg | ||
} | ||
}else{ | ||
ctx.response.status = ServiceStatus.fail.code; | ||
ctx.body = { | ||
code: ServiceStatus.fail.code, | ||
msg: 'id不正确' | ||
} | ||
} | ||
|
||
}else{ | ||
ctx.response.status = ServiceStatus.fail.code; | ||
ctx.body = { | ||
code: ServiceStatus.fail.code, | ||
msg: 'id为必选项' | ||
} | ||
} | ||
} | ||
} | ||
|
||
module.exports = articleController; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
module.exports = { | ||
success: { | ||
code: 200, | ||
msg: 'success' | ||
}, | ||
fail: { | ||
code: 404, | ||
msg: 'fail' | ||
}, | ||
service: { | ||
code: 500, | ||
msg: '服务错误' | ||
} | ||
|
||
|
||
} |
Oops, something went wrong.