{"id":13487403,"url":"https://github.com/apgzs/cool-admin-api","last_synced_at":"2025-05-08T21:10:26.669Z","repository":{"id":55059517,"uuid":"211465379","full_name":"apgzs/cool-admin-api","owner":"apgzs","description":"cool-admin-api 是基于egg.js、typeorm、jwt等封装的api开发脚手架、快速开发api接口","archived":false,"fork":false,"pushed_at":"2020-05-22T05:33:39.000Z","size":1460,"stargazers_count":260,"open_issues_count":1,"forks_count":45,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-03-31T18:17:17.239Z","etag":null,"topics":["cool-admin","egg","egg-plugin","eggjs","element-ui","express","koa","koa2","koajs","nest","nestjs","nodejs","vue","vuejs"],"latest_commit_sha":null,"homepage":"https://www.cool-admin.com","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/apgzs.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}},"created_at":"2019-09-28T07:58:21.000Z","updated_at":"2025-03-03T09:16:09.000Z","dependencies_parsed_at":"2022-08-14T10:31:04.811Z","dependency_job_id":null,"html_url":"https://github.com/apgzs/cool-admin-api","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apgzs%2Fcool-admin-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apgzs%2Fcool-admin-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apgzs%2Fcool-admin-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/apgzs%2Fcool-admin-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/apgzs","download_url":"https://codeload.github.com/apgzs/cool-admin-api/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253149615,"owners_count":21861739,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["cool-admin","egg","egg-plugin","eggjs","element-ui","express","koa","koa2","koajs","nest","nestjs","nodejs","vue","vuejs"],"created_at":"2024-07-31T18:00:58.853Z","updated_at":"2025-05-08T21:10:26.647Z","avatar_url":"https://github.com/apgzs.png","language":"TypeScript","readme":"## 展示\n* 演示地址：https://show.cool-admin.com\n* 文档地址：https://docs.cool-admin.com\n* 官网：https://www.cool-admin.com\n\n## 技术选型\nNode版后台基础框架基于[Egg.js](https://eggjs.org/zh-cn/)(阿里出品)\n* 基础：**[egg.js](https://eggjs.org/zh-cn/)**\n* 数据：**[typeorm](https://typeorm.io)**\n* 缓存：**[egg-redis](https://www.npmjs.com/package/egg-redis)** \n* 鉴权：**[egg-jwt](https://www.npmjs.com/package/egg-jwt)** \n* 网络：**[axios](https://www.npmjs.com/package/axios)** \n\n## 核心组件\n独有cool-admin.com发布的npm组件\n* 路由：**[egg-cool-router](https://www.npmjs.com/package/egg-cool-router)**\n* 控制器：**[egg-cool-controller](https://www.npmjs.com/package/egg-cool-controller)**\n* 服务层：**[egg-cool-service](https://www.npmjs.com/package/egg-cool-service)** \n* 缓存：**[egg-cool-cache](https://www.npmjs.com/package/egg-cool-cache)** \n* 模型：**[egg-cool-entity](https://www.npmjs.com/package/egg-cool-entity)** \n* 支付 **[egg-cool-pay](https://www.npmjs.com/package/egg-cool-pay)** \n* 搜索 **[egg-cool-es](https://www.npmjs.com/package/egg-cool-es)** \n。。。。。。\n\n## 开发交流微信群\n![微信](https://cool-comm.oss-cn-shenzhen.aliyuncs.com/WechatIMG22.jpeg?x-oss-process=image/resize,w_300)\n\n## 运行\n 环境 `Node.js\u003e=8.9.0` `Redis` `mysql`\n \n 新建并导入数据库,修改数据库连接信息\n \n 推荐使用`yarn`\n \n```js\n git clone https://github.com/apgzs/cool-admin-api.git\n cd cool-admin-api\n yarn\n yarn dev\n http://localhost:7001\n```\n \n 或者`npm`\n \n```js \n git clone https://github.com/apgzs/cool-admin-api.git\n cd cool-admin-api\n npm install\n npm run dev\n http://localhost:7001\n```\n\n\n ##视频教程:\n\n **cool-admin后端简单入门视频(快速写6个api接口)：https://www.bilibili.com/video/BV1SE411j74K**\n\n **cool-admin前后端配合使用：https://www.bilibili.com/video/av90478011/**\n\n **cool-admin前端crud内部培训教程：https://www.bilibili.com/video/av89512654/**\n\n ## 数据模型\n  数据模型必须放在`app/entities/*`下，否则[typeorm](https://typeorm.io \"typeorm\")无法识别，如:\n```js\n import { Entity, Column, Index } from 'typeorm';\n import { BaseEntity } from 'egg-cool-entity';\n /**\n  * 系统角色\n  */\n @Entity({ name: 'sys_role' })\n export default class SysRole extends BaseEntity {\n     // 名称\n     @Index({ unique: true })\n     @Column()\n     name: string;\n     // 角色标签\n     @Index({ unique: true })\n     @Column({ nullable: true })\n     label: string;\n     // 备注\n     @Column({ nullable: true })\n     remark: string;\n }\n```\n新建完成运行代码，就可以看到数据库新建了一张`sys_role`表，如不需要自动创建`config`文件夹下修改[typeorm](https://typeorm.io \"typeorm\")的配置文件\n\n## 控制器\n有了数据表之后，如果希望通过接口对数据表进行操作，我们就必须在`controller`文件夹下新建对应的控制器，如：\n```js\nimport { BaseController } from 'egg-cool-controller';\nimport { Context } from 'egg';\nimport routerDecorator from 'egg-cool-router';\nimport { Brackets } from 'typeorm';\n/**\n * 系统-角色\n */\n@routerDecorator.prefix('/admin/sys/role', [ 'add', 'delete', 'update', 'info', 'list', 'page' ])\nexport default class SysRoleController extends BaseController {\n    constructor (ctx: Context) {\n        super(ctx);\n        this.setEntity(this.ctx.repo.sys.Role);\n        this.setPageOption({\n            keyWordLikeFields: [ 'name', 'label' ],\n            where: new Brackets(qb =\u003e {\n                qb.where('id !=:id', { id: 1 });\n            }),\n        });//分页配置（可选）\n        this.setService(this.service.sys.role);//设置自定义的service（可选）\n    }\n}\n```\n这样我们就完成了6个接口的编写，对应的接口如下：\n* **`/admin/sys/role/add`** 新增\n* **`/admin/sys/role/delete`** 删除\n* **`/admin/sys/role/update`** 更新\n* **`/admin/sys/role/info`** 单个信息\n* **`/admin/sys/role/list`** 列表信息\n* **`/admin/sys/role/page`** 分页查询(包含模糊查询、字段全匹配等)\n\n#### PageOption配置参数\n\n| 参数  | 类型  | 说明  |\n| ------------ | ------------ | ------------ |\n| keyWordLikeFields  | 数组  | 模糊查询需要匹配的字段，如`[ 'name','phone' ]` ,这样就可以模糊查询`姓名、手机`两个字段了  |\n| where | TypeORM Brackets对象  | 固定where条件设置，详见[typeorm](https://typeorm.io/#/select-query-builder \"typeorm\") |\n| fieldEq | 数组 | 动态条件全匹配，如需要筛选用户状态`status`，就可以设置成`['status']`,此时接口就可以接受`status`的值并且对数据有过滤效果  |\n| addOrderBy  |  对象 | 排序条件可传多个，如`{ sortNum:asc, createTime:desc }`  |\n\n## 数据缓存\n有些业务场景，我们并不希望每次请求接口都需要操作数据库，如：今日推荐、上个月排行榜等，数据存储在`redis`，注：缓存注解只在`service`层有效\n```js\nimport { BaseService } from 'egg-cool-service';\nimport { Cache } from 'egg-cool-cache';\n/**\n * 业务-排行榜服务类\n */\nexport default class BusRankService extends BaseService {\n    /**\n     * 上个月榜单\n     */\n    @Cache({ ttl: 1000 }) // 表示缓存\n    async rankList () {\n        return [ '程序猿1号', '程序猿2号', '程序猿3号' ];\n    }\n}\n```\n#### Cache配置参数\n| 参数  | 类型  | 说明  |\n| ------------ | ------------ | ------------ |\n| resolver  | 数组  | 方法参数获得，生成key用， `resolver: (args =\u003e {return args[0];}),` 这样就可以获得方法的第一个参数作为缓存`key` |\n|  ttl |  数字 |  缓存过期时间，单位：`秒` |\n|  url | 字符串  |  请求url包含该前缀才缓存，如`/api/*`请求时缓存，`/admin/*`请求时不缓存 |\n\n## 路由\n[egg.js](https://eggjs.org/zh-cn/)原生的路由写法过于繁琐，`cool-admin`的路由支持`BaseController`还有其他原生支持具体参照[egg.js路由](https://eggjs.org/zh-cn/basics/router.html)\n\n## 自定义sql查询\n除了单表的简单操作，真实的业务往往需要对数据库做一些复杂的操作。这时候我们可以在`service`自定义SQL，如\n```js\nasync page (query) {\n    const { keyWord, status } = query;\n    const sql = `\n    SELECT\n        a.*,\n        GROUP_CONCAT(c.name) AS roleName\n    FROM\n        sys_user a\n        LEFT JOIN sys_user_role b ON a.id = b.userId\n        LEFT JOIN sys_role c ON b.roleId = c.id\n    WHERE 1 = 1\n        ${ this.setSql(status, 'and a.status = ?', [ status ]) }\n        ${ this.setSql(keyWord, 'and (a.name LIKE ? or a.username LIKE ?)', [ `%${ keyWord }%`, `%${ keyWord }%` ]) }\n        ${ this.setSql(true, 'and a.id != ?', [ 1 ]) }\n    GROUP BY a.id`;\n    return this.sqlRenderPage(sql, query);\n}\n```\n### this.setSql()设置参数\n| 参数  | 类型  | 说明  |\n| ------------ | ------------ | ------------ |\n| condition  | 布尔型  | 只有满足改条件才会拼接上相应的sql和参数 |\n|  sql |  字符串 |  需要拼接的参数 |\n|  params | 数组  |  相对应的参数 |\n\n\n\n\n","funding_links":[],"categories":["仓库"],"sub_categories":["脚手架"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapgzs%2Fcool-admin-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fapgzs%2Fcool-admin-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fapgzs%2Fcool-admin-api/lists"}