Browse Source

update

main
wangshaoping 6 months ago
parent
commit
e898a9ef2c
  1. 14
      build.gradle
  2. 2
      erm.frontend/package.json
  3. 14
      erm.frontend/public/configure.js
  4. 2
      gradle.properties
  5. 2
      io.sc.engine.mv.frontend/package.json
  6. 14
      io.sc.engine.mv.frontend/public/configure.js
  7. 10
      io.sc.engine.mv.frontend/src/views/sample/Sample.vue
  8. 2
      io.sc.engine.rule.frontend/package.json
  9. 14
      io.sc.engine.rule.frontend/public/configure.js
  10. 2
      io.sc.engine.st.frontend/package.json
  11. 14
      io.sc.engine.st.frontend/public/configure.js
  12. 2
      io.sc.platform.core.frontend/package.json
  13. 14
      io.sc.platform.core.frontend/public/configure.js
  14. 5
      io.sc.platform.core.frontend/src/platform/PConst.ts
  15. 3
      io.sc.platform.core.frontend/src/platform/index.ts
  16. 164
      io.sc.platform.core.frontend/src/platform/plugin/axios copy.ts
  17. 16
      io.sc.platform.core.frontend/src/platform/plugin/environment/index.ts
  18. 3
      io.sc.platform.core.frontend/src/platform/plugin/index.ts
  19. 40
      io.sc.platform.core.frontend/src/platform/plugin/manager/ApplicationInitializer.ts
  20. 88
      io.sc.platform.core.frontend/src/platform/plugin/manager/RouterManager.ts
  21. 3
      io.sc.platform.core.frontend/src/platform/plugin/manager/index.ts
  22. 10
      io.sc.platform.core.frontend/src/platform/plugin/router.ts
  23. 16
      io.sc.platform.core.frontend/src/platform/utils/JavascriptLoader.ts
  24. 11
      io.sc.platform.core.frontend/src/platform/views/Login.vue
  25. 4
      io.sc.platform.core.frontend/template-project/package.json
  26. 14
      io.sc.platform.core.frontend/template-project/public/configure.js
  27. 2
      io.sc.platform.developer.frontend/package.json
  28. 14
      io.sc.platform.developer.frontend/public/configure.js
  29. 16
      io.sc.platform.gradle/templates/pgp/setup/build.gradle.txt
  30. 2
      io.sc.platform.gradle/templates/pgp/setup/gradle.properties
  31. 2
      io.sc.platform.gradle/templates/pgp/setup/gradle/wrapper/gradle-wrapper.properties
  32. 20
      io.sc.platform.gradle/templates/pgp/setup/gradlew.bat
  33. 2
      io.sc.platform.lcdp.frontend/package.json
  34. 14
      io.sc.platform.lcdp.frontend/public/configure.js
  35. 2
      io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/controller/ConfigureController.java
  36. 12
      io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/controller/ConfigureJsController.java
  37. 2
      io.sc.platform.mvc.frontend/package.json
  38. 14
      io.sc.platform.mvc.frontend/public/configure.js
  39. 19
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/FrontendController.java
  40. 10
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/IndexWebController.java
  41. 3
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/service/FrontEndService.java
  42. 20
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/service/impl/FrontEndServiceImpl.java
  43. 18
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/service/impl/FrontendExportServiceImpl.java
  44. 2
      io.sc.platform.mvc/src/main/resources/META-INF/platform/plugins/security.json
  45. 11
      io.sc.platform.mvc/src/main/resources/templates/configure.js
  46. 2
      io.sc.platform.scheduler.manager.frontend/package.json
  47. 14
      io.sc.platform.scheduler.manager.frontend/public/configure.js
  48. 4
      io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/filter/JwtUsernamePasswordAuthenticationFilter.java
  49. 72
      io.sc.platform.security/src/main/java/io/sc/platform/security/installer/AdministratorInstallerItem.java
  50. 2
      io.sc.platform.system.frontend/package.json
  51. 14
      io.sc.platform.system.frontend/public/configure.js
  52. 5
      io.sc.platform.system/src/main/java/io/sc/platform/system/user/service/impl/UserServiceImpl.java
  53. 15
      io.sc.platform.system/src/main/java/io/sc/platform/system/user/service/support/UserSession.java
  54. 2
      io.sc.standard.frontend/package.json
  55. 14
      io.sc.standard.frontend/public/configure.js

14
build.gradle

@ -684,13 +684,13 @@ subprojects {
if(isFrontendProject(file('.'))) { if(isFrontendProject(file('.'))) {
if(project.name!='io.sc.platform.mvc.frontend'){ if(project.name!='io.sc.platform.mvc.frontend'){
exclude("**/${project.name}/*.*"); exclude("**/${project.name}/*.*");
exclude("**/${project.name}/javascript/codemirror.*"); // exclude("**/${project.name}/javascript/codemirror.*");
exclude("**/${project.name}/javascript/echarts.*"); // exclude("**/${project.name}/javascript/echarts.*");
exclude("**/${project.name}/javascript/platform-core.*"); // exclude("**/${project.name}/javascript/platform-core.*");
exclude("**/${project.name}/javascript/quasar.*"); // exclude("**/${project.name}/javascript/quasar.*");
exclude("**/${project.name}/javascript/vue.*"); // exclude("**/${project.name}/javascript/vue.*");
exclude("**/${project.name}/fonts/*.*"); // exclude("**/${project.name}/fonts/*.*");
exclude("**/${project.name}/webjars/**/*.*"); // exclude("**/${project.name}/webjars/**/*.*");
} }
} }
} }

2
erm.frontend/package.json

@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.295", "platform-core": "8.1.301",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

14
erm.frontend/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

2
gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc platform_group=io.sc
platform_version=8.1.46 platform_version=8.1.46
platform_plugin_version=8.1.46 platform_plugin_version=8.1.46
platform_core_frontend_version=8.1.295 platform_core_frontend_version=8.1.301
########################################################### ###########################################################
# dependencies version # dependencies version

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

@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.295", "platform-core": "8.1.301",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

14
io.sc.engine.mv.frontend/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

10
io.sc.engine.mv.frontend/src/views/sample/Sample.vue

@ -25,9 +25,9 @@
icon: 'bi-arrow-right-circle', icon: 'bi-arrow-right-circle',
click: () => { click: () => {
DialogManager.confirm($t('io.sc.engine.mv.sample.action.importExampleSample.tip'), () => { DialogManager.confirm($t('io.sc.engine.mv.sample.action.importExampleSample.tip'), () => {
axios.post(Environment.apiContextPath('/api/mv/sample/importExampleSample')).then(() => { axios.post(Environment.apiContextPath('/api/mv/sample/importExampleSample'), {}, { loading: true }).then(() => {
scoreRecordGridRef.refresh(); scoreRecordGridRef?.refresh();
defaultRecordGridRef.refresh(); defaultRecordGridRef?.refresh();
}); });
}); });
}, },
@ -39,8 +39,8 @@
click: () => { click: () => {
DialogManager.confirm($t('io.sc.engine.mv.sample.action.removeAllSample.tip'), () => { DialogManager.confirm($t('io.sc.engine.mv.sample.action.removeAllSample.tip'), () => {
axios.post(Environment.apiContextPath('/api/mv/sample/removeAllSample')).then(() => { axios.post(Environment.apiContextPath('/api/mv/sample/removeAllSample')).then(() => {
scoreRecordGridRef.refresh(); scoreRecordGridRef?.refresh();
defaultRecordGridRef.refresh(); defaultRecordGridRef?.refresh();
}); });
}); });
}, },

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

@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.295", "platform-core": "8.1.301",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

14
io.sc.engine.rule.frontend/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

2
io.sc.engine.st.frontend/package.json

@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.295", "platform-core": "8.1.301",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

14
io.sc.engine.st.frontend/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

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

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

14
io.sc.platform.core.frontend/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

5
io.sc.platform.core.frontend/src/platform/PConst.ts

@ -59,6 +59,11 @@ class PConst {
*/ */
static API_I18N_MESSAGES_URL: string = '/api/mvc/i18n/getI18nMessages'; static API_I18N_MESSAGES_URL: string = '/api/mvc/i18n/getI18nMessages';
/**
* API URL
*/
static API_REMOTE_ENTRY_URL: string = '/api/mvc/frontend/getRemoteEntries';
/** /**
* API URL * API URL
*/ */

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

@ -79,6 +79,7 @@ export { router } from './plugin';
*/ */
export { Environment } from './plugin'; export { Environment } from './plugin';
export { ApplicationInitializer } from './plugin'; export { ApplicationInitializer } from './plugin';
export { AuthenticationManager } from './plugin';
export { ComponentManager } from './plugin'; export { ComponentManager } from './plugin';
export { ConfigureManager } from './plugin'; export { ConfigureManager } from './plugin';
export { DialogManager } from './plugin'; export { DialogManager } from './plugin';
@ -86,7 +87,7 @@ export { I18nMessageManager } from './plugin';
export { MenuManager } from './plugin'; export { MenuManager } from './plugin';
export { MockManager } from './plugin'; export { MockManager } from './plugin';
export { NotifyManager } from './plugin'; export { NotifyManager } from './plugin';
export { AuthenticationManager } from './plugin'; export { RemoteEntryManager } from './plugin';
export { RouterManager } from './plugin'; export { RouterManager } from './plugin';
export { SessionManager } from './plugin'; export { SessionManager } from './plugin';
export { TagViewManager } from './plugin'; export { TagViewManager } from './plugin';

164
io.sc.platform.core.frontend/src/platform/plugin/axios copy.ts

@ -1,164 +0,0 @@
import type { App } from 'vue';
import Axios from 'axios';
import { i18n } from './i18n';
import { PConst } from '@/platform/PConst';
import { Environment } from '@/platform/plugin/environment';
import { NotifyManager, Oauth2Manager } from './manager';
import { QuasarTools } from '@/platform/utils';
const ignoredUrls: string[] = [PConst.API_I18N_MESSAGES_URL, PConst.API_APP_CONFIGURE_URL];
const gc = Environment.getConfigure();
// 请求拦截器
const requestInterceptor = (config: any) => {
config.headers.locale = gc.setting.i18n.locale;
// 忽略无需认证的请求 URL
for (const url of ignoredUrls) {
if (config.url.includes(url)) {
return config;
}
}
const result = config;
result.headers.Authorization = 'Bearer ' + Oauth2Manager.getLocalAccessToken();
/*
// 对于需要认证的请求 URL 添加 basic 认证
const result = config;
if (gc.axios?.basicAuth?.enable) {
result.headers.Authorization = 'Basic ' + window.btoa(gc.axios.basicAuth.username + ':' + gc.axios.basicAuth.password);
}
*/
// 如果请求时传入 { loading: true } 属性, 则自动显示 "正在处理..., 请等待" 模态对话框
if (config?.loading) {
QuasarTools.getQuasar()?.loading?.show({
message: i18n.global.t('loading'),
boxClass: 'bg-grey-2 text-grey-9',
spinnerColor: 'primary',
});
}
return result;
};
// 请求错误拦截器
const requestErrorInterceptor = (error: any) => {
return Promise.reject(error);
};
// 响应拦截器
const responseInterceptor = (response: any) => {
// 请求成功, 进入该方法说明 response 的状态码为 2xx
QuasarTools.getQuasar()?.loading?.hide();
return response.data;
};
// 响应错误拦截器
const responseErrorInterceptor = (error: any) => {
QuasarTools.getQuasar()?.loading?.hide();
// 请求失败, 进入该方法说明 response 的状态码不为 2xx
if (error.code === 'ECONNABORTED' || error.message.indexOf('timeout') !== -1 || error.message === 'Network Error') {
// 发生网络错误
const $t = i18n.global.t;
NotifyManager.error($t('NetworkError'));
return Promise.reject({
code: 'NetworkError',
errorMessageI18nKey: 'NetworkError',
errorMessage: error.message,
exception: 'NetworkError',
stackTrace: error.stack,
data: null,
});
} else {
// 服务器端错误
const response = error?.response;
const status = response?.status;
const data = response?.data;
if (status === 401) {
if (Oauth2Manager.isAuthorizationCodeRedirectUri()) {
return Promise.resolve({});
} else {
if (gc.oauth2) {
let url = '/oauth2/authorize?';
url += 'client_id=' + gc.oauth2.clientId;
url += '&client_secret=' + gc.oauth2.clientSecret;
url += '&response_type=code';
url += '&redirect_uri=' + encodeURIComponent(gc.oauth2.redirectUri);
window.location.href = Environment.apiContextPath(url);
}
}
return;
}
//下载错误
if (error.request.responseType === 'blob') {
NotifyManager.error(i18n.global.t(error?.code));
return Promise.reject(error);
}
//其他错误
if (status === 500) {
NotifyManager.error(i18n.global.t(data?.errorMessageI18nKey));
return Promise.reject(response.data);
} else {
NotifyManager.error(i18n.global.t(status));
return Promise.reject({
code: status,
errorMessageI18nKey: status,
errorMessage: error.message,
exception: error.code,
stackTrace: error.stack,
data: null,
});
}
}
};
// 普通 axios
const axios = Axios.create({
baseURL: gc.axios?.baseURL || '',
timeout: gc.axios?.timeout || 1000 * 60,
});
axios.interceptors.request.use(requestInterceptor, requestErrorInterceptor);
axios.interceptors.response.use(responseInterceptor, responseErrorInterceptor);
// 无默认服务器端错误处理的 axios
const noErrorAxios = Axios.create({
baseURL: gc.axios?.baseURL || '',
timeout: gc.axios?.timeout || 1000 * 60,
});
noErrorAxios.interceptors.request.use(requestInterceptor, requestErrorInterceptor);
noErrorAxios.interceptors.response.use(responseInterceptor, (error: any) => {
QuasarTools.getQuasar()?.loading?.hide();
// 请求失败, 进入该方法说明 response 的状态码不为 2xx
if (error.code === 'ECONNABORTED' || error.message.indexOf('timeout') !== -1 || error.message === 'Network Error') {
// 发生网络错误
const $t = i18n.global.t;
NotifyManager.error($t('NetworkError'));
return Promise.reject({
code: 'NetworkError',
errorMessageI18nKey: 'NetworkError',
errorMessage: error.message,
exception: 'NetworkError',
stackTrace: error.stack,
data: null,
});
} else {
return Promise.reject(error);
}
});
// 下载二进制 axios
const blobAxios = Axios.create({
baseURL: gc.axios?.baseURL || '',
timeout: gc.axios?.timeout || 1000 * 60,
});
blobAxios.interceptors.request.use(requestInterceptor, requestErrorInterceptor);
blobAxios.interceptors.response.use((response: any) => {
QuasarTools.getQuasar()?.loading?.hide();
return response;
}, responseErrorInterceptor);
export default {
install: (app: App) => {
app.config.globalProperties.$axios = axios;
app.config.globalProperties.$blobAxios = blobAxios;
},
};
export { axios, blobAxios, noErrorAxios };

16
io.sc.platform.core.frontend/src/platform/plugin/environment/index.ts

@ -69,6 +69,22 @@ class Environment {
*/ */
static #layoutProviderMap = new Map<string, ILayoutProvider>(); static #layoutProviderMap = new Map<string, ILayoutProvider>();
/**
*
* @returns
*/
public static isAloneFrontend() {
return window[PConst.APP][PConst.CONFIGURE].isAloneFrontend;
}
/**
*
* @returns
*/
public static getRemoteEntries() {
return window[PConst.APP][PConst.CONFIGURE].remoteEntries;
}
/** /**
* router * router
* @returns router * @returns router

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

@ -23,6 +23,7 @@ export { router } from './router';
export { Environment } from './environment'; export { Environment } from './environment';
export { ApplicationInitializer } from './manager'; export { ApplicationInitializer } from './manager';
export { AuthenticationManager } from './manager';
export { ComponentManager } from './manager'; export { ComponentManager } from './manager';
export { ConfigureManager } from './manager'; export { ConfigureManager } from './manager';
export { DialogManager } from './manager'; export { DialogManager } from './manager';
@ -30,7 +31,7 @@ export { I18nMessageManager } from './manager';
export { MenuManager } from './manager'; export { MenuManager } from './manager';
export { MockManager } from './manager'; export { MockManager } from './manager';
export { NotifyManager } from './manager'; export { NotifyManager } from './manager';
export { AuthenticationManager } from './manager'; export { RemoteEntryManager } from './manager';
export { RouterManager } from './manager'; export { RouterManager } from './manager';
export { SessionManager } from './manager'; export { SessionManager } from './manager';
export { TagViewManager } from './manager'; export { TagViewManager } from './manager';

40
io.sc.platform.core.frontend/src/platform/plugin/manager/ApplicationInitializer.ts

@ -3,17 +3,19 @@ import { toRaw } from 'vue';
import { PConst } from '@/platform/PConst'; import { PConst } from '@/platform/PConst';
import { Environment } from '@/platform/plugin/environment'; import { Environment } from '@/platform/plugin/environment';
import { import {
AuthenticationManager,
ComponentManager, ComponentManager,
MockManager,
ConfigureManager, ConfigureManager,
SessionManager,
I18nMessageManager, I18nMessageManager,
NotifyManager,
MenuManager, MenuManager,
MockManager,
NotifyManager,
RemoteEntryManager,
RouterManager, RouterManager,
SessionManager,
} from '@/platform/plugin/manager'; } from '@/platform/plugin/manager';
import { router } from '@/platform/plugin'; import { router } from '@/platform/plugin';
import { Tools, JavascriptLoader } from '@/platform/utils'; import { Tools } from '@/platform/utils';
const gc = Environment.getConfigure(); const gc = Environment.getConfigure();
@ -42,14 +44,7 @@ class ApplicationInitializer {
I18nMessageManager.setLocalI18nMessages(parameter.localI18nMessages); I18nMessageManager.setLocalI18nMessages(parameter.localI18nMessages);
await I18nMessageManager.changeLanguage(gc.setting.i18n.locale as I18nMessageLocaleType, false); await I18nMessageManager.changeLanguage(gc.setting.i18n.locale as I18nMessageLocaleType, false);
// Oauth2 鉴权 // 构建初始路由
// if (Oauth2Manager.isAuthorizationCodeRedirectUri()) {
// Oauth2Manager.loadTokens(() => {
// window.location.href = Environment.getWebContextPath();
// });
// return;
// }
RouterManager.buildRoutes(); RouterManager.buildRoutes();
// 获取用户会话 // 获取用户会话
@ -70,21 +65,14 @@ class ApplicationInitializer {
RouterManager.setLocalRoutes(parameter.localRoutes); RouterManager.setLocalRoutes(parameter.localRoutes);
RouterManager.buildRoutes(toRaw(userSession.routes)); RouterManager.buildRoutes(toRaw(userSession.routes));
// 动态加载远程组件入口 JS 文件 // 加载远程入口
SessionManager.setRemoteEntries(userSession.remoteEntries); RemoteEntryManager.loadRemoteEntries(parameter.callback);
const urls: string[] = SessionManager.getRemoteEntryUrls();
if (urls && urls.length > 0) {
console.debug('Loading remote entry ...', urls);
const loader = new JavascriptLoader((errorUrl) => {
parameter.callback();
});
loader.load(urls);
} else {
parameter.callback();
}
} else { } else {
parameter.callback(); // 加载远程入口
router.push({ name: 'login' }); RemoteEntryManager.loadRemoteEntries(() => {
parameter.callback();
router.push({ name: 'login' });
});
} }
} }

88
io.sc.platform.core.frontend/src/platform/plugin/manager/RouterManager.ts

@ -120,8 +120,10 @@ class RouterManager {
* @param priority * @param priority
*/ */
private static setRoutesPriority(objects: object[] = [], priority: number) { private static setRoutesPriority(objects: object[] = [], priority: number) {
for (const route of objects) { if (objects && objects.length > 0) {
route['priority'] = priority; for (const route of objects) {
route['priority'] = priority;
}
} }
} }
@ -131,14 +133,16 @@ class RouterManager {
* @param objects * @param objects
*/ */
private static mergeRoutes(map: Map<string, object>, objects: object[] = []) { private static mergeRoutes(map: Map<string, object>, objects: object[] = []) {
for (const route of objects) { if (objects && objects.length > 0) {
const cachedRoute = map.get(route['name']); for (const route of objects) {
if (cachedRoute) { const cachedRoute = map.get(route['name']);
if (route['priority'] < cachedRoute['priority']) { if (cachedRoute) {
if (route['priority'] < cachedRoute['priority']) {
map.set(route['name'], route);
}
} else {
map.set(route['name'], route); map.set(route['name'], route);
} }
} else {
map.set(route['name'], route);
} }
} }
} }
@ -149,40 +153,42 @@ class RouterManager {
* @param objects * @param objects
*/ */
private static createRoutes(array: object[], objects: object[] = [], cache: Map<string, object>, type: string) { private static createRoutes(array: object[], objects: object[] = [], cache: Map<string, object>, type: string) {
for (const route of objects) { if (objects && objects.length > 0) {
const cachedRoute = cache.get(route['name']); for (const route of objects) {
if (cachedRoute) { const cachedRoute = cache.get(route['name']);
if (type === 'frontend-default') { if (cachedRoute) {
array.push({ if (type === 'frontend-default') {
parent: cachedRoute['parent'], array.push({
name: cachedRoute['name'], parent: cachedRoute['parent'],
path: cachedRoute['path'], name: cachedRoute['name'],
icon: cachedRoute['icon'], path: cachedRoute['path'],
component: cachedRoute['component'], icon: cachedRoute['icon'],
redirect: cachedRoute['redirect'], component: cachedRoute['component'],
children: cachedRoute['children'], redirect: cachedRoute['redirect'],
}); children: cachedRoute['children'],
} else if (type === 'frontend-local') { });
array.push({ } else if (type === 'frontend-local') {
parent: cachedRoute['parent'], array.push({
name: cachedRoute['name'], parent: cachedRoute['parent'],
path: cachedRoute['path'], name: cachedRoute['name'],
icon: cachedRoute['icon'], path: cachedRoute['path'],
component: ComponentManager.getLocalComponent(cachedRoute['component']), icon: cachedRoute['icon'],
redirect: cachedRoute['redirect'], component: ComponentManager.getLocalComponent(cachedRoute['component']),
children: cachedRoute['children'], redirect: cachedRoute['redirect'],
}); children: cachedRoute['children'],
} else { });
array.push({ } else {
parent: cachedRoute['parent'], array.push({
name: cachedRoute['name'], parent: cachedRoute['parent'],
path: cachedRoute['path'], name: cachedRoute['name'],
component: ComponentManager.getRemoteComponent(cachedRoute['module'], cachedRoute['component']), path: cachedRoute['path'],
redirect: cachedRoute['redirect'], component: ComponentManager.getRemoteComponent(cachedRoute['module'], cachedRoute['component']),
children: cachedRoute['children'], redirect: cachedRoute['redirect'],
}); children: cachedRoute['children'],
});
}
cache.delete(cachedRoute['name']);
} }
cache.delete(cachedRoute['name']);
} }
} }
} }

3
io.sc.platform.core.frontend/src/platform/plugin/manager/index.ts

@ -1,4 +1,5 @@
export { ApplicationInitializer } from './ApplicationInitializer'; export { ApplicationInitializer } from './ApplicationInitializer';
export { AuthenticationManager } from './AuthenticationManager';
export { ComponentManager } from './ComponentManager'; export { ComponentManager } from './ComponentManager';
export { ConfigureManager } from './ConfigureManager'; export { ConfigureManager } from './ConfigureManager';
export { DialogManager } from './DialogManager'; export { DialogManager } from './DialogManager';
@ -6,7 +7,7 @@ export { I18nMessageManager } from './I18nMessageManager';
export { MenuManager } from './MenuManager'; export { MenuManager } from './MenuManager';
export { MockManager } from './MockManager'; export { MockManager } from './MockManager';
export { NotifyManager } from './NotifyManager'; export { NotifyManager } from './NotifyManager';
export { AuthenticationManager } from './AuthenticationManager'; export { RemoteEntryManager } from './RemoteEntryManager';
export { RouterManager } from './RouterManager'; export { RouterManager } from './RouterManager';
export { SessionManager } from './SessionManager'; export { SessionManager } from './SessionManager';
export { TagViewManager } from './TagViewManager'; export { TagViewManager } from './TagViewManager';

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

@ -6,7 +6,6 @@ import { AuthenticationManager, TagViewManager } from './manager';
import WBasicLayout from '@/platform/layout/WBasicLayout.vue'; import WBasicLayout from '@/platform/layout/WBasicLayout.vue';
import Login from '@/platform/views/Login.vue'; import Login from '@/platform/views/Login.vue';
import Home from '@/platform/views/Home.vue'; import Home from '@/platform/views/Home.vue';
import Oauth2 from '@/platform/views/Oauth2.vue';
import P404 from '@/platform/views/404.vue'; import P404 from '@/platform/views/404.vue';
const gc = Environment.getConfigure(); const gc = Environment.getConfigure();
@ -39,12 +38,6 @@ const PLATFORM_ROUTES = [
path: '/home', path: '/home',
component: Home, component: Home,
}, },
{
parent: '/',
name: 'oauth2',
path: '/oauth2',
component: Oauth2,
},
{ {
parent: '/', parent: '/',
name: '404', name: '404',
@ -80,7 +73,8 @@ router.beforeEach(async (to: any, from: any, next: any) => {
next(); next();
} else { } else {
//导航到登录页面 //导航到登录页面
next({ name: 'login' }); //next({ name: 'login' });
Environment.executeAction('openLoginDialog');
} }
} }
}); });

16
io.sc.platform.core.frontend/src/platform/utils/JavascriptLoader.ts

@ -9,13 +9,15 @@ class JavascriptLoader {
} }
public load(urls: string[]) { public load(urls: string[]) {
for (const url of urls) { if (urls && urls.length > 0) {
const element = document.createElement('script'); for (const url of urls) {
element.src = url; const element = document.createElement('script');
element.onerror = this.onerror.bind(this, url); element.src = url;
element.onload = this.onload.bind(this, url); element.onerror = this.onerror.bind(this, url);
this.#urlMap.set(url, element); element.onload = this.onload.bind(this, url);
document.head.appendChild(element); this.#urlMap.set(url, element);
document.head.appendChild(element);
}
} }
} }

11
io.sc.platform.core.frontend/src/platform/views/Login.vue

@ -224,6 +224,8 @@ const loginFormSubmit = (event) => {
// 访 // 访
AuthenticationManager.setLocalAccessToken(response.data?.data); AuthenticationManager.setLocalAccessToken(response.data?.data);
// window.location.href = Environment.getWebContextPath();
// , // ,
SessionManager.loadUserSession().then((userSession) => { SessionManager.loadUserSession().then((userSession) => {
if (userSession) { if (userSession) {
@ -241,15 +243,6 @@ const loginFormSubmit = (event) => {
SessionManager.setRoutes(userSession.routes); SessionManager.setRoutes(userSession.routes);
RouterManager.setLocalRoutes(parameter.localRoutes); RouterManager.setLocalRoutes(parameter.localRoutes);
RouterManager.buildRoutes(toRaw(userSession.routes)); RouterManager.buildRoutes(toRaw(userSession.routes));
// JS
SessionManager.setRemoteEntries(userSession.remoteEntries);
const urls: string[] = SessionManager.getRemoteEntryUrls();
if (urls && urls.length > 0) {
console.debug('Loading remote entry ...', urls);
const loader = new JavascriptLoader(() => {});
loader.load(urls);
}
} }
router.push('/'); router.push('/');
}); });

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

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.1.295", "version": "8.1.301",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -104,7 +104,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.295", "platform-core": "8.1.301",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

14
io.sc.platform.core.frontend/template-project/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

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

@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.295", "platform-core": "8.1.301",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

14
io.sc.platform.developer.frontend/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

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

@ -684,13 +684,13 @@ subprojects {
if(isFrontendProject(file('.'))) { if(isFrontendProject(file('.'))) {
if(project.name!='io.sc.platform.mvc.frontend'){ if(project.name!='io.sc.platform.mvc.frontend'){
exclude("**/${project.name}/*.*"); exclude("**/${project.name}/*.*");
exclude("**/${project.name}/javascript/codemirror.*"); // exclude("**/${project.name}/javascript/codemirror.*");
exclude("**/${project.name}/javascript/echarts.*"); // exclude("**/${project.name}/javascript/echarts.*");
exclude("**/${project.name}/javascript/platform-core.*"); // exclude("**/${project.name}/javascript/platform-core.*");
exclude("**/${project.name}/javascript/quasar.*"); // exclude("**/${project.name}/javascript/quasar.*");
exclude("**/${project.name}/javascript/vue.*"); // exclude("**/${project.name}/javascript/vue.*");
exclude("**/${project.name}/fonts/*.*"); // exclude("**/${project.name}/fonts/*.*");
exclude("**/${project.name}/webjars/**/*.*"); // exclude("**/${project.name}/webjars/**/*.*");
} }
} }
} }
@ -850,5 +850,5 @@ task github {
} }
tasks.named('wrapper') { tasks.named('wrapper') {
distributionUrl = "http://nexus.sc.io:8000/repository/maven-releases/gradle/gradle/${gradleVersion}/gradle-${gradleVersion}.zip" distributionUrl = "http://nexus.sc.io:8000/repository/maven-releases/gradle/gradle/${gradleVersion}/gradle-${gradleVersion}-bin.zip"
} }

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

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc platform_group=io.sc
platform_version=8.1.46 platform_version=8.1.46
platform_plugin_version=8.1.46 platform_plugin_version=8.1.46
platform_core_frontend_version=8.1.295 platform_core_frontend_version=8.1.301
########################################################### ###########################################################
# dependencies version # dependencies version

2
io.sc.platform.gradle/templates/pgp/setup/gradle/wrapper/gradle-wrapper.properties

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=http\://nexus.sc.io\:8000/repository/maven-releases/gradle/gradle/8.4/gradle-8.5.zip distributionUrl=http\://nexus.sc.io\:8000/repository/maven-releases/gradle/gradle/8.7/gradle-8.7-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

20
io.sc.platform.gradle/templates/pgp/setup/gradlew.bat

@ -43,11 +43,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute if %ERRORLEVEL% equ 0 goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute if exist "%JAVA_EXE%" goto execute
echo. echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail

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

@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.295", "platform-core": "8.1.301",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

14
io.sc.platform.lcdp.frontend/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

2
io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/controller/ConfigureController.java

@ -17,7 +17,7 @@ public class ConfigureController extends RestCrudController<ConfigureVo, Configu
} }
@PostMapping("activeConfigure/{id}") @PostMapping("activeConfigure/{id}")
public void setActiveConfigure(@PathVariable(name="id")String id){ public void activeConfigure(@PathVariable(name="id")String id){
service.activeConfigure(id); service.activeConfigure(id);
} }
} }

12
io.sc.platform.lcdp/src/main/java/io/sc/platform/lcdp/configure/controller/ConfigureJsController.java

@ -1,12 +0,0 @@
package io.sc.platform.lcdp.configure.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ConfigureJsController {
@RequestMapping("/configure.js")
public String configureJs(){
return "configure.js";
}
}

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

@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.295", "platform-core": "8.1.301",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

14
io.sc.platform.mvc.frontend/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

19
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/FrontendModuleController.java → io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/FrontendController.java

@ -7,27 +7,40 @@ import io.sc.platform.mvc.service.FrontendExportService;
import io.sc.platform.mvc.support.ExportFileInfo; import io.sc.platform.mvc.support.ExportFileInfo;
import io.sc.platform.mvc.support.FrontendExportParam; import io.sc.platform.mvc.support.FrontendExportParam;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.ResponseBody;
@RestController import javax.servlet.http.HttpServletRequest;
public class FrontendModuleController { import java.util.Map;
@Controller
public class FrontendController {
@Autowired private FrontEndService frontEndService; @Autowired private FrontEndService frontEndService;
@Autowired private FrontendExportService frontEndExportService; @Autowired private FrontendExportService frontEndExportService;
@GetMapping("/api/mvc/frontend/getRemoteEntries")
@ResponseBody
public Map<String,String> getRemoteEntries(HttpServletRequest request) throws Exception{
return frontEndService.getRemoteEntries(request);
}
@GetMapping("/api/mvc/frontend/getApplicationName") @GetMapping("/api/mvc/frontend/getApplicationName")
@ResponseBody
public String getApplicationName() throws Exception{ public String getApplicationName() throws Exception{
return Environment.getInstance().getApplicationName(); return Environment.getInstance().getApplicationName();
} }
@PostMapping("/api/mvc/frontend/regist") @PostMapping("/api/mvc/frontend/regist")
@ResponseBody
public void regist(@RequestBody FrontEndModule frontEndModule){ public void regist(@RequestBody FrontEndModule frontEndModule){
frontEndService.regist(frontEndModule); frontEndService.regist(frontEndModule);
} }
@PostMapping("/api/mvc/frontend/export") @PostMapping("/api/mvc/frontend/export")
@ResponseBody
public ExportFileInfo export(@RequestBody FrontendExportParam param) throws Exception{ public ExportFileInfo export(@RequestBody FrontendExportParam param) throws Exception{
return frontEndExportService.export(param); return frontEndExportService.export(param);
} }

10
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/IndexWebController.java

@ -4,17 +4,20 @@ import io.sc.platform.mvc.service.FrontEndService;
import io.sc.platform.mvc.service.SystemParameterService; import io.sc.platform.mvc.service.SystemParameterService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; 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.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/** /**
* 系统首页控制器 * 系统首页控制器
*/ */
@Controller @Controller
@RequestMapping
public class IndexWebController { public class IndexWebController {
@Autowired private FrontEndService frontEndService;
@Autowired private SystemParameterService systemParameterService; @Autowired private SystemParameterService systemParameterService;
@RequestMapping(value={"","/","index.html"}) @RequestMapping(value={"","/","index.html"})
@ -22,4 +25,9 @@ public class IndexWebController {
ModelAndView mv =new ModelAndView("io.sc.platform.mvc.frontend.html"); ModelAndView mv =new ModelAndView("io.sc.platform.mvc.frontend.html");
return mv; return mv;
} }
@GetMapping("/configure.js")
public String configureJs(){
return "configure.js";
}
} }

3
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/service/FrontEndService.java

@ -14,5 +14,8 @@ public interface FrontEndService {
* @return 所有远程前端模块的入口 * @return 所有远程前端模块的入口
*/ */
public Map<String,String> getRemoteEntries(HttpServletRequest request); public Map<String,String> getRemoteEntries(HttpServletRequest request);
public Map<String,String> getRemoteEntries();
public void regist(FrontEndModule frontEndModule); public void regist(FrontEndModule frontEndModule);
} }

20
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/service/impl/FrontEndServiceImpl.java

@ -15,6 +15,7 @@ import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -56,7 +57,6 @@ public class FrontEndServiceImpl implements FrontEndService {
Map<String,String> result =new HashMap<>(); Map<String,String> result =new HashMap<>();
for (Map.Entry<String,FrontEndModule> entry : localFrontEndModuleMap.entrySet()) { for (Map.Entry<String,FrontEndModule> entry : localFrontEndModuleMap.entrySet()) {
if(entry.getValue().getComponents().size()>0) { if(entry.getValue().getComponents().size()>0) {
result.put(entry.getKey(), getRemoteEntry(entry.getValue(), request)); result.put(entry.getKey(), getRemoteEntry(entry.getValue(), request));
} }
} }
@ -68,6 +68,24 @@ public class FrontEndServiceImpl implements FrontEndService {
return result; return result;
} }
@Override
public Map<String, String> getRemoteEntries() {
Map<String,String> result =new HashMap<>();
for (Map.Entry<String,FrontEndModule> entry : localFrontEndModuleMap.entrySet()) {
FrontEndModule value =entry.getValue();
if(value.getComponents().size()>0) {
result.put(entry.getKey(), value.getName() + "/javascript/remoteEntry.js");
}
}
for (Map.Entry<String,FrontEndModule> entry : remoteFrontEndModuleCache.asMap().entrySet()) {
FrontEndModule value =entry.getValue();
if(value.getComponents().size()>0) {
result.put(entry.getKey(), value.getName() + "/javascript/remoteEntry.js");
}
}
return result;
}
@Override @Override
public void regist(FrontEndModule frontEndModule) { public void regist(FrontEndModule frontEndModule) {
remoteFrontEndModuleCache.put(frontEndModule.getName(),frontEndModule); remoteFrontEndModuleCache.put(frontEndModule.getName(),frontEndModule);

18
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/service/impl/FrontendExportServiceImpl.java

@ -3,14 +3,17 @@ package io.sc.platform.mvc.service.impl;
import io.sc.platform.core.DirectoryManager; import io.sc.platform.core.DirectoryManager;
import io.sc.platform.core.Environment; import io.sc.platform.core.Environment;
import io.sc.platform.core.util.FileUtil; import io.sc.platform.core.util.FileUtil;
import io.sc.platform.core.util.ObjectMapper4Json;
import io.sc.platform.core.util.UrlUtil; import io.sc.platform.core.util.UrlUtil;
import io.sc.platform.core.util.ZipUtil; import io.sc.platform.core.util.ZipUtil;
import io.sc.platform.mvc.plugins.PluginManager; import io.sc.platform.mvc.plugins.PluginManager;
import io.sc.platform.mvc.plugins.item.FrontEndModule; import io.sc.platform.mvc.plugins.item.FrontEndModule;
import io.sc.platform.mvc.service.FrontEndService;
import io.sc.platform.mvc.service.FrontendExportService; import io.sc.platform.mvc.service.FrontendExportService;
import io.sc.platform.mvc.support.ExportFileInfo; import io.sc.platform.mvc.support.ExportFileInfo;
import io.sc.platform.mvc.support.FrontendExportParam; import io.sc.platform.mvc.support.FrontendExportParam;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.ResourceLoader;
@ -26,6 +29,7 @@ import java.util.UUID;
@Service @Service
public class FrontendExportServiceImpl implements FrontendExportService { public class FrontendExportServiceImpl implements FrontendExportService {
@Autowired private FrontEndService frontEndService;
@Override @Override
public ExportFileInfo export(FrontendExportParam param) throws Exception { public ExportFileInfo export(FrontendExportParam param) throws Exception {
@ -114,14 +118,22 @@ public class FrontendExportServiceImpl implements FrontendExportService {
sb.append("window.APP = {};").append("\n"); sb.append("window.APP = {};").append("\n");
sb.append("// 全局配置").append("\n"); sb.append("// 全局配置").append("\n");
sb.append("window.APP.configure ={").append("\n"); sb.append("window.APP.configure ={").append("\n");
sb.append(" // router 历史模式").append("\n");
sb.append(" routerHistoryMode: 'web',").append("\n");
sb.append(" // 应用上下文路径").append("\n"); sb.append(" // 应用上下文路径").append("\n");
sb.append(" webContextPath: '").append(frontendWebContextPath).append("',").append("\n"); sb.append(" webContextPath: '").append(frontendWebContextPath).append("',").append("\n");
sb.append("\n");
sb.append(" // 默认后端 API 请求的服务地址前缀").append("\n"); sb.append(" // 默认后端 API 请求的服务地址前缀").append("\n");
sb.append(" apiContextPaths: {").append("\n"); sb.append(" apiContextPaths: {").append("\n");
sb.append(" DEFAULT: '").append(backendApiWebContextPath).append("'").append("\n"); sb.append(" DEFAULT: '").append(backendApiWebContextPath).append("'").append("\n");
sb.append(" }").append("\n"); sb.append(" },").append("\n");
sb.append("\n");
sb.append(" // 是否是独立部署的前端").append("\n");
sb.append(" isAloneFrontend: true,").append("\n");
sb.append("\n");
sb.append(" // 微前端入口").append("\n");
sb.append(" remoteEntries: ").append(ObjectMapper4Json.getMapper().writeValueAsString(frontEndService.getRemoteEntries())).append(",").append("\n");
sb.append("\n");
sb.append(" // router 历史模式").append("\n");
sb.append(" routerHistoryMode: 'hash',").append("\n");
sb.append("};").append("\n"); sb.append("};").append("\n");
FileUtil.writeString(zipDirPath + "/configure.js",sb.toString()); FileUtil.writeString(zipDirPath + "/configure.js",sb.toString());

2
io.sc.platform.mvc/src/main/resources/META-INF/platform/plugins/security.json

@ -1,6 +1,8 @@
{ {
"permitPatterns":[ "permitPatterns":[
"/api/mvc/frontend/getRemoteEntries",
"/api/mvc/frontend/regist", "/api/mvc/frontend/regist",
"/api/mvc/i18n/getI18nMessages", "/api/mvc/i18n/getI18nMessages",
"/api/mvc/i18n/getI18nMessages/**/*", "/api/mvc/i18n/getI18nMessages/**/*",
"/api/mvc/i18n/getI18nMessagesByKeys" "/api/mvc/i18n/getI18nMessagesByKeys"

11
io.sc.platform.lcdp/src/main/resources/templates/configure.js → io.sc.platform.mvc/src/main/resources/templates/configure.js

@ -2,14 +2,17 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure = { window.APP.configure = {
// router 历史模式
routerHistoryMode: 'hash',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]', webContextPath: '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]' DEFAULT: '[(@{/})]'
} },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
}; };

2
io.sc.platform.scheduler.manager.frontend/package.json

@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.295", "platform-core": "8.1.301",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

14
io.sc.platform.scheduler.manager.frontend/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

4
io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/filter/JwtUsernamePasswordAuthenticationFilter.java

@ -30,6 +30,7 @@ public class JwtUsernamePasswordAuthenticationFilter extends OncePerRequestFilte
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
final String token = bearerTokenResolver.resolve(request); final String token = bearerTokenResolver.resolve(request);
if(StringUtils.hasText(token)) { if(StringUtils.hasText(token)) {
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext()); WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
@ -41,12 +42,13 @@ public class JwtUsernamePasswordAuthenticationFilter extends OncePerRequestFilte
SecurityContextHolder.getContext().setAuthentication(authenticationToken); SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}catch (JwtException e){ }catch (JwtException e){
SecurityContextHolder.clearContext(); SecurityContextHolder.clearContext();
this.logger.error(e.getMessage());
this.logger.trace("Failed to process authentication request", e); this.logger.trace("Failed to process authentication request", e);
this.logger.trace("Cleared SecurityContextHolder"); this.logger.trace("Cleared SecurityContextHolder");
this.logger.trace("Handling authentication failure"); this.logger.trace("Handling authentication failure");
rememberMeServices.loginFail(request, response); rememberMeServices.loginFail(request, response);
failureHandler.onAuthenticationFailure(request, response, new AuthenticationServiceException(e.getMessage())); failureHandler.onAuthenticationFailure(request, response, new AuthenticationServiceException(e.getMessage()));
throw e; return;
} }
} }
filterChain.doFilter(request,response); filterChain.doFilter(request,response);

72
io.sc.platform.security/src/main/java/io/sc/platform/security/installer/AdministratorInstallerItem.java

@ -47,39 +47,55 @@ public class AdministratorInstallerItem implements InstallerItem {
// 创建用户 // 创建用户
String userId =UUID.randomUUID().toString(); String userId =UUID.randomUUID().toString();
SqlBuilder.getInsertIntoSqlBuilder().table("SYS_USER") List<Map<String, Object>> list =jdbcTemplate.queryForList("select * from SYS_USER where LOGINNAME_=?",administratorLoginName);
.field("ID_", userId) if(list.isEmpty()){
.field("LOGINNAME_",administratorLoginName) SqlBuilder.getInsertIntoSqlBuilder().table("SYS_USER")
.field("USERNAME_","系统管理员") .field("ID_", userId)
.field("PASSWORD_",administratorPassword) .field("LOGINNAME_", administratorLoginName)
.field("ENABLE_",1) .field("USERNAME_", "系统管理员")
.field("DATA_COME_FROM_","INPUT") .field("PASSWORD_", administratorPassword)
.field("CREATOR_","system") .field("ENABLE_", 1)
.field("CREATE_DATE_",new Date()) .field("DATA_COME_FROM_", "INPUT")
.field("LAST_MODIFIER_","system") .field("CREATOR_", "system")
.field("LAST_MODIFYDATE_",new Date()) .field("CREATE_DATE_", new Date())
.field("CORP_CODE_","_PRIMARY_") .field("LAST_MODIFIER_", "system")
.insert(jdbcTemplate); .field("LAST_MODIFYDATE_", new Date())
.field("CORP_CODE_", "_PRIMARY_")
.insert(jdbcTemplate);
}else {
jdbcTemplate.update("update SYS_USER set PASSWORD_=? where LOGINNAME_=?",administratorPassword,administratorLoginName);
Map<String, Object> record =list.get(0);
userId =record.get("ID_").toString();
}
// 创建管理员角色 // 创建管理员角色
String roleId =UUID.randomUUID().toString(); String roleId =UUID.randomUUID().toString();
SqlBuilder.getInsertIntoSqlBuilder() list =jdbcTemplate.queryForList("select * from SYS_ROLE where CODE_='admin'");
.table("SYS_ROLE") if(list.isEmpty()){
.field("ID_", roleId) SqlBuilder.getInsertIntoSqlBuilder()
.field("CODE_","admin") .table("SYS_ROLE")
.field("NAME_","系统管理员") .field("ID_", roleId)
.field("DESCRIPTION_","系统管理员") .field("CODE_","admin")
.field("ENABLE_",1) .field("NAME_","系统管理员")
.field("DATA_COME_FROM_","INPUT") .field("DESCRIPTION_","系统管理员")
.field("CREATOR_","system") .field("ENABLE_",1)
.field("CREATE_DATE_", new java.sql.Date(new Date().getTime())) .field("DATA_COME_FROM_","INPUT")
.field("LAST_MODIFIER_","system") .field("CREATOR_","system")
.field("LAST_MODIFYDATE_",new java.sql.Date(new Date().getTime())) .field("CREATE_DATE_", new java.sql.Date(new Date().getTime()))
.field("CORP_CODE_","_PRIMARY_") .field("LAST_MODIFIER_","system")
.insert(jdbcTemplate); .field("LAST_MODIFYDATE_",new java.sql.Date(new Date().getTime()))
.field("CORP_CODE_","_PRIMARY_")
.insert(jdbcTemplate);
}else{
Map<String, Object> record =list.get(0);
roleId =record.get("ID_").toString();
}
// 角色和用户的关系 // 角色和用户的关系
jdbcTemplate.update("insert into SYS_USER_ROLE(USER_ID_,ROLE_ID_) values (?,?)", userId,roleId); list =jdbcTemplate.queryForList("select * from SYS_USER_ROLE where USER_ID_=? and ROLE_ID_=?",userId,roleId);
if(list.isEmpty()){
jdbcTemplate.update("insert into SYS_USER_ROLE(USER_ID_,ROLE_ID_) values (?,?)", userId,roleId);
}
DatasourceUtil.close(dataSource); DatasourceUtil.close(dataSource);
} }

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

@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.295", "platform-core": "8.1.301",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

14
io.sc.platform.system.frontend/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

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

@ -3,7 +3,6 @@ package io.sc.platform.system.user.service.impl;
import io.sc.platform.jdbc.util.SqlBatcher; import io.sc.platform.jdbc.util.SqlBatcher;
import io.sc.platform.mvc.plugins.PluginManager; import io.sc.platform.mvc.plugins.PluginManager;
import io.sc.platform.mvc.plugins.item.FrontEndRoute; import io.sc.platform.mvc.plugins.item.FrontEndRoute;
import io.sc.platform.mvc.service.FrontEndService;
import io.sc.platform.mvc.service.SystemParameterService; import io.sc.platform.mvc.service.SystemParameterService;
import io.sc.platform.orm.api.exception.UserRawPasswordNotMatchException; import io.sc.platform.orm.api.exception.UserRawPasswordNotMatchException;
import io.sc.platform.orm.service.impl.DaoServiceImpl; import io.sc.platform.orm.service.impl.DaoServiceImpl;
@ -17,8 +16,6 @@ import io.sc.platform.system.api.menu.MenuRouteVo;
import io.sc.platform.system.api.menu.MenuVo; import io.sc.platform.system.api.menu.MenuVo;
import io.sc.platform.system.department.jpa.entity.DepartmentEntity; import io.sc.platform.system.department.jpa.entity.DepartmentEntity;
import io.sc.platform.system.i18n.service.I18nService; import io.sc.platform.system.i18n.service.I18nService;
import io.sc.platform.system.menu.jpa.entity.MenuEntity;
import io.sc.platform.system.menu.jpa.entity.MenuGroupEntity;
import io.sc.platform.system.menu.service.MenuService; import io.sc.platform.system.menu.service.MenuService;
import io.sc.platform.system.org.jpa.entity.OrgEntity; import io.sc.platform.system.org.jpa.entity.OrgEntity;
import io.sc.platform.system.org.service.OrgService; import io.sc.platform.system.org.service.OrgService;
@ -53,7 +50,6 @@ public class UserServiceImpl extends DaoServiceImpl<UserEntity, String, UserRepo
@Autowired private Environment environment; @Autowired private Environment environment;
@Autowired private SecurityProperties securityProperties; @Autowired private SecurityProperties securityProperties;
@Autowired private MenuService menuService; @Autowired private MenuService menuService;
@Autowired private FrontEndService frontEndService;
@Autowired private I18nService i18nService; @Autowired private I18nService i18nService;
@Autowired private PasswordEncoder passwordEncoder; @Autowired private PasswordEncoder passwordEncoder;
@Autowired private JdbcTemplate jdbcTemplate; @Autowired private JdbcTemplate jdbcTemplate;
@ -91,7 +87,6 @@ public class UserServiceImpl extends DaoServiceImpl<UserEntity, String, UserRepo
result.setUser(SecurityUtil.securityUser2map()); result.setUser(SecurityUtil.securityUser2map());
result.setMenus(asRootMenus); result.setMenus(asRootMenus);
result.setRoutes(getFrontEndRoutes(menus)); result.setRoutes(getFrontEndRoutes(menus));
result.setRemoteEntries(frontEndService.getRemoteEntries(request));
return result; return result;
} }

15
io.sc.platform.system/src/main/java/io/sc/platform/system/user/service/support/UserSession.java

@ -24,13 +24,6 @@ public class UserSession {
*/ */
private List<FrontEndRoute> routes =new ArrayList<>(); private List<FrontEndRoute> routes =new ArrayList<>();
/**
* 微前端远程入口文件 Map
* key: 微前端模块名称通常为项目名称
* value: 微前端入口文件 url
*/
private Map<String,String> remoteEntries =new HashMap<>();
public Map<String, Object> getUser() { public Map<String, Object> getUser() {
return user; return user;
} }
@ -54,12 +47,4 @@ public class UserSession {
public void setRoutes(List<FrontEndRoute> routes) { public void setRoutes(List<FrontEndRoute> routes) {
this.routes = routes; this.routes = routes;
} }
public Map<String,String> getRemoteEntries() {
return remoteEntries;
}
public void setRemoteEntries(Map<String,String> remoteEntries) {
this.remoteEntries = remoteEntries;
}
} }

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

@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.295", "platform-core": "8.1.301",
"quasar": "2.15.4", "quasar": "2.15.4",
"tailwindcss": "3.4.4", "tailwindcss": "3.4.4",
"vue": "3.4.31", "vue": "3.4.31",

14
io.sc.standard.frontend/public/configure.js

@ -2,22 +2,32 @@
window.APP = {}; window.APP = {};
// 全局配置 // 全局配置
window.APP.configure ={ window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径 // 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]', webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀 // 默认后端 API 请求的服务地址前缀
apiContextPaths: { apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]', DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
}, },
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock // 是否启用本地 mock
enableLocalMock : false, enableLocalMock : false,
// mock 请求响应时间(单位:毫秒) // mock 请求响应时间(单位:毫秒)
localMockTimeout : 10, localMockTimeout : 10,
// 是否启用使用远程服务端配置 // 是否启用使用远程服务端配置
enableRemoteConfigure : true, enableRemoteConfigure : true,
// 是否首先使用本地路由 // 是否首先使用本地路由
useLocaleRouterFirst : true, useLocaleRouterFirst : true,
// axios 配置 // axios 配置
axios : { axios : {
baseURL: '', baseURL: '',

Loading…
Cancel
Save