MG 1 year ago
commit
af1c66a46c
100 changed files with 7020 additions and 0 deletions
  1. 19 0
      yxgb-admin-midway/.dockerignore
  2. 11 0
      yxgb-admin-midway/.editorconfig
  3. 28 0
      yxgb-admin-midway/.eslintrc.json
  4. 4 0
      yxgb-admin-midway/.gitattributes
  5. 20 0
      yxgb-admin-midway/.gitignore
  6. 9 0
      yxgb-admin-midway/.hintrc
  7. 3 0
      yxgb-admin-midway/.prettierrc.js
  8. 28 0
      yxgb-admin-midway/.vscode/config.code-snippets
  9. 19 0
      yxgb-admin-midway/.vscode/controller.code-snippets
  10. 20 0
      yxgb-admin-midway/.vscode/entity.code-snippets
  11. 21 0
      yxgb-admin-midway/.vscode/event.code-snippets
  12. 29 0
      yxgb-admin-midway/.vscode/middleware.code-snippets
  13. 21 0
      yxgb-admin-midway/.vscode/queue.code-snippets
  14. 27 0
      yxgb-admin-midway/.vscode/service.code-snippets
  15. 34 0
      yxgb-admin-midway/Dockerfile
  16. 21 0
      yxgb-admin-midway/LICENSE
  17. 16 0
      yxgb-admin-midway/README.md
  18. 2 0
      yxgb-admin-midway/bootstrap.js
  19. 49 0
      yxgb-admin-midway/docker-compose.yml
  20. 6 0
      yxgb-admin-midway/jest.config.js
  21. 87 0
      yxgb-admin-midway/package.json
  22. 184 0
      yxgb-admin-midway/patches/@cool-midway+core+6.0.2.patch
  23. 89 0
      yxgb-admin-midway/public/css/welcome.css
  24. BIN
      yxgb-admin-midway/public/favicon.ico
  25. 5 0
      yxgb-admin-midway/public/js/jquery-2.0.3.min.js
  26. 14 0
      yxgb-admin-midway/public/js/welcome.js
  27. BIN
      yxgb-admin-midway/src/comm/ipipfree.ipdb
  28. 67 0
      yxgb-admin-midway/src/comm/utils.ts
  29. 38 0
      yxgb-admin-midway/src/config/config.default.ts
  30. 44 0
      yxgb-admin-midway/src/config/config.local.ts
  31. 35 0
      yxgb-admin-midway/src/config/config.prod.ts
  32. 67 0
      yxgb-admin-midway/src/configuration.ts
  33. 6 0
      yxgb-admin-midway/src/interface.ts
  34. 33 0
      yxgb-admin-midway/src/modules/base/config.ts
  35. 82 0
      yxgb-admin-midway/src/modules/base/controller/admin/comm.ts
  36. 404 0
      yxgb-admin-midway/src/modules/base/controller/admin/jtcomm.ts
  37. 73 0
      yxgb-admin-midway/src/modules/base/controller/admin/open.ts
  38. 13 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/angle.ts
  39. 30 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/atlas.ts
  40. 26 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/datafield.ts
  41. 26 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/datafields.ts
  42. 13 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/datasource.ts
  43. 15 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/datatable.ts
  44. 27 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/department.ts
  45. 29 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/layers.ts
  46. 64 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/log.ts
  47. 35 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/menu.ts
  48. 32 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/param.ts
  49. 38 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/role.ts
  50. 11 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/tool.ts
  51. 30 0
      yxgb-admin-midway/src/modules/base/controller/admin/sys/user.ts
  52. 1 0
      yxgb-admin-midway/src/modules/base/controller/app/README.md
  53. 45 0
      yxgb-admin-midway/src/modules/base/controller/app/comm.ts
  54. 16 0
      yxgb-admin-midway/src/modules/base/dto/login.ts
  55. 36 0
      yxgb-admin-midway/src/modules/base/entity/sys/angle.ts
  56. 45 0
      yxgb-admin-midway/src/modules/base/entity/sys/atlas.ts
  57. 15 0
      yxgb-admin-midway/src/modules/base/entity/sys/conf.ts
  58. 32 0
      yxgb-admin-midway/src/modules/base/entity/sys/data_field.ts
  59. 32 0
      yxgb-admin-midway/src/modules/base/entity/sys/data_source.ts
  60. 8 0
      yxgb-admin-midway/src/modules/base/entity/sys/data_source_mongo.ts
  61. 14 0
      yxgb-admin-midway/src/modules/base/entity/sys/data_table.ts
  62. 19 0
      yxgb-admin-midway/src/modules/base/entity/sys/department.ts
  63. 62 0
      yxgb-admin-midway/src/modules/base/entity/sys/layers.ts
  64. 27 0
      yxgb-admin-midway/src/modules/base/entity/sys/log.ts
  65. 45 0
      yxgb-admin-midway/src/modules/base/entity/sys/menu.ts
  66. 28 0
      yxgb-admin-midway/src/modules/base/entity/sys/param.ts
  67. 40 0
      yxgb-admin-midway/src/modules/base/entity/sys/role.ts
  68. 14 0
      yxgb-admin-midway/src/modules/base/entity/sys/role_atlas.ts
  69. 14 0
      yxgb-admin-midway/src/modules/base/entity/sys/role_department.ts
  70. 14 0
      yxgb-admin-midway/src/modules/base/entity/sys/role_menu.ts
  71. 14 0
      yxgb-admin-midway/src/modules/base/entity/sys/role_tool.ts
  72. 44 0
      yxgb-admin-midway/src/modules/base/entity/sys/tool.ts
  73. 55 0
      yxgb-admin-midway/src/modules/base/entity/sys/user.ts
  74. 14 0
      yxgb-admin-midway/src/modules/base/entity/sys/user_role.ts
  75. 807 0
      yxgb-admin-midway/src/modules/base/init--.sql
  76. 390 0
      yxgb-admin-midway/src/modules/base/init.sql
  77. 67 0
      yxgb-admin-midway/src/modules/base/manager/mysqlDataSourceManager.ts
  78. 84 0
      yxgb-admin-midway/src/modules/base/manager/oracleDataSourceManager.ts
  79. 85 0
      yxgb-admin-midway/src/modules/base/manager/pgDataSourceManager.ts
  80. 66 0
      yxgb-admin-midway/src/modules/base/manager/sqliteDataSourceManager.ts
  81. 139 0
      yxgb-admin-midway/src/modules/base/middleware/authority.ts
  82. 26 0
      yxgb-admin-midway/src/modules/base/middleware/log.ts
  83. 30 0
      yxgb-admin-midway/src/modules/base/schedule/log.ts
  84. 79 0
      yxgb-admin-midway/src/modules/base/service/3dtile.service.ts
  85. 20 0
      yxgb-admin-midway/src/modules/base/service/data-mongo.service.ts
  86. 927 0
      yxgb-admin-midway/src/modules/base/service/data.service.ts
  87. 48 0
      yxgb-admin-midway/src/modules/base/service/mbtile.service.ts
  88. 203 0
      yxgb-admin-midway/src/modules/base/service/sys/atlas.ts
  89. 39 0
      yxgb-admin-midway/src/modules/base/service/sys/conf.ts
  90. 10 0
      yxgb-admin-midway/src/modules/base/service/sys/data.ts
  91. 101 0
      yxgb-admin-midway/src/modules/base/service/sys/datafield.ts
  92. 99 0
      yxgb-admin-midway/src/modules/base/service/sys/datafields.ts
  93. 95 0
      yxgb-admin-midway/src/modules/base/service/sys/datatable.ts
  94. 123 0
      yxgb-admin-midway/src/modules/base/service/sys/department.ts
  95. 135 0
      yxgb-admin-midway/src/modules/base/service/sys/layers.ts
  96. 72 0
      yxgb-admin-midway/src/modules/base/service/sys/log.ts
  97. 236 0
      yxgb-admin-midway/src/modules/base/service/sys/login.ts
  98. 359 0
      yxgb-admin-midway/src/modules/base/service/sys/menu.ts
  99. 69 0
      yxgb-admin-midway/src/modules/base/service/sys/param.ts
  100. 73 0
      yxgb-admin-midway/src/modules/base/service/sys/perms.ts

+ 19 - 0
yxgb-admin-midway/.dockerignore

@@ -0,0 +1,19 @@
+logs/
+npm-debug.log
+yarn-error.log
+node_modules/
+package-lock.json
+yarn.lock
+coverage/
+dist/
+.idea/
+run/
+.DS_Store
+*.sw*
+*.un~
+.tsbuildinfo
+.tsbuildinfo.*
+.audit
+typings/
+public/uploads/
+cache/

+ 11 - 0
yxgb-admin-midway/.editorconfig

@@ -0,0 +1,11 @@
+# 🎨 editorconfig.org
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_style = space
+indent_size = 2
+trim_trailing_whitespace = true
+insert_final_newline = true

+ 28 - 0
yxgb-admin-midway/.eslintrc.json

@@ -0,0 +1,28 @@
+{
+    "extends": "./node_modules/mwts/",
+    "ignorePatterns": [
+        "node_modules",
+        "dist",
+        "test",
+        "jest.config.js",
+        "typings",
+        "public/**/**",
+        "view/**/**"
+    ],
+    "env": {
+        "jest": true
+    },
+    "rules": {
+        "@typescript-eslint/explicit-module-boundary-types": "off",
+        "@typescript-eslint/no-unused-vars": "off",
+        "@typescript-eslint/ban-ts-comment": "off",
+        "node/no-extraneous-import": "off",
+        "no-empty": "off",
+        "node/no-extraneous-require": "off",
+        "eqeqeq": "off",
+        "node/no-unsupported-features/node-builtins": "off",
+        "@typescript-eslint/ban-types": "off",
+        "no-control-regex": "off",
+        "prefer-const": "off"
+    }
+}

+ 4 - 0
yxgb-admin-midway/.gitattributes

@@ -0,0 +1,4 @@
+*.js text eol=lf
+*.json text eol=lf
+*.ts text eol=lf
+*.code-snippets text eol=lf

+ 20 - 0
yxgb-admin-midway/.gitignore

@@ -0,0 +1,20 @@
+logs/
+cache/
+npm-debug.log
+yarn-error.log
+node_modules/
+package-lock.json
+yarn.lock
+coverage/
+dist/
+.idea/
+run/
+.DS_Store
+launch.json
+*.sw*
+*.un~
+.tsbuildinfo
+.tsbuildinfo.*
+data/*
+pnpm-lock.yaml
+public/uploads/*

+ 9 - 0
yxgb-admin-midway/.hintrc

@@ -0,0 +1,9 @@
+{
+  "extends": [
+    "development"
+  ],
+  "hints": {
+    "typescript-config/consistent-casing": "off",
+    "typescript-config/strict": "off"
+  }
+}

+ 3 - 0
yxgb-admin-midway/.prettierrc.js

@@ -0,0 +1,3 @@
+module.exports = {
+  ...require('mwts/.prettierrc.json')
+}

+ 28 - 0
yxgb-admin-midway/.vscode/config.code-snippets

@@ -0,0 +1,28 @@
+{
+  "config": {
+    "prefix": "config",
+    "body": [
+      "import { ModuleConfig } from '@cool-midway/core';",
+      "",
+      "/**",
+      " * 模块配置",
+      " */",
+      "export default () => {",
+      "  return {",
+      "    // 模块名称",
+      "    name: 'xxx',",
+      "    // 模块描述",
+      "    description: 'xxx',",
+      "    // 中间件,只对本模块有效",
+      "    middlewares: [],",
+      "    // 中间件,全局有效",
+      "    globalMiddlewares: [],",
+      "    // 模块加载顺序,默认为0,值越大越优先加载",
+      "    order: 0,",
+      "  } as ModuleConfig;",
+      "};",
+      ""
+    ],
+    "description": "cool-admin config代码片段"
+  }
+}

+ 19 - 0
yxgb-admin-midway/.vscode/controller.code-snippets

@@ -0,0 +1,19 @@
+{
+  "controller": {
+    "prefix": "controller",
+    "body": [
+      "import { CoolController, BaseController } from '@cool-midway/core';",
+      "",
+      "/**",
+      " * 描述",
+      " */",
+      "@CoolController({",
+      "  api: ['add', 'delete', 'update', 'info', 'list', 'page'],",
+      "  entity: 实体,",
+      "})",
+      "export class XxxController extends BaseController {}",
+      ""
+    ],
+    "description": "cool-admin controller代码片段"
+  }
+}

+ 20 - 0
yxgb-admin-midway/.vscode/entity.code-snippets

@@ -0,0 +1,20 @@
+{
+  "entity": {
+    "prefix": "entity",
+    "body": [
+      "import { BaseEntity } from '@cool-midway/core';",
+      "import { Column, Entity } from 'typeorm';",
+      "",
+      "/**",
+      " * 描述",
+      " */",
+      "@Entity('xxx_xxx_xxx')",
+      "export class XxxEntity extends BaseEntity {",
+      "  @Column({ comment: '描述' })",
+      "  xxx: string;",
+      "}",
+      ""
+    ],
+    "description": "cool-admin entity代码片段"
+  }
+}

+ 21 - 0
yxgb-admin-midway/.vscode/event.code-snippets

@@ -0,0 +1,21 @@
+{
+  "event": {
+    "prefix": "event",
+    "body": [
+      "import { CoolEvent, Event } from '@cool-midway/core';",
+      "",
+      "/**",
+      " * 接收事件",
+      " */",
+      "@CoolEvent()",
+      "export class xxxEvent {",
+      "  @Event('updateUser')",
+      "  async updateUser(msg, a) {",
+      "    console.log('ImEvent', 'updateUser', msg, a);",
+      "  }",
+      "}",
+      ""
+    ],
+    "description": "cool-admin event代码片段"
+  }
+}

+ 29 - 0
yxgb-admin-midway/.vscode/middleware.code-snippets

@@ -0,0 +1,29 @@
+{
+  "middleware": {
+    "prefix": "middleware",
+    "body": [
+      "import { Middleware } from '@midwayjs/decorator';",
+      "import { NextFunction, Context } from '@midwayjs/koa';",
+      "import { IMiddleware } from '@midwayjs/core';",
+      "",
+      "/**",
+      " * 描述",
+      " */",
+      "@Middleware()",
+      "export class XxxMiddleware implements IMiddleware<Context, NextFunction> {",
+      "  resolve() {",
+      "    return async (ctx: Context, next: NextFunction) => {",
+      "      // 控制器前执行的逻辑",
+      "      const startTime = Date.now();",
+      "      // 执行下一个 Web 中间件,最后执行到控制器",
+      "      await next();",
+      "      // 控制器之后执行的逻辑",
+      "      console.log(Date.now() - startTime);",
+      "    };",
+      "  }",
+      "}",
+      ""
+    ],
+    "description": "cool-admin middleware代码片段"
+  }
+}

+ 21 - 0
yxgb-admin-midway/.vscode/queue.code-snippets

@@ -0,0 +1,21 @@
+{
+  "queue": {
+    "prefix": "queue",
+    "body": [
+      "import { BaseCoolQueue, CoolQueue } from '@cool-midway/task';",
+      "",
+      "/**",
+      " * 队列",
+      " */",
+      "@CoolQueue()",
+      "export abstract class xxxQueue extends BaseCoolQueue {",
+      "  async data(job: any, done: any) {",
+      "    console.log('收到的数据', job.data);",
+      "    done();",
+      "  }",
+      "}",
+      ""
+    ],
+    "description": "cool-admin service代码片段"
+  }
+}

+ 27 - 0
yxgb-admin-midway/.vscode/service.code-snippets

@@ -0,0 +1,27 @@
+{
+  "service": {
+    "prefix": "service",
+    "body": [
+      "import { Provide } from '@midwayjs/decorator';",
+      "import { BaseService } from '@cool-midway/core';",
+      "import { InjectEntityModel } from '@midwayjs/typeorm';",
+      "import { Repository } from 'typeorm';",
+      "",
+      "/**",
+      " * 描述",
+      " */",
+      "@Provide()",
+      "export class XxxService extends BaseService {",
+      "  @InjectEntityModel(实体)",
+      "  xxxEntity: Repository<实体>;",
+      "",
+      "  /**",
+      "   * 描述",
+      "   */",
+      "  async xxx() {}",
+      "}",
+      ""
+    ],
+    "description": "cool-admin service代码片段"
+  }
+}

+ 34 - 0
yxgb-admin-midway/Dockerfile

@@ -0,0 +1,34 @@
+
+FROM node:lts-alpine
+
+WORKDIR /app
+
+# 配置alpine国内镜像加速
+RUN sed -i "s@http://dl-cdn.alpinelinux.org/@https://repo.huaweicloud.com/@g" /etc/apk/repositories
+
+# 安装tzdata,默认的alpine基础镜像不包含时区组件,安装后可通过TZ环境变量配置时区
+RUN apk add --no-cache tzdata
+
+# 设置时区为中国东八区,这里的配置可以被docker-compose.yml或docker run时指定的时区覆盖
+ENV TZ="Asia/Shanghai"
+
+# 如果各公司有自己的私有源,可以替换registry地址,如使用官方源注释下一行
+RUN npm config set registry https://registry.npm.taobao.org
+
+# 安装开发期依赖
+COPY package.json ./package.json
+# 补丁
+COPY patches .
+RUN npm install
+# 构建项目
+COPY . .
+RUN npm run build
+# 删除开发期依赖
+RUN rm -rf node_modules && rm package-lock.json    
+# 安装生产环境依赖   
+RUN npm install --production                          
+
+# 如果端口更换,这边可以更新一下
+EXPOSE 8092
+
+CMD ["npm", "run", "start"]

+ 21 - 0
yxgb-admin-midway/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 cool-team-official
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 16 - 0
yxgb-admin-midway/README.md

@@ -0,0 +1,16 @@
+# 创建数据库
+在pg数据库中创建一个贴合实际项目名称的数据库名称
+# 修改congfig
+```
+1. 修改src/config/config.default.ts中的端口,改成实际用的端口,如果后台有文件上传,也需要改file的端口
+2. 修改src/config/config.local.ts中的database的名称,改成项目创建的数据库名称
+3. 修改src/config/config.prod.ts中的database的名称,改成项目创建的数据库名称
+```
+### 运行项目
+
+```
+1. npm install
+2. npm run dev
+3. npm run build
+
+```

+ 2 - 0
yxgb-admin-midway/bootstrap.js

@@ -0,0 +1,2 @@
+const { Bootstrap } = require('@midwayjs/bootstrap');
+Bootstrap.run();

+ 49 - 0
yxgb-admin-midway/docker-compose.yml

@@ -0,0 +1,49 @@
+# 本地数据库环境
+# 数据存放在当前目录下的 data里
+# 推荐使用安装了docker扩展的vscode打开目录 在本文件上右键可以快速启动,停止
+# 如不需要相关容器开机自启动,可注释掉 restart: always
+# 如遇端口冲突 可调整ports下 :前面的端口号
+version: "3.1"
+
+services:
+  jtDB:
+    image: postgres:13
+    # command: --default-authentication-plugin=mysql_native_password --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION --group_concat_max_len=102400
+    restart: always
+    volumes:
+      - /custom/mount:/var/lib/postgresql/data
+    environment:
+      TZ: Asia/Shanghai # 指定时区
+      # POSTGRES_USER: "postgres" # 业务库用户名
+      POSTGRES_PASSWORD: "sdjt" # 配置密码
+      # POSTGRES_DATABASE: "jtb" # 业务库名
+    ports:
+      - 5432:5432
+
+  jtRedis:
+    image: redis
+    #command: --requirepass "12345678" # redis库密码,不需要密码注释本行
+    restart: always
+    environment:
+      TZ: Asia/Shanghai # 指定时区
+    volumes:
+      - ./data/redis/:/data/
+    ports:
+      - 6379:6379
+
+  admin:
+    build: .
+    image: docker-midway-jt
+    ports:
+      - 8092:8092 # 宿主机端口:容器端口
+
+  # pgadmin:
+  #   image: dpage/pgadmin4
+  #   #command: --requirepass "12345678" # redis库密码,不需要密码注释本行
+  #   restart: always
+  #   environment:
+  #     TZ: Asia/Shanghai # 指定时区
+  #     PGADMIN_DEFAULT_EMAIL: "test@123.com" # 用户名
+  #     PGADMIN_DEFAULT_PASSWORD: "123456" # 配置密码
+  #   ports:
+  #     - 5433:80

+ 6 - 0
yxgb-admin-midway/jest.config.js

@@ -0,0 +1,6 @@
+module.exports = {
+  preset: 'ts-jest',
+  testEnvironment: 'node',
+  testPathIgnorePatterns: ['<rootDir>/test/fixtures'],
+  coveragePathIgnorePatterns: ['<rootDir>/test/'],
+};

+ 87 - 0
yxgb-admin-midway/package.json

@@ -0,0 +1,87 @@
+{
+  "name": "jt-admin",
+  "version": "6.0.0",
+  "description": "",
+  "private": true,
+  "dependencies": {
+    "@cool-midway/cloud": "^6.0.0",
+    "@cool-midway/core": "^6.0.1",
+    "@cool-midway/file": "^6.0.0",
+    "@cool-midway/iot": "^6.0.0",
+    "@cool-midway/pay": "^6.0.0",
+    "@cool-midway/rpc": "^6.0.1",
+    "@cool-midway/task": "^6.0.0",
+    "@mapbox/mbtiles": "^0.12.1",
+    "@midwayjs/bootstrap": "^3.10.7",
+    "@midwayjs/cache": "^3.10.9",
+    "@midwayjs/core": "^3.10.7",
+    "@midwayjs/cross-domain": "^3.10.8",
+    "@midwayjs/decorator": "^3.10.7",
+    "@midwayjs/info": "^3.10.7",
+    "@midwayjs/koa": "^3.10.7",
+    "@midwayjs/logger": "^2.17.0",
+    "@midwayjs/static-file": "^3.10.8",
+    "@midwayjs/swagger": "^3.11.0",
+    "@midwayjs/task": "^3.6.0",
+    "@midwayjs/typeorm": "^3.10.7",
+    "@midwayjs/validate": "^3.10.7",
+    "@midwayjs/view-ejs": "^3.10.7",
+    "cache-manager-fs-hash": "^1.0.0",
+    "geojson": "^0.5.0",
+    "ipip-ipdb": "^0.6.0",
+    "jsonwebtoken": "^9.0.0",
+    "lodash": "^4.17.21",
+    "md5": "^2.3.0",
+    "mini-svg-data-uri": "^1.4.4",
+    "moment": "^2.29.4",
+    "mysql2": "^3.1.2",
+    "oracledb": "^5.5.0",
+    "pg": "^8.10.0",
+    "sqlite3": "5.0.2",
+    "svg-captcha": "^1.4.0",
+    "typeorm": "^0.3.12",
+    "uuid": "^9.0.0"
+  },
+  "devDependencies": {
+    "@midwayjs/cli": "^2.0.11",
+    "@midwayjs/mock": "^3.10.7",
+    "@types/jest": "^29.4.0",
+    "@types/koa": "^2.13.5",
+    "@types/node": "18",
+    "cross-env": "^7.0.3",
+    "jest": "^29.4.2",
+    "mwts": "^1.3.0",
+    "patch-package": "^6.5.1",
+    "swagger-ui-dist": "^4.18.2",
+    "ts-jest": "^29.0.5",
+    "typescript": "~4.9.5"
+  },
+  "engines": {
+    "node": ">=12.0.0"
+  },
+  "scripts": {
+    "start": "cross-env NODE_ENV=prod pm2 start ./bootstrap.js --name midway_lh_jh -i 1",
+    "start_single": "cross-env NODE_ENV=production node ./bootstrap.js",
+    "dev": "cross-env && cross-env NODE_ENV=local TS_NODE_TYPE_CHECK=false TS_NODE_TRANSPILE_ONLY=true midway-bin dev --ts",
+    "test": "midway-bin test --ts",
+    "cov": "midway-bin cov --ts",
+    "lint": "mwts check",
+    "lint:fix": "mwts fix",
+    "ci": "npm run cov",
+    "build": "midway-bin build -c",
+    "pm2:start": "pm2 start ./bootstrap.js -i max --name cool-admin",
+    "pm2:stop": "pm2 stop cool-admin & pm2 delete cool-admin",
+    "postinstall": "patch-package",
+    "pm2:debug": "pm2-runtime start ./bootstrap.js -i max --name cool-admin"
+  },
+  "midway-bin-clean": [
+    ".vscode/.tsbuildinfo",
+    "dist"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "https://cool-js.com"
+  },
+  "author": "COOL",
+  "license": "MIT"
+}

+ 184 - 0
yxgb-admin-midway/patches/@cool-midway+core+6.0.2.patch

@@ -0,0 +1,184 @@
+diff --git a/node_modules/@cool-midway/core/module/import.js b/node_modules/@cool-midway/core/module/import.js
+index 38741fb..0437df1 100644
+--- a/node_modules/@cool-midway/core/module/import.js
++++ b/node_modules/@cool-midway/core/module/import.js
+@@ -12,7 +12,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
+ exports.CoolModuleImport = void 0;
+ const decorator_1 = require("@midwayjs/decorator");
+ const core_1 = require("../exception/core");
+-const Importer = require("mysql2-import");
++// const Importer = require("mysql2-import");
++const { Client  } = require('pg')
+ const fs = require("fs");
+ const config_1 = require("./config");
+ const path = require("path");
+@@ -26,7 +27,8 @@ let CoolModuleImport = class CoolModuleImport {
+     async init() {
+         // 是否需要导入
+         if (this.coolConfig.initDB) {
+-            await this.checkDbVersion();
++          //变更
++            // await this.checkDbVersion();
+             const modules = this.coolModuleConfig.modules;
+             const importLockPath = path.join(`${this.app.getBaseDir()}`, "..", "lock");
+             if (!fs.existsSync(importLockPath)) {
+@@ -67,32 +69,63 @@ let CoolModuleImport = class CoolModuleImport {
+                 .ormConfig) === null || _a === void 0 ? void 0 : _a.default)
+                 ? this.ormConfig.default
+                 : this.ormConfig;
+-            const importer = new Importer({
+-                host,
+-                password,
+-                database,
+-                charset,
+-                port,
+-                user: username,
+-            });
+-            await importer
+-                .import(sqlPath)
+-                .then(async () => {
+-                clearInterval(t);
+-                this.coreLogger.info("\x1B[36m [cool:core] midwayjs cool core init " +
+-                    module +
+-                    " database complete \x1B[0m");
+-                fs.writeFileSync(lockPath, `time consuming:${second}s`);
+-            })
+-                .catch((err) => {
+-                clearTimeout(t);
+-                this.coreLogger.error("\x1B[36m [cool:core] midwayjs cool core init " +
+-                    module +
+-                    " database err please manual import \x1B[0m");
+-                fs.writeFileSync(lockPath, `time consuming:${second}s`);
+-                this.coreLogger.error(err);
+-                this.coreLogger.error(`自动初始化模块[${module}]数据库失败,尝试手动导入数据库`);
++
++                const client = new Client({
++                  user: username,
++                  host: host,
++                  database: database,
++                  password: password,
++                  port: port,
++                })
++          //变更
++            client.connect();
++
++            const sql = fs.readFileSync(sqlPath).toString();
++
++            await client.query(sql).then(async () => {
++              clearInterval(t);
++              this.coreLogger.info("\x1B[36m [cool:core] midwayjs cool core init " +
++                  module +
++                  " database complete \x1B[0m");
++              fs.writeFileSync(lockPath, `time consuming:${second}s`);
++              })
++              .catch((err) => {
++              clearTimeout(t);
++              this.coreLogger.error("\x1B[36m [cool:core] midwayjs cool core init " +
++                  module +
++                  " database err please manual import \x1B[0m");
++              fs.writeFileSync(lockPath, `time consuming:${second}s`);
++              this.coreLogger.error(err);
++              this.coreLogger.error(`自动初始化模块[${module}]数据库失败,尝试手动导入数据库`);
+             });
++                 
++               
++            // const importer = new Importer({
++            //     host,
++            //     password,
++            //     database,
++            //     charset,
++            //     port,
++            //     user: username,
++            // });
++            // await importer
++            //     .import(sqlPath)
++            //     .then(async () => {
++            //     clearInterval(t);
++            //     this.coreLogger.info("\x1B[36m [cool:core] midwayjs cool core init " +
++            //         module +
++            //         " database complete \x1B[0m");
++            //     fs.writeFileSync(lockPath, `time consuming:${second}s`);
++            // })
++            //     .catch((err) => {
++            //     clearTimeout(t);
++            //     this.coreLogger.error("\x1B[36m [cool:core] midwayjs cool core init " +
++            //         module +
++            //         " database err please manual import \x1B[0m");
++            //     fs.writeFileSync(lockPath, `time consuming:${second}s`);
++            //     this.coreLogger.error(err);
++            //     this.coreLogger.error(`自动初始化模块[${module}]数据库失败,尝试手动导入数据库`);
++            // });
+         }
+     }
+     /**
+diff --git a/node_modules/@cool-midway/core/service/base.js b/node_modules/@cool-midway/core/service/base.js
+index b8ff5cd..d7c6c55 100644
+--- a/node_modules/@cool-midway/core/service/base.js
++++ b/node_modules/@cool-midway/core/service/base.js
+@@ -145,16 +145,23 @@ let BaseService = class BaseService {
+             if (!(await this.paramSafetyCheck(order + sort))) {
+                 throw new validate_1.CoolValidateException("非法传参~");
+             }
+-            sql += ` ORDER BY ${SqlString.escapeId(order)} ${this.checkSort(sort)}`;
++          //变更
++            // sql += ` ORDER BY ${SqlString.escapeId(order)} ${this.checkSort(sort)}`;
++            sql += ` ORDER BY "${order}" ${this.checkSort(sort)}`;
+         }
+         if (isExport && maxExportLimit > 0) {
+-            this.sqlParams.push(parseInt(maxExportLimit));
+-            sql += " LIMIT ? ";
++          //变更
++            // this.sqlParams.push(parseInt(maxExportLimit));
++            // sql += " LIMIT ? ";
++            sql += ` LIMIT ${parseInt(maxExportLimit)}
++             `;
+         }
+         if (!isExport) {
+-            this.sqlParams.push((page - 1) * size);
+-            this.sqlParams.push(parseInt(size));
+-            sql += " LIMIT ?,? ";
++          //变更
++            // this.sqlParams.push((page - 1) * size);
++            // this.sqlParams.push(parseInt(size));
++            // sql += " LIMIT ?,? ";
++            sql += ` LIMIT ${parseInt(size)} OFFSET ${(page - 1) * size} `;
+         }
+         let params = [];
+         params = params.concat(this.sqlParams);
+@@ -362,7 +369,9 @@ let BaseService = class BaseService {
+                     if (order && order == key) {
+                         sort = option.addOrderBy[key].toUpperCase();
+                     }
+-                    find.addOrderBy(SqlString.escapeId(key), this.checkSort(option.addOrderBy[key].toUpperCase()));
++          //变更
++                    // find.addOrderBy(SqlString.escapeId(key), this.checkSort(option.addOrderBy[key].toUpperCase()));
++                    find.addOrderBy('"'+key+'"', this.checkSort(option.addOrderBy[key].toUpperCase()));
+                 }
+             }
+             // 关键字模糊搜索
+@@ -397,10 +406,12 @@ let BaseService = class BaseService {
+                             c[key] = query[key];
+                             const eq = query[key] instanceof Array ? "in" : "=";
+                             if (eq === "in") {
+-                                find.andWhere(`${key} ${eq} (:${key})`, c);
++          //变更
++                                find.andWhere(`"${key}" ${eq} (:${key})`, c);
+                             }
+                             else {
+-                                find.andWhere(`${key} ${eq} :${key}`, c);
++          //变更
++                                find.andWhere(`"${key}" ${eq} :${key}`, c);
+                             }
+                             this.sqlParams.push(query[key]);
+                         }
+@@ -433,7 +444,9 @@ let BaseService = class BaseService {
+                 throw new validate_1.CoolValidateException(global_1.ERRINFO.SORTFIELD);
+             }
+             for (const i in sorts) {
+-                find.addOrderBy(SqlString.escapeId(orders[i]), this.checkSort(sorts[i]));
++          //变更
++                // find.addOrderBy(SqlString.escapeId(orders[i]), this.checkSort(sorts[i]));
++                find.addOrderBy('"'+orders[i]+'"', this.checkSort(sorts[i]));
+             }
+         }
+         if (option === null || option === void 0 ? void 0 : option.extend) {

+ 89 - 0
yxgb-admin-midway/public/css/welcome.css

@@ -0,0 +1,89 @@
+body {
+    display: flex;
+    height: 100vh;
+    justify-content: center;
+    align-items: center;
+    text-align: center;
+    background: #222;
+}
+
+.reveal {
+    position: relative;
+    display: flex;
+    color: #6ee1f5;
+    font-size: 2em;
+    font-family: Raleway, sans-serif;
+    letter-spacing: 3px;
+    text-transform: uppercase;
+    white-space: pre;
+}
+.reveal span {
+    opacity: 0;
+    transform: scale(0);
+    animation: fadeIn 2.4s forwards;
+}
+.reveal::before, .reveal::after {
+    position: absolute;
+    content: "";
+    top: 0;
+    bottom: 0;
+    width: 2px;
+    height: 100%;
+    background: white;
+    opacity: 0;
+    transform: scale(0);
+}
+.reveal::before {
+    left: 50%;
+    animation: slideLeft 1.5s cubic-bezier(0.7, -0.6, 0.3, 1.5) forwards;
+}
+.reveal::after {
+    right: 50%;
+    animation: slideRight 1.5s cubic-bezier(0.7, -0.6, 0.3, 1.5) forwards;
+}
+
+@keyframes fadeIn {
+    to {
+        opacity: 1;
+        transform: scale(1);
+    }
+}
+@keyframes slideLeft {
+    to {
+        left: -6%;
+        opacity: 1;
+        transform: scale(0.9);
+    }
+}
+@keyframes slideRight {
+    to {
+        right: -6%;
+        opacity: 1;
+        transform: scale(0.9);
+    }
+}
+pre {
+      outline: 1px solid #ccc;
+      padding: 5px;
+      margin: 5px;
+    }
+
+    .string {
+      color: green;
+    }
+
+    .number {
+      color: darkorange;
+    }
+
+    .boolean {
+      color: blue;
+    }
+
+    .null {
+      color: magenta;
+    }
+
+    .key {
+      color: red;
+    }

BIN
yxgb-admin-midway/public/favicon.ico


File diff suppressed because it is too large
+ 5 - 0
yxgb-admin-midway/public/js/jquery-2.0.3.min.js


+ 14 - 0
yxgb-admin-midway/public/js/welcome.js

@@ -0,0 +1,14 @@
+const duration = 0.8;
+const delay = 0.3;
+// eslint-disable-next-line no-undef
+const revealText = document.querySelector('.reveal');
+const letters = revealText.textContent.split('');
+revealText.textContent = '';
+const middle = letters.filter(e => e !== ' ').length / 2;
+letters.forEach((letter, i) => {
+  // eslint-disable-next-line no-undef
+  const span = document.createElement('span');
+  span.textContent = letter;
+  span.style.animationDelay = `${delay + Math.abs(i - middle) * 0.1}s`;
+  revealText.append(span);
+});

BIN
yxgb-admin-midway/src/comm/ipipfree.ipdb


+ 67 - 0
yxgb-admin-midway/src/comm/utils.ts

@@ -0,0 +1,67 @@
+import { Inject, Provide } from '@midwayjs/decorator';
+import { Context } from '@midwayjs/koa';
+import * as ipdb from 'ipip-ipdb';
+import * as _ from 'lodash';
+
+/**
+ * 帮助类
+ */
+@Provide()
+export class Utils {
+  @Inject()
+  baseDir;
+
+  /**
+   * 获得请求IP
+   */
+  async getReqIP(ctx: Context) {
+    const req = ctx.req;
+    return (
+      req.headers['x-forwarded-for'] ||
+      req.socket.remoteAddress.replace('::ffff:', '')
+    );
+  }
+
+  /**
+   * 根据IP获得请求地址
+   * @param ip 为空时则为当前请求的IP地址
+   */
+  async getIpAddr(ctx: Context, ip?: string | string[]) {
+    try {
+      if (!ip) {
+        ip = await this.getReqIP(ctx);
+      }
+      const bst = new ipdb.BaseStation(`${this.baseDir}/comm/ipipfree.ipdb`);
+      const result = bst.findInfo(ip, 'CN');
+      const addArr: any = [];
+      if (result) {
+        addArr.push(result.countryName);
+        addArr.push(result.regionName);
+        addArr.push(result.cityName);
+        return _.uniq(addArr).join('');
+      }
+    } catch (err) {
+      return '无法获取地址信息';
+    }
+  }
+
+  /**
+   * 去除对象的空值属性
+   * @param obj
+   */
+  async removeEmptyP(obj) {
+    Object.keys(obj).forEach(key => {
+      if (obj[key] === null || obj[key] === '' || obj[key] === 'undefined') {
+        delete obj[key];
+      }
+    });
+  }
+
+  /**
+   * 线程阻塞毫秒数
+   * @param ms
+   */
+  sleep(ms) {
+    return new Promise(resolve => setTimeout(resolve, ms));
+  }
+}

+ 38 - 0
yxgb-admin-midway/src/config/config.default.ts

@@ -0,0 +1,38 @@
+import { CoolConfig, MODETYPE } from '@cool-midway/core';
+import { MidwayConfig } from '@midwayjs/core';
+import * as fsStore from 'cache-manager-fs-hash';
+
+export default {
+  // use for cookie sign key, should change to your own and keep security
+  keys: 'jt-admin for node',
+  koa: {
+    port: 8089,
+  },
+  // 模板渲染
+  view: {
+    mapping: {
+      '.html': 'ejs',
+    },
+  },
+  // 文件上传
+  upload: {
+    fileSize: '200mb',
+    whitelist: null,
+  },
+  // 缓存 可切换成其他缓存如:redis http://midwayjs.org/docs/extensions/cache
+  cache: {
+    store: fsStore,
+    options: {
+      path: 'cache',
+      ttl: -1,
+    },
+  },
+  cool: {
+    file: {
+      // 上传模式 本地上传或云存储
+      mode: MODETYPE.LOCAL,
+      // 本地上传 文件地址前缀
+      domain: 'http://218.59.194.82:13189',
+    },
+  } as CoolConfig,
+} as MidwayConfig;

+ 44 - 0
yxgb-admin-midway/src/config/config.local.ts

@@ -0,0 +1,44 @@
+import { CoolConfig } from '@cool-midway/core';
+import { MidwayConfig } from '@midwayjs/core';
+
+/**
+ * 本地开发 npm run dev 读取的配置文件
+ */
+export default {
+  typeorm: {
+    dataSource: {
+      default: {
+        // type: 'mysql',
+        type: 'postgres',
+        host: '10.88.77.121',
+        // port: 3306,
+        port: 5432,
+        // username: 'root',
+        // password: 'root',
+        // database: 'jtcrl',
+        username: 'postgres',
+        password: 'postgres!23',
+        database: 'lh_jh',
+        // 自动建表 注意:线上部署的时候不要使用,有可能导致数据丢失
+        synchronize: true,
+        // 打印日志
+        logging: false,
+        // 字符集
+        charset: 'utf8mb4',
+        // 是否开启缓存
+        cache: true,
+        // 实体路径
+        entities: ['**/modules/*/entity'],
+      },
+    },
+  },
+  cool: {
+    // 是否自动导入数据库
+    initDB: true,
+    // crud配置
+    crud: {
+      // 软删除
+      softDelete: true,
+    },
+  } as CoolConfig,
+} as MidwayConfig;

+ 35 - 0
yxgb-admin-midway/src/config/config.prod.ts

@@ -0,0 +1,35 @@
+import { CoolConfig } from '@cool-midway/core';
+import { MidwayConfig } from '@midwayjs/core';
+
+/**
+ * 本地开发 npm run dev 读取的配置文件
+ */
+export default {
+  typeorm: {
+    dataSource: {
+      default: {
+        type: 'postgres',
+        // 不能用127.0.0.1或者localhost
+        host: '10.88.77.121',
+        port: 5432,
+        username: 'postgres',
+        password: 'postgres!23',
+        database: 'lh_jh',
+        // 自动建表 注意:线上部署的时候不要使用,有可能导致数据丢失
+        synchronize: false,
+        // 打印日志
+        logging: false,
+        // 字符集
+        charset: 'utf8mb4',
+        // 是否开启缓存
+        cache: true,
+        // 实体路径
+        entities: ['**/modules/*/entity'],
+      },
+    },
+  },
+  cool: {
+    // 是否自动导入数据库,生产环境不建议开,用本地的数据库手动初始化
+    initDB: false,
+  } as CoolConfig,
+} as MidwayConfig;

+ 67 - 0
yxgb-admin-midway/src/configuration.ts

@@ -0,0 +1,67 @@
+import * as orm from '@midwayjs/typeorm';
+import { Configuration, App } from '@midwayjs/decorator';
+import * as koa from '@midwayjs/koa';
+import * as validate from '@midwayjs/validate';
+import * as info from '@midwayjs/info';
+import { join } from 'path';
+import * as view from '@midwayjs/view-ejs';
+import * as staticFile from '@midwayjs/static-file';
+import * as localTask from '@midwayjs/task';
+import * as crossDomain from '@midwayjs/cross-domain';
+import * as cool from '@cool-midway/core';
+import * as cloud from '@cool-midway/cloud';
+import * as file from '@cool-midway/file';
+// import * as rpc from '@cool-midway/rpc';
+// import * as task from '@cool-midway/task';
+// import * as pay from '@cool-midway/pay';
+// import * as iot from '@cool-midway/iot';
+import * as cache from '@midwayjs/cache';
+// import * as typegoose from '@midwayjs/typegoose';
+import * as swagger from '@midwayjs/swagger';
+
+@Configuration({
+  imports: [
+    // https://koajs.com/
+    koa,
+    // 是否开启跨域(注:顺序不能乱放!!!) http://www.midwayjs.org/docs/extensions/cross_domain
+    crossDomain,
+    // 模板渲染 https://midwayjs.org/docs/extensions/render
+    view,
+    // 静态文件托管 https://midwayjs.org/docs/extensions/static_file
+    staticFile,
+    // orm https://midwayjs.org/docs/extensions/orm
+    orm,
+    // 参数验证 https://midwayjs.org/docs/extensions/validate
+    validate,
+    // 本地任务 http://midwayjs.org/docs/legacy/task
+    localTask,
+    // cool-admin 官方组件 https://cool-js.com
+    cool,
+    // 文件上传 本地 阿里云存储 腾讯云存储 七牛云存储
+    file,
+    // rpc 微服务 远程调用
+    // rpc,
+    // 任务与队列
+    // task,
+    // cool-admin 云开发组件
+    cloud,
+    // 支付(微信、支付宝) https://cool-js.com/admin/node/core/pay.html
+    // pay,
+    // 物联网开发,如MQTT支持等
+    // iot,
+    cache,
+    // typegoose,
+    swagger,
+    {
+      component: info,
+      enabledEnvironment: ['local'],
+    },
+  ],
+  importConfigs: [join(__dirname, './config')],
+})
+export class ContainerLifeCycle {
+  @App()
+  app: koa.Application;
+
+  async onReady() {}
+}

+ 6 - 0
yxgb-admin-midway/src/interface.ts

@@ -0,0 +1,6 @@
+/**
+ * @description User-Service parameters
+ */
+export interface IUserOptions {
+  uid: number;
+}

+ 33 - 0
yxgb-admin-midway/src/modules/base/config.ts

@@ -0,0 +1,33 @@
+import { BaseLogMiddleware } from './middleware/log';
+import { BaseAuthorityMiddleware } from './middleware/authority';
+import { ModuleConfig } from '@cool-midway/core';
+
+/**
+ * 模块的配置
+ */
+export default () => {
+  return {
+    // 模块名称
+    name: '权限管理',
+    // 模块描述
+    description: '基础的权限管理功能,包括登录,权限校验',
+    // 中间件
+    globalMiddlewares: [BaseAuthorityMiddleware, BaseLogMiddleware],
+    // 模块加载顺序,默认为0,值越大越优先加载
+    order: 10,
+    // jwt 生成解密token的
+    jwt: {
+      // 单点登录
+      sso: false,
+      // 注意: 最好重新修改,防止破解
+      secret: 'FOAPOFALOEQIPNNLQ',
+      // token
+      token: {
+        // 2小时过期,需要用刷新token
+        expire: 2 * 3600,
+        // 15天内,如果没操作过就需要重新登录
+        refreshExpire: 24 * 3600 * 15,
+      },
+    },
+  } as ModuleConfig;
+};

+ 82 - 0
yxgb-admin-midway/src/modules/base/controller/admin/comm.ts

@@ -0,0 +1,82 @@
+import { Provide, Inject, Get, Post, Body, ALL } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { BaseSysUserEntity } from '../../entity/sys/user';
+import { BaseSysLoginService } from '../../service/sys/login';
+import { BaseSysPermsService } from '../../service/sys/perms';
+import { BaseSysUserService } from '../../service/sys/user';
+import { Context } from '@midwayjs/koa';
+import { CoolFile } from '@cool-midway/file';
+
+/**
+ * Base 通用接口 一般写不需要权限过滤的接口
+ */
+@Provide()
+@CoolController()
+export class BaseCommController extends BaseController {
+  @Inject()
+  baseSysUserService: BaseSysUserService;
+
+  @Inject()
+  baseSysPermsService: BaseSysPermsService;
+
+  @Inject()
+  baseSysLoginService: BaseSysLoginService;
+
+  @Inject()
+  ctx: Context;
+
+  @Inject()
+  coolFile: CoolFile;
+
+  /**
+   * 获得个人信息
+   */
+  @Get('/person', { summary: '个人信息' })
+  async person() {
+    return this.ok(await this.baseSysUserService.person());
+  }
+
+  /**
+   * 修改个人信息
+   */
+  @Post('/personUpdate', { summary: '修改个人信息' })
+  async personUpdate(@Body(ALL) user: BaseSysUserEntity) {
+    await this.baseSysUserService.personUpdate(user);
+    return this.ok();
+  }
+
+  /**
+   * 权限菜单
+   */
+  @Get('/permmenu', { summary: '权限与菜单' })
+  async permmenu() {
+    return this.ok(
+      await this.baseSysPermsService.permmenu(this.ctx.admin.roleIds)
+    );
+  }
+
+  /**
+   * 文件上传
+   */
+  @Post('/upload', { summary: '文件上传' })
+  async upload() {
+    return this.ok(await this.coolFile.upload(this.ctx));
+  }
+
+  /**
+   * 文件上传模式,本地或者云存储
+   */
+  @Get('/uploadMode', { summary: '文件上传模式' })
+  async uploadMode() {
+    return this.ok(await this.coolFile.getMode());
+  }
+
+  /**
+   * 退出
+   */
+  @Post('/logout', { summary: '退出' })
+  async logout() {
+    await this.baseSysLoginService.logout();
+    return this.ok();
+  }
+}

+ 404 - 0
yxgb-admin-midway/src/modules/base/controller/admin/jtcomm.ts

@@ -0,0 +1,404 @@
+import {
+  Provide,
+  Inject,
+  Controller,
+  Get,
+  Post,
+  Query,
+  Body,
+} from '@midwayjs/decorator';
+import { DataService } from '../../service/data.service';
+import { tileService } from '../../service/3dtile.service';
+import { mbTileService } from '../../service/mbtile.service';
+import { DataMongoService } from '../../service/data-mongo.service';
+import { Context } from '@midwayjs/koa';
+import * as geojson from 'geojson';
+import { ApiOperation } from '@midwayjs/swagger';
+
+@Provide()
+@Controller('/')
+export class BaseJtCommController {
+  @Inject()
+  dataService: DataService;
+  @Inject()
+  dataMongoService: DataMongoService;
+  @Inject()
+  tileService: tileService;
+  @Inject()
+  mbTileService: mbTileService;
+  @Inject()
+  ctx: Context;
+
+  @Get('/')
+  public async welcome() {
+    await this.ctx.render('welcome', {
+      text: '技术改变未来,欢迎您!!!',
+    });
+  }
+  /**
+   * 接口界面
+   */
+  @Get('/test')
+  public async test() {
+    await this.ctx.render('testview');
+  }
+
+  /**
+   * 基本查询
+   * @param tableName 表名
+   * @param sqlWhere 查询条件
+   * @param orderByField 排序字段
+   * @returns 查询内容
+   */
+  @ApiOperation({ summary: '基础查询' })
+  @Get('/getTableList')
+  async home(
+    @Query('tableName') tableName: string,
+    @Query('sqlWhere') sqlWhere: string,
+    @Query('orderByField') orderByField: string
+  ) {
+    try {
+      const key = '0l23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+      tableName = this.formCode(tableName, key);
+      const tableField = await this.dataService.getField(tableName);
+      let fields = '';
+      let result = '';
+      let message = '';
+      if (tableField.length > 0) {
+        fields = JSON.parse(JSON.stringify(tableField));
+        message = 'OK';
+        result = await this.dataService.getList(
+          tableName,
+          this.formCode(sqlWhere, key),
+          this.formCode(orderByField, key)
+        );
+        if (result.length > 0) {
+          return {
+            success: true,
+            message: message,
+            table: fields,
+            data: result,
+          };
+        } else {
+          return {
+            success: false,
+            message: '无数据获取',
+            table: fields,
+            data: result,
+          };
+        }
+      } else {
+        return {
+          success: false,
+          message: '查询失败,失败原因是没有对' + tableName + '进行配置',
+          table: fields,
+          data: result,
+        };
+      }
+    } catch (error) {
+      return { success: false, message: error };
+    }
+  }
+
+  formCode(str, key) {
+    //定义密钥,36个字母和数字
+    let l = key.length; //获取密钥的长度
+    let b,
+      bl,
+      b2,
+      b3,
+      d = 0,
+      s; //定义临时变量
+    s = new Array(Math.floor(str.length / 3)); //计算加密字符串包含的字符数,并定义数组
+    b = s.length; //获取数组的长度
+    for (let i = 0; i < b; i++) {
+      //以数组的长度循环次数,遍历加密字符串
+      bl = key.indexOf(str.charAt(d)); //截取周期内第一个字符串,计算在密钥中的下标值
+      d++;
+      b2 = key.indexOf(str.charAt(d)); //截取周期内第二个字符串,计算在密钥中的下标值
+      d++;
+      b3 = key.indexOf(str.charAt(d)); //截取周期内第三个字符串,计算在密钥中的下标值
+      d++;
+      s[i] = bl * l * l + b2 * l + b3; //利用下标值,反推被加密字符的Unicode编码值
+    }
+    b = eval('String.fromCharCode(' + s.join(',') + ')'); //用fromCharCode()算出字符串
+    return b; //返回被解密的字符串
+  }
+
+  /**
+   * 空间查询
+   * @param tableName 表名
+   * @param sqlWhere 查询条件
+   * @param orderByField 排序字段
+   * @returns 查询内容
+   */
+  @ApiOperation({ summary: '空间查询' })
+  @Get('/getGeoJson')
+  async getGeoJson(
+    @Query('tableName') tableName: string,
+    @Query('sqlWhere') sqlWhere: string,
+    @Query('orderByField') orderByField: string
+  ) {
+    try {
+      const key = '0l23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+      tableName = this.formCode(tableName, key);
+      const tableField = await this.dataService.getField(tableName);
+
+      let fields = '';
+      let geoResult = '';
+      let message = '';
+      if (tableField.length > 0) {
+        fields = JSON.parse(JSON.stringify(tableField));
+        message = 'OK';
+        const result = await this.dataService.getGeoList(
+          tableName,
+          this.formCode(sqlWhere, key),
+          this.formCode(orderByField, key)
+        );
+        geoResult = geojson.parse(result, { GeoJSON: 'geom' });
+      } else {
+        message = '查询失败,失败原因是没有对' + tableName + '进行配置';
+      }
+
+      return {
+        success: true,
+        message: message,
+        table: fields,
+        data: geoResult,
+      };
+    } catch (error) {
+      return { success: false, message: error };
+    }
+  }
+
+  /**
+   * 新增或修改
+   * @param tableName 表名
+   * @param keyValue 主键值
+   * @param formData 新增或修改内容
+   * @returns 更新信息
+   */
+  @ApiOperation({ summary: '新增或修改' })
+  @Post('/postSubmit')
+  async formSubmit(
+    @Body('tableName') tableName: string,
+    @Body('keyValue') keyValue: string,
+    @Body('formData') formData: object
+  ) {
+    try {
+      const key = '0l23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+      tableName = this.formCode(tableName, key);
+      // formData = this.formCode(formData, key);
+      const result = await this.dataService.addOrUpdateComm(
+        tableName,
+        keyValue,
+        formData
+        // files[0]
+      );
+
+      return {
+        success: true,
+        message: 'OK',
+        rowCount: result,
+      };
+    } catch (error) {
+      return { success: false, message: error };
+    }
+  }
+
+  /**
+   * 删除
+   * @param tableName 表名
+   * @param keyValue 主键值
+   * @returns 更新信息
+   */
+  @ApiOperation({ summary: '删除' })
+  @Get('/delete')
+  async formDelete(
+    @Query('tableName') tableName: string,
+    @Query('keyValue') keyValue: string
+  ) {
+    try {
+      const key = '0l23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+      tableName = this.formCode(tableName, key);
+      const result = await this.dataService.deleteComm(tableName, keyValue);
+
+      return {
+        success: true,
+        message: 'OK',
+        rowCount: result,
+      };
+    } catch (error) {
+      return { success: false, message: error };
+    }
+  }
+
+  /**
+   * 缓冲区空间查询
+   * @param tableName 表名
+   * @param spatialType 空间类型
+   * @param coordinate 坐标
+   * @param buffer 缓冲区
+   * @returns 空间信息
+   */
+  @ApiOperation({ summary: '缓冲区空间查询' })
+  @Get('/getSpatialQuery')
+  async spatialQuery(
+    @Query('tableName') tableName: string,
+    @Query('spatialType') spatialType: string,
+    @Query('coordinate') coordinate: string,
+    @Query('buffer') buffer: string,
+    @Query('sqlWhere') sqlWhere: string
+  ) {
+    try {
+      const key = '0l23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+      tableName = this.formCode(tableName, key);
+      sqlWhere = this.formCode(sqlWhere, key);
+      const tableField = await this.dataService.getField(tableName);
+
+      const fields = JSON.parse(JSON.stringify(tableField));
+
+      const result = await this.dataService.getSpatialList(
+        tableName,
+        spatialType,
+        coordinate,
+        buffer,
+        sqlWhere
+      );
+
+      const geoResult = geojson.parse(result, { GeoJSON: 'geom' });
+
+      return {
+        success: true,
+        message: 'OK',
+        table: fields,
+        data: geoResult,
+      };
+    } catch (error) {
+      return { success: false, message: error };
+    }
+  }
+  /**
+   * 3dTiles查询
+   * @returns 查询内容
+   */
+  @ApiOperation({ summary: '3dTiles查询' })
+  @Get('/get3dTiles/*')
+  async get3dTiles() {
+    try {
+      this.ctx.set('Content-Type', 'text/html; charset=UTF-8');
+      this.ctx.set('Vary', 'Accept-Encoding');
+      const d3tileUrl = this.ctx.URL;
+      const result = await this.tileService.get3dTiles(d3tileUrl);
+
+      return result;
+    } catch (error) {
+      return error;
+    }
+  }
+  /**
+   * mbTiles查询
+   * @returns 查询内容
+   */
+  @ApiOperation({ summary: 'mbTiles查询' })
+  @Get('/getMbTiles/:tiles/:z/:x/:y.png')
+  async getMbTiles() {
+    try {
+      this.ctx.set('Content-Type', 'image/png');
+      // this.ctx.set('Vary', 'Accept-Encoding');
+      const mbTileUrl = this.ctx.params;
+      const result = await this.mbTileService.getMbTiles(
+        mbTileUrl.tiles,
+        mbTileUrl.z,
+        mbTileUrl.x,
+        mbTileUrl.y
+      );
+
+      return result;
+    } catch (error) {
+      return error;
+    }
+  }
+  /**
+   * 管线分段
+   * @param tableName 表名
+   * @param pipeLineName 管线名称
+   * @param points 段数
+   * @returns 空间信息
+   */
+  @ApiOperation({ summary: '管线分段' })
+  @Post('/getLineInterpolatePoints')
+  async lineInterpolatePoints(
+    @Body('tableName') tableName: string,
+    @Body('name') name: object,
+    @Body('type') type: string,
+    @Body('number') number: number
+  ) {
+    try {
+      const key = '0l23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+      tableName = this.formCode(tableName, key);
+      const tableField = await this.dataService.getField(tableName);
+
+      const fields = JSON.parse(JSON.stringify(tableField));
+
+      const result = await this.dataService.getLineInterpolatePoints(
+        tableName,
+        name,
+        type,
+        number
+      );
+
+      const geoResult = geojson.parse(result, { GeoJSON: 'geom' });
+
+      return {
+        success: true,
+        message: 'OK',
+        table: fields,
+        data: geoResult,
+      };
+    } catch (error) {
+      return { success: false, message: error };
+    }
+  }
+  /**
+   * 管线两点间距离
+   * @param tableName 表名
+   * @param name 查询名
+   * @param points 点坐标
+   * @returns
+   */
+  @ApiOperation({ summary: '管线两点间距离' })
+  @Post('/getLineDistance')
+  async lineDistance(
+    @Body('tableName') tableName: string,
+    @Body('name') name: object,
+    @Body('point_one') point_one: string,
+    @Body('point_two') point_two: string
+  ) {
+    try {
+      const key = '0l23456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+      tableName = this.formCode(tableName, key);
+      const tableField = await this.dataService.getField(tableName);
+
+      const fields = JSON.parse(JSON.stringify(tableField));
+
+      const result = await this.dataService.getLineDistance(
+        tableName,
+        name,
+        point_one,
+        point_two
+      );
+
+      const geoResult = geojson.parse(result, { GeoJSON: 'geom' });
+
+      return {
+        success: true,
+        message: 'OK',
+        table: fields,
+        data: geoResult,
+      };
+    } catch (error) {
+      return { success: false, message: error };
+    }
+  }
+}

+ 73 - 0
yxgb-admin-midway/src/modules/base/controller/admin/open.ts

@@ -0,0 +1,73 @@
+import { Provide, Body, Inject, Post, Get, Query } from '@midwayjs/decorator';
+import { CoolController, BaseController, CoolEps } from '@cool-midway/core';
+import { LoginDTO } from '../../dto/login';
+import { BaseSysLoginService } from '../../service/sys/login';
+import { BaseSysParamService } from '../../service/sys/param';
+import { Context } from '@midwayjs/koa';
+import { Validate } from '@midwayjs/validate';
+
+/**
+ * 不需要登录的后台接口
+ */
+@Provide()
+@CoolController()
+export class BaseOpenController extends BaseController {
+  @Inject()
+  baseSysLoginService: BaseSysLoginService;
+
+  @Inject()
+  baseSysParamService: BaseSysParamService;
+
+  @Inject()
+  ctx: Context;
+
+  @Inject()
+  eps: CoolEps;
+
+  /**
+   * 实体信息与路径
+   * @returns
+   */
+  @Get('/eps', { summary: '实体信息与路径' })
+  public async getEps() {
+    return this.ok(this.eps.admin);
+  }
+
+  /**
+   * 根据配置参数key获得网页内容(富文本)
+   */
+  @Get('/html', { summary: '获得网页内容的参数值' })
+  async htmlByKey(@Query('key') key: string) {
+    this.ctx.body = await this.baseSysParamService.htmlByKey(key);
+  }
+
+  /**
+   * 登录
+   * @param login
+   */
+  @Post('/login', { summary: '登录' })
+  @Validate()
+  async login(@Body() login: LoginDTO) {
+    return this.ok(await this.baseSysLoginService.login(login));
+  }
+
+  /**
+   * 获得验证码
+   */
+  @Get('/captcha', { summary: '验证码' })
+  async captcha(
+    @Query('type') type: string,
+    @Query('width') width: number,
+    @Query('height') height: number
+  ) {
+    return this.ok(await this.baseSysLoginService.captcha(type, width, height));
+  }
+
+  /**
+   * 刷新token
+   */
+  @Get('/refreshToken', { summary: '刷新token' })
+  async refreshToken(@Query('refreshToken') refreshToken: string) {
+    return this.ok(await this.baseSysLoginService.refreshToken(refreshToken));
+  }
+}

+ 13 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/angle.ts

@@ -0,0 +1,13 @@
+import { Provide } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { BaseSysAngleEntity } from '../../../entity/sys/angle';
+
+/**
+ * 图集
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: BaseSysAngleEntity,
+})
+export class BaseSysAngleController extends BaseController {}

+ 30 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/atlas.ts

@@ -0,0 +1,30 @@
+import { Provide, Get, Inject, Query } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { BaseSysAtlasEntity } from '../../../entity/sys/atlas';
+import { BaseSysAtlasService } from '../../../service/sys/atlas';
+
+/**
+ * 图集
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: BaseSysAtlasEntity,
+  service: BaseSysAtlasService,
+})
+export class BaseSysAtlasController extends BaseController {
+  @Inject()
+  baseSysAtlasService: BaseSysAtlasService;
+
+  @Get('/distinctList', { summary: '去重列表' })
+  async distinctList() {
+    const list = await this.baseSysAtlasService.distinctList();
+    return this.ok(list);
+  }
+
+  @Get('/layerList', { summary: '编辑列表' })
+  public async layerList(@Query('idd') idd: string) {
+    const list = await this.baseSysAtlasService.layerList(idd);
+    return this.ok(list);
+  }
+}

+ 26 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/datafield.ts

@@ -0,0 +1,26 @@
+import { Provide, Inject, Get, Query } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { DataFieldEntity } from '../../../entity/sys/data_field';
+import { BaseSysFieldService } from '../../../service/sys/datafield';
+
+/**
+ * 图集
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: DataFieldEntity,
+  service: BaseSysFieldService,
+})
+export class BaseSysFieldController extends BaseController {
+  @Inject()
+  baseSysFieldService: BaseSysFieldService;
+
+  /**
+   * 获取
+   */
+  @Get('/disList', { summary: '获取' })
+  async disList(@Query('tableId') tableId: number) {
+    return await this.baseSysFieldService.disList(tableId);
+  }
+}

+ 26 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/datafields.ts

@@ -0,0 +1,26 @@
+import { Provide, Inject, Get, Query } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { DataFieldEntity } from '../../../entity/sys/data_field';
+import { BaseSysFieldsService } from '../../../service/sys/datafields';
+
+/**
+ * 图集
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: DataFieldEntity,
+  service: BaseSysFieldsService,
+})
+export class BaseSysFieldsController extends BaseController {
+  @Inject()
+  baseSysFieldsService: BaseSysFieldsService;
+
+  /**
+   * 获取
+   */
+  @Get('/disList', { summary: '获取' })
+  async disList(@Query('tableId') tableId: number) {
+    return await this.baseSysFieldsService.disList(tableId);
+  }
+}

+ 13 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/datasource.ts

@@ -0,0 +1,13 @@
+import { Provide } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { DataSourceEntity } from '../../../entity/sys/data_source';
+
+/**
+ * 图集
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: DataSourceEntity,
+})
+export class BaseSysSourceController extends BaseController {}

+ 15 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/datatable.ts

@@ -0,0 +1,15 @@
+import { Provide } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { DataTableEntity } from '../../../entity/sys/data_table';
+import { BaseSysTableService } from '../../../service/sys/datatable';
+
+/**
+ * 图集
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: DataTableEntity,
+  service: BaseSysTableService,
+})
+export class BaseSysTableController extends BaseController {}

+ 27 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/department.ts

@@ -0,0 +1,27 @@
+import { ALL, Body, Inject, Post, Provide } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { BaseSysDepartmentEntity } from '../../../entity/sys/department';
+import { BaseSysDepartmentService } from '../../../service/sys/department';
+
+/**
+ * 部门
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'list'],
+  entity: BaseSysDepartmentEntity,
+  service: BaseSysDepartmentService,
+})
+export class BaseDepartmentController extends BaseController {
+  @Inject()
+  baseDepartmentService: BaseSysDepartmentService;
+
+  /**
+   * 部门排序
+   */
+  @Post('/order', { summary: '排序' })
+  async order(@Body(ALL) params: any) {
+    await this.baseDepartmentService.order(params);
+    return this.ok();
+  }
+}

+ 29 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/layers.ts

@@ -0,0 +1,29 @@
+import { Provide, Inject, Get, Query } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { BaseSysLayersService } from '../../../service/sys/layers';
+import { BaseSysLayersEntity } from '../../../entity/sys/layers';
+
+/**
+ * 图层
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: BaseSysLayersEntity,
+  service: BaseSysLayersService,
+})
+export class BaseSysLayersController extends BaseController {
+  @Inject()
+  baseSysLayersService: BaseSysLayersService;
+
+  @Get('/getMaxOrderNum', { summary: '获取ordernum' })
+  async getMaxOrderNum() {
+    const list = await this.baseSysLayersService.getMaxOrderNum();
+    return this.ok(list);
+  }
+  @Get('/getMaxLayerOrder', { summary: '获取layerorder' })
+  async getMaxLayerOrder(@Query('layerCode') layerCode: string) {
+    const list = await this.baseSysLayersService.getMaxLayerOrder(layerCode);
+    return this.ok(list);
+  }
+}

+ 64 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/log.ts

@@ -0,0 +1,64 @@
+import { Provide, Post, Inject, Body, Get } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { BaseSysLogEntity } from '../../../entity/sys/log';
+import { BaseSysUserEntity } from '../../../entity/sys/user';
+import { BaseSysConfService } from '../../../service/sys/conf';
+import { BaseSysLogService } from '../../../service/sys/log';
+
+/**
+ * 系统日志
+ */
+@Provide()
+@CoolController({
+  api: ['page'],
+  entity: BaseSysLogEntity,
+  urlTag: {
+    name: 'a',
+    url: ['add'],
+  },
+  pageQueryOp: {
+    keyWordLikeFields: ['b.name', 'a.params', 'a.ipAddr'],
+    select: ['a.*', 'b.name'],
+    join: [
+      {
+        entity: BaseSysUserEntity,
+        alias: 'b',
+        condition: 'a.userId = b.id',
+        type: 'leftJoin',
+      },
+    ],
+  },
+})
+export class BaseSysLogController extends BaseController {
+  @Inject()
+  baseSysLogService: BaseSysLogService;
+
+  @Inject()
+  baseSysConfService: BaseSysConfService;
+
+  /**
+   * 清空日志
+   */
+  @Post('/clear', { summary: '清理' })
+  public async clear() {
+    await this.baseSysLogService.clear(true);
+    return this.ok();
+  }
+
+  /**
+   * 设置日志保存时间
+   */
+  @Post('/setKeep', { summary: '日志保存时间' })
+  public async setKeep(@Body('value') value: number) {
+    await this.baseSysConfService.updateVaule('logKeep', value);
+    return this.ok();
+  }
+
+  /**
+   * 获得日志保存时间
+   */
+  @Get('/getKeep', { summary: '获得日志保存时间' })
+  public async getKeep() {
+    return this.ok(await this.baseSysConfService.getValue('logKeep'));
+  }
+}

+ 35 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/menu.ts

@@ -0,0 +1,35 @@
+import { Body, Inject, Post, Provide } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { BaseSysMenuEntity } from '../../../entity/sys/menu';
+import { BaseSysMenuService } from '../../../service/sys/menu';
+
+/**
+ * 菜单
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: BaseSysMenuEntity,
+  service: BaseSysMenuService,
+})
+export class BaseSysMenuController extends BaseController {
+  @Inject()
+  baseSysMenuService: BaseSysMenuService;
+
+  @Post('/parse', { summary: '解析' })
+  async parse(
+    @Body('entity') entity: string,
+    @Body('controller') controller: string,
+    @Body('module') module: string
+  ) {
+    return this.ok(
+      await this.baseSysMenuService.parse(entity, controller, module)
+    );
+  }
+
+  @Post('/create', { summary: '创建代码' })
+  async create(@Body() body) {
+    await this.baseSysMenuService.create(body);
+    return this.ok();
+  }
+}

+ 32 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/param.ts

@@ -0,0 +1,32 @@
+import { Get, Inject, Provide, Query } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { BaseSysParamEntity } from '../../../entity/sys/param';
+import { BaseSysParamService } from '../../../service/sys/param';
+import { Context } from '@midwayjs/koa';
+
+/**
+ * 参数配置
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'page'],
+  entity: BaseSysParamEntity,
+  pageQueryOp: {
+    keyWordLikeFields: ['name', 'keyName'],
+  },
+})
+export class BaseSysParamController extends BaseController {
+  @Inject()
+  baseSysParamService: BaseSysParamService;
+
+  @Inject()
+  ctx: Context;
+
+  /**
+   * 根据配置参数key获得网页内容(富文本)
+   */
+  @Get('/html', { summary: '获得网页内容的参数值' })
+  async htmlByKey(@Query('key') key: string) {
+    this.ctx.body = await this.baseSysParamService.htmlByKey(key);
+  }
+}

+ 38 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/role.ts

@@ -0,0 +1,38 @@
+import { Provide } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { Context } from 'vm';
+import { BaseSysRoleEntity } from '../../../entity/sys/role';
+import { BaseSysRoleService } from '../../../service/sys/role';
+
+/**
+ * 系统角色
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: BaseSysRoleEntity,
+  service: BaseSysRoleService,
+  // 新增的时候插入当前用户ID
+  insertParam: async (ctx: Context) => {
+    return {
+      userId: ctx.admin.userId,
+    };
+  },
+  pageQueryOp: {
+    keyWordLikeFields: ['name', 'label'],
+    where: async (ctx: Context) => {
+      const { userId, roleIds, role } = ctx.admin;
+      return [
+        // 超级管理员的角色不展示
+        ['label != :label', { label: 'admin' }],
+        // 如果不是超管,只能看到自己新建的或者自己有的角色
+        [
+          '("userId"=:userId or id = ANY (:roleIds))',
+          { userId, roleIds },
+          role !== 'admin',
+        ],
+      ];
+    },
+  },
+})
+export class BaseSysRoleController extends BaseController {}

+ 11 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/tool.ts

@@ -0,0 +1,11 @@
+import { CoolController, BaseController } from '@cool-midway/core';
+import { BaseSysToolEntity } from '../../../entity/sys/tool';
+
+/**
+ * 工具模块-工具
+ */
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: BaseSysToolEntity,
+})
+export class BaseSysToolController extends BaseController {}

+ 30 - 0
yxgb-admin-midway/src/modules/base/controller/admin/sys/user.ts

@@ -0,0 +1,30 @@
+import { Body, Inject, Post, Provide } from '@midwayjs/decorator';
+import { CoolController, BaseController } from '@cool-midway/core';
+import { BaseSysUserEntity } from '../../../entity/sys/user';
+import { BaseSysUserService } from '../../../service/sys/user';
+
+/**
+ * 系统用户
+ */
+@Provide()
+@CoolController({
+  api: ['add', 'delete', 'update', 'info', 'list', 'page'],
+  entity: BaseSysUserEntity,
+  service: BaseSysUserService,
+})
+export class BaseSysUserController extends BaseController {
+  @Inject()
+  baseSysUserService: BaseSysUserService;
+
+  /**
+   * 移动部门
+   */
+  @Post('/move', { summary: '移动部门' })
+  async move(
+    @Body('departmentId') departmentId: number,
+    @Body('userIds') userIds: []
+  ) {
+    await this.baseSysUserService.move(departmentId, userIds);
+    return this.ok();
+  }
+}

+ 1 - 0
yxgb-admin-midway/src/modules/base/controller/app/README.md

@@ -0,0 +1 @@
+这里写对外的api接口

+ 45 - 0
yxgb-admin-midway/src/modules/base/controller/app/comm.ts

@@ -0,0 +1,45 @@
+import { Provide, Inject, Get, Post } from '@midwayjs/decorator';
+import { CoolController, BaseController, CoolEps } from '@cool-midway/core';
+import { Context } from '@midwayjs/koa';
+import { CoolFile } from '@cool-midway/file';
+
+/**
+ * 不需要登录的后台接口
+ */
+@Provide()
+@CoolController()
+export class BaseAppCommController extends BaseController {
+  @Inject()
+  coolFile: CoolFile;
+
+  @Inject()
+  ctx: Context;
+
+  @Inject()
+  eps: CoolEps;
+
+  /**
+   * 实体信息与路径
+   * @returns
+   */
+  @Get('/eps', { summary: '实体信息与路径' })
+  public async getEps() {
+    return this.ok(this.eps.app);
+  }
+
+  /**
+   * 文件上传
+   */
+  @Post('/upload', { summary: '文件上传' })
+  async upload() {
+    return this.ok(await this.coolFile.upload(this.ctx));
+  }
+
+  /**
+   * 文件上传模式,本地或者云存储
+   */
+  @Get('/uploadMode', { summary: '文件上传模式' })
+  async uploadMode() {
+    return this.ok(await this.coolFile.getMode());
+  }
+}

+ 16 - 0
yxgb-admin-midway/src/modules/base/dto/login.ts

@@ -0,0 +1,16 @@
+import { Rule, RuleType } from '@midwayjs/validate';
+import { ApiProperty } from '@midwayjs/swagger';
+/**
+ * 登录参数校验
+ */
+export class LoginDTO {
+  // 用户名
+  @Rule(RuleType.string().required())
+  @ApiProperty({ example: 'admin', description: 'The name of the username' })
+  username: string;
+
+  // 密码
+  @Rule(RuleType.string().required())
+  @ApiProperty({ example: '123456', description: 'The name of the password' })
+  password: string;
+}

+ 36 - 0
yxgb-admin-midway/src/modules/base/entity/sys/angle.ts

@@ -0,0 +1,36 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Index, Entity } from 'typeorm';
+
+/**
+ * 视角标签
+ */
+@Entity('map_angle')
+export class BaseSysAngleEntity extends BaseEntity {
+  @Index()
+  @Column({ comment: '视角标签名称', length: 50 })
+  name: string;
+
+  @Column({ comment: '经度' })
+  x: string;
+
+  @Column({ comment: '纬度' })
+  y: string;
+
+  @Column({ comment: '高度' })
+  z: string;
+
+  @Column({ comment: '偏航角' })
+  heading: string;
+
+  @Column({ comment: '俯仰角' })
+  pitch: string;
+
+  @Column({ comment: '翻转角' })
+  roll: string;
+
+  @Column({ comment: '位置截图', type: 'text' })
+  screenshot: string;
+
+  @Column({ comment: '创建人', length: 50 })
+  userId: string;
+}

+ 45 - 0
yxgb-admin-midway/src/modules/base/entity/sys/atlas.ts

@@ -0,0 +1,45 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Index, Entity } from 'typeorm';
+
+/**
+ * 图集
+ */
+@Entity('map_atlas')
+export class BaseSysAtlasEntity extends BaseEntity {
+  @Index()
+  @Column({ comment: '图集名称', length: 50 })
+  atlasName: string;
+
+  @Column({ comment: '图集类型', length: 10 })
+  atlasType: string;
+
+  @Column({ comment: '图集Id' })
+  atlasId: string;
+
+  @Column({ comment: '图层Id', nullable: true })
+  layerId: number;
+
+  // @Column({ comment: '是否默认加载', nullable: true, length: 1 })
+  isInit: string;
+
+  // @Column({ comment: '是否默认展开', nullable: true, length: 1 })
+  isExpand: string;
+
+  // @Column({ comment: '是否隐藏本节点', nullable: true, length: 1 })
+  isHide: string;
+
+  // @Column({ comment: '是否隐藏子节点', nullable: true, length: 1 })
+  isHideChild: string;
+
+  // @Column({ comment: '是否进行框选', nullable: true })
+  isCheck: number;
+
+  @Column({ comment: '透明度', nullable: true, type: 'decimal' })
+  opacity: number;
+
+  @Column({ comment: '排序', default: 0 })
+  orderNum: number;
+
+  @Column({ comment: '树节点', length: 10 })
+  treeNode: string;
+}

+ 15 - 0
yxgb-admin-midway/src/modules/base/entity/sys/conf.ts

@@ -0,0 +1,15 @@
+import { Column, Index, Entity } from 'typeorm';
+import { BaseEntity } from '@cool-midway/core';
+
+/**
+ * 系统配置
+ */
+@Entity('base_sys_conf')
+export class BaseSysConfEntity extends BaseEntity {
+  @Index({ unique: true })
+  @Column({ comment: '配置键' })
+  cKey: string;
+
+  @Column({ comment: '配置值' })
+  cValue: string;
+}

+ 32 - 0
yxgb-admin-midway/src/modules/base/entity/sys/data_field.ts

@@ -0,0 +1,32 @@
+import { Entity, Column } from 'typeorm';
+import { BaseEntity } from '@cool-midway/core';
+
+@Entity('config_data_field')
+export class DataFieldEntity extends BaseEntity {
+  @Column({ comment: '字段名称' })
+  name: string;
+
+  @Column({ comment: '字段描述' })
+  description: string;
+
+  @Column({
+    comment: '字段类型 0:字符 1:日期 2:数值 3:空间数据',
+    default: 0,
+  })
+  type: number;
+
+  @Column({ comment: '字段长度', nullable: true })
+  length: number;
+
+  @Column({ comment: '字段单位', nullable: true })
+  unit: string;
+
+  @Column({ comment: '是否显示 0:否 1:是', default: 1 })
+  isDisplay: number;
+
+  @Column({ comment: '排序', nullable: true })
+  sortCode: number;
+
+  @Column({ comment: '表ID', type: 'int', nullable: true })
+  tableId: number;
+}

+ 32 - 0
yxgb-admin-midway/src/modules/base/entity/sys/data_source.ts

@@ -0,0 +1,32 @@
+import { Entity, Column } from 'typeorm';
+import { BaseEntity } from '@cool-midway/core';
+
+@Entity('config_data_source')
+export class DataSourceEntity extends BaseEntity {
+  @Column({ comment: '数据源名' })
+  name: string;
+
+  @Column({ comment: 'IP地址', length: 20, nullable: true })
+  host: string;
+
+  @Column({ comment: '端口', length: 5, nullable: true })
+  port: string;
+
+  @Column({ comment: '用户名', nullable: true })
+  user: string;
+
+  @Column({ comment: '密码', nullable: true })
+  password: string;
+
+  @Column({ comment: '数据库(实例)名(地址)' })
+  database: string;
+
+  @Column({
+    comment: '数据库类型 0:oracle 1:pgsql 2:mysql 3:sqlite',
+    default: 0,
+  })
+  type: number;
+
+  @Column({ comment: '备注', nullable: true })
+  remark: string;
+}

+ 8 - 0
yxgb-admin-midway/src/modules/base/entity/sys/data_source_mongo.ts

@@ -0,0 +1,8 @@
+// import { prop } from '@typegoose/typegoose';
+
+export class DataSourceMongoEntity {
+  // @prop()
+  // public name?: string;
+  // @prop({ type: () => [String] })
+  // public jobs?: string[];
+}

+ 14 - 0
yxgb-admin-midway/src/modules/base/entity/sys/data_table.ts

@@ -0,0 +1,14 @@
+import { Entity, Column } from 'typeorm';
+import { BaseEntity } from '@cool-midway/core';
+
+@Entity('config_data_table')
+export class DataTableEntity extends BaseEntity {
+  @Column({ comment: '表名称' })
+  name: string;
+
+  @Column({ comment: '表描述' })
+  description: string;
+
+  @Column({ comment: '数据源ID', type: 'int', nullable: true })
+  sourceId: number;
+}

+ 19 - 0
yxgb-admin-midway/src/modules/base/entity/sys/department.ts

@@ -0,0 +1,19 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Entity } from 'typeorm';
+
+/**
+ * 部门
+ */
+@Entity('base_sys_department')
+export class BaseSysDepartmentEntity extends BaseEntity {
+  @Column({ comment: '部门名称' })
+  name: string;
+
+  @Column({ comment: '上级部门ID', type: 'int', nullable: true })
+  parentId: number;
+
+  @Column({ comment: '排序', default: 0 })
+  orderNum: number;
+  // 父菜单名称
+  parentName: string;
+}

+ 62 - 0
yxgb-admin-midway/src/modules/base/entity/sys/layers.ts

@@ -0,0 +1,62 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Index, Entity } from 'typeorm';
+
+/**
+ * 图层
+ */
+@Entity('map_layers')
+export class BaseSysLayersEntity extends BaseEntity {
+  @Column({ comment: '父Id', nullable: true })
+  parentId: number;
+
+  @Index()
+  @Column({ comment: '图层描述', length: 50 })
+  layerName: string;
+
+  @Column({ comment: '图层类型', length: 50, nullable: true })
+  layerType: string;
+
+  @Column({ comment: '图层顺序', nullable: true })
+  layerOrder: number;
+
+  @Column({ comment: '排序' })
+  orderNum: number;
+
+  @Column({ comment: '图层类型编码', length: 50, nullable: true })
+  layerCode: string;
+
+  @Column({ comment: '数据源', length: 1000 })
+  dataSource: string;
+
+  @Column({ comment: '过滤条件', nullable: true, length: 100 })
+  filterConditions: string;
+
+  @Column({ comment: '参数集', nullable: true, type: 'json' })
+  parameterSet: string;
+
+  @Column({ comment: '加载接口类型', nullable: true, length: 50 })
+  loadType: string;
+
+  @Column({ comment: '样式图片', nullable: true, length: 100 })
+  imageUrl: string;
+
+  // @Column({ comment: '是否支持地图查询', nullable: true, length: 1 })
+  mapQuery: string;
+
+  querySetLi: string;
+
+  @Column({ comment: '查询源', nullable: true, type: 'json' })
+  querySet: string;
+
+  // @Column({ comment: '展示字段', nullable: true, length: 50 })
+  displayField: string;
+
+  // @Column({ comment: '查询字段', nullable: true, length: 50 })
+  queryField: string;
+  queryFilter: string;
+
+  @Column({ comment: '查询提示信息', nullable: true, length: 50 })
+  promptInfo: string;
+
+  isCheck: number;
+}

+ 27 - 0
yxgb-admin-midway/src/modules/base/entity/sys/log.ts

@@ -0,0 +1,27 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Index, Entity } from 'typeorm';
+
+/**
+ * 系统日志
+ */
+@Entity('base_sys_log')
+export class BaseSysLogEntity extends BaseEntity {
+  @Index()
+  @Column({ comment: '用户ID', nullable: true, type: 'int' })
+  userId: number;
+
+  @Index()
+  @Column({ comment: '行为', length: 100 })
+  action: string;
+
+  @Index()
+  @Column({ comment: 'ip', nullable: true })
+  ip: string;
+
+  @Index()
+  @Column({ comment: 'ip地址', nullable: true, length: 50 })
+  ipAddr: string;
+
+  @Column({ comment: '参数', nullable: true, type: 'json' })
+  params: string;
+}

+ 45 - 0
yxgb-admin-midway/src/modules/base/entity/sys/menu.ts

@@ -0,0 +1,45 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Entity } from 'typeorm';
+
+/**
+ * 菜单
+ */
+@Entity('base_sys_menu')
+export class BaseSysMenuEntity extends BaseEntity {
+  @Column({ comment: '父菜单ID', type: 'int', nullable: true })
+  parentId: number;
+
+  @Column({ comment: '菜单名称' })
+  name: string;
+
+  @Column({ comment: '菜单地址', nullable: true })
+  router: string;
+
+  @Column({ comment: '权限标识', nullable: true })
+  perms: string;
+
+  @Column({
+    comment: '类型 0-目录 1-菜单 2-按钮',
+    default: 0,
+    type: 'smallint',
+  })
+  type: number;
+
+  @Column({ comment: '图标', nullable: true })
+  icon: string;
+
+  @Column({ comment: '排序', default: 0 })
+  orderNum: number;
+
+  @Column({ comment: '视图地址', nullable: true })
+  viewPath: string;
+
+  @Column({ comment: '路由缓存', default: true })
+  keepAlive: boolean;
+
+  // 父菜单名称
+  parentName: string;
+
+  @Column({ comment: '是否显示', default: true })
+  isShow: boolean;
+}

+ 28 - 0
yxgb-admin-midway/src/modules/base/entity/sys/param.ts

@@ -0,0 +1,28 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Index, Entity } from 'typeorm';
+
+/**
+ * 参数配置
+ */
+@Entity('base_sys_param')
+export class BaseSysParamEntity extends BaseEntity {
+  @Index()
+  @Column({ comment: '键位' })
+  keyName: string;
+
+  @Column({ comment: '名称' })
+  name: string;
+
+  @Column({ comment: '数据', type: 'text' })
+  data: string;
+
+  @Column({
+    comment: '数据类型 0:字符串 1:数组 2:键值对',
+    default: 0,
+    type: 'smallint',
+  })
+  dataType: number;
+
+  @Column({ comment: '备注', nullable: true })
+  remark: string;
+}

+ 40 - 0
yxgb-admin-midway/src/modules/base/entity/sys/role.ts

@@ -0,0 +1,40 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Index, Entity } from 'typeorm';
+
+/**
+ * 角色
+ */
+@Entity('base_sys_role')
+export class BaseSysRoleEntity extends BaseEntity {
+  @Column({ comment: '用户ID' })
+  userId: string;
+
+  @Index({ unique: true })
+  @Column({ comment: '名称' })
+  name: string;
+
+  @Index({ unique: true })
+  @Column({ comment: '角色标签', nullable: true, length: 50 })
+  label: string;
+
+  @Column({ comment: '备注', nullable: true })
+  remark: string;
+
+  @Column({ comment: '数据权限是否关联上下级', default: 1 })
+  relevance: number;
+
+  @Column({ comment: '菜单权限', type: 'json' })
+  menuIdList: number[];
+
+  @Column({ comment: '部门权限', type: 'json' })
+  departmentIdList: number[];
+
+  @Column({ comment: '图集权限', type: 'json' })
+  atlasIdList: number[];
+
+  @Column({ comment: '全图范围', type: 'json' })
+  optionsS: string;
+
+  @Column({ comment: '工具权限', type: 'json' })
+  toolIdList: number[];
+}

+ 14 - 0
yxgb-admin-midway/src/modules/base/entity/sys/role_atlas.ts

@@ -0,0 +1,14 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Entity } from 'typeorm';
+
+/**
+ * 角色图集
+ */
+@Entity('base_sys_role_atlas')
+export class BaseSysRoleAtlasEntity extends BaseEntity {
+  @Column({ comment: '角色ID', type: 'int' })
+  roleId: number;
+
+  @Column({ comment: '图集ID' })
+  atlasId: string;
+}

+ 14 - 0
yxgb-admin-midway/src/modules/base/entity/sys/role_department.ts

@@ -0,0 +1,14 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Entity } from 'typeorm';
+
+/**
+ * 角色部门
+ */
+@Entity('base_sys_role_department')
+export class BaseSysRoleDepartmentEntity extends BaseEntity {
+  @Column({ comment: '角色ID', type: 'int' })
+  roleId: number;
+
+  @Column({ comment: '部门ID', type: 'int' })
+  departmentId: number;
+}

+ 14 - 0
yxgb-admin-midway/src/modules/base/entity/sys/role_menu.ts

@@ -0,0 +1,14 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Entity } from 'typeorm';
+
+/**
+ * 角色菜单
+ */
+@Entity('base_sys_role_menu')
+export class BaseSysRoleMenuEntity extends BaseEntity {
+  @Column({ comment: '角色ID', type: 'int' })
+  roleId: number;
+
+  @Column({ comment: '菜单ID', type: 'int' })
+  menuId: number;
+}

+ 14 - 0
yxgb-admin-midway/src/modules/base/entity/sys/role_tool.ts

@@ -0,0 +1,14 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Entity } from 'typeorm';
+
+/**
+ * 角色菜单
+ */
+@Entity('base_sys_role_tool')
+export class BaseSysRoleToolEntity extends BaseEntity {
+  @Column({ comment: '角色ID', type: 'int' })
+  roleId: number;
+
+  @Column({ comment: '工具ID', type: 'int' })
+  toolId: number;
+}

+ 44 - 0
yxgb-admin-midway/src/modules/base/entity/sys/tool.ts

@@ -0,0 +1,44 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Entity } from 'typeorm';
+
+/**
+ * base-sys模块-工具
+ */
+@Entity('base_sys_tool')
+export class BaseSysToolEntity extends BaseEntity {
+  @Column({ comment: '父菜单ID', type: 'int', nullable: true })
+  parentId: number;
+
+  @Column({ comment: '名称', length: 50 })
+  name: string;
+
+  @Column({ comment: 'key', length: 50 })
+  key: string;
+
+  @Column({ comment: '组件', length: 50 })
+  component: string;
+
+  @Column({ comment: '自动禁用', default: false })
+  autoDisable: boolean;
+
+  @Column({ comment: '禁用其他', nullable: true })
+  disableOther: string;
+
+  @Column({ comment: '组', nullable: true })
+  group: string;
+
+  @Column({ comment: '可见', default: true })
+  visible: boolean;
+
+  @Column({ comment: '数据', nullable: true })
+  data: string;
+
+  @Column({ comment: '元', nullable: true })
+  meta: string;
+
+  @Column({ comment: '排序', default: 0 })
+  orderNum: number;
+
+  @Column({ comment: '图片', length: 50 })
+  icon: string;
+}

+ 55 - 0
yxgb-admin-midway/src/modules/base/entity/sys/user.ts

@@ -0,0 +1,55 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Index, Entity } from 'typeorm';
+
+/**
+ * 系统用户
+ */
+@Entity('base_sys_user')
+export class BaseSysUserEntity extends BaseEntity {
+  @Index()
+  @Column({ comment: '部门ID', type: 'int', nullable: true })
+  departmentId: number;
+
+  @Column({ comment: '姓名', nullable: true })
+  name: string;
+
+  @Index({ unique: true })
+  @Column({ comment: '用户名', length: 100 })
+  username: string;
+
+  @Column({ comment: '密码' })
+  password: string;
+
+  @Column({
+    comment: '密码版本, 作用是改完密码,让原来的token失效',
+    default: 1,
+  })
+  passwordV: number;
+
+  @Column({ comment: '昵称', nullable: true })
+  nickName: string;
+
+  @Column({ comment: '头像', nullable: true })
+  headImg: string;
+
+  @Index()
+  @Column({ comment: '手机', nullable: true, length: 20 })
+  phone: string;
+
+  @Column({ comment: '邮箱', nullable: true })
+  email: string;
+
+  @Column({ comment: '状态 0:禁用 1:启用', default: 1, type: 'smallint' })
+  status: number;
+
+  @Column({ comment: '备注', nullable: true })
+  remark: string;
+
+  // 部门名称
+  departmentName: string;
+  // 角色ID列表
+  roleIdList: number[];
+
+  @Column({ comment: 'socketId', nullable: true })
+  socketId: string;
+}

+ 14 - 0
yxgb-admin-midway/src/modules/base/entity/sys/user_role.ts

@@ -0,0 +1,14 @@
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Entity } from 'typeorm';
+
+/**
+ * 用户角色
+ */
+@Entity('base_sys_user_role')
+export class BaseSysUserRoleEntity extends BaseEntity {
+  @Column({ comment: '用户ID', type: 'int' })
+  userId: number;
+
+  @Column({ comment: '角色ID', type: 'int' })
+  roleId: number;
+}

+ 807 - 0
yxgb-admin-midway/src/modules/base/init--.sql

@@ -0,0 +1,807 @@
+-- 更新日期变更
+CREATE OR REPLACE FUNCTION "upd_timestamp"()
+RETURNS TRIGGER AS $$
+BEGIN
+    NEW.updateTime = now();
+    RETURN NEW;
+END;
+$$ language 'plpgsql';
+-- ----------------------------
+-- Table structure for base_sys_conf
+-- ----------------------------
+DROP TABLE IF EXISTS base_sys_conf;
+CREATE TABLE base_sys_conf (
+  id SERIAL ,
+  createTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ,
+  updateTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ,
+  cKey varchar(255) NOT NULL ,
+  cValue varchar(255) NOT NULL ,
+  PRIMARY KEY (id) ,
+  constraint IDX_9be195d27767b4485417869c3a unique(cKey) 
+) ;
+
+create index  base_sys_conf_index  on  base_sys_conf(createTime,updateTime);
+
+CREATE TRIGGER "updateTime" BEFORE UPDATE ON "base_sys_conf"
+FOR EACH ROW
+EXECUTE PROCEDURE "upd_timestamp"();
+
+COMMENT ON COLUMN base_sys_conf.id IS 'ID';
+COMMENT ON COLUMN base_sys_conf.createTime IS '创建时间';
+COMMENT ON COLUMN base_sys_conf.updateTime IS '更新时间';
+COMMENT ON COLUMN base_sys_conf.cKey IS '配置键';
+COMMENT ON COLUMN base_sys_conf.cValue IS '配置值';
+
+-- ----------------------------
+-- Records of base_sys_conf
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_conf VALUES (1, '2021-02-25 14:23:26.810981', '2021-02-25 14:23:26.810981', 'logKeep', '31');
+COMMIT;
+
+-- ----------------------------
+-- Table structure for base_sys_department
+-- ----------------------------
+DROP TABLE IF EXISTS base_sys_department;
+CREATE TABLE base_sys_department (
+  id SERIAL ,
+  createTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
+  updateTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
+  name varchar(155) NOT NULL,
+  parentId int DEFAULT NULL ,
+  orderNum int NOT NULL DEFAULT '0' ,
+  PRIMARY KEY (id) 
+) ;
+create index  base_sys_department_index  on  base_sys_department(createTime,updateTime);
+
+CREATE TRIGGER "updateTime" BEFORE UPDATE ON "base_sys_department"
+FOR EACH ROW
+EXECUTE PROCEDURE "upd_timestamp"();
+
+COMMENT ON COLUMN base_sys_department.id IS 'ID';
+COMMENT ON COLUMN base_sys_department.createTime IS '创建时间';
+COMMENT ON COLUMN base_sys_department.updateTime IS '更新时间';
+COMMENT ON COLUMN base_sys_department.name IS '部门名称';
+COMMENT ON COLUMN base_sys_department.parentId IS '上级部门ID';
+COMMENT ON COLUMN base_sys_department.orderNum IS '排序';
+
+-- ----------------------------
+-- Records of base_sys_department
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_department VALUES (1, '2021-02-24 21:17:11.971397', '2023-03-07 00:39:53.000000', 'COOL', NULL, 0);
+INSERT INTO base_sys_department VALUES (11, '2021-02-26 14:17:06.690613', '2023-03-07 00:39:53.000000', '开发', 12, 2);
+INSERT INTO base_sys_department VALUES (12, '2021-02-26 14:17:11.576369', '2023-03-07 00:39:53.000000', '测试', 1, 1);
+INSERT INTO base_sys_department VALUES (13, '2021-02-26 14:28:59.685177', '2023-03-07 00:39:53.000000', '游客', 1, 3);
+COMMIT;
+
+-- ----------------------------
+-- Table structure for base_sys_log
+-- ----------------------------
+DROP TABLE IF EXISTS base_sys_log;
+CREATE TABLE base_sys_log (
+  id SERIAL ,
+  createTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
+  updateTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
+  userId int DEFAULT NULL ,
+  ipAddr varchar(50) DEFAULT NULL,
+  params json DEFAULT NULL,
+  action varchar(100) NOT NULL ,
+  ip varchar(255) DEFAULT NULL,
+  PRIMARY KEY (id) 
+) ;
+create index  base_sys_log_index  on  base_sys_log(userId,action,ip,ipAddr,createTime,updateTime);
+
+CREATE TRIGGER "updateTime" BEFORE UPDATE ON "base_sys_log"
+FOR EACH ROW
+EXECUTE PROCEDURE "upd_timestamp"();
+
+COMMENT ON COLUMN base_sys_log.id IS 'ID';
+COMMENT ON COLUMN base_sys_log.createTime IS '创建时间';
+COMMENT ON COLUMN base_sys_log.updateTime IS '更新时间';
+COMMENT ON COLUMN base_sys_log.userId IS '用户ID';
+COMMENT ON COLUMN base_sys_log.ipAddr IS 'ip地址';
+COMMENT ON COLUMN base_sys_log.params IS '参数';
+COMMENT ON COLUMN base_sys_log.action IS '行为';
+COMMENT ON COLUMN base_sys_log.ip IS 'ip';
+
+
+-- ----------------------------
+-- Records of base_sys_log
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_log VALUES (1, '2023-03-08 15:12:45.149843', '2023-03-08 15:12:45.149843', 1, '中国福建厦门', '{"page": 1, "size": 20, "sort": "desc", "order": "createTime"}', '/admin/base/sys/log/page', '120.41.105.4');
+COMMIT;
+
+-- ----------------------------
+-- Table structure for base_sys_menu
+-- ----------------------------
+DROP TABLE IF EXISTS base_sys_menu;
+CREATE TABLE base_sys_menu (
+  id SERIAL ,
+  createTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ,
+  updateTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ,
+  parentId int DEFAULT NULL ,
+  name varchar(255)  NOT NULL,
+  router varchar(255)   DEFAULT NULL,
+  perms varchar(255)   DEFAULT NULL,
+  type smallint NOT NULL DEFAULT '0' ,
+  icon varchar(255)   DEFAULT NULL ,
+  orderNum int NOT NULL DEFAULT '0' ,
+  viewPath varchar(255)   DEFAULT NULL ,
+  keepAlive boolean NOT NULL DEFAULT true,
+  isShow boolean NOT NULL DEFAULT true,
+  PRIMARY KEY (id) 
+);
+create index  base_sys_menu_index  on  base_sys_menu(createTime,updateTime);
+
+
+CREATE TRIGGER "updateTime" BEFORE UPDATE ON "base_sys_menu"
+FOR EACH ROW
+EXECUTE PROCEDURE "upd_timestamp"();
+
+COMMENT ON COLUMN base_sys_menu.id IS 'ID';
+COMMENT ON COLUMN base_sys_menu.createTime IS '创建时间';
+COMMENT ON COLUMN base_sys_menu.updateTime IS '更新时间';
+COMMENT ON COLUMN base_sys_menu.parentId IS '父菜单ID';
+COMMENT ON COLUMN base_sys_menu.name IS '菜单名称';
+COMMENT ON COLUMN base_sys_menu.router IS '菜单地址';
+COMMENT ON COLUMN base_sys_menu.perms IS '权限标识';
+COMMENT ON COLUMN base_sys_menu.type IS '类型 0-目录 1-菜单 2-按钮';
+COMMENT ON COLUMN base_sys_menu.icon IS '图标';
+COMMENT ON COLUMN base_sys_menu.orderNum IS '排序';
+COMMENT ON COLUMN base_sys_menu.viewPath IS '视图地址';
+COMMENT ON COLUMN base_sys_menu.keepAlive IS '路由缓存';
+COMMENT ON COLUMN base_sys_menu.isShow IS '是否显示';
+
+-- ----------------------------
+-- Records of base_sys_menu
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_menu VALUES (2, '2019-09-11 11:14:47.000000', '2021-02-27 17:16:05.000000', NULL, '系统管理', '/sys', NULL, 0, 'icon-system', 2, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (8, '1900-01-20 23:19:57.000000', '2021-03-08 22:59:12.000000', 27, '菜单列表', '/sys/menu', NULL, 1, 'icon-menu', 2, 'cool/modules/base/views/menu.vue', true,true);
+INSERT INTO base_sys_menu VALUES (10, '1900-01-20 00:19:27.325000', '1900-01-20 00:19:27.325000', 8, '新增', NULL, 'base:sys:menu:add', 2, NULL, 1, NULL, false,true);
+INSERT INTO base_sys_menu VALUES (11, '1900-01-20 00:19:51.101000', '1900-01-20 00:19:51.101000', 8, '删除', NULL, 'base:sys:menu:delete', 2, NULL, 2, NULL, false,true);
+INSERT INTO base_sys_menu VALUES (13, '1900-01-20 00:20:19.341000', '1900-01-20 00:20:19.341000', 8, '查询', NULL, 'base:sys:menu:page,base:sys:menu:list,base:sys:menu:info', 2, NULL, 4, NULL, false,true);
+INSERT INTO base_sys_menu VALUES (22, '2019-09-12 00:34:01.000000', '2023-02-17 16:14:37.299000', 27, '角色列表', '/sys/role', NULL, 1, 'icon-dept', 3, 'cool/modules/base/views/role.vue', true,true);
+INSERT INTO base_sys_menu VALUES (23, '1900-01-20 00:34:23.459000', '1900-01-20 00:34:23.459000', 22, '新增', NULL, 'base:sys:role:add', 2, NULL, 1, NULL, false,true);
+INSERT INTO base_sys_menu VALUES (24, '1900-01-20 00:34:40.523000', '1900-01-20 00:34:40.523000', 22, '删除', NULL, 'base:sys:role:delete', 2, NULL, 2, NULL, false,true);
+INSERT INTO base_sys_menu VALUES (25, '1900-01-20 00:34:53.306000', '1900-01-20 00:34:53.306000', 22, '修改', NULL, 'base:sys:role:update', 2, NULL, 3, NULL, false,true);
+INSERT INTO base_sys_menu VALUES (26, '1900-01-20 00:35:05.024000', '1900-01-20 00:35:05.024000', 22, '查询', NULL, 'base:sys:role:page,base:sys:role:list,base:sys:role:info', 2, NULL, 4, NULL, false,true);
+INSERT INTO base_sys_menu VALUES (27, '2019-09-12 15:52:44.000000', '2019-09-15 22:11:56.000000', 2, '权限管理', NULL, NULL, 0, 'icon-auth', 1, NULL, false,true);
+INSERT INTO base_sys_menu VALUES (29, '2019-09-12 17:35:51.000000', '2021-03-08 23:01:39.000000', 105, '请求日志', '/sys/log', NULL, 1, 'icon-log', 1, 'cool/modules/base/views/log.vue', true,true);
+INSERT INTO base_sys_menu VALUES (30, '2019-09-12 17:37:03.000000', '2021-03-03 10:16:26.000000', 29, '权限', NULL, 'base:sys:log:page,base:sys:log:clear,base:sys:log:getKeep,base:sys:log:setKeep', 2, NULL, 1, NULL, false,true);
+INSERT INTO base_sys_menu VALUES (47, '2019-11-08 09:35:08.000000', '2023-02-13 19:30:28.560000', NULL, '框架教程', '/tutorial', NULL, 0, 'icon-task', 98, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (48, '2019-11-08 09:35:53.000000', '2021-03-03 11:03:21.000000', 47, '文档', '/tutorial/doc', NULL, 1, 'icon-log', 0, 'https://admin.cool-js.com', true,true);
+INSERT INTO base_sys_menu VALUES (59, '2019-11-18 16:50:27.000000', '2019-11-18 16:50:27.000000', 97, '部门列表', NULL, 'base:sys:department:list', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (60, '2019-11-18 16:50:45.000000', '2019-11-18 16:50:45.000000', 97, '新增部门', NULL, 'base:sys:department:add', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (61, '2019-11-18 16:50:59.000000', '2019-11-18 16:50:59.000000', 97, '更新部门', NULL, 'base:sys:department:update', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (62, '2019-11-18 16:51:13.000000', '2019-11-18 16:51:13.000000', 97, '删除部门', NULL, 'base:sys:department:delete', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (63, '2019-11-18 17:49:35.000000', '2019-11-18 17:49:35.000000', 97, '部门排序', NULL, 'base:sys:department:order', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (65, '2019-11-18 23:59:21.000000', '2019-11-18 23:59:21.000000', 97, '用户转移', NULL, 'base:sys:user:move', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (78, '2019-12-10 13:27:56.000000', '2023-02-17 16:05:06.071000', 2, '参数配置', NULL, NULL, 0, 'icon-params', 3, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (79, '1900-01-20 13:29:33.000000', '2021-03-08 23:01:48.000000', 78, '参数列表', '/sys/param', NULL, 1, 'icon-menu', 0, 'cool/modules/base/views/param.vue', true,true);
+INSERT INTO base_sys_menu VALUES (80, '1900-01-20 13:29:50.146000', '1900-01-20 13:29:50.146000', 79, '新增', NULL, 'base:sys:param:add', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (81, '1900-01-20 13:30:10.030000', '1900-01-20 13:30:10.030000', 79, '修改', NULL, 'base:sys:param:info,base:sys:param:update', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (82, '1900-01-20 13:30:25.791000', '1900-01-20 13:30:25.791000', 79, '删除', NULL, 'base:sys:param:delete', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (83, '1900-01-20 13:30:40.469000', '1900-01-20 13:30:40.469000', 79, '查看', NULL, 'base:sys:param:page,base:sys:param:list,base:sys:param:info', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (84, '2020-07-25 16:21:30.000000', '2020-07-25 16:21:30.000000', NULL, '通用', NULL, NULL, 0, 'icon-radioboxfill', 99, NULL, true,false);
+INSERT INTO base_sys_menu VALUES (85, '2020-07-25 16:22:14.000000', '2021-03-03 10:36:00.000000', 84, '图片上传', NULL, 'space:info:page,space:info:list,space:info:info,space:info:add,space:info:delete,space:info:update,space:type:page,space:type:list,space:type:info,space:type:add,space:type:delete,space:type:update', 2, NULL, 1, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (97, '1900-01-20 14:14:02.000000', '2023-02-28 15:51:30.854000', 27, '用户列表', '/sys/user', NULL, 1, 'icon-user', 0, 'modules/base/views/user/index.vue', true,true);
+INSERT INTO base_sys_menu VALUES (98, '1900-01-20 14:14:13.528000', '1900-01-20 14:14:13.528000', 97, '新增', NULL, 'base:sys:user:add', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (99, '1900-01-20 14:14:22.823000', '1900-01-20 14:14:22.823000', 97, '删除', NULL, 'base:sys:user:delete', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (100, '1900-01-20 14:14:33.973000', '1900-01-20 14:14:33.973000', 97, '修改', NULL, 'base:sys:user:delete,base:sys:user:update', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (101, '2021-01-12 14:14:51.000000', '2021-01-12 14:14:51.000000', 97, '查询', NULL, 'base:sys:user:page,base:sys:user:list,base:sys:user:info', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (105, '2021-01-21 10:42:55.000000', '2023-02-17 16:05:19.312000', 2, '监控管理', NULL, NULL, 0, 'icon-monitor', 9, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (117, '2021-03-05 10:58:25.000000', '2023-02-13 19:30:39.636000', NULL, '任务管理', NULL, NULL, 0, 'icon-activity', 97, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (118, '2021-03-05 10:59:42.000000', '2023-02-14 14:05:48.454000', 117, '任务列表', '/task/list', NULL, 1, 'icon-menu', 0, 'modules/task/views/list.vue', true,true);
+INSERT INTO base_sys_menu VALUES (119, '2021-03-05 11:00:00.000000', '2021-03-05 11:00:00.000000', 118, '权限', NULL, 'task:info:page,task:info:list,task:info:info,task:info:add,task:info:delete,task:info:update,task:info:stop,task:info:start,task:info:once,task:info:log', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (197, '2022-07-05 16:05:27.403000', '2023-02-17 16:02:39.668000', NULL, '字典管理', NULL, NULL, 0, 'icon-dict', 3, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (198, '2022-07-05 16:08:50.307000', '2022-07-05 16:14:13.196000', 197, '字典列表', '/dict/list', NULL, 1, 'icon-menu', 1, 'modules/dict/views/list.vue', true,true);
+INSERT INTO base_sys_menu VALUES (199, '2022-07-05 16:08:50.748162', '2022-07-05 16:08:50.748162', 198, '删除', NULL, 'dict:info:delete', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (200, '2022-07-05 16:08:50.800623', '2022-07-05 16:08:50.800623', 198, '修改', NULL, 'dict:info:update,dict:info:info', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (201, '2022-07-05 16:08:50.859141', '2022-07-05 16:08:50.859141', 198, '获得字典数据', NULL, 'dict:info:data', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (202, '2022-07-05 16:08:50.916874', '2022-07-05 16:08:50.916874', 198, '单个信息', NULL, 'dict:info:info', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (203, '2022-07-05 16:08:50.972783', '2022-07-05 16:08:50.972783', 198, '列表查询', NULL, 'dict:info:list', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (204, '2022-07-05 16:08:51.030928', '2022-07-05 16:08:51.030928', 198, '分页查询', NULL, 'dict:info:page', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (205, '2022-07-05 16:08:51.087883', '2022-07-05 16:08:51.087883', 198, '新增', NULL, 'dict:info:add', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (206, '2022-07-06 10:41:26.503000', '2022-07-06 10:41:37.000000', 198, '组权限', NULL, 'dict:type:list,dict:type:update,dict:type:delete,dict:type:add', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (228, '2023-02-13 14:57:10.974000', '2023-02-17 16:03:12.480000', NULL, '数据管理', NULL, NULL, 0, 'icon-data', 3, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (229, '2023-02-13 14:57:47.855000', '2023-02-17 16:04:57.051000', 228, '数据回收站', '/recycle/data', NULL, 1, 'icon-delete', 1, 'modules/recycle/views/data.vue', true,true);
+INSERT INTO base_sys_menu VALUES (230, '2023-02-13 14:57:48.293292', '2023-02-13 14:57:48.293292', 229, '恢复数据', NULL, 'recycle:data:restore', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (231, '2023-02-13 14:57:48.293292', '2023-02-13 14:57:48.293292', 229, '单个信息', NULL, 'recycle:data:info', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (232, '2023-02-13 14:57:48.293292', '2023-02-13 14:57:48.293292', 229, '分页查询', NULL, 'recycle:data:page', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (233, '2023-02-13 19:29:49.240000', '2023-02-17 16:04:17.603000', NULL, '物联管理', NULL, NULL, 0, 'icon-iot', 4, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (234, '2023-02-13 19:31:31.890000', '2023-02-19 14:53:36.538000', 233, 'MQTT', '/iot/device', NULL, 1, 'icon-device', 1, 'modules/iot/views/device.vue', true,true);
+INSERT INTO base_sys_menu VALUES (235, '2023-02-13 19:32:58.637593', '2023-02-13 19:32:58.637593', 234, '删除', NULL, 'iot:device:delete', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (236, '2023-02-13 19:32:58.637593', '2023-02-13 19:32:58.637593', 234, '单个信息', NULL, 'iot:device:info', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (237, '2023-02-13 19:32:58.637593', '2023-02-13 19:32:58.637593', 234, '列表查询', NULL, 'iot:device:list', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (238, '2023-02-13 19:32:58.637593', '2023-02-13 19:32:58.637593', 234, '分页查询', NULL, 'iot:device:page', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (239, '2023-02-15 11:21:16.610000', '2023-02-15 14:56:08.425000', NULL, '文件管理', '/upload/list', NULL, 1, 'icon-log', 97, 'modules/upload/views/list.vue', true,true);
+INSERT INTO base_sys_menu VALUES (240, '2023-02-15 14:34:46.552000', '2023-02-17 16:04:29.152000', NULL, '函数开发', NULL, NULL, 0, 'icon-fx', 6, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (241, '2023-02-15 14:35:31.765000', '2023-02-17 16:04:36.963000', 240, '云数据库', '/cloud/db', NULL, 1, 'icon-db', 1, 'modules/cloud/views/db.vue', true,true);
+INSERT INTO base_sys_menu VALUES (242, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '初始化Entity', NULL, 'cloud:db:initEntity', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (243, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '删除', NULL, 'cloud:db:delete', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (244, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '修改', NULL, 'cloud:db:update,cloud:db:info', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (245, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '数据操作测试', NULL, 'cloud:db:data', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (246, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '单个信息', NULL, 'cloud:db:info', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (247, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '列表查询', NULL, 'cloud:db:list', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (248, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '分页查询', NULL, 'cloud:db:page', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (249, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '新增', NULL, 'cloud:db:add', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (250, '2023-02-15 15:17:10.524000', '2023-02-15 15:17:10.524000', 240, '云函数', '/cloud/func/info', NULL, 1, 'icon-menu', 2, 'modules/cloud/views/func/info.vue', true,true);
+INSERT INTO base_sys_menu VALUES (251, '2023-02-15 15:15:02.900934', '2023-02-28 16:08:47.978000', 250, '调用云函数', NULL, 'cloud:func:info:invoke', 2, NULL, 98, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (252, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '删除', NULL, 'cloud:func:info:delete', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (253, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '修改', NULL, 'cloud:func:info:update,cloud:func:info:info', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (254, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '单个信息', NULL, 'cloud:func:info:info', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (255, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '列表查询', NULL, 'cloud:func:info:list', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (256, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '分页查询', NULL, 'cloud:func:info:page', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (257, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '新增', NULL, 'cloud:func:info:add', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (259, '2023-02-17 15:25:20.762000', '2023-02-17 15:25:20.762000', 234, '修改', NULL, 'iot:device:info,iot:device:update', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (260, '2023-02-17 16:26:55.842000', '2023-02-17 16:28:41.738000', NULL, '页面设计', '/design/page', NULL, 1, 'icon-design', 7, 'modules/design/views/page.vue', true,true);
+INSERT INTO base_sys_menu VALUES (261, '2023-02-20 00:12:20.783000', '2023-02-20 00:12:20.783000', 234, '新增', NULL, 'iot:device:add', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (262, '2023-02-20 00:32:45.656000', '2023-02-28 16:08:42.999000', 250, '云函数开发', NULL, 'cloud:func:info:info,cloud:func:info:update,cloud:func:info:invoke', 2, NULL, 99, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (263, '2023-02-20 00:33:17.789000', '2023-02-20 00:33:17.789000', 250, '查看日志', NULL, 'cloud:func:log:page', 2, NULL, 0, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (446, '2023-03-06 22:50:24.125000', '2023-03-06 22:50:24.125000', 8, '参数', '/test/aa', NULL, 1, 'icon-goods', 0, 'modules/base/views/info.vue', true,true);
+INSERT INTO base_sys_menu VALUES (447, '2023-03-07 10:26:51.746000', '2023-03-07 10:26:51.746000', NULL, '工作台', NULL, NULL, 0, 'icon-workbench', 1, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (448, '2023-03-07 10:27:21.084000', '2023-03-07 10:27:21.084000', 447, '组件预览', '/demo', NULL, 1, 'icon-favor', 1, 'modules/demo/views/demo.vue', true,true);
+INSERT INTO base_sys_menu VALUES (449, '2023-03-07 10:27:54.079000', '2023-03-07 10:27:54.079000', 447, '组件库', NULL, NULL, 0, 'icon-common', 2, NULL, true,true);
+INSERT INTO base_sys_menu VALUES (450, '2023-03-07 10:28:17.692000', '2023-03-07 10:28:17.692000', 449, 'crud 示例', '/demo/crud', NULL, 1, 'icon-favor', 1, 'modules/demo/views/crud.vue', true,true);
+INSERT INTO base_sys_menu VALUES (451, '2023-03-07 10:28:44.322000', '2023-03-07 10:28:44.322000', 449, '编辑器', '/demo/editor', NULL, 1, 'icon-favor', 2, 'modules/demo/views/editor.vue', true,true);
+INSERT INTO base_sys_menu VALUES (452, '2023-03-07 10:29:06.344000', '2023-03-07 10:29:06.344000', 449, '文件上传', '/demo/upload', NULL, 1, 'icon-favor', 3, 'modules/demo/views/upload.vue', true,true);
+INSERT INTO base_sys_menu VALUES (453, '2023-03-15 10:38:43.677000', '2023-03-15 10:38:43.677000', 8, '编辑', NULL, 'base:sys:menu:info,base:sys:menu:update', 2, NULL, 0, NULL, true,true);
+COMMIT;
+
+-- ----------------------------
+-- Table structure for base_sys_param
+-- ----------------------------
+DROP TABLE IF EXISTS base_sys_param;
+CREATE TABLE base_sys_param (
+  id SERIAL ,
+  createTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ,
+  updateTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ,
+  keyName varchar(255)   NOT NULL,
+  name varchar(255)   NOT NULL,
+  data text   NOT NULL ,
+  dataType smallint NOT NULL DEFAULT '0',
+  remark varchar(255)   DEFAULT NULL ,
+  PRIMARY KEY (id) 
+) ;
+create index  base_sys_param_index  on  base_sys_param(keyName,createTime,updateTime);
+
+CREATE TRIGGER "updateTime" BEFORE UPDATE ON "base_sys_param"
+FOR EACH ROW
+EXECUTE PROCEDURE "upd_timestamp"();
+
+COMMENT ON COLUMN base_sys_param.id IS 'ID';
+COMMENT ON COLUMN base_sys_param.createTime IS '创建时间';
+COMMENT ON COLUMN base_sys_param.updateTime IS '更新时间';
+COMMENT ON COLUMN base_sys_param.keyName IS '键位';
+COMMENT ON COLUMN base_sys_param.name IS '名称';
+COMMENT ON COLUMN base_sys_param.data IS '数据';
+COMMENT ON COLUMN base_sys_param.dataType IS '数据类型 0:字符串 1:数组 2:键值对';
+COMMENT ON COLUMN base_sys_param.remark IS '备注';
+
+-- ----------------------------
+-- Records of base_sys_param
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_param VALUES (1, '2021-02-26 13:53:05.000000', '2021-03-03 17:50:04.000000', 'text', '富文本参数', '<p><strong class=\"ql-size-huge\">111xxxxx2222<span class=\"ql-cursor\"></span></strong></p>', 0, NULL);
+INSERT INTO base_sys_param VALUES (2, '2021-02-26 13:53:18.000000', '2023-03-06 12:18:12.329000', 'json', 'JSON参数', '{\n  \"code\": 111233\n}', 0, NULL);
+COMMIT;
+
+-- ----------------------------
+-- Table structure for base_sys_role
+-- ----------------------------
+DROP TABLE IF EXISTS base_sys_role;
+CREATE TABLE base_sys_role (
+  id SERIAL,
+  createTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
+  updateTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
+  userId varchar(255)   NOT NULL ,
+  name varchar(255)   NOT NULL,
+  label varchar(50)   DEFAULT NULL,
+  remark varchar(255)   DEFAULT NULL,
+  relevance int NOT NULL DEFAULT '1',
+  menuIdList json NOT NULL,
+  departmentIdList json NOT NULL,
+  PRIMARY KEY (id) ,
+  constraint IDX_469d49a5998170e9550cf113da unique(name) ,
+  constraint IDX_f3f24fbbccf00192b076e549a7 unique(label) 
+) ;
+create index  base_sys_role_index  on  base_sys_role(createTime,updateTime);
+
+CREATE TRIGGER "updateTime" BEFORE UPDATE ON "base_sys_role"
+FOR EACH ROW
+EXECUTE PROCEDURE "upd_timestamp"();
+
+COMMENT ON COLUMN base_sys_role.id IS 'ID';
+COMMENT ON COLUMN base_sys_role.createTime IS '创建时间';
+COMMENT ON COLUMN base_sys_role.updateTime IS '更新时间';
+COMMENT ON COLUMN base_sys_role.userId IS '用户ID';
+COMMENT ON COLUMN base_sys_role.name IS '名称';
+COMMENT ON COLUMN base_sys_role.label IS '角色标签';
+COMMENT ON COLUMN base_sys_role.remark IS '备注';
+COMMENT ON COLUMN base_sys_role.relevance IS '数据权限是否关联上下级';
+COMMENT ON COLUMN base_sys_role.menuIdList IS '菜单权限';
+COMMENT ON COLUMN base_sys_role.departmentIdList IS '部门权限';
+
+-- ----------------------------
+-- Records of base_sys_role
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_role VALUES (1, '2021-02-24 21:18:39.682358', '2021-02-24 21:18:39.682358', '1', '超管', 'admin', '最高权限的角色', 1, 'null', 'null');
+INSERT INTO base_sys_role VALUES (10, '2021-02-26 14:15:38.000000', '2021-02-26 14:15:38.000000', '1', '系统管理员', 'admin-sys', NULL, 1, 'null', 'null');
+INSERT INTO base_sys_role VALUES (11, '2021-02-26 14:16:49.044744', '2021-02-26 14:16:49.044744', '1', '游客', 'visitor', NULL, 0, 'null', 'null');
+INSERT INTO base_sys_role VALUES (12, '2021-02-26 14:26:51.000000', '2021-02-26 14:32:35.000000', '1', '开发', 'dev', NULL, 0, 'null', 'null');
+INSERT INTO base_sys_role VALUES (13, '2021-02-26 14:27:58.000000', '2023-02-20 11:01:16.995000', '1', '测试', 'test', NULL, 0, 'null', 'null');
+COMMIT;
+
+-- ----------------------------
+-- Table structure for base_sys_role_department
+-- ----------------------------
+DROP TABLE IF EXISTS base_sys_role_department;
+CREATE TABLE base_sys_role_department (
+  id SERIAL ,
+  createTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
+  updateTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
+  roleId int NOT NULL,
+  departmentId int NOT NULL,
+  PRIMARY KEY (id) 
+) ;
+create index  base_sys_role_department_index  on  base_sys_role_department(createTime,updateTime);
+
+CREATE TRIGGER "updateTime" BEFORE UPDATE ON "base_sys_role_department"
+FOR EACH ROW
+EXECUTE PROCEDURE "upd_timestamp"();
+
+COMMENT ON COLUMN base_sys_role_department.id IS 'ID';
+COMMENT ON COLUMN base_sys_role_department.createTime IS '创建时间';
+COMMENT ON COLUMN base_sys_role_department.updateTime IS '更新时间';
+COMMENT ON COLUMN base_sys_role_department.roleId IS '角色ID';
+COMMENT ON COLUMN base_sys_role_department.departmentId IS '部门ID';
+
+-- ----------------------------
+-- Records of base_sys_role_department
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_role_department VALUES (1, '2021-02-26 12:00:23.787939', '2021-02-26 12:00:23.787939', 8, 4);
+INSERT INTO base_sys_role_department VALUES (2, '2021-02-26 12:01:11.525205', '2021-02-26 12:01:11.525205', 9, 1);
+INSERT INTO base_sys_role_department VALUES (3, '2021-02-26 12:01:11.624266', '2021-02-26 12:01:11.624266', 9, 4);
+INSERT INTO base_sys_role_department VALUES (4, '2021-02-26 12:01:11.721894', '2021-02-26 12:01:11.721894', 9, 5);
+INSERT INTO base_sys_role_department VALUES (5, '2021-02-26 12:01:11.823342', '2021-02-26 12:01:11.823342', 9, 8);
+INSERT INTO base_sys_role_department VALUES (6, '2021-02-26 12:01:11.922873', '2021-02-26 12:01:11.922873', 9, 9);
+INSERT INTO base_sys_role_department VALUES (23, '2021-02-26 14:32:40.354669', '2021-02-26 14:32:40.354669', 12, 11);
+INSERT INTO base_sys_role_department VALUES (25, '2021-02-26 14:32:59.726608', '2021-02-26 14:32:59.726608', 10, 1);
+INSERT INTO base_sys_role_department VALUES (28, '2023-02-20 11:01:23.152883', '2023-02-20 11:01:23.152883', 13, 12);
+COMMIT;
+
+-- ----------------------------
+-- Table structure for base_sys_role_menu
+-- ----------------------------
+DROP TABLE IF EXISTS base_sys_role_menu;
+CREATE TABLE base_sys_role_menu (
+  id SERIAL,
+  createTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
+  updateTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
+  roleId int NOT NULL,
+  menuId int NOT NULL,
+  PRIMARY KEY (id) 
+) ;
+create index  base_sys_role_menu_index  on  base_sys_role_menu(createTime,updateTime);
+
+CREATE TRIGGER "updateTime" BEFORE UPDATE ON "base_sys_role_menu"
+FOR EACH ROW
+EXECUTE PROCEDURE "upd_timestamp"();
+
+COMMENT ON COLUMN base_sys_role_menu.id IS 'ID';
+COMMENT ON COLUMN base_sys_role_menu.createTime IS '创建时间';
+COMMENT ON COLUMN base_sys_role_menu.updateTime IS '更新时间';
+COMMENT ON COLUMN base_sys_role_menu.roleId IS '角色ID';
+COMMENT ON COLUMN base_sys_role_menu.menuId IS '菜单ID';
+
+-- ----------------------------
+-- Records of base_sys_role_menu
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_role_menu VALUES (1, '2021-02-26 12:00:18.240154', '2021-02-26 12:00:18.240154', 8, 1);
+INSERT INTO base_sys_role_menu VALUES (2, '2021-02-26 12:00:18.342131', '2021-02-26 12:00:18.342131', 8, 96);
+INSERT INTO base_sys_role_menu VALUES (3, '2021-02-26 12:00:18.444143', '2021-02-26 12:00:18.444143', 8, 45);
+INSERT INTO base_sys_role_menu VALUES (4, '2021-02-26 12:00:18.545490', '2021-02-26 12:00:18.545490', 8, 43);
+INSERT INTO base_sys_role_menu VALUES (5, '2021-02-26 12:00:18.649626', '2021-02-26 12:00:18.649626', 8, 49);
+INSERT INTO base_sys_role_menu VALUES (6, '2021-02-26 12:00:18.752369', '2021-02-26 12:00:18.752369', 8, 86);
+INSERT INTO base_sys_role_menu VALUES (7, '2021-02-26 12:00:18.856023', '2021-02-26 12:00:18.856023', 8, 2);
+INSERT INTO base_sys_role_menu VALUES (8, '2021-02-26 12:00:18.956131', '2021-02-26 12:00:18.956131', 8, 27);
+INSERT INTO base_sys_role_menu VALUES (9, '2021-02-26 12:00:19.071490', '2021-02-26 12:00:19.071490', 8, 97);
+INSERT INTO base_sys_role_menu VALUES (10, '2021-02-26 12:00:19.171745', '2021-02-26 12:00:19.171745', 8, 59);
+INSERT INTO base_sys_role_menu VALUES (11, '2021-02-26 12:00:19.274495', '2021-02-26 12:00:19.274495', 8, 60);
+INSERT INTO base_sys_role_menu VALUES (12, '2021-02-26 12:00:19.374610', '2021-02-26 12:00:19.374610', 8, 61);
+INSERT INTO base_sys_role_menu VALUES (13, '2021-02-26 12:00:19.474750', '2021-02-26 12:00:19.474750', 8, 62);
+INSERT INTO base_sys_role_menu VALUES (14, '2021-02-26 12:00:19.573369', '2021-02-26 12:00:19.573369', 8, 63);
+INSERT INTO base_sys_role_menu VALUES (15, '2021-02-26 12:00:19.674242', '2021-02-26 12:00:19.674242', 8, 65);
+INSERT INTO base_sys_role_menu VALUES (16, '2021-02-26 12:00:19.772886', '2021-02-26 12:00:19.772886', 8, 98);
+INSERT INTO base_sys_role_menu VALUES (17, '2021-02-26 12:00:19.874134', '2021-02-26 12:00:19.874134', 8, 99);
+INSERT INTO base_sys_role_menu VALUES (18, '2021-02-26 12:00:19.972728', '2021-02-26 12:00:19.972728', 8, 100);
+INSERT INTO base_sys_role_menu VALUES (19, '2021-02-26 12:00:20.085877', '2021-02-26 12:00:20.085877', 8, 101);
+INSERT INTO base_sys_role_menu VALUES (20, '2021-02-26 12:00:20.192887', '2021-02-26 12:00:20.192887', 8, 8);
+INSERT INTO base_sys_role_menu VALUES (21, '2021-02-26 12:00:20.293747', '2021-02-26 12:00:20.293747', 8, 10);
+INSERT INTO base_sys_role_menu VALUES (22, '2021-02-26 12:00:20.393491', '2021-02-26 12:00:20.393491', 8, 11);
+INSERT INTO base_sys_role_menu VALUES (23, '2021-02-26 12:00:20.495110', '2021-02-26 12:00:20.495110', 8, 12);
+INSERT INTO base_sys_role_menu VALUES (24, '2021-02-26 12:00:20.594083', '2021-02-26 12:00:20.594083', 8, 13);
+INSERT INTO base_sys_role_menu VALUES (25, '2021-02-26 12:00:20.695727', '2021-02-26 12:00:20.695727', 8, 22);
+INSERT INTO base_sys_role_menu VALUES (26, '2021-02-26 12:00:20.794729', '2021-02-26 12:00:20.794729', 8, 23);
+INSERT INTO base_sys_role_menu VALUES (27, '2021-02-26 12:00:20.895601', '2021-02-26 12:00:20.895601', 8, 24);
+INSERT INTO base_sys_role_menu VALUES (28, '2021-02-26 12:00:20.994972', '2021-02-26 12:00:20.994972', 8, 25);
+INSERT INTO base_sys_role_menu VALUES (29, '2021-02-26 12:00:21.110384', '2021-02-26 12:00:21.110384', 8, 26);
+INSERT INTO base_sys_role_menu VALUES (30, '2021-02-26 12:00:21.210970', '2021-02-26 12:00:21.210970', 8, 69);
+INSERT INTO base_sys_role_menu VALUES (31, '2021-02-26 12:00:21.311852', '2021-02-26 12:00:21.311852', 8, 70);
+INSERT INTO base_sys_role_menu VALUES (32, '2021-02-26 12:00:21.411591', '2021-02-26 12:00:21.411591', 8, 71);
+INSERT INTO base_sys_role_menu VALUES (33, '2021-02-26 12:00:21.513584', '2021-02-26 12:00:21.513584', 8, 72);
+INSERT INTO base_sys_role_menu VALUES (34, '2021-02-26 12:00:21.612212', '2021-02-26 12:00:21.612212', 8, 73);
+INSERT INTO base_sys_role_menu VALUES (35, '2021-02-26 12:00:21.712720', '2021-02-26 12:00:21.712720', 8, 74);
+INSERT INTO base_sys_role_menu VALUES (36, '2021-02-26 12:00:21.812839', '2021-02-26 12:00:21.812839', 8, 75);
+INSERT INTO base_sys_role_menu VALUES (37, '2021-02-26 12:00:21.913321', '2021-02-26 12:00:21.913321', 8, 76);
+INSERT INTO base_sys_role_menu VALUES (38, '2021-02-26 12:00:22.013970', '2021-02-26 12:00:22.013970', 8, 77);
+INSERT INTO base_sys_role_menu VALUES (39, '2021-02-26 12:00:22.144879', '2021-02-26 12:00:22.144879', 8, 78);
+INSERT INTO base_sys_role_menu VALUES (40, '2021-02-26 12:00:22.246707', '2021-02-26 12:00:22.246707', 8, 79);
+INSERT INTO base_sys_role_menu VALUES (41, '2021-02-26 12:00:22.347579', '2021-02-26 12:00:22.347579', 8, 80);
+INSERT INTO base_sys_role_menu VALUES (42, '2021-02-26 12:00:22.446947', '2021-02-26 12:00:22.446947', 8, 81);
+INSERT INTO base_sys_role_menu VALUES (43, '2021-02-26 12:00:22.547082', '2021-02-26 12:00:22.547082', 8, 82);
+INSERT INTO base_sys_role_menu VALUES (44, '2021-02-26 12:00:22.647197', '2021-02-26 12:00:22.647197', 8, 83);
+INSERT INTO base_sys_role_menu VALUES (45, '2021-02-26 12:00:22.748089', '2021-02-26 12:00:22.748089', 8, 105);
+INSERT INTO base_sys_role_menu VALUES (46, '2021-02-26 12:00:22.847814', '2021-02-26 12:00:22.847814', 8, 102);
+INSERT INTO base_sys_role_menu VALUES (47, '2021-02-26 12:00:22.949071', '2021-02-26 12:00:22.949071', 8, 103);
+INSERT INTO base_sys_role_menu VALUES (48, '2021-02-26 12:00:23.047353', '2021-02-26 12:00:23.047353', 8, 29);
+INSERT INTO base_sys_role_menu VALUES (49, '2021-02-26 12:00:23.147826', '2021-02-26 12:00:23.147826', 8, 30);
+INSERT INTO base_sys_role_menu VALUES (50, '2021-02-26 12:00:23.246800', '2021-02-26 12:00:23.246800', 8, 47);
+INSERT INTO base_sys_role_menu VALUES (51, '2021-02-26 12:00:23.349541', '2021-02-26 12:00:23.349541', 8, 48);
+INSERT INTO base_sys_role_menu VALUES (52, '2021-02-26 12:00:23.463177', '2021-02-26 12:00:23.463177', 8, 84);
+INSERT INTO base_sys_role_menu VALUES (53, '2021-02-26 12:00:23.564096', '2021-02-26 12:00:23.564096', 8, 90);
+INSERT INTO base_sys_role_menu VALUES (54, '2021-02-26 12:00:23.663815', '2021-02-26 12:00:23.663815', 8, 85);
+INSERT INTO base_sys_role_menu VALUES (55, '2021-02-26 12:01:05.971978', '2021-02-26 12:01:05.971978', 9, 1);
+INSERT INTO base_sys_role_menu VALUES (56, '2021-02-26 12:01:06.085568', '2021-02-26 12:01:06.085568', 9, 96);
+INSERT INTO base_sys_role_menu VALUES (57, '2021-02-26 12:01:06.198271', '2021-02-26 12:01:06.198271', 9, 45);
+INSERT INTO base_sys_role_menu VALUES (58, '2021-02-26 12:01:06.309736', '2021-02-26 12:01:06.309736', 9, 43);
+INSERT INTO base_sys_role_menu VALUES (59, '2021-02-26 12:01:06.410785', '2021-02-26 12:01:06.410785', 9, 49);
+INSERT INTO base_sys_role_menu VALUES (60, '2021-02-26 12:01:06.510712', '2021-02-26 12:01:06.510712', 9, 86);
+INSERT INTO base_sys_role_menu VALUES (61, '2021-02-26 12:01:06.612457', '2021-02-26 12:01:06.612457', 9, 2);
+INSERT INTO base_sys_role_menu VALUES (62, '2021-02-26 12:01:06.710397', '2021-02-26 12:01:06.710397', 9, 27);
+INSERT INTO base_sys_role_menu VALUES (63, '2021-02-26 12:01:06.809104', '2021-02-26 12:01:06.809104', 9, 97);
+INSERT INTO base_sys_role_menu VALUES (64, '2021-02-26 12:01:06.907088', '2021-02-26 12:01:06.907088', 9, 59);
+INSERT INTO base_sys_role_menu VALUES (65, '2021-02-26 12:01:07.009988', '2021-02-26 12:01:07.009988', 9, 60);
+INSERT INTO base_sys_role_menu VALUES (66, '2021-02-26 12:01:07.122372', '2021-02-26 12:01:07.122372', 9, 61);
+INSERT INTO base_sys_role_menu VALUES (67, '2021-02-26 12:01:07.223694', '2021-02-26 12:01:07.223694', 9, 62);
+INSERT INTO base_sys_role_menu VALUES (68, '2021-02-26 12:01:07.325022', '2021-02-26 12:01:07.325022', 9, 63);
+INSERT INTO base_sys_role_menu VALUES (69, '2021-02-26 12:01:07.425209', '2021-02-26 12:01:07.425209', 9, 65);
+INSERT INTO base_sys_role_menu VALUES (70, '2021-02-26 12:01:07.522081', '2021-02-26 12:01:07.522081', 9, 98);
+INSERT INTO base_sys_role_menu VALUES (71, '2021-02-26 12:01:07.622775', '2021-02-26 12:01:07.622775', 9, 99);
+INSERT INTO base_sys_role_menu VALUES (72, '2021-02-26 12:01:07.721181', '2021-02-26 12:01:07.721181', 9, 100);
+INSERT INTO base_sys_role_menu VALUES (73, '2021-02-26 12:01:07.819589', '2021-02-26 12:01:07.819589', 9, 101);
+INSERT INTO base_sys_role_menu VALUES (74, '2021-02-26 12:01:07.920497', '2021-02-26 12:01:07.920497', 9, 8);
+INSERT INTO base_sys_role_menu VALUES (75, '2021-02-26 12:01:08.018875', '2021-02-26 12:01:08.018875', 9, 10);
+INSERT INTO base_sys_role_menu VALUES (76, '2021-02-26 12:01:08.135192', '2021-02-26 12:01:08.135192', 9, 11);
+INSERT INTO base_sys_role_menu VALUES (77, '2021-02-26 12:01:08.246405', '2021-02-26 12:01:08.246405', 9, 12);
+INSERT INTO base_sys_role_menu VALUES (78, '2021-02-26 12:01:08.346661', '2021-02-26 12:01:08.346661', 9, 13);
+INSERT INTO base_sys_role_menu VALUES (79, '2021-02-26 12:01:08.448436', '2021-02-26 12:01:08.448436', 9, 22);
+INSERT INTO base_sys_role_menu VALUES (80, '2021-02-26 12:01:08.547496', '2021-02-26 12:01:08.547496', 9, 23);
+INSERT INTO base_sys_role_menu VALUES (81, '2021-02-26 12:01:08.648457', '2021-02-26 12:01:08.648457', 9, 24);
+INSERT INTO base_sys_role_menu VALUES (82, '2021-02-26 12:01:08.750564', '2021-02-26 12:01:08.750564', 9, 25);
+INSERT INTO base_sys_role_menu VALUES (83, '2021-02-26 12:01:08.851783', '2021-02-26 12:01:08.851783', 9, 26);
+INSERT INTO base_sys_role_menu VALUES (84, '2021-02-26 12:01:08.950898', '2021-02-26 12:01:08.950898', 9, 69);
+INSERT INTO base_sys_role_menu VALUES (85, '2021-02-26 12:01:09.061982', '2021-02-26 12:01:09.061982', 9, 70);
+INSERT INTO base_sys_role_menu VALUES (86, '2021-02-26 12:01:09.165258', '2021-02-26 12:01:09.165258', 9, 71);
+INSERT INTO base_sys_role_menu VALUES (87, '2021-02-26 12:01:09.266177', '2021-02-26 12:01:09.266177', 9, 72);
+INSERT INTO base_sys_role_menu VALUES (88, '2021-02-26 12:01:09.366427', '2021-02-26 12:01:09.366427', 9, 73);
+INSERT INTO base_sys_role_menu VALUES (89, '2021-02-26 12:01:09.467877', '2021-02-26 12:01:09.467877', 9, 74);
+INSERT INTO base_sys_role_menu VALUES (90, '2021-02-26 12:01:09.568526', '2021-02-26 12:01:09.568526', 9, 75);
+INSERT INTO base_sys_role_menu VALUES (91, '2021-02-26 12:01:09.668052', '2021-02-26 12:01:09.668052', 9, 76);
+INSERT INTO base_sys_role_menu VALUES (92, '2021-02-26 12:01:09.766367', '2021-02-26 12:01:09.766367', 9, 77);
+INSERT INTO base_sys_role_menu VALUES (93, '2021-02-26 12:01:09.866170', '2021-02-26 12:01:09.866170', 9, 78);
+INSERT INTO base_sys_role_menu VALUES (94, '2021-02-26 12:01:09.963037', '2021-02-26 12:01:09.963037', 9, 79);
+INSERT INTO base_sys_role_menu VALUES (95, '2021-02-26 12:01:10.082046', '2021-02-26 12:01:10.082046', 9, 80);
+INSERT INTO base_sys_role_menu VALUES (96, '2021-02-26 12:01:10.185024', '2021-02-26 12:01:10.185024', 9, 81);
+INSERT INTO base_sys_role_menu VALUES (97, '2021-02-26 12:01:10.283787', '2021-02-26 12:01:10.283787', 9, 82);
+INSERT INTO base_sys_role_menu VALUES (98, '2021-02-26 12:01:10.382883', '2021-02-26 12:01:10.382883', 9, 83);
+INSERT INTO base_sys_role_menu VALUES (99, '2021-02-26 12:01:10.481150', '2021-02-26 12:01:10.481150', 9, 105);
+INSERT INTO base_sys_role_menu VALUES (100, '2021-02-26 12:01:10.579579', '2021-02-26 12:01:10.579579', 9, 102);
+INSERT INTO base_sys_role_menu VALUES (101, '2021-02-26 12:01:10.679489', '2021-02-26 12:01:10.679489', 9, 103);
+INSERT INTO base_sys_role_menu VALUES (102, '2021-02-26 12:01:10.777496', '2021-02-26 12:01:10.777496', 9, 29);
+INSERT INTO base_sys_role_menu VALUES (103, '2021-02-26 12:01:10.878292', '2021-02-26 12:01:10.878292', 9, 30);
+INSERT INTO base_sys_role_menu VALUES (104, '2021-02-26 12:01:10.977354', '2021-02-26 12:01:10.977354', 9, 47);
+INSERT INTO base_sys_role_menu VALUES (105, '2021-02-26 12:01:11.097786', '2021-02-26 12:01:11.097786', 9, 48);
+INSERT INTO base_sys_role_menu VALUES (106, '2021-02-26 12:01:11.201390', '2021-02-26 12:01:11.201390', 9, 84);
+INSERT INTO base_sys_role_menu VALUES (107, '2021-02-26 12:01:11.302120', '2021-02-26 12:01:11.302120', 9, 90);
+INSERT INTO base_sys_role_menu VALUES (108, '2021-02-26 12:01:11.402751', '2021-02-26 12:01:11.402751', 9, 85);
+INSERT INTO base_sys_role_menu VALUES (161, '2021-02-26 14:16:49.162546', '2021-02-26 14:16:49.162546', 11, 1);
+INSERT INTO base_sys_role_menu VALUES (162, '2021-02-26 14:16:49.257677', '2021-02-26 14:16:49.257677', 11, 96);
+INSERT INTO base_sys_role_menu VALUES (163, '2021-02-26 14:16:49.356225', '2021-02-26 14:16:49.356225', 11, 45);
+INSERT INTO base_sys_role_menu VALUES (164, '2021-02-26 14:16:49.450708', '2021-02-26 14:16:49.450708', 11, 43);
+INSERT INTO base_sys_role_menu VALUES (165, '2021-02-26 14:16:49.543794', '2021-02-26 14:16:49.543794', 11, 49);
+INSERT INTO base_sys_role_menu VALUES (166, '2021-02-26 14:16:49.636496', '2021-02-26 14:16:49.636496', 11, 86);
+INSERT INTO base_sys_role_menu VALUES (167, '2021-02-26 14:16:49.728634', '2021-02-26 14:16:49.728634', 11, 47);
+INSERT INTO base_sys_role_menu VALUES (168, '2021-02-26 14:16:49.824754', '2021-02-26 14:16:49.824754', 11, 48);
+INSERT INTO base_sys_role_menu VALUES (169, '2021-02-26 14:16:49.919329', '2021-02-26 14:16:49.919329', 11, 85);
+INSERT INTO base_sys_role_menu VALUES (170, '2021-02-26 14:16:50.015239', '2021-02-26 14:16:50.015239', 11, 84);
+INSERT INTO base_sys_role_menu VALUES (290, '2021-02-26 14:32:35.143867', '2021-02-26 14:32:35.143867', 12, 1);
+INSERT INTO base_sys_role_menu VALUES (291, '2021-02-26 14:32:35.239965', '2021-02-26 14:32:35.239965', 12, 96);
+INSERT INTO base_sys_role_menu VALUES (292, '2021-02-26 14:32:35.336398', '2021-02-26 14:32:35.336398', 12, 45);
+INSERT INTO base_sys_role_menu VALUES (293, '2021-02-26 14:32:35.435180', '2021-02-26 14:32:35.435180', 12, 43);
+INSERT INTO base_sys_role_menu VALUES (294, '2021-02-26 14:32:35.528631', '2021-02-26 14:32:35.528631', 12, 49);
+INSERT INTO base_sys_role_menu VALUES (295, '2021-02-26 14:32:35.623123', '2021-02-26 14:32:35.623123', 12, 86);
+INSERT INTO base_sys_role_menu VALUES (296, '2021-02-26 14:32:35.718831', '2021-02-26 14:32:35.718831', 12, 2);
+INSERT INTO base_sys_role_menu VALUES (297, '2021-02-26 14:32:35.812975', '2021-02-26 14:32:35.812975', 12, 27);
+INSERT INTO base_sys_role_menu VALUES (298, '2021-02-26 14:32:35.904487', '2021-02-26 14:32:35.904487', 12, 97);
+INSERT INTO base_sys_role_menu VALUES (299, '2021-02-26 14:32:35.998773', '2021-02-26 14:32:35.998773', 12, 59);
+INSERT INTO base_sys_role_menu VALUES (300, '2021-02-26 14:32:36.107749', '2021-02-26 14:32:36.107749', 12, 60);
+INSERT INTO base_sys_role_menu VALUES (301, '2021-02-26 14:32:36.213069', '2021-02-26 14:32:36.213069', 12, 61);
+INSERT INTO base_sys_role_menu VALUES (302, '2021-02-26 14:32:36.308985', '2021-02-26 14:32:36.308985', 12, 62);
+INSERT INTO base_sys_role_menu VALUES (303, '2021-02-26 14:32:36.404237', '2021-02-26 14:32:36.404237', 12, 63);
+INSERT INTO base_sys_role_menu VALUES (304, '2021-02-26 14:32:36.499569', '2021-02-26 14:32:36.499569', 12, 65);
+INSERT INTO base_sys_role_menu VALUES (305, '2021-02-26 14:32:36.593710', '2021-02-26 14:32:36.593710', 12, 98);
+INSERT INTO base_sys_role_menu VALUES (306, '2021-02-26 14:32:36.685988', '2021-02-26 14:32:36.685988', 12, 99);
+INSERT INTO base_sys_role_menu VALUES (307, '2021-02-26 14:32:36.778733', '2021-02-26 14:32:36.778733', 12, 100);
+INSERT INTO base_sys_role_menu VALUES (308, '2021-02-26 14:32:36.874715', '2021-02-26 14:32:36.874715', 12, 101);
+INSERT INTO base_sys_role_menu VALUES (309, '2021-02-26 14:32:36.973153', '2021-02-26 14:32:36.973153', 12, 8);
+INSERT INTO base_sys_role_menu VALUES (310, '2021-02-26 14:32:37.082734', '2021-02-26 14:32:37.082734', 12, 10);
+INSERT INTO base_sys_role_menu VALUES (311, '2021-02-26 14:32:37.176859', '2021-02-26 14:32:37.176859', 12, 11);
+INSERT INTO base_sys_role_menu VALUES (312, '2021-02-26 14:32:37.271440', '2021-02-26 14:32:37.271440', 12, 12);
+INSERT INTO base_sys_role_menu VALUES (313, '2021-02-26 14:32:37.365206', '2021-02-26 14:32:37.365206', 12, 13);
+INSERT INTO base_sys_role_menu VALUES (314, '2021-02-26 14:32:37.457092', '2021-02-26 14:32:37.457092', 12, 22);
+INSERT INTO base_sys_role_menu VALUES (315, '2021-02-26 14:32:37.549860', '2021-02-26 14:32:37.549860', 12, 23);
+INSERT INTO base_sys_role_menu VALUES (316, '2021-02-26 14:32:37.645684', '2021-02-26 14:32:37.645684', 12, 24);
+INSERT INTO base_sys_role_menu VALUES (317, '2021-02-26 14:32:37.743370', '2021-02-26 14:32:37.743370', 12, 25);
+INSERT INTO base_sys_role_menu VALUES (318, '2021-02-26 14:32:37.837218', '2021-02-26 14:32:37.837218', 12, 26);
+INSERT INTO base_sys_role_menu VALUES (319, '2021-02-26 14:32:37.930953', '2021-02-26 14:32:37.930953', 12, 69);
+INSERT INTO base_sys_role_menu VALUES (320, '2021-02-26 14:32:38.031191', '2021-02-26 14:32:38.031191', 12, 70);
+INSERT INTO base_sys_role_menu VALUES (321, '2021-02-26 14:32:38.130839', '2021-02-26 14:32:38.130839', 12, 71);
+INSERT INTO base_sys_role_menu VALUES (322, '2021-02-26 14:32:38.229359', '2021-02-26 14:32:38.229359', 12, 72);
+INSERT INTO base_sys_role_menu VALUES (323, '2021-02-26 14:32:38.323868', '2021-02-26 14:32:38.323868', 12, 73);
+INSERT INTO base_sys_role_menu VALUES (324, '2021-02-26 14:32:38.415194', '2021-02-26 14:32:38.415194', 12, 74);
+INSERT INTO base_sys_role_menu VALUES (325, '2021-02-26 14:32:38.505597', '2021-02-26 14:32:38.505597', 12, 75);
+INSERT INTO base_sys_role_menu VALUES (326, '2021-02-26 14:32:38.600426', '2021-02-26 14:32:38.600426', 12, 76);
+INSERT INTO base_sys_role_menu VALUES (327, '2021-02-26 14:32:38.698676', '2021-02-26 14:32:38.698676', 12, 77);
+INSERT INTO base_sys_role_menu VALUES (328, '2021-02-26 14:32:38.793832', '2021-02-26 14:32:38.793832', 12, 78);
+INSERT INTO base_sys_role_menu VALUES (329, '2021-02-26 14:32:38.889203', '2021-02-26 14:32:38.889203', 12, 79);
+INSERT INTO base_sys_role_menu VALUES (330, '2021-02-26 14:32:38.985851', '2021-02-26 14:32:38.985851', 12, 80);
+INSERT INTO base_sys_role_menu VALUES (331, '2021-02-26 14:32:39.092110', '2021-02-26 14:32:39.092110', 12, 81);
+INSERT INTO base_sys_role_menu VALUES (332, '2021-02-26 14:32:39.188945', '2021-02-26 14:32:39.188945', 12, 82);
+INSERT INTO base_sys_role_menu VALUES (333, '2021-02-26 14:32:39.280043', '2021-02-26 14:32:39.280043', 12, 83);
+INSERT INTO base_sys_role_menu VALUES (334, '2021-02-26 14:32:39.374899', '2021-02-26 14:32:39.374899', 12, 105);
+INSERT INTO base_sys_role_menu VALUES (335, '2021-02-26 14:32:39.473563', '2021-02-26 14:32:39.473563', 12, 102);
+INSERT INTO base_sys_role_menu VALUES (336, '2021-02-26 14:32:39.570921', '2021-02-26 14:32:39.570921', 12, 103);
+INSERT INTO base_sys_role_menu VALUES (337, '2021-02-26 14:32:39.665052', '2021-02-26 14:32:39.665052', 12, 29);
+INSERT INTO base_sys_role_menu VALUES (338, '2021-02-26 14:32:39.760189', '2021-02-26 14:32:39.760189', 12, 30);
+INSERT INTO base_sys_role_menu VALUES (339, '2021-02-26 14:32:39.852856', '2021-02-26 14:32:39.852856', 12, 47);
+INSERT INTO base_sys_role_menu VALUES (340, '2021-02-26 14:32:39.944180', '2021-02-26 14:32:39.944180', 12, 48);
+INSERT INTO base_sys_role_menu VALUES (341, '2021-02-26 14:32:40.038086', '2021-02-26 14:32:40.038086', 12, 84);
+INSERT INTO base_sys_role_menu VALUES (342, '2021-02-26 14:32:40.135874', '2021-02-26 14:32:40.135874', 12, 90);
+INSERT INTO base_sys_role_menu VALUES (343, '2021-02-26 14:32:40.234015', '2021-02-26 14:32:40.234015', 12, 85);
+INSERT INTO base_sys_role_menu VALUES (355, '2021-02-26 14:32:54.538822', '2021-02-26 14:32:54.538822', 10, 1);
+INSERT INTO base_sys_role_menu VALUES (356, '2021-02-26 14:32:54.634784', '2021-02-26 14:32:54.634784', 10, 96);
+INSERT INTO base_sys_role_menu VALUES (357, '2021-02-26 14:32:54.732878', '2021-02-26 14:32:54.732878', 10, 45);
+INSERT INTO base_sys_role_menu VALUES (358, '2021-02-26 14:32:54.826023', '2021-02-26 14:32:54.826023', 10, 43);
+INSERT INTO base_sys_role_menu VALUES (359, '2021-02-26 14:32:54.920173', '2021-02-26 14:32:54.920173', 10, 49);
+INSERT INTO base_sys_role_menu VALUES (360, '2021-02-26 14:32:55.019141', '2021-02-26 14:32:55.019141', 10, 86);
+INSERT INTO base_sys_role_menu VALUES (361, '2021-02-26 14:32:55.119438', '2021-02-26 14:32:55.119438', 10, 2);
+INSERT INTO base_sys_role_menu VALUES (362, '2021-02-26 14:32:55.211471', '2021-02-26 14:32:55.211471', 10, 27);
+INSERT INTO base_sys_role_menu VALUES (363, '2021-02-26 14:32:55.304855', '2021-02-26 14:32:55.304855', 10, 97);
+INSERT INTO base_sys_role_menu VALUES (364, '2021-02-26 14:32:55.397939', '2021-02-26 14:32:55.397939', 10, 59);
+INSERT INTO base_sys_role_menu VALUES (365, '2021-02-26 14:32:55.491674', '2021-02-26 14:32:55.491674', 10, 60);
+INSERT INTO base_sys_role_menu VALUES (366, '2021-02-26 14:32:55.584051', '2021-02-26 14:32:55.584051', 10, 61);
+INSERT INTO base_sys_role_menu VALUES (367, '2021-02-26 14:32:55.676449', '2021-02-26 14:32:55.676449', 10, 62);
+INSERT INTO base_sys_role_menu VALUES (368, '2021-02-26 14:32:55.774524', '2021-02-26 14:32:55.774524', 10, 63);
+INSERT INTO base_sys_role_menu VALUES (369, '2021-02-26 14:32:55.871634', '2021-02-26 14:32:55.871634', 10, 65);
+INSERT INTO base_sys_role_menu VALUES (370, '2021-02-26 14:32:55.964611', '2021-02-26 14:32:55.964611', 10, 98);
+INSERT INTO base_sys_role_menu VALUES (371, '2021-02-26 14:32:56.074043', '2021-02-26 14:32:56.074043', 10, 99);
+INSERT INTO base_sys_role_menu VALUES (372, '2021-02-26 14:32:56.169316', '2021-02-26 14:32:56.169316', 10, 100);
+INSERT INTO base_sys_role_menu VALUES (373, '2021-02-26 14:32:56.263408', '2021-02-26 14:32:56.263408', 10, 101);
+INSERT INTO base_sys_role_menu VALUES (374, '2021-02-26 14:32:56.356537', '2021-02-26 14:32:56.356537', 10, 8);
+INSERT INTO base_sys_role_menu VALUES (375, '2021-02-26 14:32:56.448195', '2021-02-26 14:32:56.448195', 10, 10);
+INSERT INTO base_sys_role_menu VALUES (376, '2021-02-26 14:32:56.544394', '2021-02-26 14:32:56.544394', 10, 11);
+INSERT INTO base_sys_role_menu VALUES (377, '2021-02-26 14:32:56.641515', '2021-02-26 14:32:56.641515', 10, 12);
+INSERT INTO base_sys_role_menu VALUES (378, '2021-02-26 14:32:56.735242', '2021-02-26 14:32:56.735242', 10, 13);
+INSERT INTO base_sys_role_menu VALUES (379, '2021-02-26 14:32:56.828811', '2021-02-26 14:32:56.828811', 10, 22);
+INSERT INTO base_sys_role_menu VALUES (380, '2021-02-26 14:32:56.922664', '2021-02-26 14:32:56.922664', 10, 23);
+INSERT INTO base_sys_role_menu VALUES (381, '2021-02-26 14:32:57.016873', '2021-02-26 14:32:57.016873', 10, 24);
+INSERT INTO base_sys_role_menu VALUES (382, '2021-02-26 14:32:57.123800', '2021-02-26 14:32:57.123800', 10, 25);
+INSERT INTO base_sys_role_menu VALUES (383, '2021-02-26 14:32:57.223306', '2021-02-26 14:32:57.223306', 10, 26);
+INSERT INTO base_sys_role_menu VALUES (384, '2021-02-26 14:32:57.328482', '2021-02-26 14:32:57.328482', 10, 69);
+INSERT INTO base_sys_role_menu VALUES (385, '2021-02-26 14:32:57.430006', '2021-02-26 14:32:57.430006', 10, 70);
+INSERT INTO base_sys_role_menu VALUES (386, '2021-02-26 14:32:57.521664', '2021-02-26 14:32:57.521664', 10, 71);
+INSERT INTO base_sys_role_menu VALUES (387, '2021-02-26 14:32:57.612399', '2021-02-26 14:32:57.612399', 10, 72);
+INSERT INTO base_sys_role_menu VALUES (388, '2021-02-26 14:32:57.705553', '2021-02-26 14:32:57.705553', 10, 73);
+INSERT INTO base_sys_role_menu VALUES (389, '2021-02-26 14:32:57.799288', '2021-02-26 14:32:57.799288', 10, 74);
+INSERT INTO base_sys_role_menu VALUES (390, '2021-02-26 14:32:57.893894', '2021-02-26 14:32:57.893894', 10, 75);
+INSERT INTO base_sys_role_menu VALUES (391, '2021-02-26 14:32:57.988856', '2021-02-26 14:32:57.988856', 10, 76);
+INSERT INTO base_sys_role_menu VALUES (392, '2021-02-26 14:32:58.090250', '2021-02-26 14:32:58.090250', 10, 77);
+INSERT INTO base_sys_role_menu VALUES (393, '2021-02-26 14:32:58.196616', '2021-02-26 14:32:58.196616', 10, 78);
+INSERT INTO base_sys_role_menu VALUES (394, '2021-02-26 14:32:58.288151', '2021-02-26 14:32:58.288151', 10, 79);
+INSERT INTO base_sys_role_menu VALUES (395, '2021-02-26 14:32:58.378493', '2021-02-26 14:32:58.378493', 10, 80);
+INSERT INTO base_sys_role_menu VALUES (396, '2021-02-26 14:32:58.471283', '2021-02-26 14:32:58.471283', 10, 81);
+INSERT INTO base_sys_role_menu VALUES (397, '2021-02-26 14:32:58.564666', '2021-02-26 14:32:58.564666', 10, 82);
+INSERT INTO base_sys_role_menu VALUES (398, '2021-02-26 14:32:58.658511', '2021-02-26 14:32:58.658511', 10, 83);
+INSERT INTO base_sys_role_menu VALUES (399, '2021-02-26 14:32:58.752713', '2021-02-26 14:32:58.752713', 10, 105);
+INSERT INTO base_sys_role_menu VALUES (400, '2021-02-26 14:32:58.849472', '2021-02-26 14:32:58.849472', 10, 102);
+INSERT INTO base_sys_role_menu VALUES (401, '2021-02-26 14:32:58.948387', '2021-02-26 14:32:58.948387', 10, 103);
+INSERT INTO base_sys_role_menu VALUES (402, '2021-02-26 14:32:59.042410', '2021-02-26 14:32:59.042410', 10, 29);
+INSERT INTO base_sys_role_menu VALUES (403, '2021-02-26 14:32:59.132594', '2021-02-26 14:32:59.132594', 10, 30);
+INSERT INTO base_sys_role_menu VALUES (404, '2021-02-26 14:32:59.226150', '2021-02-26 14:32:59.226150', 10, 47);
+INSERT INTO base_sys_role_menu VALUES (405, '2021-02-26 14:32:59.319494', '2021-02-26 14:32:59.319494', 10, 48);
+INSERT INTO base_sys_role_menu VALUES (406, '2021-02-26 14:32:59.413370', '2021-02-26 14:32:59.413370', 10, 84);
+INSERT INTO base_sys_role_menu VALUES (407, '2021-02-26 14:32:59.507584', '2021-02-26 14:32:59.507584', 10, 90);
+INSERT INTO base_sys_role_menu VALUES (408, '2021-02-26 14:32:59.604332', '2021-02-26 14:32:59.604332', 10, 85);
+INSERT INTO base_sys_role_menu VALUES (517, '2023-02-20 11:01:17.272678', '2023-02-20 11:01:17.272678', 13, 1);
+INSERT INTO base_sys_role_menu VALUES (518, '2023-02-20 11:01:17.384384', '2023-02-20 11:01:17.384384', 13, 96);
+INSERT INTO base_sys_role_menu VALUES (519, '2023-02-20 11:01:17.509665', '2023-02-20 11:01:17.509665', 13, 45);
+INSERT INTO base_sys_role_menu VALUES (520, '2023-02-20 11:01:17.613195', '2023-02-20 11:01:17.613195', 13, 43);
+INSERT INTO base_sys_role_menu VALUES (521, '2023-02-20 11:01:17.717865', '2023-02-20 11:01:17.717865', 13, 49);
+INSERT INTO base_sys_role_menu VALUES (522, '2023-02-20 11:01:17.821450', '2023-02-20 11:01:17.821450', 13, 86);
+INSERT INTO base_sys_role_menu VALUES (523, '2023-02-20 11:01:17.928597', '2023-02-20 11:01:17.928597', 13, 2);
+INSERT INTO base_sys_role_menu VALUES (524, '2023-02-20 11:01:18.042256', '2023-02-20 11:01:18.042256', 13, 27);
+INSERT INTO base_sys_role_menu VALUES (525, '2023-02-20 11:01:18.152961', '2023-02-20 11:01:18.152961', 13, 97);
+INSERT INTO base_sys_role_menu VALUES (526, '2023-02-20 11:01:18.264862', '2023-02-20 11:01:18.264862', 13, 59);
+INSERT INTO base_sys_role_menu VALUES (527, '2023-02-20 11:01:18.375556', '2023-02-20 11:01:18.375556', 13, 60);
+INSERT INTO base_sys_role_menu VALUES (528, '2023-02-20 11:01:18.486312', '2023-02-20 11:01:18.486312', 13, 61);
+INSERT INTO base_sys_role_menu VALUES (529, '2023-02-20 11:01:18.604764', '2023-02-20 11:01:18.604764', 13, 62);
+INSERT INTO base_sys_role_menu VALUES (530, '2023-02-20 11:01:18.708506', '2023-02-20 11:01:18.708506', 13, 63);
+INSERT INTO base_sys_role_menu VALUES (531, '2023-02-20 11:01:18.810557', '2023-02-20 11:01:18.810557', 13, 65);
+INSERT INTO base_sys_role_menu VALUES (532, '2023-02-20 11:01:18.912572', '2023-02-20 11:01:18.912572', 13, 98);
+INSERT INTO base_sys_role_menu VALUES (533, '2023-02-20 11:01:19.012174', '2023-02-20 11:01:19.012174', 13, 99);
+INSERT INTO base_sys_role_menu VALUES (534, '2023-02-20 11:01:19.111748', '2023-02-20 11:01:19.111748', 13, 100);
+INSERT INTO base_sys_role_menu VALUES (535, '2023-02-20 11:01:19.210923', '2023-02-20 11:01:19.210923', 13, 101);
+INSERT INTO base_sys_role_menu VALUES (536, '2023-02-20 11:01:19.314189', '2023-02-20 11:01:19.314189', 13, 8);
+INSERT INTO base_sys_role_menu VALUES (537, '2023-02-20 11:01:19.428883', '2023-02-20 11:01:19.428883', 13, 10);
+INSERT INTO base_sys_role_menu VALUES (538, '2023-02-20 11:01:19.552934', '2023-02-20 11:01:19.552934', 13, 11);
+INSERT INTO base_sys_role_menu VALUES (539, '2023-02-20 11:01:19.663284', '2023-02-20 11:01:19.663284', 13, 12);
+INSERT INTO base_sys_role_menu VALUES (540, '2023-02-20 11:01:19.771651', '2023-02-20 11:01:19.771651', 13, 13);
+INSERT INTO base_sys_role_menu VALUES (541, '2023-02-20 11:01:19.879238', '2023-02-20 11:01:19.879238', 13, 22);
+INSERT INTO base_sys_role_menu VALUES (542, '2023-02-20 11:01:19.987001', '2023-02-20 11:01:19.987001', 13, 23);
+INSERT INTO base_sys_role_menu VALUES (543, '2023-02-20 11:01:20.095790', '2023-02-20 11:01:20.095790', 13, 24);
+INSERT INTO base_sys_role_menu VALUES (544, '2023-02-20 11:01:20.201315', '2023-02-20 11:01:20.201315', 13, 25);
+INSERT INTO base_sys_role_menu VALUES (545, '2023-02-20 11:01:20.308299', '2023-02-20 11:01:20.308299', 13, 26);
+INSERT INTO base_sys_role_menu VALUES (546, '2023-02-20 11:01:20.414844', '2023-02-20 11:01:20.414844', 13, 69);
+INSERT INTO base_sys_role_menu VALUES (547, '2023-02-20 11:01:20.528804', '2023-02-20 11:01:20.528804', 13, 70);
+INSERT INTO base_sys_role_menu VALUES (548, '2023-02-20 11:01:20.635504', '2023-02-20 11:01:20.635504', 13, 71);
+INSERT INTO base_sys_role_menu VALUES (549, '2023-02-20 11:01:20.749819', '2023-02-20 11:01:20.749819', 13, 72);
+INSERT INTO base_sys_role_menu VALUES (550, '2023-02-20 11:01:20.864884', '2023-02-20 11:01:20.864884', 13, 73);
+INSERT INTO base_sys_role_menu VALUES (551, '2023-02-20 11:01:20.970192', '2023-02-20 11:01:20.970192', 13, 74);
+INSERT INTO base_sys_role_menu VALUES (552, '2023-02-20 11:01:21.074434', '2023-02-20 11:01:21.074434', 13, 75);
+INSERT INTO base_sys_role_menu VALUES (553, '2023-02-20 11:01:21.179895', '2023-02-20 11:01:21.179895', 13, 76);
+INSERT INTO base_sys_role_menu VALUES (554, '2023-02-20 11:01:21.286653', '2023-02-20 11:01:21.286653', 13, 77);
+INSERT INTO base_sys_role_menu VALUES (555, '2023-02-20 11:01:21.389230', '2023-02-20 11:01:21.389230', 13, 78);
+INSERT INTO base_sys_role_menu VALUES (556, '2023-02-20 11:01:21.498122', '2023-02-20 11:01:21.498122', 13, 79);
+INSERT INTO base_sys_role_menu VALUES (557, '2023-02-20 11:01:21.608182', '2023-02-20 11:01:21.608182', 13, 80);
+INSERT INTO base_sys_role_menu VALUES (558, '2023-02-20 11:01:21.716534', '2023-02-20 11:01:21.716534', 13, 81);
+INSERT INTO base_sys_role_menu VALUES (559, '2023-02-20 11:01:21.821921', '2023-02-20 11:01:21.821921', 13, 82);
+INSERT INTO base_sys_role_menu VALUES (560, '2023-02-20 11:01:21.924088', '2023-02-20 11:01:21.924088', 13, 83);
+INSERT INTO base_sys_role_menu VALUES (561, '2023-02-20 11:01:22.027509', '2023-02-20 11:01:22.027509', 13, 105);
+INSERT INTO base_sys_role_menu VALUES (562, '2023-02-20 11:01:22.138587', '2023-02-20 11:01:22.138587', 13, 102);
+INSERT INTO base_sys_role_menu VALUES (563, '2023-02-20 11:01:22.248197', '2023-02-20 11:01:22.248197', 13, 103);
+INSERT INTO base_sys_role_menu VALUES (564, '2023-02-20 11:01:22.348024', '2023-02-20 11:01:22.348024', 13, 29);
+INSERT INTO base_sys_role_menu VALUES (565, '2023-02-20 11:01:22.450315', '2023-02-20 11:01:22.450315', 13, 30);
+INSERT INTO base_sys_role_menu VALUES (566, '2023-02-20 11:01:22.561988', '2023-02-20 11:01:22.561988', 13, 47);
+INSERT INTO base_sys_role_menu VALUES (567, '2023-02-20 11:01:22.672138', '2023-02-20 11:01:22.672138', 13, 48);
+INSERT INTO base_sys_role_menu VALUES (568, '2023-02-20 11:01:22.791173', '2023-02-20 11:01:22.791173', 13, 84);
+INSERT INTO base_sys_role_menu VALUES (569, '2023-02-20 11:01:22.898018', '2023-02-20 11:01:22.898018', 13, 90);
+INSERT INTO base_sys_role_menu VALUES (570, '2023-02-20 11:01:23.008575', '2023-02-20 11:01:23.008575', 13, 85);
+COMMIT;
+
+-- ----------------------------
+-- Table structure for base_sys_user
+-- ----------------------------
+DROP TABLE IF EXISTS base_sys_user;
+CREATE TABLE base_sys_user (
+  id SERIAL ,
+  createTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ,
+  updateTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ,
+  departmentId int DEFAULT NULL ,
+  name varchar(255)   DEFAULT NULL ,
+  username varchar(100)   NOT NULL ,
+  password varchar(255)   NOT NULL ,
+  passwordV int NOT NULL DEFAULT '1' ,
+  nickName varchar(255)   DEFAULT NULL ,
+  headImg varchar(255)   DEFAULT NULL ,
+  phone varchar(20)   DEFAULT NULL ,
+  email varchar(255)   DEFAULT NULL ,
+  status smallint NOT NULL DEFAULT '1' ,
+  remark varchar(255)   DEFAULT NULL ,
+  socketId varchar(255)   DEFAULT NULL ,
+  PRIMARY KEY (id) ,
+  constraint IDX_469ad55973f5b98930f6ad627b unique(username) 
+) ;
+create index  base_sys_user_index  on  base_sys_user(departmentId,phone,createTime,updateTime);
+
+
+CREATE TRIGGER "updateTime" BEFORE UPDATE ON "base_sys_user"
+FOR EACH ROW
+EXECUTE PROCEDURE "upd_timestamp"();
+
+COMMENT ON COLUMN base_sys_user.id IS 'ID';
+COMMENT ON COLUMN base_sys_user.createTime IS '创建时间';
+COMMENT ON COLUMN base_sys_user.updateTime IS '更新时间';
+COMMENT ON COLUMN base_sys_user.departmentId IS '部门ID';
+COMMENT ON COLUMN base_sys_user.name IS '姓名';
+COMMENT ON COLUMN base_sys_user.username IS '用户名';
+COMMENT ON COLUMN base_sys_user.password IS '密码';
+COMMENT ON COLUMN base_sys_user.passwordV IS '密码版本, 作用是改完密码,让原来的token失效';
+COMMENT ON COLUMN base_sys_user.nickName IS '昵称';
+COMMENT ON COLUMN base_sys_user.headImg IS '头像';
+COMMENT ON COLUMN base_sys_user.phone IS '手机';
+COMMENT ON COLUMN base_sys_user.email IS '邮箱';
+COMMENT ON COLUMN base_sys_user.status IS '状态 0:禁用 1:启用';
+COMMENT ON COLUMN base_sys_user.remark IS '备注';
+COMMENT ON COLUMN base_sys_user.socketId IS 'socketId';
+
+-- ----------------------------
+-- Records of base_sys_user
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_user VALUES (1, '2021-02-24 21:16:41.525157', '2023-03-08 15:11:51.000000', 1, '超级管理员', 'admin', 'e10adc3949ba59abbe56e057f20f883e', 7, '管理员', 'https://show.cool-admin.com/api/public/uploads/20230308/c731b0cba84046268b10edbbcf36f948_315c243a448e1369fa145c5ea3f020da.gif', '18000000000', 'team@cool-js.com', 1, '拥有最高权限的用户', NULL);
+INSERT INTO base_sys_user VALUES (24, '2021-02-26 14:17:38.000000', '2023-03-06 20:18:58.000000', 1, '小白', 'xiaobai', 'e10adc3949ba59abbe56e057f20f883e', 1, '小白', 'https://show.cool-admin.com/api/public/uploads/20230306/2e8a293ebfd8495083af93da141b045e_f85bccf6f4cf4890aea4e963e658fb94_1675933340_tplv-dy-cropcenter_323_430.jpg', NULL, NULL, 1, NULL, NULL);
+INSERT INTO base_sys_user VALUES (25, '2021-02-26 14:28:25.000000', '2023-03-06 20:18:53.000000', 1, '小黑', 'xiaohei', 'e10adc3949ba59abbe56e057f20f883e', 1, '小黑', 'https://show.cool-admin.com/api/public/uploads/20230306/0bd3095dd14c4ef89cf1e04c66b62900_e7b3653e07224702a1e8f246453d7d72_tplv-dy-cropcenter_323_430.jpg', NULL, NULL, 1, NULL, NULL);
+INSERT INTO base_sys_user VALUES (26, '2021-02-26 14:28:49.000000', '2023-03-06 20:18:48.000000', 1, '小绿', 'xiaolv', 'e10adc3949ba59abbe56e057f20f883e', 1, '小绿', 'https://show.cool-admin.com/api/public/uploads/20230306/84bff75c07e44eff9beef880fd91e9cb_467d1550bcfc46968deb294b756ff52e_1674986122_tplv-dy-cropcenter_323_430.jpg', NULL, NULL, 1, NULL, NULL);
+INSERT INTO base_sys_user VALUES (27, '2021-02-26 14:29:23.000000', '2023-03-07 13:15:00.000000', 1, '小青', 'xiaoqin', 'e10adc3949ba59abbe56e057f20f883e', 1, '小青', 'https://show.cool-admin.com/api/public/uploads/20230306/fb49e291d4a44c659367f17751699e04_2c0f4758d8484271be34081c8fe49adc_1675679254_tplv-dy-cropcenter_323_430.jpg', NULL, NULL, 1, NULL, NULL);
+INSERT INTO base_sys_user VALUES (28, '2021-02-26 14:29:52.000000', '2023-03-06 19:57:46.000000', 1, '神仙都没用', 'icssoa', 'e10adc3949ba59abbe56e057f20f883e', 1, '神仙都没用', 'https://show.cool-admin.com/api/public/uploads/20230306/26942e8aa783427f8ad73c1a10fcac6f_eb26da2fc07940b1bb63f1510933eb01_1676971271_tplv-dy-cropcenter_323_430.jpg', NULL, NULL, 1, NULL, NULL);
+COMMIT;
+
+-- ----------------------------
+-- Table structure for base_sys_user_role
+-- ----------------------------
+DROP TABLE IF EXISTS base_sys_user_role;
+CREATE TABLE base_sys_user_role (
+  id SERIAL,
+  createTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ,
+  updateTime TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP ,
+  userId int NOT NULL ,
+  roleId bigint NOT NULL,
+  PRIMARY KEY (id) 
+) ;
+create index  base_sys_user_role_index  on  base_sys_user_role(createTime,updateTime);
+
+CREATE TRIGGER "updateTime" BEFORE UPDATE ON "base_sys_user_role"
+FOR EACH ROW
+EXECUTE PROCEDURE "upd_timestamp"();
+
+COMMENT ON COLUMN base_sys_user_role.id IS 'ID';
+COMMENT ON COLUMN base_sys_user_role.createTime IS '创建时间';
+COMMENT ON COLUMN base_sys_user_role.updateTime IS '更新时间';
+COMMENT ON COLUMN base_sys_user_role.userId IS '用户ID';
+COMMENT ON COLUMN base_sys_user_role.roleId IS '角色ID';
+
+-- ----------------------------
+-- Records of base_sys_user_role
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_user_role VALUES (1, '2021-02-24 22:03:11.665805', '2021-02-24 22:03:11.665805', 1, 1);
+INSERT INTO base_sys_user_role VALUES (2, '2021-02-25 11:03:55.325988', '2021-02-25 11:03:55.325988', 2, 1);
+INSERT INTO base_sys_user_role VALUES (3, '2021-02-25 14:30:57.295150', '2021-02-25 14:30:57.295150', 3, 1);
+INSERT INTO base_sys_user_role VALUES (4, '2021-02-25 14:39:32.975014', '2021-02-25 14:39:32.975014', 4, 1);
+INSERT INTO base_sys_user_role VALUES (5, '2021-02-25 14:40:56.812948', '2021-02-25 14:40:56.812948', 5, 1);
+INSERT INTO base_sys_user_role VALUES (6, '2021-02-25 14:44:08.436555', '2021-02-25 14:44:08.436555', 6, 1);
+INSERT INTO base_sys_user_role VALUES (7, '2021-02-25 14:46:17.409232', '2021-02-25 14:46:17.409232', 7, 1);
+INSERT INTO base_sys_user_role VALUES (8, '2021-02-25 14:47:47.211749', '2021-02-25 14:47:47.211749', 8, 1);
+INSERT INTO base_sys_user_role VALUES (9, '2021-02-25 14:48:11.734024', '2021-02-25 14:48:11.734024', 9, 1);
+INSERT INTO base_sys_user_role VALUES (10, '2021-02-25 14:50:48.288616', '2021-02-25 14:50:48.288616', 10, 1);
+INSERT INTO base_sys_user_role VALUES (11, '2021-02-25 14:51:32.123884', '2021-02-25 14:51:32.123884', 11, 1);
+INSERT INTO base_sys_user_role VALUES (12, '2021-02-25 15:46:26.356943', '2021-02-25 15:46:26.356943', 12, 1);
+INSERT INTO base_sys_user_role VALUES (13, '2021-02-25 15:56:43.475155', '2021-02-25 15:56:43.475155', 13, 1);
+INSERT INTO base_sys_user_role VALUES (14, '2021-02-25 16:03:14.417784', '2021-02-25 16:03:14.417784', 14, 1);
+INSERT INTO base_sys_user_role VALUES (16, '2021-02-25 16:22:11.200152', '2021-02-25 16:22:11.200152', 16, 1);
+INSERT INTO base_sys_user_role VALUES (17, '2021-02-25 17:44:37.635550', '2021-02-25 17:44:37.635550', 15, 1);
+INSERT INTO base_sys_user_role VALUES (19, '2021-02-25 17:51:00.554812', '2021-02-25 17:51:00.554812', 18, 1);
+INSERT INTO base_sys_user_role VALUES (21, '2021-02-25 17:54:41.375113', '2021-02-25 17:54:41.375113', 17, 1);
+INSERT INTO base_sys_user_role VALUES (22, '2021-02-25 17:55:49.385301', '2021-02-25 17:55:49.385301', 20, 1);
+INSERT INTO base_sys_user_role VALUES (24, '2021-02-25 17:58:35.452363', '2021-02-25 17:58:35.452363', 22, 1);
+INSERT INTO base_sys_user_role VALUES (27, '2021-02-25 21:25:55.005236', '2021-02-25 21:25:55.005236', 19, 1);
+INSERT INTO base_sys_user_role VALUES (28, '2021-02-26 13:50:05.633242', '2021-02-26 13:50:05.633242', 21, 8);
+INSERT INTO base_sys_user_role VALUES (29, '2021-02-26 13:50:17.836990', '2021-02-26 13:50:17.836990', 23, 8);
+INSERT INTO base_sys_user_role VALUES (45, '2023-02-16 19:11:10.029945', '2023-02-16 19:11:10.029945', 29, 10);
+INSERT INTO base_sys_user_role VALUES (46, '2023-03-06 19:57:46.215729', '2023-03-06 19:57:46.215729', 28, 12);
+INSERT INTO base_sys_user_role VALUES (47, '2023-03-06 19:57:46.228651', '2023-03-06 19:57:46.228651', 28, 10);
+INSERT INTO base_sys_user_role VALUES (49, '2023-03-06 20:18:48.992031', '2023-03-06 20:18:48.992031', 26, 13);
+INSERT INTO base_sys_user_role VALUES (50, '2023-03-06 20:18:53.818567', '2023-03-06 20:18:53.818567', 25, 13);
+INSERT INTO base_sys_user_role VALUES (51, '2023-03-06 20:18:58.691102', '2023-03-06 20:18:58.691102', 24, 12);
+INSERT INTO base_sys_user_role VALUES (52, '2023-03-06 20:28:45.169085', '2023-03-06 20:28:45.169085', 30, 11);
+INSERT INTO base_sys_user_role VALUES (53, '2023-03-07 11:39:57.672383', '2023-03-07 11:39:57.672383', 31, 10);
+INSERT INTO base_sys_user_role VALUES (54, '2023-03-07 13:15:00.326613', '2023-03-07 13:15:00.326613', 27, 11);
+COMMIT;
+

+ 390 - 0
yxgb-admin-midway/src/modules/base/init.sql

@@ -0,0 +1,390 @@
+-- ----------------------------
+-- Records of base_sys_conf
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_conf VALUES (1, '2021-02-25 14:23:26.810981', '2021-02-25 14:23:26.810981', 'logKeep', '31');
+SELECT setval('base_sys_conf_id_seq', (SELECT max(id) FROM base_sys_conf));
+COMMIT;
+
+-- ----------------------------
+-- Records of base_sys_department
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_department VALUES (1, '2021-02-24 21:17:11.971397', '2023-03-07 00:39:53.000000', '金田', NULL, 0);
+SELECT setval('base_sys_department_id_seq', (SELECT max(id) FROM base_sys_department));
+COMMIT;
+
+-- ----------------------------
+-- Records of base_sys_log
+-- ----------------------------
+-- BEGIN;
+-- INSERT INTO base_sys_log VALUES (1, '2023-03-08 15:12:45.149843', '2023-03-08 15:12:45.149843', 1,'/admin/base/sys/log/page', '120.41.105.4','中国福建厦门', '{"page": 1, "size": 20, "sort": "desc", "order": "createTime"}' );
+-- SELECT setval('base_sys_log_id_seq', (SELECT max(id) FROM base_sys_log));
+-- COMMIT;
+
+-- ----------------------------
+-- Records of base_sys_menu
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_menu VALUES (618, '2023-03-30 13:25:33.803719', '2023-03-30 13:25:33.803719', 621, '列表查询', NULL, 'base:sys:angle:list', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (619, '2023-03-30 13:25:33.810204', '2023-03-30 13:25:33.810204', 621, '分页查询', NULL, 'base:sys:angle:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (620, '2023-03-30 13:25:33.816912', '2023-03-30 13:25:33.816912', 621, '新增', NULL, 'base:sys:angle:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (621, '2023-02-10 13:25:31', '2023-03-30 09:08:31.912783', 600, '视角标签', '/sys/angle', NULL, 1, 'icon-search', 3, 'modules/base/views/angle.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (530, '2023-03-30 10:49:40.053284', '2023-03-30 10:49:40.053284', 529, '删除', NULL, 'base:sys:datafield:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (531, '2023-03-30 10:49:40.053284', '2023-03-30 10:49:40.053284', 529, '修改', NULL, 'base:sys:datafield:update,base:sys:datafield:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (532, '2023-03-30 10:49:40.053284', '2023-03-30 10:49:40.053284', 529, '单个信息', NULL, 'base:sys:datafield:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (533, '2023-03-30 10:49:40.053284', '2023-03-30 10:49:40.053284', 529, '列表查询', NULL, 'base:sys:datafield:list', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (534, '2023-03-30 10:49:40.053284', '2023-03-30 10:49:40.053284', 529, '分页查询', NULL, 'base:sys:datafield:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (535, '2023-03-30 10:49:40.053284', '2023-03-30 10:49:40.053284', 529, '新增', NULL, 'base:sys:datafield:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (537, '2023-03-30 10:50:31.805993', '2023-03-30 10:50:31.805993', 536, '删除', NULL, 'base:sys:datasource:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (538, '2023-03-30 10:50:31.805993', '2023-03-30 10:50:31.805993', 536, '修改', NULL, 'base:sys:datasource:update,base:sys:datasource:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (539, '2023-03-30 10:50:31.805993', '2023-03-30 10:50:31.805993', 536, '单个信息', NULL, 'base:sys:datasource:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (540, '2023-03-30 10:50:31.805993', '2023-03-30 10:50:31.805993', 536, '列表查询', NULL, 'base:sys:datasource:list', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (541, '2023-03-30 10:50:31.805993', '2023-03-30 10:50:31.805993', 536, '分页查询', NULL, 'base:sys:datasource:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (542, '2023-03-30 10:50:31.805993', '2023-03-30 10:50:31.805993', 536, '新增', NULL, 'base:sys:datasource:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (544, '2023-03-30 10:51:24.092944', '2023-03-30 10:51:24.092944', 543, '删除', NULL, 'base:sys:datatable:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (545, '2023-03-30 10:51:24.092944', '2023-03-30 10:51:24.092944', 543, '修改', NULL, 'base:sys:datatable:update,base:sys:datatable:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (546, '2023-03-30 10:51:24.092944', '2023-03-30 10:51:24.092944', 543, '单个信息', NULL, 'base:sys:datatable:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (547, '2023-03-30 10:51:24.092944', '2023-03-30 10:51:24.092944', 543, '列表查询', NULL, 'base:sys:datatable:list', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (548, '2023-03-30 10:51:24.092944', '2023-03-30 10:51:24.092944', 543, '分页查询', NULL, 'base:sys:datatable:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (549, '2023-03-30 10:51:24.092944', '2023-03-30 10:51:24.092944', 543, '新增', NULL, 'base:sys:datatable:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (536, '2023-03-30 10:50:29.612', '2023-03-30 10:50:29.612', 228, '数据源管理', '/base/sys/datasource', NULL, 1, 'icon-goods', 3, 'modules/base/views/datasource.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (2, '2019-09-11 11:14:47', '2021-02-27 17:16:05', NULL, '系统管理', '/sys', NULL, 0, 'icon-system', 2, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (8, '2023-03-30 23:19:57', '2021-03-08 22:59:12', 27, '菜单列表', '/sys/menu', NULL, 1, 'icon-menu', 2, 'cool/modules/base/views/menu.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (10, '2023-03-30 00:19:27.325', '2023-03-30 00:19:27.325', 8, '新增', NULL, 'base:sys:menu:add', 2, NULL, 1, NULL, 'f', 't');
+INSERT INTO base_sys_menu VALUES (11, '2023-03-30 00:19:51.101', '2023-03-30 00:19:51.101', 8, '删除', NULL, 'base:sys:menu:delete', 2, NULL, 2, NULL, 'f', 't');
+INSERT INTO base_sys_menu VALUES (13, '2023-03-30 00:20:19.341', '2023-03-30 00:20:19.341', 8, '查询', NULL, 'base:sys:menu:page,base:sys:menu:list,base:sys:menu:info', 2, NULL, 4, NULL, 'f', 't');
+INSERT INTO base_sys_menu VALUES (22, '2019-09-12 00:34:01', '2023-02-17 16:14:37.299', 27, '角色列表', '/sys/role', NULL, 1, 'icon-dept', 3, 'cool/modules/base/views/role.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (23, '2023-03-30 00:34:23.459', '2023-03-30 00:34:23.459', 22, '新增', NULL, 'base:sys:role:add', 2, NULL, 1, NULL, 'f', 't');
+INSERT INTO base_sys_menu VALUES (24, '2023-03-30 00:34:40.523', '2023-03-30 00:34:40.523', 22, '删除', NULL, 'base:sys:role:delete', 2, NULL, 2, NULL, 'f', 't');
+INSERT INTO base_sys_menu VALUES (25, '2023-03-30 00:34:53.306', '2023-03-30 00:34:53.306', 22, '修改', NULL, 'base:sys:role:update', 2, NULL, 3, NULL, 'f', 't');
+INSERT INTO base_sys_menu VALUES (26, '2023-03-30 00:35:05.024', '2023-03-30 00:35:05.024', 22, '查询', NULL, 'base:sys:role:page,base:sys:role:list,base:sys:role:info', 2, NULL, 4, NULL, 'f', 't');
+INSERT INTO base_sys_menu VALUES (27, '2019-09-12 15:52:44', '2019-09-15 22:11:56', 2, '权限管理', NULL, NULL, 0, 'icon-auth', 1, NULL, 'f', 't');
+INSERT INTO base_sys_menu VALUES (29, '2019-09-12 17:35:51', '2021-03-08 23:01:39', 105, '请求日志', '/sys/log', NULL, 1, 'icon-log', 1, 'cool/modules/base/views/log.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (30, '2019-09-12 17:37:03', '2021-03-03 10:16:26', 29, '权限', NULL, 'base:sys:log:page,base:sys:log:clear,base:sys:log:getKeep,base:sys:log:setKeep', 2, NULL, 1, NULL, 'f', 't');
+INSERT INTO base_sys_menu VALUES (59, '2019-11-18 16:50:27', '2019-11-18 16:50:27', 97, '部门列表', NULL, 'base:sys:department:list', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (60, '2019-11-18 16:50:45', '2019-11-18 16:50:45', 97, '新增部门', NULL, 'base:sys:department:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (61, '2019-11-18 16:50:59', '2019-11-18 16:50:59', 97, '更新部门', NULL, 'base:sys:department:update', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (62, '2019-11-18 16:51:13', '2019-11-18 16:51:13', 97, '删除部门', NULL, 'base:sys:department:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (63, '2019-11-18 17:49:35', '2019-11-18 17:49:35', 97, '部门排序', NULL, 'base:sys:department:order', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (65, '2019-11-18 23:59:21', '2019-11-18 23:59:21', 97, '用户转移', NULL, 'base:sys:user:move', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (78, '2019-12-10 13:27:56', '2023-02-17 16:05:06.071', 2, '参数配置', NULL, NULL, 0, 'icon-params', 3, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (79, '2023-03-30 13:29:33', '2021-03-08 23:01:48', 78, '参数列表', '/sys/param', NULL, 1, 'icon-menu', 0, 'cool/modules/base/views/param.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (80, '2023-03-30 13:29:50.146', '2023-03-30 13:29:50.146', 79, '新增', NULL, 'base:sys:param:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (81, '2023-03-30 13:30:10.03', '2023-03-30 13:30:10.03', 79, '修改', NULL, 'base:sys:param:info,base:sys:param:update', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (82, '2023-03-30 13:30:25.791', '2023-03-30 13:30:25.791', 79, '删除', NULL, 'base:sys:param:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (83, '2023-03-30 13:30:40.469', '2023-03-30 13:30:40.469', 79, '查看', NULL, 'base:sys:param:page,base:sys:param:list,base:sys:param:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (84, '2020-07-25 16:21:30', '2020-07-25 16:21:30', NULL, '通用', NULL, NULL, 0, 'icon-radioboxfill', 99, NULL, 't', 'f');
+INSERT INTO base_sys_menu VALUES (85, '2020-07-25 16:22:14', '2021-03-03 10:36:00', 84, '图片上传', NULL, 'space:info:page,space:info:list,space:info:info,space:info:add,space:info:delete,space:info:update,space:type:page,space:type:list,space:type:info,space:type:add,space:type:delete,space:type:update', 2, NULL, 1, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (97, '2023-03-30 14:14:02', '2023-02-28 15:51:30.854', 27, '用户列表', '/sys/user', NULL, 1, 'icon-user', 0, 'modules/base/views/user/index.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (98, '2023-03-30 14:14:13.528', '2023-03-30 14:14:13.528', 97, '新增', NULL, 'base:sys:user:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (99, '2023-03-30 14:14:22.823', '2023-03-30 14:14:22.823', 97, '删除', NULL, 'base:sys:user:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (100, '2023-03-30 14:14:33.973', '2023-03-30 14:14:33.973', 97, '修改', NULL, 'base:sys:user:delete,base:sys:user:update', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (101, '2021-01-12 14:14:51', '2021-01-12 14:14:51', 97, '查询', NULL, 'base:sys:user:page,base:sys:user:list,base:sys:user:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (105, '2021-01-21 10:42:55', '2023-02-17 16:05:19.312', 2, '监控管理', NULL, NULL, 0, 'icon-monitor', 9, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (117, '2021-03-05 10:58:25', '2023-02-13 19:30:39.636', NULL, '任务管理', NULL, NULL, 0, 'icon-activity', 97, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (118, '2021-03-05 10:59:42', '2023-02-14 14:05:48.454', 117, '任务列表', '/task/list', NULL, 1, 'icon-menu', 0, 'modules/task/views/list.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (119, '2021-03-05 11:00:00', '2021-03-05 11:00:00', 118, '权限', NULL, 'task:info:page,task:info:list,task:info:info,task:info:add,task:info:delete,task:info:update,task:info:stop,task:info:start,task:info:once,task:info:log', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (197, '2022-07-05 16:05:27.403', '2023-02-17 16:02:39.668', NULL, '字典管理', NULL, NULL, 0, 'icon-dict', 3, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (198, '2022-07-05 16:08:50.307', '2022-07-05 16:14:13.196', 197, '字典列表', '/dict/list', NULL, 1, 'icon-menu', 1, 'modules/dict/views/list.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (199, '2022-07-05 16:08:50.748162', '2022-07-05 16:08:50.748162', 198, '删除', NULL, 'dict:info:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (200, '2022-07-05 16:08:50.800623', '2022-07-05 16:08:50.800623', 198, '修改', NULL, 'dict:info:update,dict:info:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (201, '2022-07-05 16:08:50.859141', '2022-07-05 16:08:50.859141', 198, '获得字典数据', NULL, 'dict:info:data', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (202, '2022-07-05 16:08:50.916874', '2022-07-05 16:08:50.916874', 198, '单个信息', NULL, 'dict:info:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (203, '2022-07-05 16:08:50.972783', '2022-07-05 16:08:50.972783', 198, '列表查询', NULL, 'dict:info:list', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (204, '2022-07-05 16:08:51.030928', '2022-07-05 16:08:51.030928', 198, '分页查询', NULL, 'dict:info:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (205, '2022-07-05 16:08:51.087883', '2022-07-05 16:08:51.087883', 198, '新增', NULL, 'dict:info:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (206, '2022-07-06 10:41:26.503', '2022-07-06 10:41:37', 198, '组权限', NULL, 'dict:type:list,dict:type:update,dict:type:delete,dict:type:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (228, '2023-02-13 14:57:10.974', '2023-02-17 16:03:12.48', NULL, '数据管理', NULL, NULL, 0, 'icon-data', 3, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (229, '2023-02-13 14:57:47.855', '2023-02-17 16:04:57.051', 228, '数据回收站', '/recycle/data', NULL, 1, 'icon-delete', 1, 'modules/recycle/views/data.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (230, '2023-02-13 14:57:48.293292', '2023-02-13 14:57:48.293292', 229, '恢复数据', NULL, 'recycle:data:restore', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (231, '2023-02-13 14:57:48.293292', '2023-02-13 14:57:48.293292', 229, '单个信息', NULL, 'recycle:data:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (232, '2023-02-13 14:57:48.293292', '2023-02-13 14:57:48.293292', 229, '分页查询', NULL, 'recycle:data:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (233, '2023-02-13 19:29:49.24', '2023-02-17 16:04:17.603', NULL, '物联管理', NULL, NULL, 0, 'icon-iot', 4, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (234, '2023-02-13 19:31:31.89', '2023-02-19 14:53:36.538', 233, 'MQTT', '/iot/device', NULL, 1, 'icon-device', 1, 'modules/iot/views/device.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (235, '2023-02-13 19:32:58.637593', '2023-02-13 19:32:58.637593', 234, '删除', NULL, 'iot:device:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (236, '2023-02-13 19:32:58.637593', '2023-02-13 19:32:58.637593', 234, '单个信息', NULL, 'iot:device:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (237, '2023-02-13 19:32:58.637593', '2023-02-13 19:32:58.637593', 234, '列表查询', NULL, 'iot:device:list', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (238, '2023-02-13 19:32:58.637593', '2023-02-13 19:32:58.637593', 234, '分页查询', NULL, 'iot:device:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (239, '2023-02-15 11:21:16.61', '2023-02-15 14:56:08.425', NULL, '文件管理', '/upload/list', NULL, 1, 'icon-log', 97, 'modules/upload/views/list.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (240, '2023-02-15 14:34:46.552', '2023-02-17 16:04:29.152', NULL, '函数开发', NULL, NULL, 0, 'icon-fx', 6, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (241, '2023-02-15 14:35:31.765', '2023-02-17 16:04:36.963', 240, '云数据库', '/cloud/db', NULL, 1, 'icon-db', 1, 'modules/cloud/views/db.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (242, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '初始化Entity', NULL, 'cloud:db:initEntity', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (243, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '删除', NULL, 'cloud:db:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (244, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '修改', NULL, 'cloud:db:update,cloud:db:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (245, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '数据操作测试', NULL, 'cloud:db:data', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (246, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '单个信息', NULL, 'cloud:db:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (247, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '列表查询', NULL, 'cloud:db:list', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (248, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '分页查询', NULL, 'cloud:db:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (249, '2023-02-15 14:33:24.192728', '2023-02-15 14:33:24.192728', 241, '新增', NULL, 'cloud:db:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (250, '2023-02-15 15:17:10.524', '2023-02-15 15:17:10.524', 240, '云函数', '/cloud/func/info', NULL, 1, 'icon-menu', 2, 'modules/cloud/views/func/info.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (251, '2023-02-15 15:15:02.900934', '2023-02-28 16:08:47.978', 250, '调用云函数', NULL, 'cloud:func:info:invoke', 2, NULL, 98, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (252, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '删除', NULL, 'cloud:func:info:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (253, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '修改', NULL, 'cloud:func:info:update,cloud:func:info:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (254, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '单个信息', NULL, 'cloud:func:info:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (255, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '列表查询', NULL, 'cloud:func:info:list', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (256, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '分页查询', NULL, 'cloud:func:info:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (257, '2023-02-15 15:15:02.900934', '2023-02-15 15:15:02.900934', 250, '新增', NULL, 'cloud:func:info:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (259, '2023-02-17 15:25:20.762', '2023-02-17 15:25:20.762', 234, '修改', NULL, 'iot:device:info,iot:device:update', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (260, '2023-02-17 16:26:55.842', '2023-02-17 16:28:41.738', NULL, '页面设计', '/design/page', NULL, 1, 'icon-design', 7, 'modules/design/views/page.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (261, '2023-02-20 00:12:20.783', '2023-02-20 00:12:20.783', 234, '新增', NULL, 'iot:device:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (262, '2023-02-20 00:32:45.656', '2023-02-28 16:08:42.999', 250, '云函数开发', NULL, 'cloud:func:info:info,cloud:func:info:update,cloud:func:info:invoke', 2, NULL, 99, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (263, '2023-02-20 00:33:17.789', '2023-02-20 00:33:17.789', 250, '查看日志', NULL, 'cloud:func:log:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (446, '2023-03-06 22:50:24.125', '2023-03-06 22:50:24.125', 8, '参数', '/test/aa', NULL, 1, 'icon-goods', 0, 'modules/base/views/info.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (453, '2023-03-15 10:38:43.677', '2023-03-15 10:38:43.677', 8, '编辑', NULL, 'base:sys:menu:info,base:sys:menu:update', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (600, '2022-12-08 10:32:37.539', '2023-02-10 13:26:32.652', NULL, '三维管理', NULL, NULL, 0, 'icon-tag', 3, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (602, '2023-03-30 02:33:09.579719', '2023-03-30 02:33:09.579719', 601, '删除', NULL, 'base:sys:layers:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (603, '2023-03-30 02:33:09.584544', '2023-03-30 02:33:09.584544', 601, '修改', NULL, 'base:sys:layers:update,base:sys:layers:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (604, '2023-03-30 02:33:09.588911', '2023-03-30 02:33:09.588911', 601, '单个信息', NULL, 'base:sys:layers:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (605, '2023-03-30 02:33:09.593136', '2023-03-30 02:33:09.593136', 601, '列表查询', NULL, 'base:sys:layers:list', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (606, '2023-03-30 02:33:09.599053', '2023-03-30 02:33:09.599053', 601, '分页查询', NULL, 'base:sys:layers:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (607, '2023-03-30 02:33:09.603143', '2023-03-30 02:33:09.603143', 601, '新增', NULL, 'base:sys:layers:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (609, '2023-03-30 03:32:13.45159', '2023-03-30 03:32:13.45159', 608, '删除', NULL, 'base:sys:atlas:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (610, '2023-03-30 03:32:13.456462', '2023-03-30 03:32:13.456462', 608, '修改', NULL, 'base:sys:atlas:update,base:sys:atlas:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (611, '2023-03-30 03:32:13.462284', '2023-03-30 03:32:13.462284', 608, '单个信息', NULL, 'base:sys:atlas:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (612, '2023-03-30 03:32:13.466734', '2023-03-30 03:32:13.466734', 608, '列表查询', NULL, 'base:sys:atlas:list', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (613, '2023-03-30 03:32:13.471504', '2023-03-30 03:32:13.471504', 608, '分页查询', NULL, 'base:sys:atlas:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (614, '2023-03-30 03:32:13.477255', '2023-03-30 03:32:13.477255', 608, '新增', NULL, 'base:sys:atlas:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (615, '2023-03-30 13:25:33.783769', '2023-03-30 13:25:33.783769', 621, '删除', NULL, 'base:sys:angle:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (616, '2023-03-30 13:25:33.790064', '2023-03-30 13:25:33.790064', 621, '修改', NULL, 'base:sys:angle:update,base:sys:angle:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (617, '2023-03-30 13:25:33.79756', '2023-03-30 13:25:33.79756', 621, '单个信息', NULL, 'base:sys:angle:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (601, '2022-12-08 10:33:09.499', '2023-03-29 16:32:11.39', 600, '图层列表', '/sys/layers', NULL, 1, 'icon-menu', 1, 'modules/base/views/layers/index.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (608, '2022-12-08 11:32:13.379', '2023-03-29 16:32:25.657', 600, '图集管理', '/sys/atlas', NULL, 1, 'icon-card', 2, 'modules/base/views/atlas/index.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (543, '2023-03-30 10:51:21.968', '2023-08-30 08:54:18.798', 228, '表管理', '/base/sys/datatable', NULL, 1, 'icon-count', 5, 'modules/base/views/datatable/index.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (529, '2023-03-30 10:49:37.919', '2023-08-30 15:17:30.075', 228, '字段管理', '/base/sys/datafield', NULL, 1, 'icon-crown', 6, 'modules/base/views/datafield/index.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (622, '2023-09-01 10:49:06.119', '2023-09-01 10:49:06.119', 228, '数据管理', '/sys/datamanager', NULL, 1, 'icon-activity', 8, 'modules/base/views/datamanager/index.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (625, '2023-05-25 11:14:31.169', '2023-05-25 13:41:24.331', 27, '工具列表', '/sys/tool', NULL, 1, 'icon-crown', 3, 'modules/base/views/tool.vue', 't', 't');
+INSERT INTO base_sys_menu VALUES (627, '2023-05-25 11:14:31.006332', '2023-06-06 13:58:22.098', 625, '单个信息', NULL, 'base:sys:tool:info', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (628, '2023-05-25 11:14:31.006332', '2023-06-06 13:57:29.898', 625, '修改', NULL, 'base:sys:tool:info,base:sys:tool:update', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (629, '2023-05-25 11:14:31.006332', '2023-06-06 13:57:11.676', 625, '删除', NULL, 'base:sys:tool:delete', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (626, '2023-05-25 11:14:31.006332', '2023-06-06 13:57:48.409', 625, '新增', NULL, 'base:sys:tool:add', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (630, '2023-05-25 11:14:31.006332', '2023-06-06 13:58:03.293', 625, '分页查询', NULL, 'base:sys:tool:page', 2, NULL, 0, NULL, 't', 't');
+INSERT INTO base_sys_menu VALUES (631, '2023-05-25 11:14:31.006332', '2023-06-06 13:56:53.919', 625, '列表查询', NULL, 'base:sys:tool:list', 2, NULL, 0, NULL, 't', 't');
+SELECT setval('base_sys_menu_id_seq', (SELECT max(id) FROM base_sys_menu));
+COMMIT;
+
+-- ----------------------------
+-- Records of base_sys_param
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_param VALUES (1, '2021-02-26 13:53:05.000000', '2021-03-03 17:50:04.000000', 'text', '富文本参数', '<p><strong class=\"ql-size-huge\">111xxxxx2222<span class=\"ql-cursor\"></span></strong></p>', 0, NULL);
+INSERT INTO base_sys_param VALUES (2, '2021-02-26 13:53:18.000000', '2023-03-06 12:18:12.329000', 'json', 'JSON参数', '{\n  \"code\": 111233\n}', 0, NULL);
+SELECT setval('base_sys_param_id_seq', (SELECT max(id) FROM base_sys_param));
+COMMIT;
+
+-- ----------------------------
+-- Records of base_sys_role
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_role VALUES (1, '2021-02-24 21:18:39.682358', '2021-02-24 21:18:39.682358', '1', '超管', 'admin', '最高权限的角色', 1, 'null', 'null', 'null','null','null');
+SELECT setval('base_sys_role_id_seq', (SELECT max(id) FROM base_sys_role));
+COMMIT;
+
+-- ----------------------------
+-- Records of base_sys_user
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_user VALUES (1, '2021-02-24 21:16:41.525157', '2023-03-08 15:11:51.000000', 1, '超级管理员', 'admin', '5e4b087da729df751c2129aa1e2d423b', 7, '管理员', 'https://show.cool-admin.com/api/public/uploads/20230308/c731b0cba84046268b10edbbcf36f948_315c243a448e1369fa145c5ea3f020da.gif', '18000000000', 'team@cool-js.com', 1, '拥有最高权限的用户', NULL);
+SELECT setval('base_sys_user_id_seq', (SELECT max(id) FROM base_sys_user));
+COMMIT;
+
+-- ----------------------------
+-- Records of base_sys_user_role
+-- ----------------------------
+BEGIN;
+INSERT INTO base_sys_user_role VALUES (1, '2021-02-24 22:03:11.665805', '2021-02-24 22:03:11.665805', 1, 1);
+SELECT setval('base_sys_user_role_id_seq', (SELECT max(id) FROM base_sys_user_role));
+COMMIT;
+
+-- ----------------------------
+-- Records of config_data_field
+-- ----------------------------
+BEGIN;
+INSERT INTO config_data_field VALUES (7, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'name', '姓名', 0, 30, NULL, 1, 2, 1);
+INSERT INTO config_data_field VALUES (6, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'id', '数据主键', 0, 30, NULL, 1, 1, 1);
+INSERT INTO config_data_field VALUES (8, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'username', '用户名', 0, 50, NULL, 1, 3, 1);
+INSERT INTO config_data_field VALUES (9, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'password', '密码', 0, 20, NULL, 1, 4, 1);
+INSERT INTO config_data_field VALUES (10, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'departmentId', '单位代码', 0, 30, NULL, 1, 5, 1);
+INSERT INTO config_data_field VALUES (11, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'phone', '联系电话', 0, 20, NULL, 1, 6, 1);
+INSERT INTO config_data_field VALUES (12, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'email', '邮箱', 0, 50, NULL, 1, 7, 1);
+INSERT INTO config_data_field VALUES (13, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'status', '账号状态', 0, 1, NULL, 1, 8, 1);
+INSERT INTO config_data_field VALUES (14, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'createTime', '创建时间', 0, NULL, NULL, 1, 9, 1);
+INSERT INTO config_data_field VALUES (15, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'updateTime', '更新时间', 0, NULL, NULL, 1, 10, 1);
+INSERT INTO config_data_field VALUES (16, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'remark', '备注', 0, 200, NULL, 1, 11, 1);
+INSERT INTO config_data_field VALUES (17, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'id', '数据主键', 0, 30, NULL, 1, 1, 2);
+INSERT INTO config_data_field VALUES (18, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'name', '角色名称', 0, 30, NULL, 1, 2, 2);
+INSERT INTO config_data_field VALUES (19, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'label', '角色标签', 0, 20, NULL, 1, 3, 2);
+INSERT INTO config_data_field VALUES (20, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'createTime', '创建时间', 0, NULL, NULL, 1, 4, 2);
+INSERT INTO config_data_field VALUES (21, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'updateTime', '更新时间', 0, NULL, NULL, 1, 5, 2);
+INSERT INTO config_data_field VALUES (22, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'id', '数据主键', 0, 30, NULL, 1, 1, 3);
+INSERT INTO config_data_field VALUES (23, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'userId', '用户ID', 0, 30, NULL, 1, 2, 3);
+INSERT INTO config_data_field VALUES (24, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'roleId', '角色ID', 0, 30, NULL, 1, 3, 3);
+INSERT INTO config_data_field VALUES (25, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'createTime', '创建时间', 0, NULL, NULL, 1, 4, 3);
+INSERT INTO config_data_field VALUES (26, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'updateTime', '更新时间', 0, NULL, NULL, 1, 5, 3);
+INSERT INTO config_data_field VALUES (35, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'id', '数据主键', 0, 30, NULL, 1, 7, 5);
+INSERT INTO config_data_field VALUES (54, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'opacity', '透明度', 0, 10, NULL, 1, 26, 5);
+INSERT INTO config_data_field VALUES (55, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'id', '数据主键', 0, 30, NULL, 1, 1, 4);
+INSERT INTO config_data_field VALUES (58, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'createTime', '创建时间', 0, NULL, NULL, 1, 4, 4);
+INSERT INTO config_data_field VALUES (59, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'updateTime', '更新时间', 0, NULL, NULL, 1, 5, 4);
+INSERT INTO config_data_field VALUES (60, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'name', '名称', 0, NULL, NULL, 1, 1, 8);
+INSERT INTO config_data_field VALUES (61, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'x', '经度', 0, NULL, NULL, 1, 2, 8);
+INSERT INTO config_data_field VALUES (62, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'y', '维度', 0, NULL, NULL, 1, 3, 8);
+INSERT INTO config_data_field VALUES (63, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'z', '高度', 0, NULL, NULL, 1, 4, 8);
+INSERT INTO config_data_field VALUES (64, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'heading', '偏航角', 0, NULL, NULL, 1, 5, 8);
+INSERT INTO config_data_field VALUES (65, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'pitch', '俯仰角', 0, NULL, NULL, 1, 6, 8);
+INSERT INTO config_data_field VALUES (66, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'roll', '翻转角', 0, NULL, NULL, 1, 7, 8);
+INSERT INTO config_data_field VALUES (67, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'screenshot', '位置截图', 0, NULL, NULL, 1, 8, 8);
+INSERT INTO config_data_field VALUES (68, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'userId', '创建人', 0, NULL, NULL, 1, 9, 8);
+INSERT INTO config_data_field VALUES (70, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'id', '数据主键', 0, 30, NULL, 1, 11, 8);
+INSERT INTO config_data_field VALUES (28, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'atlasId', '图集ID', 0, 30, NULL, 1, 1, 5);
+INSERT INTO config_data_field VALUES (29, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'atlasName', '图集名称', 0, 50, NULL, 1, 2, 5);
+INSERT INTO config_data_field VALUES (30, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'layerId', '图层ID', 0, 30, NULL, 1, 3, 5);
+INSERT INTO config_data_field VALUES (34, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'atlasType', '图集类型', 0, NULL, NULL, 1, 6, 5);
+INSERT INTO config_data_field VALUES (36, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'parentId', '父节点', 0, 30, NULL, 1, 8, 5);
+INSERT INTO config_data_field VALUES (37, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'layerName', '图层描述', 0, 50, NULL, 1, 9, 5);
+INSERT INTO config_data_field VALUES (38, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'layerType', '图层类型', 0, 50, NULL, 1, 10, 5);
+INSERT INTO config_data_field VALUES (39, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'layerCode', '图层类型编码', 0, 50, NULL, 1, 11, 5);
+INSERT INTO config_data_field VALUES (40, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'layerOrder', '图层加载顺序', 0, NULL, NULL, 1, 12, 5);
+INSERT INTO config_data_field VALUES (41, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'orderNum', '图层显示顺序', 0, NULL, NULL, 1, 13, 5);
+INSERT INTO config_data_field VALUES (42, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'dataSource', '数据源', 0, 200, NULL, 1, 14, 5);
+INSERT INTO config_data_field VALUES (43, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'filterConditions', '过滤条件', 0, 100, NULL, 1, 15, 5);
+INSERT INTO config_data_field VALUES (44, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'parameterSet', '参数集', 0, 500, NULL, 1, 16, 5);
+INSERT INTO config_data_field VALUES (45, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'loadType', '加载接口类型', 0, 50, NULL, 1, 17, 5);
+INSERT INTO config_data_field VALUES (52, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'promptInfo', '查询提示信息', 0, 50, NULL, 1, 24, 5);
+INSERT INTO config_data_field VALUES (53, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'createTime', '创建时间', 0, NULL, NULL, 1, 25, 5);
+INSERT INTO config_data_field VALUES (56, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'roleId', '角色ID', 0, 30, NULL, 1, 2, 4);
+INSERT INTO config_data_field VALUES (57, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'atlasId', '图集ID', 0, 30, NULL, 1, 3, 4);
+INSERT INTO config_data_field VALUES (69, '2023-04-18 10:09:22.187721', '2023-04-18 10:09:22.187721', 'createTime', '创建时间', 0, NULL, NULL, 1, 10, 8);
+INSERT INTO config_data_field VALUES (71, '2023-05-24 09:11:44.444597', '2023-05-24 09:11:44.444597', 'id', '主键', 0, NULL, NULL, 0, 1, 6);
+INSERT INTO config_data_field VALUES (72, '2023-05-24 09:12:27.891077', '2023-05-24 09:12:27.891077', 'roleId', '角色ID', 0, NULL, NULL, 0, 2, 6);
+INSERT INTO config_data_field VALUES (73, '2023-05-24 09:15:27.09921', '2023-05-24 09:15:27.09921', 'menuId', '菜单ID', 0, NULL, NULL, 0, 3, 6);
+INSERT INTO config_data_field VALUES (74, '2023-05-24 09:20:24.002565', '2023-05-24 09:20:24.002565', 'id', '主键', 0, NULL, NULL, 0, 1, 7);
+INSERT INTO config_data_field VALUES (75, '2023-05-24 09:21:30.865642', '2023-05-24 09:21:30.865642', 'parentId', '父ID', 0, NULL, NULL, 0, 2, 7);
+INSERT INTO config_data_field VALUES (76, '2023-05-24 09:22:14.457718', '2023-05-24 09:22:14.457718', 'name', '名称', 0, NULL, NULL, 1, 3, 7);
+INSERT INTO config_data_field VALUES (77, '2023-05-24 09:24:12.957691', '2023-05-24 09:24:12.957691', 'router', '路由', 0, NULL, NULL, 1, 4, 7);
+INSERT INTO config_data_field VALUES (78, '2023-05-24 09:24:51.930643', '2023-05-24 09:24:51.930643', 'icon', '图标', 0, NULL, NULL, 1, 5, 7);
+INSERT INTO config_data_field VALUES (80, '2023-09-05 16:03:25.930822', '2023-09-05 16:03:25.930822', 'departmentId', '单位ID', 0, NULL, NULL, 1, NULL, 10);
+INSERT INTO config_data_field VALUES (81, '2023-09-05 16:03:48.861533', '2023-09-05 16:03:48.861533', 'username', '用户名', 0, NULL, NULL, 1, NULL, 10);
+INSERT INTO config_data_field VALUES (82, '2023-09-05 16:04:06.401364', '2023-09-05 16:04:06.401364', 'roleId', '角色ID', 0, NULL, NULL, 0, NULL, 10);
+INSERT INTO config_data_field VALUES (83, '2023-09-05 16:04:20.994793', '2023-09-05 16:04:20.994793', 'optionsS', '全图范围', 0, NULL, NULL, 1, NULL, 10);
+INSERT INTO config_data_field VALUES (84, '2023-09-05 16:04:34.523939', '2023-09-05 16:04:34.523939', 'name', '姓名', 0, NULL, NULL, 1, NULL, 10);
+INSERT INTO config_data_field VALUES (85, '2023-09-05 16:04:47.389161', '2023-09-05 16:04:47.389161', 'userId', '用户ID', 0, NULL, NULL, 1, NULL, 10);
+INSERT INTO config_data_field VALUES (86, '2023-09-05 16:05:00.422902', '2023-09-05 16:05:00.422902', 'password', '密码', 0, NULL, NULL, 1, NULL, 10);
+INSERT INTO config_data_field VALUES (87, '2023-09-06 10:31:59.175074', '2023-09-06 10:31:59.175074', 'orderNum', '排序号', 2, NULL, NULL, 1, NULL, 9);
+INSERT INTO config_data_field VALUES (88, '2023-09-06 10:32:17.610906', '2023-09-06 10:32:17.610906', 'roleId', '角色ID', 0, NULL, NULL, 1, NULL, 9);
+INSERT INTO config_data_field VALUES (89, '2023-09-06 10:32:30.754951', '2023-09-06 10:32:30.754951', 'toolId', '工具ID', 0, NULL, NULL, 1, NULL, 9);
+INSERT INTO config_data_field VALUES (49, '2023-04-18 10:09:22.187721', '2023-09-06 10:57:48.105', 'querySet', '数据表', 0, 50, NULL, 1, 21, 5);
+INSERT INTO config_data_field VALUES (90, '2023-09-06 10:32:45.607422', '2023-09-06 10:32:45.607422', 'component', '组件', 0, NULL, NULL, 1, NULL, 9);
+INSERT INTO config_data_field VALUES (91, '2023-09-06 10:32:58.416386', '2023-09-06 10:32:58.416386', 'icon', '图标', 0, NULL, NULL, 1, NULL, 9);
+INSERT INTO config_data_field VALUES (92, '2023-09-06 10:33:15.274759', '2023-09-06 10:33:15.274759', 'parentId', '父ID', 0, NULL, NULL, 1, NULL, 9);
+INSERT INTO config_data_field VALUES (93, '2023-09-06 10:33:28.502262', '2023-09-06 10:33:28.502262', 'name', '名称', 0, NULL, NULL, 1, NULL, 9);
+INSERT INTO config_data_field VALUES (94, '2023-09-06 10:33:41.184567', '2023-09-06 10:33:41.184567', 'id', '主键', 0, NULL, NULL, 1, NULL, 9);
+INSERT INTO config_data_field VALUES (95, '2023-09-06 10:58:40.755942', '2023-09-06 10:58:40.755942', 'treeNode', '树节点', 0, NULL, NULL, 1, NULL, 5);
+INSERT INTO config_data_field VALUES (96, '2023-09-12 08:49:12.091529', '2023-09-12 08:49:12.091529', 'imageUrl', '底图显示图片', 0, NULL, NULL, 1, NULL, 5);
+SELECT setval('config_data_field_id_seq', (SELECT max(id) FROM config_data_field));
+COMMIT;
+
+-- ----------------------------
+-- Records of config_data_table
+-- ----------------------------
+BEGIN;
+INSERT INTO config_data_table VALUES (1, '2023-04-18 10:09:22.187721','2023-04-18 10:09:22.187721','base_sys_user', '用户表', '0');
+INSERT INTO config_data_table VALUES (2, '2023-04-18 10:09:22.187721','2023-04-18 10:09:22.187721','base_sys_role', '角色表', '0');
+INSERT INTO config_data_table VALUES (3,'2023-04-18 10:09:22.187721','2023-04-18 10:09:22.187721', 'base_sys_user_role', '用户角色', '0');
+INSERT INTO config_data_table VALUES (4, '2023-04-18 10:09:22.187721','2023-04-18 10:09:22.187721','base_sys_role_atlas', '用户图集角色', '0');
+INSERT INTO config_data_table VALUES (5,'2023-04-18 10:09:22.187721','2023-04-18 10:09:22.187721', 'sys_map_atlas_layers', '地图图集图层集合', '0');
+INSERT INTO config_data_table VALUES (6,'2023-04-18 10:09:22.187721','2023-04-18 10:09:22.187721', 'base_sys_role_menu', '用户菜单角色', '0');
+INSERT INTO config_data_table VALUES (7,'2023-04-18 10:09:22.187721','2023-04-18 10:09:22.187721', 'base_sys_menu', '系统菜单', '0');
+INSERT INTO config_data_table VALUES (8,'2023-04-18 10:09:22.187721','2023-04-18 10:09:22.187721', 'map_angle', '视角标签', '0');
+INSERT INTO config_data_table VALUES (9, '2023-05-24 10:22:23', '2023-05-24 10:22:27', 'sys_role_tool', '用户角色工具菜单', 0);
+INSERT INTO config_data_table VALUES (10, '2023-08-10 09:24:26.921862', '2023-08-10 09:24:26.921862', 'view_sys_user_role', '用户角色集合', 0);
+SELECT setval('config_data_table_id_seq', (SELECT max(id) FROM config_data_table));
+COMMIT;
+
+-- ----------------------------
+-- Records of config_data_source
+-- ----------------------------
+-- BEGIN;
+-- INSERT INTO "config_data_source" VALUES (0, '2023-04-18 10:09:22.187721','2023-04-18 10:09:22.187721','默认', '','','','','',1,'');
+-- SELECT setval('config_data_source_id_seq', (SELECT max(id) FROM config_data_source)+1);
+-- COMMIT;
+
+-- ----------------------------
+-- view of sys_map_atlas_layers
+-- ----------------------------
+BEGIN;
+CREATE VIEW "sys_map_atlas_layers" AS  SELECT a."atlasId",
+    a."atlasName",
+    a."atlasType",
+    a."layerId",
+    a.opacity,
+    b.id,
+    b."createTime",
+    b."updateTime",
+    b."parentId",
+    b."layerName",
+    b."layerType",
+    b."layerOrder",
+    b."orderNum",
+    b."layerCode",
+    b."dataSource",
+    b."filterConditions",
+    b."parameterSet",
+    b."loadType",
+    b."promptInfo",
+    c."roleId"
+   FROM map_atlas a
+     LEFT JOIN map_layers b ON a."layerId" = b.id
+     LEFT JOIN base_sys_role_atlas c ON a."atlasId"::text = c."atlasId"::text;
+
+ALTER TABLE "sys_map_atlas_layers" OWNER TO "postgres";
+COMMIT;
+
+BEGIN;
+CREATE VIEW "sys_role_tool" AS  SELECT a."roleId",
+    a."toolId",
+    b.id,
+    b."createTime",
+    b."updateTime",
+    b."parentId",
+    b.name,
+    b.component,
+    b.icon,
+    b."orderNum"
+   FROM base_sys_role_tool a
+     LEFT JOIN base_sys_tool b ON a."toolId" = b.id;
+
+ALTER TABLE "sys_role_tool" OWNER TO "postgres";
+COMMIT;
+
+BEGIN;
+CREATE VIEW "view_sys_user_role" AS  SELECT a."userId",
+    a."roleId",
+    b."departmentId",
+    b.name,
+    b.username,
+    b.password,
+    b."passwordV",
+    b."nickName",
+    b."headImg",
+    b.phone,
+    b.email,
+    b.status,
+    b.remark,
+    b."socketId",
+    c.name AS rolename,
+    c.label,
+    c.relevance,
+    c."menuIdList",
+    c."departmentIdList",
+    c."atlasIdList",
+    c."toolIdList",
+    c."optionsS",
+    a."createTime"
+   FROM base_sys_user_role a
+     LEFT JOIN base_sys_user b ON a."userId" = b.id
+     LEFT JOIN base_sys_role c ON a."roleId" = c.id;
+
+ALTER TABLE "view_sys_user_role" OWNER TO "postgres";
+COMMIT;
+

+ 67 - 0
yxgb-admin-midway/src/modules/base/manager/mysqlDataSourceManager.ts

@@ -0,0 +1,67 @@
+import { Init, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/decorator';
+import { DataSourceManager } from '@midwayjs/core';
+import * as mysql from 'mysql2';
+import { DataSourceEntity } from '../entity/sys/data_source';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+
+@Provide()
+@Scope(ScopeEnum.Singleton)
+export class MySqlDataSourceManager extends DataSourceManager<mysql.Pool> {
+  options = {
+    dataSource: {
+      // dataSource0: {
+      //   host: '127.0.0.1',
+      //   port: 3306,
+      //   user: 'root',
+      //   password: '123456',
+      //   database: 'cr-mysql',
+      // },
+    },
+    // 其他配置
+  };
+  @Inject()
+  baseDir: string;
+  @InjectEntityModel(DataSourceEntity)
+  dataSourceEntity: Repository<DataSourceEntity>;
+  @Init()
+  async init() {
+    const dataSources = await this.dataSourceEntity.find({
+      where: { type: 2 },
+    });
+    dataSources.map(e => {
+      const dataSource = {
+        host: e.host,
+        port: e.port,
+        user: e.user,
+        password: e.password,
+        database: e.database,
+      };
+      this.options.dataSource['dataSource' + e.id] = dataSource;
+    });
+    await this.initDataSource(this.options, this.baseDir);
+  }
+  //创建单个实例
+  public async createDataSource(
+    config: any,
+    dataSourceName: string
+  ): Promise<mysql.Pool> {
+    return mysql.createPool(config);
+  }
+
+  getName(): string {
+    return 'mysql';
+  }
+
+  protected async checkConnected(dataSource: mysql.Pool): Promise<boolean> {
+    //伪代码
+    // return dataSource.status === 'connected';
+    return true;
+  }
+
+  protected async destroyDataSource(dataSource: mysql.Pool): Promise<void> {
+    if (await this.checkConnected(dataSource)) {
+      dataSource.end();
+    }
+  }
+}

+ 84 - 0
yxgb-admin-midway/src/modules/base/manager/oracleDataSourceManager.ts

@@ -0,0 +1,84 @@
+import { Init, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/decorator';
+import { DataSourceManager } from '@midwayjs/core';
+import * as oracledb from 'oracledb';
+import { DataSourceEntity } from '../entity/sys/data_source';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+
+@Provide()
+@Scope(ScopeEnum.Singleton)
+export class OracleDataSourceManager extends DataSourceManager<oracledb.Pool> {
+  options = {
+    dataSource: {
+      // dataSource0: {
+      //   user: 'root',
+      //   password: '123456',
+      //   connectString: '127.0.0.1:1521/cr-mysql',
+      // },
+    },
+    // 其他配置
+  };
+  @Inject()
+  baseDir: string;
+  @InjectEntityModel(DataSourceEntity)
+  dataSourceEntity: Repository<DataSourceEntity>;
+  @Init()
+  async init() {
+    try {
+      const dataSources = await this.dataSourceEntity.find({
+        where: { type: 0 },
+      });
+      dataSources.map(e => {
+        const dataSource = {
+          user: e.user,
+          password: e.password,
+          connectString: e.host + ':' + e.port + '/' + e.database,
+        };
+        this.options.dataSource['dataSource' + e.id] = dataSource;
+      });
+      await this.initDataSource(this.options, this.baseDir);
+      console.log('Connection pool started');
+    } catch (err) {
+      console.error('init() error: ' + err.message);
+    }
+  }
+  //创建单个实例
+  public async createDataSource(
+    config: any,
+    dataSourceName: string
+  ): Promise<oracledb.Pool> {
+    return oracledb.createPool(config);
+  }
+
+  getName(): string {
+    return 'oracledb';
+  }
+
+  protected async checkConnected(dataSource: oracledb.Pool): Promise<boolean> {
+    //伪代码
+    // return dataSource.status === 'connected';
+    return true;
+  }
+
+  protected async destroyDataSource(dataSource: oracledb.Pool): Promise<void> {
+    if (await this.checkConnected(dataSource)) {
+      await dataSource.close();
+    }
+  }
+  async closePoolAndExit() {
+    console.log('\nTerminating');
+    try {
+      // Get the pool from the pool cache and close it when no
+      // connections are in use, or force it closed after 10 seconds.
+      // If this hangs, you may need DISABLE_OOB=ON in a sqlnet.ora file.
+      // This setting should not be needed if both Oracle Client and Oracle
+      // Database are 19c (or later).
+      await oracledb.getPool().close(10);
+      console.log('Pool closed');
+      process.exit(0);
+    } catch (err) {
+      console.error(err.message);
+      process.exit(1);
+    }
+  }
+}

+ 85 - 0
yxgb-admin-midway/src/modules/base/manager/pgDataSourceManager.ts

@@ -0,0 +1,85 @@
+import {
+  Init,
+  Inject,
+  Provide,
+  Scope,
+  ScopeEnum,
+  Config,
+} from '@midwayjs/decorator';
+import { DataSourceManager } from '@midwayjs/core';
+import * as pg from 'pg';
+import { DataSourceEntity } from '../entity/sys/data_source';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+
+@Provide()
+@Scope(ScopeEnum.Singleton)
+export class PgDataSourceManager extends DataSourceManager<pg.Pool> {
+  @Config('typeorm')
+  pgConfig;
+  options = {
+    dataSource: {
+      // dataSource0: {
+      //   host: '127.0.0.1',
+      //   port: 5432,
+      //   user: 'postgres',
+      //   password: 'mysecretpassword',
+      //   database: 'cr',
+      // },
+    },
+    // 其他配置
+  };
+  @Inject()
+  baseDir: string;
+  @InjectEntityModel(DataSourceEntity)
+  dataSourceEntity: Repository<DataSourceEntity>;
+  @Init()
+  async init() {
+    const dataSources = await this.dataSourceEntity.find({
+      where: { type: 1 },
+    });
+    dataSources.map(e => {
+      const dataSource = {
+        host: e.host,
+        port: e.port,
+        user: e.user,
+        password: e.password,
+        database: e.database,
+      };
+      this.options.dataSource['dataSource' + e.id] = dataSource;
+    });
+    const dataSource0 = {
+      host: this.pgConfig.dataSource.default.host,
+      port: this.pgConfig.dataSource.default.port,
+      user: this.pgConfig.dataSource.default.username,
+      password: this.pgConfig.dataSource.default.password,
+      database: this.pgConfig.dataSource.default.database,
+    };
+    this.options.dataSource['dataSource0'] = dataSource0;
+
+    await this.initDataSource(this.options, this.baseDir);
+  }
+  //创建单个实例
+  protected async createDataSource(
+    config: any,
+    dataSourceName: string
+  ): Promise<pg.Pool> {
+    return new pg.Pool(config);
+  }
+
+  getName(): string {
+    return 'pg';
+  }
+
+  protected async checkConnected(dataSource: pg.Pool): Promise<boolean> {
+    //伪代码
+    // return dataSource.status === 'connected';
+    return true;
+  }
+
+  protected async destroyDataSource(dataSource: pg.Pool): Promise<void> {
+    if (await this.checkConnected(dataSource)) {
+      await dataSource.end;
+    }
+  }
+}

+ 66 - 0
yxgb-admin-midway/src/modules/base/manager/sqliteDataSourceManager.ts

@@ -0,0 +1,66 @@
+import { Init, Inject, Provide, Scope, ScopeEnum } from '@midwayjs/decorator';
+import { DataSourceManager } from '@midwayjs/core';
+import * as sqlite3 from 'sqlite3';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+import { DataSourceEntity } from '../entity/sys/data_source';
+import { resolve } from 'path';
+
+@Provide()
+@Scope(ScopeEnum.Singleton)
+export class SqliteDataSourceManager extends DataSourceManager<sqlite3.Database> {
+  options = {
+    dataSource: {
+      // dataSource0: {
+      //   // database: './src/xj.j3tiles',
+      //   // database: resolve('D:/jtcim/dist/xj.j3tiles'),
+      //   database: './src/11294.3dtiles',
+      // },
+    },
+    // 其他配置
+  };
+  @Inject()
+  baseDir: string;
+  @InjectEntityModel(DataSourceEntity)
+  dataSourceEntity: Repository<DataSourceEntity>;
+  @Init()
+  async init() {
+    const dataSources = await this.dataSourceEntity.find({
+      where: { type: 3 },
+    });
+    dataSources.map(e => {
+      const dataSource = {
+        database: resolve(e.database),
+      };
+      this.options.dataSource['dataSource' + e.id] = dataSource;
+    });
+    await this.initDataSource(this.options, this.baseDir);
+  }
+  //创建单个实例
+  public async createDataSource(
+    config: any,
+    dataSourceName: string
+  ): Promise<sqlite3.Database> {
+    return new sqlite3.Database(config.database);
+  }
+
+  getName(): string {
+    return 'mysql';
+  }
+
+  protected async checkConnected(
+    dataSource: sqlite3.Database
+  ): Promise<boolean> {
+    //伪代码
+    // return dataSource.status === 'connected';
+    return true;
+  }
+
+  protected async destroyDataSource(
+    dataSource: sqlite3.Database
+  ): Promise<void> {
+    if (await this.checkConnected(dataSource)) {
+      await dataSource.close();
+    }
+  }
+}

+ 139 - 0
yxgb-admin-midway/src/modules/base/middleware/authority.ts

@@ -0,0 +1,139 @@
+import { App, Config, Inject, Middleware } from '@midwayjs/decorator';
+import * as _ from 'lodash';
+import { RESCODE } from '@cool-midway/core';
+import * as jwt from 'jsonwebtoken';
+import { NextFunction, Context } from '@midwayjs/koa';
+import { IMiddleware, IMidwayApplication } from '@midwayjs/core';
+import { CacheManager } from '@midwayjs/cache';
+
+/**
+ * 权限校验
+ */
+@Middleware()
+export class BaseAuthorityMiddleware
+  implements IMiddleware<Context, NextFunction>
+{
+  @Config('koa.globalPrefix')
+  prefix;
+
+  @Config('module.base')
+  jwtConfig;
+
+  @Inject()
+  cacheManager: CacheManager;
+
+  @App()
+  app: IMidwayApplication;
+
+  resolve() {
+    return async (ctx: Context, next: NextFunction) => {
+      let statusCode = 200;
+      let { url } = ctx;
+      url = url.replace(this.prefix, '');
+      const token = ctx.get('Authorization');
+      const adminUrl = '/admin/';
+      //忽略token验证的url
+      const ignoreUrls = [];
+      // 路由地址为 admin前缀的 需要权限校验
+      if (_.startsWith(url, adminUrl)) {
+        try {
+          ctx.admin = jwt.verify(token, this.jwtConfig.jwt.secret);
+        } catch (err) {}
+        // 不需要登录 无需权限校验
+        if (
+          new RegExp(`^${adminUrl}?.*/open/`).test(url) ||
+          ignoreUrls.includes(url)
+        ) {
+          await next();
+          return;
+        }
+        if (ctx.admin) {
+          const rToken = await this.cacheManager.get(
+            `admin:token:${ctx.admin.userId}`
+          );
+          // 超管拥有所有权限
+          if (ctx.admin.username == 'admin' && !ctx.admin.isRefresh) {
+            if (rToken !== token && this.jwtConfig.jwt.sso) {
+              ctx.status = 401;
+              ctx.body = {
+                code: RESCODE.COMMFAIL,
+                message: '登录失效~',
+              };
+              return;
+            } else {
+              await next();
+              return;
+            }
+          }
+          // 要登录每个人都有权限的接口
+          if (
+            new RegExp(`^${adminUrl}?.*/comm/`).test(url) ||
+            // 字典接口
+            url == '/admin/dict/info/data'
+          ) {
+            await next();
+            return;
+          }
+          // 如果传的token是refreshToken则校验失败
+          if (ctx.admin.isRefresh) {
+            ctx.status = 401;
+            ctx.body = {
+              code: RESCODE.COMMFAIL,
+              message: '登录失效~',
+            };
+            return;
+          }
+          // 判断密码版本是否正确
+          const passwordV = await this.cacheManager.get(
+            `admin:passwordVersion:${ctx.admin.userId}`
+          );
+          if (passwordV != ctx.admin.passwordVersion) {
+            ctx.status = 401;
+            ctx.body = {
+              code: RESCODE.COMMFAIL,
+              message: '登录失效~',
+            };
+            return;
+          }
+
+          if (!rToken) {
+            ctx.status = 401;
+            ctx.body = {
+              code: RESCODE.COMMFAIL,
+              message: '登录失效或无权限访问~',
+            };
+            return;
+          }
+          if (rToken !== token && this.jwtConfig.jwt.sso) {
+            statusCode = 401;
+          } else {
+            let perms: string[] = await this.cacheManager.get(
+              `admin:perms:${ctx.admin.userId}`
+            );
+            if (!_.isEmpty(perms)) {
+              perms = perms.map(e => {
+                return e.replace(/:/g, '/');
+              });
+              if (!perms.includes(url.split('?')[0].replace('/admin/', ''))) {
+                statusCode = 403;
+              }
+            } else {
+              statusCode = 403;
+            }
+          }
+        } else {
+          statusCode = 401;
+        }
+        if (statusCode > 200) {
+          ctx.status = statusCode;
+          ctx.body = {
+            code: RESCODE.COMMFAIL,
+            message: '登录失效或无权限访问~',
+          };
+          return;
+        }
+      }
+      await next();
+    };
+  }
+}

+ 26 - 0
yxgb-admin-midway/src/modules/base/middleware/log.ts

@@ -0,0 +1,26 @@
+import { Middleware } from '@midwayjs/decorator';
+import * as _ from 'lodash';
+import { NextFunction, Context } from '@midwayjs/koa';
+import { IMiddleware } from '@midwayjs/core';
+import { BaseSysLogService } from '../service/sys/log';
+
+/**
+ * 日志中间件
+ */
+@Middleware()
+export class BaseLogMiddleware implements IMiddleware<Context, NextFunction> {
+  resolve() {
+    return async (ctx: Context, next: NextFunction) => {
+      const baseSysLogService = await ctx.requestContext.getAsync(
+        BaseSysLogService
+      );
+      baseSysLogService.record(
+        ctx,
+        ctx.url,
+        ctx.req.method === 'GET' ? ctx.request.query : ctx.request.body,
+        ctx.admin ? ctx.admin.userId : null
+      );
+      await next();
+    };
+  }
+}

+ 30 - 0
yxgb-admin-midway/src/modules/base/schedule/log.ts

@@ -0,0 +1,30 @@
+import {
+  Provide,
+  Inject,
+  CommonSchedule,
+  TaskLocal,
+  FORMAT,
+} from '@midwayjs/decorator';
+import { BaseSysLogService } from '../service/sys/log';
+import { ILogger } from '@midwayjs/logger';
+
+/**
+ * 日志定时任务
+ */
+@Provide()
+export class BaseLogSchedule implements CommonSchedule {
+  @Inject()
+  baseSysLogService: BaseSysLogService;
+
+  @Inject()
+  logger: ILogger;
+
+  // 定时执行的具体任务
+  @TaskLocal(FORMAT.CRONTAB.EVERY_DAY)
+  async exec() {
+    this.logger.info('清除日志定时任务开始执行');
+    const startTime = Date.now();
+    await this.baseSysLogService.clear();
+    this.logger.info(`清除日志定时任务结束,耗时:${Date.now() - startTime}ms`);
+  }
+}

+ 79 - 0
yxgb-admin-midway/src/modules/base/service/3dtile.service.ts

@@ -0,0 +1,79 @@
+import { Provide, Inject } from '@midwayjs/decorator';
+import { SqliteDataSourceManager } from '../manager/sqliteDataSourceManager';
+import * as zlib from 'zlib';
+import * as url from 'url';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+import { DataSourceEntity } from '../entity/sys/data_source';
+
+@Provide()
+export class tileService {
+  @Inject()
+  sqliteDataSourceManager: SqliteDataSourceManager;
+  @InjectEntityModel(DataSourceEntity)
+  dataSourceEntity: Repository<DataSourceEntity>;
+
+  async get3dTiles(d3tileUrl) {
+    const url_path = new url.URL(d3tileUrl).pathname.split('/');
+    //获取数据库的配置地址
+    const assetId = url_path[2];
+    const uri_segments = url_path.length;
+    if (uri_segments === 4) {
+      if (url_path[3] === 'tileset.json') {
+        return this.response_3dtile('tileset.json', assetId);
+      }
+    }
+    let key_value = '';
+    for (let i = 3; i < uri_segments; i++) {
+      if (i === 3) {
+        key_value = key_value + url_path[i];
+      } else {
+        key_value = key_value + '/' + url_path[i];
+      }
+    }
+    return this.response_3dtile(key_value, assetId);
+  }
+
+  async response_3dtile(key_value, assetId) {
+    const query = "SELECT content FROM media WHERE key='" + key_value + "'";
+    const dataTableSource = await this.dataSourceEntity.findOne({
+      where: { name: assetId },
+    });
+    return this.getValue(query, 'dataSource' + dataTableSource.id);
+  }
+
+  async getValue(query, dataSourceId) {
+    const queryResult = (await this.getSqliteConnected(
+      dataSourceId,
+      query
+    )) as string;
+    try {
+      return new Promise((resolve, reject) => {
+        zlib.gunzip(queryResult[0]['content'], (err, buffer) => {
+          if (err) reject(err);
+          //不能转string,转了就出错
+          else resolve(buffer);
+          // console.log(buffer.toString());
+        });
+      }).then(value => {
+        return value;
+      });
+    } catch (error) {
+      console.log('error:!!!' + error);
+      return '';
+    }
+  }
+
+  async getSqliteConnected(dataSource, sql) {
+    return new Promise((resolve, reject) => {
+      this.sqliteDataSourceManager
+        .getDataSource(dataSource)
+        .all(sql, [], (err, data) => {
+          if (err) reject(err);
+          else resolve(data);
+        });
+    }).then(value => {
+      return value;
+    });
+  }
+}

+ 20 - 0
yxgb-admin-midway/src/modules/base/service/data-mongo.service.ts

@@ -0,0 +1,20 @@
+import { Provide } from '@midwayjs/decorator';
+// import { InjectEntityModel } from '@midwayjs/typegoose';
+// import { ReturnModelType } from '@typegoose/typegoose';
+// import { DataSourceMongoEntity } from '../entity/data_source_mongo';
+
+@Provide()
+export class DataMongoService {
+  // @InjectEntityModel(DataSourceMongoEntity)
+  // dataSourceMongoEntityModel: ReturnModelType<typeof DataSourceMongoEntity>;
+  // async getTest() {
+  //   // create data
+  //   const { _id: id } = await this.dataSourceMongoEntityModel.create({
+  //     name: 'JohnDoe',
+  //     jobs: ['Cleaner'],
+  //   } as DataSourceMongoEntity); // an "as" assertion, to have types for all properties
+  //   // find data
+  //   const user = await this.dataSourceMongoEntityModel.findById(id).exec();
+  //   console.log(user);
+  // }
+}

+ 927 - 0
yxgb-admin-midway/src/modules/base/service/data.service.ts

@@ -0,0 +1,927 @@
+import { Inject, Provide } from '@midwayjs/decorator';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+import { PgDataSourceManager } from '../manager/pgDataSourceManager';
+import { MySqlDataSourceManager } from '../manager/mysqlDataSourceManager';
+import { OracleDataSourceManager } from '../manager/oracleDataSourceManager';
+import * as oracledb from 'oracledb';
+import { SqliteDataSourceManager } from '../manager/sqliteDataSourceManager';
+import { DataTableEntity } from '../entity/sys/data_table';
+import { CacheManager } from '@midwayjs/cache';
+import { BaseService } from '@cool-midway/core';
+import * as geojson from 'geojson';
+
+@Provide()
+export class DataService extends BaseService {
+  @InjectEntityModel(DataTableEntity)
+  dataTableEntity: Repository<DataTableEntity>;
+  @Inject()
+  pgDataSourceManager: PgDataSourceManager;
+  @Inject()
+  oracleDataSourceManager: OracleDataSourceManager;
+  @Inject()
+  sqliteDataSourceManager: SqliteDataSourceManager;
+  @Inject()
+  mySqlDataSourceManager: MySqlDataSourceManager;
+  @Inject()
+  cacheManager: CacheManager;
+
+  /**
+   * 获取表字段及数据列表
+   * @returns
+   */
+  async getList(tableName, sqlWhere, orderByField) {
+    const tableField = await this.getField(tableName);
+    let filed = '';
+    tableField.map(e => {
+      if (e.type !== 3) {
+        filed += '"' + e.name + '" "' + e.name.toLowerCase() + '",';
+      }
+    });
+    let sql = '';
+    if (filed !== '') {
+      filed = filed.substring(0, filed.length - 1);
+      sql = 'select ' + filed + ' from ' + tableName.toLowerCase();
+    } else {
+      sql = 'select * from ' + tableName.toLowerCase();
+    }
+    sql += ' where 1=1 ';
+    if (sqlWhere !== '') {
+      sql += ' and ' + sqlWhere;
+    }
+    if (orderByField !== '') {
+      sql += ' order by ' + orderByField;
+    }
+    console.log(sql);
+    const dataTableSource = await this.getTableSource(tableName);
+    let result;
+    //本数据库源指定source为default
+    if (dataTableSource.length === 0) {
+      result = this.getPgSqlConnected('dataSource0', sql, 'select');
+    } else {
+      const dataType = dataTableSource[0].type;
+      switch (dataType) {
+        case 0:
+          result = this.getOracleConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 1:
+          result = this.getPgSqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql,
+            'select'
+          );
+          break;
+        case 2:
+          result = this.getMysqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 3:
+          result = this.getSqliteConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+
+        default:
+          break;
+      }
+    }
+
+    return result;
+  }
+
+  async getGeoList(tableName, sqlWhere, orderByField) {
+    let srid = 4527;
+    const sridOldResult = await this.getOldSrid(tableName);
+    const sridOld = sridOldResult[0]['st_srid'];
+    let type = '';
+    //如果srid是4326,则进行下一步操作,如果不是则提示“联系管理员”
+    if (sridOld === 4326) {
+      //对经纬度进行算法分析,得到具体的六度带,然后得出2000坐标系的srid,105E----4507,111E----4508,117E----4509,123E----4510,129E---4511
+      const sridNewResult = await this.getNewSrid(tableName);
+      const geoResult = geojson.parse(sridNewResult, {
+        GeoJSON: 'geom',
+      }).features[0]['geometry'];
+      type = JSON.parse(geoResult).type.toLowerCase();
+      const coordinates = JSON.parse(geoResult).coordinates[0][0][0];
+      switch (Math.floor(coordinates[0] / 6)) {
+        case 17: // (102E~108E)
+          srid = 4507;
+          break;
+        case 18: // (108E~114E)
+          srid = 4508;
+          break;
+        case 19: // (114E~120E)
+          srid = 4509;
+          break;
+        case 20: // (120E~126E)
+          srid = 4510;
+          break;
+        case 21: // (126E~132E)
+          srid = 4511;
+          break;
+      }
+    } else {
+      console.log('请联系管理员');
+    }
+    const tableField = await this.getField(tableName);
+    let filed = '';
+    tableField.map(e => {
+      if (e.type !== 3) {
+        filed += '"' + e.name + '" "' + e.name.toLowerCase() + '",';
+      } else {
+        filed +=
+          ' st_asgeojson(ST_Transform(' +
+          e.name +
+          ',4326)) ::json' +
+          ' "' +
+          e.name +
+          '",';
+        if (type.indexOf('polygon') != -1) {
+          filed +=
+            ' st_Area(ST_Transform(' +
+            e.name +
+            ',' +
+            srid +
+            ')) area,ST_perimeter(ST_Transform(' +
+            e.name +
+            ',' +
+            srid +
+            ')) perimeter,';
+        } else {
+          if (type.indexOf('line') != -1) {
+            filed +=
+              ' st_Length(ST_Transform(' + e.name + ',' + srid + ')) length,';
+          }
+        }
+      }
+    });
+    let sql = '';
+    if (filed !== '') {
+      filed = filed.substring(0, filed.length - 1);
+      sql = 'select ' + filed + ' from ' + tableName.toLowerCase();
+    } else {
+      sql = 'select * from ' + tableName.toLowerCase();
+    }
+    sql += ' where 1=1 ';
+    if (sqlWhere !== '') {
+      sql += ' and ' + sqlWhere;
+    }
+    if (orderByField !== '') {
+      sql += ' order by ' + orderByField;
+    }
+    console.log(sql);
+    const dataTableSource = await this.getTableSource(tableName);
+    let result;
+    //本数据库源指定source为default
+    if (dataTableSource.length === 0) {
+      result = this.getPgSqlConnected('dataSource0', sql, 'select');
+    } else {
+      const dataType = dataTableSource[0].type;
+      switch (dataType) {
+        case 0:
+          result = this.getOracleConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 1:
+          result = this.getPgSqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql,
+            'select'
+          );
+          break;
+        case 2:
+          result = this.getMysqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 3:
+          result = this.getSqliteConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+
+        default:
+          break;
+      }
+    }
+
+    return result;
+  }
+
+  async getField(tableName) {
+    const tableField = await this.nativeQuery(
+      'select a.* from config_data_field a LEFT JOIN config_data_table b ON a."tableId" =b."id" WHERE b."name"=$1 ORDER BY a."sortCode" ASC ',
+      tableName
+    );
+    return tableField;
+  }
+
+  async getTableSource(tableName) {
+    const dataTableSource = await this.nativeQuery(
+      'select a.* from config_data_source a LEFT JOIN config_data_table b ON a."id" =b."sourceId" WHERE b."name"=$1 ',
+      tableName
+    );
+    return dataTableSource;
+  }
+
+  //用普通的sql语句,看postgis文档,https://postgis.net/docs/manual-3.3/
+  // async selectGeo() {
+  //   const insertsql =
+  //     "insert into 'points' ('geom', 'id') values (ST_geomFromText('Point(0 0)'), '1')";
+  // }
+
+  /**
+   * 新增或修改
+   * @param tableName 表名
+   * @param keyValue 主键id
+   * @param formData  表单值
+   * @returns 主键id
+   */
+  async addOrUpdateComm(tableName, keyValue, formData) {
+    let result;
+    let sql = '';
+    if (keyValue !== '') {
+      let filed = '';
+      for (const [key, value] of Object.entries(formData)) {
+        const new_key = '"' + key + '"';
+        filed += new_key + "= '" + value + "',";
+      }
+      if (filed !== '') {
+        filed = filed.substring(0, filed.length - 1);
+        sql = 'update ' + tableName + ' set ' + filed + ' where id=' + keyValue;
+      } else {
+        result = '无字段';
+      }
+    } else {
+      let filed = '';
+      let filedValue = '';
+      for (const [key, value] of Object.entries(formData)) {
+        filed += '"' + key + '"' + ',';
+        filedValue += "'" + value + "',";
+      }
+      if (filed !== '') {
+        filed = filed.substring(0, filed.length - 1);
+        filedValue = filedValue.substring(0, filedValue.length - 1);
+        sql = 'insert into ' + tableName + '( ' + filed + ')';
+      } else {
+        result = '无字段';
+      }
+      if (formData !== '') {
+        sql += ' values( ' + filedValue + ')';
+      }
+    }
+
+    console.log(sql);
+    const dataTableSource = await this.getTableSource(tableName);
+    //本数据库源指定source为default
+    if (dataTableSource.length === 0) {
+      result = this.getPgSqlConnected('dataSource0', sql, 'add');
+    } else {
+      const dataType = dataTableSource[0].type;
+      switch (dataType) {
+        case 0:
+          result = this.getOracleConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 1:
+          result = this.getPgSqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql,
+            'add'
+          );
+          break;
+        case 2:
+          result = this.getMysqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 3:
+          result = this.getSqliteConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+
+        default:
+          break;
+      }
+    }
+
+    return result;
+  }
+
+  async deleteComm(tableName, keyValue) {
+    let result;
+    const sql = 'delete from ' + tableName + ' where id= ' + keyValue;
+
+    console.log(sql);
+    const dataTableSource = await this.getTableSource(tableName);
+    //本数据库源指定source为default
+    if (dataTableSource.length === 0) {
+      result = this.getPgSqlConnected('dataSource0', sql, 'add');
+    } else {
+      const dataType = dataTableSource[0].type;
+      switch (dataType) {
+        case 0:
+          result = this.getOracleConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 1:
+          result = this.getPgSqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql,
+            'add'
+          );
+          break;
+        case 2:
+          result = this.getMysqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 3:
+          result = this.getSqliteConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+
+        default:
+          break;
+      }
+    }
+
+    return result;
+  }
+
+  /**
+   * mysql
+   * @returns
+   */
+  async getMysqlConnected(dataSource, sql) {
+    return new Promise((resolve, reject) => {
+      this.mySqlDataSourceManager
+        .getDataSource(dataSource)
+        .query(sql, (err, results, fields) => {
+          // console.log(results); // results contains rows returned by server
+          // console.log(fields); // fields contains extra meta data about results, if available
+          // console.log(err); // fields contains extra meta data about results, if available
+          if (err) reject(err + sql);
+          else resolve(JSON.parse(JSON.stringify(results)));
+        });
+    }).then(value => {
+      return value;
+    });
+  }
+
+  /**
+   * pgsql
+   * @returns
+   */
+  async getPgSqlConnected(dataSource, sql, sqltype) {
+    return new Promise((resolve, reject) => {
+      this.pgDataSourceManager
+        .getDataSource(dataSource)
+        .query(sql, [], (err, response) => {
+          // console.log(results); // results contains rows returned by server
+          // console.log(fields); // fields contains extra meta data about results, if available
+          // console.log(err); // fields contains extra meta data about results, if available
+          if (err) reject(err);
+          else {
+            if (sqltype === 'select')
+              resolve(JSON.parse(JSON.stringify(response.rows)));
+            else resolve(JSON.parse(JSON.stringify(response.rowCount)));
+          }
+        });
+    }).then(value => {
+      return value;
+    });
+  }
+
+  /**
+   * oracle
+   * @returns
+   */
+  async getOracleConnected(dataSource, sql) {
+    let connection;
+    try {
+      connection = await this.oracleDataSourceManager
+        .getDataSource(dataSource)
+        .getConnection();
+      const result = await connection.execute(sql, [], {
+        outFormat: oracledb.OUT_FORMAT_OBJECT,
+      });
+      // return result;
+      return JSON.parse(JSON.stringify(result.rows));
+    } catch (err) {
+      console.error(err);
+    } finally {
+      if (connection) {
+        try {
+          // Put the connection back in the pool
+          await connection.close();
+        } catch (err) {
+          console.error(err);
+        }
+      }
+    }
+  }
+
+  /**
+   * sqlite
+   * @returns
+   */
+  async getSqliteConnected(dataSource, sql) {
+    return new Promise((resolve, reject) => {
+      this.sqliteDataSourceManager
+        .getDataSource(dataSource)
+        .all(sql, [], (err, data) => {
+          if (err) reject(err);
+          else resolve(JSON.parse(JSON.stringify(data)));
+        });
+    }).then(value => {
+      return value;
+    });
+  }
+
+  async invoke() {
+    await this.cacheManager.set('a', 1);
+    // 缓存10秒
+    await this.cacheManager.set('a', 1111, {
+      ttl: 10,
+    });
+    console.log(await this.cacheManager.get('a'));
+  }
+
+  /**
+   *
+   * @param tableName 表名
+   * @param geom 空间字段
+   * @param coordinate 坐标信息
+   * @param buffer 缓冲区,默认要传0
+   * @returns 字段信息
+   */
+  async getSpatialList(tableName, spatialType, coordinate, buffer, sqlWhere) {
+    if (buffer === '') {
+      buffer = '0';
+    }
+    let srid = 4527;
+    const sridOldResult = await this.getOldSrid(tableName);
+    const sridOld = sridOldResult[0]['st_srid'];
+    let type = '';
+    //如果srid是4326,则进行下一步操作,如果不是则提示“联系管理员”
+    if (sridOld === 4326 || sridOld === 4490) {
+      //对经纬度进行算法分析,得到具体的六度带,然后得出2000坐标系的srid,105E----4507,111E----4508,117E----4509,123E----4510,129E---4511
+      const sridNewResult = await this.getNewSrid(tableName);
+      const geoResult = geojson.parse(sridNewResult, {
+        GeoJSON: 'geom',
+      }).features[0]['geometry'];
+      type = JSON.parse(geoResult).type.toLowerCase();
+      let coordinates;
+      if (type.indexOf('polygon') != -1) {
+        coordinates = JSON.parse(geoResult).coordinates[0][0][0];
+      } else {
+        if (type.indexOf('line') != -1) {
+          coordinates = JSON.parse(geoResult).coordinates[0][0];
+        } else {
+          coordinates = JSON.parse(geoResult).coordinates;
+        }
+      }
+      switch (Math.floor(coordinates[0] / 6)) {
+        case 17: // (102E~108E)
+          srid = 4507;
+          break;
+        case 18: // (108E~114E)
+          srid = 4508;
+          break;
+        case 19: // (114E~120E)
+          srid = 4509;
+          break;
+        case 20: // (120E~126E)
+          srid = 4510;
+          break;
+        case 21: // (126E~132E)
+          srid = 4511;
+          break;
+      }
+    } else {
+      console.log('请联系管理员');
+    }
+    const tableField = await this.getField(tableName);
+    let geom = '';
+    let filed = '';
+    tableField.map(e => {
+      if (e.type !== 3) {
+        filed += '"' + e.name + '" "' + e.name.toLowerCase() + '",';
+      } else {
+        filed +=
+          ' st_asgeojson(ST_Transform(' +
+          e.name +
+          ',4326)) ::json' +
+          ' "' +
+          e.name +
+          '",';
+        if (type.indexOf('polygon') != -1) {
+          filed +=
+            ' st_Area(ST_Transform(' +
+            e.name +
+            ',' +
+            srid +
+            ')) area,ST_perimeter(ST_Transform(' +
+            e.name +
+            ',' +
+            srid +
+            ')) perimeter,';
+        } else {
+          if (type.indexOf('line') != -1) {
+            filed +=
+              ' st_Length(ST_Transform(' + e.name + ',' + srid + ')) length,';
+          }
+        }
+        geom = e.name;
+      }
+    });
+    let sql = '';
+    if (filed !== '') {
+      filed = filed.substring(0, filed.length - 1);
+      sql = 'select ' + filed + ' from ' + tableName.toLowerCase();
+    } else {
+      sql = 'select st_asgeojson(' + geom + ') from ' + tableName.toLowerCase();
+    }
+    sql += ' where 1=1 ';
+    if (coordinate !== '' && buffer !== '') {
+      if (spatialType === '点') {
+        sql +=
+          ' and ST_DWithin(ST_Transform(' +
+          geom +
+          ',' +
+          srid +
+          "), ST_Transform(ST_SetSRID(ST_GeomFromText('POINT(" +
+          coordinate +
+          ")',st_srid(" +
+          geom +
+          ')),4326),' +
+          srid +
+          '), ' +
+          buffer +
+          ')=true';
+      } else {
+        if (spatialType === '面') {
+          sql +=
+            ' and ST_DWithin(ST_Transform(' +
+            geom +
+            ',' +
+            srid +
+            "), ST_Transform(ST_SetSRID(ST_GeomFromText('MULTIPOLYGON(((" +
+            coordinate +
+            ")))',st_srid(" +
+            geom +
+            ')),4326),' +
+            srid +
+            '), ' +
+            buffer +
+            ')=true';
+        } else {
+          sql +=
+            ' and ST_DWithin(ST_Transform(' +
+            geom +
+            ',' +
+            srid +
+            "), ST_Transform(ST_SetSRID(ST_GeomFromText('MULTILINESTRING((" +
+            coordinate +
+            "))',st_srid(" +
+            geom +
+            ')),4326),' +
+            srid +
+            '), ' +
+            buffer +
+            ')=true';
+        }
+      }
+    }
+    if (sqlWhere != '') {
+      sql = 'select * from (' + sql + ') a where ' + sqlWhere;
+    }
+    console.log(sql);
+    const dataTableSource = await this.getTableSource(tableName);
+    let result;
+    //本数据库源指定source为default
+    if (dataTableSource.length === 0) {
+      result = this.getPgSqlConnected('dataSource0', sql, 'select');
+    } else {
+      const dataType = dataTableSource[0].type;
+      switch (dataType) {
+        case 0:
+          result = this.getOracleConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 1:
+          result = this.getPgSqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql,
+            'select'
+          );
+          break;
+        case 2:
+          result = this.getMysqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 3:
+          result = this.getSqliteConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+
+        default:
+          break;
+      }
+    }
+
+    return result;
+  }
+
+  async getLineInterpolatePoints(
+    tableName: string,
+    name: object,
+    num_type: string,
+    number: number
+  ) {
+    let srid = 4527;
+    const sridOldResult = await this.getOldSrid(tableName);
+    const sridOld = sridOldResult[0]['st_srid'];
+    //如果srid是4326,则进行下一步操作,如果不是则提示“联系管理员”
+    if (sridOld === 4326 || sridOld === 4490) {
+      //对经纬度进行算法分析,得到具体的六度带,然后得出2000坐标系的srid,105E----4507,111E----4508,117E----4509,123E----4510,129E---4511
+      const sridNewResult = await this.getNewSrid(tableName);
+      const geoResult = geojson.parse(sridNewResult, {
+        GeoJSON: 'geom',
+      }).features[0]['geometry'];
+      const coordinates = JSON.parse(geoResult).coordinates[0][0][0];
+      switch (Math.floor(coordinates[0] / 6)) {
+        case 17: // (102E~108E)
+          srid = 4507;
+          break;
+        case 18: // (108E~114E)
+          srid = 4508;
+          break;
+        case 19: // (114E~120E)
+          srid = 4509;
+          break;
+        case 20: // (120E~126E)
+          srid = 4510;
+          break;
+        case 21: // (126E~132E)
+          srid = 4511;
+          break;
+      }
+    } else {
+      console.log('请联系管理员');
+    }
+    const key = Object.entries(name)[0][0];
+    const value = Object.entries(name)[0][1];
+    let sql =
+      'SELECT ST_AsText(ST_LineMerge(geom)) lp,st_Length(ST_Transform(geom,' +
+      srid +
+      ')) length from ' +
+      tableName.toLowerCase() +
+      ' WHERE "' +
+      key +
+      '"=';
+    sql += " '" + value + "'";
+    let t_sql = '';
+    if (num_type === '段') {
+      t_sql =
+        'SELECT st_asgeojson(ST_SetSRID(ST_LineInterpolatePoints(a.lp, ' +
+        1 / (number - 1) +
+        '),4326)) ::json rs from (' +
+        sql +
+        ') a';
+    } else {
+      t_sql =
+        'SELECT st_asgeojson(ST_SetSRID(ST_LineInterpolatePoints(a.lp, ' +
+        number +
+        '/a.length),4326)) ::json rs from (' +
+        sql +
+        ') a';
+    }
+
+    return this.getResult(t_sql, tableName);
+  }
+
+  async getLineDistance(
+    tableName: string,
+    name: object,
+    point_one: string,
+    point_two: string
+  ) {
+    let srid = 4527;
+    const sridOldResult = await this.getOldSrid(tableName);
+    const sridOld = sridOldResult[0]['st_srid'];
+    //如果srid是4326,则进行下一步操作,如果不是则提示“联系管理员”
+    if (sridOld === 4326 || sridOld === 4490) {
+      //对经纬度进行算法分析,得到具体的六度带,然后得出2000坐标系的srid,105E----4507,111E----4508,117E----4509,123E----4510,129E---4511
+      const sridNewResult = await this.getNewSrid(tableName);
+      const geoResult = geojson.parse(sridNewResult, {
+        GeoJSON: 'geom',
+      }).features[0]['geometry'];
+      const coordinates = JSON.parse(geoResult).coordinates[0][0][0];
+      switch (Math.floor(coordinates[0] / 6)) {
+        case 17: // (102E~108E)
+          srid = 4507;
+          break;
+        case 18: // (108E~114E)
+          srid = 4508;
+          break;
+        case 19: // (114E~120E)
+          srid = 4509;
+          break;
+        case 20: // (120E~126E)
+          srid = 4510;
+          break;
+        case 21: // (126E~132E)
+          srid = 4511;
+          break;
+      }
+    } else {
+      console.log('请联系管理员');
+    }
+    const key = Object.entries(name)[0][0];
+    const value = Object.entries(name)[0][1];
+    let sql =
+      'SELECT ST_AsText(ST_LineMerge(geom)) lp from ' +
+      tableName.toLowerCase() +
+      ' WHERE "' +
+      key +
+      '"=';
+    sql += " '" + value + "'";
+
+    const t_sql =
+      'SELECT st_asgeojson(c.geom) ::json rs,st_Length(ST_Transform(c.geom,' +
+      srid +
+      ")) length from (SELECT ST_SetSRID(ST_LineSubstring(b.lp,b.rsp1,b.rsp2),4326) geom from (SELECT ST_LineLocatePoint(a.lp, ST_GeomFromText('POINT(" +
+      point_one +
+      ")')) rsp1,ST_LineLocatePoint(a.lp, ST_GeomFromText('POINT(" +
+      point_two +
+      ")')) rsp2,a.lp lp from (" +
+      sql +
+      ') a) b) c';
+
+    return this.getResult(t_sql, tableName);
+  }
+
+  async getResult(sql, tableName) {
+    console.log(sql);
+    const dataTableSource = await this.getTableSource(tableName);
+    let result;
+    //本数据库源指定source为default
+    if (dataTableSource.length === 0) {
+      result = this.getPgSqlConnected('dataSource0', sql, 'select');
+    } else {
+      const dataType = dataTableSource[0].type;
+      switch (dataType) {
+        case 0:
+          result = this.getOracleConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 1:
+          result = this.getPgSqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql,
+            'select'
+          );
+          break;
+        case 2:
+          result = this.getMysqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 3:
+          result = this.getSqliteConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+
+        default:
+          break;
+      }
+    }
+    return result;
+  }
+
+  async getOldSrid(tableName) {
+    //通过去表里面查询任意一条数据,获取数据的经纬度和srid
+    const sql =
+      'select st_srid(geom) from ' +
+      tableName.toLowerCase() +
+      ' order by id limit 1';
+    const dataTableSource = await this.getTableSource(tableName);
+    let result;
+    //本数据库源指定source为default
+    if (dataTableSource.length === 0) {
+      result = this.getPgSqlConnected('dataSource0', sql, 'select');
+    } else {
+      const dataType = dataTableSource[0].type;
+      switch (dataType) {
+        case 0:
+          result = this.getOracleConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 1:
+          result = this.getPgSqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql,
+            'select'
+          );
+          break;
+        case 2:
+          result = this.getMysqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 3:
+          result = this.getSqliteConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+
+        default:
+          break;
+      }
+    }
+    return result;
+  }
+  async getNewSrid(tableName) {
+    //通过去表里面查询任意一条数据,获取数据的经纬度和srid
+    const sql =
+      'select st_asgeojson(geom) geom from ' +
+      tableName.toLowerCase() +
+      ' order by id limit 1';
+    const dataTableSource = await this.getTableSource(tableName);
+    let result;
+    //本数据库源指定source为default
+    if (dataTableSource.length === 0) {
+      result = this.getPgSqlConnected('dataSource0', sql, 'select');
+    } else {
+      const dataType = dataTableSource[0].type;
+      switch (dataType) {
+        case 0:
+          result = this.getOracleConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 1:
+          result = this.getPgSqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql,
+            'select'
+          );
+          break;
+        case 2:
+          result = this.getMysqlConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+        case 3:
+          result = this.getSqliteConnected(
+            'dataSource' + dataTableSource[0].id,
+            sql
+          );
+          break;
+
+        default:
+          break;
+      }
+    }
+    return result;
+  }
+}

+ 48 - 0
yxgb-admin-midway/src/modules/base/service/mbtile.service.ts

@@ -0,0 +1,48 @@
+import { Provide, Inject } from '@midwayjs/decorator';
+import { SqliteDataSourceManager } from '../manager/sqliteDataSourceManager';
+import { DataSourceEntity } from '../entity/sys/data_source';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+import * as MBTiles from '@mapbox/mbtiles';
+import { resolve } from 'path';
+
+@Provide()
+export class mbTileService {
+  @Inject()
+  sqliteDataSourceManager: SqliteDataSourceManager;
+  @InjectEntityModel(DataSourceEntity)
+  dataSourceEntity: Repository<DataSourceEntity>;
+
+  async getMbTiles(t, z, x, y) {
+    //获取数据库的配置地址
+    const dataTableSource = await this.dataSourceEntity.findOne({
+      where: { name: t },
+    });
+    const mbtilesLocation = resolve(dataTableSource.database);
+    try {
+      return new Promise((resolve, reject) => {
+        new MBTiles(mbtilesLocation, (err, mbtiles) => {
+          if (err) reject(err);
+          mbtiles.getTile(
+            Number(z),
+            Number(x),
+            (1 << Number(z)) - 1 - Number(y),
+            (err, tile, headers) => {
+              if (err) {
+                reject('Tile rendering error: ' + err + '\n');
+              } else {
+                console.log(z);
+                resolve(tile);
+              }
+            }
+          );
+        });
+      }).then(value => {
+        return value;
+      });
+    } catch (error) {
+      console.log('error:!!!' + error);
+      return '';
+    }
+  }
+}

+ 203 - 0
yxgb-admin-midway/src/modules/base/service/sys/atlas.ts

@@ -0,0 +1,203 @@
+import { Provide, Inject } from '@midwayjs/decorator';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+import { BaseSysAtlasEntity } from '../../entity/sys/atlas';
+import { BaseSysLayersEntity } from '../../entity/sys/layers';
+import { BaseSysRoleAtlasEntity } from '../../entity/sys/role_atlas';
+import { BaseService } from '@cool-midway/core';
+import { v1 as uuid } from 'uuid';
+import { Context } from '@midwayjs/koa';
+
+/**
+ * 描述
+ */
+@Provide()
+export class BaseSysAtlasService extends BaseService {
+  @Inject()
+  ctx: Context;
+
+  @InjectEntityModel(BaseSysAtlasEntity)
+  baseSysAtlasEntity: Repository<BaseSysAtlasEntity>;
+
+  @InjectEntityModel(BaseSysLayersEntity)
+  baseSysLayersEntity: Repository<BaseSysLayersEntity>;
+
+  @InjectEntityModel(BaseSysRoleAtlasEntity)
+  baseSysRoleAtlasEntity: Repository<BaseSysRoleAtlasEntity>;
+
+  async add(param) {
+    const atlasId = uuid();
+    param.layerList.map(e => {
+      const entity = new BaseSysAtlasEntity();
+      let cc = '';
+      entity.atlasId = atlasId;
+      entity.atlasName = param.atlasName;
+      entity.atlasType = param.atlasType;
+      // entity.isCheck = e.isCheck === undefined ? 3 : e.isCheck;
+      if (e.isHide === '0') {
+        cc += 'N';
+      } else {
+        cc += 'Y';
+      }
+      if (e.isExpand === '0') {
+        cc += 'N';
+      } else {
+        cc += 'Y';
+      }
+      if (e.isCheck === undefined || e.isCheck === 3) {
+        cc += 'N';
+      } else {
+        if (e.isCheck === 6) {
+          cc += 'R';
+        } else {
+          cc += 'C';
+        }
+      }
+      if (e.isInit === '0') {
+        cc += 'N';
+      } else {
+        cc += 'Y';
+      }
+      // entity.isExpand = e.isExpand;
+      // entity.isHide = e.isHide;
+      // entity.isInit = e.isInit;
+      entity.treeNode = cc;
+      entity.opacity = e.opacity;
+      entity.layerId = e.id;
+      entity.orderNum = 0;
+      this.baseSysAtlasEntity.save(entity);
+    });
+
+    return {
+      id:
+        param instanceof Array
+          ? param.map(e => {
+              return e.id;
+            })
+          : param.id,
+    };
+  }
+
+  async update(param) {
+    if (typeof param.layerList != 'string') {
+      await this.baseSysAtlasEntity.delete({ atlasId: param.atlasId });
+
+      param.layerList.map(e => {
+        const entity = new BaseSysAtlasEntity();
+        let cc = '';
+        entity.atlasId = param.atlasId;
+        entity.atlasName = param.atlasName;
+        entity.atlasType = param.atlasType;
+        // entity.isCheck = e.isCheck === undefined ? 3 : e.isCheck;
+        if (e.isHide === '0' || e.isHide === undefined) {
+          cc += 'N';
+        } else {
+          cc += 'Y';
+        }
+        if (e.isExpand === '0' || e.isExpand === undefined) {
+          cc += 'N';
+        } else {
+          cc += 'Y';
+        }
+        if (e.isCheck === undefined || e.isCheck === 3) {
+          cc += 'N';
+        } else {
+          if (e.isCheck === 6) {
+            cc += 'R';
+          } else {
+            cc += 'C';
+          }
+        }
+        if (e.isInit === '0' || e.isInit === undefined) {
+          cc += 'N';
+        } else {
+          cc += 'Y';
+        }
+        // entity.isExpand = e.isExpand;
+        // entity.isHide = e.isHide;
+        // entity.isInit = e.isInit;
+        entity.treeNode = cc;
+        entity.opacity = e.opacity;
+        entity.layerId = e.id;
+        entity.orderNum = 0;
+        this.baseSysAtlasEntity.save(entity);
+      });
+    }
+  }
+
+  async distinctList() {
+    const roleIds = this.ctx.admin.roleIds;
+    const isAdmin = this.ctx.admin.username === 'admin';
+    return await this.nativeQuery(`
+    select a.* from (SELECT
+      distinct "atlasName","atlasId" id,"orderNum","atlasType"
+    FROM
+    map_atlas 
+    ) a
+    ${this.setSql(
+      !isAdmin,
+      'JOIN base_sys_role_atlas b on a."atlasId" = b."atlasId" AND b."roleId" = ANY ($1)',
+      [roleIds]
+    )}
+    ORDER BY
+        "orderNum" ASC`);
+  }
+
+  /**
+   * 根据ID获得信息
+   * @param id
+   */
+  public async info(id) {
+    const info = await this.baseSysAtlasEntity.findOneBy({
+      atlasId: id,
+    });
+    if (info) {
+      // const atlas = await this.baseSysAtlasEntity.find({ atlasId: id });
+      // const layerList = atlas.map(e => {
+      //   return e.layerId + '';
+      // });
+      const layerList = id;
+      return {
+        ...info,
+        layerList,
+      };
+    }
+    return {};
+  }
+
+  async layerList(id) {
+    const sql =
+      `
+    select * from map_layers l left join (select "layerId","atlasName","atlasId","atlasType",opacity,"treeNode",1 "pageCheck" from map_atlas
+       WHERE "atlasId"='` +
+      id +
+      '\') a on l.id = a."layerId" ';
+    return await this.nativeQuery(sql);
+  }
+
+  // async selectList(id) {
+  //   return await this.baseSysAtlasEntity.find({ atlasId: id });
+  // }
+
+  async delete(ids) {
+    if (ids instanceof Array) {
+      ids.forEach(async id => {
+        this.baseSysAtlasEntity.delete({ atlasId: id });
+        this.baseSysRoleAtlasEntity.delete({ atlasId: id });
+        // const atlas = await this.baseSysAtlasEntity.find({ atlasId: id });
+        // atlas.map(e => {
+        //   this.baseSysLayersEntity.delete({ id: e.layerId });
+        // });
+      });
+    } else {
+      ids.split(',').forEach(async id => {
+        this.baseSysAtlasEntity.delete({ atlasId: id });
+        this.baseSysRoleAtlasEntity.delete({ atlasId: id });
+        // const atlas = await this.baseSysAtlasEntity.find({ atlasId: id });
+        // atlas.map(e => {
+        //   this.baseSysLayersEntity.delete({ id: e.layerId });
+        // });
+      });
+    }
+  }
+}

+ 39 - 0
yxgb-admin-midway/src/modules/base/service/sys/conf.ts

@@ -0,0 +1,39 @@
+import { Provide } from '@midwayjs/decorator';
+import { BaseService } from '@cool-midway/core';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+import { BaseSysConfEntity } from '../../entity/sys/conf';
+
+/**
+ * 系统配置
+ */
+@Provide()
+export class BaseSysConfService extends BaseService {
+  @InjectEntityModel(BaseSysConfEntity)
+  baseSysConfEntity: Repository<BaseSysConfEntity>;
+
+  /**
+   * 获得配置参数值
+   * @param key
+   */
+  async getValue(key) {
+    const conf = await this.baseSysConfEntity.findOneBy({ cKey: key });
+    if (conf) {
+      return conf.cValue;
+    }
+  }
+
+  /**
+   * 更新配置参数
+   * @param cKey
+   * @param cValue
+   */
+  async updateVaule(cKey, cValue) {
+    await this.baseSysConfEntity
+      .createQueryBuilder()
+      .update()
+      .where({ cKey })
+      .set({ cKey, cValue })
+      .execute();
+  }
+}

+ 10 - 0
yxgb-admin-midway/src/modules/base/service/sys/data.ts

@@ -0,0 +1,10 @@
+import { DataSource } from 'typeorm';
+
+export class TempDataSource extends DataSource {
+  /**
+   * 重新构造元数据
+   */
+  async buildMetadatas() {
+    await super.buildMetadatas();
+  }
+}

+ 101 - 0
yxgb-admin-midway/src/modules/base/service/sys/datafield.ts

@@ -0,0 +1,101 @@
+import { Inject, Provide } from '@midwayjs/decorator';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { BaseService, CoolCommException } from '@cool-midway/core';
+import { Repository } from 'typeorm';
+import { BaseSysPermsService } from './perms';
+import * as _ from 'lodash';
+import { DataFieldEntity } from '../../entity/sys/data_field';
+
+/**
+ * 系统用户
+ */
+@Provide()
+export class BaseSysFieldService extends BaseService {
+  @InjectEntityModel(DataFieldEntity)
+  dataFieldEntity: Repository<DataFieldEntity>;
+
+  @Inject()
+  baseSysPermsService: BaseSysPermsService;
+
+  @Inject()
+  ctx;
+
+  /**
+   * 分页查询
+   * @param query
+   */
+  async page(query) {
+    const { keyWord, status, tableIds = [] } = query;
+    const permsDepartmentArr = await this.baseSysPermsService.departmentIds(
+      this.ctx.admin.userId
+    ); // 部门权限
+    const sql = `
+        SELECT
+            a.*,
+            b.name as "tableName"
+        FROM
+        config_data_field a
+            LEFT JOIN config_data_table b ON a."tableId" = b.id
+        WHERE 1 = 1
+            ${this.setSql(!_.isEmpty(tableIds), 'and a."tableId" = ANY ($1)', [
+              tableIds,
+            ])}
+            ${this.setSql(
+              keyWord,
+              !_.isEmpty(tableIds)
+                ? status !== undefined
+                  ? 'and (a.name LIKE $3 or a.description LIKE $4)'
+                  : 'and (a.name LIKE $2 or a.description LIKE $3)'
+                : status !== undefined
+                ? 'and (a.name LIKE $2 or a.description LIKE $3)'
+                : 'and (a.name LIKE $1 or a.description LIKE $2)',
+              [`%${keyWord}%`, `%${keyWord}%`]
+            )}
+            ${this.setSql(
+              this.ctx.admin.username !== 'admin',
+              !_.isEmpty(tableIds)
+                ? status !== undefined
+                  ? keyWord !== undefined
+                    ? 'and a."tableId" = ANY ($5)'
+                    : 'and a."tableId" = ANY ($3)'
+                  : keyWord !== undefined
+                  ? 'and a."tableId" = ANY ($4)'
+                  : 'and a."tableId" = ANY ($2)'
+                : status !== undefined
+                ? keyWord !== undefined
+                  ? 'and a."tableId" = ANY ($4)'
+                  : 'and a."tableId" = ANY ($2)'
+                : keyWord !== undefined
+                ? 'and a."tableId" = ANY ($3)'
+                : 'and a."tableId" = ANY ($1)',
+
+              [!_.isEmpty(permsDepartmentArr) ? permsDepartmentArr : [null]]
+            )}
+        GROUP BY a.id,b.name
+        `;
+    return this.sqlRenderPage(sql, query);
+  }
+
+  /**
+   * 新增
+   * @param param
+   */
+  async add(param) {
+    const exists = await this.dataFieldEntity.findOneBy({
+      name: param.name,
+      tableId: param.tableId,
+    });
+    if (!_.isEmpty(exists)) {
+      throw new CoolCommException('字段名已经存在~');
+    }
+    await this.dataFieldEntity.save(param);
+    return param.id;
+  }
+
+  async disList(tableId) {
+    const exists = await this.dataFieldEntity.findBy({
+      tableId: tableId,
+    });
+    return exists;
+  }
+}

+ 99 - 0
yxgb-admin-midway/src/modules/base/service/sys/datafields.ts

@@ -0,0 +1,99 @@
+import { Inject, Provide } from '@midwayjs/decorator';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { BaseService, CoolCommException } from '@cool-midway/core';
+import { Repository } from 'typeorm';
+import { BaseSysPermsService } from './perms';
+import * as _ from 'lodash';
+import { DataFieldEntity } from '../../entity/sys/data_field';
+
+/**
+ * 系统用户
+ */
+@Provide()
+export class BaseSysFieldsService extends BaseService {
+  @InjectEntityModel(DataFieldEntity)
+  dataFieldEntity: Repository<DataFieldEntity>;
+
+  @Inject()
+  baseSysPermsService: BaseSysPermsService;
+
+  @Inject()
+  ctx;
+
+  /**
+   * 分页查询
+   * @param query
+   */
+  async page(query) {
+    const { name = [] } = query;
+    const sql = 'select * from ' + name;
+    // const sql = `
+    //     SELECT
+    //         a.*,
+    //         b.name as "tableName"
+    //     FROM
+    //     config_data_field a
+    //         LEFT JOIN config_data_table b ON a."tableId" = b.id
+    //     WHERE 1 = 1
+    //         ${this.setSql(!_.isEmpty(tableIds), 'and a."tableId" = ANY ($1)', [
+    //           tableIds,
+    //         ])}
+    //         ${this.setSql(
+    //           keyWord,
+    //           !_.isEmpty(tableIds)
+    //             ? status !== undefined
+    //               ? 'and (a.name LIKE $3 or a.description LIKE $4)'
+    //               : 'and (a.name LIKE $2 or a.description LIKE $3)'
+    //             : status !== undefined
+    //             ? 'and (a.name LIKE $2 or a.description LIKE $3)'
+    //             : 'and (a.name LIKE $1 or a.description LIKE $2)',
+    //           [`%${keyWord}%`, `%${keyWord}%`]
+    //         )}
+    //         ${this.setSql(
+    //           this.ctx.admin.username !== 'admin',
+    //           !_.isEmpty(tableIds)
+    //             ? status !== undefined
+    //               ? keyWord !== undefined
+    //                 ? 'and a."tableId" = ANY ($5)'
+    //                 : 'and a."tableId" = ANY ($3)'
+    //               : keyWord !== undefined
+    //               ? 'and a."tableId" = ANY ($4)'
+    //               : 'and a."tableId" = ANY ($2)'
+    //             : status !== undefined
+    //             ? keyWord !== undefined
+    //               ? 'and a."tableId" = ANY ($4)'
+    //               : 'and a."tableId" = ANY ($2)'
+    //             : keyWord !== undefined
+    //             ? 'and a."tableId" = ANY ($3)'
+    //             : 'and a."tableId" = ANY ($1)',
+
+    //           [!_.isEmpty(permsDepartmentArr) ? permsDepartmentArr : [null]]
+    //         )}
+    //     GROUP BY a.id,b.name
+    //     `;
+    return this.sqlRenderPage(sql, query);
+  }
+
+  /**
+   * 新增
+   * @param param
+   */
+  async add(param) {
+    const exists = await this.dataFieldEntity.findOneBy({
+      name: param.name,
+      tableId: param.tableId,
+    });
+    if (!_.isEmpty(exists)) {
+      throw new CoolCommException('字段名已经存在~');
+    }
+    await this.dataFieldEntity.save(param);
+    return param.id;
+  }
+
+  async disList(tableId) {
+    const exists = await this.dataFieldEntity.findBy({
+      tableId: tableId,
+    });
+    return exists;
+  }
+}

+ 95 - 0
yxgb-admin-midway/src/modules/base/service/sys/datatable.ts

@@ -0,0 +1,95 @@
+import { Inject, Provide } from '@midwayjs/decorator';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { BaseService, CoolCommException } from '@cool-midway/core';
+import { Repository } from 'typeorm';
+import { BaseSysPermsService } from './perms';
+import * as _ from 'lodash';
+import { DataTableEntity } from '../../entity/sys/data_table';
+
+/**
+ * 系统用户
+ */
+@Provide()
+export class BaseSysTableService extends BaseService {
+  @InjectEntityModel(DataTableEntity)
+  dataTableEntity: Repository<DataTableEntity>;
+
+  @Inject()
+  baseSysPermsService: BaseSysPermsService;
+
+  @Inject()
+  ctx;
+
+  /**
+   * 分页查询
+   * @param query
+   */
+  async page(query) {
+    const { keyWord, status, sourceIds = [] } = query;
+    const permsDepartmentArr = await this.baseSysPermsService.departmentIds(
+      this.ctx.admin.userId
+    ); // 部门权限
+    const sql = `
+        SELECT
+            a.*,
+            b.name as "dataSourceName"
+        FROM
+        config_data_table a
+            LEFT JOIN config_data_source b ON a."sourceId" = b.id
+        WHERE 1 = 1
+            ${this.setSql(
+              !_.isEmpty(sourceIds),
+              'and a."sourceId" = ANY ($1)',
+              [sourceIds]
+            )}
+            ${this.setSql(
+              keyWord,
+              !_.isEmpty(sourceIds)
+                ? status !== undefined
+                  ? 'and (a.name LIKE $3 or a.description LIKE $4)'
+                  : 'and (a.name LIKE $2 or a.description LIKE $3)'
+                : status !== undefined
+                ? 'and (a.name LIKE $2 or a.description LIKE $3)'
+                : 'and (a.name LIKE $1 or a.description LIKE $2)',
+              [`%${keyWord}%`, `%${keyWord}%`]
+            )}
+            ${this.setSql(
+              this.ctx.admin.username !== 'admin',
+              !_.isEmpty(sourceIds)
+                ? status !== undefined
+                  ? keyWord !== undefined
+                    ? 'and a."sourceId" = ANY ($5)'
+                    : 'and a."sourceId" = ANY ($3)'
+                  : keyWord !== undefined
+                  ? 'and a."sourceId" = ANY ($4)'
+                  : 'and a."sourceId" = ANY ($2)'
+                : status !== undefined
+                ? keyWord !== undefined
+                  ? 'and a."sourceId" = ANY ($4)'
+                  : 'and a."sourceId" = ANY ($2)'
+                : keyWord !== undefined
+                ? 'and a."sourceId" = ANY ($3)'
+                : 'and a."sourceId" = ANY ($1)',
+
+              [!_.isEmpty(permsDepartmentArr) ? permsDepartmentArr : [null]]
+            )}
+        GROUP BY a.id,b.name
+        `;
+    return this.sqlRenderPage(sql, query);
+  }
+
+  /**
+   * 新增
+   * @param param
+   */
+  async add(param) {
+    const exists = await this.dataTableEntity.findOneBy({
+      name: param.name,
+    });
+    if (!_.isEmpty(exists)) {
+      throw new CoolCommException('表名已经存在~');
+    }
+    await this.dataTableEntity.save(param);
+    return param.id;
+  }
+}

+ 123 - 0
yxgb-admin-midway/src/modules/base/service/sys/department.ts

@@ -0,0 +1,123 @@
+import { Inject, Provide } from '@midwayjs/decorator';
+import { BaseService } from '@cool-midway/core';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+import { BaseSysDepartmentEntity } from '../../entity/sys/department';
+import * as _ from 'lodash';
+import { BaseSysRoleDepartmentEntity } from '../../entity/sys/role_department';
+import { BaseSysPermsService } from './perms';
+
+/**
+ * 描述
+ */
+@Provide()
+export class BaseSysDepartmentService extends BaseService {
+  @InjectEntityModel(BaseSysDepartmentEntity)
+  baseSysDepartmentEntity: Repository<BaseSysDepartmentEntity>;
+
+  @InjectEntityModel(BaseSysRoleDepartmentEntity)
+  baseSysRoleDepartmentEntity: Repository<BaseSysRoleDepartmentEntity>;
+
+  @Inject()
+  baseSysPermsService: BaseSysPermsService;
+
+  @Inject()
+  ctx;
+
+  /**
+   * 获得部门菜单
+   */
+  async list() {
+    // 部门权限
+    const permsDepartmentArr = await this.baseSysPermsService.departmentIds(
+      this.ctx.admin.userId
+    );
+
+    // 过滤部门权限
+    const find = this.baseSysDepartmentEntity.createQueryBuilder();
+    if (this.ctx.admin.username !== 'admin')
+      find.andWhere('id = ANY (:ids)', {
+        ids: !_.isEmpty(permsDepartmentArr) ? permsDepartmentArr : [null],
+      });
+    find.addOrderBy('"orderNum"', 'ASC');
+    const departments: BaseSysDepartmentEntity[] = await find.getMany();
+
+    if (!_.isEmpty(departments)) {
+      departments.forEach(e => {
+        const parentMenu = departments.filter(m => {
+          e.parentId = parseInt(e.parentId + '');
+          if (e.parentId == m.id) {
+            return m.name;
+          }
+        });
+        if (!_.isEmpty(parentMenu)) {
+          e.parentName = parentMenu[0].name;
+        }
+      });
+    }
+    return departments;
+  }
+
+  /**
+   * 根据多个ID获得部门权限信息
+   * @param {[]} roleIds 数组
+   * @param isAdmin 是否超管
+   */
+  async getByRoleIds(roleIds: number[], isAdmin) {
+    if (!_.isEmpty(roleIds)) {
+      if (isAdmin) {
+        const result = await this.baseSysDepartmentEntity.find();
+        return result.map(e => {
+          return e.id;
+        });
+      }
+      const result = await this.baseSysRoleDepartmentEntity
+        .createQueryBuilder()
+        .where('"roleId" = ANY (:roleIds)', { roleIds })
+        .getMany();
+      if (!_.isEmpty(result)) {
+        return _.uniq(
+          result.map(e => {
+            return e.departmentId;
+          })
+        );
+      }
+    }
+    return [];
+  }
+
+  /**
+   * 部门排序
+   * @param params
+   */
+  async order(params) {
+    for (const e of params) {
+      await this.baseSysDepartmentEntity.update(e.id, e);
+    }
+  }
+
+  /**
+   * 删除
+   */
+  async delete(ids: number[]) {
+    const { deleteUser } = this.ctx.request.body;
+    await super.delete(ids);
+    if (deleteUser) {
+      await this.nativeQuery(
+        'delete from base_sys_user where "departmentId" = ANY ($1)',
+        [ids]
+      );
+    } else {
+      const topDepartment = await this.baseSysDepartmentEntity
+        .createQueryBuilder()
+        .where('"parentId" is null')
+        .getOne();
+      if (topDepartment) {
+        await this.nativeQuery(
+          'update base_sys_user a set a."departmentId" = $1 where a."departmentId" = ANY ($2)',
+          [topDepartment.id, ids]
+        );
+      }
+    }
+  }
+}

+ 135 - 0
yxgb-admin-midway/src/modules/base/service/sys/layers.ts

@@ -0,0 +1,135 @@
+import { Provide, Inject } from '@midwayjs/decorator';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+import { BaseSysAtlasEntity } from '../../entity/sys/atlas';
+import { BaseSysLayersEntity } from '../../entity/sys/layers';
+import { BaseService } from '@cool-midway/core';
+import { Context } from '@midwayjs/koa';
+
+/**
+ * 描述
+ */
+@Provide()
+export class BaseSysLayersService extends BaseService {
+  @Inject()
+  ctx: Context;
+
+  @InjectEntityModel(BaseSysAtlasEntity)
+  baseSysAtlasEntity: Repository<BaseSysAtlasEntity>;
+
+  @InjectEntityModel(BaseSysLayersEntity)
+  baseSysLayersEntity: Repository<BaseSysLayersEntity>;
+
+  async delete(ids) {
+    if (ids instanceof Array) {
+      await this.baseSysLayersEntity.delete(ids);
+      ids.forEach(id => {
+        this.baseSysAtlasEntity.delete({ layerId: id });
+      });
+    } else {
+      await this.baseSysLayersEntity.delete(ids.split(','));
+      ids.split(',').forEach(id => {
+        this.baseSysAtlasEntity.delete({ layerId: id });
+      });
+    }
+  }
+
+  async add(param) {
+    if (param.parameterSet === '' || param.parameterSet === undefined) {
+      param.parameterSet = null;
+    } else {
+      param.parameterSet = JSON.parse(param.parameterSet);
+    }
+    let querySet = {};
+    querySet['queryType'] = param.mapQuery;
+    querySet['querySource'] = param.querySetLi;
+    querySet['queryField'] = param.queryField;
+    querySet['displayField'] = param.displayField;
+    querySet['queryFilter'] = param.queryFilter;
+    param.querySet = querySet;
+    this.baseSysLayersEntity.save(param);
+
+    return {
+      id:
+        param instanceof Array
+          ? param.map(e => {
+              return e.id;
+            })
+          : param.id,
+    };
+  }
+
+  async update(param) {
+    if (param.parameterSet === '' || param.parameterSet === undefined) {
+      param.parameterSet = null;
+    } else {
+      param.parameterSet = JSON.parse(param.parameterSet);
+    }
+    let querySet = {};
+    querySet['queryType'] = param.mapQuery;
+    querySet['querySource'] = param.querySetLi;
+    querySet['queryField'] = param.queryField;
+    querySet['displayField'] = param.displayField;
+    querySet['queryFilter'] = param.queryFilter;
+    param.querySet = querySet;
+    this.baseSysLayersEntity.save(param);
+  }
+
+  /**
+   * 根据ID获得信息
+   * @param id
+   */
+  public async info(id) {
+    const info = await this.baseSysLayersEntity.findOneBy({
+      id,
+    });
+    if (info) {
+      info.parameterSet =
+        info.parameterSet != null ? JSON.stringify(info.parameterSet) : '';
+      info.mapQuery = info.querySet != null ? info.querySet['queryType'] : '';
+      info.querySetLi =
+        info.querySet != null ? info.querySet['querySource'] : '';
+      info.queryField =
+        info.querySet != null ? info.querySet['queryField'] : '';
+      info.displayField =
+        info.querySet != null ? info.querySet['displayField'] : '';
+      info.queryFilter =
+        info.querySet != null ? info.querySet['queryFilter'] : '';
+      return {
+        ...info,
+      };
+    }
+    return {};
+  }
+
+  /**
+   * 获取ordernum
+   * @returns
+   */
+  async getMaxOrderNum() {
+    let num = 1;
+    const orderNumEntity = await this.baseSysLayersEntity.find({
+      order: { orderNum: 'DESC' },
+    });
+    if (orderNumEntity.length > 0) {
+      num = orderNumEntity[0].orderNum + 1;
+    }
+    return num;
+  }
+
+  /**
+   * 获取layerorder
+   * @returns
+   */
+  async getMaxLayerOrder(layerCode) {
+    let num = 1;
+    const entity = await this.baseSysLayersEntity.find({
+      where: { layerCode: layerCode },
+      order: { layerOrder: 'DESC' },
+    });
+    if (entity.length > 0) {
+      num = entity[0].layerOrder + 1;
+    }
+    return num;
+  }
+}

+ 72 - 0
yxgb-admin-midway/src/modules/base/service/sys/log.ts

@@ -0,0 +1,72 @@
+import { Inject, Provide } from '@midwayjs/decorator';
+import { BaseService } from '@cool-midway/core';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+import * as _ from 'lodash';
+import { BaseSysLogEntity } from '../../entity/sys/log';
+import * as moment from 'moment';
+import { Utils } from '../../../../comm/utils';
+import { BaseSysConfService } from './conf';
+import { Context } from '@midwayjs/koa';
+
+/**
+ * 描述
+ */
+@Provide()
+export class BaseSysLogService extends BaseService {
+  @Inject()
+  ctx;
+
+  @Inject()
+  utils: Utils;
+
+  @InjectEntityModel(BaseSysLogEntity)
+  baseSysLogEntity: Repository<BaseSysLogEntity>;
+
+  @Inject()
+  baseSysConfService: BaseSysConfService;
+
+  /**
+   * 记录
+   * @param url URL地址
+   * @param params 参数
+   * @param userId 用户ID
+   */
+  async record(context: Context, url, params, userId) {
+    const ip = await this.utils.getReqIP(context);
+    const sysLog = new BaseSysLogEntity();
+    sysLog.userId = userId;
+    sysLog.ip = typeof ip === 'string' ? ip : ip.join(',');
+    const ipAddrArr = [];
+    for (const e of sysLog.ip.split(','))
+      ipAddrArr.push(await await this.utils.getIpAddr(context, e));
+    sysLog.ipAddr = ipAddrArr.join(',');
+    sysLog.action = url.split('?')[0];
+    sysLog.params = params;
+    await this.baseSysLogEntity.insert(sysLog);
+  }
+
+  /**
+   * 日志
+   * @param isAll 是否清除全部
+   */
+  async clear(isAll?) {
+    if (isAll) {
+      await this.baseSysLogEntity.clear();
+      return;
+    }
+    const keepDay = await this.baseSysConfService.getValue('logKeep');
+    if (keepDay) {
+      const beforeDate = `${moment()
+        .add(-keepDay, 'days')
+        .format('YYYY-MM-DD')} 00:00:00`;
+      await this.baseSysLogEntity
+        .createQueryBuilder()
+        .delete()
+        .where('createTime < :createTime', { createTime: beforeDate })
+        .execute();
+    } else {
+      await this.baseSysLogEntity.clear();
+    }
+  }
+}

+ 236 - 0
yxgb-admin-midway/src/modules/base/service/sys/login.ts

@@ -0,0 +1,236 @@
+import { Inject, Provide, Config } from '@midwayjs/decorator';
+import { BaseService, CoolCommException, RESCODE } from '@cool-midway/core';
+import { LoginDTO } from '../../dto/login';
+import * as svgCaptcha from 'svg-captcha';
+import { v1 as uuid } from 'uuid';
+import { BaseSysUserEntity } from '../../entity/sys/user';
+import { Repository } from 'typeorm';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import * as md5 from 'md5';
+import { BaseSysRoleService } from './role';
+import * as _ from 'lodash';
+import { BaseSysMenuService } from './menu';
+import { BaseSysDepartmentService } from './department';
+import * as jwt from 'jsonwebtoken';
+import * as svgToDataURL from 'mini-svg-data-uri';
+import { Context } from '@midwayjs/koa';
+import { CacheManager } from '@midwayjs/cache';
+
+/**
+ * 登录
+ */
+@Provide()
+export class BaseSysLoginService extends BaseService {
+  @Inject()
+  cacheManager: CacheManager;
+
+  @InjectEntityModel(BaseSysUserEntity)
+  baseSysUserEntity: Repository<BaseSysUserEntity>;
+
+  @Inject()
+  baseSysRoleService: BaseSysRoleService;
+
+  @Inject()
+  baseSysMenuService: BaseSysMenuService;
+
+  @Inject()
+  baseSysDepartmentService: BaseSysDepartmentService;
+
+  @Inject()
+  ctx: Context;
+
+  @Config('module.base')
+  coolConfig;
+
+  /**
+   * 登录
+   * @param login
+   */
+  async login(login: LoginDTO) {
+    const { username, password } = login;
+    const user = await this.baseSysUserEntity.findOneBy({ username });
+    // 校验用户
+    if (user) {
+      // 校验用户状态及密码
+      if (user.status === 0 || user.password !== md5(password)) {
+        throw new CoolCommException('账户或密码不正确~');
+      }
+    } else {
+      throw new CoolCommException('账户或密码不正确~');
+    }
+    // 校验角色
+    const roleIds = await this.baseSysRoleService.getByUser(user.id);
+    if (_.isEmpty(roleIds)) {
+      throw new CoolCommException('该用户未设置任何角色,无法登录~');
+    }
+
+    // 生成token
+    const { expire, refreshExpire } = this.coolConfig.jwt.token;
+    const result = {
+      expire,
+      token: await this.generateToken(user, roleIds, expire),
+      refreshExpire,
+      refreshToken: await this.generateToken(
+        user,
+        roleIds,
+        refreshExpire,
+        true
+      ),
+    };
+
+    // 将用户相关信息保存到缓存
+    const perms = await this.baseSysMenuService.getPerms(roleIds);
+    const departments = await this.baseSysDepartmentService.getByRoleIds(
+      roleIds,
+      user.username === 'admin'
+    );
+    await this.cacheManager.set(`admin:department:${user.id}`, departments);
+    await this.cacheManager.set(`admin:perms:${user.id}`, perms);
+    await this.cacheManager.set(`admin:token:${user.id}`, result.token);
+    await this.cacheManager.set(`admin:token:refresh:${user.id}`, result.token);
+
+    return result;
+  }
+
+  /**
+   * 验证码
+   * @param type 图片验证码类型 svg
+   * @param width 宽
+   * @param height 高
+   */
+  async captcha(type: string, width = 150, height = 50) {
+    const svg = svgCaptcha.create({
+      ignoreChars: 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM',
+      width,
+      height,
+    });
+    const result = {
+      captchaId: uuid(),
+      data: svg.data.replace(/"/g, "'"),
+    };
+    // 文字变白
+    const rpList = [
+      '#111',
+      '#222',
+      '#333',
+      '#444',
+      '#555',
+      '#666',
+      '#777',
+      '#888',
+      '#999',
+    ];
+    rpList.forEach(rp => {
+      result.data = result.data['replaceAll'](rp, '#fff');
+    });
+    if (type === 'base64') {
+      result.data = svgToDataURL(result.data);
+    }
+    // 半小时过期
+    await this.cacheManager.set(
+      `verify:img:${result.captchaId}`,
+      svg.text.toLowerCase(),
+      { ttl: 1800 }
+    );
+    return result;
+  }
+
+  /**
+   * 退出登录
+   */
+  async logout() {
+    const { userId } = this.ctx.admin;
+    await this.cacheManager.del(`admin:department:${userId}`);
+    await this.cacheManager.del(`admin:perms:${userId}`);
+    await this.cacheManager.del(`admin:token:${userId}`);
+    await this.cacheManager.del(`admin:token:refresh:${userId}`);
+  }
+
+  /**
+   * 检验图片验证码
+   * @param captchaId 验证码ID
+   * @param value 验证码
+   */
+  async captchaCheck(captchaId, value) {
+    const rv = await this.cacheManager.get(`verify:img:${captchaId}`);
+    if (!rv || !value || value.toLowerCase() !== rv) {
+      return false;
+    } else {
+      this.cacheManager.del(`verify:img:${captchaId}`);
+      return true;
+    }
+  }
+
+  /**
+   * 生成token
+   * @param user 用户对象
+   * @param roleIds 角色集合
+   * @param expire 过期
+   * @param isRefresh 是否是刷新
+   */
+  async generateToken(user, roleIds, expire, isRefresh?) {
+    await this.cacheManager.set(
+      `admin:passwordVersion:${user.id}`,
+      user.passwordV
+    );
+    const tokenInfo = {
+      isRefresh: false,
+      roleIds,
+      username: user.username,
+      userId: user.id,
+      passwordVersion: user.passwordV,
+    };
+    if (isRefresh) {
+      tokenInfo.isRefresh = true;
+    }
+    return jwt.sign(tokenInfo, this.coolConfig.jwt.secret, {
+      expiresIn: expire,
+    });
+  }
+
+  /**
+   * 刷新token
+   * @param token
+   */
+  async refreshToken(token: string) {
+    try {
+      const decoded = jwt.verify(token, this.coolConfig.jwt.secret);
+      if (decoded && decoded['isRefresh']) {
+        delete decoded['exp'];
+        delete decoded['iat'];
+
+        const { expire, refreshExpire } = this.coolConfig.jwt.token;
+        decoded['isRefresh'] = false;
+        const result = {
+          expire,
+          token: jwt.sign(decoded, this.coolConfig.jwt.secret, {
+            expiresIn: expire,
+          }),
+          refreshExpire,
+          refreshToken: '',
+        };
+        decoded['isRefresh'] = true;
+        result.refreshToken = jwt.sign(decoded, this.coolConfig.jwt.secret, {
+          expiresIn: refreshExpire,
+        });
+        await this.cacheManager.set(
+          `admin:passwordVersion:${decoded['userId']}`,
+          decoded['passwordVersion']
+        );
+        await this.cacheManager.set(
+          `admin:token:${decoded['userId']}`,
+          result.token
+        );
+        return result;
+      }
+    } catch (err) {
+      console.log(err);
+      this.ctx.status = 401;
+      this.ctx.body = {
+        code: RESCODE.COMMFAIL,
+        message: '登录失效~',
+      };
+      return;
+    }
+  }
+}

+ 359 - 0
yxgb-admin-midway/src/modules/base/service/sys/menu.ts

@@ -0,0 +1,359 @@
+import { App, IMidwayApplication } from '@midwayjs/core';
+import { ALL, Config, Inject, Provide } from '@midwayjs/decorator';
+import { BaseService, CoolCommException } from '@cool-midway/core';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+import { BaseSysMenuEntity } from '../../entity/sys/menu';
+import * as _ from 'lodash';
+import { BaseSysPermsService } from './perms';
+import { Context } from '@midwayjs/koa';
+import { TempDataSource } from './data';
+// eslint-disable-next-line node/no-unpublished-import
+import * as ts from 'typescript';
+import * as fs from 'fs';
+import * as pathUtil from 'path';
+
+/**
+ * 菜单
+ */
+@Provide()
+export class BaseSysMenuService extends BaseService {
+  @Inject()
+  ctx: Context;
+
+  @InjectEntityModel(BaseSysMenuEntity)
+  baseSysMenuEntity: Repository<BaseSysMenuEntity>;
+
+  @Inject()
+  baseSysPermsService: BaseSysPermsService;
+
+  @Config(ALL)
+  config;
+
+  @App()
+  app: IMidwayApplication;
+
+  /**
+   * 获得所有菜单
+   */
+  async list() {
+    const menus = await this.getMenus(
+      this.ctx.admin.roleIds,
+      this.ctx.admin.username === 'admin'
+    );
+    if (!_.isEmpty(menus)) {
+      menus.forEach(e => {
+        const parentMenu = menus.filter(m => {
+          e.parentId = parseInt(e.parentId);
+          if (e.parentId == m.id) {
+            return m.name;
+          }
+        });
+        if (!_.isEmpty(parentMenu)) {
+          e.parentName = parentMenu[0].name;
+        }
+      });
+    }
+    return menus;
+  }
+
+  /**
+   * 修改之后
+   * @param param
+   */
+  async modifyAfter(param) {
+    if (param.id) {
+      await this.refreshPerms(param.id);
+    }
+  }
+
+  /**
+   * 根据角色获得权限信息
+   * @param {[]} roleIds 数组
+   */
+  async getPerms(roleIds) {
+    let perms = [];
+    if (!_.isEmpty(roleIds)) {
+      const result = await this.nativeQuery(
+        `SELECT a.perms FROM base_sys_menu a ${this.setSql(
+          !roleIds.includes(1),
+          'JOIN base_sys_role_menu b on a.id = b."menuId" AND b."roleId" = ANY ($1)',
+          [roleIds]
+        )}
+            where 1=1 and a.perms is not NULL
+            `
+      );
+      if (result) {
+        result.forEach(d => {
+          if (d.perms) {
+            perms = perms.concat(d.perms.split(','));
+          }
+        });
+      }
+      perms = _.uniq(perms);
+      perms = _.remove(perms, n => {
+        return !_.isEmpty(n);
+      });
+    }
+    return _.uniq(perms);
+  }
+
+  /**
+   * 获得用户菜单信息
+   * @param roleIds
+   * @param isAdmin 是否是超管
+   */
+  async getMenus(roleIds, isAdmin) {
+    return await this.nativeQuery(`
+        SELECT
+            a.*
+        FROM
+            base_sys_menu a
+        ${this.setSql(
+          !isAdmin,
+          'JOIN base_sys_role_menu b on a.id = b."menuId" AND b."roleId" = ANY ($1)',
+          [roleIds]
+        )}
+        GROUP BY a.id
+        ORDER BY
+            "orderNum" ASC`);
+  }
+
+  /**
+   * 删除
+   * @param ids
+   */
+  async delete(ids) {
+    let idArr;
+    if (ids instanceof Array) {
+      idArr = ids;
+    } else {
+      idArr = ids.split(',');
+    }
+    for (const id of idArr) {
+      await this.baseSysMenuEntity.delete({ id });
+      await this.delChildMenu(id);
+    }
+  }
+
+  /**
+   * 删除子菜单
+   * @param id
+   */
+  private async delChildMenu(id) {
+    await this.refreshPerms(id);
+    const delMenu = await this.baseSysMenuEntity.findBy({ parentId: id });
+    if (_.isEmpty(delMenu)) {
+      return;
+    }
+    const delMenuIds = delMenu.map(e => {
+      return e.id;
+    });
+    await this.baseSysMenuEntity.delete(delMenuIds);
+    for (const menuId of delMenuIds) {
+      await this.delChildMenu(menuId);
+    }
+  }
+
+  /**
+   * 更新权限
+   * @param menuId
+   */
+  async refreshPerms(menuId) {
+    const users = await this.nativeQuery(
+      'select b."userId" from base_sys_role_menu a left join base_sys_user_role b on a."roleId" = b."roleId" where a."menuId" = $1 group by b."userId"',
+      [menuId]
+    );
+    // 刷新admin权限
+    await this.baseSysPermsService.refreshPerms(1);
+    if (!_.isEmpty(users)) {
+      // 刷新其他权限
+      for (const user of users) {
+        await this.baseSysPermsService.refreshPerms(user.userId);
+      }
+    }
+  }
+
+  /**
+   * 解析实体和Controller
+   * @param entityString
+   * @param controller
+   * @param module
+   */
+  async parse(entityString: string, controller: string, module: string) {
+    const tempDataSource = new TempDataSource({
+      ...this.config.typeorm.dataSource.default,
+      entities: [],
+    });
+    // 连接数据库
+    await tempDataSource.initialize();
+    const { newCode, className } = this.parseCode(entityString);
+    const code = ts.transpile(
+      `${newCode}
+        tempDataSource.options.entities.push(${className})
+        `,
+      {
+        emitDecoratorMetadata: true,
+        module: ts.ModuleKind.CommonJS,
+        target: ts.ScriptTarget.ES2018,
+        removeComments: true,
+      }
+    );
+    eval(code);
+    await tempDataSource.buildMetadatas();
+    const columnArr = tempDataSource.getMetadata(className).columns;
+    await tempDataSource.destroy();
+    const fileName = await this.fileName(controller);
+    const commColums = [];
+    const columns = _.filter(
+      columnArr.map(e => {
+        return {
+          propertyName: e.propertyName,
+          type: typeof e.type == 'string' ? e.type : e.type.name.toLowerCase(),
+          length: e.length,
+          comment: e.comment,
+          nullable: e.isNullable,
+        };
+      }),
+      o => {
+        if (['createTime', 'updateTime'].includes(o.propertyName)) {
+          commColums.push(o);
+        }
+        return o && !['createTime', 'updateTime'].includes(o.propertyName);
+      }
+    ).concat(commColums);
+    return {
+      columns,
+      path: `/admin/${module}/${fileName}`,
+    };
+  }
+
+  /**
+   * 解析Entity类名
+   * @param code
+   * @returns
+   */
+  parseCode(code: string) {
+    try {
+      const oldClassName = code
+        .match('class(.*)extends')[1]
+        .replace(/\s*/g, '');
+      const oldTableStart = code.indexOf('@Entity(');
+      const oldTableEnd = code.indexOf(')');
+
+      const oldTableName = code
+        .substring(oldTableStart + 9, oldTableEnd - 1)
+        .replace(/\s*/g, '')
+        // eslint-disable-next-line no-useless-escape
+        .replace(/\"/g, '')
+        // eslint-disable-next-line no-useless-escape
+        .replace(/\'/g, '');
+      const className = `${oldClassName}TEMP`;
+      return {
+        newCode: code
+          .replace(oldClassName, className)
+          .replace(oldTableName, `func_${oldTableName}`),
+        className,
+        tableName: `func_${oldTableName}`,
+      };
+    } catch (err) {
+      throw new CoolCommException('代码结构不正确,请检查');
+    }
+  }
+
+  /**
+   *  创建代码
+   * @param body body
+   */
+  async create(body) {
+    const { module, entity, controller } = body;
+    const basePath = this.app.getBaseDir();
+    const fileName = await this.fileName(controller);
+    // 生成Entity
+    const entityPath = pathUtil.join(
+      basePath,
+      'modules',
+      module,
+      'entity',
+      `${fileName}.ts`
+    );
+    // 生成Controller
+    const controllerPath = pathUtil.join(
+      basePath,
+      'modules',
+      module,
+      'controller',
+      'admin',
+      `${fileName}.ts`
+    );
+    this.createConfigFile(module);
+    this.createFile(entityPath, entity);
+    this.createFile(controllerPath, controller);
+  }
+
+  /**
+   * 创建配置文件
+   * @param module
+   */
+  async createConfigFile(module: string) {
+    const basePath = this.app.getBaseDir();
+    const configFilePath = pathUtil.join(
+      basePath,
+      'modules',
+      module,
+      'config.ts'
+    );
+    if (!fs.existsSync(configFilePath)) {
+      const data = `import { ModuleConfig } from '@cool-midway/core';
+
+/**
+ * 模块配置
+ */
+export default () => {
+  return {
+    // 模块名称
+    name: 'xxx',
+    // 模块描述
+    description: 'xxx',
+    // 中间件,只对本模块有效
+    middlewares: [],
+    // 中间件,全局有效
+    globalMiddlewares: [],
+    // 模块加载顺序,默认为0,值越大越优先加载
+    order: 0,
+  } as ModuleConfig;
+};
+`;
+      await this.createFile(configFilePath, data);
+    }
+  }
+
+  /**
+   * 找到文件名
+   * @param controller
+   * @returns
+   */
+  async fileName(controller: string) {
+    const regex = /import\s*{\s*\w+\s*}\s*from\s*'[^']*\/([\w-]+)';/;
+    const match = regex.exec(controller);
+
+    if (match && match.length > 1) {
+      return match[1];
+    }
+
+    return null;
+  }
+
+  /**
+   * 创建文件
+   * @param filePath
+   * @param content
+   */
+  async createFile(filePath: string, content: string) {
+    const folderPath = pathUtil.dirname(filePath);
+    if (!fs.existsSync(folderPath)) {
+      fs.mkdirSync(folderPath, { recursive: true });
+    }
+    fs.writeFileSync(filePath, content);
+  }
+}

+ 69 - 0
yxgb-admin-midway/src/modules/base/service/sys/param.ts

@@ -0,0 +1,69 @@
+import { Inject, Provide } from '@midwayjs/decorator';
+import { BaseService } from '@cool-midway/core';
+import { InjectEntityModel } from '@midwayjs/typeorm';
+import { Repository } from 'typeorm';
+import { BaseSysParamEntity } from '../../entity/sys/param';
+import { CacheManager } from '@midwayjs/cache';
+
+/**
+ * 参数配置
+ */
+@Provide()
+export class BaseSysParamService extends BaseService {
+  @InjectEntityModel(BaseSysParamEntity)
+  baseSysParamEntity: Repository<BaseSysParamEntity>;
+
+  @Inject()
+  cacheManager: CacheManager;
+
+  /**
+   * 根据key获得对应的参数
+   * @param key
+   */
+  async dataByKey(key) {
+    let result: any = await this.cacheManager.get(`param:${key}`);
+    if (!result) {
+      result = await this.baseSysParamEntity.findOneBy({ keyName: key });
+    }
+    if (result) {
+      if (typeof result == 'string') {
+        result = JSON.parse(result);
+      }
+      if (result.dataType !== 0) {
+        return JSON.parse(result.data);
+      } else {
+        return result.data;
+      }
+    }
+    return;
+  }
+
+  /**
+   * 根据key获得对应的网页数据
+   * @param key
+   */
+  async htmlByKey(key) {
+    let html = '<html><body>@content</body></html>';
+    let result: any = await this.cacheManager.get(`param:${key}`);
+    if (result) {
+      result = JSON.parse(result);
+      html = html.replace('@content', result.data);
+    } else {
+      html = html.replace('@content', 'key notfound');
+    }
+    return html;
+  }
+
+  /**
+   * 重新初始化缓存
+   */
+  async modifyAfter() {
+    const params = await this.baseSysParamEntity.find();
+    for (const param of params) {
+      await this.cacheManager.set(
+        `param:${param.keyName}`,
+        JSON.stringify(param)
+      );
+    }
+  }
+}

+ 73 - 0
yxgb-admin-midway/src/modules/base/service/sys/perms.ts

@@ -0,0 +1,73 @@
+import { Inject, Provide } from '@midwayjs/decorator';
+import { BaseService } from '@cool-midway/core';
+import { BaseSysMenuService } from './menu';
+import { BaseSysRoleService } from './role';
+import { BaseSysDepartmentService } from './department';
+import { Context } from '@midwayjs/koa';
+import { CacheManager } from '@midwayjs/cache';
+
+/**
+ * 权限
+ */
+@Provide()
+export class BaseSysPermsService extends BaseService {
+  @Inject()
+  cacheManager: CacheManager;
+
+  @Inject()
+  baseSysMenuService: BaseSysMenuService;
+
+  @Inject()
+  baseSysRoleService: BaseSysRoleService;
+
+  @Inject()
+  baseSysDepartmentService: BaseSysDepartmentService;
+
+  @Inject()
+  ctx: Context;
+
+  /**
+   * 刷新权限
+   * @param userId 用户ID
+   */
+  async refreshPerms(userId) {
+    const roleIds = await this.baseSysRoleService.getByUser(userId);
+    const perms = await this.baseSysMenuService.getPerms(roleIds);
+    await this.cacheManager.set(`admin:perms:${userId}`, perms);
+    // 更新部门权限
+    const departments = await this.baseSysDepartmentService.getByRoleIds(
+      roleIds,
+      this.ctx.admin.username === 'admin'
+    );
+    await this.cacheManager.set(`admin:department:${userId}`, departments);
+  }
+
+  /**
+   * 获得权限菜单
+   * @param roleIds
+   */
+  async permmenu(roleIds: number[]) {
+    const perms = await this.baseSysMenuService.getPerms(roleIds);
+    const menus = await this.baseSysMenuService.getMenus(
+      roleIds,
+      this.ctx.admin.username === 'admin'
+    );
+    return { perms, menus };
+  }
+
+  /**
+   * 根据用户ID获得部门权限
+   * @param userId
+   * @return 部门ID数组
+   */
+  async departmentIds(userId: number) {
+    const department: any = await this.cacheManager.get(
+      `admin:department:${userId}`
+    );
+    if (department) {
+      return department;
+    } else {
+      return [];
+    }
+  }
+}

Some files were not shown because too many files changed in this diff