{"id":32486372,"url":"https://github.com/fefeding/egg-boilerplate-jm","last_synced_at":"2026-07-03T20:31:14.104Z","repository":{"id":147746641,"uuid":"222644790","full_name":"fefeding/egg-boilerplate-jm","owner":"fefeding","description":"个人的egg脚手架","archived":false,"fork":false,"pushed_at":"2023-05-07T07:59:38.000Z","size":1766,"stargazers_count":0,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-27T05:51:39.834Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fefeding.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-19T08:21:01.000Z","updated_at":"2019-11-20T11:51:45.000Z","dependencies_parsed_at":"2023-05-27T09:45:11.785Z","dependency_job_id":null,"html_url":"https://github.com/fefeding/egg-boilerplate-jm","commit_stats":null,"previous_names":["fefeding/egg-boilerplate-jm"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fefeding/egg-boilerplate-jm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fefeding%2Fegg-boilerplate-jm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fefeding%2Fegg-boilerplate-jm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fefeding%2Fegg-boilerplate-jm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fefeding%2Fegg-boilerplate-jm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fefeding","download_url":"https://codeload.github.com/fefeding/egg-boilerplate-jm/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fefeding%2Fegg-boilerplate-jm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35101088,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-03T02:00:05.635Z","response_time":110,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-27T05:50:23.457Z","updated_at":"2026-07-03T20:31:14.099Z","avatar_url":"https://github.com/fefeding.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# jm 框架脚手架\n\n\n\n## Document\n\n## QuickStart\n\n- Development Mode\n\n```bash\n$ npm run dev\n```\n\n- Publish Mode\n\n```bash\nnpm run tsc\nnpm run build\nnpm start\n```\n\n## Features\n\n## 分层\n后台分为 `Model`(数据类)  `Bll`(业务逻辑层)  `Dal`(DB层)\n网上的三层介绍[https://wenku.baidu.com/view/888e9be8f8c75fbfc77db29c.html](https://wenku.baidu.com/view/888e9be8f8c75fbfc77db29c.html)\n### ORM\nDB访问我们采用 `typeorm` [https://github.com/typeorm/typeorm](https://github.com/typeorm/typeorm)。\n\n#### Model\nmodel跟DB中的表一对一关联，无需我们手工创建和修改表，只要修改model。如果数据库用户有权限typeorm会帮我们维护表结构。\n示例：\n```ts\n'use strict';\n\nimport {Entity, BaseEntity, PrimaryGeneratedColumn, Column} from \"typeorm\";\n\n@Entity('t_article')\nexport default class Article extends BaseEntity {\n  @PrimaryGeneratedColumn({\n    name: 'Fid',\n    type: 'int',\n    comment: '自增唯一健'\n  })\n  public id?: number;\n\n  @Column({\n    name: 'Ftitle',\n    type: 'varchar',\n    length: 32\n  })\n  public title?: string;\n  \n  @Column({\n    name: 'Fcreate_time',\n    type: 'datetime'\n  })\n  public createTime?: string;\n\n  @Column({\n    name: 'Fmodify_time',\n    type: 'timestamp'\n  })\n  public modifyTime?: string;\n}\n```\n\n#### 数据库访问层\n数据库访问也是全部放在了`service/dal`目录。 如果业务场景不需要特殊的DB访问逻辑，那么它的逻辑层`service`只需继承`dal/base.ts`即可。\n\n#### 逻辑层\n\n逻辑层全放在`service/bll`目录下， 继承`service/dal/base`就可以拥有基础的数据库操作接口。如果需要特殊DB访问逻辑的，请在`dal`中创建独立的DB访问`service`并继承`BaseService`。\n\n### Controller\n我们把`controller`封装成了一个统一的入口，不需要重复配置`router`。\n例如，我们在`controller`下创建一个`admin.ts`:\n```ts\n\nimport { Context } from 'egg';\nimport Article from '../model/article';\n\nexport default class AdminController {\n  public async list(ctx: Context) {\n    return await ctx.service.bll.article.getAll();\n  }\n}\n```\n\n不需要做任何配置，我们就可以通过`http://fmp.oa.com/framework/api/admin/list` 访问到这个接口。\n\n\u003e 如果需要在controller中使用多级目录，则在访问url中用`/`表示，如：`/api/my/admin/list`, 表示在`controller/my`目录下的`admin`  controller中的`list`方法。\n\n#### 返回数据\n你只需要在你的接口中，直接`return {}` 任意你想返回的数据结构。`api`会把它赋给最终结果的`data`属性下。\n例如：\n```ts\npublic async add(ctx: Context) {\n    return {\"name\": \"my\"};\n  }\n```\n最终调用者拿到的是\n```ts\n{\n  ret: 0,\n  msg: \"\",\n  data: {\n    \"name\": \"my\"\n  }\n}\n```\n如果你想自已定义返回的结果，你也可以返回`IApiResult`结构。底层会原样返回。\n```ts\n/**\n * api 返回数据标准结构\n */\ndeclare interface IApiResult {\n  ret: number,\n  msg: string,\n  data?: any\n}\n```\n#### 抛出异常\n基础`api`会`catch`异常，然后按同上的返回方式返回`ret`和`msg`。这里的`ret`统一定义为10001。\n如果`controller`方想自定义异常信息，你可以直接抛出`IApiResult`结构信息。\n```ts\nthrow {ret: 10086, msg: \"我是自定义错误\"};\n```\n\n### 服务鉴权\n服务鉴权主要提供一个简单的拒绝非法请求功能，基于ts的`decorator`实现。\n服务端在config中需要配置一个accessKey， 需要调用当前服务的必须知道这个服务的key并用通用方法计算出来。\n```json\n// 中间件access配置\n  // 用来请求鉴权  只需要针对/api/ 这类的service请求\n  // 计算方法 md5(accessKey + ',' + timestamp)\n  config.access = {\n    enabled: true, // false 表示不启用鉴权\n    accessKey: 'jm.framework' // 用来计算token的当前系统唯一key\n  }\n```\n可以用配置`enabled`来启用关闭，每个系统自已可以配置唯一的`accessKey`来识别请求。\n\n当一个接口需要使用鉴权时，只需加上装饰器即可。\n```js\n\nimport { Context } from 'egg';\nimport decorators from \"../lib/decorator\";\n\nexport default class AdminController {\n\n  @decorators.checkApiToken(true) // 标记需要校验token\n  public async list(ctx: Context) {\n    return await ctx.service.bll.article.getAll();\n  }\n}\n```\n\n\n\n## TypeScript\n\n- https://github.com/kaorun343/vue-property-decorator\n- https://github.com/ktsn/vuex-class\n\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffefeding%2Fegg-boilerplate-jm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffefeding%2Fegg-boilerplate-jm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffefeding%2Fegg-boilerplate-jm/lists"}