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. 36
      io.sc.platform.core.frontend/src/platform/plugin/manager/ApplicationInitializer.ts
  20. 6
      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. 2
      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. 16
      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(project.name!='io.sc.platform.mvc.frontend'){
exclude("**/${project.name}/*.*");
exclude("**/${project.name}/javascript/codemirror.*");
exclude("**/${project.name}/javascript/echarts.*");
exclude("**/${project.name}/javascript/platform-core.*");
exclude("**/${project.name}/javascript/quasar.*");
exclude("**/${project.name}/javascript/vue.*");
exclude("**/${project.name}/fonts/*.*");
exclude("**/${project.name}/webjars/**/*.*");
// exclude("**/${project.name}/javascript/codemirror.*");
// exclude("**/${project.name}/javascript/echarts.*");
// exclude("**/${project.name}/javascript/platform-core.*");
// exclude("**/${project.name}/javascript/quasar.*");
// exclude("**/${project.name}/javascript/vue.*");
// exclude("**/${project.name}/fonts/*.*");
// exclude("**/${project.name}/webjars/**/*.*");
}
}
}

2
erm.frontend/package.json

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

14
erm.frontend/public/configure.js

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

2
gradle.properties

@ -38,7 +38,7 @@ application_version=1.0.0
platform_group=io.sc
platform_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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -2,22 +2,32 @@
window.APP = {};
// 全局配置
window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀
apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
},
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock
enableLocalMock : false,
// mock 请求响应时间(单位:毫秒)
localMockTimeout : 10,
// 是否启用使用远程服务端配置
enableRemoteConfigure : true,
// 是否首先使用本地路由
useLocaleRouterFirst : true,
// axios 配置
axios : {
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';
/**
* API URL
*/
static API_REMOTE_ENTRY_URL: string = '/api/mvc/frontend/getRemoteEntries';
/**
* 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 { ApplicationInitializer } from './plugin';
export { AuthenticationManager } from './plugin';
export { ComponentManager } from './plugin';
export { ConfigureManager } from './plugin';
export { DialogManager } from './plugin';
@ -86,7 +87,7 @@ export { I18nMessageManager } from './plugin';
export { MenuManager } from './plugin';
export { MockManager } from './plugin';
export { NotifyManager } from './plugin';
export { AuthenticationManager } from './plugin';
export { RemoteEntryManager } from './plugin';
export { RouterManager } from './plugin';
export { SessionManager } 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>();
/**
*
* @returns
*/
public static isAloneFrontend() {
return window[PConst.APP][PConst.CONFIGURE].isAloneFrontend;
}
/**
*
* @returns
*/
public static getRemoteEntries() {
return window[PConst.APP][PConst.CONFIGURE].remoteEntries;
}
/**
* 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 { ApplicationInitializer } from './manager';
export { AuthenticationManager } from './manager';
export { ComponentManager } from './manager';
export { ConfigureManager } from './manager';
export { DialogManager } from './manager';
@ -30,7 +31,7 @@ export { I18nMessageManager } from './manager';
export { MenuManager } from './manager';
export { MockManager } from './manager';
export { NotifyManager } from './manager';
export { AuthenticationManager } from './manager';
export { RemoteEntryManager } from './manager';
export { RouterManager } from './manager';
export { SessionManager } from './manager';
export { TagViewManager } from './manager';

36
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 { Environment } from '@/platform/plugin/environment';
import {
AuthenticationManager,
ComponentManager,
MockManager,
ConfigureManager,
SessionManager,
I18nMessageManager,
NotifyManager,
MenuManager,
MockManager,
NotifyManager,
RemoteEntryManager,
RouterManager,
SessionManager,
} from '@/platform/plugin/manager';
import { router } from '@/platform/plugin';
import { Tools, JavascriptLoader } from '@/platform/utils';
import { Tools } from '@/platform/utils';
const gc = Environment.getConfigure();
@ -42,14 +44,7 @@ class ApplicationInitializer {
I18nMessageManager.setLocalI18nMessages(parameter.localI18nMessages);
await I18nMessageManager.changeLanguage(gc.setting.i18n.locale as I18nMessageLocaleType, false);
// Oauth2 鉴权
// if (Oauth2Manager.isAuthorizationCodeRedirectUri()) {
// Oauth2Manager.loadTokens(() => {
// window.location.href = Environment.getWebContextPath();
// });
// return;
// }
// 构建初始路由
RouterManager.buildRoutes();
// 获取用户会话
@ -70,21 +65,14 @@ class ApplicationInitializer {
RouterManager.setLocalRoutes(parameter.localRoutes);
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((errorUrl) => {
parameter.callback();
});
loader.load(urls);
} else {
parameter.callback();
}
// 加载远程入口
RemoteEntryManager.loadRemoteEntries(parameter.callback);
} else {
// 加载远程入口
RemoteEntryManager.loadRemoteEntries(() => {
parameter.callback();
router.push({ name: 'login' });
});
}
}

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

@ -120,10 +120,12 @@ class RouterManager {
* @param priority
*/
private static setRoutesPriority(objects: object[] = [], priority: number) {
if (objects && objects.length > 0) {
for (const route of objects) {
route['priority'] = priority;
}
}
}
/**
*
@ -131,6 +133,7 @@ class RouterManager {
* @param objects
*/
private static mergeRoutes(map: Map<string, object>, objects: object[] = []) {
if (objects && objects.length > 0) {
for (const route of objects) {
const cachedRoute = map.get(route['name']);
if (cachedRoute) {
@ -142,6 +145,7 @@ class RouterManager {
}
}
}
}
/**
*
@ -149,6 +153,7 @@ class RouterManager {
* @param objects
*/
private static createRoutes(array: object[], objects: object[] = [], cache: Map<string, object>, type: string) {
if (objects && objects.length > 0) {
for (const route of objects) {
const cachedRoute = cache.get(route['name']);
if (cachedRoute) {
@ -186,6 +191,7 @@ class RouterManager {
}
}
}
}
/**
*

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

@ -1,4 +1,5 @@
export { ApplicationInitializer } from './ApplicationInitializer';
export { AuthenticationManager } from './AuthenticationManager';
export { ComponentManager } from './ComponentManager';
export { ConfigureManager } from './ConfigureManager';
export { DialogManager } from './DialogManager';
@ -6,7 +7,7 @@ export { I18nMessageManager } from './I18nMessageManager';
export { MenuManager } from './MenuManager';
export { MockManager } from './MockManager';
export { NotifyManager } from './NotifyManager';
export { AuthenticationManager } from './AuthenticationManager';
export { RemoteEntryManager } from './RemoteEntryManager';
export { RouterManager } from './RouterManager';
export { SessionManager } from './SessionManager';
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 Login from '@/platform/views/Login.vue';
import Home from '@/platform/views/Home.vue';
import Oauth2 from '@/platform/views/Oauth2.vue';
import P404 from '@/platform/views/404.vue';
const gc = Environment.getConfigure();
@ -39,12 +38,6 @@ const PLATFORM_ROUTES = [
path: '/home',
component: Home,
},
{
parent: '/',
name: 'oauth2',
path: '/oauth2',
component: Oauth2,
},
{
parent: '/',
name: '404',
@ -80,7 +73,8 @@ router.beforeEach(async (to: any, from: any, next: any) => {
next();
} else {
//导航到登录页面
next({ name: 'login' });
//next({ name: 'login' });
Environment.executeAction('openLoginDialog');
}
}
});

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

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

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

@ -224,6 +224,8 @@ const loginFormSubmit = (event) => {
// 访
AuthenticationManager.setLocalAccessToken(response.data?.data);
// window.location.href = Environment.getWebContextPath();
// ,
SessionManager.loadUserSession().then((userSession) => {
if (userSession) {
@ -241,15 +243,6 @@ const loginFormSubmit = (event) => {
SessionManager.setRoutes(userSession.routes);
RouterManager.setLocalRoutes(parameter.localRoutes);
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('/');
});

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

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

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

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

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

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

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

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

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

@ -684,13 +684,13 @@ subprojects {
if(isFrontendProject(file('.'))) {
if(project.name!='io.sc.platform.mvc.frontend'){
exclude("**/${project.name}/*.*");
exclude("**/${project.name}/javascript/codemirror.*");
exclude("**/${project.name}/javascript/echarts.*");
exclude("**/${project.name}/javascript/platform-core.*");
exclude("**/${project.name}/javascript/quasar.*");
exclude("**/${project.name}/javascript/vue.*");
exclude("**/${project.name}/fonts/*.*");
exclude("**/${project.name}/webjars/**/*.*");
// exclude("**/${project.name}/javascript/codemirror.*");
// exclude("**/${project.name}/javascript/echarts.*");
// exclude("**/${project.name}/javascript/platform-core.*");
// exclude("**/${project.name}/javascript/quasar.*");
// exclude("**/${project.name}/javascript/vue.*");
// exclude("**/${project.name}/fonts/*.*");
// exclude("**/${project.name}/webjars/**/*.*");
}
}
}
@ -850,5 +850,5 @@ task github {
}
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_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

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

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

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

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

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

@ -2,22 +2,32 @@
window.APP = {};
// 全局配置
window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀
apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
},
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock
enableLocalMock : false,
// mock 请求响应时间(单位:毫秒)
localMockTimeout : 10,
// 是否启用使用远程服务端配置
enableRemoteConfigure : true,
// 是否首先使用本地路由
useLocaleRouterFirst : true,
// axios 配置
axios : {
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}")
public void setActiveConfigure(@PathVariable(name="id")String id){
public void activeConfigure(@PathVariable(name="id")String 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",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.295",
"platform-core": "8.1.301",
"quasar": "2.15.4",
"tailwindcss": "3.4.4",
"vue": "3.4.31",

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

@ -2,22 +2,32 @@
window.APP = {};
// 全局配置
window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀
apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
},
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock
enableLocalMock : false,
// mock 请求响应时间(单位:毫秒)
localMockTimeout : 10,
// 是否启用使用远程服务端配置
enableRemoteConfigure : true,
// 是否首先使用本地路由
useLocaleRouterFirst : true,
// axios 配置
axios : {
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.FrontendExportParam;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.ResponseBody;
@RestController
public class FrontendModuleController {
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@Controller
public class FrontendController {
@Autowired private FrontEndService frontEndService;
@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")
@ResponseBody
public String getApplicationName() throws Exception{
return Environment.getInstance().getApplicationName();
}
@PostMapping("/api/mvc/frontend/regist")
@ResponseBody
public void regist(@RequestBody FrontEndModule frontEndModule){
frontEndService.regist(frontEndModule);
}
@PostMapping("/api/mvc/frontend/export")
@ResponseBody
public ExportFileInfo export(@RequestBody FrontendExportParam param) throws Exception{
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 org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* 系统首页控制器
*/
@Controller
@RequestMapping
public class IndexWebController {
@Autowired private FrontEndService frontEndService;
@Autowired private SystemParameterService systemParameterService;
@RequestMapping(value={"","/","index.html"})
@ -22,4 +25,9 @@ public class IndexWebController {
ModelAndView mv =new ModelAndView("io.sc.platform.mvc.frontend.html");
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 所有远程前端模块的入口
*/
public Map<String,String> getRemoteEntries(HttpServletRequest request);
public Map<String,String> getRemoteEntries();
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 java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -56,7 +57,6 @@ public class FrontEndServiceImpl implements FrontEndService {
Map<String,String> result =new HashMap<>();
for (Map.Entry<String,FrontEndModule> entry : localFrontEndModuleMap.entrySet()) {
if(entry.getValue().getComponents().size()>0) {
result.put(entry.getKey(), getRemoteEntry(entry.getValue(), request));
}
}
@ -68,6 +68,24 @@ public class FrontEndServiceImpl implements FrontEndService {
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
public void regist(FrontEndModule 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.Environment;
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.ZipUtil;
import io.sc.platform.mvc.plugins.PluginManager;
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.support.ExportFileInfo;
import io.sc.platform.mvc.support.FrontendExportParam;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
@ -26,6 +29,7 @@ import java.util.UUID;
@Service
public class FrontendExportServiceImpl implements FrontendExportService {
@Autowired private FrontEndService frontEndService;
@Override
public ExportFileInfo export(FrontendExportParam param) throws Exception {
@ -114,14 +118,22 @@ public class FrontendExportServiceImpl implements FrontendExportService {
sb.append("window.APP = {};").append("\n");
sb.append("// 全局配置").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(" webContextPath: '").append(frontendWebContextPath).append("',").append("\n");
sb.append("\n");
sb.append(" // 默认后端 API 请求的服务地址前缀").append("\n");
sb.append(" apiContextPaths: {").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");
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":[
"/api/mvc/frontend/getRemoteEntries",
"/api/mvc/frontend/regist",
"/api/mvc/i18n/getI18nMessages",
"/api/mvc/i18n/getI18nMessages/**/*",
"/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.configure = {
// router 历史模式
routerHistoryMode: 'hash',
// 应用上下文路径
webContextPath: '[(@{/})]',
// 默认后端 API 请求的服务地址前缀
apiContextPaths: {
DEFAULT: '[(@{/})]'
}
},
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
};

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

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

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

@ -2,22 +2,32 @@
window.APP = {};
// 全局配置
window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀
apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
},
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock
enableLocalMock : false,
// mock 请求响应时间(单位:毫秒)
localMockTimeout : 10,
// 是否启用使用远程服务端配置
enableRemoteConfigure : true,
// 是否首先使用本地路由
useLocaleRouterFirst : true,
// axios 配置
axios : {
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
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
final String token = bearerTokenResolver.resolve(request);
if(StringUtils.hasText(token)) {
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());
@ -41,12 +42,13 @@ public class JwtUsernamePasswordAuthenticationFilter extends OncePerRequestFilte
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}catch (JwtException e){
SecurityContextHolder.clearContext();
this.logger.error(e.getMessage());
this.logger.trace("Failed to process authentication request", e);
this.logger.trace("Cleared SecurityContextHolder");
this.logger.trace("Handling authentication failure");
rememberMeServices.loginFail(request, response);
failureHandler.onAuthenticationFailure(request, response, new AuthenticationServiceException(e.getMessage()));
throw e;
return;
}
}
filterChain.doFilter(request,response);

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

@ -47,6 +47,8 @@ public class AdministratorInstallerItem implements InstallerItem {
// 创建用户
String userId =UUID.randomUUID().toString();
List<Map<String, Object>> list =jdbcTemplate.queryForList("select * from SYS_USER where LOGINNAME_=?",administratorLoginName);
if(list.isEmpty()){
SqlBuilder.getInsertIntoSqlBuilder().table("SYS_USER")
.field("ID_", userId)
.field("LOGINNAME_", administratorLoginName)
@ -60,9 +62,16 @@ public class AdministratorInstallerItem implements InstallerItem {
.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();
list =jdbcTemplate.queryForList("select * from SYS_ROLE where CODE_='admin'");
if(list.isEmpty()){
SqlBuilder.getInsertIntoSqlBuilder()
.table("SYS_ROLE")
.field("ID_", roleId)
@ -77,9 +86,16 @@ public class AdministratorInstallerItem implements InstallerItem {
.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();
}
// 角色和用户的关系
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);
}

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

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

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

@ -2,22 +2,32 @@
window.APP = {};
// 全局配置
window.APP.configure ={
// router 历史模式
routerHistoryMode: 'web',
// 应用上下文路径
webContextPath: '[(@{/})]'.startsWith('[')? '/' : '[(@{/})]',
// 默认后端 API 请求的服务地址前缀
apiContextPaths: {
DEFAULT: '[(@{/})]'.startsWith('[')? 'http://localhost:8080/' : '[(@{/})]',
},
// 是否是独立部署的前端
isAloneFrontend: false,
// router 历史模式
routerHistoryMode: 'hash',
// 是否启用本地 mock
enableLocalMock : false,
// mock 请求响应时间(单位:毫秒)
localMockTimeout : 10,
// 是否启用使用远程服务端配置
enableRemoteConfigure : true,
// 是否首先使用本地路由
useLocaleRouterFirst : true,
// axios 配置
axios : {
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.mvc.plugins.PluginManager;
import io.sc.platform.mvc.plugins.item.FrontEndRoute;
import io.sc.platform.mvc.service.FrontEndService;
import io.sc.platform.mvc.service.SystemParameterService;
import io.sc.platform.orm.api.exception.UserRawPasswordNotMatchException;
import io.sc.platform.orm.service.impl.DaoServiceImpl;
@ -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.department.jpa.entity.DepartmentEntity;
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.org.jpa.entity.OrgEntity;
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 SecurityProperties securityProperties;
@Autowired private MenuService menuService;
@Autowired private FrontEndService frontEndService;
@Autowired private I18nService i18nService;
@Autowired private PasswordEncoder passwordEncoder;
@Autowired private JdbcTemplate jdbcTemplate;
@ -91,7 +87,6 @@ public class UserServiceImpl extends DaoServiceImpl<UserEntity, String, UserRepo
result.setUser(SecurityUtil.securityUser2map());
result.setMenus(asRootMenus);
result.setRoutes(getFrontEndRoutes(menus));
result.setRemoteEntries(frontEndService.getRemoteEntries(request));
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<>();
/**
* 微前端远程入口文件 Map
* key: 微前端模块名称通常为项目名称
* value: 微前端入口文件 url
*/
private Map<String,String> remoteEntries =new HashMap<>();
public Map<String, Object> getUser() {
return user;
}
@ -54,12 +47,4 @@ public class UserSession {
public void setRoutes(List<FrontEndRoute> 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",
"mockjs": "1.1.0",
"pinia": "2.1.7",
"platform-core": "8.1.295",
"platform-core": "8.1.301",
"quasar": "2.15.4",
"tailwindcss": "3.4.4",
"vue": "3.4.31",

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

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

Loading…
Cancel
Save