Browse Source

add theme update

main
wangshaoping 1 year ago
parent
commit
010eefd67b
  1. 2
      gradle.properties
  2. 9
      io.sc.platform.app/build.gradle
  3. 4
      io.sc.platform.core.frontend/package.json
  4. 2
      io.sc.platform.core.frontend/src/platform/index.ts
  5. 2
      io.sc.platform.core.frontend/src/platform/utils/index.ts
  6. 50
      io.sc.platform.core.frontend/src/views/TreeGrid.vue
  7. 6
      io.sc.platform.core.frontend/template-project/package.json
  8. 20
      io.sc.platform.core.frontend/template-project/src/components/index.ts
  9. 82
      io.sc.platform.core.frontend/template-project/src/menus/menus.json
  10. 106
      io.sc.platform.core.frontend/template-project/src/routes/routes.json
  11. 50
      io.sc.platform.core.frontend/template-project/src/views/TreeGrid.vue
  12. 99
      io.sc.platform.developer.doc/asciidoc/9999-appendix/oauth2/oauth2.adoc
  13. 4
      io.sc.platform.developer.frontend/package.json
  14. 4
      io.sc.platform.lcdp.frontend/package.json
  15. 4
      io.sc.platform.mvc.frontend/package.json
  16. 4
      io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/enum.properties
  17. 4
      io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/enum_tw_CN.properties
  18. 4
      io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/enum_zh_CN.properties
  19. 2
      io.sc.platform.security.frontend/package.json
  20. 16
      io.sc.platform.security.frontend/webpack.config.mf.cjs
  21. 1
      io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformOauth2AuthorizationServerAutoConfiguration.java
  22. 4
      io.sc.platform.system.frontend/package.json
  23. 155
      io.sc.platform.system.frontend/src/views/user/User.vue

2
gradle.properties

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

9
io.sc.platform.app/build.gradle

@ -1,6 +1,5 @@
dependencies { dependencies {
api( api(
/*
project(":io.sc.platform.csv"), project(":io.sc.platform.csv"),
project(":io.sc.platform.communication"), project(":io.sc.platform.communication"),
project(":io.sc.platform.flowable"), project(":io.sc.platform.flowable"),
@ -10,16 +9,16 @@ dependencies {
project(":io.sc.platform.lcdp"), project(":io.sc.platform.lcdp"),
project(":io.sc.platform.lcdp.frontend"), project(":io.sc.platform.lcdp.frontend"),
project(":io.sc.platform.orm.mybatis"), project(":io.sc.platform.orm.mybatis"),
project(":io.sc.platform.security.oauth2.server.authorization"), project(":io.sc.platform.security.loginform"),
project(":io.sc.platform.system"), project(":io.sc.platform.system"),
project(":io.sc.platform.ws.cxf"), project(":io.sc.platform.ws.cxf"),
project(":org.webjars.luckysheet-2.1.13"), project(":org.webjars.luckysheet-2.1.13"),
project(":org.webjars.tailwindcss-3.3.5"), project(":org.webjars.tailwindcss-3.3.5"),
*/
//project(":io.sc.platform.security.loginform"), //project(":io.sc.platform.security.loginform"),
project(":io.sc.platform.jdbc.liquibase"), //project(":io.sc.platform.jdbc.liquibase"),
project(":io.sc.platform.security.oauth2.server.authorization"), //project(":io.sc.platform.security.oauth2.server.authorization"),
) )
} }

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

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.1.49", "version": "8.1.56",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件", "//main": "库的主文件",
"main": "dist/platform-core.js", "main": "dist/platform-core.js",
@ -102,7 +102,7 @@
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1", "@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.5", "@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2", "@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0", "@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5", "@codemirror/search": "6.5.5",

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

@ -87,7 +87,7 @@ export { TagViewManager } from './plugin';
/** /**
* *
*/ */
export { BackendTools } from './utils'; export { EnumTools } from './utils';
export { JavascriptLoader } from './utils'; export { JavascriptLoader } from './utils';
export { QuasarTools } from './utils'; export { QuasarTools } from './utils';
export { Tools } from './utils'; export { Tools } from './utils';

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

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

50
io.sc.platform.core.frontend/src/views/TreeGrid.vue

@ -1,18 +1,56 @@
<template> <template>
<w-tree-grid title="Hello" :columns="columns" :rows="data"></w-tree-grid> <w-list-grid
:tree="true"
title="User List"
:no-action-icon="true"
:target-object-name="$t('菜单')"
:actions="[
'query',
'refresh',
'expandAll',
'selectAll',
'separator',
'add',
'clone',
'edit',
'remove',
'removeAll',
'separator',
'detail',
'addTop',
'addChild',
]"
:columns="columns"
:auto-fetch-data="true"
:data-url="Environment.apiContextPath('/api/system/menu/allMenus')"
></w-list-grid>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, toRaw, onMounted } from 'vue'; import { ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { Environment, axios, BackendTools } from '@/platform'; import { Environment } from '@/platform';
const { t } = useI18n(); const { t } = useI18n();
const columns = [ const columns = [
{ {
name: 'loginName', name: 'name',
required: true,
label: t('name'),
align: 'left',
field: 'name',
sortable: true,
format: (value, data) => {
return t(data.titleI18nKey);
}, },
},
{ name: 'type', align: 'center', label: 'type', field: 'type', sortable: true },
{ name: 'enable', label: 'enable', field: 'enable', sortable: true },
{ name: 'dataComeFrom', label: 'dataComeFrom', field: 'dataComeFrom' },
{ name: 'lastModifier', label: 'lastModifier', field: 'lastModifier' },
{ name: 'lastModifyDate', label: 'lastModifyDate', field: 'lastModifyDate' },
{ name: 'corporationCode', label: 'corporationCode', field: 'corporationCode', sortable: true },
]; ];
const data = [{ loginName: 'admin' }, { loginName: 'wsp' }];
</script> </script>

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

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.1.49", "version": "8.1.56",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -74,7 +74,7 @@
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1", "@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.5", "@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2", "@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0", "@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5", "@codemirror/search": "6.5.5",
@ -91,7 +91,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.49", "platform-core": "8.1.56",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",

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

@ -6,14 +6,30 @@ import dialog from '@/views/Dialog.vue';
import codemirror from '@/views/Codemirror.vue'; import codemirror from '@/views/Codemirror.vue';
import select from '@/views/Select.vue'; import select from '@/views/Select.vue';
import treeGrid from '@/views/TreeGrid.vue'; import treeGrid from '@/views/TreeGrid.vue';
import table from '@/views/Table.vue'; import likmDialog from '@/views/likm/Dialog.vue';
import likmDrawer from '@/views/likm/Drawer.vue';
import likmForm from '@/views/likm/Form.vue';
import infoPanel from '@/views/likm/InfoPanel.vue';
import grid from '@/views/likm/Grid.vue';
import toolbar from '@/views/likm/Toolbar.vue';
import quasarGrid from '@/views/likm/QuasarGrid.vue';
import gridLayout from '@/views/likm/GridLayout.vue';
import likmTreeGrid from '@/views/likm/TreeGrid.vue';
const localComponents = { const localComponents = {
'component.testcase.dialog': dialog, 'component.testcase.dialog': dialog,
'component.testcase.codemirror': codemirror, 'component.testcase.codemirror': codemirror,
'component.testcase.select': select, 'component.testcase.select': select,
'component.testcase.treeGrid': treeGrid, 'component.testcase.treeGrid': treeGrid,
'component.testcase.table': table, 'component.testcase.likmDialog': likmDialog,
'component.testcase.likmDrawer': likmDrawer,
'component.testcase.likmForm': likmForm,
'component.testcase.infoPanel': infoPanel,
'component.testcase.grid': grid,
'component.testcase.toolbar': toolbar,
'component.testcase.quasarGrid': quasarGrid,
'component.testcase.gridLayout': gridLayout,
'component.testcase.likmTreeGrid': likmTreeGrid,
}; };
export default localComponents; export default localComponents;

82
io.sc.platform.core.frontend/template-project/src/menus/menus.json

@ -62,5 +62,87 @@
"titleI18nKey": "menu.testcase.table", "titleI18nKey": "menu.testcase.table",
"icon": "bi-palette", "icon": "bi-palette",
"routeName": "route.testcase.table" "routeName": "route.testcase.table"
},
{ "type": "GROUP", "order": 30000, "id": "menu.testcase.likm", "titleI18nKey": "测试用例-likm", "icon": "home" },
{
"type": "ROUTE",
"order": 100,
"parentId": "menu.testcase.likm",
"id": "menu.testcase.likm.dialog",
"titleI18nKey": "Dialog测试",
"icon": "bi-palette",
"routeName": "route.testcase.likm.dialog"
},
{
"type": "ROUTE",
"order": 200,
"parentId": "menu.testcase.likm",
"id": "menu.testcase.likm.drawer",
"titleI18nKey": "Drawer测试",
"icon": "bi-palette",
"routeName": "route.testcase.likm.drawer"
},
{
"type": "ROUTE",
"order": 300,
"parentId": "menu.testcase.likm",
"id": "menu.testcase.likm.form",
"titleI18nKey": "Form测试",
"icon": "bi-palette",
"routeName": "route.testcase.likm.form"
},
{
"type": "ROUTE",
"order": 400,
"parentId": "menu.testcase.likm",
"id": "menu.testcase.likm.infoPanel",
"titleI18nKey": "InfoPanel测试",
"icon": "bi-palette",
"routeName": "route.testcase.likm.infoPanel"
},
{
"type": "ROUTE",
"order": 500,
"parentId": "menu.testcase.likm",
"id": "menu.testcase.likm.grid",
"titleI18nKey": "Grid测试",
"icon": "bi-palette",
"routeName": "route.testcase.likm.grid"
},
{
"type": "ROUTE",
"order": 600,
"parentId": "menu.testcase.likm",
"id": "menu.testcase.likm.toolbar",
"titleI18nKey": "Toolbar测试",
"icon": "bi-palette",
"routeName": "route.testcase.likm.toolbar"
},
{
"type": "ROUTE",
"order": 700,
"parentId": "menu.testcase.likm",
"id": "menu.testcase.likm.quasarGrid",
"titleI18nKey": "官网表格测试",
"icon": "bi-palette",
"routeName": "route.testcase.likm.quasarGrid"
},
{
"type": "ROUTE",
"order": 700,
"parentId": "menu.testcase.likm",
"id": "menu.testcase.likm.gridLayout",
"titleI18nKey": "grid布局测试",
"icon": "bi-palette",
"routeName": "route.testcase.likm.gridLayout"
},
{
"type": "ROUTE",
"order": 800,
"parentId": "menu.testcase.likm",
"id": "menu.testcase.likm.likmTreeGrid",
"titleI18nKey": "treeGrid测试",
"icon": "bi-palette",
"routeName": "route.testcase.likm.likmTreeGrid"
} }
] ]

106
io.sc.platform.core.frontend/template-project/src/routes/routes.json

@ -48,15 +48,111 @@
} }
}, },
{ {
"name": "route.testcase.table", "name": "route.testcase.likm.dialog",
"path": "testcase/table", "path": "testcase/likm/dialog",
"parent": "/", "parent": "/",
"priority": 0, "priority": 0,
"component": "component.testcase.table", "component": "component.testcase.likmDialog",
"componentPath": "@/views/Table.vue", "componentPath": "@/views/likm/Dialog.vue",
"redirect": null, "redirect": null,
"meta": { "meta": {
"permissions": ["/testcase/table/**/*"] "permissions": ["/testcase/treeGrid/**/*"]
}
},
{
"name": "route.testcase.likm.drawer",
"path": "testcase/likm/drawer",
"parent": "/",
"priority": 0,
"component": "component.testcase.likmDrawer",
"componentPath": "@/views/likm/Drawer.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/treeGrid/**/*"]
}
},
{
"name": "route.testcase.likm.form",
"path": "testcase/likm/form",
"parent": "/",
"priority": 0,
"component": "component.testcase.likmForm",
"componentPath": "@/views/likm/Form.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/treeGrid/**/*"]
}
},
{
"name": "route.testcase.likm.infoPanel",
"path": "testcase/likm/infoPanel",
"parent": "/",
"priority": 0,
"component": "component.testcase.infoPanel",
"componentPath": "@/views/likm/InfoPanel.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/treeGrid/**/*"]
}
},
{
"name": "route.testcase.likm.grid",
"path": "testcase/likm/grid",
"parent": "/",
"priority": 0,
"component": "component.testcase.grid",
"componentPath": "@/views/likm/Grid.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/treeGrid/**/*"]
}
},
{
"name": "route.testcase.likm.toolbar",
"path": "testcase/likm/toolbar",
"parent": "/",
"priority": 0,
"component": "component.testcase.toolbar",
"componentPath": "@/views/likm/Toolbar.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/treeGrid/**/*"]
}
},
{
"name": "route.testcase.likm.quasarGrid",
"path": "testcase/likm/quasarGrid",
"parent": "/",
"priority": 0,
"component": "component.testcase.quasarGrid",
"componentPath": "@/views/likm/QuasarGrid.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/treeGrid/**/*"]
}
},
{
"name": "route.testcase.likm.gridLayout",
"path": "testcase/likm/gridLayout",
"parent": "/",
"priority": 0,
"component": "component.testcase.gridLayout",
"componentPath": "@/views/likm/GridLayout.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/treeGrid/**/*"]
}
},
{
"name": "route.testcase.likm.likmTreeGrid",
"path": "testcase/likm/likmTreeGrid",
"parent": "/",
"priority": 0,
"component": "component.testcase.likmTreeGrid",
"componentPath": "@/views/likm/TreeGrid.vue",
"redirect": null,
"meta": {
"permissions": ["/testcase/treeGrid/**/*"]
} }
} }
] ]

50
io.sc.platform.core.frontend/template-project/src/views/TreeGrid.vue

@ -1,18 +1,56 @@
<template> <template>
<w-tree-grid title="Hello" :columns="columns" :rows="data"></w-tree-grid> <w-list-grid
:tree="true"
title="User List"
:no-action-icon="true"
:target-object-name="$t('菜单')"
:actions="[
'query',
'refresh',
'expandAll',
'selectAll',
'separator',
'add',
'clone',
'edit',
'remove',
'removeAll',
'separator',
'detail',
'addTop',
'addChild',
]"
:columns="columns"
:auto-fetch-data="true"
:data-url="Environment.apiContextPath('/api/system/menu/allMenus')"
></w-list-grid>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, toRaw, onMounted } from 'vue'; import { ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { Environment, axios, BackendTools } from '@/platform'; import { Environment } from '@/platform';
const { t } = useI18n(); const { t } = useI18n();
const columns = [ const columns = [
{ {
name: 'loginName', name: 'name',
required: true,
label: t('name'),
align: 'left',
field: 'name',
sortable: true,
format: (value, data) => {
return t(data.titleI18nKey);
}, },
},
{ name: 'type', align: 'center', label: 'type', field: 'type', sortable: true },
{ name: 'enable', label: 'enable', field: 'enable', sortable: true },
{ name: 'dataComeFrom', label: 'dataComeFrom', field: 'dataComeFrom' },
{ name: 'lastModifier', label: 'lastModifier', field: 'lastModifier' },
{ name: 'lastModifyDate', label: 'lastModifyDate', field: 'lastModifyDate' },
{ name: 'corporationCode', label: 'corporationCode', field: 'corporationCode', sortable: true },
]; ];
const data = [{ loginName: 'admin' }, { loginName: 'wsp' }];
</script> </script>

99
io.sc.platform.developer.doc/asciidoc/9999-appendix/oauth2/oauth2.adoc

@ -57,14 +57,93 @@ private_key_jwt 和 client_secret_jwt 唯一的区别就是生成 JWT 的方式
== 请求点 == 请求点
|=== |===
| method | endpoint | 说明 | endpoint | method | 说明
| GET | /.well-known/oauth-authorization-server | meta data | /.well-known/oauth-authorization-server | GET | meta data
| GET | /.well-known/openid-configuration | meta data | /.well-known/openid-configuration | GET | meta data
| GET/POST | /oauth2/authorize | 获取授权码 | /oauth2/authorize | GET/POST | 获取授权码
| POST | /oauth2/token | 获取访问令牌 | /oauth2/token | POST | 获取访问令牌
| POST | /oauth2/introspect | 内省 | /oauth2/introspect | POST | 内省
| POST | /oauth2/revoke | 收回令牌 | /oauth2/revoke | POST | 收回令牌
| GET/POST | /userinfo | 用户信息 | /userinfo | GET/POST | 用户信息
| GET | /oauth2/jwks | JWK(JSON Web 密钥) + JWS(JSON Web 签名) | /oauth2/jwks | GET | JWK+ JWS
| POST | /connect/register | oidc 客户端注册 | /connect/register | POST | oidc 客户端注册
|=== |===
=== /oauth2/authorize
| 参数名 | 参数类型 | 参数值 | 说明
| client_id | 请求 | |
| response_type | 请求 | code | 授权码
| redirect_uri | 请求 | |
| scope | 请求 | |
| state | 请求 | |
| code | 响应 | |
| scope | 响应 | |
| state | 响应 | |
| access_token | 响应 | |
| token_type | 响应 | |
| expires_in | 响应 | |
| error | 响应 | |
| error_description | 响应 | |
| error_uri | 响应 | |
=== /oauth2/token
| 参数名 | 参数类型 | 参数值 | 说明
| client_id | 请求 | |
| client_secret | 请求 | |
| client_assertion_type | 请求 | |
| client_assertion | 请求 | |
| assertion | 请求 | |
| grant_type | 请求 | |
| redirect_uri | 请求 | |
| scope | 请求 | |
| code | 请求 | |
| refresh_token | 请求 | |
| username | 请求 | |
| password | 请求 | |
| scope | 响应 | |
| access_token | 响应 | |
| token_type | 响应 | |
| expires_in | 响应 | |
| refresh_token | 响应 | |
| error | 响应 | |
| error_description | 响应 | |
| error_uri | 响应 | |
=== /oauth2/revoke
| 参数名 | 参数类型 | 参数值 | 说明
| token | 请求 | |
| token_type_hint | 请求 | |
=== 获取授权码
http://localhost:8080/oauth2/authorize?client_secret=secret&client_id=platform-oidc&response_type=code&redirect_uri=http://localhost:8080/oauth2/authorized-oidc
|===
| 参数名 | 参数值 | 说明
| client_id | | 注册客户端 ID
| response_type | code | 响应类型
|
|===
org.springframework.security.web.session.DisableEncodeUrlFilter,
org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter,
org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.AuthorizationServerContextFilter,
org.springframework.security.web.context.SecurityContextPersistenceFilter,
org.springframework.security.web.header.HeaderWriterFilter,
org.springframework.security.web.csrf.CsrfFilter,
org.springframework.security.web.authentication.logout.LogoutFilter,
org.springframework.security.oauth2.server.authorization.web.OAuth2AuthorizationServerMetadataEndpointFilter,
org.springframework.security.oauth2.server.authorization.web.OAuth2AuthorizationEndpointFilter,
org.springframework.security.oauth2.server.authorization.oidc.web.OidcProviderConfigurationEndpointFilter,
org.springframework.security.oauth2.server.authorization.web.NimbusJwkSetEndpointFilter,
org.springframework.security.oauth2.server.authorization.web.OAuth2ClientAuthenticationFilter,
org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter,
org.springframework.security.web.savedrequest.RequestCacheAwareFilter,
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter,
org.springframework.security.web.authentication.AnonymousAuthenticationFilter,
org.springframework.security.web.session.SessionManagementFilter,
org.springframework.security.web.access.ExceptionTranslationFilter,
org.springframework.security.web.access.intercept.FilterSecurityInterceptor,
org.springframework.security.oauth2.server.authorization.web.OAuth2TokenEndpointFilter,
org.springframework.security.oauth2.server.authorization.web.OAuth2TokenIntrospectionEndpointFilter,
org.springframework.security.oauth2.server.authorization.web.OAuth2TokenRevocationEndpointFilter,
org.springframework.security.oauth2.server.authorization.oidc.web.OidcUserInfoEndpointFilter

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

@ -77,7 +77,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.49", "platform-core": "8.1.55",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",
@ -90,7 +90,7 @@
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1", "@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.5", "@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2", "@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0", "@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5", "@codemirror/search": "6.5.5",

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

@ -73,7 +73,7 @@
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1", "@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.5", "@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2", "@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0", "@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5", "@codemirror/search": "6.5.5",
@ -90,7 +90,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.49", "platform-core": "8.1.55",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",

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

@ -77,7 +77,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.49", "platform-core": "8.1.55",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",
@ -90,7 +90,7 @@
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1", "@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.5", "@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2", "@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0", "@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5", "@codemirror/search": "6.5.5",

4
io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/enum.properties

@ -7,5 +7,5 @@ io.sc.platform.orm.api.enums.BooleanYesNo.TRUE=Yes
io.sc.platform.orm.api.enums.BooleanYesNo.FALSE=No io.sc.platform.orm.api.enums.BooleanYesNo.FALSE=No
# \u6570\u636E\u6765\u6E90\u679A\u4E3E # \u6570\u636E\u6765\u6E90\u679A\u4E3E
io.sc.platform.orm.api.enums.DataComeFrom.MANUAL=Manual io.sc.platform.orm.api.enums.DataComeFrom.INPUT=Manual
io.sc.platform.orm.api.enums.DataComeFrom.AUTO=Auto io.sc.platform.orm.api.enums.DataComeFrom.IMPORT=Import

4
io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/enum_tw_CN.properties

@ -7,5 +7,5 @@ io.sc.platform.orm.api.enums.BooleanYesNo.TRUE=\u662F
io.sc.platform.orm.api.enums.BooleanYesNo.FALSE=\u5426 io.sc.platform.orm.api.enums.BooleanYesNo.FALSE=\u5426
# \u6570\u636E\u6765\u6E90\u679A\u4E3E # \u6570\u636E\u6765\u6E90\u679A\u4E3E
io.sc.platform.orm.api.enums.DataComeFrom.MANUAL=\u4EBA\u5DE5 io.sc.platform.orm.api.enums.DataComeFrom.INPUT=\u4EBA\u5DE5
io.sc.platform.orm.api.enums.DataComeFrom.AUTO=\u81EA\u52D5\u5C0E\u5165 io.sc.platform.orm.api.enums.DataComeFrom.IMPORT=\u5C0E\u5165

4
io.sc.platform.orm.api/src/main/resources/io/sc/platform/orm/api/i18n/enum_zh_CN.properties

@ -7,5 +7,5 @@ io.sc.platform.orm.api.enums.BooleanYesNo.TRUE=\u662F
io.sc.platform.orm.api.enums.BooleanYesNo.FALSE=\u5426 io.sc.platform.orm.api.enums.BooleanYesNo.FALSE=\u5426
# \u6570\u636E\u6765\u6E90\u679A\u4E3E # \u6570\u636E\u6765\u6E90\u679A\u4E3E
io.sc.platform.orm.api.enums.DataComeFrom.MANUAL=\u4EBA\u5DE5 io.sc.platform.orm.api.enums.DataComeFrom.INPUT=\u4EBA\u5DE5
io.sc.platform.orm.api.enums.DataComeFrom.AUTO=\u81EA\u52A8\u5BFC\u5165 io.sc.platform.orm.api.enums.DataComeFrom.IMPORT=\u5BFC\u5165

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

@ -99,6 +99,6 @@
"vue-dompurify-html": "5.0.1", "vue-dompurify-html": "5.0.1",
"vue-i18n": "9.8.0", "vue-i18n": "9.8.0",
"vue-router": "4.2.5", "vue-router": "4.2.5",
"platform-core": "8.1.49" "platform-core": "8.1.55"
} }
} }

16
io.sc.platform.security.frontend/webpack.config.mf.cjs

@ -31,8 +31,21 @@ module.exports = {
exposes: mfExposes, exposes: mfExposes,
// 模块联邦共享库 // 模块联邦共享库
shared: { shared: {
'@codemirror/autocomplete': { requiredVersion: deps['@codemirror/autocomplete'], singleton: true },
'@codemirror/commands': { requiredVersion: deps['@codemirror/commands'], singleton: true },
'@codemirror/lang-html': { requiredVersion: deps['@codemirror/lang-html'], singleton: true },
'@codemirror/lang-java': { requiredVersion: deps['@codemirror/lang-java'], singleton: true },
'@codemirror/lang-javascript': { requiredVersion: deps['@codemirror/lang-javascript'], singleton: true },
'@codemirror/lang-json': { requiredVersion: deps['@codemirror/lang-json'], singleton: true },
'@codemirror/lang-sql': { requiredVersion: deps['@codemirror/lang-sql'], singleton: true },
'@codemirror/lang-xml': { requiredVersion: deps['@codemirror/lang-xml'], singleton: true },
'@codemirror/language': { requiredVersion: deps['@codemirror/language'], singleton: true },
'@codemirror/search': { requiredVersion: deps['@codemirror/search'], singleton: true },
'@codemirror/state': { requiredVersion: deps['@codemirror/state'], singleton: true },
'@codemirror/view': { requiredVersion: deps['@codemirror/view'], singleton: true },
'@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true }, '@vueuse/core': { requiredVersion: deps['@vueuse/core'], singleton: true },
'axios': { requiredVersion: deps['axios'], singleton: true }, 'axios': { requiredVersion: deps['axios'], singleton: true },
'codemirror': { requiredVersion: deps['codemirror'], singleton: true },
'dayjs': { requiredVersion: deps['dayjs'], singleton: true }, 'dayjs': { requiredVersion: deps['dayjs'], singleton: true },
'echarts':{ requiredVersion: deps['echarts'], singleton: true }, 'echarts':{ requiredVersion: deps['echarts'], singleton: true },
'exceljs':{ requiredVersion: deps['exceljs'], singleton: true }, 'exceljs':{ requiredVersion: deps['exceljs'], singleton: true },
@ -42,12 +55,11 @@ module.exports = {
'pinia': { requiredVersion: deps['pinia'], singleton: true }, 'pinia': { requiredVersion: deps['pinia'], singleton: true },
'platform-core': { requiredVersion: deps['platform-core'], singleton: true }, 'platform-core': { requiredVersion: deps['platform-core'], singleton: true },
'quasar': { requiredVersion: deps['quasar'], singleton: true }, 'quasar': { requiredVersion: deps['quasar'], singleton: true },
'react-dnd-html5-backend':{ requiredVersion: deps['react-dnd-html5-backend'], singleton: true },
'vue': { requiredVersion: deps['vue'], singleton: true }, 'vue': { requiredVersion: deps['vue'], singleton: true },
'vue-codemirror6': { requiredVersion: deps['vue-codemirror6'], singleton: true },
'vue-dompurify-html':{ requiredVersion: deps['vue-dompurify-html'], singleton: true }, 'vue-dompurify-html':{ requiredVersion: deps['vue-dompurify-html'], singleton: true },
'vue-i18n': { requiredVersion: deps['vue-i18n'], singleton: true }, 'vue-i18n': { requiredVersion: deps['vue-i18n'], singleton: true },
'vue-router': { requiredVersion: deps['vue-router'], singleton: true }, 'vue-router': { requiredVersion: deps['vue-router'], singleton: true },
'vue3-dnd':{ requiredVersion: deps['vue3-dnd'], singleton: true },
} }
}), }),
] ]

1
io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformOauth2AuthorizationServerAutoConfiguration.java

@ -32,6 +32,7 @@ import org.springframework.security.oauth2.server.authorization.settings.Authori
import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint; import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
import org.springframework.security.web.util.matcher.RequestMatcher; import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException; import java.io.IOException;
import java.security.KeyPair; import java.security.KeyPair;

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

@ -77,7 +77,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.49", "platform-core": "8.1.56",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",
@ -90,7 +90,7 @@
"@codemirror/lang-java": "6.0.1", "@codemirror/lang-java": "6.0.1",
"@codemirror/lang-javascript": "6.2.1", "@codemirror/lang-javascript": "6.2.1",
"@codemirror/lang-json": "6.0.1", "@codemirror/lang-json": "6.0.1",
"@codemirror/lang-sql": "6.5.5", "@codemirror/lang-sql": "6.5.4",
"@codemirror/lang-xml": "6.0.2", "@codemirror/lang-xml": "6.0.2",
"@codemirror/language": "6.10.0", "@codemirror/language": "6.10.0",
"@codemirror/search": "6.5.5", "@codemirror/search": "6.5.5",

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

@ -1,26 +1,18 @@
<template> <template>
<q-splitter :model-value="70" class="w-full h-full"> <q-splitter :model-value="70" class="w-full h-full">
<template #before> <template #before>
<platform-grid <w-grid
ref="userGridRef" ref="userGridRef"
:table-props="{ borderded: false, flat: true }" :title="userGrid.title"
:query-form-cols-number="userConfigure.queryFormColsNumber" :query-form-fields="userGrid.queryFormFields"
:query-form-cols-auto="userConfigure.queryFormColsAuto" :toolbar-actions="userGrid.actions"
:table-title="userConfigure.tableTitle" :data-url="userGrid.dataUrl"
:table-row-key="userConfigure.tableRowKey" :columns="userGrid.columns"
:table-init-load-data="userConfigure.tableInitLoadData" :row-key="userGrid.rowKey"
:table-data-url="userConfigure.tableDataUrl" :editor="userGrid.editor"
:table-show-sort-no="false" :viewer="userGrid.viewer"
:table-columns="userConfigure.tableColumns" @row-click="userGrid.rowClick"
:table-left-column-sticky-number="userConfigure.tableLeftColumnStickyNumber" ></w-grid>
:table-buttons="userConfigure.tableButtons"
:query-form-fields="userConfigure.queryFormFields"
:table-pagination="userConfigure.tablePagination"
:add-form-props="userConfigure.addFormProps"
:table-dense="false"
@row-click="userConfigure.rowClickFun"
>
</platform-grid>
</template> </template>
<template #after> <template #after>
<q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0"> <q-tabs v-model="selectedTabRef" inline-label align="left" :breakpoint="0">
@ -63,7 +55,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { Environment, axios } from 'platform-core'; import { Environment, axios, EnumTools } from 'platform-core';
import SelectRoleDialog from './SelectRoleDialog.vue'; import SelectRoleDialog from './SelectRoleDialog.vue';
import ChangePasswordDialog from './ChangePasswordDialog.vue'; import ChangePasswordDialog from './ChangePasswordDialog.vue';
@ -78,6 +70,120 @@ const changePasswordDialog = ref();
const selectedTabRef = ref('role'); const selectedTabRef = ref('role');
const DataComeFromEnum = await EnumTools.fetch('io.sc.platform.orm.api.enums.DataComeFrom', t);
const userGrid = {
title: t('system.user.gridTitle'),
queryFormFields: [
{ name: 'loginName', label: t('loginName'), type: 'text' },
{ name: 'userName', label: t('userName'), type: 'text' },
{
name: 'enable',
label: t('enable'),
type: 'select',
options: [
{ value: true, label: '是' },
{ value: false, label: '否' },
],
},
{
name: 'dataComeFrom',
label: t('dataComeFrom'),
type: 'select',
options: DataComeFromEnum.list,
},
],
actions: [
'query',
'refresh',
'separator',
'add',
'edit',
'clone',
'remove',
'separator',
{
name: 'setPassword',
label: t('system.user.action.setPassword'),
icon: 'bi-shield-exclamation',
enableIf: function () {},
click: function () {
changePasswordDialog.value.show();
},
},
'view',
'export',
],
dataUrl: Environment.apiContextPath('/api/system/user'),
rowKey: 'id',
columns: [
{ width: 100, name: 'loginName', label: t('loginName') },
{ width: '100%', name: 'userName', label: t('userName') },
{ width: 100, name: 'enable', label: t('isEnable'), format: (value) => (value ? t('yes') : t('no')) },
{ width: 100, name: 'dataComeFrom', label: t('dataComeFrom'), format: (value) => (value ? DataComeFromEnum.map[value] : '') },
{ width: 100, name: 'accountExpired', label: t('accountExpired'), format: (value) => (value ? t('yes') : t('no')) },
{ width: 100, name: 'accountLocked', label: t('accountLocked'), format: (value) => (value ? t('yes') : t('no')) },
{ width: 120, name: 'credentialsExpired', label: t('credentialsExpired'), format: (value) => (value ? t('yes') : t('no')) },
{ width: 110, name: 'lastModifier', label: t('lastModifier') },
{ width: 115, name: 'lastModifyDate', label: t('lastModifyDate') },
],
editor: {
dialog: {},
form: {
colsNum: 1,
fields: [
{ name: 'loginName', label: t('loginName'), type: 'text', required: true },
{ name: 'userName', label: t('userName'), type: 'text', required: true },
{ name: 'password', label: t('password'), type: 'password' },
{ name: 'confirmPassword', label: t('confirmPassword'), type: 'password' },
{ name: 'description', label: t('description'), type: 'textarea' },
{ name: 'email', label: t('email'), type: 'text' },
{ name: 'phone', label: t('phone'), type: 'text' },
{ name: 'mobile', label: t('mobile'), type: 'text' },
{ name: 'weixin', label: t('weixin'), type: 'text' },
{ name: 'qq', label: t('qq'), type: 'text' },
{ name: 'enable', label: t('enable'), type: 'checkbox', defaultValue: true },
{ name: 'accountExpired', label: t('accountExpired'), type: 'checkbox' },
{ name: 'accountLocked', label: t('accountLocked'), type: 'checkbox' },
{ name: 'credentialsExpired', label: t('credentialsExpired'), type: 'checkbox' },
],
},
},
viewer: {
panel: {
columnNum: 2,
fields: [
{ name: 'loginName', label: t('loginName') },
{ name: 'userName', label: t('userName') },
{ name: 'password', label: t('password') },
{ name: 'confirmPassword', label: t('confirmPassword') },
{ name: 'description', label: t('description') },
{ name: 'email', label: t('email') },
{ name: 'phone', label: t('phone') },
{ name: 'mobile', label: t('mobile') },
{ name: 'weixin', label: t('weixin') },
{ name: 'qq', label: t('qq') },
{ name: 'enable', label: t('enable') },
{ name: 'accountExpired', label: t('accountExpired') },
{ name: 'accountLocked', label: t('accountLocked') },
{ name: 'credentialsExpired', label: t('credentialsExpired') },
],
},
},
rowClick: (evt, row, index) => {
if (roleGridRef.value) {
axios.get(Environment.apiContextPath('/api/system/role/queryRolesByUser?userId=') + row.id).then((response) => {
roleGridRef.value.replaceRowsFun(response.data.content);
});
}
if (orgTreeGridRef.value) {
axios.get(Environment.apiContextPath('/api/system/org/listAllOrgsWithSelectedStatusByUser?userId=') + row.id).then((response) => {
orgTreeGridRef.value.setNodes(response.data);
});
}
},
};
const userConfigure = { const userConfigure = {
queryFormColsNumber: 4, queryFormColsNumber: 4,
queryFormColsAuto: false, queryFormColsAuto: false,
@ -98,8 +204,8 @@ const userConfigure = {
modelName: 'dataComeFrom', modelName: 'dataComeFrom',
type: 'select', type: 'select',
options: [ options: [
{ value: 'MANUAL', label: t('io.sc.platform.orm.api.enums.DataComeFrom.MANUAL') }, { value: 'INPUT', label: t('io.sc.platform.orm.api.enums.DataComeFrom.INPUT') },
{ value: 'AUTO', label: t('io.sc.platform.orm.api.enums.DataComeFrom.AUTO') }, { value: 'IMPORT', label: t('io.sc.platform.orm.api.enums.DataComeFrom.IMPORT') },
], ],
}, },
], ],
@ -141,7 +247,7 @@ const userConfigure = {
{ width: 100, name: 'loginName', label: t('loginName') }, { width: 100, name: 'loginName', label: t('loginName') },
{ width: 100, name: 'userName', label: t('userName') }, { width: 100, name: 'userName', label: t('userName') },
{ width: 100, name: 'enable', label: t('isEnable'), format: (value) => (value ? t('yes') : t('no')) }, { width: 100, name: 'enable', label: t('isEnable'), format: (value) => (value ? t('yes') : t('no')) },
{ width: 100, name: 'dataComeFrom', label: t('dataComeFrom') }, { width: 100, name: 'dataComeFrom', label: t('dataComeFrom'), format: (value) => DataComeFromEnum.map.get(value) },
{ width: 100, name: 'accountExpired', label: t('accountExpired'), format: (value) => (value ? t('yes') : t('no')) }, { width: 100, name: 'accountExpired', label: t('accountExpired'), format: (value) => (value ? t('yes') : t('no')) },
{ width: 100, name: 'accountLocked', label: t('accountLocked'), format: (value) => (value ? t('yes') : t('no')) }, { width: 100, name: 'accountLocked', label: t('accountLocked'), format: (value) => (value ? t('yes') : t('no')) },
{ width: 120, name: 'credentialsExpired', label: t('credentialsExpired'), format: (value) => (value ? t('yes') : t('no')) }, { width: 120, name: 'credentialsExpired', label: t('credentialsExpired'), format: (value) => (value ? t('yes') : t('no')) },
@ -171,9 +277,6 @@ const userConfigure = {
], ],
}, },
rowClickFun: (evt, row, index) => { rowClickFun: (evt, row, index) => {
// push
userGridRef.value.getSelectedRows().splice(0, userGridRef.value.getSelectedRows().length);
userGridRef.value.getSelectedRows().push(row);
if (roleGridRef.value) { if (roleGridRef.value) {
axios.get(Environment.apiContextPath('/api/system/role/queryRolesByUser?userId=') + row.id).then((response) => { axios.get(Environment.apiContextPath('/api/system/role/queryRolesByUser?userId=') + row.id).then((response) => {
roleGridRef.value.replaceRowsFun(response.data.content); roleGridRef.value.replaceRowsFun(response.data.content);

Loading…
Cancel
Save