一、GraphQL

  最近服务端的同事分享了GraphQL,他分享的目的就是要把我们与他们的数据库隔离,这么做我们也求之不得。

  我们组目前维护着一个后台管理系统,会直接读取数据库中的表,如果能隔离的话,就不需要写Model文件了。

  后面再进一步了解后,明白了服务端推这个GraphQL的用意,其实就是让我们自己去维护GraphQL服务,包括客户端也去自己维护。

  那这和我直接读取数据库做路由,区别不是很大了,无法解决当前我们的痛点,而且我在前端页面中还需要制定数据结构,比之前还多了一步。

  况且如果需要缓存的话,还不能直接调用GraphQL的接口。如果我们人员充沛的话,这么分一点问题都没有,但是现在人员非常紧张。

  我们还要花大精力做数据整合和处理,而前端常规的工作诸如性能优化、页面交互、组件化、工程化等都没时间深入研究。基于此,还得另辟蹊径。

二、通用接口

  由于后台管理系统大部分的操作都是增删改查(数据库基于MySQL,ORM基于Sequelize),所以可以抽象出一套这类的通用接口,从而就能避免在 Router 和 Service 两层中新增不必要的文件。

  • api/get:读取一条数据(单表查询)

  • api/gets:读取多条数据(单表查询)

  • api/head:读取聚合数据,例如count()、sum()、max()和min()

  • api/post:提交数据,用于增加记录api/put:更新数据

  这套接口的研发受到了 APIJSON 这套开源项目的启发。

  数据库表都是单表查询,不支持联表,若要联表则单独创建接口。查询条件的语法直接参照 Sequelize,没有做单独的语法编译。

  由于接口的参数是一个JSON格式的对象,因此全部采用 post 的请求方式(Content-Type: application/json)。

  以 api/get 为例,基于KOA框架,在 Service 层的方法是:

  /**
* 数据库查询一条记录
*/
async getOne(tableName, where={}) {
return this.models[tableName].findOne({
where,
raw: true
});
}

  在 Router 层的方法是:

  /**
* 读取一条记录
* {
* TableName : { 查询条件 }
* }
* TableName是Model文件的名称,并非数据库表名
*/
router.post('/get',
async (ctx) => {
const { body } = ctx.request;
const tableName = Object.keys(body)[0]; //表名
const where = body[tableName]; //查询条件
// 将表名和查询条件传递给数据库方法
const data = await services.common.getOne(tableName, where);
ctx.body = { code: 0, data };
});

  其中 TableName 是服务端中Model的文件名(并非数据库中的表名),对象中的字段都是SQL的查询条件。

  粗略估算一下,如果将管理系统的接口替换成通用接口,那么可节省至少450个接口,占总接口的40%左右,并且 Service 中的方法也会大大减少。

  已将通用接口的前端代码整合到 shin-admin 中,后端代码整合到 shin-server 中。

最新文章

  1. fastJson使用
  2. #Deep Learning回顾#之2006年的Science Paper
  3. 『TCP/IP详解——卷一:协议』读书笔记——17
  4. a + b + c 求和
  5. iOS 上拉刷新和下拉加在更多(第三方框架EGOTableViewPullRefresh)
  6. 实例讲解Oracle数据库设置默认表空间问题
  7. SMO序列最小最优化算法
  8. 基于html5实现的愤怒的小鸟网页游戏
  9. 发布到IIS后 程序乱码
  10. JavaSE_ IO流 总目录(19~22)
  11. 根据HTML5的新方法 drag & drop 方法实现表格拖拽实例
  12. 苹果新的编程语言 Swift 语言进阶(二)--基本数据类型
  13. 新版CSDN-markdown编辑器使用指南
  14. Ntrip协议简介(转)
  15. n的m划分 整数拆分问题
  16. vmware 12中安装苹果系统
  17. UML和模式应用4:初始阶段(6)--迭代方法中如何使用用例
  18. asp.net 服务器 上传文件到 FTP服务器
  19. 关于 SqlParameter 必须知道的!
  20. Linq中连接

热门文章

  1. 手摸手,带你用Beego撸商城系列一(基础篇)
  2. Netty 框架学习 —— 添加 WebSocket 支持
  3. 信奥赛一本通1573:分离与合体C++分离与合体
  4. 『心善渊』Selenium3.0基础 — 18、使用Selenium操作浏览器的弹窗
  5. POJ 1654 Area 多边形面积 G++会WA
  6. Python日志模块的管理(二)
  7. buu [BJDCTF2020]easyrsa
  8. VLAN间路由
  9. 解决 .net core 中 nuget 包版本冲突问题[转载]
  10. CF277E Binary Tree on Plane