Browse Source

fix pageable bug

main
wangshaoping 1 year ago
parent
commit
a7f855e80a
  1. 2
      gradle.properties
  2. 2
      io.sc.platform.core.frontend/package.json
  3. 9
      io.sc.platform.core.frontend/src/platform/components-ext/formater/BooleanFormater.ts
  4. 6
      io.sc.platform.core.frontend/src/platform/components-ext/formater/index.ts
  5. 36
      io.sc.platform.core.frontend/src/platform/components-ext/options/BooleanOptions.ts
  6. 5
      io.sc.platform.core.frontend/src/platform/components-ext/options/EnumOptions.ts
  7. 3
      io.sc.platform.core.frontend/src/platform/components/index.ts
  8. 0
      io.sc.platform.core.frontend/src/platform/components/tag/WEnableTag.vue
  9. 14
      io.sc.platform.core.frontend/src/platform/index.ts
  10. 1
      io.sc.platform.core.frontend/src/platform/plugin/axios.ts
  11. 2
      io.sc.platform.core.frontend/src/platform/plugin/quasar.ts
  12. 4
      io.sc.platform.core.frontend/template-project/package.json
  13. 8
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties
  14. 6
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties
  15. 8
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties
  16. 4
      io.sc.platform.developer.frontend/package.json
  17. 14
      io.sc.platform.developer.frontend/src/views/plugin/ApplicationProperties.vue
  18. 11
      io.sc.platform.developer.frontend/src/views/plugin/Components.vue
  19. 13
      io.sc.platform.developer.frontend/src/views/plugin/Directories.vue
  20. 12
      io.sc.platform.developer.frontend/src/views/plugin/FrontendModule.vue
  21. 18
      io.sc.platform.developer.frontend/src/views/plugin/FrontendRoutes.vue
  22. 11
      io.sc.platform.developer.frontend/src/views/plugin/Initializer.vue
  23. 11
      io.sc.platform.developer.frontend/src/views/plugin/JsonSerializers.vue
  24. 11
      io.sc.platform.developer.frontend/src/views/plugin/Messages.vue
  25. 8
      io.sc.platform.developer.frontend/src/views/plugin/P6spy.vue
  26. 18
      io.sc.platform.developer.frontend/src/views/plugin/Parameters.vue
  27. 11
      io.sc.platform.developer.frontend/src/views/plugin/Repositories.vue
  28. 11
      io.sc.platform.developer.frontend/src/views/plugin/RestartProperties.vue
  29. 10
      io.sc.platform.developer.frontend/src/views/plugin/Security.vue
  30. 9
      io.sc.platform.developer.frontend/src/views/plugin/SystemProperties.vue
  31. 11
      io.sc.platform.developer.frontend/src/views/plugin/Ws.vue
  32. 16
      io.sc.platform.developer.frontend/src/views/springboot/Bean.vue
  33. 124
      io.sc.platform.developer.frontend/src/views/springboot/Mapping.vue
  34. 6
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/InitializerWebController.java
  35. 7
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginApplicationPropertiesWebController.java
  36. 7
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginComponentsWebController.java
  37. 7
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginDirectoriesWebController.java
  38. 8
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginFrontendModuleWebController.java
  39. 8
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginFrontendRouteWebController.java
  40. 8
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginJsonSerializersWebController.java
  41. 8
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginMessagesWebController.java
  42. 8
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginP6spyWebController.java
  43. 7
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginParametersWebController.java
  44. 8
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginRepositoriesWebController.java
  45. 8
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginRestartPropertiesWebController.java
  46. 8
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginSecurityWebController.java
  47. 6
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginSwaggerWebController.java
  48. 6
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginSystemPropertiesWebController.java
  49. 8
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginWsWebController.java
  50. 11
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootBeansWebController.java
  51. 86
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootRequestMappingWebController.java
  52. 44
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/springboot/DespatcherServletWrapper.java
  53. 4
      io.sc.platform.lcdp.frontend/package.json
  54. 4
      io.sc.platform.mvc.frontend/package.json
  55. 6
      io.sc.platform.security.frontend/package.json
  56. 4
      io.sc.platform.system.frontend/package.json
  57. 65
      io.sc.platform.system.frontend/src/i18n/messages.json
  58. 65
      io.sc.platform.system.frontend/src/i18n/messages_tw_CN.json
  59. 67
      io.sc.platform.system.frontend/src/i18n/messages_zh_CN.json
  60. 522
      io.sc.platform.system.frontend/src/views/role/Role.vue
  61. 208
      io.sc.platform.system.frontend/src/views/role/SelectUserDialog.vue
  62. 15
      io.sc.platform.system.frontend/src/views/user/SelectRoleDialog.vue
  63. 3
      io.sc.platform.system.frontend/src/views/user/SetPasswordDialog.vue
  64. 159
      io.sc.platform.system.frontend/src/views/user/User.vue
  65. 38
      io.sc.platform.system/src/main/java/io/sc/platform/system/user/service/impl/UserServiceImpl.java

2
gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc
platform_version=8.1.20
platform_plugin_version=8.1.13
platform_core_frontend_version=8.1.67
platform_core_frontend_version=8.1.75
###########################################################
# dependencies version

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

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.1.70",
"version": "8.1.76",
"description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件",
"main": "dist/platform-core.js",

9
io.sc.platform.core.frontend/src/platform/components-ext/formater/BooleanFormater.ts

@ -14,4 +14,11 @@ const trueFalseFormater = (value) => {
return i18n.global.t('false');
};
export { yesNoFormater, trueFalseFormater };
const enableTagFormater = (value) => {
return {
componentType: 'WEnableTag',
attrs: { enable: value },
};
};
export { yesNoFormater, trueFalseFormater, enableTagFormater };

6
io.sc.platform.core.frontend/src/platform/components-ext/formater/index.ts

@ -1,11 +1,15 @@
import type { EnumType } from '@/platform/types';
import { yesNoFormater, trueFalseFormater } from './BooleanFormater';
import { yesNoFormater, trueFalseFormater, enableTagFormater } from './BooleanFormater';
import { dateOnlyFormater } from './DatetimeFormater';
import { EnumFormater } from './EnumFormater';
class Formater {
static #enumFormaterMap = {};
public static enableTag() {
return enableTagFormater;
}
public static yesNo() {
return yesNoFormater;
}

36
io.sc.platform.core.frontend/src/platform/components-ext/options/BooleanOptions.ts

@ -1,17 +1,33 @@
import { i18n } from '@/platform/plugin';
const yesNo = () => {
return [
{ value: true, label: i18n.global.t('yes') },
{ value: false, label: i18n.global.t('no') },
];
const yesNo = (includeEmpty: boolean = true) => {
if (includeEmpty) {
return [
{ value: null, label: '' },
{ value: true, label: i18n.global.t('yes') },
{ value: false, label: i18n.global.t('no') },
];
} else {
return [
{ value: true, label: i18n.global.t('yes') },
{ value: false, label: i18n.global.t('no') },
];
}
};
const trueFalse = () => {
return [
{ value: true, label: i18n.global.t('true') },
{ value: false, label: i18n.global.t('false') },
];
const trueFalse = (includeEmpty: boolean = true) => {
if (includeEmpty) {
return [
{ value: null, label: '' },
{ value: true, label: i18n.global.t('true') },
{ value: false, label: i18n.global.t('false') },
];
} else {
return [
{ value: true, label: i18n.global.t('true') },
{ value: false, label: i18n.global.t('false') },
];
}
};
export { yesNo, trueFalse };

5
io.sc.platform.core.frontend/src/platform/components-ext/options/EnumOptions.ts

@ -8,9 +8,12 @@ class EnumOptions {
this.#options = options;
}
public options() {
public options(includeEmpty: boolean = true) {
if (this.#options) {
const result = [];
if (includeEmpty) {
result.push({ value: null, label: '' });
}
for (const option of this.#options) {
result.push({
value: option.value,

3
io.sc.platform.core.frontend/src/platform/components/index.ts

@ -26,6 +26,7 @@ import WInfoPanel from './panel/WInfoPanel.vue';
import WGrid from './grid/WGrid.vue';
import WToolbar from './toolbar/WToolbar.vue';
import WEnableTag from './tag/WEnableTag.vue';
export default {
install: (app: App) => {
@ -55,6 +56,7 @@ export default {
app.component('WGrid', WGrid);
app.component('WToolbar', WToolbar);
app.component('WEnableTag', WEnableTag);
},
};
@ -80,6 +82,7 @@ export {
WPassword,
WGrid,
WToolbar,
WEnableTag,
};
export { PlatformIconEnum } from './utils';

0
io.sc.platform.system.frontend/src/views/user/RoleStatusTag.vue → io.sc.platform.core.frontend/src/platform/components/tag/WEnableTag.vue

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

@ -108,7 +108,19 @@ export { Options } from './components-ext';
/**
* UI
*/
export { WPlatformPage, WIconEmpty, WHScreenDiv, WColorInput, WColorInputPalette, WPosition, WCodemirror, WSelect, WGrid, WTreeGrid } from './components';
export {
WPlatformPage,
WIconEmpty,
WHScreenDiv,
WColorInput,
WColorInputPalette,
WPosition,
WCodemirror,
WSelect,
WGrid,
WTreeGrid,
WEnableTag,
} from './components';
export { PlatformIconEnum } from './components';
export { PageStatusEnum } from './components';

1
io.sc.platform.core.frontend/src/platform/plugin/axios.ts

@ -4,7 +4,6 @@ import { i18n } from './i18n';
import { PConst } from '@/platform/PConst';
import { Environment } from '@/platform/plugin/environment';
import { NotifyManager } from './manager';
import { Tools } from '@/platform/utils';
const ignoredUrls: string[] = [PConst.API_I18N_MESSAGES_URL, PConst.API_APP_CONFIGURE_URL];
const gc = Environment.getConfigure();

2
io.sc.platform.core.frontend/src/platform/plugin/quasar.ts

@ -4,8 +4,6 @@ import type { I18nMessageLocaleType } from '@/platform/types';
import { Environment } from '@/platform/plugin/environment';
import { I18nMessageManager } from '@/platform/plugin/manager';
import { QBtn } from 'quasar';
const gc = Environment.getConfigure();
const eventBus: any = new EventBus();

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

@ -1,6 +1,6 @@
{
"name": "platform-core",
"version": "8.1.70",
"version": "8.1.76",
"description": "前端核心包,用于快速构建前端的脚手架",
"private": false,
"keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.70",
"platform-core": "8.1.76",
"quasar": "2.14.2",
"tailwindcss": "3.4.0",
"vue": "3.4.3",

8
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties

@ -100,7 +100,7 @@ normal=Normal
oldValue=Old Value
operationSuccess=Operation Sucess
order=Order
org=Org
org=Organization
parent=Parent
parentId=Parent ID
path=Path
@ -149,3 +149,9 @@ webContainer=Web Container
weixin=WeiXin
welcome=Welcome
yes=Yes
rawPassword=Raw Password
newPassword=New Password
confirmNewPassword=Confirm New Password
accountExpired=Expired
accountLocked=Locked
credentialsExpired=Credentials Expired

6
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties

@ -149,3 +149,9 @@ webContainer=Web \u5BB9\u5668
weixin=\u5FAE\u4FE1
welcome=\u6B61\u8FCE
yes=\u662F
rawPassword=\u539F\u5BC6\u78BC
newPassword=\u65B0\u5BC6\u78BC
confirmNewPassword=\u78BA\u8A8D\u65B0\u5BC6\u78BC
accountExpired=\u904E\u671F
accountLocked=\u9396\u5B9A
credentialsExpired=\u5BC6\u78BC\u904E\u671F

8
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties

@ -148,4 +148,10 @@ version=\u7248\u672C
webContainer=Web \u5BB9\u5668
weixin=\u5FAE\u4FE1
welcome=\u6B22\u8FCE
yes=\u662F
yes=\u662F
rawPassword=\u539F\u5BC6\u7801
newPassword=\u65B0\u5BC6\u7801
confirmNewPassword=\u786E\u8BA4\u65B0\u5BC6\u7801
accountExpired=\u8FC7\u671F
accountLocked=\u9501\u5B9A
credentialsExpired=\u5BC6\u7801\u8FC7\u671F

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

@ -78,7 +78,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.70",
"platform-core": "8.1.75",
"quasar": "2.14.2",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
@ -100,4 +100,4 @@
"codemirror": "6.0.1",
"vue-codemirror6": "1.2.0"
}
}
}

14
io.sc.platform.developer.frontend/src/views/plugin/ApplicationProperties.vue

@ -3,15 +3,17 @@
:title="$t('menu.developer.plugin.applicationProperties')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/applicationProperties')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: '20%', name: 'order', label: $t('order') },
{ width: '20%', name: 'module', label: $t('module') },
{ width: '40%', name: 'description', label: $t('description') },
{ width: 50, name: 'order', label: $t('order'), align: 'right', sortable: false },
{ width: 150, name: 'module', label: $t('module'), sortable: false },
{ width: 200, name: 'description', label: $t('description'), sortable: false },
{
width: '40%',
width: 300,
name: 'properties',
label: $t('properties'),
sortable: false,
format: (properties) => {
properties = properties || [];
let result = '';
@ -21,7 +23,7 @@
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 200, name: 'configurationFileUrl', label: $t('url') },
]"
></w-grid>
</template>

11
io.sc.platform.developer.frontend/src/views/plugin/Components.vue

@ -3,12 +3,14 @@
:title="$t('menu.developer.plugin.components')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/components')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{
width: '40%',
width: 300,
name: 'includes',
label: $t('include'),
sortable: false,
format: (includes) => {
includes = includes || [];
let result = '';
@ -19,9 +21,10 @@
},
},
{
width: '40%',
width: 300,
name: 'excludes',
label: $t('exclude'),
sortable: false,
format: (excludes) => {
excludes = excludes || [];
let result = '';
@ -31,7 +34,7 @@
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 200, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>

13
io.sc.platform.developer.frontend/src/views/plugin/Directories.vue

@ -3,15 +3,16 @@
:title="$t('menu.developer.plugin.directories')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/directories')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: '20%', name: 'name', label: $t('name') },
{ width: '40%', name: 'path', label: $t('path') },
{ width: '40%', name: 'autoCreate', label: $t('autoCreate') },
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 200, name: 'name', label: $t('name'), sortable: false },
{ width: 200, name: 'path', label: $t('path'), sortable: false },
{ width: 100, name: 'autoCreate', label: $t('autoCreate'), format: Formater.yesNo(), sortable: false },
{ width: 200, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>
<script setup lang="ts">
import { Environment } from 'platform-core';
import { Environment, Formater } from 'platform-core';
</script>

12
io.sc.platform.developer.frontend/src/views/plugin/FrontendModule.vue

@ -3,12 +3,15 @@
:title="$t('menu.developer.plugin.frontendModule')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/frontendModule')"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: 100, name: 'name', label: $t('name') },
{ width: 200, name: 'name', label: $t('name'), sortable: false },
{
width: '40%',
width: 200,
name: 'components',
label: $t('component'),
sortable: false,
format: (components) => {
components = components || [];
let result = '';
@ -19,9 +22,10 @@
},
},
{
width: '40%',
width: 300,
name: 'resources',
label: $t('resource'),
sortable: false,
format: (resources) => {
resources = resources || [];
let result = '';
@ -31,7 +35,7 @@
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 200, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>

18
io.sc.platform.developer.frontend/src/views/plugin/FrontendRoutes.vue

@ -3,15 +3,17 @@
:title="$t('menu.developer.plugin.frontendModule')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/frontendRoute')"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: '40%', name: 'name', label: $t('name') },
{ width: '40%', name: 'parent', label: $t('parent') },
{ width: '40%', name: 'path', label: $t('path') },
{ width: '40%', name: 'module', label: $t('module') },
{ width: '40%', name: 'priority', label: $t('priority') },
{ width: '40%', name: 'component', label: $t('component') },
{ width: '40%', name: 'redirect', label: $t('redirect') },
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 280, name: 'name', label: $t('name'), sortable: false },
{ width: 80, name: 'parent', label: $t('parent'), sortable: false },
{ width: 250, name: 'path', label: $t('path'), sortable: false },
{ width: 90, name: 'priority', label: $t('priority'), sortable: false },
{ width: 250, name: 'module', label: $t('module'), sortable: false },
{ width: 300, name: 'component', label: $t('component'), sortable: false },
{ width: 200, name: 'redirect', label: $t('redirect'), sortable: false },
{ width: 200, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>

11
io.sc.platform.developer.frontend/src/views/plugin/Initializer.vue

@ -3,12 +3,13 @@
:title="$t('menu.developer.plugin.initializer')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/initializer')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: '20%', name: 'order', label: $t('order'), align: 'right' },
{ width: '40%', name: 'name', label: $t('name'), format: (value) => $t(value), align: 'left' },
{ width: '40%', name: 'description', label: $t('description'), format: (value) => $t(value), align: 'left' },
{ width: '40%', name: 'id', label: $t('className'), align: 'left' },
{ name: 'order', label: $t('order'), align: 'right', sortable: false },
{ name: 'name', label: $t('name'), format: (value) => $t(value), align: 'left', sortable: false },
{ name: 'description', label: $t('description'), format: (value) => $t(value), align: 'left', sortable: false },
{ name: 'id', label: $t('className'), align: 'left', sortable: false },
]"
></w-grid>
</template>

11
io.sc.platform.developer.frontend/src/views/plugin/JsonSerializers.vue

@ -3,12 +3,13 @@
:title="$t('menu.developer.plugin.jsonSerializers')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/jsonSerializers')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: '20%', name: 'className', label: $t('className') },
{ width: '40%', name: 'serializer', label: $t('serializer') },
{ width: '40%', name: 'deserializer', label: $t('deserializer') },
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 280, name: 'className', label: $t('className'), sortable: false },
{ width: 420, name: 'serializer', label: $t('serializer'), sortable: false },
{ width: 420, name: 'deserializer', label: $t('deserializer'), sortable: false },
{ width: 200, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>

11
io.sc.platform.developer.frontend/src/views/plugin/Messages.vue

@ -3,12 +3,14 @@
:title="$t('menu.developer.plugin.messages')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/messages')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{
width: '40%',
width: 300,
name: 'includes',
label: $t('include'),
sortable: false,
format: (includes) => {
includes = includes || [];
let result = '';
@ -19,9 +21,10 @@
},
},
{
width: '40%',
width: 300,
name: 'excludes',
label: $t('exclude'),
sortable: false,
format: (excludes) => {
excludes = excludes || [];
let result = '';
@ -31,7 +34,7 @@
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 200, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>

8
io.sc.platform.developer.frontend/src/views/plugin/P6spy.vue

@ -3,12 +3,14 @@
:title="$t('menu.developer.plugin.p6spy')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/p6spy')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{
width: '40%',
width: 300,
name: 'ignoredPatterns',
label: $t('ignored'),
sortable: false,
format: (ignoredPatterns) => {
ignoredPatterns = ignoredPatterns || [];
let result = '';
@ -18,7 +20,7 @@
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 200, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>

18
io.sc.platform.developer.frontend/src/views/plugin/Parameters.vue

@ -1,17 +1,19 @@
<template>
<w-grid
:title="$t('menu.developer.plugin.parameters')"
:tree="true"
tree-relationship-field="parentId"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/parameters')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: '20%', name: 'id', label: $t('id'), align: 'right' },
{ width: '40%', name: 'parentId', label: $t('parentId') },
{ width: '40%', name: 'defaultValue', label: $t('defaultValue') },
{ width: '40%', name: 'order', label: $t('order') },
{ width: '40%', name: 'priority', label: $t('priority') },
{ width: '40%', name: 'description', label: $t('description') },
{ width: '40%', name: 'configurationFileUrl', label: $t('className') },
{ width: 300, name: 'id', label: $t('id'), sortable: false },
{ width: 200, name: 'defaultValue', label: $t('defaultValue'), sortable: false },
{ width: 80, name: 'order', label: $t('order'), sortable: false },
{ width: 100, name: 'priority', label: $t('priority'), sortable: false },
{ width: 200, name: 'description', label: $t('description'), sortable: false },
{ width: 200, name: 'configurationFileUrl', label: $t('className'), sortable: false },
]"
></w-grid>
</template>

11
io.sc.platform.developer.frontend/src/views/plugin/Repositories.vue

@ -3,12 +3,14 @@
:title="$t('menu.developer.plugin.repositories')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/repositories')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{
width: '40%',
width: 300,
name: 'includes',
label: $t('include'),
sortable: false,
format: (includes) => {
includes = includes || [];
let result = '';
@ -19,9 +21,10 @@
},
},
{
width: '40%',
width: 300,
name: 'excludes',
label: $t('exclude'),
sortable: false,
format: (excludes) => {
excludes = excludes || [];
let result = '';
@ -31,7 +34,7 @@
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 200, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>

11
io.sc.platform.developer.frontend/src/views/plugin/RestartProperties.vue

@ -3,12 +3,14 @@
:title="$t('menu.developer.plugin.restartProperties')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/restartProperties')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{
width: '20%',
width: 300,
name: 'container',
label: $t('webContainer'),
sortable: false,
format: (containers) => {
containers = containers || [];
let result = '';
@ -19,9 +21,10 @@
},
},
{
width: '40%',
width: 300,
name: 'jar',
label: $t('jar'),
sortable: false,
format: (jars) => {
jars = jars || [];
let result = '';
@ -31,7 +34,7 @@
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 200, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>

10
io.sc.platform.developer.frontend/src/views/plugin/Security.vue

@ -3,12 +3,14 @@
:title="$t('menu.developer.plugin.security')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/security')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{
width: '40%',
width: 200,
name: 'permitPatterns',
label: $t('include'),
label: $t('ignored'),
sortable: false,
format: (permitPatterns) => {
permitPatterns = permitPatterns || [];
let result = '';
@ -18,7 +20,7 @@
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 500, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>

9
io.sc.platform.developer.frontend/src/views/plugin/SystemProperties.vue

@ -3,11 +3,12 @@
:title="$t('menu.developer.plugin.systemProperties')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/systemProperties')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: '20%', name: 'name', label: $t('name') },
{ width: '40%', name: 'value', label: $t('path') },
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 200, name: 'name', label: $t('name'), sortable: false },
{ width: 200, name: 'value', label: $t('value'), sortable: false },
{ width: 200, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>

11
io.sc.platform.developer.frontend/src/views/plugin/Ws.vue

@ -3,12 +3,13 @@
:title="$t('menu.developer.plugin.ws')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/ws')"
row-key="id"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: '20%', name: 'publish', label: $t('publish') },
{ width: '40%', name: 'beanName', label: $t('beanName') },
{ width: '40%', name: 'beanClass', label: $t('beanClass') },
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
{ width: 200, name: 'publish', label: $t('publish'), sortable: false },
{ width: 200, name: 'beanName', label: $t('beanName'), sortable: false },
{ width: 200, name: 'beanClass', label: $t('beanClass'), sortable: false },
{ width: 200, name: 'configurationFileUrl', label: $t('url'), sortable: false },
]"
></w-grid>
</template>

16
io.sc.platform.developer.frontend/src/views/springboot/Bean.vue

@ -3,17 +3,12 @@
:title="$t('menu.developer.springboot.bean')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/springboot/beans')"
:checkbox-selection="true"
:pagination="{
sortBy: 'name',
descending: false,
reqPageStart: 0,
rowsPerPage: 0,
}"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: 600, name: 'name', label: $t('name') },
{ width: 500, name: 'type', label: $t('className') },
{ width: 100, name: 'configurationFileUrl', label: $t('url') },
{ width: 600, name: 'name', label: $t('name'), sortable: false },
{ width: 500, name: 'type', label: $t('className'), sortable: false },
{ width: 100, name: 'scope', label: $t('scope'), sortable: false },
]"
:viewer="{
panel: {
@ -50,7 +45,6 @@
return result;
},
},
{ width: 100, name: 'configurationFileUrl', label: $t('url') },
],
},
}"

124
io.sc.platform.developer.frontend/src/views/springboot/Mapping.vue

@ -1,4 +1,124 @@
<template>
<div>Mapping</div>
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0" no-caps>
<q-tab name="dispatcherServlets" icon="bi-people" :label="$t('Dispatcher Servlets')" />
<q-tab name="servletFilters" icon="bi-diagram-3" :label="$t('Servlet Filters')" />
<q-tab name="servlets" icon="bi-diagram-3" :label="$t('Servlets')" />
</q-tabs>
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive>
<q-tab-panel name="dispatcherServlets" class="px-0">
<w-grid
:title="$t('menu.developer.springboot.bean')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/springboot/mappings/dispatcherServletMappingDescriptions')"
:checkbox-selection="false"
:pageable="false"
:columns="[
{
width: 100,
name: 'httpMethod',
label: $t('Http Method'),
format: (value, row) => {
return row.details?.requestMappingConditions?.methods || 'GET';
},
sortable: false,
},
{
width: 200,
name: 'patterns',
label: $t('patterns'),
format: (value, row) => {
return row.details?.requestMappingConditions?.patterns || row.predicate;
},
sortable: false,
},
{
width: 400,
name: 'className',
label: $t('className'),
format: (value, row) => {
return row.details?.handlerMethod?.className || row.handler;
},
sortable: false,
},
{
width: 150,
name: 'methodName',
label: $t('methodName'),
format: (value, row) => {
return row.details?.handlerMethod?.name;
},
sortable: false,
},
{
width: 150,
name: 'consumes',
label: $t('consumes'),
format: (value, row) => {
let result = '';
const consumes = row.details?.requestMappingConditions?.consumes;
if (consumes) {
for (const consume of consumes) {
result += consume.mediaType + '<br/>';
}
}
return result;
},
sortable: false,
},
{
width: 150,
name: 'produces',
label: $t('produces'),
format: (value, row) => {
let result = '';
const produces = row.details?.requestMappingConditions?.produces;
if (produces) {
for (const produce of produces) {
result += produce.mediaType + '<br/>';
}
}
return result;
},
sortable: false,
},
]"
></w-grid>
</q-tab-panel>
<q-tab-panel name="servletFilters" class="px-0">
<w-grid
:title="$t('menu.developer.springboot.bean')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/springboot/mappings/filterRegistrationMappingDescriptions')"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: 200, name: 'servletNameMappings', label: $t('servletNameMappings'), sortable: false },
{ width: 200, name: 'urlPatternMappings', label: $t('urlPatternMappings'), sortable: false },
{ width: 400, name: 'className', label: $t('className'), sortable: false },
{ width: 150, name: 'name', label: $t('name'), sortable: false },
]"
></w-grid>
</q-tab-panel>
<q-tab-panel name="servlets" class="px-0">
<w-grid
:title="$t('menu.developer.springboot.bean')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/springboot/mappings/servletRegistrationMappingDescriptions')"
:checkbox-selection="false"
:pageable="false"
:columns="[
{ width: 300, name: 'mappings', label: $t('mappings'), sortable: false },
{ width: 300, name: 'className', label: $t('className'), sortable: false },
{ width: 200, name: 'name', label: $t('name'), sortable: false },
]"
></w-grid>
</q-tab-panel>
</q-tab-panels>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { ref } from 'vue';
import { Environment } from 'platform-core';
const selectedTabRef = ref('dispatcherServlets');
</script>

6
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/InitializerWebController.java

@ -3,8 +3,6 @@ package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.initializer.ApplicationInitializer;
import io.sc.platform.core.util.Sorter;
import io.sc.platform.developer.wrapper.plugins.InitializerWrapper;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -19,13 +17,13 @@ import java.util.ServiceLoader;
public class InitializerWebController {
@GetMapping("")
@ResponseBody
public Page<InitializerWrapper> initializer(){
public List<InitializerWrapper> initializer(){
List<ApplicationInitializer> initializers =new ArrayList<>();
ServiceLoader<ApplicationInitializer> loader = ServiceLoader.load(ApplicationInitializer.class,Thread.currentThread().getContextClassLoader());
loader.iterator().forEachRemaining(item -> {
initializers.add(item);
});
Sorter.sort(initializers);
return QueryResult.page(InitializerWrapper.from(initializers));
return InitializerWrapper.from(initializers);
}
}

7
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginApplicationPropertiesWebController.java

@ -2,8 +2,6 @@ package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.plugins.PluginManager;
import io.sc.platform.core.plugins.item.ApplicationProperties;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -16,8 +14,7 @@ import java.util.List;
public class PluginApplicationPropertiesWebController {
@GetMapping("")
@ResponseBody
public Page<ApplicationProperties> applicationProperties(){
List<ApplicationProperties> plugins = PluginManager.getInstance().getApplicationProperties();
return QueryResult.page(plugins);
public List<ApplicationProperties> applicationProperties(){
return PluginManager.getInstance().getApplicationProperties();
}
}

7
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginComponentsWebController.java

@ -2,8 +2,6 @@ package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.plugins.PluginManager;
import io.sc.platform.core.plugins.item.Component;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -16,8 +14,7 @@ import java.util.List;
public class PluginComponentsWebController {
@GetMapping("")
@ResponseBody
public Page<Component> components(){
List<Component> plugins = PluginManager.getInstance().getComponents();
return QueryResult.page(plugins);
public List<Component> components(){
return PluginManager.getInstance().getComponents();
}
}

7
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginDirectoriesWebController.java

@ -2,8 +2,6 @@ package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.plugins.PluginManager;
import io.sc.platform.core.plugins.item.Directory;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -16,8 +14,7 @@ import java.util.List;
public class PluginDirectoriesWebController {
@GetMapping("")
@ResponseBody
public Page<Directory> directories(){
List<Directory> plugins = PluginManager.getInstance().getDirectories();
return QueryResult.page(plugins);
public List<Directory> directories(){
return PluginManager.getInstance().getDirectories();
}
}

8
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginFrontendModuleWebController.java

@ -1,10 +1,7 @@
package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.plugins.item.Message;
import io.sc.platform.mvc.plugins.PluginManager;
import io.sc.platform.mvc.plugins.item.FrontEndModule;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -17,8 +14,7 @@ import java.util.List;
public class PluginFrontendModuleWebController {
@GetMapping("")
@ResponseBody
public Page<FrontEndModule> frontendModule(){
List<FrontEndModule> plugins = PluginManager.getInstance().getFrontEndModules();
return QueryResult.page(plugins);
public List<FrontEndModule> frontendModule(){
return PluginManager.getInstance().getFrontEndModules();
}
}

8
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginFrontendRouteWebController.java

@ -1,10 +1,7 @@
package io.sc.platform.developer.controller.plugins;
import io.sc.platform.mvc.plugins.PluginManager;
import io.sc.platform.mvc.plugins.item.FrontEndModule;
import io.sc.platform.mvc.plugins.item.FrontEndRoute;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -17,8 +14,7 @@ import java.util.List;
public class PluginFrontendRouteWebController {
@GetMapping("")
@ResponseBody
public Page<FrontEndRoute> frontendRoute(){
List<FrontEndRoute> plugins = PluginManager.getInstance().getFrontEndRoutes();
return QueryResult.page(plugins);
public List<FrontEndRoute> frontendRoute(){
return PluginManager.getInstance().getFrontEndRoutes();
}
}

8
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginJsonSerializersWebController.java

@ -1,10 +1,7 @@
package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.plugins.PluginManager;
import io.sc.platform.core.plugins.item.Directory;
import io.sc.platform.core.plugins.item.JsonSerializer;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -17,8 +14,7 @@ import java.util.List;
public class PluginJsonSerializersWebController {
@GetMapping("")
@ResponseBody
public Page<JsonSerializer> jsonSerializers(){
List<JsonSerializer> plugins = PluginManager.getInstance().getJsonSerializers();
return QueryResult.page(plugins);
public List<JsonSerializer> jsonSerializers(){
return PluginManager.getInstance().getJsonSerializers();
}
}

8
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginMessagesWebController.java

@ -2,9 +2,6 @@ package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.plugins.PluginManager;
import io.sc.platform.core.plugins.item.Message;
import io.sc.platform.orm.plugins.item.Repository;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -17,8 +14,7 @@ import java.util.List;
public class PluginMessagesWebController {
@GetMapping("")
@ResponseBody
public Page<Message> messages(){
List<Message> plugins = PluginManager.getInstance().getMessages();
return QueryResult.page(plugins);
public List<Message> messages(){
return PluginManager.getInstance().getMessages();
}
}

8
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginP6spyWebController.java

@ -1,10 +1,7 @@
package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.plugins.item.JsonSerializer;
import io.sc.platform.jdbc.plugins.PluginManager;
import io.sc.platform.jdbc.plugins.item.P6spy;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -17,8 +14,7 @@ import java.util.List;
public class PluginP6spyWebController {
@GetMapping("")
@ResponseBody
public Page<P6spy> p6spy(){
List<P6spy> plugins = PluginManager.getInstance().getP6spys();
return QueryResult.page(plugins);
public List<P6spy> p6spy(){
return PluginManager.getInstance().getP6spys();
}
}

7
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginParametersWebController.java

@ -2,8 +2,6 @@ package io.sc.platform.developer.controller.plugins;
import io.sc.platform.mvc.plugins.PluginManager;
import io.sc.platform.mvc.plugins.item.Parameter;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -16,8 +14,7 @@ import java.util.List;
public class PluginParametersWebController {
@GetMapping("")
@ResponseBody
public Page<Parameter> parameters(){
List<Parameter> plugins =PluginManager.getInstance().getParameters();
return QueryResult.page(plugins);
public List<Parameter> parameters(){
return PluginManager.getInstance().getParameters();
}
}

8
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginRepositoriesWebController.java

@ -1,10 +1,7 @@
package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.plugins.item.Component;
import io.sc.platform.orm.plugins.PluginManager;
import io.sc.platform.orm.plugins.item.Repository;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -17,8 +14,7 @@ import java.util.List;
public class PluginRepositoriesWebController {
@GetMapping("")
@ResponseBody
public Page<Repository> repositories(){
List<Repository> plugins = PluginManager.getInstance().getRepositories();
return QueryResult.page(plugins);
public List<Repository> repositories(){
return PluginManager.getInstance().getRepositories();
}
}

8
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginRestartPropertiesWebController.java

@ -1,10 +1,7 @@
package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.plugins.PluginManager;
import io.sc.platform.core.plugins.item.ApplicationProperties;
import io.sc.platform.core.plugins.item.RestartProperties;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -17,8 +14,7 @@ import java.util.List;
public class PluginRestartPropertiesWebController {
@GetMapping("")
@ResponseBody
public Page<RestartProperties> restartProperties(){
List<RestartProperties> plugins = PluginManager.getInstance().getRestartProperties();
return QueryResult.page(plugins);
public List<RestartProperties> restartProperties(){
return PluginManager.getInstance().getRestartProperties();
}
}

8
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginSecurityWebController.java

@ -1,10 +1,7 @@
package io.sc.platform.developer.controller.plugins;
import io.sc.platform.mvc.plugins.item.FrontEndRoute;
import io.sc.platform.orm.service.support.QueryResult;
import io.sc.platform.security.plugins.PluginManager;
import io.sc.platform.security.plugins.item.Security;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -17,8 +14,7 @@ import java.util.List;
public class PluginSecurityWebController {
@GetMapping("")
@ResponseBody
public Page<Security> security(){
List<Security> plugins = PluginManager.getInstance().getSecurities();
return QueryResult.page(plugins);
public List<Security> security(){
return PluginManager.getInstance().getSecurities();
}
}

6
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginSwaggerWebController.java

@ -1,9 +1,7 @@
package io.sc.platform.developer.controller.plugins;
import io.sc.platform.jdbc.plugins.item.P6spy;
import io.sc.platform.mvc.plugins.PluginManager;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -16,7 +14,7 @@ import java.util.List;
public class PluginSwaggerWebController {
@GetMapping("")
@ResponseBody
public Page<P6spy> swagger(){
return QueryResult.emptyPage();
public List<P6spy> swagger(){
return QueryResult.emptyList();
}
}

6
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginSystemPropertiesWebController.java

@ -3,8 +3,6 @@ package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.plugins.Plugin;
import io.sc.platform.core.plugins.PluginManager;
import io.sc.platform.developer.wrapper.plugins.SystemPropertyWrapper;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -19,7 +17,7 @@ import java.util.Map;
public class PluginSystemPropertiesWebController {
@GetMapping("")
@ResponseBody
public Page<SystemPropertyWrapper> systemProperties(){
public List<SystemPropertyWrapper> systemProperties(){
List<Plugin<Map<String, String>>> plugins = PluginManager.getInstance().getSystemPropertyPlugins();
List<SystemPropertyWrapper> result =new ArrayList<>();
for(Plugin<Map<String, String>> plugin : plugins){
@ -30,6 +28,6 @@ public class PluginSystemPropertiesWebController {
result.add(wrapper);
}
}
return QueryResult.page(result);
return result;
}
}

8
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginWsWebController.java

@ -1,10 +1,7 @@
package io.sc.platform.developer.controller.plugins;
import io.sc.platform.jdbc.plugins.item.P6spy;
import io.sc.platform.orm.service.support.QueryResult;
import io.sc.platform.ws.plugins.PluginManager;
import io.sc.platform.ws.plugins.item.JaxWsWebservice;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -17,8 +14,7 @@ import java.util.List;
public class PluginWsWebController {
@GetMapping("")
@ResponseBody
public Page<JaxWsWebservice> ws(){
List<JaxWsWebservice> plugins = PluginManager.getInstance().getJaxWsWebservices();
return QueryResult.page(plugins);
public List<JaxWsWebservice> ws(){
return PluginManager.getInstance().getJaxWsWebservices();
}
}

11
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootBeansWebController.java

@ -2,12 +2,10 @@ package io.sc.platform.developer.controller.springboot;
import io.sc.platform.developer.wrapper.springboot.BeanWrapper;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.QueryResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.beans.BeansEndpoint;
import org.springframework.boot.actuate.beans.BeansEndpoint.BeanDescriptor;
import org.springframework.boot.actuate.beans.BeansEndpoint.ContextBeans;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Order;
import org.springframework.stereotype.Controller;
@ -15,7 +13,10 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/api/developer/springboot/beans")
@ -24,7 +25,7 @@ public class SpringbootBeansWebController {
@GetMapping("")
@ResponseBody
public Page<BeanWrapper> beans(QueryParameter queryParameter){
public List<BeanWrapper> beans(QueryParameter queryParameter){
List<BeanWrapper> result =new ArrayList<>();
Map<String, ContextBeans> contexts =beansEndpoint.beans().getContexts();
for(Map.Entry<String, ContextBeans> contextEntry : contexts.entrySet()){
@ -53,7 +54,7 @@ public class SpringbootBeansWebController {
}
}
}
return QueryResult.page(result);
return result;
}
private class BeanNameAscComparator implements Comparator<BeanWrapper> {

86
io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootRequestMappingWebController.java

@ -0,0 +1,86 @@
package io.sc.platform.developer.controller.springboot;
import io.sc.platform.developer.wrapper.springboot.BeanWrapper;
import io.sc.platform.developer.wrapper.springboot.DespatcherServletWrapper;
import io.sc.platform.orm.service.support.QueryParameter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.web.mappings.HandlerMethodDescription;
import org.springframework.boot.actuate.web.mappings.MappingsEndpoint;
import org.springframework.boot.actuate.web.mappings.MappingsEndpoint.ApplicationMappings;
import org.springframework.boot.actuate.web.mappings.MappingsEndpoint.ContextMappings;
import org.springframework.boot.actuate.web.mappings.servlet.*;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.*;
@Controller
@RequestMapping("/api/developer/springboot/mappings")
public class SpringbootRequestMappingWebController {
@Autowired MappingsEndpoint mappingsEndpoint;
@GetMapping("dispatcherServletMappingDescriptions")
@ResponseBody
public List<DispatcherServletMappingDescription> dispatcherServletMappingDescriptions(QueryParameter queryParameter){
List<DispatcherServletMappingDescription> result =new ArrayList<>();
ApplicationMappings applicationMappings =mappingsEndpoint.mappings();
Map<String, ContextMappings> contexts =applicationMappings.getContexts();
for(Map.Entry<String, ContextMappings> contextEntry : contexts.entrySet()) {
ContextMappings contextMappings = contextEntry.getValue();
Map<String, Object> mappings = contextMappings.getMappings();
for (Map.Entry<String, Object> mapping : mappings.entrySet()) {
String name = mapping.getKey();
if ("dispatcherServlets".equalsIgnoreCase(name)) {
Map<String, List<DispatcherServletMappingDescription>> dispatcherServletMappings = (Map<String, List<DispatcherServletMappingDescription>>) mapping.getValue();
for(Map.Entry<String, List<DispatcherServletMappingDescription>> dispatcherServletMapping : dispatcherServletMappings.entrySet()) {
result.addAll(dispatcherServletMapping.getValue());
}
}
}
}
return result;
}
@GetMapping("filterRegistrationMappingDescriptions")
@ResponseBody
public List<FilterRegistrationMappingDescription> filterRegistrationMappingDescriptions(QueryParameter queryParameter){
List<FilterRegistrationMappingDescription> result =new ArrayList<>();
ApplicationMappings applicationMappings =mappingsEndpoint.mappings();
Map<String, ContextMappings> contexts =applicationMappings.getContexts();
for(Map.Entry<String, ContextMappings> contextEntry : contexts.entrySet()) {
ContextMappings contextMappings = contextEntry.getValue();
Map<String, Object> mappings = contextMappings.getMappings();
for (Map.Entry<String, Object> mapping : mappings.entrySet()) {
String name = mapping.getKey();
if ("servletFilters".equalsIgnoreCase(name)) {
List<FilterRegistrationMappingDescription> filters =(List<FilterRegistrationMappingDescription>)mapping.getValue();
result.addAll(filters);
}
}
}
return result;
}
@GetMapping("servletRegistrationMappingDescriptions")
@ResponseBody
public List<ServletRegistrationMappingDescription> servletRegistrationMappingDescriptions(QueryParameter queryParameter){
List<ServletRegistrationMappingDescription> result =new ArrayList<>();
ApplicationMappings applicationMappings =mappingsEndpoint.mappings();
Map<String, ContextMappings> contexts =applicationMappings.getContexts();
for(Map.Entry<String, ContextMappings> contextEntry : contexts.entrySet()) {
ContextMappings contextMappings = contextEntry.getValue();
Map<String, Object> mappings = contextMappings.getMappings();
for (Map.Entry<String, Object> mapping : mappings.entrySet()) {
String name = mapping.getKey();
if ("servlets".equalsIgnoreCase(name)) {
List<ServletRegistrationMappingDescription> servlets =(List<ServletRegistrationMappingDescription>)mapping.getValue();
result.addAll(servlets);
}
}
}
return result;
}
}

44
io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/springboot/DespatcherServletWrapper.java

@ -0,0 +1,44 @@
package io.sc.platform.developer.wrapper.springboot;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.Set;
public class DespatcherServletWrapper {
private String className;
private String methodName;
private Set<RequestMethod> httpMethods;
private Set<String> patterns;
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getMethodName() {
return methodName;
}
public void setMethodName(String methodName) {
this.methodName = methodName;
}
public Set<RequestMethod> getHttpMethods() {
return httpMethods;
}
public void setHttpMethods(Set<RequestMethod> httpMethods) {
this.httpMethods = httpMethods;
}
public Set<String> getPatterns() {
return patterns;
}
public void setPatterns(Set<String> patterns) {
this.patterns = patterns;
}
}

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

@ -91,7 +91,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.67",
"platform-core": "8.1.75",
"quasar": "2.14.2",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
@ -100,4 +100,4 @@
"vue-router": "4.2.5",
"vue-codemirror6": "1.2.0"
}
}
}

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

@ -78,7 +78,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.67",
"platform-core": "8.1.75",
"quasar": "2.14.2",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
@ -100,4 +100,4 @@
"codemirror": "6.0.1",
"vue-codemirror6": "1.2.0"
}
}
}

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

@ -4,7 +4,7 @@
"description": "",
"private": false,
"keywords": [
],
"author": "",
"license": "ISC",
@ -99,6 +99,6 @@
"vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0",
"vue-router": "4.2.5",
"platform-core": "8.1.67"
"platform-core": "8.1.75"
}
}
}

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

@ -78,7 +78,7 @@
"luckyexcel": "1.0.1",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.70",
"platform-core": "8.1.76",
"quasar": "2.14.2",
"tailwindcss": "3.4.0",
"vue": "3.4.3",
@ -100,4 +100,4 @@
"codemirror": "6.0.1",
"vue-codemirror6": "1.2.0"
}
}
}

65
io.sc.platform.system.frontend/src/i18n/messages.json

@ -1,4 +1,8 @@
{
"parameter.system":"System",
"parameter.system.homePage":"Home Page",
"parameter.login.encodePassword":"Login Password Encode",
"menu.system" : "System Manager",
"menu.system.corporation" : "Corporation",
"menu.system.user" : "User",
@ -17,33 +21,34 @@
"menu.system.monitor.resources" : "Resources",
"menu.system.license" : "License",
"system.org.gridTitle":"Org Tree",
"system.announcement.gridTitle":"Announcement List",
"system.monitor.auditlog.gridTitle":"Audit Log List",
"system.user.grid.title":"User List",
"system.user.action.addUser":"Add User",
"system.user.action.addAllUser":"Add All User",
"system.user.action.removeUser":"Remove User",
"system.user.action.removeAllUser":"Remove All User",
"system.user.action.setPassword":"Set Password",
"system.user.action.setAllPassword":"Set All Password",
"system.user.action.resetPassword":"Reset Password",
"system.user.action.resetAllPassword":"Reset All Password",
"system.user.confirm.resetPassword":"Are you sure to reset the user's password?",
"system.user.confirm.resetAllPassword":"Are you sure to reset ALL user's password?",
"system.user.grid.toolbar.setPassword":"Set Password",
"system.user.grid.toolbar.setAllPassword":"Set All Password",
"system.user.grid.toolbar.resetPassword":"Reset Password",
"system.user.grid.toolbar.resetPassword.tip":"Are you sure to reset the user's password?",
"system.user.grid.toolbar.resetAllPassword":"Reset All Password",
"system.user.grid.toolbar.resetAllPassword.tip":"Are you sure to reset ALL user's password?",
"system.user.selectRole.grid.title":"Role List",
"system.user.selectRole.grid.toolbar.addRole":"Add Role",
"system.user.selectRole.grid.toolbar.addAllRole":"Add All Role",
"system.user.selectRole.grid.toolbar.addAllRole.tip":"Are you sure to add ALL roles to user?",
"system.user.selectRole.grid.toolbar.removeRole":"Remove Role",
"system.user.selectRole.grid.toolbar.removeRole.tip":"Are you sure to remove user's role?",
"system.user.selectRole.grid.toolbar.removeAllRole":"Remove All Role",
"system.user.selectRole.grid.toolbar.removeAllRole.tip":"Are you sure to remove user's ALL roles?",
"system.user.selectRole.dialog.title":"Available Role List",
"system.role.grid.title":"Role List",
"system.role.action.addRole":"Add Role",
"system.role.action.addAllRole":"Add All Role",
"system.role.action.addAllRole.confirm":"Are you sure to add ALL roles to {userName} ({userLoginName})?",
"system.role.action.removeRole":"Remove Role",
"system.role.action.removeRole.confirm":"Are you sure to remove {userName} ({userLoginName}) user's role {roleCode} ({roleName})?",
"system.role.action.removeRole.confirms":"Are you sure to remove {userName} ({userLoginName}) user's {counter} roles?",
"system.role.action.removeAllRole":"Remove All Role",
"system.role.action.removeAllRole.confirm":"Are you sure to remove ALL roles to {userName} ({userLoginName})?",
"system.role.selectUser.grid.title":"User List",
"system.role.selectUser.grid.toolbar.addUser":"Add User",
"system.role.selectUser.grid.toolbar.addAllUser":"Add All User",
"system.role.selectUser.grid.toolbar.addAllUser.tip":"Are you sure to add ALL users to role?",
"system.role.selectUser.grid.toolbar.removeUser":"Remove User",
"system.role.selectUser.grid.toolbar.removeUser.tip":"Are you sure to remove role's user?",
"system.role.selectUser.grid.toolbar.removeAllUser":"Remove All User",
"system.role.selectUser.grid.toolbar.removeAllUser.tip":"Are you sure to remove role's ALL users?",
"system.role.selectUser.dialog.title":"Available User List",
"system.selectRoleByUserDialog.title":"Available Role List",
"system.org.grid.title":"Org Tree",
@ -57,17 +62,5 @@
"system.monitor.log.tab.view":"Log View",
"system.monitor.log.tab.download":"Log Download",
"system.monitor.log.tab.level":"Log Level",
"rawPassword": "Raw Password",
"newPassword": "New Password",
"confirmNewPassword": "Confirm New Password",
"accountExpired": "Expired",
"accountLocked": "Locked",
"credentialsExpired": "Credentials Expired",
"parameter.system":"System",
"parameter.system.homePage":"Home Page",
"parameter.login.encodePassword":"Login Password Encode"
"system.monitor.log.tab.level":"Log Level",
}

65
io.sc.platform.system.frontend/src/i18n/messages_tw_CN.json

@ -1,4 +1,8 @@
{
"parameter.system":"系統",
"parameter.system.homePage":"首頁",
"parameter.login.encodePassword":"登錄頁面密碼加密",
"menu.system" : "系統管理",
"menu.system.corporation" : "法人管理",
"menu.system.user" : "用戶管理",
@ -17,35 +21,39 @@
"menu.system.monitor.resources" : "系統資源",
"menu.system.license" : "許可證管理",
"system.org.gridTitle":"機構樹",
"system.announcement.gridTitle":"公告列表",
"system.monitor.auditlog.gridTitle":"審計日誌列表",
"system.user.grid.title":"用戶列表",
"system.user.action.addUser":"添加用户",
"system.user.action.addAllUser":"添加所有用户",
"system.user.action.removeUser":"移除用户",
"system.user.action.removeAllUser":"移除所有用户",
"system.user.action.setPassword":"設置密碼",
"system.user.action.setAllPassword":"設置所有密碼",
"system.user.action.resetPassword":"重置密碼",
"system.user.action.resetAllPassword":"重置所有密碼",
"system.user.confirm.resetPassword":"您確認要重置用戶密碼嗎?",
"system.user.confirm.resetAllPassword":"您確認要重置所有用戶密碼嗎?",
"system.user.grid.toolbar.setPassword":"設置密碼",
"system.user.grid.toolbar.setAllPassword":"設置所有密碼",
"system.user.grid.toolbar.resetPassword":"重置密碼",
"system.user.grid.toolbar.resetPassword.tip":"您确定要重置用户密碼嗎?",
"system.user.grid.toolbar.resetAllPassword":"重置所有密碼",
"system.user.grid.toolbar.resetAllPassword.tip":"您确定要重置所有用户密碼嗎?",
"system.user.selectRole.grid.title":"角色列表",
"system.user.selectRole.grid.toolbar.addRole":"添加角色",
"system.user.selectRole.grid.toolbar.addAllRole":"添加所有角色",
"system.user.selectRole.grid.toolbar.addAllRole.tip":"您确定要给用户添加所有角色嗎?",
"system.user.selectRole.grid.toolbar.removeRole":"移除角色",
"system.user.selectRole.grid.toolbar.removeRole.tip":"您确定要移除用户的角色嗎?",
"system.user.selectRole.grid.toolbar.removeAllRole":"移除所有角色",
"system.user.selectRole.grid.toolbar.removeAllRole.tip":"您确定要將用户的所有角色移除嗎?",
"system.user.selectRole.dialog.title":"可選角色列表",
"system.role.grid.title":"角色列表",
"system.role.action.addRole":"添加角色",
"system.role.action.addAllRole":"添加所有角色",
"system.role.action.addAllRole.confirm":"您確認要給 {userName} ({userLoginName}) 用戶添加所有角色嗎?",
"system.role.action.removeRole":"移除角色",
"system.role.action.removeRole.confirm":"您確定要移除 {userName} ({userLoginName}) 用戶的角色 {roleCode} ({roleName}) 吗?",
"system.role.action.removeRole.confirms":"您確定要移除 {userName} ({userLoginName}) 用戶的 {counter} 個角色吗?",
"system.role.action.removeAllRole":"移除所有角色",
"system.role.action.removeAllRole.confirm":"您確認要將 {userName} ({userLoginName}) 用戶的所有角色移除嗎?",
"system.role.selectUser.grid.title":"用戶列表",
"system.role.selectUser.grid.toolbar.addUser":"添加用户",
"system.role.selectUser.grid.toolbar.addAllUser":"添加所有用户",
"system.role.selectUser.grid.toolbar.addAllUser.tip":"您确定要给角色添加所有用户嗎?",
"system.role.selectUser.grid.toolbar.removeUser":"移除用户",
"system.role.selectUser.grid.toolbar.removeUser.tip":"您确定要移除角色的用户嗎?",
"system.role.selectUser.grid.toolbar.removeAllUser":"移除所有用户",
"system.role.selectUser.grid.toolbar.removeAllUser.tip":"您确定要移除角色的所有用户嗎?",
"system.role.selectUser.dialog.title":"可選用戶列表",
"system.selectRoleByUserDialog.title":"可選角色列表",
"system.org.grid.title":"機構樹",
"system.org.gridTitle":"機構樹",
"system.announcement.gridTitle":"公告列表",
"system.monitor.auditlog.gridTitle":"審計日誌列表",
"system.menu.action.addTop":"新增頂級菜單",
"system.menu.action.addChild":"新增子菜單",
@ -57,14 +65,5 @@
"system.monitor.log.tab.download":"日誌下載",
"system.monitor.log.tab.level":"日誌級別",
"rawPassword": "原密碼",
"newPassword": "新密碼",
"confirmNewPassword": "確認新密碼",
"accountExpired": "過期",
"accountLocked": "鎖定",
"credentialsExpired": "密碼過期",
"parameter.system":"系統",
"parameter.system.homePage":"首頁",
"parameter.login.encodePassword":"登錄頁面密碼加密"
}

67
io.sc.platform.system.frontend/src/i18n/messages_zh_CN.json

@ -1,4 +1,8 @@
{
"parameter.system":"系统",
"parameter.system.homePage":"首页",
"parameter.login.encodePassword":"登录页面密码加密",
"menu.system" : "系统管理",
"menu.system.corporation" : "法人管理",
"menu.system.user" : "用户管理",
@ -17,33 +21,39 @@
"menu.system.monitor.resources" : "系统资源",
"menu.system.license" : "许可证管理",
"system.org.gridTitle":"机构树",
"system.announcement.gridTitle":"公告列表",
"system.monitor.auditlog.gridTitle":"审计日志列表",
"system.user.grid.title":"用户列表",
"system.user.action.addUser":"添加用户",
"system.user.action.addAllUser":"添加所有用户",
"system.user.action.removeUser":"移除用户",
"system.user.action.removeAllUser":"移除所有用户",
"system.user.action.setPassword":"设置密码",
"system.user.action.setAllPassword":"设置所有密码",
"system.user.action.resetPassword":"重置密码",
"system.user.action.resetAllPassword":"重置所有密码",
"system.user.confirm.resetPassword":"您确定要重置用户密码吗?",
"system.user.confirm.resetAllPassword":"您确定要重置所有用户密码吗?",
"system.user.grid.toolbar.setPassword":"设置密码",
"system.user.grid.toolbar.setAllPassword":"设置所有密码",
"system.user.grid.toolbar.resetPassword":"重置密码",
"system.user.grid.toolbar.resetPassword.tip":"您确定要重置用户密码吗?",
"system.user.grid.toolbar.resetAllPassword":"重置所有密码",
"system.user.grid.toolbar.resetAllPassword.tip":"您确定要重置所有用户密码吗?",
"system.user.selectRole.grid.title":"角色列表",
"system.user.selectRole.grid.toolbar.addRole":"添加角色",
"system.user.selectRole.grid.toolbar.addAllRole":"添加所有角色",
"system.user.selectRole.grid.toolbar.addAllRole.tip":"您确定要给用户添加所有角色吗?",
"system.user.selectRole.grid.toolbar.removeRole":"移除角色",
"system.user.selectRole.grid.toolbar.removeRole.tip":"您确定要移除用户的角色吗?",
"system.user.selectRole.grid.toolbar.removeAllRole":"移除所有角色",
"system.user.selectRole.grid.toolbar.removeAllRole.tip":"您确定要将用户的所有角色移除吗?",
"system.user.selectRole.dialog.title":"可选角色列表",
"system.role.grid.title":"角色列表",
"system.role.action.addRole":"添加角色",
"system.role.action.addAllRole":"添加所有角色",
"system.role.action.addAllRole.confirm":"您确定要给 {userName} ({userLoginName}) 用户添加所有角色吗?",
"system.role.action.removeRole":"移除角色",
"system.role.action.removeRole.confirm":"您确定要移除 {userName} ({userLoginName}) 用户的角色 {roleCode} ({roleName}) 吗?",
"system.role.action.removeRole.confirms":"您确定要移除 {userName} ({userLoginName}) 用户的 {counter} 个角色吗?",
"system.role.action.removeAllRole":"移除所有角色",
"system.role.action.removeAllRole.confirm":"您确定要将 {userName} ({userLoginName}) 用户的所有角色移除吗?",
"system.role.selectUser.grid.title":"用户列表",
"system.role.selectUser.grid.toolbar.addUser":"添加用户",
"system.role.selectUser.grid.toolbar.addAllUser":"添加所有用户",
"system.role.selectUser.grid.toolbar.addAllUser.tip":"您确定要给角色添加所有用户吗?",
"system.role.selectUser.grid.toolbar.removeUser":"移除用户",
"system.role.selectUser.grid.toolbar.removeUser.tip":"您确定要移除角色的用户吗?",
"system.role.selectUser.grid.toolbar.removeAllUser":"移除所有用户",
"system.role.selectUser.grid.toolbar.removeAllUser.tip":"您确定要移除角色的所有用户吗?",
"system.role.selectUser.dialog.title":"可选用户列表",
"system.selectRoleByUserDialog.title":"可选角色列表",
"system.org.gridTitle":"机构树",
"system.announcement.gridTitle":"公告列表",
"system.monitor.auditlog.gridTitle":"审计日志列表",
"system.org.grid.title":"机构树",
@ -59,14 +69,5 @@
"system.monitor.log.tab.level":"日志级别",
"rawPassword": "原密码",
"newPassword": "新密码",
"confirmNewPassword": "确认新密码",
"accountExpired": "过期",
"accountLocked": "锁定",
"credentialsExpired": "密码过期",
"parameter.system":"系统",
"parameter.system.homePage":"首页",
"parameter.login.encodePassword":"登录页面密码加密"
}

522
io.sc.platform.system.frontend/src/views/role/Role.vue

@ -1,311 +1,277 @@
<template>
<q-splitter :model-value="70" class="w-full h-full">
<q-splitter :model-value="60" class="w-full h-full">
<template #before>
<platform-grid
ref="roleGridRef"
:table-props="{ borderded: false, flat: true }"
:query-form-cols-number="roleConfigure.queryFormColsNumber"
:query-form-cols-auto="roleConfigure.queryFormColsAuto"
:table-title="roleConfigure.tableTitle"
:table-row-key="roleConfigure.tableRowKey"
:table-init-load-data="roleConfigure.tableInitLoadData"
:table-data-url="roleConfigure.tableDataUrl"
:table-show-sort-no="false"
:table-columns="roleConfigure.tableColumns"
:table-left-column-sticky-number="roleConfigure.tableLeftColumnStickyNumber"
:table-buttons="roleConfigure.tableButtons"
:query-form-fields="roleConfigure.queryFormFields"
:table-pagination="roleConfigure.tablePagination"
:add-form-props="roleConfigure.addFormProps"
:table-dense="false"
@row-click="roleConfigure.rowClickFun"
>
</platform-grid>
<div class="px-1">
<w-grid
ref="roleGridRef"
:title="$t('system.role.grid.title')"
:data-url="Environment.apiContextPath('/api/system/role')"
selection="multiple"
:query-form-fields="[
{ name: 'code', label: $t('code'), type: 'text' },
{ name: 'name', label: $t('name'), type: 'text' },
{ name: 'enable', label: $t('isEnable'), type: 'select', options: Options.yesNo() },
{ name: 'dataComeFrom', label: $t('dataComeFrom'), type: 'select', options: Options.enum(DataComeFromEnum) },
]"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh', 'separator', 'add', 'clone', 'edit', 'remove', 'separator', 'view', 'export']"
:columns="[
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ width: 80, name: 'status', label: $t('status'), format: Formater.enableTag() },
{ width: 100, name: 'dataComeFrom', label: $t('dataComeFrom'), format: Formater.enum(DataComeFromEnum) },
{ width: 120, name: 'lastModifier', label: $t('lastModifier') },
{ width: 120, name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.dateOnly() },
]"
:editor="{
dialog: {
width: '600px',
height: '300px',
},
form: {
colsNum: 1,
fields: [
{ name: 'code', label: $t('code'), type: 'text', required: true },
{ name: 'name', label: $t('name'), type: 'text', required: true },
{ name: 'description', label: $t('description'), type: 'textarea', rows: 1 },
{ name: 'enable', label: $t('enable'), type: 'checkbox', defaultValue: true },
],
},
}"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'enable', label: $t('enable'), format: Formater.yesNo() },
{ name: 'dataComeFrom', label: $t('dataComeFrom'), format: Formater.enum(DataComeFromEnum) },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate') },
{ name: 'corporationCode', label: $t('corporationCode') },
],
},
}"
@row-click="
(evt, row, index) => {
currentSelectedRoleId = row.id;
userGridRef?.refresh();
menuTreeGridRef?.refresh();
}
"
>
</w-grid>
</div>
</template>
<template #after>
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0">
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0" no-caps>
<q-tab name="menu" icon="bi-people" :label="$t('menu')" />
<q-tab name="user" icon="bi-diagram-3" :label="$t('user')" />
<q-tab name="authorization" icon="bi-diagram-3" label="权限" />
</q-tabs>
<q-tab-panels v-model="selectedTabRef" animated swipeable keep-alive>
<q-tab-panel name="menu">
<w-tree-grid
<q-tab-panel name="menu" class="px-0">
<w-grid
ref="menuTreeGridRef"
title="菜单树"
label-key="titleI18nKey"
label-i18n
label-empty="--------------------"
tick-strategy="leaf"
:actions="menuConfigure.actions"
/>
:tree="true"
:title="$t('system.org.grid.title')"
:data-url="Environment.apiContextPath('/api/system/menu/listAllMenusWithSelectedStatusByRole?roleId=') + currentSelectedRoleId"
selection="multiple"
:pageable="false"
:full-screen-button="false"
:toolbar-configure="{ noIcon: true }"
:toolbar-actions="[
'refresh',
'separator',
{
name: 'save',
label: $t('save'),
click: () => {
axios
.post(Environment.apiContextPath('/api/system/role/updateMenus'), {
one: userGridRef.getSelectedRows()[0].id,
many: menuTreeGridRef.getTicked(),
})
.then((response) => {});
},
},
'view',
]"
:columns="[
{
width: 100,
name: 'titleI18nKey',
label: $t('name'),
format: (value, row) => {
return $t(value);
},
},
{ width: 60, name: 'enable', label: $t('status'), format: Formater.enableTag() },
]"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ name: 'id', label: $t('id') },
{ name: 'code', label: $t('code') },
{ name: 'name', label: $t('name') },
{ name: 'description', label: $t('description') },
{ name: 'enable', label: $t('enable'), format: Formater.yesNo() },
{ name: 'dataComeFrom', label: $t('dataComeFrom'), format: Formater.enum(DataComeFromEnum) },
{ name: 'creator', label: $t('creator') },
{ name: 'createDate', label: $t('createDate') },
{ name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate') },
{ name: 'corporationCode', label: $t('corporationCode') },
],
},
}"
></w-grid>
</q-tab-panel>
<q-tab-panel name="user">
<platform-grid
<q-tab-panel name="user" class="px-0">
<w-grid
ref="userGridRef"
:table-props="{ borderded: false, flat: true }"
:query-form-cols-number="userConfigure.queryFormColsNumber"
:hide-bottom="userConfigure.hideBottom"
:query-form-cols-auto="userConfigure.queryFormColsAuto"
:table-title="userConfigure.tableTitle"
:table-row-key="userConfigure.tableRowKey"
:table-init-load-data="userConfigure.tableInitLoadData"
:table-data-url="userConfigure.tableDataUrl"
:table-show-sort-no="false"
:table-columns="userConfigure.tableColumns"
:table-left-column-sticky-number="userConfigure.tableLeftColumnStickyNumber"
:table-buttons="userConfigure.tableButtons"
:query-form-fields="userConfigure.queryFormFields"
:table-pagination="userConfigure.tablePagination"
table-selection="multiple"
:table-dense="false"
:title="$t('system.role.selectUser.grid.title')"
:fetch-data-url="Environment.apiContextPath('/api/system/user/queryUsersByRole?roleId=') + currentSelectedRoleId"
:auto-fetch-data="false"
selection="multiple"
:full-screen-button="false"
:toolbar-configure="{ noIcon: true }"
:toolbar-actions="[
'refresh',
'separator',
{
name: 'addUser',
label: $t('system.role.selectUser.grid.toolbar.addUser'),
enableIf: () => {
if (roleGridRef) {
return roleGridRef.getSelectedRows().length > 0;
}
return false;
},
click: () => {
selectUserDialog.open({ roleId: roleGridRef.getSelectedRows()[0].id, userGrid: userGridRef });
},
},
{
name: 'addAllUser',
label: $t('system.role.selectUser.grid.toolbar.addAllUser'),
enableIf: () => {
if (roleGridRef) {
return roleGridRef.getSelectedRows().length > 0;
}
return false;
},
click: () => {
const selectedRole = roleGridRef.getSelectedRows()[0];
DialogManager.confirm($t('system.role.selectUser.grid.toolbar.addAllUser.tip'), () => {
axios
.post(Environment.apiContextPath('/api/system/role/addAllUsers'), {
one: selectedRole.id,
many: [],
})
.then((response) => {
userGridRef?.refresh();
});
});
},
},
'separator',
{
name: 'removeUser',
label: $t('system.role.selectUser.grid.toolbar.removeUser'),
enableIf: () => {
if (roleGridRef && userGridRef) {
return roleGridRef.getSelectedRows().length > 0 && userGridRef.getSelectedRows().length > 0;
}
return false;
},
click: (selecteds) => {
const selectedRole = roleGridRef.getSelectedRows()[0];
const userIds = Tools.extractProperties(selecteds, 'id');
DialogManager.confirm($t('system.role.selectUser.grid.toolbar.removeUser.tip'), () => {
axios
.post(Environment.apiContextPath('/api/system/role/removeUsers'), {
one: selectedRole.id,
many: userIds,
})
.then((response) => {
userGridRef?.refresh();
});
});
},
},
{
name: 'removeAllUser',
label: $t('system.role.selectUser.grid.toolbar.removeAllUser'),
enableIf: () => {
if (roleGridRef) {
return roleGridRef.getSelectedRows().length > 0;
}
return false;
},
click: () => {
const selectedRole = roleGridRef.getSelectedRows()[0];
DialogManager.confirm($t('system.role.selectUser.grid.toolbar.removeAllUser.tip'), () => {
axios
.post(Environment.apiContextPath('/api/system/role/removeAllUsers'), {
one: selectedRole.id,
many: [],
})
.then((response) => {
userGridRef?.refresh();
});
});
},
},
'separator',
'view',
]"
:columns="[
{ width: 100, name: 'loginName', label: t('loginName') },
{ width: 100, name: 'userName', label: t('userName') },
{
name: 'status',
label: $t('status'),
format: (value, row) => {
return {
componentType: UserStatusTag,
attrs: row,
};
},
},
]"
>
</platform-grid>
</q-tab-panel>
<q-tab-panel name="authorization">
<q-splitter v-model="splitterModel">
<template #before>
<q-tabs v-model="authorizationModel" vertical>
<q-tab name="统计报表-减值结果" label="统计报表-减值结果" />
<q-tab name="统计报表-阶段迁徙分析" label="统计报表-阶段迁徙分析" />
<q-tab name="统计报表-三分类汇总" label="统计报表-三分类汇总" />
<q-tab name="统计报表-阶段汇总" label="统计报表-阶段汇总" />
<q-tab name="用户管理" label="用户管理" />
<q-tab name="公告管理" label="公告管理" />
<q-tab name="消息管理" label="消息管理" />
<q-tab name="参数管理" label="参数管理" />
<q-tab name="数据字典" label="数据字典" />
<q-tab name="国际化多语言" label="国际化多语言" />
<q-tab name="流程管理" label="流程管理" />
</q-tabs>
</template>
<template #after>
<q-tab-panels v-model="authorizationModel" animated swipeable vertical transition-prev="jump-up" transition-next="jump-up">
<q-tab-panel name="统计报表-减值结果">
<q-checkbox v-model="authorizationReactive.query" label="查询" />
<q-checkbox v-model="authorizationReactive.query" label="报表导出" />
</q-tab-panel>
<q-tab-panel name="用户管理">
<q-checkbox v-model="authorizationReactive.query" label="查询" />
<q-checkbox v-model="authorizationReactive.query" label="新增" />
<q-checkbox v-model="authorizationReactive.query" label="复制" />
<q-checkbox v-model="authorizationReactive.query" label="修改" />
<q-checkbox v-model="authorizationReactive.query" label="删除" />
<q-checkbox v-model="authorizationReactive.query" label="查看" />
<q-checkbox v-model="authorizationReactive.query" label="数据导入" />
<q-checkbox v-model="authorizationReactive.query" label="流程审批" />
</q-tab-panel>
</q-tab-panels>
<div class="row justify-end items-start content-start">
<q-btn label="保存" outline></q-btn>
</div>
</template>
</q-splitter>
</w-grid>
</q-tab-panel>
</q-tab-panels>
</template>
<SelectUserDialog ref="selectUserDialog" title="可选用户列表" :maximized="false" width="50%" height="500px"></SelectUserDialog>
<SelectUserDialog ref="selectUserDialog"></SelectUserDialog>
</q-splitter>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue';
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Environment, axios } from 'platform-core';
import { Environment, axios, DialogManager, Tools, EnumTools, Options, Formater } from 'platform-core';
import SelectUserDialog from './SelectUserDialog.vue';
import UserStatusTag from '../user/UserStatusTag.vue';
const { t } = useI18n();
const DataComeFromEnum = await EnumTools.fetch('io.sc.platform.orm.api.enums.DataComeFrom');
const roleGridRef = ref();
const userGridRef = ref();
const menuTreeGridRef = ref();
const selectUserDialog = ref();
const selectedTabRef = ref('menu');
const authorizationReactive = reactive({
query: true,
add: true,
});
const splitterModel = ref(40);
const authorizationModel = ref('统计报表-减值结果');
const roleConfigure = {
queryFormColsNumber: 4,
queryFormColsAuto: false,
queryFormFields: [
{ label: t('code'), modelName: 'code', type: 'text' },
{ label: t('name'), modelName: 'name', type: 'text' },
{
label: t('enable'),
modelName: 'enable',
type: 'select',
options: [
{ value: true, label: '是' },
{ value: false, label: '否' },
],
},
{
label: t('dataComeFrom'),
modelName: 'dataComeFrom',
type: 'select',
options: [
{ value: 'MANUAL', label: t('io.sc.platform.orm.api.enums.DataComeFrom.MANUAL') },
{ value: 'AUTO', label: t('io.sc.platform.orm.api.enums.DataComeFrom.AUTO') },
],
},
],
hideBottom: false,
tableInitLoadData: true,
tableLeftColumnStickyNumber: 0,
tableTitle: t('system.role.gridTitle'),
tableRowKey: 'id',
tableDataUrl: Environment.apiContextPath('/api/system/role'),
tablePagination: {
sortBy: 'lastModifyDate',
descending: true,
reqPageStart: 0,
rowsPerPage: 10,
},
tableButtons: ['query', 'reset', 'separator', 'refresh', 'add', 'edit', 'delete', 'separator', 'view', 'separator', 'inFullscreen'],
tableColumns: [
{ width: 100, name: 'code', label: t('code') },
{ width: 100, name: 'name', label: t('name') },
{ width: 100, name: 'enable', label: t('isEnable'), format: (value) => (value ? t('yes') : t('no')) },
{ width: 100, name: 'dataComeFrom', label: t('dataComeFrom') },
{ width: 110, name: 'lastModifier', label: t('lastModifier') },
{ width: 115, name: 'lastModifyDate', label: t('lastModifyDate') },
],
addFormProps: {
dialogInitWidth: '50%',
dialogInitHeight: '90%',
formColsNumber: 1,
formColsAuto: false,
formFields: [
{ modelName: 'code', label: t('code'), type: 'text', required: true },
{ modelName: 'name', label: t('name'), type: 'text', required: true },
{ modelName: 'description', label: t('description'), type: 'textarea' },
],
},
rowClickFun: (evt, row, index) => {
// push
roleGridRef.value.getSelectedRows().splice(0, roleGridRef.value.getSelectedRows().length);
roleGridRef.value.getSelectedRows().push(row);
if (menuTreeGridRef.value) {
axios.get(Environment.apiContextPath('/api/system/menu/listAllMenusWithSelectedStatusByRole?roleId=') + row.id).then((response) => {
menuTreeGridRef.value.setNodes(response.data);
});
}
if (userGridRef.value) {
axios.get(Environment.apiContextPath('/api/system/user/queryUsersByRole?roleId=') + row.id).then((response) => {
userGridRef.value.replaceRowsFun(response.data.content);
});
}
},
};
const userConfigure = {
queryFormColsNumber: 4,
queryFormColsAuto: false,
queryFormFields: [],
hideBottom: true,
tableInitLoadData: false,
tableLeftColumnStickyNumber: 0,
tableTitle: t('system.user.gridTitle'),
tableRowKey: 'id',
tableDataUrl: '',
tablePagination: {
sortBy: 'lastModifyDate',
descending: true,
reqPageStart: 0,
rowsPerPage: 0,
},
tableButtons: [
'refresh',
'inFullscreen',
{
name: 'addUser',
label: t('system.user.action.addUser'),
icon: '',
enable: () => {
if (roleGridRef.value) {
return roleGridRef.value.getSelectedRows().length > 0;
}
return false;
},
click: () => {
selectUserDialog.value.show({ userGrid: userGridRef, roleGrid: roleGridRef });
},
},
{
name: 'addAllUser',
label: t('system.user.action.addAllUser'),
icon: '',
enable: () => {},
click: () => {
axios
.post(Environment.apiContextPath('/api/system/role/addAllUsers'), {
one: roleGridRef.value.getSelectedRows()[0].id,
many: [],
})
.then((response) => {
axios.get(Environment.apiContextPath('/api/system/user/queryUsersByRole?roleId=') + roleGridRef.value.getSelectedRows()[0].id).then((response) => {
userGridRef.value.replaceRowsFun(response.data.content);
});
});
},
},
{
name: 'removeUser',
label: t('system.user.action.removeUser'),
icon: '',
enable: () => {},
click: () => {
const userIds = [];
for (const user of userGridRef.value.getSelectedRows()) {
userIds.push(user.id);
}
axios
.post(Environment.apiContextPath('/api/system/role/removeUsers'), {
one: roleGridRef.value.getSelectedRows()[0].id,
many: userIds,
})
.then((response) => {
axios.get(Environment.apiContextPath('/api/system/user/queryUsersByRole?roleId=') + roleGridRef.value.getSelectedRows()[0].id).then((response) => {
userGridRef.value.replaceRowsFun(response.data.content);
});
});
},
},
{
name: 'removeAllUser',
label: t('system.user.action.removeAllUser'),
icon: '',
enable: () => {},
click: () => {
axios
.post(Environment.apiContextPath('/api/system/role/removeAllUsers'), {
one: roleGridRef.value.getSelectedRows()[0].id,
many: [],
})
.then((response) => {
axios.get(Environment.apiContextPath('/api/system/user/queryUsersByRole?roleId=') + roleGridRef.value.getSelectedRows()[0].id).then((response) => {
userGridRef.value.replaceRowsFun(response.data.content);
});
});
},
},
],
tableColumns: [
{ width: 100, name: 'loginName', label: t('loginName') },
{ width: 100, name: 'userName', label: t('userName') },
{ width: 80, name: 'enable', label: t('isEnable'), format: (value) => (value ? t('yes') : t('no')) },
],
};
const selectedTabRef = ref('user');
const currentSelectedRoleId = ref('');
const menuConfigure = {
actions: [

208
io.sc.platform.system.frontend/src/views/role/SelectUserDialog.vue

@ -1,152 +1,100 @@
<template>
<div>
<q-dialog ref="dialogRef" allow-focus-outside v-bind="attrs">
<q-card
:style="{
width: attrs.maximized ? '100vw' : width,
'max-width': '100vw',
height: attrs.maximized ? '100vh' : height,
'max-height': '100vh',
}"
>
<q-card-section :style="headerStyle">
<div class="flex justify-between">
<div class="text-h6">{{ title }}</div>
<div class="flex justify-end q-gutter-md">
<q-btn :label="$t('confirm')" dense color="primary" style="width: 100px" @click="addUsers" />
<q-btn v-close-popup dense flat icon="close" :title="$t('close')"> </q-btn>
</div>
</div>
</q-card-section>
<q-card-section class="q-pt-none" :style="bodyStyle">
<platform-grid
ref="gridRef"
:table-props="{ borderded: false, flat: true }"
:query-form-cols-number="userConfigure.queryFormColsNumber"
:hide-bottom="userConfigure.hideBottom"
:query-form-cols-auto="userConfigure.queryFormColsAuto"
:table-title="userConfigure.tableTitle"
:table-row-key="userConfigure.tableRowKey"
:table-init-load-data="userConfigure.tableInitLoadData"
:table-data-url="userConfigure.tableDataUrl"
:table-show-sort-no="false"
:table-columns="userConfigure.tableColumns"
:table-left-column-sticky-number="userConfigure.tableLeftColumnStickyNumber"
:table-buttons="userConfigure.tableButtons"
:query-form-fields="userConfigure.queryFormFields"
:table-pagination="userConfigure.tablePagination"
table-selection="multiple"
:table-dense="false"
>
</platform-grid>
</q-card-section>
</q-card>
</q-dialog>
</div>
<w-dialog
ref="dialogRef"
:title="$t('system.role.selectUser.dialog.title')"
width="800px"
height="500px"
:can-maximize="false"
:buttons="[
{
label: $t('confirm'),
click: () => {
const userIds = Tools.extractProperties(gridRef.getSelectedRows(), 'id');
axios
.post(Environment.apiContextPath('/api/system/role/addUsers'), {
one: roleId,
many: userIds,
})
.then((response) => {
userGridRef?.refresh();
close();
});
},
},
]"
>
<div class="px-2">
<w-grid
ref="gridRef"
:title="$t('system.user.grid.title')"
selection="multiple"
:full-screen-button="false"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh']"
:query-form-fields="[
{ name: 'loginName', label: $t('loginName'), type: 'text' },
{ name: 'userName', label: $t('userName'), type: 'text' },
{
name: 'enable',
label: $t('enable'),
type: 'select',
options: Options.yesNo(),
queryOperator: 'equals',
},
{
name: 'dataComeFrom',
label: $t('dataComeFrom'),
type: 'select',
options: Options.enum(DataComeFromEnum),
queryOperator: 'equals',
},
]"
:auto-fetch-data="false"
:fetch-data-url="Environment.apiContextPath('/api/system/user/queryOtherUsersByRole?roleId=' + roleId)"
:columns="[
{ name: 'loginName', label: $t('loginName') },
{ name: 'userName', label: $t('userName') },
{
name: 'status',
label: t('status'),
format: Formater.enableTag(),
},
{ name: 'lastModifier', label: t('lastModifier') },
{ name: 'lastModifyDate', label: t('lastModifyDate'), format: Formater.dateOnly() },
]"
></w-grid>
</div>
</w-dialog>
</template>
<script setup lang="ts">
import { useAttrs, ref, onMounted, nextTick } from 'vue';
import { ref, nextTick } from 'vue';
import { useI18n } from 'vue-i18n';
import { axios, Environment } from 'platform-core';
const attrs = useAttrs();
const props = defineProps({
headerStyle: { type: String, default: 'width:100%;padding: 16px 8px 4px 16px' },
bodyStyle: { type: String, default: 'padding: 0px 8px 0px 8px;height:calc(100%)' },
title: { type: String, default: '' },
width: { type: String, default: '70%' },
height: { type: String, default: '70%' },
});
import { axios, Environment, Tools, EnumTools, Options, Formater } from 'platform-core';
const { t } = useI18n();
const dialogRef = ref();
const gridRef = ref();
let userGridRef, roleGridRef;
const userConfigure = {
queryFormColsNumber: 4,
queryFormColsAuto: false,
hideBottom: true,
tableInitLoadData: false,
tableLeftColumnStickyNumber: 0,
tableTitle: '',
tableRowKey: 'id',
tableDataUrl: '',
tablePagination: {
sortBy: 'lastModifyDate',
descending: true,
reqPageStart: 0,
rowsPerPage: 0,
},
tableButtons: ['query', 'refresh'],
queryFormFields: [
{ label: t('loginName'), modelName: 'loginName', type: 'text' },
{ label: t('userName'), modelName: 'userName', type: 'text' },
{
label: t('enable'),
modelName: 'enable',
type: 'select',
options: [
{ value: true, label: '是' },
{ value: false, label: '否' },
],
},
{
label: t('dataComeFrom'),
modelName: 'dataComeFrom',
type: 'select',
options: [
{ value: 'MANUAL', label: t('io.sc.platform.orm.api.enums.DataComeFrom.MANUAL') },
{ value: 'AUTO', label: t('io.sc.platform.orm.api.enums.DataComeFrom.AUTO') },
],
},
],
tableColumns: [
{ width: 100, name: 'loginName', label: t('loginName') },
{ width: 100, name: 'userName', label: t('userName') },
{ width: 80, name: 'enable', label: t('isEnable'), format: (value) => (value ? t('yes') : t('no')) },
],
};
const addUsers = () => {
const userIds = [];
for (const user of gridRef.value.getSelectedRows()) {
userIds.push(user.id);
}
axios
.post(Environment.apiContextPath('/api/system/role/addUsers'), {
one: roleGridRef.value.getSelectedRows()[0].id,
many: userIds,
})
.then((response) => {
axios.get(Environment.apiContextPath('/api/system/user/queryUsersByRole?roleId=') + roleGridRef.value.getSelectedRows()[0].id).then((response) => {
userGridRef.value.replaceRowsFun(response.data.content);
});
dialogRef.value.hide();
});
};
let roleId, userGridRef;
const show = (param: object) => {
const open = (param: object) => {
roleId = param.roleId;
userGridRef = param.userGrid;
roleGridRef = param.roleGrid;
const currentRoleId = roleGridRef.value.getSelectedRows()[0].id;
dialogRef.value.show();
nextTick(() => {
axios.get(Environment.apiContextPath('/api/system/user/queryOtherUsersByRole?roleId=') + currentRoleId).then((response) => {
gridRef.value.replaceRowsFun(response.data.content);
});
gridRef.value.refresh();
});
};
const hide = () => {
const close = () => {
dialogRef.value.hide();
};
defineExpose({
show,
hide,
open,
close,
});
const DataComeFromEnum = await EnumTools.fetch('io.sc.platform.orm.api.enums.DataComeFrom');
</script>

15
io.sc.platform.system.frontend/src/views/user/SelectRoleDialog.vue

@ -16,9 +16,7 @@
many: roleIds,
})
.then((response) => {
axios.get(Environment.apiContextPath('/api/system/role/queryRolesByUser?userId=') + userId).then((response) => {
roleGridRef.replaceRows(response.data.content);
});
roleGridRef?.refresh();
close();
});
},
@ -59,12 +57,7 @@
{
name: 'status',
label: t('status'),
format: (value, row) => {
return {
componentType: RoleStatusTag,
attrs: row,
};
},
format: Formater.enableTag(),
},
{ name: 'lastModifier', label: t('lastModifier') },
{ name: 'lastModifyDate', label: t('lastModifyDate') },
@ -77,7 +70,6 @@
import { ref, nextTick } from 'vue';
import { useI18n } from 'vue-i18n';
import { axios, Environment, Tools, EnumTools, Options, Formater } from 'platform-core';
import RoleStatusTag from './RoleStatusTag.vue';
const { t } = useI18n();
@ -89,11 +81,10 @@ EnumTools.fetch('io.sc.platform.orm.api.enums.DataComeFrom').then((data) => {
DataComeFromEnum.value = data;
});
let userId, userGridRef, roleGridRef;
let userId, roleGridRef;
const open = (param: object) => {
userId = param.userId;
userGridRef = param.userGrid;
roleGridRef = param.roleGrid;
dialogRef.value.show();

3
io.sc.platform.system.frontend/src/views/user/SetPasswordDialog.vue

@ -7,7 +7,8 @@
:can-maximize="false"
:buttons="[
{
label: $t('submit'),
label: $t('confirm'),
noCaps: true,
click: () => {
axios
.post(Environment.apiContextPath('/api/system/user/' + actionType), {

159
io.sc.platform.system.frontend/src/views/user/User.vue

@ -6,11 +6,12 @@
ref="userGridRef"
:title="$t('system.user.grid.title')"
selection="multiple"
:data-url="Environment.apiContextPath('/api/system/user')"
:query-form-fields="[
{ name: 'loginName', label: $t('loginName'), type: 'text' },
{ name: 'userName', label: $t('userName'), type: 'text' },
{ name: 'enable', label: $t('isEnable'), type: 'select', options: Options.yesNo() },
{ name: 'dataComeFrom', label: $t('dataComeFrom'), type: 'select', options: Options.enum(DataComeFromEnum) },
{ name: 'enable', label: $t('isEnable'), type: 'select', options: Options.yesNo(), queryOperator: 'equals' },
{ name: 'dataComeFrom', label: $t('dataComeFrom'), type: 'select', options: Options.enum(DataComeFromEnum), queryOperator: 'equals' },
]"
:toolbar-configure="{ noIcon: false }"
:toolbar-actions="[
@ -24,7 +25,7 @@
'separator',
{
name: 'setPassword',
label: $t('system.user.action.setPassword'),
label: $t('system.user.grid.toolbar.setPassword'),
icon: 'bi-shield-check',
enableIf: function (selecteds) {
return selecteds.length > 0;
@ -35,7 +36,7 @@
},
{
name: 'setAllPassword',
label: $t('system.user.action.setAllPassword'),
label: $t('system.user.grid.toolbar.setAllPassword'),
icon: 'bi-shield',
enableIf: function (selecteds) {
return true;
@ -47,29 +48,29 @@
'separator',
{
name: 'resetPassword',
label: $t('system.user.action.resetPassword'),
label: $t('system.user.grid.toolbar.resetPassword'),
icon: 'bi-shield-fill-check',
enableIf: function (selecteds) {
return selecteds.length > 0;
},
click: function (selecteds) {
DialogManager.confirm(t('system.user.confirm.resetPassword'), () => {
DialogManager.confirm($t('system.user.grid.toolbar.resetPassword.tip'), () => {
const userIds = Tools.extractProperties(selecteds, 'id');
axios.post(Environment.apiContextPath('/api/system/user/resetPassword'), userIds).then(() => {
NotifyManager.info(t('operationSuccess'));
NotifyManager.info($t('operationSuccess'));
});
});
},
},
{
name: 'resetAllPassword',
label: $t('system.user.action.resetAllPassword'),
label: $t('system.user.grid.toolbar.resetAllPassword'),
icon: 'bi-shield-fill',
enableIf: function (selecteds) {
return true;
},
click: function () {
DialogManager.confirm($t('system.user.confirm.resetAllPassword'), () => {
DialogManager.confirm($t('system.user.grid.toolbar.resetAllPassword.tip'), () => {
axios.post(Environment.apiContextPath('/api/system/user/resetAllPassword')).then(() => {
setPasswordDialogRef.value.hide();
NotifyManager.info($t('operationSuccess'));
@ -81,8 +82,6 @@
'view',
'export',
]"
:data-url="Environment.apiContextPath('/api/system/user')"
row-key="id"
:columns="[
{ name: 'loginName', label: $t('loginName') },
{ name: 'userName', label: $t('userName') },
@ -166,7 +165,6 @@
}"
@row-click="
(evt, row, index) => {
console.log(row.id);
currentSelectedUserId = row.id;
roleGridRef?.refresh();
orgTreeGridRef?.refresh();
@ -177,7 +175,7 @@
</template>
<template #after>
<div class="px-1">
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0">
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0" no-caps>
<q-tab name="role" icon="bi-people" :label="$t('role')" />
<q-tab name="org" icon="bi-diagram-3" :label="$t('org')" />
</q-tabs>
@ -186,8 +184,8 @@
<q-tab-panel name="role" class="px-0">
<w-grid
ref="roleGridRef"
:title="$t('system.role.grid.title')"
:data-url="Environment.apiContextPath('/api/system/role/queryRolesByUser') + currentSelectedUserId"
:title="$t('system.user.selectRole.grid.title')"
:fetch-data-url="Environment.apiContextPath('/api/system/role/queryRolesByUser?userId=') + currentSelectedUserId"
:auto-fetch-data="false"
selection="multiple"
:full-screen-button="false"
@ -197,7 +195,7 @@
'separator',
{
name: 'addRole',
label: $t('system.role.action.addRole'),
label: $t('system.user.selectRole.grid.toolbar.addRole'),
enableIf: () => {
if (userGridRef) {
return userGridRef.getSelectedRows().length > 0;
@ -205,12 +203,12 @@
return false;
},
click: () => {
selectRoleDialog.open({ userId: userGridRef.getSelectedRows()[0].id, userGrid: userGridRef, roleGrid: roleGridRef });
selectRoleDialog.open({ userId: userGridRef.getSelectedRows()[0].id, roleGrid: roleGridRef });
},
},
{
name: 'addAllRole',
label: $t('system.role.action.addAllRole'),
label: $t('system.user.selectRole.grid.toolbar.addAllRole'),
enableIf: () => {
if (userGridRef) {
return userGridRef.getSelectedRows().length > 0;
@ -219,27 +217,22 @@
},
click: () => {
const selectedUser = userGridRef.getSelectedRows()[0];
DialogManager.confirm(
$t('system.role.action.addAllRole.confirm', { userLoginName: selectedUser.loginName, userName: selectedUser.userName }),
() => {
axios
.post(Environment.apiContextPath('/api/system/user/addAllRoles'), {
one: selectedUser.id,
many: [],
})
.then((response) => {
axios.get(Environment.apiContextPath('/api/system/role/queryRolesByUser?userId=') + selectedUser.id).then((response) => {
roleGridRef.replaceRows(response.data.content);
});
});
},
);
DialogManager.confirm($t('system.user.selectRole.grid.toolbar.addAllRole.tip'), () => {
axios
.post(Environment.apiContextPath('/api/system/user/addAllRoles'), {
one: selectedUser.id,
many: [],
})
.then((response) => {
roleGridRef?.refresh();
});
});
},
},
'separator',
{
name: 'removeRole',
label: $t('system.role.action.removeRole'),
label: $t('system.user.selectRole.grid.toolbar.removeRole'),
enableIf: () => {
if (userGridRef && roleGridRef) {
return userGridRef.getSelectedRows().length > 0 && roleGridRef.getSelectedRows().length > 0;
@ -249,33 +242,21 @@
click: (selecteds) => {
const selectedUser = userGridRef.getSelectedRows()[0];
const roleIds = Tools.extractProperties(selecteds, 'id');
const messageKey = roleIds.length > 1 ? 'system.role.action.removeRole.confirms' : 'system.role.action.removeRole.confirm';
DialogManager.confirm(
t(messageKey, {
userLoginName: selectedUser.loginName,
userName: selectedUser.userName,
roleCode: selecteds[0].code,
roleName: selecteds[0].name,
counter: selecteds.length,
}),
() => {
axios
.post(Environment.apiContextPath('/api/system/user/removeRoles'), {
one: selectedUser.id,
many: roleIds,
})
.then((response) => {
axios.get(Environment.apiContextPath('/api/system/role/queryRolesByUser?userId=') + selectedUser.id).then((response) => {
roleGridRef.replaceRows(response.data.content);
});
});
},
);
DialogManager.confirm($t('system.user.selectRole.grid.toolbar.removeRole.tip'), () => {
axios
.post(Environment.apiContextPath('/api/system/user/removeRoles'), {
one: selectedUser.id,
many: roleIds,
})
.then((response) => {
roleGridRef?.refresh();
});
});
},
},
{
name: 'removeAllRole',
label: $t('system.role.action.removeAllRole'),
label: $t('system.user.selectRole.grid.toolbar.removeAllRole'),
enableIf: () => {
if (userGridRef && roleGridRef) {
return userGridRef.getSelectedRows().length > 0 && roleGridRef.getRows().length > 0;
@ -284,21 +265,16 @@
},
click: () => {
const selectedUser = userGridRef.getSelectedRows()[0];
DialogManager.confirm(
t('system.role.action.removeAllRole.confirm', { userLoginName: selectedUser.loginName, userName: selectedUser.userName }),
() => {
axios
.post(Environment.apiContextPath('/api/system/user/removeAllRoles'), {
one: selectedUser.id,
many: [],
})
.then((response) => {
axios.get(Environment.apiContextPath('/api/system/role/queryRolesByUser?userId=') + selectedUser.id).then((response) => {
roleGridRef.replaceRows(response.data.content);
});
});
},
);
DialogManager.confirm($t('system.user.selectRole.grid.toolbar.removeAllRole.tip'), () => {
axios
.post(Environment.apiContextPath('/api/system/user/removeAllRoles'), {
one: selectedUser.id,
many: [],
})
.then((response) => {
roleGridRef?.refresh();
});
});
},
},
'separator',
@ -311,12 +287,7 @@
width: 60,
name: 'status',
label: $t('status'),
format: (value, row) => {
return {
componentType: RoleStatusTag,
attrs: row,
};
},
format: Formater.enableTag(),
},
]"
:viewer="{
@ -346,6 +317,7 @@
:title="$t('system.org.grid.title')"
:data-url="Environment.apiContextPath('/api/system/org/listAllOrgsWithSelectedStatusByUser?userId=') + currentSelectedUserId"
selection="multiple"
:pageable="false"
:full-screen-button="false"
:toolbar-configure="{ noIcon: true }"
:toolbar-actions="[
@ -357,34 +329,18 @@
click: () => {
axios
.post(Environment.apiContextPath('/api/system/user/updateOrgs'), {
one: currentSelectedUserId,
many: orgTreeGridRef.value.getTicked(),
one: userGridRef.getSelectedRows()[0].id,
many: orgTreeGridRef.getTicked(),
})
.then((response) => {});
},
},
'view',
]"
:pagination="{
sortBy: 'name',
descending: false,
reqPageStart: 0,
rowsPerPage: 0,
}"
:columns="[
{ width: 100, name: 'code', label: $t('code') },
{ width: 80, name: 'code', label: $t('code') },
{ width: 100, name: 'name', label: $t('name') },
{
width: 60,
name: 'status',
label: $t('status'),
format: (value, row) => {
return {
componentType: RoleStatusTag,
attrs: row,
};
},
},
{ width: 60, name: 'status', label: $t('status'), format: Formater.enableTag() },
]"
:viewer="{
panel: {
@ -415,11 +371,12 @@
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { Environment, axios, EnumTools, NotifyManager, DialogManager, Formater, Options, Tools } from 'platform-core';
import { Environment, axios, EnumTools, NotifyManager, DialogManager, Formater, Options, Tools, OperatorTypeEnum } from 'platform-core';
import SelectRoleDialog from './SelectRoleDialog.vue';
import SetPasswordDialog from './SetPasswordDialog.vue';
import UserStatusTag from './UserStatusTag.vue';
import RoleStatusTag from './RoleStatusTag.vue';
const DataComeFromEnum = await EnumTools.fetch('io.sc.platform.orm.api.enums.DataComeFrom');
const userGridRef = ref();
const roleGridRef = ref();
@ -428,7 +385,5 @@ const orgTreeGridRef = ref();
const selectRoleDialog = ref();
const selectedTabRef = ref('role');
const setPasswordDialogRef = ref();
const DataComeFromEnum = await EnumTools.fetch('io.sc.platform.orm.api.enums.DataComeFrom');
const currentSelectedUserId = ref('');
</script>

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

@ -37,6 +37,8 @@ import org.springframework.util.StringUtils;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.JoinType;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;
import javax.servlet.http.HttpServletRequest;
import javax.transaction.Transactional;
import java.sql.PreparedStatement;
@ -186,8 +188,19 @@ public class UserServiceImpl extends DaoServiceImpl<UserEntity, String, UserRepo
public Page<UserEntity> queryUsersByRole(String roleId, QueryParameter queryParameter) throws Exception {
if(StringUtils.hasText(roleId)) {
Specification<UserEntity> specification = (root, query, criteriaBuilder) -> {
Join<RoleEntity, UserEntity> join = root.join("roles");
return criteriaBuilder.equal(join.get("id"), roleId);
Subquery<Integer> subquery =query.subquery(Integer.class);
// select 1
subquery.select(criteriaBuilder.literal(1));
// from sys_user_role,sys_role
Root<UserEntity> subQueryRoot =subquery.correlate(root);
Join<RoleEntity,UserEntity> join = subQueryRoot.join("roles");
// where sys_user.id_='xxx'
subquery.where(criteriaBuilder.equal(join.get("id"), roleId));
// where exists (...)
return criteriaBuilder.exists(subquery);
};
return this.query(specification, queryParameter);
}
@ -197,12 +210,23 @@ public class UserServiceImpl extends DaoServiceImpl<UserEntity, String, UserRepo
@Override
public Page<UserEntity> queryOtherUsersByRole(String roleId, QueryParameter queryParameter) throws Exception {
if(StringUtils.hasText(roleId)) {
Specification<UserEntity> specification = (root, query, criteriaBuilder) -> {
query.distinct(true);
Join<RoleEntity, UserEntity> join = root.join("roles", JoinType.LEFT);
return criteriaBuilder.or(criteriaBuilder.isNull(join.get("id")),criteriaBuilder.notEqual(join.get("id"), roleId));
Specification<UserEntity> baseSpecification = (root, query, criteriaBuilder) -> {
Subquery<Integer> subquery =query.subquery(Integer.class);
// select 1
subquery.select(criteriaBuilder.literal(1));
// from sys_user_role,sys_role
Root<UserEntity> subQueryRoot =subquery.correlate(root);
Join<RoleEntity,UserEntity> join = subQueryRoot.join("roles");
// where sys_user.id_='xxx'
subquery.where(criteriaBuilder.equal(join.get("id"), roleId));
// where exists (...)
return criteriaBuilder.not(criteriaBuilder.exists(subquery));
};
return this.query(specification, queryParameter);
Specification<UserEntity> specification =buildSpecification(queryParameter);
return this.query(baseSpecification.and(specification), queryParameter);
}
return QueryResult.emptyPage();
}

Loading…
Cancel
Save