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
- DoraCMS
- 自动更新结构说明
- EGG 后台更新推送结构
全部结构采用统一结构形式, 在补充后台的情况下,需要后台同时进行模块版本号的依赖管理。再推送配置列表到客户端- jy-tmall
文件目录清单:
/src/plugins/jy-tmall
说明: 所有模块都以模块和独立的版本代号进行管理,更新,维护。在客户有特殊定制需求的情况下,可以复制,并调整名字做为一个新插件推送到客户端。在有时间的情况下,再考虑标准化。
- version
版本编号,不同时,则更新
- type
类型,暂定两种类型,一种是插件,一种是基础类型,更新形式相同,只有启动方式,程序插件需要做特殊化处理
- path
压缩包解压路径
- script
程序初始化脚本,程序解压后,如果有指定初始化脚本,则会进行相应的初始化操作
- download
下载文件路径,做了权限判断,只有有权限的,才能下载到文件。
- version
- 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
说明:
更新频率相对较少。同时插件目录本身也支持,也可以考虑直接在程序插件中进行特殊化管理。- …
- jy-tmall
- EGG TYPESCRIPT 自动更新结构整理
- common
程序相关辅助数据
- sql
程序建表语句- table
- goods
- …
- test
- mssql
- JKPT_TEST.sql
建表语句,可以包含字段
- JKPT_TEST_COLUMN_ADD_TEST.sql
字段扩张,相当于用于不同版本的字段修正
- JKPT_TEST.sql
- oracle
- JKPT_TEST.sql
- JKPT_TEST_COLUMN_ADD_TEST.sql
- mssql
- goods
- table
- sql
- data
系统数据,不对外, 系统生成- plugins
插件相关文件数据- jy-tmall
- jy-test
- download
下载的数据
- plugins
- dist
程序自动编译目录
- local_test
本地测试目录
- logs
系统日志
默认只保留一个月,且会自动进行切割,详细配置见:https://github.com/eggjs/egg-logrotator
- node_modules
node 基础模块
- public_file
插件相关下载,同时需要对外的数据,必须放这里- uploads
- plugins
- jy-tmall
- jy-test
- plugins
- uploads
- 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
- BaseController.ts
- base
- extend
需要声明:/src/index.d.ts
框架扩展
- context.ts
上下文扩展
- request.ts
请求扩展
- context.ts
- io
详细文档:https://eggjs.org/zh-cn/tutorials/socketio.html#%E4%BD%BF%E7%94%A8-egg-socketio- controller
- client
socket模块- client.ts
socket, 暂时不支持控制器声明,已和开发人员确认,暂时通过/src/app/router.ts进行动作声明
- client.ts
- extend
- middleway
- client
- controller
- 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使用。
- controller
- config
- config.default.ts
配置文件,不同启动方式,可以配置不同的配置文件
- plugin.ts
插件配置文件,内置插件基本不用调整,需要的插件按需添加。同时做了特殊处理,会将/config.json:plugins插件列表的插件加载进来.
- config.default.ts
- 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
通用时间操作
- arrayHelper.js
- common
- plugins
程序插件目录,每个程序插件,都可以做为一个独立的程序,挂到接口平台。只要在/config.json 中有,启动时会自动挂进来,并进行相关初始化。 前台可完成访问
所有ts程序,必须放在/src目录中。- jy-test
- app
- controller
- GoodsController.ts
不同模块,控制器名可相同,需要进行@provide(‘/jy-test/GoodsController’)声明作用域
- GoodsController.ts
- public
程序插件静态资源文件,下载和上传的数据。必须放/public,不能放这里。避免更新时的覆盖。通过/src/plugins/jy-test/app.ts初始化,挂静态路径进来。
- service
需要进行声明
不能出现同名的业务类,需要按模块,按插件,进行变量名规范。如:jyTestUser.ts
- view
程序插件模板目录
- controller
- 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
程序插件配置
- app
- jy-tmall
插件目录结构相同- …
- jy-test
- service
- admin
业务模块- AdminAdminService.ts
命名规则:插件名+业务名+Service.ts
业务类,不能出现同名,需要定个规定,按模块和插件进行业务类型命名.相关接口声明,也需要按类似形式,避免不规范导致的冲突
- AdminAdminService.ts
- admin
- app.ts
文档:https://eggjs.org/zh-cn/basics/app-start.html
egg初始化时,在声明周期需要进行特殊处理的地方。
程序插件在启动初始化时,会挂菜单,挂计划任务, 挂插件静态目录映射等,按需要调整。
- global.d.ts
全局声明
- index.d.ts
通用声明,局部声明,需要按需单独防止。命名格式:*.d.ts
- install_base.js
程序初始化
脚本初始化全部做了特殊处理,支持单独测试。
- app
- test
单元测试
- config.json
系统配置文件,由这边建立,非EGG自带。
进行数据库配置,用户信息配置。
程序插件以及各模块的版本记录
程序更新是以该文件的版本号为判断依据。同时/src/plugins的插件引入也是通过该文件读取
- install.js
脚本初始化全部做了特殊处理,支持单独测试。
将更新脚本独立出现,方便测试。/upgrade.js在接收到推送时,再调用该脚本
- upgrade.js
程序更新脚本,会启动一个socket,并绑定后台的企业帐号。如果有推送更新,则执行/install.js脚本进行安装.
- common
- EGG 后台更新推送结构