From e135e4ce64b28102b763af49c8c506d7abcf2407 Mon Sep 17 00:00:00 2001 From: "meilin.huang" <954537473@qq.com> Date: Wed, 16 Oct 2024 17:24:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20sql=E8=A7=A3=E6=9E=90=E5=99=A8=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E3=80=81=E5=B7=A5=E5=8D=95=E7=BB=9F=E4=B8=80=E7=94=B1?= =?UTF-8?q?=E2=80=98=E6=88=91=E7=9A=84=E6=B5=81=E7=A8=8B=E2=80=99=E5=8F=91?= =?UTF-8?q?=E8=B5=B7=E3=80=81=E6=B5=81=E7=A8=8B=E5=AE=9A=E4=B9=89=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=87=AA=E5=AE=9A=E4=B9=89=E6=9D=A1=E4=BB=B6=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E5=AE=A1=E6=89=B9=E3=80=81=E8=B5=84=E6=BA=90=E9=9A=90?= =?UTF-8?q?=E8=97=8F=E7=BC=96=E5=8F=B7=E3=80=81model=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=89=A9=E7=90=86=E5=88=A0=E9=99=A4=E7=AD=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mayfly_go_web/package.json | 139 +- mayfly_go_web/src/common/config.ts | 2 +- mayfly_go_web/src/common/crypto.ts | 38 + mayfly_go_web/src/common/des.ts | 48 - .../src/components/SearchForm/index.vue | 2 +- .../src/components/crontab/Crontab.vue | 62 +- .../src/components/enumselect/EnumSelect.vue | 17 + .../src/components/enumtag/EnumTag.vue | 2 +- .../src/components/monaco/MonacoEditor.vue | 4 +- mayfly_go_web/src/views/flow/ProcInstEdit.vue | 149 + mayfly_go_web/src/views/flow/ProcdefEdit.vue | 37 + mayfly_go_web/src/views/flow/ProcdefList.vue | 2 +- .../src/views/flow/ProcinstDetail.vue | 36 +- mayfly_go_web/src/views/flow/ProcinstList.vue | 17 +- mayfly_go_web/src/views/flow/api.ts | 1 + mayfly_go_web/src/views/flow/enums.ts | 4 +- .../src/views/flow/flowbiz/DbSqlExecBiz.vue | 82 - .../views/flow/flowbiz/dbms/DbSqlExecBiz.vue | 103 + .../flowbiz/dbms/DbSqlExecFlowBizForm.vue | 83 + .../RedisRunCmdBiz.vue} | 50 +- .../flowbiz/redis/RedisRunCmdFlowBizForm.vue | 148 + mayfly_go_web/src/views/home/Home.vue | 47 +- .../ops/component/ResourceAuthCertEdit.vue | 2 +- .../component/ResourceAuthCertTableEdit.vue | 28 +- .../src/views/ops/component/TagCodePath.vue | 82 +- .../src/views/ops/component/TagTreeCheck.vue | 4 +- mayfly_go_web/src/views/ops/component/tag.ts | 36 +- mayfly_go_web/src/views/ops/db/DbEdit.vue | 21 - mayfly_go_web/src/views/ops/db/DbList.vue | 2 +- .../src/views/ops/db/InstanceEdit.vue | 22 - .../src/views/ops/db/InstanceList.vue | 4 +- mayfly_go_web/src/views/ops/db/SqlExec.vue | 53 +- .../src/views/ops/db/SyncTaskEdit.vue | 2 +- mayfly_go_web/src/views/ops/db/api.ts | 4 +- .../views/ops/db/component/DbSelectTree.vue | 39 +- .../db/component/sqleditor/DbSqlEditor.vue | 93 +- .../db/component/sqleditor/SqlExecDialog.vue | 39 +- .../ops/db/component/table/DbTableData.vue | 11 +- .../ops/db/component/table/DbTableDataOp.vue | 6 +- mayfly_go_web/src/views/ops/db/db.ts | 55 +- .../src/views/ops/machine/MachineEdit.vue | 35 +- .../src/views/ops/machine/MachineList.vue | 6 +- mayfly_go_web/src/views/ops/machine/api.ts | 1 + .../src/views/ops/mongo/MongoEdit.vue | 22 +- .../src/views/ops/mongo/MongoList.vue | 2 +- .../src/views/ops/redis/DataOperation.vue | 6 +- .../src/views/ops/redis/FormatViewer.vue | 10 +- .../src/views/ops/redis/RedisEdit.vue | 30 +- .../src/views/ops/redis/RedisList.vue | 2 +- .../ops/redis/components/CmdExecDialog.vue | 2 +- mayfly_go_web/src/views/ops/redis/redis.ts | 215 +- .../src/views/ops/tag/TagTreeList.vue | 4 +- mayfly_go_web/src/views/ops/tag/api.ts | 1 + server/go.mod | 33 +- server/internal/db/api/db.go | 112 +- server/internal/db/api/db_data_sync.go | 2 +- server/internal/db/api/form/db.go | 1 - server/internal/db/api/form/instance.go | 1 - server/internal/db/application/db.go | 6 +- server/internal/db/application/db_instance.go | 9 +- server/internal/db/application/db_sql_exec.go | 628 +- server/internal/db/dbm/dbi/dialect.go | 8 + server/internal/db/dbm/dbi/metadata_base.go | 10 +- server/internal/db/dbm/dm/dialect.go | 5 +- server/internal/db/dbm/mysql/metadata.go | 8 +- server/internal/db/dbm/postgres/dialect.go | 6 + server/internal/db/dbm/sqlparser/base/base.go | 128 + .../dbm/sqlparser/mysql/antlr4/MySqlLexer.g4 | 1352 + .../sqlparser/mysql/antlr4/MySqlLexer.interp | 3515 + .../sqlparser/mysql/antlr4/MySqlLexer.tokens | 2300 + .../dbm/sqlparser/mysql/antlr4/MySqlParser.g4 | 3490 + .../sqlparser/mysql/antlr4/MySqlParser.interp | 2694 + .../sqlparser/mysql/antlr4/MySqlParser.tokens | 2300 + .../db/dbm/sqlparser/mysql/antlr4/build.sh | 1 + .../dbm/sqlparser/mysql/antlr4/mysql_lexer.go | 8266 + .../sqlparser/mysql/antlr4/mysql_parser.go | 136803 +++++++++++ .../mysql/antlr4/mysqlparser_base_listener.go | 3863 + .../mysql/antlr4/mysqlparser_base_visitor.go | 2480 + .../mysql/antlr4/mysqlparser_listener.go | 3717 + .../mysql/antlr4/mysqlparser_visitor.go | 1863 + .../internal/db/dbm/sqlparser/mysql/mysql.go | 59 + .../db/dbm/sqlparser/mysql/mysql_test.go | 122 + .../db/dbm/sqlparser/mysql/visitor.go | 939 + .../sqlparser/pgsql/antlr4/PostgreSQLLexer.g4 | 1683 + .../pgsql/antlr4/PostgreSQLLexer.interp | 2074 + .../pgsql/antlr4/PostgreSQLLexer.tokens | 1314 + .../pgsql/antlr4/PostgreSQLParser.g4 | 5578 + .../pgsql/antlr4/PostgreSQLParser.interp | 2181 + .../pgsql/antlr4/PostgreSQLParser.tokens | 1314 + .../db/dbm/sqlparser/pgsql/antlr4/build.sh | 1 + .../pgsql/antlr4/postgresql_lexer.go | 4408 + .../pgsql/antlr4/postgresql_lexer_base.go | 91 + .../pgsql/antlr4/postgresql_parse_error.go | 29 + .../pgsql/antlr4/postgresql_parser.go | 185013 +++++++++++++++ .../pgsql/antlr4/postgresql_parser_base.go | 214 + .../postgresql_parser_error_listener.go | 51 + .../antlr4/postgresqlparser_base_listener.go | 5120 + .../antlr4/postgresqlparser_base_visitor.go | 3272 + .../pgsql/antlr4/postgresqlparser_listener.go | 4905 + .../pgsql/antlr4/postgresqlparser_visitor.go | 2457 + .../sqlparser/pgsql/antlr4/string_stack.go | 77 + .../internal/db/dbm/sqlparser/pgsql/pgsql.go | 60 + .../db/dbm/sqlparser/pgsql/pgsql_test.go | 83 + .../db/dbm/sqlparser/pgsql/visitor.go | 417 + server/internal/db/dbm/sqlparser/sqlparser.go | 83 + .../db/dbm/sqlparser/sqlstmt/common.go | 171 + .../internal/db/dbm/sqlparser/sqlstmt/ddl.go | 53 + .../db/dbm/sqlparser/sqlstmt/delete.go | 16 + .../db/dbm/sqlparser/sqlstmt/insert.go | 15 + .../db/dbm/sqlparser/sqlstmt/quote_char.go | 76 + .../dbm/sqlparser/sqlstmt/quote_char_test.go | 15 + .../db/dbm/sqlparser/sqlstmt/select.go | 135 + .../internal/db/dbm/sqlparser/sqlstmt/stmt.go | 75 + .../db/dbm/sqlparser/sqlstmt/update.go | 26 + .../db/dbm/sqlparser/sqlstmt/value.go | 23 + server/internal/db/domain/entity/query.go | 1 + .../infrastructure/persistence/db_backup.go | 4 +- .../infrastructure/persistence/db_binlog.go | 7 +- .../persistence/db_binlog_history.go | 4 +- .../infrastructure/persistence/db_restore.go | 4 +- .../persistence/db_restore_history.go | 4 +- .../db/infrastructure/persistence/instance.go | 7 + server/internal/flow/api/form/procdef.go | 13 +- server/internal/flow/api/form/procinst.go | 11 + server/internal/flow/api/procinst.go | 12 + .../internal/flow/application/biz_handler.go | 15 +- server/internal/flow/application/procdef.go | 21 +- server/internal/flow/application/procinst.go | 32 +- server/internal/flow/domain/entity/procdef.go | 27 +- server/internal/flow/router/procinst.go | 2 + server/internal/machine/api/form/form.go | 1 - server/internal/machine/api/machine.go | 9 + server/internal/machine/api/vo/vo.go | 9 + .../internal/machine/application/machine.go | 37 +- .../internal/machine/domain/entity/query.go | 3 +- .../infrastructure/persistence/machine.go | 6 + server/internal/machine/router/machine.go | 2 + server/internal/mongo/api/form/mongo.go | 1 - server/internal/mongo/application/mongo.go | 10 +- server/internal/mongo/domain/entity/query.go | 1 + .../mongo/infrastructure/persistence/mongo.go | 6 + server/internal/redis/api/form/redis.go | 2 +- server/internal/redis/api/redis.go | 22 +- server/internal/redis/application/flow.go | 4 +- server/internal/redis/application/redis.go | 121 +- .../internal/redis/application/redis_test.go | 11 + server/internal/redis/domain/entity/query.go | 12 +- server/internal/redis/domain/entity/redis.go | 13 + .../infrastructure/persistence/redis_repo.go | 7 + server/internal/redis/rdm/info.go | 15 +- server/internal/tag/api/resource_auth_cert.go | 12 + .../internal/tag/api/vo/resource_auth_cert.go | 6 + .../tag/application/resouce_auth_cert.go | 8 + .../tag/domain/entity/resource_auth_cert.go | 23 +- .../tag/infrastructure/persistence/team.go | 2 +- .../internal/tag/router/resource_auth_cert.go | 2 + server/pkg/config/app.go | 2 +- server/pkg/gormx/gormx.go | 55 +- server/pkg/gormx/query.go | 12 +- server/pkg/logx/logx.go | 4 +- server/pkg/model/login_account.go | 4 + server/pkg/model/model.go | 89 + server/pkg/model/query_cond.go | 7 +- server/pkg/req/log_handler.go | 4 +- server/pkg/utils/cryptox/cryptox.go | 66 +- server/pkg/utils/cryptox/cryptox_test.go | 15 - server/pkg/utils/runtimex/runtimex.go | 4 +- server/pkg/utils/stringx/rand.go | 8 + server/resources/script/sql/mayfly-go.sql | 1 + server/resources/script/sql/v1.8/v1.8.9.sql | 5 +- 170 files changed, 397197 insertions(+), 1251 deletions(-) create mode 100644 mayfly_go_web/src/common/crypto.ts delete mode 100644 mayfly_go_web/src/common/des.ts create mode 100644 mayfly_go_web/src/components/enumselect/EnumSelect.vue create mode 100755 mayfly_go_web/src/views/flow/ProcInstEdit.vue delete mode 100755 mayfly_go_web/src/views/flow/flowbiz/DbSqlExecBiz.vue create mode 100755 mayfly_go_web/src/views/flow/flowbiz/dbms/DbSqlExecBiz.vue create mode 100755 mayfly_go_web/src/views/flow/flowbiz/dbms/DbSqlExecFlowBizForm.vue rename mayfly_go_web/src/views/flow/flowbiz/{RedisRunWriteCmdBiz.vue => redis/RedisRunCmdBiz.vue} (63%) create mode 100755 mayfly_go_web/src/views/flow/flowbiz/redis/RedisRunCmdFlowBizForm.vue create mode 100644 server/internal/db/dbm/sqlparser/base/base.go create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/MySqlLexer.g4 create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/MySqlLexer.interp create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/MySqlLexer.tokens create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/MySqlParser.g4 create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/MySqlParser.interp create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/MySqlParser.tokens create mode 100755 server/internal/db/dbm/sqlparser/mysql/antlr4/build.sh create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/mysql_lexer.go create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/mysql_parser.go create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/mysqlparser_base_listener.go create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/mysqlparser_base_visitor.go create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/mysqlparser_listener.go create mode 100644 server/internal/db/dbm/sqlparser/mysql/antlr4/mysqlparser_visitor.go create mode 100644 server/internal/db/dbm/sqlparser/mysql/mysql.go create mode 100644 server/internal/db/dbm/sqlparser/mysql/mysql_test.go create mode 100644 server/internal/db/dbm/sqlparser/mysql/visitor.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/PostgreSQLLexer.g4 create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/PostgreSQLLexer.interp create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/PostgreSQLLexer.tokens create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/PostgreSQLParser.g4 create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/PostgreSQLParser.interp create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/PostgreSQLParser.tokens create mode 100755 server/internal/db/dbm/sqlparser/pgsql/antlr4/build.sh create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/postgresql_lexer.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/postgresql_lexer_base.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/postgresql_parse_error.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/postgresql_parser.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/postgresql_parser_base.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/postgresql_parser_error_listener.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/postgresqlparser_base_listener.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/postgresqlparser_base_visitor.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/postgresqlparser_listener.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/postgresqlparser_visitor.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/antlr4/string_stack.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/pgsql.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/pgsql_test.go create mode 100644 server/internal/db/dbm/sqlparser/pgsql/visitor.go create mode 100644 server/internal/db/dbm/sqlparser/sqlparser.go create mode 100644 server/internal/db/dbm/sqlparser/sqlstmt/common.go create mode 100644 server/internal/db/dbm/sqlparser/sqlstmt/ddl.go create mode 100644 server/internal/db/dbm/sqlparser/sqlstmt/delete.go create mode 100644 server/internal/db/dbm/sqlparser/sqlstmt/insert.go create mode 100644 server/internal/db/dbm/sqlparser/sqlstmt/quote_char.go create mode 100644 server/internal/db/dbm/sqlparser/sqlstmt/quote_char_test.go create mode 100644 server/internal/db/dbm/sqlparser/sqlstmt/select.go create mode 100644 server/internal/db/dbm/sqlparser/sqlstmt/stmt.go create mode 100644 server/internal/db/dbm/sqlparser/sqlstmt/update.go create mode 100644 server/internal/db/dbm/sqlparser/sqlstmt/value.go create mode 100644 server/internal/redis/application/redis_test.go diff --git a/mayfly_go_web/package.json b/mayfly_go_web/package.json index 733f508f..2adec422 100644 --- a/mayfly_go_web/package.json +++ b/mayfly_go_web/package.json @@ -1,70 +1,71 @@ { - "name": "mayfly", - "version": "1.0.0", - "scripts": { - "dev": "vite", - "build": "vite build", - "preview": "vite preview", - "build-preview": "npm run build && npm run preview", - "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/" - }, - "dependencies": { - "@element-plus/icons-vue": "^2.3.1", - "@vueuse/core": "^10.11.0", - "asciinema-player": "^3.8.0", - "axios": "^1.6.2", - "clipboard": "^2.0.11", - "cropperjs": "^1.6.1", - "dayjs": "^1.11.11", - "echarts": "^5.5.1", - "element-plus": "^2.7.7", - "js-base64": "^3.7.7", - "jsencrypt": "^3.3.2", - "lodash": "^4.17.21", - "mitt": "^3.0.1", - "monaco-editor": "^0.50.0", - "monaco-sql-languages": "^0.12.2", - "monaco-themes": "^0.4.4", - "nprogress": "^0.2.0", - "pinia": "^2.1.7", - "qrcode.vue": "^3.4.1", - "screenfull": "^6.0.2", - "sortablejs": "^1.15.2", - "splitpanes": "^3.1.5", - "sql-formatter": "^15.0.2", - "trzsz": "^1.1.5", - "uuid": "^9.0.1", - "vue": "^3.4.32", - "vue-router": "^4.4.0", - "xterm": "^5.3.0", - "xterm-addon-fit": "^0.8.0", - "xterm-addon-search": "^0.13.0", - "xterm-addon-web-links": "^0.9.0" - }, - "devDependencies": { - "@types/crypto-js": "^4.2.2", - "@types/lodash": "^4.14.178", - "@types/node": "^18.14.0", - "@types/nprogress": "^0.2.0", - "@types/sortablejs": "^1.15.8", - "@typescript-eslint/eslint-plugin": "^6.7.4", - "@typescript-eslint/parser": "^6.7.4", - "@vitejs/plugin-vue": "^5.0.5", - "@vue/compiler-sfc": "^3.4.32", - "code-inspector-plugin": "^0.4.5", - "crypto-js": "^4.2.0", - "dotenv": "^16.3.1", - "eslint": "^8.35.0", - "eslint-plugin-vue": "^9.25.0", - "prettier": "^3.2.5", - "sass": "^1.77.8", - "typescript": "^5.5.3", - "vite": "^5.3.4", - "vue-eslint-parser": "^9.4.2" - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not dead" - ] -} + "name": "mayfly", + "version": "1.0.0", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "build-preview": "npm run build && npm run preview", + "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "@vueuse/core": "^11.1.0", + "asciinema-player": "^3.8.1", + "axios": "^1.6.2", + "clipboard": "^2.0.11", + "cropperjs": "^1.6.1", + "crypto-js": "^4.2.0", + "dayjs": "^1.11.13", + "echarts": "^5.5.1", + "element-plus": "^2.8.5", + "js-base64": "^3.7.7", + "jsencrypt": "^3.3.2", + "lodash": "^4.17.21", + "mitt": "^3.0.1", + "monaco-editor": "^0.52.0", + "monaco-sql-languages": "^0.12.2", + "monaco-themes": "^0.4.4", + "nprogress": "^0.2.0", + "pinia": "^2.2.4", + "qrcode.vue": "^3.5.0", + "screenfull": "^6.0.2", + "sortablejs": "^1.15.3", + "splitpanes": "^3.1.5", + "sql-formatter": "^15.4.2", + "trzsz": "^1.1.5", + "uuid": "^9.0.1", + "vue": "^3.5.12", + "vue-router": "^4.4.5", + "xterm": "^5.3.0", + "xterm-addon-fit": "^0.8.0", + "xterm-addon-search": "^0.13.0", + "xterm-addon-web-links": "^0.9.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "@types/lodash": "^4.14.178", + "@types/node": "^18.14.0", + "@types/nprogress": "^0.2.0", + "@types/sortablejs": "^1.15.8", + "@typescript-eslint/eslint-plugin": "^6.7.4", + "@typescript-eslint/parser": "^6.7.4", + "@vitejs/plugin-vue": "^5.1.4", + "@vue/compiler-sfc": "^3.5.12", + "code-inspector-plugin": "^0.4.5", + "dotenv": "^16.3.1", + "eslint": "^8.35.0", + "eslint-plugin-vue": "^9.28.0", + "prettier": "^3.2.5", + "sass": "^1.79.5", + "typescript": "^5.6.3", + "vite": "^5.4.9", + "vue-eslint-parser": "^9.4.3" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ] + } + \ No newline at end of file diff --git a/mayfly_go_web/src/common/config.ts b/mayfly_go_web/src/common/config.ts index 5f23c9bb..67296b3a 100644 --- a/mayfly_go_web/src/common/config.ts +++ b/mayfly_go_web/src/common/config.ts @@ -15,7 +15,7 @@ const config = { baseWsUrl: `${(window as any).globalConfig.BaseWsUrl || `${location.protocol == 'https:' ? 'wss:' : 'ws:'}//${getBaseApiUrl()}`}/api`, // 系统版本 - version: 'v1.8.8', + version: 'v1.8.9', }; export default config; diff --git a/mayfly_go_web/src/common/crypto.ts b/mayfly_go_web/src/common/crypto.ts new file mode 100644 index 00000000..b118693d --- /dev/null +++ b/mayfly_go_web/src/common/crypto.ts @@ -0,0 +1,38 @@ +import CryptoJS from 'crypto-js'; +import { getToken } from '@/common/utils/storage'; + +/** + * AES 加密数据 + * @param word + * @param key + */ +export function AesEncrypt(word: string, key?: string) { + if (!key) { + key = getToken().substring(0, 24); + } + + const sKey = CryptoJS.enc.Utf8.parse(key); + const encrypted = CryptoJS.AES.encrypt(word, sKey, { + iv: sKey, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7, + }); + + return encrypted.ciphertext.toString(CryptoJS.enc.Base64); +} + +export function AesDecrypt(word: string, key?: string): string { + if (!key) { + key = getToken().substring(0, 24); + } + + const sKey = CryptoJS.enc.Utf8.parse(key); + // key 和 iv 使用同一个值 + const decrypted = CryptoJS.AES.decrypt(word, sKey, { + iv: sKey, + mode: CryptoJS.mode.CBC, // CBC算法 + padding: CryptoJS.pad.Pkcs7, //使用pkcs7 进行padding 后端需要注意 + }); + + return decrypted.toString(CryptoJS.enc.Base64); +} diff --git a/mayfly_go_web/src/common/des.ts b/mayfly_go_web/src/common/des.ts deleted file mode 100644 index 5d4e3251..00000000 --- a/mayfly_go_web/src/common/des.ts +++ /dev/null @@ -1,48 +0,0 @@ -import CryptoJS from 'crypto-js'; -import { getToken } from '@/common/utils/storage'; - -/** - * AES 加密数据 - * @param word - * @param key - */ -export function DesEncrypt(word: string, key?: string) { - if (!key) { - key = getToken().substring(0, 24); - } - const srcs = CryptoJS.enc.Utf8.parse(word); - const iv = CryptoJS.lib.WordArray.random(8); // 生成随机IV - const encrypted = CryptoJS.TripleDES.encrypt(srcs, CryptoJS.enc.Utf8.parse(key), { - iv: iv, - mode: CryptoJS.mode.CBC, - padding: CryptoJS.pad.Pkcs7, - }); - - return iv.concat(encrypted.ciphertext).toString(CryptoJS.enc.Base64); -} - -/** - * AES 解密 :字符串 key iv 返回base64 - * */ -export function DesDecrypt(encryptedData: string, key?: string) { - if (!key) { - key = getToken().substring(0, 32); - } - // 解码Base64 - const ciphertext = CryptoJS.enc.Base64.parse(encryptedData); - - // 分离IV和加密数据 - const iv = ciphertext.clone(); - iv.sigBytes = 8; - iv.clamp(); - ciphertext.words.splice(0, 2); // 移除IV - ciphertext.sigBytes -= 8; - - const decrypted = CryptoJS.TripleDES.decrypt({ ciphertext } as any, CryptoJS.enc.Utf8.parse(key), { - iv: iv, - mode: CryptoJS.mode.CBC, - padding: CryptoJS.pad.Pkcs7, - }); - - return decrypted.toString(CryptoJS.enc.Utf8); -} diff --git a/mayfly_go_web/src/components/SearchForm/index.vue b/mayfly_go_web/src/components/SearchForm/index.vue index bd5d87b3..6c7984d3 100644 --- a/mayfly_go_web/src/components/SearchForm/index.vue +++ b/mayfly_go_web/src/components/SearchForm/index.vue @@ -83,7 +83,7 @@ const breakPoint = computed(() => gridRef.value?.breakPoint); // 判断是否显示 展开/合并 按钮 const showCollapse = computed(() => { let show = false; - props.items.reduce((prev, current) => { + props.items.reduce((prev, current: any) => { prev += (current![breakPoint.value]?.span ?? current?.span ?? 1) + (current![breakPoint.value]?.offset ?? current?.offset ?? 0); if (typeof props.searchCol !== 'number') { if (prev >= props.searchCol[breakPoint.value]) show = true; diff --git a/mayfly_go_web/src/components/crontab/Crontab.vue b/mayfly_go_web/src/components/crontab/Crontab.vue index 5a602f37..ffe06eb8 100644 --- a/mayfly_go_web/src/components/crontab/Crontab.vue +++ b/mayfly_go_web/src/components/crontab/Crontab.vue @@ -35,38 +35,42 @@

时间表达式

- - + + + + - - - - - - - - + + + + + + + + + +
{{ item }}crontab完整表达式
{{ item }}crontab完整表达式
- {{ crontabValueObj.second }} - - {{ crontabValueObj.min }} - - {{ crontabValueObj.hour }} - - {{ crontabValueObj.day }} - - {{ crontabValueObj.mouth }} - - {{ crontabValueObj.week }} - - {{ crontabValueObj.year }} - - {{ contabValueString }} -
+ {{ crontabValueObj.second }} + + {{ crontabValueObj.min }} + + {{ crontabValueObj.hour }} + + {{ crontabValueObj.day }} + + {{ crontabValueObj.mouth }} + + {{ crontabValueObj.week }} + + {{ crontabValueObj.year }} + + {{ crontabValueString }} +
- +
取消 @@ -202,7 +206,7 @@ function hidePopup() { // 填充表达式 const submitFill = () => { - emit('fill', contabValueString.value); + emit('fill', crontabValueString.value); hidePopup(); }; @@ -220,7 +224,7 @@ const clearCron = () => { changeTab(state.activeName); }; -const contabValueString = computed(() => { +const crontabValueString = computed(() => { let obj = state.crontabValueObj; let str = obj.second + ' ' + obj.min + ' ' + obj.hour + ' ' + obj.day + ' ' + obj.mouth + ' ' + obj.week + (obj.year == '' ? '' : ' ' + obj.year); return str; diff --git a/mayfly_go_web/src/components/enumselect/EnumSelect.vue b/mayfly_go_web/src/components/enumselect/EnumSelect.vue new file mode 100644 index 00000000..dafcdba0 --- /dev/null +++ b/mayfly_go_web/src/components/enumselect/EnumSelect.vue @@ -0,0 +1,17 @@ + + + + diff --git a/mayfly_go_web/src/components/enumtag/EnumTag.vue b/mayfly_go_web/src/components/enumtag/EnumTag.vue index 82114dc5..3fed6c59 100644 --- a/mayfly_go_web/src/components/enumtag/EnumTag.vue +++ b/mayfly_go_web/src/components/enumtag/EnumTag.vue @@ -1,5 +1,5 @@ + diff --git a/mayfly_go_web/src/views/flow/ProcdefEdit.vue b/mayfly_go_web/src/views/flow/ProcdefEdit.vue index 378bcfae..365fe0cd 100755 --- a/mayfly_go_web/src/views/flow/ProcdefEdit.vue +++ b/mayfly_go_web/src/views/flow/ProcdefEdit.vue @@ -17,6 +17,25 @@ + + + + + @@ -118,6 +137,7 @@ const state = reactive({ name: null, defKey: null, status: null, + condition: '', remark: null, // 流程的审批节点任务 tasks: '', @@ -141,6 +161,23 @@ watch(props, (newValue: any) => { state.tasks = tasks; } else { state.form = { status: ProcdefStatus.Enable.value } as any; + state.form.condition = `{{/* DBMS-执行sql规则; param参数描述如下 */}} +{{/* stmtType: select / read / insert / update / delete ; */}} +{{ if eq .bizType "db_sql_exec_flow"}} + {{/* 不是select和read语句时,开启流程审批 */}} + {{ if and (ne .param.stmtType "select") (ne .param.stmtType "read") }} + 1 + {{ end }} +{{ end }} + +{{/* Redis-执行命令规则; param参数描述如下 */}} +{{/* cmdType: read(读命令) / write(写命令); */}} +{{/* cmd: get/set/hset...等 */}} +{{ if eq .bizType "redis_run_cmd_flow"}} + {{ if eq .param.cmdType "write" }} + 1 + {{ end }} +{{ end }}`; state.tasks = []; } }); diff --git a/mayfly_go_web/src/views/flow/ProcdefList.vue b/mayfly_go_web/src/views/flow/ProcdefList.vue index bdbb3dd7..1beee9e8 100644 --- a/mayfly_go_web/src/views/flow/ProcdefList.vue +++ b/mayfly_go_web/src/views/flow/ProcdefList.vue @@ -66,7 +66,7 @@ const columns = [ ]; // 该用户拥有的的操作列按钮权限 -const actionBtns = hasPerms([perms.save, perms.del]); +const actionBtns: any = hasPerms([perms.save, perms.del]); const actionColumn = TableColumn.new('action', '操作').isSlot().fixedRight().setMinWidth(160).noShowOverflowTooltip().alignCenter(); const pageTableRef: Ref = ref(null); diff --git a/mayfly_go_web/src/views/flow/ProcinstDetail.vue b/mayfly_go_web/src/views/flow/ProcinstDetail.vue index 22d8f28a..e4699419 100755 --- a/mayfly_go_web/src/views/flow/ProcinstDetail.vue +++ b/mayfly_go_web/src/views/flow/ProcinstDetail.vue @@ -1,28 +1,20 @@ @@ -27,51 +35,47 @@ import { tagApi } from '@/views/ops/tag/api'; import { TagResourceTypeEnum } from '@/common/commonEnum'; const props = defineProps({ - // 业务表单 - bizForm: { - type: [String], - default: '', + procinst: { + type: [Object], + default: () => {}, }, }); const state = reactive({ cmd: '', + runRes: [], db: 0, redis: {} as any, }); -const { cmd, redis } = toRefs(state); +const { cmd, redis, runRes } = toRefs(state); onMounted(() => { - parseRunCmdForm(props.bizForm); + parseRunCmdForm(props.procinst.bizForm); }); watch( - () => props.bizForm, + () => props.procinst.bizForm, (newValue: any) => { parseRunCmdForm(newValue); } ); -const parseRunCmdForm = async (bizForm: string) => { - if (!bizForm) { +const parseRunCmdForm = async (bizFormStr: string) => { + if (props.procinst.bizHandleRes) { + state.runRes = JSON.parse(props.procinst.bizHandleRes); + } else { + state.runRes = []; + } + + if (!bizFormStr) { return; } - const form = JSON.parse(bizForm); + const bizForm = JSON.parse(bizFormStr); + state.cmd = bizForm.cmd; + state.db = bizForm.db; - const cmds = form.cmd.map((item: any, index: number) => { - if (index === 0) { - return item; // 第一个元素直接返回原值 - } - if (typeof item === 'string') { - return `'${item}'`; // 字符串加单引号 - } - return item; // 其他类型直接返回 - }); - state.cmd = cmds.join(' '); - state.db = form.db; - - const res = await redisApi.redisList.request({ id: form.id }); + const res = await redisApi.redisList.request({ id: bizForm.id }); if (!res.list) { return; } diff --git a/mayfly_go_web/src/views/flow/flowbiz/redis/RedisRunCmdFlowBizForm.vue b/mayfly_go_web/src/views/flow/flowbiz/redis/RedisRunCmdFlowBizForm.vue new file mode 100755 index 00000000..eb9b56d5 --- /dev/null +++ b/mayfly_go_web/src/views/flow/flowbiz/redis/RedisRunCmdFlowBizForm.vue @@ -0,0 +1,148 @@ + + + + diff --git a/mayfly_go_web/src/views/home/Home.vue b/mayfly_go_web/src/views/home/Home.vue index b528a3dc..243c74ff 100644 --- a/mayfly_go_web/src/views/home/Home.vue +++ b/mayfly_go_web/src/views/home/Home.vue @@ -89,7 +89,7 @@ @@ -123,7 +123,7 @@ @@ -164,7 +164,7 @@ @@ -203,7 +203,7 @@ @@ -263,6 +263,7 @@ import { TagResourceTypeEnum } from '@/common/commonEnum'; import { resourceOpLogApi } from '../ops/tag/api'; import TagCodePath from '../ops/component/TagCodePath.vue'; import { useAutoOpenResource } from '@/store/autoOpenResource'; +import { getAllTagInfoByCodePaths } from '../ops/component/tag'; const router = useRouter(); const { userInfo } = storeToRefs(useUserInfo()); @@ -288,18 +289,22 @@ const state = reactive({ machine: { num: 0, opLogs: [], + tagInfos: {}, }, db: { num: 0, opLogs: [], + tagInfos: {}, }, redis: { num: 0, opLogs: [], + tagInfos: {}, }, mongo: { num: 0, opLogs: [], + tagInfos: {}, }, }); @@ -358,21 +363,35 @@ const getMsgs = async () => { const initData = async () => { resourceOpLogApi.getAccountResourceOpLogs .request({ resourceType: TagResourceTypeEnum.MachineAuthCert.value, pageSize: state.defaultLogSize }) - .then((res: any) => { + .then(async (res: any) => { + const tagInfos = await getAllTagInfoByCodePaths(res.list.map((item: any) => item.codePath)); + state.machine.tagInfos = tagInfos; state.machine.opLogs = res.list; }); - resourceOpLogApi.getAccountResourceOpLogs.request({ resourceType: TagResourceTypeEnum.DbName.value, pageSize: state.defaultLogSize }).then((res: any) => { - state.db.opLogs = res.list; - }); + resourceOpLogApi.getAccountResourceOpLogs + .request({ resourceType: TagResourceTypeEnum.DbName.value, pageSize: state.defaultLogSize }) + .then(async (res: any) => { + const tagInfos = await getAllTagInfoByCodePaths(res.list.map((item: any) => item.codePath)); + state.db.tagInfos = tagInfos; + state.db.opLogs = res.list; + }); - resourceOpLogApi.getAccountResourceOpLogs.request({ resourceType: TagResourceTypeEnum.Redis.value, pageSize: state.defaultLogSize }).then((res: any) => { - state.redis.opLogs = res.list; - }); + resourceOpLogApi.getAccountResourceOpLogs + .request({ resourceType: TagResourceTypeEnum.Redis.value, pageSize: state.defaultLogSize }) + .then(async (res: any) => { + const tagInfos = await getAllTagInfoByCodePaths(res.list.map((item: any) => item.codePath)); + state.redis.tagInfos = tagInfos; + state.redis.opLogs = res.list; + }); - resourceOpLogApi.getAccountResourceOpLogs.request({ resourceType: TagResourceTypeEnum.Mongo.value, pageSize: state.defaultLogSize }).then((res: any) => { - state.mongo.opLogs = res.list; - }); + resourceOpLogApi.getAccountResourceOpLogs + .request({ resourceType: TagResourceTypeEnum.Mongo.value, pageSize: state.defaultLogSize }) + .then(async (res: any) => { + const tagInfos = await getAllTagInfoByCodePaths(res.list.map((item: any) => item.codePath)); + state.mongo.tagInfos = tagInfos; + state.mongo.opLogs = res.list; + }); indexApi.machineDashbord.request().then((res: any) => { state.machine.num = res.machineNum; diff --git a/mayfly_go_web/src/views/ops/component/ResourceAuthCertEdit.vue b/mayfly_go_web/src/views/ops/component/ResourceAuthCertEdit.vue index bf53e9e8..af027150 100644 --- a/mayfly_go_web/src/views/ops/component/ResourceAuthCertEdit.vue +++ b/mayfly_go_web/src/views/ops/component/ResourceAuthCertEdit.vue @@ -51,7 +51,7 @@ - + diff --git a/mayfly_go_web/src/views/ops/component/ResourceAuthCertTableEdit.vue b/mayfly_go_web/src/views/ops/component/ResourceAuthCertTableEdit.vue index cb9489dc..aa4b2298 100644 --- a/mayfly_go_web/src/views/ops/component/ResourceAuthCertTableEdit.vue +++ b/mayfly_go_web/src/views/ops/component/ResourceAuthCertTableEdit.vue @@ -22,7 +22,7 @@ - +