Browse Source

update

main
wangshaoping 11 months ago
parent
commit
ee380f3640
  1. 7
      erm.frontend/package.json
  2. 1
      erm.frontend/webpack.config.mf.cjs
  3. 7
      erm.frontend/webpack.env.build.cjs
  4. 4
      gradle.properties
  5. 5
      io.sc.engine.mv.frontend/package.json
  6. 1
      io.sc.engine.mv.frontend/webpack.config.mf.cjs
  7. 7
      io.sc.engine.mv.frontend/webpack.env.build.cjs
  8. 5
      io.sc.engine.rule.frontend/package.json
  9. 1
      io.sc.engine.rule.frontend/webpack.config.mf.cjs
  10. 7
      io.sc.engine.rule.frontend/webpack.env.build.cjs
  11. 4
      io.sc.platform.core.frontend/package.json
  12. 161
      io.sc.platform.core.frontend/src/platform/css/maxgraph.css
  13. 20
      io.sc.platform.core.frontend/src/platform/i18n/messages.json
  14. 20
      io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json
  15. 20
      io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json
  16. 7
      io.sc.platform.core.frontend/src/platform/index.ts
  17. 13
      io.sc.platform.core.frontend/src/platform/plugin/router.ts
  18. 5
      io.sc.platform.core.frontend/template-project/package.json
  19. 2
      io.sc.platform.core.frontend/template-project/src/components/index.ts
  20. 146
      io.sc.platform.core.frontend/template-project/src/views/Components.vue
  21. 53
      io.sc.platform.core.frontend/template-project/src/views/Editor.vue
  22. 71
      io.sc.platform.core.frontend/template-project/src/views/FormElements.vue
  23. 22
      io.sc.platform.core.frontend/template-project/src/views/Properties.vue
  24. 19
      io.sc.platform.core.frontend/template-project/src/views/SideBar.vue
  25. 47
      io.sc.platform.core.frontend/template-project/src/views/ToolBar.vue
  26. 11
      io.sc.platform.core.frontend/template-project/src/views/types/VertexParameterType.ts
  27. 1
      io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs
  28. 7
      io.sc.platform.core.frontend/template-project/webpack.env.build.cjs
  29. 1
      io.sc.platform.core.frontend/webpack.config.mf.cjs
  30. 7
      io.sc.platform.core.frontend/webpack.env.build.cjs
  31. 1
      io.sc.platform.core.frontend/webpack.env.lib.cjs
  32. 11
      io.sc.platform.developer.doc/asciidoc/FAQ/faq.adoc
  33. 5
      io.sc.platform.developer.frontend/package.json
  34. 1
      io.sc.platform.developer.frontend/webpack.config.mf.cjs
  35. 7
      io.sc.platform.developer.frontend/webpack.env.build.cjs
  36. 7
      io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt
  37. 5
      io.sc.platform.gradle/templates/pgp/setup/gradle.properties
  38. 5
      io.sc.platform.lcdp.frontend/package.json
  39. 1
      io.sc.platform.lcdp.frontend/webpack.config.mf.cjs
  40. 7
      io.sc.platform.lcdp.frontend/webpack.env.build.cjs
  41. 34
      io.sc.platform.mvc.frontend/package.json
  42. 1
      io.sc.platform.mvc.frontend/webpack.config.mf.cjs
  43. 7
      io.sc.platform.mvc.frontend/webpack.env.build.cjs
  44. 25
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/plugins/PluginManager.java
  45. 9
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/plugins/item/FrontEndRouteMeta.java
  46. 25
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/plugins/item/FrontEndRouteMetaHome.java
  47. 10
      io.sc.platform.security.frontend/package.json
  48. 5
      io.sc.platform.system.frontend/package.json
  49. 32
      io.sc.platform.system.frontend/src/routes/routes.json
  50. 4
      io.sc.platform.system.frontend/src/views/license/License2.vue
  51. 49
      io.sc.platform.system.frontend/src/views/parameter/Parameter.vue
  52. 1
      io.sc.platform.system.frontend/webpack.config.mf.cjs
  53. 7
      io.sc.platform.system.frontend/webpack.env.build.cjs
  54. 12
      io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/controller/ParameterWebController.java
  55. 2
      io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/jpa/entity/ParameterEntity.java
  56. 23
      io.sc.platform.system/src/main/java/io/sc/platform/system/user/service/impl/UserServiceImpl.java
  57. 2
      io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter.properties
  58. 2
      io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_tw_CN.properties
  59. 2
      io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_zh_CN.properties
  60. 10
      io.sc.platform.system/src/main/resources/liquibase/io.sc.platform.system_8.0.0_20220606__System Database Schema DDL.xml
  61. 5
      io.sc.standard.frontend/package.json
  62. 1
      io.sc.standard.frontend/webpack.config.mf.cjs
  63. 7
      io.sc.standard.frontend/webpack.env.build.cjs

7
erm.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "erm.frontend",
"version": "8.1.33",
"version": "8.1.34",
"description": "",
"private": false,
"keywords": [],
@ -78,7 +78,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.169",
"platform-core": "8.1.178",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
@ -98,6 +98,7 @@
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"codemirror": "6.0.1",
"vue-codemirror6": "1.2.0"
"vue-codemirror6": "1.2.0",
"@maxgraph/core": "0.9.0"
}
}

1
erm.frontend/webpack.config.mf.cjs

@ -43,6 +43,7 @@ module.exports = {
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@maxgraph/core': { requiredVersion: deps['@maxgraph/core'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },

7
erm.frontend/webpack.env.build.cjs

@ -64,6 +64,13 @@ module.exports = merge(common, mf, {
chunks: 'all',
enforce: true
},
'maxgraph': {
name: 'maxgraph',
test: /[\\/]node_modules[\\/]@maxgraph[\\/]/,
priority: 20,
chunks: 'all',
enforce: true
},
'view': {
name: 'view',
test: /[\\/]view[\\/]/,

4
gradle.properties

@ -36,9 +36,9 @@ application_version=1.0.0
# platform
###########################################################
platform_group=io.sc
platform_version=8.1.33
platform_version=8.1.34
platform_plugin_version=8.1.13
platform_core_frontend_version=8.1.169
platform_core_frontend_version=8.1.178
###########################################################
# dependencies version

5
io.sc.engine.mv.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.engine.mv.frontend",
"version": "8.1.33",
"version": "8.1.34",
"description": "",
"private": false,
"keywords": [],
@ -80,6 +80,7 @@
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@maxgraph/core": "0.9.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
@ -91,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.169",
"platform-core": "8.1.178",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

1
io.sc.engine.mv.frontend/webpack.config.mf.cjs

@ -43,6 +43,7 @@ module.exports = {
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@maxgraph/core': { requiredVersion: deps['@maxgraph/core'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },

7
io.sc.engine.mv.frontend/webpack.env.build.cjs

@ -64,6 +64,13 @@ module.exports = merge(common, mf, {
chunks: 'all',
enforce: true
},
'maxgraph': {
name: 'maxgraph',
test: /[\\/]node_modules[\\/]@maxgraph[\\/]/,
priority: 20,
chunks: 'all',
enforce: true
},
'view': {
name: 'view',
test: /[\\/]view[\\/]/,

5
io.sc.engine.rule.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.engine.rule.frontend",
"version": "8.1.33",
"version": "8.1.34",
"description": "",
"private": false,
"keywords": [],
@ -80,6 +80,7 @@
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@maxgraph/core": "0.9.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
@ -91,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.169",
"platform-core": "8.1.178",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

1
io.sc.engine.rule.frontend/webpack.config.mf.cjs

@ -43,6 +43,7 @@ module.exports = {
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@maxgraph/core': { requiredVersion: deps['@maxgraph/core'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },

7
io.sc.engine.rule.frontend/webpack.env.build.cjs

@ -64,6 +64,13 @@ module.exports = merge(common, mf, {
chunks: 'all',
enforce: true
},
'maxgraph': {
name: 'maxgraph',
test: /[\\/]node_modules[\\/]@maxgraph[\\/]/,
priority: 20,
chunks: 'all',
enforce: true
},
'view': {
name: 'view',
test: /[\\/]view[\\/]/,

4
io.sc.platform.core.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.1.170",
"version": "8.1.172",
"description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件",
"main": "dist/platform-core.js",
@ -109,6 +109,7 @@
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@maxgraph/core": "0.9.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
@ -119,7 +120,6 @@
"file-saver": "2.0.5",
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"@maxgraph/core": "0.9.0",
"pinia": "2.1.7",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",

161
io.sc.platform.core.frontend/src/platform/css/maxgraph.css

@ -0,0 +1,161 @@
div.mxRubberband {
position: absolute;
overflow: hidden;
border-style: solid;
border-width: 1px;
border-color: #0000FF;
background: #0077FF;
}
.mxCellEditor {
background: url(data:image/gif;base64,R0lGODlhMAAwAIAAAP///wAAACH5BAEAAAAALAAAAAAwADAAAAIxhI+py+0Po5y02ouz3rz7D4biSJbmiabqyrbuC8fyTNf2jef6zvf+DwwKh8Si8egpAAA7);
border-color: transparent;
border-style: solid;
display: inline-block;
position: absolute;
overflow: visible;
word-wrap: normal;
border-width: 0;
min-width: 1px;
resize: none;
padding: 0px;
margin: 0px;
}
.mxPlainTextEditor * {
padding: 0px;
margin: 0px;
}
div.MaxWindow {
-webkit-box-shadow: 3px 3px 12px #C0C0C0;
-moz-box-shadow: 3px 3px 12px #C0C0C0;
box-shadow: 3px 3px 12px #C0C0C0;
background: url(data:image/gif;base64,R0lGODlhGgAUAIAAAOzs7PDw8CH5BAAAAAAALAAAAAAaABQAAAIijI+py70Ao5y02lud3lzhD4ZUR5aPiKajyZbqq7YyB9dhAQA7);
border:1px solid #c3c3c3;
position: absolute;
overflow: hidden;
z-index: 1;
}
table.MaxWindow {
border-collapse: collapse;
table-layout: fixed;
font-family: Arial;
font-size: 8pt;
}
td.mxWindowTitle {
background: url(data:image/gif;base64,R0lGODlhFwAXAMQAANfX18rKyuHh4c7OzsDAwMHBwc/Pz+Li4uTk5NHR0dvb2+jo6O/v79/f3/n5+dnZ2dbW1uPj44yMjNPT0+Dg4N3d3ebm5szMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAAAAAALAAAAAAXABcAAAWQICESxWiW5Ck6bOu+MMvMdG3f86LvfO/rlqBwSCwaj8ikUohoOp/QaDNCrVqvWKpgezhsv+AwmEIum89ocmPNbrvf64p8Tq/b5Yq8fs/v5x+AgYKDhIAAh4iJiouHEI6PkJGSjhOVlpeYmZUJnJ2en6CcBqMDpaanqKgXq6ytrq+rAbKztLW2shK5uru8vbkhADs=) repeat-x;
text-overflow: ellipsis;
white-space: nowrap;
text-align: center;
font-weight: bold;
overflow: hidden;
height: 13px;
padding: 2px;
padding-top: 4px;
padding-bottom: 6px;
color: black;
}
td.mxWindowPane {
vertical-align: top;
padding: 0px;
}
div.mxWindowPane {
overflow: hidden;
position: relative;
}
td.mxWindowPane td {
font-family: Arial;
font-size: 8pt;
}
td.mxWindowPane input, td.mxWindowPane select, td.mxWindowPane textarea, td.mxWindowPane radio {
border-color: #8C8C8C;
border-style: solid;
border-width: 1px;
font-family: Arial;
font-size: 8pt;
padding: 1px;
}
td.mxWindowPane button {
background: url(data:image/gif;base64,R0lGODlhCgATALMAAP7+/t7e3vj4+Ojo6OXl5e/v7/n5+fb29vPz8/39/e3t7fHx8e7u7v///wAAAAAAACH5BAAAAAAALAAAAAAKABMAAAQ2MMlJhb0Y6c2X/2AhjiRjnqiirizqMkEsz0Rt30Ou7y8K/ouDcEg0GI9IgHLJbDif0Kh06owAADs=) repeat-x;
font-family: Arial;
font-size: 8pt;
padding: 2px;
float: left;
}
img.mxToolbarItem {
margin-right: 6px;
margin-bottom: 6px;
border-width: 1px;
}
select.mxToolbarCombo {
vertical-align: top;
border-style: inset;
border-width: 2px;
}
div.mxToolbarComboContainer {
padding: 2px;
}
img.mxToolbarMode {
margin: 2px;
margin-right: 4px;
margin-bottom: 4px;
border-width: 0px;
}
img.mxToolbarModeSelected {
margin: 0px;
margin-right: 2px;
margin-bottom: 2px;
border-width: 2px;
border-style: inset;
}
div.mxTooltip {
-webkit-box-shadow: 3px 3px 12px #C0C0C0;
-moz-box-shadow: 3px 3px 12px #C0C0C0;
box-shadow: 3px 3px 12px #C0C0C0;
background: #FFFFCC;
border-style: solid;
border-width: 1px;
border-color: black;
font-family: Arial;
font-size: 8pt;
position: absolute;
cursor: default;
padding: 4px;
color: black;
}
div.mxPopupMenu {
-webkit-box-shadow: 3px 3px 12px #C0C0C0;
-moz-box-shadow: 3px 3px 12px #C0C0C0;
box-shadow: 3px 3px 12px #C0C0C0;
background: url(data:image/gif;base64,R0lGODlhGgAUAIAAAOzs7PDw8CH5BAAAAAAALAAAAAAaABQAAAIijI+py70Ao5y02lud3lzhD4ZUR5aPiKajyZbqq7YyB9dhAQA7);
position: absolute;
border-style: solid;
border-width: 1px;
border-color: black;
}
table.mxPopupMenu {
border-collapse: collapse;
margin-top: 1px;
margin-bottom: 1px;
}
tr.mxPopupMenuItem {
color: black;
cursor: pointer;
}
tr.mxPopupMenuItemHover {
background-color: #000066;
color: #FFFFFF;
cursor: pointer;
}
td.mxPopupMenuItem {
padding: 2px 30px 2px 10px;
white-space: nowrap;
font-family: Arial;
font-size: 8pt;
}
td.mxPopupMenuIcon {
background-color: #D0D0D0;
padding: 2px 4px 2px 4px;
}
.mxDisabled {
opacity: 0.2 !important;
cursor:default !important;
}

20
io.sc.platform.core.frontend/src/platform/i18n/messages.json

@ -1,14 +1,14 @@
{
"401": "Unauthorized(401) !",
"403": "Forbidden(403) !",
"404": "Not Found(404) !",
"408": "Not Acceptable(408) !",
"500": "Internal Server Error(500) !",
"501": "Not Implemented(501) !",
"502": "Bad Gateway(502) !",
"503": "Service Unavailable(503) !",
"504": "Gateway Timeout(504) !",
"505": "HTTP Version Not Supported(505) !",
"401": "Unauthorized (401) !",
"403": "Forbidden (403) !",
"404": "Not Found (404) !",
"408": "Not Acceptable (408) !",
"500": "Internal Server Error (500) !",
"501": "Not Implemented (501) !",
"502": "Bad Gateway (502) !",
"503": "Service Unavailable (503) !",
"504": "Gateway Timeout (504) !",
"505": "HTTP Version Not Supported (505) !",
"NetworkError": "Network Error !",
"ERR_BAD_RESPONSE":"Server Response Error !",
"about": "About",

20
io.sc.platform.core.frontend/src/platform/i18n/messages_tw_CN.json

@ -1,14 +1,14 @@
{
"401": "未经授权(401) !",
"403": "被禁止(403) !",
"404": "找到(404) !",
"408": "请求超时(408) !",
"500": "内部服务器错误(500) !",
"501": "未执行(501) !",
"502": "错误的网关(502) !",
"503": "服务不可用(503) !",
"504": "网关超时(504) !",
"505": "不支持的 HTTP 版本(505) !",
"401": "未经授权 (401) !",
"403": "被禁止 (403) !",
"404": "請求的頁面未找到 (404) !",
"408": "请求超时 (408) !",
"500": "内部服务器错误 (500) !",
"501": "未执行 (501) !",
"502": "错误的网关 (502) !",
"503": "服务不可用 (503) !",
"504": "网关超时 (504) !",
"505": "不支持的 HTTP 版本 (505) !",
"NetworkError": "网络异常!",
"ERR_BAD_RESPONSE":"服務器響應錯誤!",
"about": "關於",

20
io.sc.platform.core.frontend/src/platform/i18n/messages_zh_CN.json

@ -1,14 +1,14 @@
{
"401": "未经授权(401) !",
"403": "被禁止(403) !",
"404": "找到(404) !",
"408": "请求超时(408) !",
"500": "内部服务器错误(500) !",
"501": "未执行(501) !",
"502": "错误的网关(502) !",
"503": "服务不可用(503) !",
"504": "网关超时(504) !",
"505": "不支持的 HTTP 版本(505) !",
"401": "未经授权 (401) !",
"403": "被禁止 (403) !",
"404": "请求的页面未找到 (404) !",
"408": "请求超时 (408) !",
"500": "内部服务器错误 (500) !",
"501": "未执行 (501) !",
"502": "错误的网关 (502) !",
"503": "服务不可用 (503) !",
"504": "网关超时 (504) !",
"505": "不支持的 HTTP 版本 (505) !",
"NetworkError": "网络异常!",
"ERR_BAD_RESPONSE":"服务器响应错误!",
"about": "关于",

7
io.sc.platform.core.frontend/src/platform/index.ts

@ -18,9 +18,14 @@ import '@quasar/extras/material-symbols-outlined/material-symbols-outlined.css';
//import '@quasar/extras/material-symbols-sharp/material-symbols-sharp.css';
import '@quasar/extras/eva-icons/eva-icons.css';
import '@quasar/extras/fontawesome-v6/fontawesome-v6.css';
import '@maxgraph/core/css/common.css';
//import './css/tailwind.css';
// 引入 maxgraph css
// 官方推荐 import '@maxgraph/core/css/common.css';
// 由于 common.css 中包含背景图片, 打包后其他模块引用时会出现错误,
// 所以将 common.css 复制到新建的 maxgraph.css 中, 并移除 _background: url('../xxx/xx.gif'); 部分
import '@/platform/css/maxgraph.css';
export default {
install: (app: App) => {
app.use(VueDOMPurifyHTML);

13
io.sc.platform.core.frontend/src/platform/plugin/router.ts

@ -4,8 +4,9 @@ import { LoadingBar } from 'quasar';
import { Environment } from './environment';
import { SessionManager, TagViewManager } from './manager';
import WBasicLayout from '@/platform/layout/WBasicLayout.vue';
import Home from '@/platform/views/Home.vue';
import Login from '@/platform/views/Login.vue';
import Home from '@/platform/views/Home.vue';
import P404 from '@/platform/views/404.vue';
const gc = Environment.getConfigure();
const webContextPath = gc.webContextPath || '/';
@ -20,6 +21,10 @@ const PLATFORM_ROUTES = [
path: '/login',
component: Login,
},
{
path: '/:pathMatch(.*)',
redirect: '/404',
},
{
parent: null,
name: '/',
@ -33,6 +38,12 @@ const PLATFORM_ROUTES = [
path: '/home',
component: Home,
},
{
parent: '/',
name: '404',
path: '/404',
component: P404,
},
],
},
];

5
io.sc.platform.core.frontend/template-project/package.json

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.1.169",
"version": "8.1.178",
"description": "前端核心包,用于快速构建前端的脚手架",
"private": false,
"keywords": [],
@ -81,6 +81,7 @@
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@maxgraph/core": "0.9.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
@ -92,7 +93,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.169",
"platform-core": "8.1.178",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

2
io.sc.platform.core.frontend/template-project/src/components/index.ts

@ -2,6 +2,7 @@
* ,
*/
import xxx from '@/views/xxx.vue';
import component_testcase_formElements from '@/views/FormElements.vue';
import component_testcase_likmDialog from '@/views/likm/Dialog.vue';
import component_testcase_likmDrawer from '@/views/likm/Drawer.vue';
@ -14,6 +15,7 @@ import component_testcase_gridLayout from '@/views/likm/GridLayout.vue';
import component_testcase_likmTreeGrid from '@/views/likm/TreeGrid.vue';
const localComponents = {
xxx: xxx,
'component.testcase.formElements': component_testcase_formElements,
'component.testcase.likmDialog': component_testcase_likmDialog,
'component.testcase.likmDrawer': component_testcase_likmDrawer,

146
io.sc.platform.core.frontend/template-project/src/views/Components.vue

@ -0,0 +1,146 @@
<template>
<div ref="containerRef" style="width: 100%"></div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { InternalEvent, Graph, Geometry, Cell } from '@maxgraph/core';
import type { VertexParameterType } from './types/VertexParameterType';
const containerRef = ref();
let graph: Graph | null = null;
let parent: Cell | null = null;
let entries: VertexParameterType[] = [];
const cellTitleMap = {};
class ComponentsGraph extends Graph {
getTooltipForCell(cell) {
return cellTitleMap[cell.id];
}
}
onMounted(() => {
InternalEvent.disableContextMenu(containerRef.value);
graph = new ComponentsGraph(containerRef.value);
graph.setPanning(true);
graph.setHtmlLabels(true);
graph.setTooltips(true);
parent = graph.getDefaultParent();
addEntry({
id: 'start',
title: '开始',
value: `<div class="w-full h-full align-middle text-center" style="width:47px">开始</div>`,
width: 50,
height: 50,
style: { shape: 'ellipse' },
});
addEntry({
id: 'decide',
title: '条件判断',
value: `<div class="w-full h-full align-middle text-center" style="width:97px">条件判断</div>`,
width: 100,
height: 50,
style: { shape: 'rhombus' },
});
addEntry({
id: 'commandSet',
title: '指令集',
value: `<div class="w-full h-full align-middle text-center" style="width:47px">指令集</div>`,
width: 50,
height: 50,
style: { shape: 'rectangle' },
});
addEntry({
id: 'resource',
title: '资源',
value: `<div class="w-full h-full align-middle text-center" style="width:47px">资源</div>`,
width: 50,
height: 50,
style: { shape: 'rectangle' },
});
addEntry({
id: 'resource',
title: '指令资源',
value: `<div class="w-full h-full align-middle text-center" style="width:47px">指令资源</div>`,
width: 50,
height: 50,
style: { shape: 'rectangle' },
});
addEntry({
id: 'subModel',
title: '子模型',
value: `<div class="w-full h-full align-middle text-center" style="width:47px">子模型</div>`,
width: 50,
height: 50,
style: { shape: 'rectangle' },
});
refresh();
});
const addVertexWithDefaultStyle = (parameter: VertexParameterType): Cell | undefined => {
addVertex({
id: parameter.id,
title: parameter.title,
value: parameter.value,
geometry: parameter.geometry,
style: {
//'rectangle' | 'ellipse' | 'doubleEllipse' | 'rhombus' | 'line' | 'image' | 'arrow' | 'arrowConnector' | 'label' | 'cylinder' | 'swimlane' | 'connector' | 'actor' | 'cloud' | 'triangle' | 'hexagon';
shape: parameter.style?.shape,
verticalAlign: parameter.style?.verticalAlign || 'middle',
verticalLabelPosition: parameter.style?.verticalLabelPosition || 'middle',
align: parameter.style?.align || 'left',
fontSize: parameter.style?.fontSize || 12,
rounded: parameter.style?.rounded || true,
whiteSpace: parameter.style?.whiteSpace || 'wrap',
fillColor: parameter.style?.fillColor || '#F7F2E0',
strokeColor: parameter.style?.strokeColor || 'black',
},
});
};
const addVertex = (parameter: VertexParameterType): Cell | undefined => {
const vertex = graph?.insertVertex({
id: parameter.id,
parent: parent,
position: [parameter.geometry?.x || 0, parameter.geometry?.y || 0],
size: [parameter.geometry?.width || 10, parameter.geometry?.height || 10],
style: parameter.style,
value: parameter.value,
});
cellTitleMap[parameter.id] = parameter.title;
return vertex;
};
const addEntry = (entry: VertexParameterType) => {
entry.geometry = new Geometry(0, 0, entry.width, entry.height);
entries.push(entry);
};
const refresh = () => {
let availableWidth = containerRef.value.clientWidth;
let currentWidth = 0;
for (const entry of entries) {
if (currentWidth + entry.width > availableWidth) {
entry.geometry.x = 0;
} else {
entry.geometry.x = currentWidth;
}
currentWidth += entry.width;
}
graph.batchUpdate(() => {
for (const entry of entries) {
entry.geometry = new Geometry(70, 80, entry.width, entry.height);
}
for (const entry of entries) {
addVertexWithDefaultStyle(entry);
}
});
};
defineExpose({
addEntry,
});
</script>

53
io.sc.platform.core.frontend/template-project/src/views/Editor.vue

@ -0,0 +1,53 @@
<template>
<div ref="containerRef"></div>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { type CellStyle, Graph, InternalEvent } from '@maxgraph/core';
const containerRef = ref();
onMounted(() => {
//const container = <HTMLElement>document.getElementById('graph-container');
// Disables the built-in context menu
InternalEvent.disableContextMenu(containerRef.value);
const graph = new Graph(containerRef.value);
graph.setPanning(true); // Use mouse right button for panning
// Gets the default parent for inserting new cells. This
// is normally the first child of the root (ie. layer 0).
const parent = graph.getDefaultParent();
// Adds cells to the model in a single step
graph.batchUpdate(() => {
const vertex01 = graph.insertVertex({
parent,
position: [10, 10],
size: [100, 100],
value: 'rectangle',
});
const vertex02 = graph.insertVertex({
parent,
position: [350, 90],
size: [50, 50],
style: {
fillColor: 'orange',
shape: 'ellipse',
verticalAlign: 'top',
verticalLabelPosition: 'bottom',
},
value: 'ellipse',
});
graph.insertEdge({
parent,
source: vertex01,
target: vertex02,
value: 'edge',
style: {
edgeStyle: 'orthogonalEdgeStyle',
rounded: true,
},
});
});
});
</script>

71
io.sc.platform.core.frontend/template-project/src/views/FormElements.vue

@ -1,56 +1,25 @@
<template>
<w-grid
ref="userGridRef"
:height="300"
:title="$t('system.user.grid.title')"
:config-button="true"
selection="multiple"
:checkbox-selection="true"
:data-url="Environment.apiContextPath('/api/system/user')"
:pagination="{
sortBy: 'loginName',
descending: false,
}"
:query-form-cols-num="3"
:query-form-fields="[
{ name: 'loginName', label: $t('loginName'), type: 'text' },
{ name: 'userName', label: $t('userName'), type: 'text' },
{ name: 'enable', label: $t('isEnable'), type: 'select' },
]"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
'query',
'refresh',
'separator',
'add',
'clone',
'edit',
'remove',
'separator',
{
name: 'download',
label: $t('download'),
click: () => {
//Downloader.get(Environment.apiContextPath('/api/re/resource/export/10e2a868-caaf-423d-a135-23f530f11696'));
Downloader.get(Environment.apiContextPath('/api/monitor/logger/downloadLogFile?fileName=log.log'));
},
},
]"
:columns="[
{ width: 150, name: 'loginName', label: $t('loginName') },
{ width: '100%', name: 'userName', label: $t('userName') },
{
width: 150,
name: 'enable',
label: $t('status'),
format: Formater.checkTag(),
},
{ width: 100, name: 'lastModifier', label: $t('lastModifier') },
{ width: 110, name: 'lastModifyDate', label: $t('lastModifyDate') },
]"
></w-grid>
<div class="w-full border rounded-md" style="height: 100%">
<ToolBar></ToolBar>
<q-splitter :model-value="20" unit="%" separator-style="width:2px;" style="height: calc(100% - 50px)">
<template #before>
<SideBar></SideBar>
</template>
<template #after>
<q-splitter :model-value="65" unit="%" separator-style="width:2px;" style="height: 100%">
<template #before><Editor></Editor></template>
<template #after><Properties></Properties></template>
</q-splitter>
</template>
</q-splitter>
</div>
</template>
<script setup lang="ts">
import { Environment, Formater, Downloader } from '@/platform';
import { ref, onMounted } from 'vue';
import { type CellStyle, Graph, InternalEvent } from '@maxgraph/core';
import ToolBar from './ToolBar.vue';
import SideBar from './SideBar.vue';
import Editor from './Editor.vue';
import Properties from './Properties.vue';
</script>

22
io.sc.platform.core.frontend/template-project/src/views/Properties.vue

@ -0,0 +1,22 @@
<template>
<div style="height: 100%" class="px-1">
<q-tabs model-value="currentSelectedTabRef" align="left" dense inline-label shrink outside-arrows mobile-arrows :breakpoint="0" no-caps>
<q-tab name="setting" label="设置" />
<q-tab name="style" label="样式" />
<q-tab name="text" label="文本" />
<q-tab name="arrange" label="排列" />
</q-tabs>
<q-tab-panels v-model="currentSelectedTabRef" animated swipeable keep-alive style="height: calc(100% - 48px)">
<q-tab-panel name="setting" class="px-0 pb-0" style="height: 100%"> </q-tab-panel>
<q-tab-panel name="style" class="px-0 pb-0" style="height: 100%"> </q-tab-panel>
<q-tab-panel name="text" class="px-0 pb-0" style="height: 100%"> </q-tab-panel>
<q-tab-panel name="arrange" class="px-0 pb-0" style="height: 100%"> </q-tab-panel>
</q-tab-panels>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const currentSelectedTabRef = ref('style');
</script>

19
io.sc.platform.core.frontend/template-project/src/views/SideBar.vue

@ -0,0 +1,19 @@
<template>
<q-list class="rounded-borders">
<q-expansion-item label="可用组件" default-opened switch-toggle-side header-style="padding-left:8px;padding-right:8px; " expand-icon-class="px-0">
<Components></Components>
</q-expansion-item>
<q-expansion-item label="Account settings" switch-toggle-side header-style="padding-left:8px;padding-right:8px; " expand-icon-class="px-0">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quidem, eius reprehenderit eos corrupti commodi magni quaerat ex numquam, dolorum officiis modi
facere maiores architecto suscipit iste eveniet doloribus ullam aliquid.
</q-expansion-item>
</q-list>
</template>
<script setup lang="ts">
import Components from './Components.vue';
</script>
<style>
.q-item__section--avatar {
min-width: 36px !important;
}
</style>

47
io.sc.platform.core.frontend/template-project/src/views/ToolBar.vue

@ -0,0 +1,47 @@
<template>
<q-toolbar class="w-full border-b rounded-sm gap-x-1">
<q-btn outline icon="bi-floppy" />
<q-separator vertical />
<q-btn-dropdown label="100%" outline>
<q-list>
<q-item v-close-popup clickable>
<q-item-section>
<q-item-label>Reset View</q-item-label>
</q-item-section>
</q-item>
<q-separator vertical />
<q-item v-close-popup clickable>
<q-item-section>
<q-item-label>25%</q-item-label>
</q-item-section>
</q-item>
<q-item v-close-popup clickable>
<q-item-section>
<q-item-label>50%</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-btn-dropdown>
<q-separator vertical />
<q-btn outline icon="bi-zoom-in" />
<q-btn outline icon="bi-zoom-out" />
<q-separator vertical />
<q-btn outline icon="undo" />
<q-btn outline icon="redo" />
<q-separator vertical />
<q-btn outline icon="bi-trash" />
<q-separator vertical />
<q-btn outline icon="bi-layers" />
<q-btn outline icon="bi-layers-half" />
<q-separator vertical />
<q-btn outline icon="bi-paint-bucket" />
<q-separator vertical />
<q-btn outline icon="bi-palette" />
<q-separator vertical />
<q-btn outline icon="bi-bezier2" />
</q-toolbar>
</template>
<script setup lang="ts"></script>

11
io.sc.platform.core.frontend/template-project/src/views/types/VertexParameterType.ts

@ -0,0 +1,11 @@
import { Geometry,CellStyle } from '@maxgraph/core';
export type VertexParameterType = {
id: string | undefined;
title: string | undefined;
width?: number;
height?:number;
geometry?: Geometry;
value: any;
style?: CellStyle;
};

1
io.sc.platform.core.frontend/template-project/webpack.config.mf.cjs

@ -43,6 +43,7 @@ module.exports = {
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@maxgraph/core': { requiredVersion: deps['@maxgraph/core'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },

7
io.sc.platform.core.frontend/template-project/webpack.env.build.cjs

@ -64,6 +64,13 @@ module.exports = merge(common, mf, {
chunks: 'all',
enforce: true
},
'maxgraph': {
name: 'maxgraph',
test: /[\\/]node_modules[\\/]@maxgraph[\\/]/,
priority: 20,
chunks: 'all',
enforce: true
},
'view': {
name: 'view',
test: /[\\/]view[\\/]/,

1
io.sc.platform.core.frontend/webpack.config.mf.cjs

@ -43,6 +43,7 @@ module.exports = {
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@maxgraph/core': { requiredVersion: deps['@maxgraph/core'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },

7
io.sc.platform.core.frontend/webpack.env.build.cjs

@ -64,6 +64,13 @@ module.exports = merge(common, mf, {
chunks: 'all',
enforce: true
},
'maxgraph': {
name: 'maxgraph',
test: /[\\/]node_modules[\\/]@maxgraph[\\/]/,
priority: 20,
chunks: 'all',
enforce: true
},
'view': {
name: 'view',
test: /[\\/]view[\\/]/,

1
io.sc.platform.core.frontend/webpack.env.lib.cjs

@ -41,6 +41,7 @@ const config =merge(common, {
'@codemirror/search': '@codemirror/search',
'@codemirror/state': '@codemirror/state',
'@codemirror/view': '@codemirror/view',
'@maxgraph/core': '@maxgraph/core',
'@quasar/extras': '@quasar/extras',
'@vueuse/core': '@vueuse/core',
'axios': 'axios',

11
io.sc.platform.developer.doc/asciidoc/FAQ/faq.adoc

@ -119,7 +119,7 @@ String jsonString =XmlObjectMapper.getDefaultObjectMapper().writeValueAsString(o
String prettyString =XmlObjectMapper.pretty(xmlString);
----
=== Mac 查看某个端口占用情况
== Mac 查看某个端口占用情况
[source,bash]
----
lsof -i tcp:8888
@ -132,7 +132,7 @@ idea 12474 wangshaoping 152u IPv6 0xfc05ae24f0686587 0t0 TCP [::127.0
eclipse 37328 wangshaoping 65u IPv6 0xfc05ae24f0689587 0t0 TCP [::127.0.0.1]:58450->[::127.0.0.1]:ddi-tcp-1 (CLOSED)
----
=== Mac 测试某个端口的连通性
== Mac 测试某个端口的连通性
[source,bash]
----
nc -vz -w 2 localhost 8888
@ -141,4 +141,11 @@ nc -vz -w 2 localhost 8888
# 出现类似以下信息,表示连通
Connection to localhost port 8888 [tcp/ddi-tcp-1] succeeded!
== 如何给前端框架添加第三方依赖
=== 在 package.json 文件中添加依赖包
=== 在 src/platform/index.ts 文件中添加需要的 css 文件
=== 在 webpack.config.mf.cjs 文件中 shared 部分添加依赖
=== 在 webpack.env.build.cjs 文件中 cacheGroups 部分添加依赖
=== 在 webpack.env.lib.cjs 文件中 externals 部分添加依赖
----

5
io.sc.platform.developer.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.developer.frontend",
"version": "8.1.33",
"version": "8.1.34",
"description": "",
"private": false,
"keywords": [],
@ -80,6 +80,7 @@
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@maxgraph/core": "0.9.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
@ -91,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.169",
"platform-core": "8.1.178",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

1
io.sc.platform.developer.frontend/webpack.config.mf.cjs

@ -43,6 +43,7 @@ module.exports = {
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@maxgraph/core': { requiredVersion: deps['@maxgraph/core'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },

7
io.sc.platform.developer.frontend/webpack.env.build.cjs

@ -64,6 +64,13 @@ module.exports = merge(common, mf, {
chunks: 'all',
enforce: true
},
'maxgraph': {
name: 'maxgraph',
test: /[\\/]node_modules[\\/]@maxgraph[\\/]/,
priority: 20,
chunks: 'all',
enforce: true
},
'view': {
name: 'view',
test: /[\\/]view[\\/]/,

7
io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt

@ -52,7 +52,6 @@ subprojects {
exclude group: "org.apache.logging.log4j", module: "log4j-to-slf4j"
exclude group: "org.slf4j", module: "slf4j-jdk14"
exclude group: "org.slf4j", module: "slf4j-nop"
//exclude group: "com.oracle.database.jdbc", module: "ojdbc8"
}
dependencyManagement {
@ -100,7 +99,6 @@ subprojects {
compileTestJava.options.encoding ="${java_encoding}"
tasks.withType(JavaCompile) {
//options.compilerArgs += ["-Xdoclint:none", "-Xlint:none", "-nowarn"]
options.compilerArgs += ["-Xlint:deprecation","-Xlint:unchecked"]
}
@ -184,7 +182,6 @@ subprojects {
sources {
include '*.adoc'
}
//outputDir = file("$buildDir/resources/main/help/" + project.name)
outputDir = file("dist/help/" + project.name)
resources {
from(sourceDir) {
@ -235,8 +232,6 @@ subprojects {
doLast{
//打包时移除 jrebel 相关的文件
delete "$buildDir/resources/main/rebel.xml"
//
}
}
@ -269,7 +264,7 @@ subprojects {
*----------------------------------------------------------------*/
task jrebelIdea() {}
tasks.jrebelIdea.doLast {
if(file('package.json').exists()){
if(isFrontendProject(file('.'))) {
File resourcesFile = file('java-src/main/resources')
if (resourcesFile != null && resourcesFile.exists()) {
File rebelFile = file('java-src/main/resources/rebel.xml')

5
io.sc.platform.gradle/templates/pgp/setup/gradle.properties

@ -36,9 +36,9 @@ application_version=1.0.0
# platform
###########################################################
platform_group=io.sc
platform_version=8.1.33
platform_version=8.1.34
platform_plugin_version=8.1.13
platform_core_frontend_version=8.1.169
platform_core_frontend_version=8.1.178
###########################################################
# dependencies version
@ -68,7 +68,6 @@ oshi_version=6.4.2
p6spy_version=3.9.1
pinyin4j_version=2.5.1
poi_version=5.2.5
#schemacrawler_version=14.21.02
schemacrawler_version=16.19.11
spring_boot_version=2.7.18
spring_cloud_alibaba_version=2021.0.4.0

5
io.sc.platform.lcdp.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.lcdp.frontend",
"version": "8.1.33",
"version": "8.1.34",
"description": "",
"private": false,
"keywords": [],
@ -80,6 +80,7 @@
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@maxgraph/core": "0.9.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
@ -91,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.169",
"platform-core": "8.1.178",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

1
io.sc.platform.lcdp.frontend/webpack.config.mf.cjs

@ -43,6 +43,7 @@ module.exports = {
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@maxgraph/core': { requiredVersion: deps['@maxgraph/core'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },

7
io.sc.platform.lcdp.frontend/webpack.env.build.cjs

@ -64,6 +64,13 @@ module.exports = merge(common, mf, {
chunks: 'all',
enforce: true
},
'maxgraph': {
name: 'maxgraph',
test: /[\\/]node_modules[\\/]@maxgraph[\\/]/,
priority: 20,
chunks: 'all',
enforce: true
},
'view': {
name: 'view',
test: /[\\/]view[\\/]/,

34
io.sc.platform.mvc.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.mvc.frontend",
"version": "8.1.33",
"version": "8.1.34",
"description": "",
"private": false,
"keywords": [],
@ -68,9 +68,23 @@
"@vue/babel-plugin-jsx": "1.1.5"
},
"dependencies": {
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@maxgraph/core": "0.9.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
"codemirror": "6.0.1",
"dayjs": "1.11.10",
"echarts": "5.4.3",
"exceljs": "4.4.0",
@ -78,26 +92,12 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.169",
"platform-core": "8.1.178",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
"vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0",
"vue-router": "4.2.5",
"@codemirror/autocomplete": "6.11.1",
"@codemirror/commands": "6.3.3",
"@codemirror/lang-html": "6.4.7",
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"codemirror": "6.0.1",
"vue-codemirror6": "1.2.0"
"vue-router": "4.2.5"
}
}

1
io.sc.platform.mvc.frontend/webpack.config.mf.cjs

@ -43,6 +43,7 @@ module.exports = {
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@maxgraph/core': { requiredVersion: deps['@maxgraph/core'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },

7
io.sc.platform.mvc.frontend/webpack.env.build.cjs

@ -64,6 +64,13 @@ module.exports = merge(common, mf, {
chunks: 'all',
enforce: true
},
'maxgraph': {
name: 'maxgraph',
test: /[\\/]node_modules[\\/]@maxgraph[\\/]/,
priority: 20,
chunks: 'all',
enforce: true
},
'view': {
name: 'view',
test: /[\\/]view[\\/]/,

25
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/plugins/PluginManager.java

@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
import io.sc.platform.core.plugins.Plugin;
import io.sc.platform.core.plugins.PluginParser;
import io.sc.platform.core.util.TreeBuilder;
import io.sc.platform.core.util.UrlUtil;
import io.sc.platform.mvc.plugins.item.FrontEndModule;
import io.sc.platform.mvc.plugins.item.FrontEndRoute;
import io.sc.platform.mvc.plugins.item.Parameter;
@ -33,7 +34,9 @@ public class PluginManager {
private List<Plugin<List<FrontEndRoute>>> frontEndRoutePlugins =new ArrayList<>();
private List<FrontEndRoute> frontEndRoutes =new ArrayList<>();
private Map<String, FrontEndRoute> frontEndRouteMap =new HashMap<>();
private Map<String, FrontEndRoute> frontEndRouteNameMap =new HashMap<>();
private Map<String, FrontEndRoute> frontEndRoutePathMap =new HashMap<>();
private Map<String, String> frontEndRouteHomeMap =new HashMap<>();
private List<FrontEndRoute> frontEndRouteRoots =new ArrayList<>();
private List<Plugin<FrontEndModule>> frontEndModulePlugins =new ArrayList<>();
private List<FrontEndModule> frontEndModules =new ArrayList<>();
@ -96,8 +99,15 @@ public class PluginManager {
}
public FrontEndRoute getFrontEndRouteByName(String name){
return frontEndRouteMap.get(name);
return frontEndRouteNameMap.get(name);
}
public FrontEndRoute getFrontEndRouteByPath(String path){
return frontEndRoutePathMap.get(path);
}
public Map<String, String> getFrontEndRouteHomeMap() {
return frontEndRouteHomeMap;
}
public List<Plugin<List<FrontEndRoute>>> getFrontEndRoutePlugins() {
return frontEndRoutePlugins;
}
@ -206,15 +216,20 @@ public class PluginManager {
List<FrontEndRoute> routes =plugin.getValue();
if(routes!=null && !routes.isEmpty()){
for(FrontEndRoute route : routes){
FrontEndRoute item =frontEndRouteMap.get(route.getName());
FrontEndRoute item =frontEndRouteNameMap.get(route.getName());
if(item==null || route.getPriority()<item.getPriority()) {
route.setConfigurationFileUrl(plugin.getFileUrl());
frontEndRouteMap.put(route.getName(), route);
frontEndRouteNameMap.put(route.getName(), route);
String path =UrlUtil.concatUrl(route.getParent(),route.getPath());
frontEndRoutePathMap.put(path,route);
if(route.getMeta()!=null && route.getMeta().getHome()!=null && route.getMeta().getHome().isEnable()) {
frontEndRouteHomeMap.put(path,route.getMeta().getHome().getTitleI18nKey());
}
}
}
}
}
for (Map.Entry<String,FrontEndRoute> entry : frontEndRouteMap.entrySet()) {
for (Map.Entry<String,FrontEndRoute> entry : frontEndRouteNameMap.entrySet()) {
this.frontEndRoutes.add(entry.getValue());
}

9
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/plugins/item/FrontEndRouteMeta.java

@ -4,9 +4,18 @@ import java.util.ArrayList;
import java.util.List;
public class FrontEndRouteMeta {
private FrontEndRouteMetaHome home;
private List<String> permissions =new ArrayList<>();
private List<FrontEndRouteMetaAction> actions =new ArrayList<>();
public FrontEndRouteMetaHome getHome() {
return home;
}
public void setHome(FrontEndRouteMetaHome home) {
this.home = home;
}
public List<String> getPermissions() {
return permissions;
}

25
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/plugins/item/FrontEndRouteMetaHome.java

@ -0,0 +1,25 @@
package io.sc.platform.mvc.plugins.item;
import java.util.ArrayList;
import java.util.List;
public class FrontEndRouteMetaHome {
private boolean enable;
private String titleI18nKey;
public boolean isEnable() {
return enable;
}
public void setEnable(boolean enable) {
this.enable = enable;
}
public String getTitleI18nKey() {
return titleI18nKey;
}
public void setTitleI18nKey(String titleI18nKey) {
this.titleI18nKey = titleI18nKey;
}
}

10
io.sc.platform.security.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.security.frontend",
"version": "8.1.33",
"version": "8.1.34",
"description": "",
"private": false,
"keywords": [
@ -75,12 +75,13 @@
"@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.5",
"@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@maxgraph/core": "0.9.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
@ -92,11 +93,10 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.169",
"quasar": "2.14.2",
"platform-core": "8.1.178",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
"vue-codemirror6": "1.2.0",
"vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0",
"vue-router": "4.2.5"

5
io.sc.platform.system.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.platform.system.frontend",
"version": "8.1.33",
"version": "8.1.34",
"description": "",
"private": false,
"keywords": [],
@ -80,6 +80,7 @@
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@maxgraph/core": "0.9.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
@ -91,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.169",
"platform-core": "8.1.178",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

32
io.sc.platform.system.frontend/src/routes/routes.json

@ -1,8 +1,8 @@
[
{
"parent": "/",
"name": "route.system.license",
"path": "system/license",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.License",
@ -15,9 +15,9 @@
}
},
{
"parent": "/",
"name": "route.system.corporation",
"path": "system/corporation",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.Corporation",
@ -36,9 +36,9 @@
}
},
{
"parent": "/",
"name": "route.system.user",
"path": "system/user",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.User",
@ -51,9 +51,9 @@
}
},
{
"parent": "/",
"name": "route.system.role",
"path": "system/role",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.Role",
@ -66,9 +66,9 @@
}
},
{
"parent": "/",
"name": "route.system.org",
"path": "system/org",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.Org",
@ -81,9 +81,9 @@
}
},
{
"parent": "/",
"name": "route.system.department",
"path": "system/department",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.Department",
@ -96,9 +96,9 @@
}
},
{
"parent": "/",
"name": "route.system.menu",
"path": "system/menu",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.Menu",
@ -111,9 +111,9 @@
}
},
{
"parent": "/",
"name": "route.system.announcementManager",
"path": "system/announcementManager",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.announcementManager",
@ -126,9 +126,9 @@
}
},
{
"parent": "/",
"name": "route.system.notificationManager",
"path": "system/notificationManager",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.NotificationManager",
@ -141,9 +141,9 @@
}
},
{
"parent": "/",
"name": "route.system.parameter",
"path": "system/parameter",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.Parameter",
@ -156,9 +156,9 @@
}
},
{
"parent": "/",
"name": "route.system.dictionary",
"path": "system/dictionary",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.Dictionary",
@ -171,9 +171,9 @@
}
},
{
"parent": "/",
"name": "route.system.i18n",
"path": "system/i18n",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.I18n",
@ -186,9 +186,9 @@
}
},
{
"parent": "/",
"name": "route.system.datasource",
"path": "system/datasource",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.datasource",
@ -201,9 +201,9 @@
}
},
{
"parent": "/",
"name": "route.system.monitor.auditlog",
"path": "system/monitor/auditlog",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.monitor.AuditLog",
@ -216,9 +216,9 @@
}
},
{
"parent": "/",
"name": "route.system.monitor.log",
"path": "system/monitor/log",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.monitor.Log",
@ -231,9 +231,9 @@
}
},
{
"parent": "/",
"name": "route.system.monitor.resources",
"path": "system/monitor/resources",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.system.frontend",
"component": "component.system.monitor.Resources",

4
io.sc.platform.system.frontend/src/views/license/License2.vue

@ -0,0 +1,4 @@
<template>
<div>License</div>
</template>
<script setup lang="ts"></script>

49
io.sc.platform.system.frontend/src/views/parameter/Parameter.vue

@ -61,14 +61,33 @@
width: '600px',
buttons: [
{
name: 'resetDefaultValue',
label: $t('resetDefaultValue'),
name: 'resetDefaultValues',
label: $t('resetDefaultValues'),
noCaps: true,
click: () => {
const row = treeGridRef.getSelectedRow();
if (row) {
if (isExistsOptions()) {
treeGridRef.getEditorForm().setFieldValue('valueSelect', row.defaultValue);
} else {
treeGridRef.getEditorForm().setFieldValue('valueInput', row.defaultValue);
}
}
},
},
],
},
form: {
colsNum: 1,
fields: [
{
name: 'title',
label: $t('name'),
type: 'text',
readOnlyIf: () => {
return true;
},
},
{ name: 'code', label: $t('code'), type: 'text' },
{
name: 'valueInput',
@ -86,6 +105,13 @@
return isExistsOptions();
},
options: optionsRef,
useInput: true,
fillInput: true,
hideSelected: true,
inputDebounce: 0,
onInputValue: (value) => {
treeGridRef.getEditorForm().setFieldValue('valueSelect', value);
},
},
],
},
@ -115,6 +141,7 @@
"
@after-editor-open="
(row) => {
treeGridRef.getEditorForm().setFieldValue('title', t(row.code));
if (isExistsOptions()) {
treeGridRef.getEditorForm().setFieldValue('valueSelect', row.value);
} else {
@ -145,27 +172,17 @@ const optionsRef = ref([]);
const changeOptions = () => {
optionsRef.value.splice(0, optionsRef.value.length);
const rows = treeGridRef.value.getSelectedRows();
if (rows && rows.length > 0) {
const row = rows[0];
const row = treeGridRef.value.getSelectedRow();
if (row) {
for (const key in row.options) {
optionsRef.value.push({ label: t(row.options[key]), value: key });
}
}
};
const getSelectedRow = () => {
const rows = treeGridRef.value.getSelectedRows();
if (rows && rows.length > 0) {
return rows[0];
}
return null;
};
const isExistsOptions = () => {
const rows = treeGridRef.value.getSelectedRows();
if (rows && rows.length > 0) {
const row = rows[0];
const row = treeGridRef.value.getSelectedRow();
if (row) {
return row.options && Object.keys(row.options).length > 0;
}
return false;

1
io.sc.platform.system.frontend/webpack.config.mf.cjs

@ -43,6 +43,7 @@ module.exports = {
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@maxgraph/core': { requiredVersion: deps['@maxgraph/core'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },

7
io.sc.platform.system.frontend/webpack.env.build.cjs

@ -64,6 +64,13 @@ module.exports = merge(common, mf, {
chunks: 'all',
enforce: true
},
'maxgraph': {
name: 'maxgraph',
test: /[\\/]node_modules[\\/]@maxgraph[\\/]/,
priority: 20,
chunks: 'all',
enforce: true
},
'view': {
name: 'view',
test: /[\\/]view[\\/]/,

12
io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/controller/ParameterWebController.java

@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -36,8 +37,15 @@ public class ParameterWebController extends RestCrudController<ParameterVo, Para
Parameter parameter =parameterMap.get(vo.getCode());
if(parameter!=null) {
vo.setDefaultValue(parameter.getDefaultValue());
if (parameter.getOptions() != null) {
vo.setOptions(parameter.getOptions());
if("parameter.system.homePage".equals(parameter.getCode())){
Map<String, String> homeMap =new LinkedHashMap<>();
homeMap.put("/home","home.default");
homeMap.putAll(PluginManager.getInstance().getFrontEndRouteHomeMap());
vo.setOptions(PluginManager.getInstance().getFrontEndRouteHomeMap());
}else {
if (parameter.getOptions() != null) {
vo.setOptions(parameter.getOptions());
}
}
}
}

2
io.sc.platform.system/src/main/java/io/sc/platform/system/parameter/jpa/entity/ParameterEntity.java

@ -57,7 +57,7 @@ public class ParameterEntity extends CorporationAuditorEntity<ParameterVo> imple
public static ParameterEntity from(Parameter parameter){
ParameterEntity entity =new ParameterEntity();
entity.setId(parameter.getId());
entity.setCode(parameter.getCode());
entity.setCode(StringUtils.hasText(parameter.getCode())?parameter.getCode():parameter.getId());
entity.setValue(parameter.getDefaultValue());
entity.setOrder(parameter.getOrder());
entity.setParent(StringUtils.hasText(parameter.getParentId())?new ParameterEntity(parameter.getParentId()):null);

23
io.sc.platform.system/src/main/java/io/sc/platform/system/user/service/impl/UserServiceImpl.java

@ -4,6 +4,7 @@ import io.sc.platform.jdbc.util.SqlBatcher;
import io.sc.platform.mvc.plugins.PluginManager;
import io.sc.platform.mvc.plugins.item.FrontEndRoute;
import io.sc.platform.mvc.service.FrontEndService;
import io.sc.platform.mvc.service.SystemParameterService;
import io.sc.platform.orm.api.exception.UserRawPasswordNotMatchException;
import io.sc.platform.orm.service.impl.DaoServiceImpl;
import io.sc.platform.orm.service.support.QueryParameter;
@ -58,6 +59,7 @@ public class UserServiceImpl extends DaoServiceImpl<UserEntity, String, UserRepo
@Autowired private JdbcTemplate jdbcTemplate;
@Autowired private RoleService roleService;
@Autowired private OrgService orgService;
@Autowired private SystemParameterService systemParameterService;
@Override
public UserSession getUserSession(HttpServletRequest request) throws Exception {
@ -440,20 +442,35 @@ public class UserServiceImpl extends DaoServiceImpl<UserEntity, String, UserRepo
}
private List<FrontEndRoute> getFrontEndRoutes(List<MenuVo> menus){
PluginManager pluginManager =PluginManager.getInstance();
List<FrontEndRoute> result = new ArrayList<>();
Map<String,FrontEndRoute> frontEndRouteMap =new HashMap<>();
if(menus!=null && !menus.isEmpty()) {
for(MenuVo menu : menus){
if (menu instanceof MenuRouteVo) {
MenuRouteVo routeMenu = (MenuRouteVo) menu;
FrontEndRoute route = PluginManager.getInstance().getFrontEndRouteByName(routeMenu.getRouteName());
FrontEndRoute route = pluginManager.getFrontEndRouteByName(routeMenu.getRouteName());
if(route!=null) {
result.add(route);
frontEndRouteMap.put(route.getName(),route);
}
}
}
}
// 将系统参数配置的首页前端路由加入到返回结果中
String homePagePath =systemParameterService.getParameter("parameter.system.homePage");
if(StringUtils.hasText(homePagePath) && !"/home".equals(homePagePath)){
FrontEndRoute frontEndRoute =pluginManager.getFrontEndRouteByPath(homePagePath);
if(frontEndRoute!=null){
result.add(frontEndRoute);
}else{
frontEndRoute =new FrontEndRoute();
frontEndRoute.setName(homePagePath);
frontEndRoute.setParent("/");
frontEndRoute.setPath(homePagePath);
frontEndRoute.setPriority(0);
frontEndRoute.setRedirect("/home");
result.add(frontEndRoute);
}
}
return result;
}

2
io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter.properties

@ -1,3 +1,5 @@
home.default=Home Page (System Default)
parameter.system=System
parameter.system.homePage=Home Page
parameter.login.encodePassword=\u767B\u9304\u9801\u9762\u5BC6\u78BC\u52A0\u5BC6

2
io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_tw_CN.properties

@ -1,3 +1,5 @@
home.default=\u9996\u9801 (\u7CFB\u7D71\u9ED8\u8A8D)
parameter.system=\u7CFB\u7D71
parameter.system.homePage=\u9996\u9801
parameter.login.encodePassword=\u767B\u9304\u9801\u9762\u5BC6\u78BC\u52A0\u5BC6

2
io.sc.platform.system/src/main/resources/io/sc/platform/system/i18n/parameter_zh_CN.properties

@ -1,3 +1,5 @@
home.default=\u9996\u9875 (\u7CFB\u7EDF\u9ED8\u8BA4)
parameter.system=\u7CFB\u7EDF
parameter.system.homePage=\u9996\u9875
parameter.login.encodePassword=\u767B\u9304\u9801\u9762\u5BC6\u78BC\u52A0\u5BC6

10
io.sc.platform.system/src/main/resources/liquibase/io.sc.platform.system_8.0.0_20220606__System Database Schema DDL.xml

@ -209,13 +209,13 @@
<!-- 系统参数表 -->
<createTable tableName="SYS_PARAMETER" remarks="系统参数表">
<column name="ID_" type="NVARCHAR(255)" remarks="ID">
<column name="ID_" type="NVARCHAR(36)" remarks="ID">
<constraints primaryKey="true"/>
</column>
<column name="CODE_" type="NVARCHAR(255)" remarks="代码"></column>
<column name="VALUE_" type="NVARCHAR(1024)" remarks="值"></column>
<column name="ORDER_" type="INTEGER" remarks="顺序"></column>
<column name="PARENT_ID_" type="NVARCHAR(255)" remarks="父ID"></column>
<column name="CODE_" type="NVARCHAR(255)" remarks="代码"></column>
<column name="VALUE_" type="NVARCHAR(1024)" remarks="值"></column>
<column name="ORDER_" type="INTEGER" remarks="顺序"></column>
<column name="PARENT_ID_" type="NVARCHAR(36)" remarks="父ID"></column>
<column name="JPA_VERSION_" type="INTEGER" remarks="JPA乐观锁版本"/>
<column name="DATA_COME_FROM_" type="NVARCHAR(10)" remarks="数据来源(INPUT:手工录入,IMPORT:系统自动导入)"/>
<column name="CREATOR_" type="NVARCHAR(255)" remarks="创建人"/>

5
io.sc.standard.frontend/package.json

@ -1,6 +1,6 @@
{
"name": "io.sc.standard.frontend",
"version": "8.1.33",
"version": "8.1.34",
"description": "",
"private": false,
"keywords": [],
@ -80,6 +80,7 @@
"@codemirror/search": "6.5.5",
"@codemirror/state": "6.4.0",
"@codemirror/view": "6.23.0",
"@maxgraph/core": "0.9.0",
"@quasar/extras": "1.16.9",
"@vueuse/core": "10.7.1",
"axios": "1.6.3",
@ -91,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.169",
"platform-core": "8.1.178",
"quasar": "2.14.5",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

1
io.sc.standard.frontend/webpack.config.mf.cjs

@ -43,6 +43,7 @@ module.exports = {
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@maxgraph/core': { requiredVersion: deps['@maxgraph/core'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },

7
io.sc.standard.frontend/webpack.env.build.cjs

@ -64,6 +64,13 @@ module.exports = merge(common, mf, {
chunks: 'all',
enforce: true
},
'maxgraph': {
name: 'maxgraph',
test: /[\\/]node_modules[\\/]@maxgraph[\\/]/,
priority: 20,
chunks: 'all',
enforce: true
},
'view': {
name: 'view',
test: /[\\/]view[\\/]/,

Loading…
Cancel
Save