2021年了,是该了解下 Midway.js 了,我这几行代码给你看看
FSD service
如果该项目对你有用,欢迎 star 👏
Midway 2.x 样板工程
拓展阅读:
- 配套的前端工程请移步 https://github.com/fsd-nodejs/pc 查看这个项目
- 全栈开发文档以及规范 https://github.com/fsd-nodejs/document 查看这个项目
- midway2.x 深度躺坑记(持续更新)
- 代码提示 好玩的代码提示 by waitingsong (考虑到,每个人对于自定义代码提示的要求不一样,就不合并到参考了,这个PR推荐给大家)
项目导览 & TODO
在这个项目中,你会看到以下基于 midway 的实践案例 (上层使用 eggjs )
我们正在做以下工程例子,如果你有新的想法,可在 issue 留言,我们会征集你的意见,带来最干货的案例。
帮你扫清学习障碍,让你用起 midway 来更加得心应手,提升能效,找回编码的乐趣。
框架特性及能力应用
- [x] 中间件
- [x] 依赖注入
- [x] 参数校验和转换 (DTO 层)
- [x] 测试 (Controller & Service 单元测试)
- [x] swagger
- [x] Database
功能
基础
- [x] Admin 登录
- [ ] 普通用户登录-账户密码
- [ ] OAuth 2.0
- [ ] 日志监控
- [ ] 本地上传文件服务
- [x] 鉴权中间件
- [ ] 接口响应统计中间件
- [x] 统一错误处理
- [x] SnowFlake 雪花算法生成分布式ID
超级管理
- [x] 权限
- [x] 角色
- [x] 管理员
- [x] 菜单
- [ ] 日志(操作日志,记录管理用户的实际操作)
快速开始
<!-- add docs here for user -->
see midway docs for more detail.
Development
先将 database 目录下到 sql 文件迁移到数据库,修改默认的config配置文件
$ 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 作用在于把统计的计算异步化,从而不影响正常的业务请求处理
(消费者的逻辑代码,需要写在单独一个工程,独立部署)
大致流程如下,手绘的,工具简陋,姑且看一下。
监控系统可以用metrics的,不用自己搞一套