相关文章推荐
热心肠的烈酒  ·  C# textbox - CSDN文库·  1 年前    · 
追风的花生  ·  Visual ...·  2 年前    · 

/package.json:项目依赖与配置。

npm run dev;执行pm2启动命令做进程守护,具体服务 配置在 ecosystem.json

/ecosystem.json:配置分为两部分。

Apps 服务 name: 服务的进程名称;instances:启动进程 实例数量; script:执行 启动的脚本文件; env[_pre]:环境变量配置。

Deploy 部署。User host,path:配置部署目标服务器的 域名路径及用户; repo,ref:代码仓库及 分支; post-deploy等:代码部署前后执行的脚本和启动命令。

/b ase:服务 器架构的核心部

根据环境变量提取config项目配置,

启动配套的数据库等services服务,

加载middleware中间件,

注册routes路由及相关的controllers控制器逻辑,

启动服务器监听。

/ services 启动 前需要初始化的服务

邮件发送: 使用 nodemailer模块连接服务器,输出Mailer对象,挂载在this.servie对象上,提供sendMial方法。

Mysql初始化 :使用 sequelize模块初始化 连接数据库,输出 Mysql.db, 挂载在this.servie对象上 ,提供 sequelize实例的方法。

/middleware: 自定义的中间件

auth.js:api权限校验,对应于route配置中meta.autu privilege_menu_id, true时进行校验 ,获取保存在 session中的permission权限, 是否含有对应的 privilege_menu_id。

/config:

app.js:业务逻辑所需的配置, 启用的 modules模块。

db.js:mysql、redis数据库域名,端口,用户密码配置

mail.js:邮件服务器连接配置

server.js http应用监听的域名和端口

2.1 MVC

/routes:

公共 api路由定义,遵照swagger的配置格式,可在注册router controller同时,生成动态的在线api文档。

file.js:

mete.use: 是否启用; mete.auth:是否 需要权限; mete.privilege_menu_id: 权限 id

controller.name:对应的 控制器文件 ;controller.action:控制器实例的方法;

/ model

公共 的数据模型, sequelize对象关系映射的数据库配置。

对应于数据库中各个表的定义以及关联关系

/controllers

公共的控制器类文件

file.js:

所有的控制器实例化后,以文件名为key挂载到controlers对象上,当做参数传入控制器实例的方法中,方便控制器逻辑的互相引用。

按照routes/file.js中,路由与控制器的method、path、controller 配置,注册到 restify的应用中。

引用对应的models数据表,按业务逻辑操作数据库。

/modules:数据服务模块

/config/app.js中modules配置的数据服务模块。同样 包含 routes,models,controllers

/ge_front与/views:前端静态文件资源。

在ge_front中进行前端开发,构建打包后的文件全部导入views中存放。

/file: 上传文件的存放目录

3、services 中间件 路由控制器 的提取注册

controllerManager.js:

从config/app中 提取出公共 controller与modules服务模块配置目录,

使用fs文件模块读取目录下的所有文件名列表,

动态require加载controller脚本文件,并实例化

以文件名为key以单例 模式挂载在 this.contrlllers上

router.js :

动态提取路由的配置信息后 ,与 controllerManager上的控制器 对应注册到 restify服务中

封装执行控制器

根据 路由配置,获取对应的 controller和action

将action中的this绑定 ctr上下文 对象, reques,response,next,params;以及所有当前controller对象;

统一做返回报文的封装,报错捕获,也可自定义返回报文。

4、具体服务实现

1、 controller类的实现

继承 自一个 base类,将 公共的 action方法放于base父类中,方便调用。

Base类实现actionCall(controllerName,actionName),实际运行中,action可以调用 其他类中的 action,实现方法复用。

2、文件上传下载

multipartBodyParser中间 件接收报文实体中数据,保存到 file目录下,返回文件名,和文件路径。

下载根据请求的文件名和文件存储目录,找到具体的文件,创建文件 可读流,导入 response,返回一个promise,在文件流end事件 resolve({isDownload: true});

3、 单点登录及权限验证

使用公司统一的单点登录,跳转登录页

登录返回页面后,调用验证接口

获取 ticket 标识 cookie信息,在服务端向单点登录服务器请求验证

通过验证则可以获取当前登录的用户信息

查询权限配置数据库,将权限保存 session中,便于路由方法的使用