基于midwayjs编写的一个自动更新框架结构说明

midwayjs为eggjs的ts版本+依赖注入。这边由于接入的业务类型名,利用eggjs的插件形式,做成一个平台化,所有程序以插件的形式挂入的形式。所有模块单独进行模块管理。类似小程序。

  • TypeScript体系调研报告:https://juejin.im/post/59c46bc86fb9a00a4636f939
  • 淘宝开发实践:https://www.infoq.cn/article/L1yoBP2qbJ5yW*2D7Mv7
  • 语法:https://github.com/joye61/typescript-tutorial
  • javascript迁移:https://jkchao.github.io/typescript-book-chinese/typings/migrating.html
  • 装饰器:https://www.xiaoyulive.top/books/typescript/decorator-definition.html#%E8%A3%85%E9%A5%B0%E5%99%A8%E7%BB%84%E5%90%88
  • EGGJS文档:https://eggjs.org/zh-cn/intro/
  • EGGJS(typescript)文档:https://eggjs.org/zh-cn/tutorials/typescript.html
  • MIDWAY文档:https://midwayjs.org/midway/guide.html
  • MIDWAY依赖注入文档:https://midwayjs.org/injection/guide.html
  • 参考开源项目:
    只做参考,有兴趣再看

    • DoraCMS
      基于EGGJS(ES)
      一个完成度很高的CMS管理系统​
    • cool-admin
      基于EGGJS(TS)
      一个通用的后台管理系统,不过要付费。 这边有一部分源码,可以学习用。​
    • doodoo.js
      基于KOA
      一个微服务开源框架​
    • cabloy
      基于EGGJS(ES)
      一个全栈开发框架​
    • apshop
      基于EGGJS(ES)
      开源网店​
    • lin-cms-koa
      基于KOA
  • 自动更新结构说明
    • EGG 后台更新推送结构
      全部结构采用统一结构形式, 在补充后台的情况下,需要后台同时进行模块版本号的依赖管理。再推送配置列表到客户端

      • jy-tmall
        文件目录清单:
        /src/plugins/jy-tmall
        说明: 所有模块都以模块和独立的版本代号进行管理,更新,维护。在客户有特殊定制需求的情况下,可以复制,并调整名字做为一个新插件推送到客户端。在有时间的情况下,再考虑标准化。

        • version
          版本编号,不同时,则更新
        • type
          类型,暂定两种类型,一种是插件,一种是基础类型,更新形式相同,只有启动方式,程序插件需要做特殊化处理​
        • path
          压缩包解压路径
        • script
          程序初始化脚本,程序解压后,如果有指定初始化脚本,则会进行相应的初始化操作
        • download
          下载文件路径,做了权限判断,只有有权限的,才能下载到文件。​
      • jy-test
        文件目录清单:
        /src/plugins/jy-tmall

      • base_application
        文件目录清单:
        ​/src(除了/src/plugins目录)
        /​install.js
        /upgrade.js
        /common
        说明:
        系统基础程序结构,相对稳定,按需更新。​​​​​​

      • base_static
        文件目录清单:
        /public
        说明:​​
        更新频率很少​

      • base_node_modules
        文件目录清单:
        ​/node_modules
        ​/package.json
        /package-lock.json​
        说明:
        ​更新频率相对较少。同时插件目录本身也支持,也可以考虑直接在程序插件中进行特殊化管理。​

    • EGG TYPESCRIPT 自动更新结构整理
      • common
        程序相关辅助数据

        • sql
          程序建表语句

          • table
            • goods
            • test
              • mssql
                • JKPT_TEST.sql
                  建表语句,可以包含字段
                • JKPT_TEST_COLUMN_ADD_TEST.sql
                  字段扩张,相当于用于不同版本的字段修正
              • oracle
                • JKPT_TEST.sql
                • JKPT_TEST_COLUMN_ADD_TEST.sql
      • data
        系统数据,不对外, 系统生成

        • plugins
          插件相关文件数据

          • jy-tmall
          • jy-test
        • download
          下载的数据​
      • dist
        程序自动编译目录
      • local_test
        本地测试目录
      • node_modules
        node 基础模块
      • public_file
        插件相关下载,同时需要对外的数据,必须放这里

        • uploads
          • plugins
            • jy-tmall
            • jy-test
      • public
        静态资源文件,且对外。​
      • run
        ​系统运行时文件,用于分析系统当前依赖的情况
      • src
        系统源码目录,插件和系统主程序代码都放在这个目录中。插件目录移动到外面,会出现路由映射等识别不到的问题​

        • app
          • controller
            • base
              基础模块

              • BaseController.ts
                控制器命名规则:骆驼命名+Controller.ts
                ​基础控制器,其它控制器继承于这个文件
                ​内置通用频率拦截,用于当计划任务使用时或防止异常扫描时,进行数据拦截
                所有控制器,都通过声明式语法进行路由指定和控制:https://midwayjs.org/midway/guide.html#web-%E4%B8%AD%E9%97%B4%E4%BB%B6​​
          • extend
            需要声明:/src/index.d.ts
            ​框架扩展

            • context.ts
              上下文扩展
            • request.ts
              请求扩展
          • mode
            需要声明:/src/index.d.ts
            ​按需要,构建数据模型​
          • schedule
            需要声明:/src/index.d.ts
            声明结构:[{title:“标题”,url:”请求地址”}​]​
            ​通用计划任务,所有计划任务挂到/src/config/config.default.ts:config.tasks上,计划任务会以指定频率,进行异步请求,频率限制直接通过base.limitAccess(second)限制,也可考虑再补充参数到计划任务中。实现一个计划任务管理器,管理所有任务列表。​
          • view
            模板文件
          • router.ts
            路由器暂时只有socket使用。
        • config
          • config.default.ts
            配置文件,不同启动方式,可以配置不同的配置文件
          • plugin.ts
            插件配置文件,内置插件基本不用调整,需要的插件按需添加。同时做了特殊处理,会将/config.json:plugins插件列表的插件加载进来.​
        • lib
          公共代码库

          • common
            通用库,暂时是用js,主要保留js脚本需要执行特殊代码如更新和初始化时使用,同时挂到了全局​
            常用工具库​
            调用方式:
            ts:​globalThis.common​
            js:common​

            • arrayHelper.js
              数组
            • commonHelper.js
              通用函数
            • dbHelper.js
              通用数据库操作
              如果是更新脚本和初始化脚本访问数据库时,需要先common.dbHelper.getDb()进行初始化,数据库配置在:/config.json:db​​
            • fileHelper.js
              通用文件操作
            • httpHelper.js
              通用网络请求:下载,GET,POST,JSON,请求编码,请求解码
            • imgHelper.js
              通用图象处理:二维码,条码等
            • numberHelper.js
              通用数字操作:精度计算(精度计算提供了公式封装)
            • stringHelper.js
              通用字符串操作
            • timeHelper.js
              通用时间操作
        • plugins
          程序插件目录,每个程序插件,都可以做为一个独立的程序,挂到接口平台。只要在/config.json 中有,启动时会自动挂进来,并进行相关初始化。 前台可完成访问
          所有ts程序,必须放在/src目录中。​

          • jy-test
            • app
              • controller
                • GoodsController.ts
                  不同模块,控制器名可相同,需要进行@provide(‘/jy-test/GoodsController’)声明作用域
              • public
                程序插件静态资源文件,下载和上传的数据。必须放/public,不能放这里。避免更新时的覆盖。通过/src/plugins/jy-test/app.ts初始化,挂静态路径进来。
              • service
                需要进行声明
                ​不能出现同名的业务类,需要按模块,按插件,进行变量名规范。如:jyTestUser.ts
              • view
                程序插件模板目录
            • app.ts
              文档:https://eggjs.org/zh-cn/basics/app-start.html
              ​​egg初始化时,在声明周期需要进行特殊处理的地方。
              程序插件在启动初始化时,会挂菜单,挂计划任务​, 挂插件静态目录映射等,按需要调整。
            • install_plugin.js
              数据初始化脚本,当更新和安装时,如果推送的配置有指定更新脚本,则会执行。
              初始化时,尽量利用knex的兼容性(判断表,字段,视图等是否存在,以及字段长度,类型),大代码块或knex处理麻烦的以sql形式放置(建表)(knex搞太多东西,会带来一定的阅读困难),再通过knex.raw进行代码块的执行。
              ​/common/sql/table/test/mssql/JKPT_TEST.sql
              /common/sql/table/test/mssql/JKPT_TEST_COLUMN_ADD_TEST.sql​
            • package.json
              程序插件配置
          • jy-tmall
            插件目录结构相同

        • service
          • admin
            业务模块

            • AdminAdminService.ts
              命名规则:插件名+业务名+Service.ts
              ​业务类,不能出现同名,需要定个规定,按模块和插件进行业务类型命名.相关接口声明,也需要按类似形式,避免不规范导致的冲突
        • app.ts
          文档:https://eggjs.org/zh-cn/basics/app-start.html
          ​​egg初始化时,在声明周期需要进行特殊处理的地方。
          程序插件在启动初始化时,会挂菜单,挂计划任务​, 挂插件静态目录映射等,按需要调整。
        • global.d.ts
          全局声明​
        • index.d.ts
          通用声明,局部声明,需要按需单独防止。命名格式:*.d.ts
        • install_base.js
          程序初始化
          ​脚本初始化全部做了特殊处理,支持单独测试。​
      • test
        单元测试
      • config.json
        系统配置文件,由这边建立,非EGG自带。
        进行数据库配置,用户信息配置。​
        程序插件以及各模块的版本记录
        程序更新是以该文件的版本号为判断依据。同时/src/plugins的插件引入也是通过该文件读取​​
      • install.js
        脚本初始化全部做了特殊处理,支持单独测试。​
        将更新脚本独立出现,方便测试。/upgrade.js在接收到推送时,再调用该脚本​
      • upgrade.js
        程序更新脚本,会启动一个socket,并绑定后台的企业帐号。如果有推送更新,则执行/install.js脚本进行安装.