#基于webpack的Koa2restfulAPIserver脚手架这是一个基于Koa2的轻量级RESTfulAPIServer脚手架,支持ES6,支持TypeScript编写。GIT地址:https://github.com/Allenzihan...本脚手架仅安装一些配合koa2使用的必要插件。不仅提供RESTfulAPI实现,还集成了静态资源的处理,支持spanning,转发代理请求等基础功能。基本上你只需要专注于你的业务发展。脚手架可以根据不同的环境配置不同的信息操作值,支持开发、测试、生产环境的不同参数配置。#数据库选择MySQL当然你也可以根据需要配置其他关系型数据库。Sequelize.js可以扩展为PostgreSQL、MySQL、MariaDB、SQLite、MSSQL关系数据库的ORM。本框架采用MVC分区模式实现。例子中通过SQL实现对数据库的增删改查操作。##目录结构说明├──README.md├──.babelrc#Babel配置文件├──.gitignore#Git忽略文件列表├──package.json#描述文件├──process.config.js#pm2部署示例文件├──bin#bin入口目录│└──www#启动文件入口├──.vscode#VSCODE调试目录│└──launch.json#调试配置├──config#配置文件│├──db.config.js#数据库配置文件│├──logger.config.js#日志配置文件│├──proxy.config.js#代理配置文件│└──session.config.js#会话配置文件├──src#源码目录,编译后的目标源码位于dist目录│├──app.js#入口文件│├──files#存储文件目录│├──middleware#中间件目录│└──errorRouteCatch.js#示例插件-路由器异常处理│├──utils#工具目录│├──controllers#Controller│└──usersController.js#示例用户控制器│├──models#模型层│├──routes#路由层│└──users.js#示例用户路由│└──services#服务层│└──usersService.js#示例用户服务层├──public#静态资源目录└──logs#日志目录开发使用说明gitclonehttps://github.com/Allenzihan/koa2-mysql-framework.gitcdmvkoa2-mysql-frameworknpminstallnpmrundev访问:http://127.0.0.1:3000/home开发调试说明支持VSCODE调试Node.js功能已经配置好,启动VSCODEIDE上的Debug按钮调试开发环境npmrundevPM2Deploymentinstructions提供PM2部署RESTfulAPIServer的示例配置,位于“process.config.js”文件process.config.js文件提供了两套环境配置,分别是测试环境的配置和生产环境的配置。启动测试环境:npmrunuat如果启动失败,使用pm2直接启动pm2startprocess.config.js--onlyuat启动生产环境:如果npmrunprod启动失败,使用pm2直接启动pm2startprocess.config.js--onlyprod及以上使用pm2启动,需要提前安装pm2模块pm2配合Docker部署说明:http://pm2.keymetrics.io/docs...特别说明Token的使用(JWT认证)app.use(jwt({secret:publicKey.toString()}).unless({path:[/^\/users\/login/,/^\/home/,/^\/assets/]}))路径中开头的路径不会被认证,否则会被认证。前端处理方案:importaxiosfrom'axios'import{getToken}from'./tool'constDevBaseUrl='http://127.0.0.1:8080'constProdBashUrl='https://xxx.xxx'letconfig={baseURL:process.env.NODE_ENV!=='生产'?DevBaseUrl:ProdBashUrl//配置API接口地址}lettoken=getToken()if(token){config.headers={Authorization:'Bearer'+token}}letrequest=axios.create(config)//http请求拦截器axios.interceptors.request.use(config=>{if(window){lettoken=getToken()if(token){//判断是否有token,如果存在则在每个http头中添加tokenconfig.headers.Authorization=`Bearer${token}`}}//if(config.method==='get'){//config.url=config.url+'timestamp='+Date.now().toString()//}returnconfig},err=>{returnPromise.reject(err)})exportdefaultrequesttool.jsfile//writecookiesexportletsetCookie=functionsetCookie(name,value,time){if(time){letstrsec=getsec(时间)让exp=newDate()exp.setTime(exp.getTime()+parseInt(strsec))document.cookie=name+'='+escape(value)+';expires='+exp.toGMTString()}else{document.cookie=name+'='+escape(value)}}//读取cookieexportletgetCookie=function(name){letreg=newRegExp('(^|)'+name+'=([^;]*)(;|$)')让arr=document.cookie.match(reg)返回arr?unescape(arr[2]):null}//复制cookiesexportletdelCookie=function(name){varexp=newDate()exp.setTime(exp.getTime()-1)varcval=getCookie(name)if(cval!=null){document.cookie=name+'='+cval+';expires='+exp.toGMTString()}}//获取TokenexportletgetToken=function(){if(window.sessionStorage&&window.sessionStorage.Bearer){returnwindow.sessionStorage.Bearer}elseif(window.localStorage&&window.localStorage.Bearer){returnwindow.localStorage.Bearer}elseif(window.document.cookie){returngetCookie('Bearer')}}//设置TokenexportletsetToken=function(token,rememberTime){if(window.sessionStorage){window.sessionStorage.Bearer=token}if((rememberTime&&window.localStorage)||!window.sessionStorage){window.localStorage.Bearer=token}if(window.document.cookie&&!window.sessionStorage&&!window.localStorage){if(rememberTime){setCookie('Bearer',token,rememberTime)}else{setCookie('Bearer',token)}}}//删除TokenexportletdelToken=function(){if(window.sessionStorage&&window.sessionStorage.Bearer){window.sessionStorage.removeItem('Bearer')}if(window.localStorage&&window.localStorage.Bearer){window.localStorage.removeItem('Bearer')}if(window.document.cookie){delCookie('Bearer')}}大致原理:通过一个API(通常是登录API)成功获取Token后,存储在本地,然后每次请求时在Header中带上Authorization:"Bearer"+token,通常不用担心本地Token被破解GIT地址:https://github.com/Allenzihan...
