Browse Source

update

main
wangshaoping 1 year ago
parent
commit
e76bb8b380
  1. 2
      gradle.properties
  2. 2
      io.sc.platform.core.frontend/package.json
  3. 17
      io.sc.platform.core.frontend/src/platform/components-ext/formater/BooleanFormater.ts
  4. 15
      io.sc.platform.core.frontend/src/platform/components-ext/formater/DatetimeFormater.ts
  5. 21
      io.sc.platform.core.frontend/src/platform/components-ext/formater/EnumFormater.ts
  6. 33
      io.sc.platform.core.frontend/src/platform/components-ext/formater/index.ts
  7. 2
      io.sc.platform.core.frontend/src/platform/components-ext/index.ts
  8. 17
      io.sc.platform.core.frontend/src/platform/components-ext/options/BooleanOptions.ts
  9. 26
      io.sc.platform.core.frontend/src/platform/components-ext/options/EnumOptions.ts
  10. 28
      io.sc.platform.core.frontend/src/platform/components-ext/options/index.ts
  11. 11
      io.sc.platform.core.frontend/src/platform/index.ts
  12. 12
      io.sc.platform.core.frontend/src/platform/layout/sub-layout/ChangePasswordDialog.vue
  13. 2
      io.sc.platform.core.frontend/src/platform/plugin/manager/DialogManager.ts
  14. 6
      io.sc.platform.core.frontend/src/platform/types/EnumType.ts
  15. 32
      io.sc.platform.core.frontend/src/platform/utils/BackendTools.ts
  16. 15
      io.sc.platform.core.frontend/src/platform/utils/DateTools.ts
  17. 57
      io.sc.platform.core.frontend/src/platform/utils/EnumTools.ts
  18. 11
      io.sc.platform.core.frontend/src/platform/utils/Tools.ts
  19. 1
      io.sc.platform.core.frontend/src/platform/utils/index.ts
  20. 4
      io.sc.platform.core.frontend/template-project/package.json
  21. 3
      io.sc.platform.core.frontend/template-project/webpack.env.serve.cjs
  22. 37
      io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/PluginManager.java
  23. 11
      io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/ApplicationProperties.java
  24. 9
      io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/Component.java
  25. 11
      io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/Directory.java
  26. 11
      io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/JsonSerializer.java
  27. 9
      io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/Message.java
  28. 11
      io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/RestartProperties.java
  29. 17
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words.properties
  30. 17
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_tw_CN.properties
  31. 19
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/words_zh_CN.properties
  32. 4
      io.sc.platform.developer.frontend/package.json
  33. 2
      io.sc.platform.developer.frontend/src/components/index.ts
  34. 1
      io.sc.platform.developer.frontend/src/i18n/messages.json
  35. 1
      io.sc.platform.developer.frontend/src/i18n/messages_tw_CN.json
  36. 1
      io.sc.platform.developer.frontend/src/i18n/messages_zh_CN.json
  37. 4
      io.sc.platform.developer.frontend/src/menus/menus.json
  38. 15
      io.sc.platform.developer.frontend/src/routes/routes.json
  39. 30
      io.sc.platform.developer.frontend/src/views/plugin/ApplicationProperties.vue
  40. 40
      io.sc.platform.developer.frontend/src/views/plugin/Components.vue
  41. 17
      io.sc.platform.developer.frontend/src/views/plugin/Directories.vue
  42. 40
      io.sc.platform.developer.frontend/src/views/plugin/FrontendModule.vue
  43. 20
      io.sc.platform.developer.frontend/src/views/plugin/FrontendRoutes.vue
  44. 35
      io.sc.platform.developer.frontend/src/views/plugin/Initializer.vue
  45. 17
      io.sc.platform.developer.frontend/src/views/plugin/JsonSerializers.vue
  46. 40
      io.sc.platform.developer.frontend/src/views/plugin/Messages.vue
  47. 27
      io.sc.platform.developer.frontend/src/views/plugin/P6spy.vue
  48. 20
      io.sc.platform.developer.frontend/src/views/plugin/Parameters.vue
  49. 40
      io.sc.platform.developer.frontend/src/views/plugin/Repositories.vue
  50. 40
      io.sc.platform.developer.frontend/src/views/plugin/RestartProperties.vue
  51. 27
      io.sc.platform.developer.frontend/src/views/plugin/Security.vue
  52. 16
      io.sc.platform.developer.frontend/src/views/plugin/SystemProperties.vue
  53. 17
      io.sc.platform.developer.frontend/src/views/plugin/Ws.vue
  54. 61
      io.sc.platform.developer.frontend/src/views/springboot/Bean.vue
  55. 3
      io.sc.platform.developer.frontend/webpack.env.serve.cjs
  56. 2
      io.sc.platform.developer/build.gradle
  57. 12
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/InitializerWebController.java
  58. 23
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginApplicationPropertiesWebController.java
  59. 23
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginComponentsWebController.java
  60. 23
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginDirectoriesWebController.java
  61. 24
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginFrontendModuleWebController.java
  62. 24
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginFrontendRouteWebController.java
  63. 24
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginJsonSerializersWebController.java
  64. 24
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginMessagesWebController.java
  65. 24
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginP6spyWebController.java
  66. 23
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginParametersWebController.java
  67. 24
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginRepositoriesWebController.java
  68. 24
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginRestartPropertiesWebController.java
  69. 24
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginSecurityWebController.java
  70. 22
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginSwaggerWebController.java
  71. 35
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginSystemPropertiesWebController.java
  72. 24
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/plugins/PluginWsWebController.java
  73. 73
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/controller/springboot/SpringbootBeansWebController.java
  74. 2
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/plugins/InitializerWrapper.java
  75. 40
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/plugins/SystemPropertyWrapper.java
  76. 81
      io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/springboot/BeanWrapper.java
  77. 3
      io.sc.platform.developer/src/main/resources/META-INF/platform/plugins/components.json
  78. 4
      io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/FlowableModelerEditorWebController.java
  79. 1
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/plugins/PluginManager.java
  80. 13
      io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/plugins/item/P6spy.java
  81. 4
      io.sc.platform.lcdp.frontend/package.json
  82. 3
      io.sc.platform.lcdp.frontend/webpack.env.serve.cjs
  83. 4
      io.sc.platform.mvc.frontend/package.json
  84. 3
      io.sc.platform.mvc.frontend/webpack.env.serve.cjs
  85. 5
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/plugins/PluginManager.java
  86. 11
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/plugins/item/FrontEndModule.java
  87. 11
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/plugins/item/FrontEndRoute.java
  88. 40
      io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/exception.properties
  89. 40
      io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/exception_tw_CN.properties
  90. 40
      io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/exception_zh_CN.properties
  91. 5
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/plugins/PluginManager.java
  92. 9
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/plugins/item/Repository.java
  93. 2
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryParameter.java
  94. 5
      io.sc.platform.orm/src/main/resources/META-INF/platform/plugins/repositories.json
  95. 6
      io.sc.platform.security.frontend/package.json
  96. 4
      io.sc.platform.security/src/main/java/io/sc/platform/security/plugins/PluginManager.java
  97. 11
      io.sc.platform.security/src/main/java/io/sc/platform/security/plugins/item/Security.java
  98. 2
      io.sc.platform.security/src/main/resources/liquibase/PF_11.0.0_20220606__Security_DDL.xml
  99. 4
      io.sc.platform.system.frontend/package.json
  100. 13
      io.sc.platform.system.frontend/src/i18n/messages.json

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.59
platform_core_frontend_version=8.1.67
###########################################################
# dependencies version

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

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

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

@ -0,0 +1,17 @@
import { i18n } from '@/platform/plugin';
const yesNoFormater = (value) => {
if (value) {
return i18n.global.t('yes');
}
return i18n.global.t('no');
};
const trueFalseFormater = (value) => {
if (value) {
return i18n.global.t('true');
}
return i18n.global.t('false');
};
export { yesNoFormater, trueFalseFormater };

15
io.sc.platform.core.frontend/src/platform/components-ext/formater/DatetimeFormater.ts

@ -0,0 +1,15 @@
import { DateTools } from '@/platform/utils';
/**
* (,,)
* @param value (YYYY-MM-DD HH:mm:ss)
* @returns
*/
const dateOnlyFormater = (value) => {
if (value) {
return '<span title="' + value + '">' + DateTools.format(value, 'YYYY-MM-DD') + '</span>';
}
return '';
};
export { dateOnlyFormater };

21
io.sc.platform.core.frontend/src/platform/components-ext/formater/EnumFormater.ts

@ -0,0 +1,21 @@
import type { OptionItemType } from '@/platform/types';
import { i18n } from '@/platform/plugin';
class EnumFormater {
#enumMap = {};
constructor(options: OptionItemType[]) {
for (const option of options) {
this.#enumMap[option.value] = option.label;
}
}
public formater() {
const enumMap = this.#enumMap;
return (value) => {
return i18n.global.t(enumMap[value]);
};
}
}
export { EnumFormater };

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

@ -0,0 +1,33 @@
import type { EnumType } from '@/platform/types';
import { yesNoFormater, trueFalseFormater } from './BooleanFormater';
import { dateOnlyFormater } from './DatetimeFormater';
import { EnumFormater } from './EnumFormater';
class Formater {
static #enumFormaterMap = {};
public static yesNo() {
return yesNoFormater;
}
public static trueFalse() {
return trueFalseFormater;
}
public static dateOnly() {
return dateOnlyFormater;
}
public static enum(enumType: EnumType) {
if (enumType) {
let enumFormater = Formater.#enumFormaterMap[enumType.name];
if (!enumFormater) {
enumFormater = new EnumFormater(enumType.items);
Formater.#enumFormaterMap[enumType.name] = enumFormater;
}
return enumFormater.formater();
}
}
}
export { Formater };

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

@ -0,0 +1,2 @@
export { Formater } from './formater';
export { Options } from './options';

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

@ -0,0 +1,17 @@
import { i18n } from '@/platform/plugin';
const yesNo = () => {
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') },
];
};
export { yesNo, trueFalse };

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

@ -0,0 +1,26 @@
import type { OptionItemType } from '@/platform/types';
import { i18n } from '@/platform/plugin';
class EnumOptions {
#options;
constructor(options: OptionItemType[]) {
this.#options = options;
}
public options() {
if (this.#options) {
const result = [];
for (const option of this.#options) {
result.push({
value: option.value,
label: i18n.global.t(option.label),
});
}
return result;
}
return [];
}
}
export { EnumOptions };

28
io.sc.platform.core.frontend/src/platform/components-ext/options/index.ts

@ -0,0 +1,28 @@
import type { EnumType } from '@/platform/types';
import { yesNo, trueFalse } from './BooleanOptions';
import { EnumOptions } from './EnumOptions';
class Options {
static #enumOptionsMap = {};
public static yesNo() {
return yesNo();
}
public static truefalse(t: any) {
return trueFalse();
}
public static enum(enumType: EnumType) {
if (enumType) {
let enumOptions = Options.#enumOptionsMap[enumType.name];
if (!enumOptions) {
enumOptions = new EnumOptions(enumType.items);
Options.#enumOptionsMap[enumType.name] = enumOptions;
}
return enumOptions.options();
}
}
}
export { Options };

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

@ -88,12 +88,23 @@ export { TagViewManager } from './plugin';
*
*/
export { EnumTools } from './utils';
export { DateTools } from './utils';
export { JavascriptLoader } from './utils';
export { QuasarTools } from './utils';
export { Tools } from './utils';
export { TreeBuilder } from './utils';
export { VueTools } from './utils';
/**
* formater
*/
export { Formater } from './components-ext';
/**
* options
*/
export { Options } from './components-ext';
/**
* UI
*/

12
io.sc.platform.core.frontend/src/platform/layout/sub-layout/ChangePasswordDialog.vue

@ -31,25 +31,19 @@ const computedFormFields = computed(() => {
name: 'rawPassword',
label: t('rawPassword'),
type: 'password',
requiredIf: () => {
return true;
},
required: true,
},
{
name: 'newPassword',
label: t('newPassword'),
type: 'password',
requiredIf: () => {
return true;
},
required: true,
},
{
name: 'confirmNewPassword',
label: t('confirmNewPassword'),
type: 'password',
requiredIf: () => {
return true;
},
required: true,
rules: [
(value) => {
return changePasswordFormRef.value.data.newPassword != value ? t('passwordAndConfirmPasswordMustEqual') : true;

2
io.sc.platform.core.frontend/src/platform/plugin/manager/DialogManager.ts

@ -99,7 +99,7 @@ class DialogManager {
const t = i18n.global.t;
Dialog.create({
title: t('confirm'),
title: t('inquiring'),
message: options.message,
focus: focus,
ok: {

6
io.sc.platform.core.frontend/src/platform/types/EnumType.ts

@ -1,6 +1,6 @@
import type {OptionItemType} from './OptionItemType';
export type EnumType = {
list:OptionItemType[];
map: object;
};
name: string;
items: OptionItemType[];
};

32
io.sc.platform.core.frontend/src/platform/utils/BackendTools.ts

@ -1,32 +0,0 @@
import type { EnumType, OptionItemType } from '@/platform/types';
import { axios, Environment } from '@/platform/plugin';
class BackendTools {
public static async enums(type: string, t: any = null): EnumType {
const response = await axios.get(Environment.apiContextPath('/api/enums/list/') + type);
if (response) {
const result: EnumType = { list: [], map: {} };
// list
const list: OptionItemType[] = response.data as OptionItemType[];
if (t) {
for (const option of list) {
option.label = t(option.label);
}
}
result.list = list;
// map
const map = {};
for (const option of list) {
map[option.value] = t(option.label);
}
result.map = map;
return result;
} else {
return { list: [], map: {} };
}
}
}
export { BackendTools };

15
io.sc.platform.core.frontend/src/platform/utils/DateTools.ts

@ -0,0 +1,15 @@
import * as dayjs from 'dayjs';
import * as customParseFormat from 'dayjs/plugin/customParseFormat';
dayjs.extend(customParseFormat);
class DateTools {
public static format(datetime: string, format: string): string {
if (datetime) {
return dayjs(datetime).format(format || 'YYYY-MM-DD HH:mm:ss');
}
return '';
}
}
export { DateTools };

57
io.sc.platform.core.frontend/src/platform/utils/EnumTools.ts

@ -1,56 +1,19 @@
import type { EnumType, OptionItemType } from '@/platform/types';
import type { EnumType } from '@/platform/types';
import { axios, Environment } from '@/platform/plugin';
class EnumTools {
public static yesno(t: any = null): EnumType {
return {
list: [
{ value: true, label: t('yes') },
{ value: false, label: t('no') },
],
map: {
true: t('yes'),
false: t('no'),
},
};
}
public static truefalse(t: any = null): EnumType {
return {
list: [
{ value: true, label: t('true') },
{ value: false, label: t('false') },
],
map: {
true: t('true'),
false: t('false'),
},
};
}
public static async fetch(type: string, t: any = null): EnumType {
public static async fetch(type: string): EnumType {
const response = await axios.get(Environment.apiContextPath('/api/enums/list/') + type);
if (response) {
const result: EnumType = { list: [], map: {} };
// list
const list: OptionItemType[] = response.data as OptionItemType[];
if (t) {
for (const option of list) {
option.label = t(option.label);
}
}
result.list = list;
// map
const map = {};
for (const option of list) {
map[option.value] = t(option.label);
}
result.map = map;
return result;
return {
name: type,
items: response.data,
};
} else {
return { list: [], map: {} };
return {
name: type,
items: [],
};
}
}
}

11
io.sc.platform.core.frontend/src/platform/utils/Tools.ts

@ -1,4 +1,15 @@
class Tools {
/**
*
* undefined === undeinfed === null === ''
* @param obj1
* @param obj2
* @returns
*/
public static stringEquals(obj1: any, obj2: any): boolean {
return (obj1 || '') === (obj2 || '');
}
/**
* undefined
* @param obj

1
io.sc.platform.core.frontend/src/platform/utils/index.ts

@ -1,3 +1,4 @@
export { DateTools } from './DateTools';
export { EnumTools } from './EnumTools';
export { JavascriptLoader } from './JavascriptLoader';
export { QuasarTools } from './QuasarTools';

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

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

3
io.sc.platform.core.frontend/template-project/webpack.env.serve.cjs

@ -12,6 +12,9 @@ module.exports = (env)=> merge(common, mf,{
devtool: 'eval',
devServer: {
client: {
overlay: false,
},
static: {
directory: path.join(__dirname, 'public'),
},

37
io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/PluginManager.java

@ -188,6 +188,9 @@ public class PluginManager {
applicationPropertyPlugins.forEach(plugin -> {
List<ApplicationProperties> value =plugin.getValue();
if(value!=null && !value.isEmpty()){
for(ApplicationProperties v : value){
v.setConfigurationFileUrl(plugin.getFileUrl());
}
result.addAll(value);
}
});
@ -199,7 +202,13 @@ public class PluginManager {
directoryPlugins =parser.parse(DIRECTORIES_LOCATION,new TypeReference<List<Directory>>(){});
if(directoryPlugins!=null && !directoryPlugins.isEmpty()){
List<Directory> result =new ArrayList<>();
directoryPlugins.forEach(plugin -> result.addAll(plugin.getValue()));
directoryPlugins.forEach(plugin -> {
List<Directory> directories =plugin.getValue();
for(Directory directory : directories){
directory.setConfigurationFileUrl(plugin.getFileUrl());
}
result.addAll(directories);
});
directories =result;
}
}
@ -208,7 +217,11 @@ public class PluginManager {
componentPlugins =parser.parse(COMPONENTS_LOCATION,new TypeReference<Component>(){});
if(componentPlugins!=null && !componentPlugins.isEmpty()){
List<Component> result =new ArrayList<>();
componentPlugins.forEach(plugin -> result.add(plugin.getValue()));
componentPlugins.forEach(plugin -> {
Component component =plugin.getValue();
component.setConfigurationFileUrl(plugin.getFileUrl());
result.add(component);
});
components =result;
}
}
@ -217,7 +230,11 @@ public class PluginManager {
messagePlugins =parser.parse(MESSAGES_LOCATION,new TypeReference<Message>(){});
if(messagePlugins!=null && !messagePlugins.isEmpty()){
List<Message> result =new ArrayList<>();
messagePlugins.forEach( plugin -> result.add(plugin.getValue()));
messagePlugins.forEach( plugin -> {
Message message =plugin.getValue();
message.setConfigurationFileUrl(plugin.getFileUrl());
result.add(message);
});
messages =result;
}
}
@ -226,7 +243,13 @@ public class PluginManager {
jsonSerializerPlugins =parser.parse(JSON_SERIALIZER_LOCATION,new TypeReference<List<JsonSerializer>>(){});
if(jsonSerializerPlugins!=null && !jsonSerializerPlugins.isEmpty()){
List<JsonSerializer> result =new ArrayList<>();
jsonSerializerPlugins.forEach( plugin -> result.addAll(plugin.getValue()));
jsonSerializerPlugins.forEach( plugin -> {
List<JsonSerializer> jsonSerializers =plugin.getValue();
for(JsonSerializer jsonSerializer : jsonSerializers){
jsonSerializer.setConfigurationFileUrl(plugin.getFileUrl());
}
result.addAll(jsonSerializers);
});
jsonSerializers =result;
}
}
@ -235,7 +258,11 @@ public class PluginManager {
restartPropertiesPlugins =parser.parse(RESTART_PROPERTIES_LOCATION,new TypeReference<RestartProperties>(){});
if(restartPropertiesPlugins!=null && !restartPropertiesPlugins.isEmpty()){
List<RestartProperties> result =new ArrayList<>();
restartPropertiesPlugins.forEach(plugin -> result.add(plugin.getValue()));
restartPropertiesPlugins.forEach(plugin -> {
RestartProperties restartProperties =plugin.getValue();
restartProperties.setConfigurationFileUrl(plugin.getFileUrl());
result.add(restartProperties);
});
restartProperties =result;
}
}

11
io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/ApplicationProperties.java

@ -11,6 +11,9 @@ public class ApplicationProperties {
private String module;
private List<String> properties =new ArrayList<>();
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public int getOrder() {
return order;
}
@ -42,4 +45,12 @@ public class ApplicationProperties {
public void setProperties(List<String> properties) {
this.properties = properties;
}
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
}

9
io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/Component.java

@ -8,6 +8,9 @@ import java.util.List;
public class Component {
private List<String> includes; //包含项列表
private List<String> excludes; //排除项列表
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public List<String> getIncludes() {
return includes;
@ -21,4 +24,10 @@ public class Component {
public void setExcludes(List<String> excludes) {
this.excludes = excludes;
}
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
}

11
io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/Directory.java

@ -7,6 +7,9 @@ public class Directory {
private String name; //名称
private String path; //目录路径
private boolean autoCreate =true; //是否自动创建(如果目录不存在)
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public String getName() {
return name;
@ -26,7 +29,13 @@ public class Directory {
public void setAutoCreate(boolean autoCreate) {
this.autoCreate = autoCreate;
}
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
@Override
public String toString() {
return "Directory [key=" + name + ", path=" + path + ", isAutoCreate=" + autoCreate + "]";

11
io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/JsonSerializer.java

@ -8,6 +8,9 @@ public class JsonSerializer {
private String serializer;
private String deserializer;
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public String getClassName() {
return className;
}
@ -31,4 +34,12 @@ public class JsonSerializer {
public void setDeserializer(String deserializer) {
this.deserializer = deserializer;
}
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
}

9
io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/Message.java

@ -8,6 +8,9 @@ import java.util.List;
public class Message {
private List<String> includes; //包含项列表
private List<String> excludes; //排除项列表
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public List<String> getIncludes() {
return includes;
@ -21,4 +24,10 @@ public class Message {
public void setExcludes(List<String> excludes) {
this.excludes = excludes;
}
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
}

11
io.sc.platform.core/src/main/java/io/sc/platform/core/plugins/item/RestartProperties.java

@ -9,6 +9,9 @@ public class RestartProperties {
private List<String> container; //在容器中运行时需要重启的属性列表
private List<String> jar; //通过 jar 直接运行时需要重启的属性列表
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public List<String> getContainer() {
return container;
}
@ -24,4 +27,12 @@ public class RestartProperties {
public void setJar(List<String> jar) {
this.jar = jar;
}
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
}

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

@ -5,6 +5,7 @@ addChild=Add Child {object}
addNew=Add
addTop=Add Top {object}
alter=Alter
autoCreate=Auto Create
bottom-left=Bottom Left
bottom-right=Bottom Right
bottom=Bottom
@ -16,6 +17,7 @@ className=Class
clone=Clone
close=Close
code=Code
component=Component
confirm=Confirm
confirmPassword=Confirm Password
content=Content
@ -25,9 +27,11 @@ createDate=Create Date
creator=Creator
dataComeFrom=Data Come From
deepClone=Deep Clone
defaultValue=Default Value
delete=Delete
deleteAll=Delete All
description=Description
deserializer=Deserializer
detail=Detail
disable=Disable
displayValue=Display Value
@ -40,6 +44,7 @@ example=Example
exception=Exception
exceptionMessage=Exception Message
exceptionStackTrace=Exception StackTrace
exclude=Exclude
executeTime=Execute Time
expand=Expand
expandAll=Expand All
@ -59,9 +64,13 @@ help=Help
homePage=Home
httpMethod=Http Method
id=ID
ignored=Ignored
import=Import
include=Include
inquiring=Inquiring
ip=IP
isEnable=Enable
jar=Jar
key=Key
language=Language
last=Last
@ -77,6 +86,7 @@ methodName=Mehtod
millisecond=Milli Second
mobile=Mobile
modify=Modify
module=Module
more=More
move=Move
myMessages=My Messages
@ -91,13 +101,18 @@ oldValue=Old Value
operationSuccess=Operation Sucess
order=Order
org=Org
parent=Parent
parentId=Parent ID
path=Path
password=Password
phone=Phone
pixel=px
previous=Previous
previousPage=Previous Page
priority=Priority
qq=QQ
query=Query
redirect=Redirect
refresh=Refresh
remove=Remove
reset=Reset
@ -109,6 +124,7 @@ save=Save
search=Search
select=Select
selectAll=Select All
serializer=Serializer
size=Size
startDate=Start Date
status=Status
@ -129,6 +145,7 @@ user=User
userName=User Name
value=Value
version=Version
webContainer=Web Container
weixin=WeiXin
welcome=Welcome
yes=Yes

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

@ -5,6 +5,7 @@ addChild=\u65B0\u589E\u5B50{object}
addNew=\u65B0\u589E
addTop=\u65B0\u589E\u9802\u7D1A{object}
alter=\u901A\u77E5
autoCreate=\u81EA\u52D5\u5275\u5EFA
bottom-left=\u5DE6\u4E0B
bottom-right=\u53F3\u4E0B
bottom=\u4E0B\u908A
@ -16,6 +17,7 @@ className=\u985E\u540D
clone=\u8907\u88FD
close=\u95DC\u9589
code=\u4EE3\u78BC
component=\u7D44\u4EF6
confirm=\u78BA\u5B9A
confirmPassword=\u78BA\u8A8D\u5BC6\u78BC
content=\u5167\u5BB9
@ -25,9 +27,11 @@ createDate=\u5275\u5EFA\u65E5\u671F
creator=\u5275\u5EFA\u4EBA
dataComeFrom=\u6578\u64DA\u4F86\u6E90
deepClone=\u6DF1\u5EA6\u8907\u88FD
defaultValue=\u9ED8\u8A8D\u503C
delete=\u522A\u9664
deleteAll=\u522A\u9664\u5168\u90E8
description=\u63CF\u8FF0
deserializer=\u53CD\u5E8F\u5217\u5316\u5668
detail=\u8A73\u60C5
disable=\u7981\u7528
displayValue=\u986F\u793A\u503C
@ -40,6 +44,7 @@ example=\u793A\u4F8B
exception=\u9055\u4F8B
exceptionMessage=\u9055\u4F8B\u4FE1\u606F
exceptionStackTrace=\u9055\u4F8B\u68E7
exclude=\u6392\u9664
executeTime=\u57F7\u884C\u6642\u9593
expand=\u5C55\u958B
expandAll=\u5168\u90E8\u5C55\u958B
@ -59,9 +64,13 @@ help=\u5E6B\u52A9
homePage=\u9996\u9801
httpMethod=Http \u65B9\u6CD5
id=\u552F\u4E00\u6A19\u8B58
ignored=\u5FFD\u7565
import=\u5C0E\u5165
include=\u5305\u542B
inquiring=\u8A62\u554F
ip=IP
isEnable=\u662F\u5426\u53EF\u7528
jar=Jar \u5305
key=\u9375
language=\u8A9E\u8A00
last=\u6700\u5F8C
@ -77,6 +86,7 @@ methodName=\u985E\u65B9\u6CD5
millisecond=\u6BEB\u79D2
mobile=\u624B\u6A5F
modify=\u4FEE\u6539
module=\u6A21\u584A
more=\u66F4\u591A
move=\u79FB\u52D5
myMessages=\u6211\u7684\u6D88\u606F
@ -91,13 +101,18 @@ oldValue=\u539F\u503C
operationSuccess=\u64CD\u4F5C\u6210\u529F
order=\u9806\u5E8F
org=\u6A5F\u69CB
parent=\u7236
parentId=\u7236 ID
path=\u8DEF\u5F91
password=\u5BC6\u78BC
phone=\u96FB\u8A71
pixel=\u50CF\u7D20
previous=\u524D\u4E00
previousPage=\u524D\u4E00\u9801
priority=\u512A\u5148\u7D1A
qq=QQ
query=\u67E5\u8A62
redirect=\u91CD\u5B9A\u5411
refresh=\u5237\u65B0
remove=\u79FB\u9664
reset=\u91CD\u7F6E
@ -109,6 +124,7 @@ save=\u4FDD\u5B58
search=\u641C\u7D22
select=\u9078\u64C7
selectAll=\u5168\u90E8\u9078\u64C7
serializer=\u5E8F\u5217\u5316\u5668
size=\u5C3A\u5BF8
startDate=\u958B\u59CB\u65E5\u671F
status=\u72C0\u614B
@ -129,6 +145,7 @@ user=\u7528\u6237
userName=\u7528\u6236\u540D
value=\u503C
version=\u7248\u672C
webContainer=Web \u5BB9\u5668
weixin=\u5FAE\u4FE1
welcome=\u6B61\u8FCE
yes=\u662F

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

@ -5,6 +5,7 @@ addChild=\u65B0\u589E\u5B50{object}
addNew=\u65B0\u589E
addTop=\u65B0\u589E\u9876\u7EA7{object}
alter=\u901A\u77E5
autoCreate=\u81EA\u52A8\u521B\u5EFA
bottom-left=\u5DE6\u4E0B
bottom-right=\u53F3\u4E0B
bottom=\u4E0B\u8FB9
@ -16,6 +17,7 @@ className=\u7C7B\u540D
clone=\u590D\u5236
close=\u5173\u95ED
code=\u4EE3\u7801
component=\u7EC4\u4EF6
confirm=\u786E\u5B9A
confirmPassword=\u786E\u8BA4\u5BC6\u7801
content=\u5185\u5BB9
@ -25,9 +27,11 @@ createDate=\u521B\u5EFA\u65E5\u671F
creator=\u521B\u5EFA\u4EBA
dataComeFrom=\u6570\u636E\u6765\u6E90
deepClone=\u6DF1\u5EA6\u590D\u5236
defaultValue=\u9ED8\u8BA4\u503C
delete=\u522A\u9664
deleteAll=\u5220\u9664\u5168\u90E8
description=\u63CF\u8FF0
deserializer=\u53CD\u5E8F\u5217\u5316\u5668
detail=\u8BE6\u60C5
disable=\u7981\u7528
displayValue=\u663E\u793A\u503C
@ -40,6 +44,7 @@ example=\u793A\u4F8B
exception=\u8FDD\u4F8B
exceptionMessage=\u8FDD\u4F8B\u4FE1\u606F
exceptionStackTrace=\u8FDD\u4F8B\u6808
exclude=\u6392\u9664
executeTime=\u6267\u884C\u65F6\u95F4
expand=\u5C55\u5F00
expandAll=\u5168\u90E8\u5C55\u5F00
@ -59,9 +64,13 @@ help=\u5E2E\u52A9
homePage=\u9996\u9875
httpMethod=Http \u65B9\u6CD5
id=\u552F\u4E00\u6807\u8BC6
ignored=\u5FFD\u7565
import=\u5BFC\u5165
include=\u5305\u542B
inquiring=\u8BE2\u95EE
ip=IP
isEnable=\u662F\u5426\u53EF\u7528
jar=Jar \u5305
key=\u952E
language=\u8BED\u8A00
last=\u6700\u540E
@ -77,6 +86,7 @@ methodName=\u7C7B\u65B9\u6CD5
millisecond=\u6BEB\u79D2
mobile=\u624B\u673A
modify=\u4FEE\u6539
module=\u6A21\u5757
more=\u66F4\u591A
move=\u79FB\u52A8
myMessages=\u6211\u7684\u6D88\u606F
@ -91,13 +101,18 @@ oldValue=\u539F\u503C
operationSuccess=\u64CD\u4F5C\u6210\u529F
order=\u987A\u5E8F
org=\u673A\u6784
parent=\u7236
parentId=\u7236 ID
path=\u8DEF\u5F84
password=\u5BC6\u7801
phone=\u7535\u8BDD
pixel=\u50CF\u7D20
previous=\u524D\u4E00
previousPage=\u524D\u4E00\u9875
priority=\u4F18\u5148\u7EA7
qq=QQ
query=\u67E5\u8BE2
redirect=\u91CD\u5B9A\u5411
refresh=\u5237\u65B0
remove=\u79FB\u9664
reset=\u91CD\u7F6E
@ -109,6 +124,7 @@ save=\u4FDD\u5B58
search=\u641C\u7D22
select=\u9009\u62E9
selectAll=\u5168\u90E8\u9009\u62E9
serializer=\u5E8F\u5217\u5316\u5668
size=\u5C3A\u5BF8
startDate=\u5F00\u59CB\u65E5\u671F
status=\u72B6\u6001
@ -129,6 +145,7 @@ user=\u7528\u6237
userName=\u7528\u6237\u540D
value=\u503C
version=\u7248\u672C
webContainer=Web \u5BB9\u5668
weixin=\u5FAE\u4FE1
welcome=\u6B22\u8FCE
yes=\u662F
yes=\u662F

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.59",
"platform-core": "8.1.70",
"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"
}
}
}

2
io.sc.platform.developer.frontend/src/components/index.ts

@ -21,6 +21,7 @@ import Parameters from '@/views/plugin/Parameters.vue';
import Repositories from '@/views/plugin/Repositories.vue';
import RestartProperties from '@/views/plugin/RestartProperties.vue';
import Security from '@/views/plugin/Security.vue';
import Ws from '@/views/plugin/Ws.vue';
import Swagger from '@/views/plugin/Swagger.vue';
import SystemProperties from '@/views/plugin/SystemProperties.vue';
import Icons from '@/views/frontend/Icons.vue';
@ -45,6 +46,7 @@ const localComponents = {
'component.developer.plugin.Repositories': Repositories,
'component.developer.plugin.RestartProperties': RestartProperties,
'component.developer.plugin.Security': Security,
'component.developer.plugin.Ws': Ws,
'component.developer.plugin.Swagger': Swagger,
'component.developer.plugin.SystemProperties': SystemProperties,
'component.developer.frontend.Icons': Icons,

1
io.sc.platform.developer.frontend/src/i18n/messages.json

@ -24,6 +24,7 @@
"menu.developer.plugin.frontendModule" : "Front End Module",
"menu.developer.plugin.frontendRoutes" : "Front End Route",
"menu.developer.plugin.menus" : "Menu",
"menu.developer.plugin.ws" : "WebService",
"menu.developer.frontend" : "Front End Tools",
"menu.developer.frontend.icons" : "Icons"

1
io.sc.platform.developer.frontend/src/i18n/messages_tw_CN.json

@ -24,6 +24,7 @@
"menu.developer.plugin.frontendModule" : "前端模塊",
"menu.developer.plugin.frontendRoutes" : "前端路由",
"menu.developer.plugin.menus" : "菜單",
"menu.developer.plugin.ws" : "Web 服務",
"menu.developer.frontend" : "前端工具",
"menu.developer.frontend.icons" : "圖標庫"

1
io.sc.platform.developer.frontend/src/i18n/messages_zh_CN.json

@ -24,6 +24,7 @@
"menu.developer.plugin.frontendModule" : "前端模块",
"menu.developer.plugin.frontendRoutes" : "前端路由",
"menu.developer.plugin.menus" : "菜单",
"menu.developer.plugin.ws" : "Web 服务",
"menu.developer.frontend" : "前端工具",
"menu.developer.frontend.icons" : "图标库"

4
io.sc.platform.developer.frontend/src/menus/menus.json

@ -64,8 +64,10 @@
{"type":"ROUTE", "order":1300, "parentId":"menu.developer.plugin", "id":"menu.developer.plugin.restartProperties", "titleI18nKey":"menu.developer.plugin.restartProperties", "icon":"bi-list-check", "routeName":"route.developer.plugin.restartProperties"},
/*//SQL*/
{"type":"ROUTE", "order":1400, "parentId":"menu.developer.plugin", "id":"menu.developer.plugin.p6spy", "titleI18nKey":"menu.developer.plugin.p6spy", "icon":"bi-filetype-sql", "routeName":"route.developer.plugin.p6spy"},
/*//WebService*/
{"type":"ROUTE", "order":1500, "parentId":"menu.developer.plugin", "id":"menu.developer.plugin.ws", "titleI18nKey":"menu.developer.plugin.ws", "icon":"bi-filetype-html", "routeName":"route.developer.plugin.ws"},
/*//Swagger*/
{"type":"ROUTE", "order":1500, "parentId":"menu.developer.plugin", "id":"menu.developer.plugin.swagger", "titleI18nKey":"menu.developer.plugin.swagger", "icon":"bi-filetype-html", "routeName":"route.developer.plugin.swagger"},
{"type":"ROUTE", "order":1600, "parentId":"menu.developer.plugin", "id":"menu.developer.plugin.swagger", "titleI18nKey":"menu.developer.plugin.swagger", "icon":"bi-filetype-html", "routeName":"route.developer.plugin.swagger"},
/*/*/
{"type":"GROUP", "order":500, "parentId":"menu.developer", "id":"menu.developer.frontend", "titleI18nKey":"menu.developer.frontend", "icon":"bi-layout-text-window"},

15
io.sc.platform.developer.frontend/src/routes/routes.json

@ -284,6 +284,21 @@
]
}
},
{
"name": "route.developer.plugin.ws",
"path": "developer/plugin/ws",
"parent": "/",
"priority": 0,
"module": "io.sc.platform.developer.frontend",
"component": "component.developer.plugin.Ws",
"componentPath": "@/views/plugin/Ws.vue",
"redirect": null,
"meta": {
"permissions": [
"/system/developer/plugin/ws/**/*"
]
}
},
{
"name": "route.developer.plugin.swagger",
"path": "developer/plugin/swagger",

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

@ -1,4 +1,30 @@
<template>
<div>ApplicationProperties</div>
<w-grid
:title="$t('menu.developer.plugin.applicationProperties')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/applicationProperties')"
row-key="id"
:columns="[
{ width: '20%', name: 'order', label: $t('order') },
{ width: '20%', name: 'module', label: $t('module') },
{ width: '40%', name: 'description', label: $t('description') },
{
width: '40%',
name: 'properties',
label: $t('properties'),
format: (properties) => {
properties = properties || [];
let result = '';
for (const property of properties) {
result += property + '<br/>';
}
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,40 @@
<template>
<div>Components</div>
<w-grid
:title="$t('menu.developer.plugin.components')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/components')"
row-key="id"
:columns="[
{
width: '40%',
name: 'includes',
label: $t('include'),
format: (includes) => {
includes = includes || [];
let result = '';
for (const include of includes) {
result += include + '<br/>';
}
return result;
},
},
{
width: '40%',
name: 'excludes',
label: $t('exclude'),
format: (excludes) => {
excludes = excludes || [];
let result = '';
for (const exclude of excludes) {
result += exclude + '<br/>';
}
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,17 @@
<template>
<div>Directories</div>
<w-grid
:title="$t('menu.developer.plugin.directories')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/directories')"
row-key="id"
: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') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,40 @@
<template>
<div>FrontendModule</div>
<w-grid
:title="$t('menu.developer.plugin.frontendModule')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/frontendModule')"
:columns="[
{ width: 100, name: 'name', label: $t('name') },
{
width: '40%',
name: 'components',
label: $t('component'),
format: (components) => {
components = components || [];
let result = '';
for (const component of components) {
result += component + '<br/>';
}
return result;
},
},
{
width: '40%',
name: 'resources',
label: $t('resource'),
format: (resources) => {
resources = resources || [];
let result = '';
for (const resource of resources) {
result += resource + '<br/>';
}
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,20 @@
<template>
<div>FrontendRoutes</div>
<w-grid
:title="$t('menu.developer.plugin.frontendModule')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/frontendRoute')"
: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') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,26 +1,17 @@
<template>
<div class="row q-px-md q-py-md">
{{ $t('menu.developer.plugin.initializer') }}
</div>
<q-table :rows="rows" :columns="columns" row-key="id" :pagination="{ rowsPerPage: 1000 }" />
<w-grid
:title="$t('menu.developer.plugin.initializer')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/initializer')"
row-key="id"
: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' },
]"
></w-grid>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { useI18n } from 'vue-i18n';
import { Environment, axios } from 'platform-core';
const { t } = useI18n();
const columns = [
{ width: '20%', field: 'order', label: t('order'), align: 'right' },
{ width: '40%', field: 'name', label: t('name'), format: (value) => t(value), align: 'left' },
{ width: '40%', field: 'description', label: t('description'), format: (value) => t(value), align: 'left' },
{ width: '40%', field: 'id', label: t('className'), align: 'left' },
];
const rows = ref([]);
axios.get(Environment.apiContextPath('/api/developer/plugins/initializer')).then((response) => {
rows.value = response.data;
});
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,17 @@
<template>
<div>JsonSerializers</div>
<w-grid
:title="$t('menu.developer.plugin.jsonSerializers')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/jsonSerializers')"
row-key="id"
: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') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,40 @@
<template>
<div>Messages</div>
<w-grid
:title="$t('menu.developer.plugin.messages')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/messages')"
row-key="id"
:columns="[
{
width: '40%',
name: 'includes',
label: $t('include'),
format: (includes) => {
includes = includes || [];
let result = '';
for (const include of includes) {
result += include + '<br/>';
}
return result;
},
},
{
width: '40%',
name: 'excludes',
label: $t('exclude'),
format: (excludes) => {
excludes = excludes || [];
let result = '';
for (const exclude of excludes) {
result += exclude + '<br/>';
}
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,27 @@
<template>
<div>P6spy</div>
<w-grid
:title="$t('menu.developer.plugin.p6spy')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/p6spy')"
row-key="id"
:columns="[
{
width: '40%',
name: 'ignoredPatterns',
label: $t('ignored'),
format: (ignoredPatterns) => {
ignoredPatterns = ignoredPatterns || [];
let result = '';
for (const ignoredPattern of ignoredPatterns) {
result += ignoredPattern + '<br/>';
}
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,20 @@
<template>
<div>Parameters</div>
<w-grid
:title="$t('menu.developer.plugin.parameters')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/parameters')"
row-key="id"
: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') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,40 @@
<template>
<div>Repositories</div>
<w-grid
:title="$t('menu.developer.plugin.repositories')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/repositories')"
row-key="id"
:columns="[
{
width: '40%',
name: 'includes',
label: $t('include'),
format: (includes) => {
includes = includes || [];
let result = '';
for (const include of includes) {
result += include + '<br/>';
}
return result;
},
},
{
width: '40%',
name: 'excludes',
label: $t('exclude'),
format: (excludes) => {
excludes = excludes || [];
let result = '';
for (const exclude of excludes) {
result += exclude + '<br/>';
}
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,40 @@
<template>
<div>RestartProperties</div>
<w-grid
:title="$t('menu.developer.plugin.restartProperties')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/restartProperties')"
row-key="id"
:columns="[
{
width: '20%',
name: 'container',
label: $t('webContainer'),
format: (containers) => {
containers = containers || [];
let result = '';
for (const container of containers) {
result += container + '<br/>';
}
return result;
},
},
{
width: '40%',
name: 'jar',
label: $t('jar'),
format: (jars) => {
jars = jars || [];
let result = '';
for (const jar of jars) {
result += jar + '<br/>';
}
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,27 @@
<template>
<div>Security</div>
<w-grid
:title="$t('menu.developer.plugin.security')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/security')"
row-key="id"
:columns="[
{
width: '40%',
name: 'permitPatterns',
label: $t('include'),
format: (permitPatterns) => {
permitPatterns = permitPatterns || [];
let result = '';
for (const permitPattern of permitPatterns) {
result += permitPattern + '<br/>';
}
return result;
},
},
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,16 @@
<template>
<div>SystemProperties</div>
<w-grid
:title="$t('menu.developer.plugin.systemProperties')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/systemProperties')"
row-key="id"
:columns="[
{ width: '20%', name: 'name', label: $t('name') },
{ width: '40%', name: 'value', label: $t('path') },
{ width: '40%', name: 'configurationFileUrl', label: $t('url') },
]"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -0,0 +1,17 @@
<template>
<w-grid
:title="$t('menu.developer.plugin.ws')"
:toolbar-actions="['refresh', 'separator', 'view', 'export']"
:fetch-data-url="Environment.apiContextPath('/api/developer/plugins/ws')"
row-key="id"
: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') },
]"
></w-grid>
</template>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

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

@ -1,4 +1,61 @@
<template>
<div>Bean</div>
<w-grid
: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,
}"
:columns="[
{ width: 600, name: 'name', label: $t('name') },
{ width: 500, name: 'type', label: $t('className') },
{ width: 100, name: 'configurationFileUrl', label: $t('url') },
]"
:viewer="{
panel: {
columnNum: 1,
fields: [
{ width: 100, name: 'name', label: $t('name') },
{ width: 100, name: 'context', label: $t('context') },
{ width: 100, name: 'scope', label: $t('scope') },
{ width: 100, name: 'type', label: $t('className') },
{ width: 100, name: 'resource', label: $t('resource') },
{
width: 100,
name: 'aliases',
label: $t('aliases'),
format: (aliases) => {
aliases = aliases || [];
let result = '';
for (const aliase of aliases) {
result += aliase + '<br/>';
}
return result;
},
},
{
width: 100,
name: 'dependencies',
label: $t('dependencies'),
format: (dependencies) => {
dependencies = dependencies || [];
let result = '';
for (const dependency of dependencies) {
result += dependency + '<br/>';
}
return result;
},
},
{ width: 100, name: 'configurationFileUrl', label: $t('url') },
],
},
}"
></w-grid>
</template>
<script setup lang="ts"></script>
<script setup lang="ts">
import { Environment } from 'platform-core';
</script>

3
io.sc.platform.developer.frontend/webpack.env.serve.cjs

@ -12,6 +12,9 @@ module.exports = (env)=> merge(common, mf,{
devtool: 'eval',
devServer: {
client: {
overlay: false,
},
static: {
directory: path.join(__dirname, 'public'),
},

2
io.sc.platform.developer/build.gradle

@ -1,6 +1,8 @@
dependencies {
api(
project(":io.sc.platform.mvc"),
project(":io.sc.platform.security"),
project(":io.sc.platform.ws.cxf"),
project(":io.sc.platform.developer.doc"),
project(":io.sc.platform.developer.frontend"),
)

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

@ -1,9 +1,10 @@
package io.sc.platform.developer.plugins.controller;
package io.sc.platform.developer.controller.plugins;
import io.sc.platform.core.annotation.IgnoreResponseBodyAdvice;
import io.sc.platform.core.initializer.ApplicationInitializer;
import io.sc.platform.core.util.Sorter;
import io.sc.platform.developer.plugins.wrapper.InitializerWrapper;
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;
@ -16,16 +17,15 @@ import java.util.ServiceLoader;
@Controller
@RequestMapping("/api/developer/plugins/initializer")
public class InitializerWebController {
@GetMapping("")
@ResponseBody
public List<InitializerWrapper> initializer(){
public Page<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 InitializerWrapper.from(initializers);
return QueryResult.page(InitializerWrapper.from(initializers));
}
}

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

@ -0,0 +1,23 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/applicationProperties")
public class PluginApplicationPropertiesWebController {
@GetMapping("")
@ResponseBody
public Page<ApplicationProperties> applicationProperties(){
List<ApplicationProperties> plugins = PluginManager.getInstance().getApplicationProperties();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,23 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/components")
public class PluginComponentsWebController {
@GetMapping("")
@ResponseBody
public Page<Component> components(){
List<Component> plugins = PluginManager.getInstance().getComponents();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,23 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/directories")
public class PluginDirectoriesWebController {
@GetMapping("")
@ResponseBody
public Page<Directory> directories(){
List<Directory> plugins = PluginManager.getInstance().getDirectories();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,24 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/frontendModule")
public class PluginFrontendModuleWebController {
@GetMapping("")
@ResponseBody
public Page<FrontEndModule> frontendModule(){
List<FrontEndModule> plugins = PluginManager.getInstance().getFrontEndModules();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,24 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/frontendRoute")
public class PluginFrontendRouteWebController {
@GetMapping("")
@ResponseBody
public Page<FrontEndRoute> frontendRoute(){
List<FrontEndRoute> plugins = PluginManager.getInstance().getFrontEndRoutes();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,24 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/jsonSerializers")
public class PluginJsonSerializersWebController {
@GetMapping("")
@ResponseBody
public Page<JsonSerializer> jsonSerializers(){
List<JsonSerializer> plugins = PluginManager.getInstance().getJsonSerializers();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,24 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/messages")
public class PluginMessagesWebController {
@GetMapping("")
@ResponseBody
public Page<Message> messages(){
List<Message> plugins = PluginManager.getInstance().getMessages();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,24 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/p6spy")
public class PluginP6spyWebController {
@GetMapping("")
@ResponseBody
public Page<P6spy> p6spy(){
List<P6spy> plugins = PluginManager.getInstance().getP6spys();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,23 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/parameters")
public class PluginParametersWebController {
@GetMapping("")
@ResponseBody
public Page<Parameter> parameters(){
List<Parameter> plugins =PluginManager.getInstance().getParameters();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,24 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/repositories")
public class PluginRepositoriesWebController {
@GetMapping("")
@ResponseBody
public Page<Repository> repositories(){
List<Repository> plugins = PluginManager.getInstance().getRepositories();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,24 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/restartProperties")
public class PluginRestartPropertiesWebController {
@GetMapping("")
@ResponseBody
public Page<RestartProperties> restartProperties(){
List<RestartProperties> plugins = PluginManager.getInstance().getRestartProperties();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,24 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/security")
public class PluginSecurityWebController {
@GetMapping("")
@ResponseBody
public Page<Security> security(){
List<Security> plugins = PluginManager.getInstance().getSecurities();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,22 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/swagger")
public class PluginSwaggerWebController {
@GetMapping("")
@ResponseBody
public Page<P6spy> swagger(){
return QueryResult.emptyPage();
}
}

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

@ -0,0 +1,35 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Controller
@RequestMapping("/api/developer/plugins/systemProperties")
public class PluginSystemPropertiesWebController {
@GetMapping("")
@ResponseBody
public Page<SystemPropertyWrapper> systemProperties(){
List<Plugin<Map<String, String>>> plugins = PluginManager.getInstance().getSystemPropertyPlugins();
List<SystemPropertyWrapper> result =new ArrayList<>();
for(Plugin<Map<String, String>> plugin : plugins){
Map<String,String> map =plugin.getValue();
for(String key : map.keySet()){
SystemPropertyWrapper wrapper =new SystemPropertyWrapper(key,map.get(key));
wrapper.setConfigurationFileUrl(plugin.getFileUrl());
result.add(wrapper);
}
}
return QueryResult.page(result);
}
}

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

@ -0,0 +1,24 @@
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;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
@RequestMapping("/api/developer/plugins/ws")
public class PluginWsWebController {
@GetMapping("")
@ResponseBody
public Page<JaxWsWebservice> ws(){
List<JaxWsWebservice> plugins = PluginManager.getInstance().getJaxWsWebservices();
return QueryResult.page(plugins);
}
}

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

@ -0,0 +1,73 @@
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;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.*;
@Controller
@RequestMapping("/api/developer/springboot/beans")
public class SpringbootBeansWebController {
@Autowired BeansEndpoint beansEndpoint;
@GetMapping("")
@ResponseBody
public Page<BeanWrapper> beans(QueryParameter queryParameter){
List<BeanWrapper> result =new ArrayList<>();
Map<String, ContextBeans> contexts =beansEndpoint.beans().getContexts();
for(Map.Entry<String, ContextBeans> contextEntry : contexts.entrySet()){
String context =contextEntry.getKey();
ContextBeans contextBeans =contextEntry.getValue();
Map<String, BeanDescriptor> beans =contextBeans.getBeans();
for(Map.Entry<String, BeanDescriptor> beanEntry : beans.entrySet()){
String beanName =beanEntry.getKey();
BeanDescriptor beanDescriptor =beanEntry.getValue();
result.add(new BeanWrapper(context,beanName,beanDescriptor));
}
}
if(queryParameter!=null){
Sort sort =queryParameter.getSort();
if(sort!=null){
Order order =sort.iterator().next();
if(order!=null){
if("name".equalsIgnoreCase(order.getProperty())){
if(order.isAscending()){
result.sort(new BeanNameAscComparator());
}else{
result.sort(new BeanNameDescComparator());
}
}
}
}
}
return QueryResult.page(result);
}
private class BeanNameAscComparator implements Comparator<BeanWrapper> {
@Override
public int compare(BeanWrapper o1, BeanWrapper o2) {
return o1.getName().compareTo(o2.getName());
}
}
private class BeanNameDescComparator implements Comparator<BeanWrapper> {
@Override
public int compare(BeanWrapper o1, BeanWrapper o2) {
return o2.getName().compareTo(o1.getName());
}
}
}

2
io.sc.platform.developer/src/main/java/io/sc/platform/developer/plugins/wrapper/InitializerWrapper.java → io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/plugins/InitializerWrapper.java

@ -1,4 +1,4 @@
package io.sc.platform.developer.plugins.wrapper;
package io.sc.platform.developer.wrapper.plugins;
import io.sc.platform.core.initializer.ApplicationInitializer;

40
io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/plugins/SystemPropertyWrapper.java

@ -0,0 +1,40 @@
package io.sc.platform.developer.wrapper.plugins;
public class SystemPropertyWrapper {
private String name;
private String value;
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public SystemPropertyWrapper(){}
public SystemPropertyWrapper(String name,String value){
this.name =name;
this.value =value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
}

81
io.sc.platform.developer/src/main/java/io/sc/platform/developer/wrapper/springboot/BeanWrapper.java

@ -0,0 +1,81 @@
package io.sc.platform.developer.wrapper.springboot;
import org.springframework.boot.actuate.beans.BeansEndpoint.BeanDescriptor;
public class BeanWrapper {
private String context;
private String name;
private String[] aliases;
private String scope;
private Class<?> type;
private String resource;
private String[] dependencies;
public BeanWrapper(String context, String name, BeanDescriptor beanDescriptor){
this.context =context;
this.name =name;
if(beanDescriptor!=null){
this.aliases =beanDescriptor.getAliases();
this.scope =beanDescriptor.getScope();
this.type =beanDescriptor.getType();
this.resource =beanDescriptor.getResource();
this.dependencies =beanDescriptor.getDependencies();
}
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getAliases() {
return aliases;
}
public void setAliases(String[] aliases) {
this.aliases = aliases;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
public Class<?> getType() {
return type;
}
public void setType(Class<?> type) {
this.type = type;
}
public String getResource() {
return resource;
}
public void setResource(String resource) {
this.resource = resource;
}
public String[] getDependencies() {
return dependencies;
}
public void setDependencies(String[] dependencies) {
this.dependencies = dependencies;
}
}

3
io.sc.platform.developer/src/main/resources/META-INF/platform/plugins/components.json

@ -1,5 +1,6 @@
{
"includes":[
"io.sc.platform.developer.plugins.controller"
"io.sc.platform.developer.controller.plugins",
"io.sc.platform.developer.controller.springboot"
]
}

4
io.sc.platform.flowable/src/main/java/io/sc/platform/flowable/controller/FlowableModelerEditorWebController.java

@ -11,7 +11,7 @@ import io.sc.platform.flowable.support.FlowableGroupList;
import io.sc.platform.flowable.support.FlowableUser;
import io.sc.platform.flowable.support.FlowableUserList;
import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.system.role.convertor.RoleEntityVoConverter;
import io.sc.platform.orm.util.EntityVoConvertor;
import io.sc.platform.system.role.jpa.entity.RoleEntity;
import io.sc.platform.system.role.service.RoleService;
import io.sc.platform.system.user.convertor.UserEntityVoConverter;
@ -131,6 +131,6 @@ public class FlowableModelerEditorWebController {
@IgnoreResponseBodyAdvice
public FlowableGroupList editorGroups(@RequestParam(name="filter",required=false) String filter,QueryParameter queryParameter) throws Exception{
Page<RoleEntity> roleEntities =roleService.queryRolesByCodeOrName(filter,queryParameter);
return FlowableGroupList.fromGroups(new RoleEntityVoConverter().toVo(roleEntities));
return FlowableGroupList.fromGroups(EntityVoConvertor.toVo(roleEntities));
}
}

1
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/plugins/PluginManager.java

@ -88,6 +88,7 @@ public class PluginManager {
List<P6spy> items =new ArrayList<>();
p6spyPlugins.forEach(plugin -> {
P6spy entity =plugin.getValue();
entity.setConfigurationFileUrl(plugin.getFileUrl());
items.add(entity);
});
p6spys =items;

13
io.sc.platform.jdbc/src/main/java/io/sc/platform/jdbc/plugins/item/P6spy.java

@ -5,7 +5,8 @@ import java.util.List;
public class P6spy {
protected List<String> ignoredPatterns =new ArrayList<>();
private String fileUrl; //插件配置文件位置
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public List<String> getIgnoredPatterns() {
return ignoredPatterns;
@ -15,19 +16,19 @@ public class P6spy {
this.ignoredPatterns = ignoredPatterns;
}
public String getFileUrl() {
return fileUrl;
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setFileUrl(String fileUrl) {
this.fileUrl = fileUrl;
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
@Override
public String toString() {
return "P6spy{" +
"ignoredPatterns=" + ignoredPatterns +
", fileUrl='" + fileUrl + '\'' +
", configurationFileUrl='" + configurationFileUrl + '\'' +
'}';
}
}

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.59",
"platform-core": "8.1.67",
"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"
}
}
}

3
io.sc.platform.lcdp.frontend/webpack.env.serve.cjs

@ -12,6 +12,9 @@ module.exports = (env)=> merge(common, mf,{
devtool: 'eval',
devServer: {
client: {
overlay: false,
},
static: {
directory: path.join(__dirname, 'public'),
},

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.59",
"platform-core": "8.1.67",
"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"
}
}
}

3
io.sc.platform.mvc.frontend/webpack.env.serve.cjs

@ -12,6 +12,9 @@ module.exports = (env)=> merge(common, mf,{
devtool: 'eval',
devServer: {
client: {
overlay: false,
},
static: {
directory: path.join(__dirname, 'public'),
},

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

@ -208,6 +208,7 @@ public class PluginManager {
for(FrontEndRoute route : routes){
FrontEndRoute item =frontEndRouteMap.get(route.getName());
if(item==null || route.getPriority()<item.getPriority()) {
route.setConfigurationFileUrl(plugin.getFileUrl());
frontEndRouteMap.put(route.getName(), route);
}
}
@ -227,7 +228,9 @@ public class PluginManager {
if(frontEndModulePlugins!=null && !frontEndModulePlugins.isEmpty()){
List<FrontEndModule> items =new ArrayList<>();
for(Plugin<FrontEndModule> plugin : frontEndModulePlugins){
items.add(plugin.getValue());
FrontEndModule frontEndModule =plugin.getValue();
frontEndModule.setConfigurationFileUrl(plugin.getFileUrl());
items.add(frontEndModule);
}
this.frontEndModules =items;
}

11
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/plugins/item/FrontEndModule.java

@ -14,6 +14,9 @@ public class FrontEndModule {
private String name;
private Set<String> components =new HashSet<String>();
private Set<String> resources =new HashSet<String>();
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public FrontEndModule() {
}
@ -77,4 +80,12 @@ public class FrontEndModule {
public void setResources(Set<String> resources) {
this.resources = resources;
}
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
}

11
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/plugins/item/FrontEndRoute.java

@ -18,6 +18,9 @@ public class FrontEndRoute {
private List<FrontEndRoute> children =new ArrayList<>();
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public String getName() {
return name;
}
@ -90,6 +93,14 @@ public class FrontEndRoute {
this.children = children;
}
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
@Override
public String toString() {
try {

40
io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/exception.properties

@ -1,26 +1,26 @@
io.sc.platform.orm.exception.CreateException=Create Failed!
io.sc.platform.orm.exception.CreateNullObjectException=Create Failed,the New Object is Null!
io.sc.platform.orm.exception.CreateNullPrimaryKeyException=Create Failed,the New Object's Primary Key is Null!
io.sc.platform.orm.exception.CreateObjectAlreadyExistsException=Create Failed,The New Object already Exists!
io.sc.platform.orm.api.exception.CreateException=Create Failed!
io.sc.platform.orm.api.exception.CreateNullObjectException=Create Failed,the New Object is Null!
io.sc.platform.orm.api.exception.CreateNullPrimaryKeyException=Create Failed,the New Object's Primary Key is Null!
io.sc.platform.orm.api.exception.CreateObjectAlreadyExistsException=Create Failed,The New Object already Exists!
io.sc.platform.orm.exception.UpdateException=Update Failed!
io.sc.platform.orm.exception.UpdateNullOldObjectPrimaryKeyException=Update Failed,the Old Object's Primary Key is Null!
io.sc.platform.orm.exception.UpdateNullNewObjectPrimaryKeyException=Update Failed,the New Object's Primary Key is Null!
io.sc.platform.orm.exception.UpdateNullNewObjectException=Update Failed,the New Object is Null!
io.sc.platform.orm.exception.UpdateOldObjectNotExistsException=Update Failed,the Old Object Not Exists!
io.sc.platform.orm.exception.UpdateObjectAlreadyExistsException=Update Failed,The New Object already Exists!
io.sc.platform.orm.api.exception.UpdateException=Update Failed!
io.sc.platform.orm.api.exception.UpdateNullOldObjectPrimaryKeyException=Update Failed,the Old Object's Primary Key is Null!
io.sc.platform.orm.api.exception.UpdateNullNewObjectPrimaryKeyException=Update Failed,the New Object's Primary Key is Null!
io.sc.platform.orm.api.exception.UpdateNullNewObjectException=Update Failed,the New Object is Null!
io.sc.platform.orm.api.exception.UpdateOldObjectNotExistsException=Update Failed,the Old Object Not Exists!
io.sc.platform.orm.api.exception.UpdateObjectAlreadyExistsException=Update Failed,The New Object already Exists!
io.sc.platform.orm.exception.DeleteException=Delete Failed!
io.sc.platform.orm.exception.DeleteObjectNotExistsException=Delete Failed,the Object will be deleted Not Exists!
io.sc.platform.orm.exception.DeleteOperateNotAllowedException=Delete Failed, the Object was reserved by system!
io.sc.platform.orm.exception.DeleteNullObjectException=Delete Failed,the Object will be deleted is Null!
io.sc.platform.orm.exception.DeleteNullPrimaryKeyCollectionException=Delete Failed,the Primary Key Collection which will be deleted is Empty!
io.sc.platform.orm.exception.DeleteNullPrimaryKeyException=Delete Failed,the Primary Key which will be deleted is Empty!
io.sc.platform.orm.api.exception.DeleteException=Delete Failed!
io.sc.platform.orm.api.exception.DeleteObjectNotExistsException=Delete Failed,the Object will be deleted Not Exists!
io.sc.platform.orm.api.exception.DeleteOperateNotAllowedException=Delete Failed, the Object was reserved by system!
io.sc.platform.orm.api.exception.DeleteNullObjectException=Delete Failed,the Object will be deleted is Null!
io.sc.platform.orm.api.exception.DeleteNullPrimaryKeyCollectionException=Delete Failed,the Primary Key Collection which will be deleted is Empty!
io.sc.platform.orm.api.exception.DeleteNullPrimaryKeyException=Delete Failed,the Primary Key which will be deleted is Empty!
io.sc.platform.orm.exception.UserRawPasswordEmptyException=Raw Password Not allow Empty!
io.sc.platform.orm.exception.UserRawPasswordNotMatchException=Raw Password Error!
io.sc.platform.orm.exception.UserNewPasswordAndConfirmNewPasswordNotMatchException=The New Password and Confirm New Password NOT same!
io.sc.platform.orm.exception.UserNewPasswordEmptyException=The New Password Not allow Empty!
io.sc.platform.orm.api.exception.UserRawPasswordEmptyException=Raw Password Not allow Empty!
io.sc.platform.orm.api.exception.UserRawPasswordNotMatchException=Raw Password Error!
io.sc.platform.orm.api.exception.UserNewPasswordAndConfirmNewPasswordNotMatchException=The New Password and Confirm New Password NOT same!
io.sc.platform.orm.api.exception.UserNewPasswordEmptyException=The New Password Not allow Empty!
io.sc.platform.core.audit.AuditLogAction.ADD=Add
io.sc.platform.core.audit.AuditLogAction.REMOVE=Remove

40
io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/exception_tw_CN.properties

@ -1,26 +1,26 @@
io.sc.platform.orm.exception.CreateException=\u65B0\u589E\u64CD\u4F5C\u5931\u6557!
io.sc.platform.orm.exception.CreateNullObjectException=\u65B0\u589E\u64CD\u4F5C\u5931\u6557,\u65B0\u589E\u5C0D\u8C61\u70BA\u7A7A!
io.sc.platform.orm.exception.CreateNullPrimaryKeyException=\u65B0\u589E\u64CD\u4F5C\u5931\u6557,\u65B0\u589E\u5C0D\u8C61\u7684\u4E3B\u9375(\u552F\u4E00\u6A19\u8B58\u65B0\u589E\u5C0D\u8C61,\u5982\u5C0D\u8C61\u7684\u540D\u7A31)\u70BA\u7A7A!
io.sc.platform.orm.exception.CreateObjectAlreadyExistsException=\u65B0\u589E\u64CD\u4F5C\u5931\u6557,\u7CFB\u7D71\u4E2D\u5DF2\u7D93\u5B58\u5728\u8A72\u5C0D\u8C61!
io.sc.platform.orm.api.exception.CreateException=\u65B0\u589E\u64CD\u4F5C\u5931\u6557!
io.sc.platform.orm.api.exception.CreateNullObjectException=\u65B0\u589E\u64CD\u4F5C\u5931\u6557,\u65B0\u589E\u5C0D\u8C61\u70BA\u7A7A!
io.sc.platform.orm.api.exception.CreateNullPrimaryKeyException=\u65B0\u589E\u64CD\u4F5C\u5931\u6557,\u65B0\u589E\u5C0D\u8C61\u7684\u4E3B\u9375(\u552F\u4E00\u6A19\u8B58\u65B0\u589E\u5C0D\u8C61,\u5982\u5C0D\u8C61\u7684\u540D\u7A31)\u70BA\u7A7A!
io.sc.platform.orm.api.exception.CreateObjectAlreadyExistsException=\u65B0\u589E\u64CD\u4F5C\u5931\u6557,\u7CFB\u7D71\u4E2D\u5DF2\u7D93\u5B58\u5728\u8A72\u5C0D\u8C61!
io.sc.platform.orm.exception.UpdateException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557!
io.sc.platform.orm.exception.UpdateNullOldObjectPrimaryKeyException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557,\u88AB\u66F4\u65B0\u5C0D\u8C61\u7684\u4E3B\u9375(\u552F\u4E00\u6A19\u8B58\u65B0\u589E\u5C0D\u8C61,\u5982\u5C0D\u8C61\u7684\u540D\u7A31)\u70BA\u7A7A!
io.sc.platform.orm.exception.UpdateNullNewObjectPrimaryKeyException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557,\u66F4\u65B0\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6A19\u8B58\u65B0\u589E\u5C0D\u8C61,\u5982\u5C0D\u8C61\u7684\u540D\u7A31)\u70BA\u7A7A!
io.sc.platform.orm.exception.UpdateNullNewObjectException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557,\u66F4\u65B0\u5BF9\u8C61\u70BA\u7A7A!
io.sc.platform.orm.exception.UpdateOldObjectNotExistsException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557,\u88AB\u66F4\u65B0\u7684\u5BF9\u8C61\u4E0D\u5B58\u5728!
io.sc.platform.orm.exception.UpdateObjectAlreadyExistsException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557,\u7CFB\u7D71\u4E2D\u5DF2\u7D93\u5B58\u5728\u8A72\u5C0D\u8C61!
io.sc.platform.orm.api.exception.UpdateException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557!
io.sc.platform.orm.api.exception.UpdateNullOldObjectPrimaryKeyException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557,\u88AB\u66F4\u65B0\u5C0D\u8C61\u7684\u4E3B\u9375(\u552F\u4E00\u6A19\u8B58\u65B0\u589E\u5C0D\u8C61,\u5982\u5C0D\u8C61\u7684\u540D\u7A31)\u70BA\u7A7A!
io.sc.platform.orm.api.exception.UpdateNullNewObjectPrimaryKeyException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557,\u66F4\u65B0\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6A19\u8B58\u65B0\u589E\u5C0D\u8C61,\u5982\u5C0D\u8C61\u7684\u540D\u7A31)\u70BA\u7A7A!
io.sc.platform.orm.api.exception.UpdateNullNewObjectException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557,\u66F4\u65B0\u5BF9\u8C61\u70BA\u7A7A!
io.sc.platform.orm.api.exception.UpdateOldObjectNotExistsException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557,\u88AB\u66F4\u65B0\u7684\u5BF9\u8C61\u4E0D\u5B58\u5728!
io.sc.platform.orm.api.exception.UpdateObjectAlreadyExistsException=\u66F4\u65B0\u64CD\u4F5C\u5931\u6557,\u7CFB\u7D71\u4E2D\u5DF2\u7D93\u5B58\u5728\u8A72\u5C0D\u8C61!
io.sc.platform.orm.exception.DeleteException=\u522A\u9664\u64CD\u4F5C\u5931\u6557!
io.sc.platform.orm.exception.DeleteObjectNotExistsException=\u522A\u9664\u64CD\u4F5C\u5931\u6557,\u88AB\u522A\u9664\u5C0D\u8C61\u4E0D\u5B58\u5728!
io.sc.platform.orm.exception.DeleteOperateNotAllowedException=\u522A\u9664\u64CD\u4F5C\u5931\u6557,\u6B64\u8A18\u9304\u70BA\u7CFB\u7D71\u4FDD\u7559\u8A18\u9304,\u7121\u6CD5\u5220\u9664!
io.sc.platform.orm.exception.DeleteNullObjectException=\u522A\u9664\u64CD\u4F5C\u5931\u6557,\u88AB\u522A\u9664\u5C0D\u8C61\u70BA\u7A7A!
io.sc.platform.orm.exception.DeleteNullPrimaryKeyCollectionException=\u522A\u9664\u64CD\u4F5C\u5931\u6557,\u88AB\u522A\u9664\u5C0D\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u96C6\u5408\u70BA\u7A7A!
io.sc.platform.orm.exception.DeleteNullPrimaryKeyException=\u522A\u9664\u64CD\u4F5C\u5931\u6557,\u88AB\u522A\u9664\u5C0D\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u7A31)\u70BA\u7A7A!
io.sc.platform.orm.api.exception.DeleteException=\u522A\u9664\u64CD\u4F5C\u5931\u6557!
io.sc.platform.orm.api.exception.DeleteObjectNotExistsException=\u522A\u9664\u64CD\u4F5C\u5931\u6557,\u88AB\u522A\u9664\u5C0D\u8C61\u4E0D\u5B58\u5728!
io.sc.platform.orm.api.exception.DeleteOperateNotAllowedException=\u522A\u9664\u64CD\u4F5C\u5931\u6557,\u6B64\u8A18\u9304\u70BA\u7CFB\u7D71\u4FDD\u7559\u8A18\u9304,\u7121\u6CD5\u5220\u9664!
io.sc.platform.orm.api.exception.DeleteNullObjectException=\u522A\u9664\u64CD\u4F5C\u5931\u6557,\u88AB\u522A\u9664\u5C0D\u8C61\u70BA\u7A7A!
io.sc.platform.orm.api.exception.DeleteNullPrimaryKeyCollectionException=\u522A\u9664\u64CD\u4F5C\u5931\u6557,\u88AB\u522A\u9664\u5C0D\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u96C6\u5408\u70BA\u7A7A!
io.sc.platform.orm.api.exception.DeleteNullPrimaryKeyException=\u522A\u9664\u64CD\u4F5C\u5931\u6557,\u88AB\u522A\u9664\u5C0D\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u7A31)\u70BA\u7A7A!
io.sc.platform.orm.exception.UserRawPasswordEmptyException=\u7528\u6236\u767B\u9304"\u539F\u5BC6\u78BC"\u4E0D\u5141\u8A31\u70BA\u7A7A!
io.sc.platform.orm.exception.UserRawPasswordNotMatchException=\u7528\u6236\u767B\u9304"\u539F\u5BC6\u78BC"\u932F\u8AA4!
io.sc.platform.orm.exception.UserNewPasswordAndConfirmNewPasswordNotMatchException=\u7528\u6236\u767B\u9304"\u65B0\u5BC6\u78BC"\u548C"\u65B0\u5BC6\u78BC\u78BA\u8A8D"\u4E0D\u4E00\u81F4!
io.sc.platform.orm.exception.UserNewPasswordEmptyException=\u7528\u6236\u767B\u9304"\u65B0\u5BC6\u78BC"\u4E0D\u5141\u8A31\u70BA\u7A7A!
io.sc.platform.orm.api.exception.UserRawPasswordEmptyException=\u7528\u6236\u767B\u9304"\u539F\u5BC6\u78BC"\u4E0D\u5141\u8A31\u70BA\u7A7A!
io.sc.platform.orm.api.exception.UserRawPasswordNotMatchException=\u7528\u6236\u767B\u9304"\u539F\u5BC6\u78BC"\u932F\u8AA4!
io.sc.platform.orm.api.exception.UserNewPasswordAndConfirmNewPasswordNotMatchException=\u7528\u6236\u767B\u9304"\u65B0\u5BC6\u78BC"\u548C"\u65B0\u5BC6\u78BC\u78BA\u8A8D"\u4E0D\u4E00\u81F4!
io.sc.platform.orm.api.exception.UserNewPasswordEmptyException=\u7528\u6236\u767B\u9304"\u65B0\u5BC6\u78BC"\u4E0D\u5141\u8A31\u70BA\u7A7A!
io.sc.platform.core.audit.AuditLogAction.ADD=\u65B0\u589E

40
io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/exception_zh_CN.properties

@ -1,26 +1,26 @@
io.sc.platform.orm.exception.CreateException=\u65B0\u589E\u64CD\u4F5C\u5931\u8D25!
io.sc.platform.orm.exception.CreateNullObjectException=\u65B0\u589E\u64CD\u4F5C\u5931\u8D25,\u65B0\u589E\u5BF9\u8C61\u4E3A\u7A7A!
io.sc.platform.orm.exception.CreateNullPrimaryKeyException=\u65B0\u589E\u64CD\u4F5C\u5931\u8D25,\u65B0\u589E\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u4E3A\u7A7A!
io.sc.platform.orm.exception.CreateObjectAlreadyExistsException=\u65B0\u589E\u64CD\u4F5C\u5931\u8D25,\u7CFB\u7EDF\u4E2D\u5DF2\u7ECF\u5B58\u5728\u8BE5\u5BF9\u8C61!
io.sc.platform.orm.api.exception.CreateException=\u65B0\u589E\u64CD\u4F5C\u5931\u8D25!
io.sc.platform.orm.api.exception.CreateNullObjectException=\u65B0\u589E\u64CD\u4F5C\u5931\u8D25,\u65B0\u589E\u5BF9\u8C61\u4E3A\u7A7A!
io.sc.platform.orm.api.exception.CreateNullPrimaryKeyException=\u65B0\u589E\u64CD\u4F5C\u5931\u8D25,\u65B0\u589E\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u4E3A\u7A7A!
io.sc.platform.orm.api.exception.CreateObjectAlreadyExistsException=\u65B0\u589E\u64CD\u4F5C\u5931\u8D25,\u7CFB\u7EDF\u4E2D\u5DF2\u7ECF\u5B58\u5728\u8BE5\u5BF9\u8C61!
io.sc.platform.orm.exception.UpdateException=\u66F4\u65B0\u64CD\u4F5C\u5931\u8D25!
io.sc.platform.orm.exception.UpdateNullOldObjectPrimaryKeyException=\u66F4\u65B0\u5931\u8D25,\u88AB\u66F4\u65B0\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u4E3A\u7A7A!
io.sc.platform.orm.exception.UpdateNullNewObjectPrimaryKeyException=\u66F4\u65B0\u5931\u8D25,\u66F4\u65B0\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u4E3A\u7A7A!
io.sc.platform.orm.exception.UpdateNullNewObjectException=\u66F4\u65B0\u5931\u8D25,\u66F4\u65B0\u5BF9\u8C61\u4E3A\u7A7A!
io.sc.platform.orm.exception.UpdateOldObjectNotExistsException=\u66F4\u65B0\u5931\u8D25,\u88AB\u66F4\u65B0\u7684\u5BF9\u8C61\u4E0D\u5B58\u5728!
io.sc.platform.orm.exception.UpdateObjectAlreadyExistsException=\u66F4\u65B0\u5931\u8D25,\u7CFB\u7EDF\u4E2D\u5DF2\u7ECF\u5B58\u5728\u8BE5\u5BF9\u8C61!
io.sc.platform.orm.api.exception.UpdateException=\u66F4\u65B0\u64CD\u4F5C\u5931\u8D25!
io.sc.platform.orm.api.exception.UpdateNullOldObjectPrimaryKeyException=\u66F4\u65B0\u5931\u8D25,\u88AB\u66F4\u65B0\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u4E3A\u7A7A!
io.sc.platform.orm.api.exception.UpdateNullNewObjectPrimaryKeyException=\u66F4\u65B0\u5931\u8D25,\u66F4\u65B0\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u4E3A\u7A7A!
io.sc.platform.orm.api.exception.UpdateNullNewObjectException=\u66F4\u65B0\u5931\u8D25,\u66F4\u65B0\u5BF9\u8C61\u4E3A\u7A7A!
io.sc.platform.orm.api.exception.UpdateOldObjectNotExistsException=\u66F4\u65B0\u5931\u8D25,\u88AB\u66F4\u65B0\u7684\u5BF9\u8C61\u4E0D\u5B58\u5728!
io.sc.platform.orm.api.exception.UpdateObjectAlreadyExistsException=\u66F4\u65B0\u5931\u8D25,\u7CFB\u7EDF\u4E2D\u5DF2\u7ECF\u5B58\u5728\u8BE5\u5BF9\u8C61!
io.sc.platform.orm.exception.DeleteException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25!
io.sc.platform.orm.exception.DeleteObjectNotExistsException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25,\u88AB\u5220\u9664\u5BF9\u8C61\u4E0D\u5B58\u5728!
io.sc.platform.orm.exception.DeleteOperateNotAllowedException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25,\u6B64\u8BB0\u5F55\u4E3A\u7CFB\u7EDF\u4FDD\u7559\u8BB0\u5F55,\u65E0\u6CD5\u5220\u9664!
io.sc.platform.orm.exception.DeleteNullObjectException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25,\u88AB\u5220\u9664\u5BF9\u8C61\u4E3A\u7A7A!
io.sc.platform.orm.exception.DeleteNullPrimaryKeyCollectionException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25,\u88AB\u5220\u9664\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u96C6\u5408\u4E3A\u7A7A!
io.sc.platform.orm.exception.DeleteNullPrimaryKeyException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25,\u88AB\u5220\u9664\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u4E3A\u7A7A!
io.sc.platform.orm.api.exception.DeleteException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25!
io.sc.platform.orm.api.exception.DeleteObjectNotExistsException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25,\u88AB\u5220\u9664\u5BF9\u8C61\u4E0D\u5B58\u5728!
io.sc.platform.orm.api.exception.DeleteOperateNotAllowedException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25,\u6B64\u8BB0\u5F55\u4E3A\u7CFB\u7EDF\u4FDD\u7559\u8BB0\u5F55,\u65E0\u6CD5\u5220\u9664!
io.sc.platform.orm.api.exception.DeleteNullObjectException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25,\u88AB\u5220\u9664\u5BF9\u8C61\u4E3A\u7A7A!
io.sc.platform.orm.api.exception.DeleteNullPrimaryKeyCollectionException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25,\u88AB\u5220\u9664\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u96C6\u5408\u4E3A\u7A7A!
io.sc.platform.orm.api.exception.DeleteNullPrimaryKeyException=\u5220\u9664\u64CD\u4F5C\u5931\u8D25,\u88AB\u5220\u9664\u5BF9\u8C61\u7684\u4E3B\u952E(\u552F\u4E00\u6807\u8BC6\u65B0\u589E\u5BF9\u8C61,\u5982\u5BF9\u8C61\u7684\u540D\u79F0)\u4E3A\u7A7A!
io.sc.platform.orm.exception.UserRawPasswordEmptyException=\u7528\u6237\u767B\u5F55"\u539F\u5BC6\u7801"\u4E0D\u5141\u8BB8\u4E3A\u7A7A!
io.sc.platform.orm.exception.UserRawPasswordNotMatchException=\u7528\u6237\u767B\u5F55"\u539F\u5BC6\u7801"\u9519\u8BEF!
io.sc.platform.orm.exception.UserNewPasswordAndConfirmNewPasswordNotMatchException=\u7528\u6237\u767B\u5F55"\u65B0\u5BC6\u7801"\u548C"\u65B0\u5BC6\u7801\u786E\u8BA4"\u4E0D\u4E00\u81F4!
io.sc.platform.orm.exception.UserNewPasswordEmptyException=\u7528\u6237\u767B\u5F55"\u65B0\u5BC6\u7801"\u4E0D\u5141\u8BB8\u4E3A\u7A7A!
io.sc.platform.orm.api.exception.UserRawPasswordEmptyException=\u7528\u6237\u767B\u5F55"\u539F\u5BC6\u7801"\u4E0D\u5141\u8BB8\u4E3A\u7A7A!
io.sc.platform.orm.api.exception.UserRawPasswordNotMatchException=\u7528\u6237\u767B\u5F55"\u539F\u5BC6\u7801"\u9519\u8BEF!
io.sc.platform.orm.api.exception.UserNewPasswordAndConfirmNewPasswordNotMatchException=\u7528\u6237\u767B\u5F55"\u65B0\u5BC6\u7801"\u548C"\u65B0\u5BC6\u7801\u786E\u8BA4"\u4E0D\u4E00\u81F4!
io.sc.platform.orm.api.exception.UserNewPasswordEmptyException=\u7528\u6237\u767B\u5F55"\u65B0\u5BC6\u7801"\u4E0D\u5141\u8BB8\u4E3A\u7A7A!
io.sc.platform.core.audit.AuditLogAction.ADD=\u65B0\u589E

5
io.sc.platform.orm/src/main/java/io/sc/platform/orm/plugins/PluginManager.java

@ -86,8 +86,9 @@ public class PluginManager {
if(repositoriesPlugins!=null && !repositoriesPlugins.isEmpty()){
List<Repository> items =new ArrayList<Repository>();
repositoriesPlugins.forEach((plugin)->{
Repository entries =plugin.getValue();
items.add(entries);
Repository repository =plugin.getValue();
repository.setConfigurationFileUrl(plugin.getFileUrl());
items.add(repository);
});
repositories =items;
}

9
io.sc.platform.orm/src/main/java/io/sc/platform/orm/plugins/item/Repository.java

@ -7,6 +7,9 @@ import java.util.List;
public class Repository {
private List<String> includes; //包含项列表
private List<String> excludes; //排除项列表
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public List<String> getIncludes() {
return includes;
@ -20,4 +23,10 @@ public class Repository {
public void setExcludes(List<String> excludes) {
this.excludes = excludes;
}
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
}

2
io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryParameter.java

@ -81,7 +81,7 @@ public class QueryParameter {
return size;
}
public void setSize(Integer size) {
this.size = size==null? 20 : size;
this.size = (size==null || size<=0)? 20 : size;
}
public List<String> getSortBy() {
return sortBy;

5
io.sc.platform.orm/src/main/resources/META-INF/platform/plugins/repositories.json

@ -1,5 +0,0 @@
{
"includes":[
]
}

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.59"
"platform-core": "8.1.67"
}
}
}

4
io.sc.platform.security/src/main/java/io/sc/platform/security/plugins/PluginManager.java

@ -65,7 +65,9 @@ public class PluginManager {
if(securityPlugins!=null && !securityPlugins.isEmpty()) {
List<Security> result =new ArrayList<Security>();
securityPlugins.forEach((plugin)->{
result.add(plugin.getValue());
Security security =plugin.getValue();
security.setConfigurationFileUrl(plugin.getFileUrl());
result.add(security);
});
securities =result;
}

11
io.sc.platform.security/src/main/java/io/sc/platform/security/plugins/item/Security.java

@ -8,6 +8,9 @@ import java.util.List;
public class Security {
private List<String> permitPatterns;
//附加属性
private String configurationFileUrl; //菜单贡献项配置文件位置
public List<String> getPermitPatterns() {
return permitPatterns;
}
@ -15,4 +18,12 @@ public class Security {
public void setPermitPatterns(List<String> permitPatterns) {
this.permitPatterns = permitPatterns;
}
public String getConfigurationFileUrl() {
return configurationFileUrl;
}
public void setConfigurationFileUrl(String configurationFileUrl) {
this.configurationFileUrl = configurationFileUrl;
}
}

2
io.sc.platform.security/src/main/resources/liquibase/PF_11.0.0_20220606__Security_DDL.xml

@ -77,7 +77,7 @@
</column>
<column name="LOGINNAME_" type="NVARCHAR(255)" remarks="登录名"/>
<column name="USERNAME_" type="NVARCHAR(255)" remarks="用户名"></column>
<column name="PASSWORD_" type="NVARCHAR(255)" remarks="登录密码"></column>
<column name="PASSWORD_" type="NVARCHAR(2000)" remarks="登录密码"></column>
<column name="DESCRIPTION_" type="NVARCHAR(255)" remarks="描述"></column>
<column name="ENABLE_" type="SMALLINT" remarks="是否可用(0:不可用,1:可用)"></column>
<column name="IS_ACCOUNT_EXPIRED_" type="SMALLINT" remarks="账户是否过期(0:没过期,1:过期)"></column>

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.61",
"platform-core": "8.1.70",
"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"
}
}
}

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

@ -17,7 +17,6 @@
"menu.system.monitor.resources" : "Resources",
"menu.system.license" : "License",
"system.role.gridTitle":"Role List",
"system.org.gridTitle":"Org Tree",
"system.announcement.gridTitle":"Announcement List",
"system.monitor.auditlog.gridTitle":"Audit Log List",
@ -33,13 +32,21 @@
"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.entity.title":"User 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.selectRoleByUserDialog.title":"Available Role List",
"system.org.grid.title":"Org Tree",
"system.menu.action.addTop":"Add Top Menu",
"system.menu.action.addChild":"Add Child Menu",

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

Loading…
Cancel
Save