Giter VIP home page Giter VIP logo

cool-team-official / cool-admin-midway Goto Github PK

View Code? Open in Web Editor NEW
2.3K 32.0 518.0 4.38 MB

🔥 cool-admin(midway版)一个很酷的后台权限管理框架,模块化、插件化、CRUD极速开发,永久开源免费,基于midway.js 3.x、typescript、typeorm、mysql、jwt、vue3、vite、element-ui等构建

Home Page: https://cool-js.com

License: MIT License

JavaScript 0.40% Dockerfile 0.52% TypeScript 97.24% CSS 0.82% HTML 1.02%
midway koa2 typeorm typescript vue serverless docker jwt mysql redis

cool-admin-midway's Introduction

Midway Logo

cool-admin(midway版)一个很酷的后台权限管理系统,开源免费,模块化、插件化、极速开发CRUD,方便快速构建迭代后台管理系统,支持serverless、docker、普通服务器等多种方式部署 到 官网 进一步了解。

GitHub license GitHub tag GitHub tag

技术栈

  • 后端:node.js midway.js koa.js typescript
  • 前端:vue.js element-plus jsx pinia vue-router
  • 数据库:mysql postgresql sqlite

如果你是前端,后端的这些技术选型对你是特别友好的,前端开发者可以较快速地上手。 如果你是后端,Typescript 的语法又跟 java、php 等特别类似,一切看起来也是那么得熟悉。

如果你想使用 java 版本后端,请移步cool-admin-java

官网

https://cool-js.com

演示

AI 极速编码

https://show.cool-admin.com

  • 账户:admin
  • 密码:123456

Admin Home

项目前端

https://github.com/cool-team-official/cool-admin-vue

微信群

Admin Wechat

运行

修改数据库配置,配置文件位于src/config/config.local.ts

以 Mysql 为例,其他数据库请参考数据库配置文档

Mysql(>=5.7版本),建议 8.0,node 版本(>=16.x),建议 18.x,首次启动会自动初始化并导入数据

// mysql,驱动已经内置,无需安装
typeorm: {
    dataSource: {
      default: {
        type: 'mysql',
        host: '127.0.0.1',
        port: 3306,
        username: 'root',
        password: '123456',
        database: 'cool',
        // 自动建表 注意:线上部署的时候不要使用,有可能导致数据丢失
        synchronize: true,
        // 打印日志
        logging: false,
        // 字符集
        charset: 'utf8mb4',
        // 是否开启缓存
        cache: true,
        // 实体路径
        entities: ['**/modules/*/entity'],
      },
    },
  },

安装依赖并运行

$ npm i
$ npm run dev
$ open http://localhost:8001/

注: npm i如果安装失败可以尝试使用cnpm,或者切换您的镜像源,推荐使用pnpm

CURD(快速增删改查)

大部分的后台管理系统,或者 API 服务都是对数据进行管理,所以可以看到大量的 CRUD 场景(增删改查),cool-admin 对此进行了大量地封装,让这块的编码量变得极其地少。

新建一个数据表

src/modules/demo/entity/goods.ts,项目启动数据库会自动创建该表,无需手动创建

import { BaseEntity } from '@cool-midway/core';
import { Column, Entity, Index } from 'typeorm';

/**
 * 商品
 */
@Entity('demo_app_goods')
export class DemoAppGoodsEntity extends BaseEntity {
  @Column({ comment: '标题' })
  title: string;

  @Column({ comment: '图片' })
  pic: string;

  @Column({ comment: '价格', type: 'decimal', precision: 5, scale: 2 })
  price: number;
}

编写 api 接口

src/modules/demo/controller/app/goods.ts,快速编写 6 个 api 接口

import { CoolController, BaseController } from '@cool-midway/core';
import { DemoAppGoodsEntity } from '../../entity/goods';

/**
 * 商品
 */
@CoolController({
  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
  entity: DemoAppGoodsEntity,
})
export class DemoAppGoodsController extends BaseController {
  /**
   * 其他接口
   */
  @Get('/other')
  async other() {
    return this.ok('hello, cool-admin!!!');
  }
}

这样我们就完成了 6 个接口的编写,对应的接口如下:

  • POST /app/demo/goods/add 新增
  • POST /app/demo/goods/delete 删除
  • POST /app/demo/goods/update 更新
  • GET /app/demo/goods/info 单个信息
  • POST /app/demo/goods/list 列表信息
  • POST /app/demo/goods/page 分页查询(包含模糊查询、字段全匹配等)

部署

部署教程

内置指令

  • 使用 npm run lint 来做代码风格检查。

低价服务器

阿里云、腾讯云、华为云低价云服务器,不限新老

cool-admin-midway's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cool-admin-midway's Issues

entity里面部分字段写了Rule进行Validate后,没写的参数传入时会提示is not allowed

@EntityModel('edu_course_info')
export class EduCourseInfoEntity extends BaseEntity {
  @Column({ comment: '課程所屬商戶號' })
  merchantCode: string;

  @Rule(RuleType.number().required())
  @Column({ comment: '課程編號(商戶自編編號)', unique: true })
  courseId: string;

  @Column({ comment: '标题' })
  title: string;

这个时候通过CoolController的API add传入时候merchantCode就会显示CoolValidateException, merchantCode is not allowed.

npm更新到最新版本midway脚手架 启动报错

无法创建type文件

[email protected] dev C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway
cross-env ets && cross-env NODE_ENV=local TS_NODE_TYPE_CHECK=false TS_NODE_TRANSPILE_ONLY=true midway-bin dev --ts --port=8001 --sticky

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type function ([Function (anonymous)])
at validateString (internal/validators.js:124:11)
at Object.resolve (path.js:139:9)
at Function.module.exports.sync (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\locate-path\index.js:20:28)
at Function.module.exports.sync (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\find-up\index.js:34:27)
at Object.findLernaRoot (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\utils.js:37:22)
at EggAppWorkerLoader.getEggPaths (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\base.js:53:42)
at new EggLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\egg-core\lib\loader\egg_loader.js:72:26)
at new AppWorkerLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\egg\lib\loader\app_worker_loader.js:9:1)
at new EggAppWorkerLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\base.js:38:13)
at getLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\egg-ts-helper\eggInfo.js:94:10)
Error: Command failed: node C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\egg-ts-helper\eggInfo
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type function ([Function (anonymous)])
at validateString (internal/validators.js:124:11)
at Object.resolve (path.js:139:9)
at Function.module.exports.sync (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\locate-path\index.js:20:28)
at Function.module.exports.sync (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\find-up\index.js:34:27)
at Object.findLernaRoot (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\utils.js:37:22)
at EggAppWorkerLoader.getEggPaths (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\base.js:53:42)
at new EggLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\egg-core\lib\loader\egg_loader.js:72:26)
at new AppWorkerLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\egg\lib\loader\app_worker_loader.js:9:1)
at new EggAppWorkerLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\base.js:38:13)
at getLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\egg-ts-helper\eggInfo.js:94:10)

at checkExecSyncError (child_process.js:616:11)
at Object.execSync (child_process.js:652:15)
at Object.getEggInfo (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\bin.js:50:21)
at getDefaultWatchDirs (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\index.js:57:46)
at TsHelper.configure (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\index.js:247:28)
at new TsHelper (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\index.js:106:14)
at Object.createTsHelperInstance (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\index.js:365:12)
at execute (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\bin.js:64:25)
at Object.<anonymous> (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\bin.js:34:5)
at Module._compile (internal/modules/cjs/loader.js:1063:30) {

status: 1,
signal: null,
output: [
null,
,
<Buffer 54 79 70 65 45 72 72 6f 72 20 5b 45 52 52 5f 49 4e 56 41 4c 49 44 5f 41 52 47 5f 54 59 50 45 5d 3a 20
54 68 65 20 22 70 61 74 68 22 20 61 72 67 75 6d ... 1232 more bytes>
],
pid: 17660,
stdout: ,
stderr: <Buffer 54 79 70 65 45 72 72 6f 72 20 5b 45 52 52 5f 49 4e 56 41 4c 49 44 5f 41 52 47 5f 54 59 50 45 5d
3a 20 54 68 65 20 22 70 61 74 68 22 20 61 72 67 75 6d ... 1232 more bytes>
}
[egg-ts-helper] create typings\app\index.d.ts (2ms)
internal/fs/utils.js:307
throw err;
^

Error: ENOENT: no such file or directory, open 'C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\typings\config\plugin.d.ts'
at Object.openSync (fs.js:476:3)
at Object.readFileSync (fs.js:377:35)
at Object. (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\egg-ts-helper\bin.js:68:11)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47 {
errno: -4058,
syscall: 'open',
code: 'ENOENT',
path: 'C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\typings\config\plugin.d.ts'
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] dev: cross-env ets && cross-env NODE_ENV=local TS_NODE_TYPE_CHECK=false TS_NODE_TRANSPILE_ONLY=true midway-bin dev --ts --port=8001 --sticky
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] dev script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\kane\AppData\Roaming\npm-cache_logs\2021-03-31T02_29_05_679Z-debug.log
PS C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway> npm run dev

[email protected] dev C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway
cross-env ets && cross-env NODE_ENV=local TS_NODE_TYPE_CHECK=false TS_NODE_TRANSPILE_ONLY=true midway-bin dev --ts --port=8001 --sticky

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type function ([Function (anonymous)])
at validateString (internal/validators.js:124:11)
at Object.resolve (path.js:139:9)
at Function.module.exports.sync (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\locate-path\index.js:20:28)
at Function.module.exports.sync (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\find-up\index.js:34:27)
at Object.findLernaRoot (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\utils.js:37:22)
at EggAppWorkerLoader.getEggPaths (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\base.js:53:42)
at new EggLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\egg-core\lib\loader\egg_loader.js:72:26)
at new AppWorkerLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\egg\lib\loader\app_worker_loader.js:9:1)
at new EggAppWorkerLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\base.js:38:13)
at getLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\egg-ts-helper\eggInfo.js:94:10)
Error: Command failed: node C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\egg-ts-helper\eggInfo
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type function ([Function (anonymous)])
at validateString (internal/validators.js:124:11)
at Object.resolve (path.js:139:9)
at Function.module.exports.sync (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\locate-path\index.js:20:28)
at Function.module.exports.sync (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\find-up\index.js:34:27)
at Object.findLernaRoot (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\utils.js:37:22)
at EggAppWorkerLoader.getEggPaths (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\base.js:53:42)
at new EggLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\egg-core\lib\loader\egg_loader.js:72:26)
at new AppWorkerLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\egg\lib\loader\app_worker_loader.js:9:1)
at new EggAppWorkerLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\web\dist\base.js:38:13)
at getLoader (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\egg-ts-helper\eggInfo.js:94:10)

at checkExecSyncError (child_process.js:616:11)
at Object.execSync (child_process.js:652:15)
at Object.getEggInfo (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\bin.js:50:21)
at getDefaultWatchDirs (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\index.js:57:46)
at TsHelper.configure (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\index.js:247:28)
at new TsHelper (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\index.js:106:14)
at Object.createTsHelperInstance (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\index.js:365:12)
at execute (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\bin.js:64:25)
at Object.<anonymous> (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules\@midwayjs\egg-ts-helper\node_modules\egg-ts-helper\dist\bin.js:34:5)
at Module._compile (internal/modules/cjs/loader.js:1063:30) {

status: 1,
signal: null,
output: [
null,
,
<Buffer 54 79 70 65 45 72 72 6f 72 20 5b 45 52 52 5f 49 4e 56 41 4c 49 44 5f 41 52 47 5f 54 59 50 45 5d 3a 20
54 68 65 20 22 70 61 74 68 22 20 61 72 67 75 6d ... 1232 more bytes>
],
pid: 7460,
stdout: ,
stderr: <Buffer 54 79 70 65 45 72 72 6f 72 20 5b 45 52 52 5f 49 4e 56 41 4c 49 44 5f 41 52 47 5f 54 59 50 45 5d
3a 20 54 68 65 20 22 70 61 74 68 22 20 61 72 67 75 6d ... 1232 more bytes>
}
[egg-ts-helper] create typings\app\index.d.ts (3ms)
internal/fs/utils.js:307
throw err;
^

Error: ENOENT: no such file or directory, open 'C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\typings\config\plugin.d.ts'
at Object.openSync (fs.js:476:3)
at Object.readFileSync (fs.js:377:35)
at Object. (C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\node_modules@midwayjs\egg-ts-helper\bin.js:68:11)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47 {
errno: -4058,
syscall: 'open',
code: 'ENOENT',
path: 'C:\Users\kane\Desktop\Dev\cool-admin\cool-admin-midway\typings\config\plugin.d.ts'
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] dev: cross-env ets && cross-env NODE_ENV=local TS_NODE_TYPE_CHECK=false TS_NODE_TRANSPILE_ONLY=true midway-bin dev --ts --port=8001 --sticky
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] dev script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\kane\AppData\Roaming\npm-cache_logs\2021-03-31T02_30_33_281Z-debug.log

[ Midway ] start error: Unexpected token =

当我从github上拉去项目, 使用cnpm i安装依赖, 但是当我启动项目npm run dev时抛出一个错误
`
[ Midway ] start error: Unexpected token =
F:\xxxx\cool-admin-midway\node_modules_@[email protected]@@4a\cid\index.js:4
base = 15 // 基础长度
^

SyntaxError: Unexpected token =
at new Script (vm.js:80:7)
at createScript (vm.js:274:10)
at Object.runInThisContext (vm.js:326:10)
at Module._compile (internal/modules/cjs/loader.js:664:28)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
at Module.load (internal/modules/cjs/loader.js:600:32)
at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
at Function.Module._load (internal/modules/cjs/loader.js:531:3)
at Module.require (internal/modules/cjs/loader.js:637:17)
at require (internal/modules/cjs/helpers.js:22:18)
`
不知道是我哪一步出现了错误, 请帮忙指点一下, 谢谢!

crud时默认createTime排序问题

crud时默认会有createTime的排序,多数据库开发时,已存在多数据库表里可能没有createTime这个字段,查询就会出错,所以能不能在装饰器里加个开关,默认开启排序,也可以手动关闭呢

定时任务执行错误

操作步骤:

  1. 添加cron定时任务后,定时每1分钟执行一次
  2. 查看定时任务日志,任务会在启动后的一段时间内重复执行,没有做到1分钟执行一次的效果

数据库版本:mysql: 5.7.33-log,redis:5.0.5

提个意见

1.因为使用同种技术,定位全栈开发,一般是一个人。前后端放一个git仓库内,方便同时开发
2.基于前后端在一个仓库内,是否有快速生成代码的工具。快速生成模块及模块下页面,区分admin及app

[cool:core] midwayjs cool core init base database err please manual import

2021-04-12 10:07:44,413 ERROR 22976 [cool:core] midwayjs cool core init base database err please manual import
2021-04-12 10:07:44,413 ERROR 22976 Error: ER_TOO_LONG_KEY: Specified key was too long; max key length is 767 bytes
at Query.Sequence._packetToError (D:\work\cool-admin-midway\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
at Query.ErrorPacket (D:\work\cool-admin-midway\node_modules\mysql\lib\protocol\sequences\Query.js:79:18)
at Protocol._parsePacket (D:\work\cool-admin-midway\node_modules\mysql\lib\protocol\Protocol.js:291:23)
at Parser._parsePacket (D:\work\cool-admin-midway\node_modules\mysql\lib\protocol\Parser.js:433:10)
at Parser.write (D:\work\cool-admin-midway\node_modules\mysql\lib\protocol\Parser.js:43:10)
at Protocol.write (D:\work\cool-admin-midway\node_modules\mysql\lib\protocol\Protocol.js:38:16)
at Socket. (D:\work\cool-admin-midway\node_modules\mysql\lib\Connection.js:88:28)
at Socket. (D:\work\cool-admin-midway\node_modules\mysql\lib\Connection.js:526:10)
at Socket.emit (events.js:210:5)
at Socket.EventEmitter.emit (domain.js:475:20)
--------------------
at Protocol._enqueue (D:\work\cool-admin-midway\node_modules\mysql\lib\protocol\Protocol.js:144:48)
at Connection.query (D:\work\cool-admin-midway\node_modules\mysql\lib\Connection.js:198:25)
at D:\work\cool-admin-midway\node_modules\mysql-import\mysql-import.js:466:23
at new Promise ()
at queryParser.executeQuery (D:\work\cool-admin-midway\node_modules\mysql-import\mysql-import.js:465:10)
at queryParser._write (D:\work\cool-admin-midway\node_modules\mysql-import\mysql-import.js:452:26)
at processTicksAndRejections (internal/process/task_queues.js:93:5)

内存泄漏

运行时发现node内存不释放,dev和prod环境都存在问题,怀疑存在内存泄漏。
之前群里好像也有人提过这问题,本地开发的时候也是内存一直涨,直到oom。
然后进过排查。

  1. 发现直接跑midway初始工程,正常。
  2. 所以排除node版本和系统的问题。
  3. 将cool工程中,configuration只保留cool核心库,去除插件,内存依旧不释放。
  4. 删除所有module只保留welcome.ts,内存依旧不释放。
  5. 将welcome控制器改为midway的Controller,恢复正常。
  6. 加上redis插件,内存又不释放了。

泄漏截图 (第4步的状态)
image

替换CoolController使用midway默认Controller的截图(第5步状态)
image

下图是通过alinode拉取的堆快照,控制器没有释放掉。
image

封装的service下的list和page方法返回来的json序列化问题

问题:list,page接口调用的时候json返回来的是下横线命名
期望:返回来驼峰命名

entity的代码

export class PostMatchEntity extends BaseEntity {
  @Column('datetime', {
      name: 'post_date',
      default: () => "'1990-01-01 00:00:00'",
    })
    postDate: Date;
  
    @Column('datetime', {
      name: 'post_date_gmt',
      default: () => "'1990-01-01 00:00:00'",
    })
}

list返回来的的却是确实下横线命名

{
	"code": 1000,
	"message": "success",
	"data": [
		{
			"id": 74710580,
			"post_author": "1",
			"post_date": "2020-12-10 16:00:00",
			"post_date_gmt": "2020-12-10 16:00:00",
		}
         ]
}

如果我用typeorm重写list的方法,返回来的是驼峰式命名的

  async list(params) {
    const list = await this.postEntity.find({});
    return list;
  }

任务列表模块,无法使用this.ctx.curl

image
image

一旦使用了this.ctx.curl 日志的mysql 会语法错误。注释掉日志代码后。直接无征兆的未完整把代码执行下去。

是不是任务列表无法使用 this.ctx.curl

设置时区警告

// 设置时区
timezone: '+08:00',

image

The timezone used when converting a date from the database into a JavaScript date. The timezone is also used to SET TIMEZONE when connecting to the server, to ensure that the result of NOW, CURRENT_TIMESTAMP and other time related functions have in the right timezone. For best cross platform performance use the format +/-HH:MM. Will also accept string versions of timezones used by moment.js (e.g. 'America/Los_Angeles'); this is useful to capture daylight savings time changes.

throw new CoolCommException('XXXXX') 报错

2021-04-01 11:59:34,865 ERROR 24964 Error: next() called multiple times
at dispatch (F:\project\qishi\cool-admin-midway\node_modules\koa\node_modules\koa-compose\index.js:36:45)
at F:\project\qishi\cool-admin-midway\src\app\modules\base\middleware\authority.ts:117:13
at processTicksAndRejections (internal/process/task_queues.js:93:5)
at xframe (F:\project\qishi\cool-admin-midway\node_modules\egg-security\lib\middlewares\xframe.js:7:5)
at xssProtection (F:\project\qishi\cool-admin-midway\node_modules\egg-security\lib\middlewares\xssProtection.js:7:5)
at nosniff (F:\project\qishi\cool-admin-midway\node_modules\egg-security\lib\middlewares\nosniff.js:8:5)
at noopen (F:\project\qishi\cool-admin-midway\node_modules\egg-security\lib\middlewares\noopen.js:8:5)
at session (F:\project\qishi\cool-admin-midway\node_modules\koa-session\index.js:41:7)
at bodyParser (F:\project\qishi\cool-admin-midway\node_modules\koa-bodyparser\index.js:95:5)
at F:\project\qishi\cool-admin-midway\node_modules\koa-static-cache\index.js:39:63

不支持mysql8.0

mysql客户端8.0+
提示:ER_NOT_SUPPORTED_AUTH_MODE,

ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

mysql数据库已经执行了:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
还是报错, 框架内部进行了相关处理吗?

支持多数据库吗?

我想把 admin 默认的表和业务的表区分不同的数据库,但是找不到相关配置,看了下源码,貌似是只支持单数据库的。

多数据库支持报 *Entity找不到

触发例子如下:
1.config 配置多数据库

config.orm = {

default: {
  type: 'mysql',
  host: '127.0.0.1',
  port: 3306,
  username: 'midway',
  password: '123123',
  database: 'cooladmin',
  synchronize: true,
  logging: true,
  charset: 'utf8mb4',
},
test1: {
  type: 'mysql',
  host: '127.0.0.1',
  port: 3306,
  username: 'root',
  password: '12345678',
  database: 'dashboard',
  synchronize: true,
  logging: true,
  charset: 'utf8mb4',

},

};

2.修改内部 demo/entity/goods.ts 及 demo/service/goods.ts

@EntityModel('demo_app_goods',{ connectionName: 'test1' })

@Provide() export class DemoGoodsService extends BaseService { @InjectEntityModel(DemoAppGoodsEntity,'test1') demoAppGoodsEntity: Repository<DemoAppGoodsEntity>;

服务重启后,即报错
RepositoryNotFoundError: No repository for "DemoAppGoodsEntity" was found. Looks like this entity is not registered in current "default" connection?

观察到数据库表被成功更新
image

期待修复

oss插件功能增强:增加bucket子目录和CDN路径显示;文件名可配置使用原文件名或随机文件名

  • OSS在使用是大多配合CDN使用,所以希望能在OSS插件中增加bucket path和cdn属性,这两个属性可为空,cdn属性为空时返回endpoint地址,cdn不为空时返回
    image
  • 文件名可配置使用原文件名或随机文件名
  • upload接口返回path,cdn值(如果允许随机文件名,提前指定文件名称约束,并在upload接口返回该文件名),同时在policy condition中加入路径约束
    ["content-length-range", 0, 1048576000], // 设置上传文件的大小限制
    ["starts-with","$key","path/"], //设置路径约束
    ["starts-with","$name","randomfilename"]//如果允许随机文件名,提前指定文件名称约束,并在upload接口返回该文件名

Redis缓存插件在函数计算环境中出现 Cannot read property 'set' of null

代码在本地npm run dev正常 但是部署到函数计算环境汇总会出现Cannot read property 'set' of null 报错 排插发现是redis缓存插件报错,如图:
image
分别在set方法和createConnect方法中打印日志
image
image

发现set方法早于redis成功之前调用,日志如下:
image

为了防止this.cahe为空 在set方法中增加了 初始化方法,如下

image
代码运行正常

定时任务出现内存泄露问题

重现步骤:
1.拉取最新代码无论是midwayjs版还是egg版
2.直接容器运行
3.新建10个空任务(打印日志都可以)几秒一跑
4.内存就会一直往上并且不会停,一晚上几百MB往上,一周不管直接破GB级别

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.