技术解析

2021 年了,是该了解下 Midway.js 了,我这几行代码给你看看
0
2021-06-03 21:39:23
idczone

2021 年了,是该了解下 Midway.js 了,我这几行代码给你看看

FSD Service

FSD Logo

FSD (Full Stack Develop) Service - Midway.js 的最佳实践

codecov GitHub Actions status codebeat badge Codacy Badge GitHub license PRs Welcome

Sonar Cloud

拓展阅读:

  • 配套的前端工程请移步 https://github.com/fsd-nodejs/pc 查看这个项目
  • 全栈开发文档以及规范 https://github.com/fsd-nodejs/document 查看这个项目
  • midway2.x 深度躺坑记(持续更新)
  • 代码提示 好玩的代码提示 by waitingsong (考虑到,每个人对于自定义代码提示的要求不一样,就不合并到参考了,这个 PR 推荐给大家)

项目导览 & TODO

在这个项目中,你会看到以下基于 Midway 的实践案例 (上层使用 Egg.js )

我们正在做以下工程实践例子,大家你遇到什么问题,或者希望追加什么功能,或者学习内部实现。 可以关注我们的仓库(点赞,分享...三连)在 issue 留言,我们会征集你的意见,带来最干货的案例。

帮你扫清学习障碍,让你用起 Midway 来更加得心应手,提升能效,找回编码的乐趣。

框架特性及能力应用

  • 中间件
  • 依赖注入
  • 参数校验和转换 ( DTO 层)
  • 测试 ( Controller & Service 单元测试)
  • Swagger
  • Database

功能

基础

  • Admin 登录
  • 普通用户登录-账户密码
  • OAuth 2.0
  • 日志监控
  • 本地上传文件服务
  • 鉴权中间件
  • 接口响应统计中间件
  • 统一错误处理
  • SnowFlake 雪花算法生成分布式 ID

超级管理

  • 权限
  • 角色
  • 管理员
  • 菜单
  • 日志(操作日志,记录管理用户的实际操作)

快速开始

see Midway docs for more detail.

Development

先将 database 目录下到 sql 文件迁移到数据库,修改默认的 config 配置文件(需要 Redis 和 MySQL 服务可以正常访问)

$ npm i
$ npm run dev
$ open http://localhost:7001/

Deploy

$ npm start
$ npm stop

npm scripts

  • Use npm run lint to check code style.
  • Use npm test to run unit test.

Redis

  • 使用 Redis 作为用户登录凭证存取的地方
  • RTS 收集统计数据 (开发中)

Redis 划分

建议使用 Redis 的时候,对所有 key 做好命名空间划分,便于管理。可把 scope 写到对照表中。

借助 jwt 插件做签名校验,管理员的 token 中会包含 id 字段。

所有 admin 相关的缓存数据都放在 admin:xxxx 下面。

  • admin:accessToken:${id} 缓存管理员 Token 信息
  • admin:userinfo:${id} 缓存管理员基本信息

数据库

所有实体表均有 deleted_at 字段(目前基础模块不使用软删除),用于软删除。

如果要关闭软删除,将 deletedAt 字段注释即可

进行软删除的时候,关系表的数据不做改动。

后期根据需要,用脚本定期清理软删除的数据。

以下模块未使用软删除:

  • 权限管理
  • 角色管理
  • 菜单管理
  • 管理员管理

查询注意事项

业务软删除单独写一个 BaseModel,其他实体继承该 Model 即可

  • 实体查询,继承 BaseModel 的实体会自带软删除判断,例子查看src/app/model/base.ts
  • 在做关系查询的时候,关系表需要手动加软删除判断 IS NULL,如下:
      /**
       * 根据菜单 id 获取数据
       * @param id 菜单 id
       */
      async getAdminMenuById(id: string) {
        const row = await this.adminMenuModel
          .createQueryBuilder()
          .select()
          .leftJoinAndSelect(
            'AdminMenuModel.roles',
            'role',
            'role.deletedAt IS NULL'
          )
          .where({ id: id })
          .getOne();
        return row;
      }
    

接口响应统计中间件(设计)

做接口响应数据统计的出发点,有两点(即使有类似的第三方包,但还是自己实现以下):

  • 帮助排查线上接口响应问题
  • 监控系统实时状态

虽然框架本身已经有日志功能,但是很多场景下,我们可能需要看下各个接口服务的响应状态

是在正常服务,还是已经出现问国外服务器题。在有监控的帮助下,可以快速帮我们定位日志排查问题。

是对应统计实时数据而言,这里我们会使用 RTS 的技术方案,会用到 RabbitMQ 和 Redis

RabbitMQ 作用在于把统计的计算异步化,从而不影响正常的业务请求处理

(消费者的逻辑代码,需要写在单独一个工程,独立部署)

大致流程如下,手绘的,工具简陋,姑且看一下。 IMG_5365 HEIC

答疑

群里会有热心的朋友,也会有新版本发布推送。钉钉扫码加入答疑群

二群

一群(已满)

License

我们的代码使用 MIT 协议,请放心使用。


看完之后就一个感觉:乱糟糟,没看到重点……

这就是传说中的一个 js 一个前后端全站项目吗

很棒的框架,加油!

跟 nestjs 有啥区别

node 的后端框架我还是选 nestjs,nestjs 贡献者多且生态丰富,midway 除了阿里的人会用其他很少人用了,搞不好哪天没有 kpi 就被丢进垃圾桶了

https://github.com/apache/incubator-weex 半年没更新了

用叮叮群聊技术
数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服