diff --git a/.changes/Migration 10.2.0 - 10.4.0.md b/.changes/Migration 10.2.0 - 10.4.0.md new file mode 100644 index 000000000..864bde8f2 --- /dev/null +++ b/.changes/Migration 10.2.0 - 10.4.0.md @@ -0,0 +1,76 @@ +# 10.2.0 - 10.4.0 + +## 模块变更 + +1. [身份标识模块] 增加不活跃用户通知/清理作业,实现了三个通知模板(账户保持活跃通知、账户停用通知、账户删除通知) +2. [身份标识模块] 增加不活跃用户实体 `IdentityUserInactive` 需要执行数据库迁移 +3. [身份标识模块] 增加用户登录Url设置定义: `Abp.Identity.Link.UserLoginUri`, 用于在外部系统中关联用户登录页 +4. [身份认证模块] 增加用户登录Url定义: `Abp.Account.UserLogin` +5. [身份认证模块] 增加关联用户登录功能, 可以实现跨租户用户关联, 切换关联用户登录 +6. [设置管理模块] 增加身份标识模块缺少的设置项: 启用防止密码重用、防止密码重用数量 +7. [设置基础模块] 增加设置定义分组、所属设置、优先级、依赖权限、依赖功能、选择项等常用结构扩展 +8. [设置管理模块] 重构设置管理应用服务接口, 通过预设定的设置定义分组、上下级关系等自动构成Dto结构 + +## 依赖项变更 + +| 库名称 | 原版本 | 现版本 | +| -------------------------------------------- | --------- | ------ | +| Microsoft.AspNetCore.* | 10.0.2 | 10.0.7 | +| Microsoft.Bcl.AsyncInterfaces | 10.0.2 | 10.0.7 | +| Microsoft.Data.Sqlite.Core | 10.0.0 | 10.0.7 | +| Microsoft.EntityFrameworkCore.* | 10.0.2 | 10.0.7 | +| Microting.EntityFrameworkCore.MySql | 10.0.3 | 10.0.7 | +| Microsoft.Extensions.* | 10.0.2 | 10.0.7 | +| OpenTelemetry.Extensions.Hosting | 1.14.0 | 1.15.3 | +| OpenTelemetry.Exporter.Console | 1.14.0 | 1.15.3 | +| OpenTelemetry.Exporter.OpenTelemetryProtocol | 1.14.0 | 1.15.3 | +| OpenTelemetry.Exporter.Zipkin | 1.14.0 | 1.15.3 | +| OpenTelemetry.Instrumentation.AspNetCore | 1.14.0 | 1.15.2 | +| OpenTelemetry.Instrumentation.Http | 1.14.0 | 1.15.1 | +| OpenTelemetry.Instrumentation.Quartz | 1.14.0-beta.2 | 1.15.1-beta.1 | +| OpenTelemetry.Instrumentation.Runtime | 1.14.0 | 1.15.1 | +| OpenTelemetry.Instrumentation.SqlClient | 1.14.0-beta.1 | 1.15.2 | +| OpenIddict.Server.DataProtection | 7.2.0 | 7.5.0 | +| OpenIddict.Validation.DataProtection | 7.2.0 | 7.5.0 | +| System.Threading.Channels | 10.0.0 | 10.0.7 | +| Volo.Abp.* | 10.2.0 | 10.4.0 | +| Volo.Abp.AspNetCore.Mvc.UI.Theme.LeptonXLite | 5.2.0 | 5.4.0 | + + + +## 数据库迁移 + +| Project Name | Database Provider | Scripts | EF Core Version | +| ------------------------ | ----------------- | ---------------------------------------------- | --------------- | +| aspire/AuthServer | PostgreSQL | 20260530060327_Add-Identity-User-Inactive | 10.0.2 | +| services/Single | MySQL | 20260529063257_Add-Identity-User-Inactive | 10.0.3 | +| services/Single | PostgreSQL | 20260530055941_Add-Identity-User-Inactive | 10.0.2 | +| services/Single | SqlServer | 20260530060009_Add-Identity-User-Inactive | 10.0.2 | +| services/AuthServer | MySQL | 20260530061141_Add-Identity-User-Inactive | 10.0.3 | + + +## 数据库连接字符串 + +| Module Name | ConnectionString Name | Example(MySQL) | +| ----------------------------- | ---------------------------- | ------------------------------------------------------------ | +| Default | Default | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| abp/Identity | AbpIdentity | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| abp/IdentityServer | AbpIdentityServer | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| abp/OpenIddict | AbpOpenIddict | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| abp/TenantManagement | AbpTenantManagement(AbpSaas) | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| abp/FeatureManagement | AbpFeatureManagement | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| abp/SettingManagement | AbpSettingManagement | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| abp/PermissionManagement | AbpPermissionManagement | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/AIManagement | AbpAIManagement | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/BlobManagement | AbpBlobManagement | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/DataProtectionManagement | AbpDataProtectionManagement | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/Gdpr | AbpGdpr | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/Saas | AbpSaas | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/LocalizationManagement | AbpLocalizationManagement | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/TextTemplating | AbpTextTemplating | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/Platform | AppPlatform | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/MessageService | MessageService | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/NotificationService | Notifications | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/TaskManagement | TaskManagement | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/WebhooksManagement | WebhooksManagement | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | +| labp/Elsa | Workflow | Server=127.0.0.1;Database=abp;User Id=root;Password=123456;SslMode=None | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2af9bb3f9..fd3852373 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,4 +14,4 @@ jobs: with: repo_token: "${{ secrets.GITHUB_TOKEN }}" prerelease: false - automatic_release_tag: "10.2.0" + automatic_release_tag: "10.4.0" diff --git a/Directory.Packages.props b/Directory.Packages.props index b9d54b3e0..eae775c5f 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,17 +3,17 @@ 10.0.0 2.16.1 3.6.0 - 10.2.0 - 10.2.0 - 10.0.2 - 10.0.2 - 10.0.2 + 10.4.0 + 10.4.0 + 10.0.7 + 10.0.7 + 10.0.7 13.1.0 true - + @@ -164,7 +164,7 @@ - + @@ -186,11 +186,11 @@ - + - + @@ -200,7 +200,7 @@ - + @@ -276,16 +276,16 @@ - - - - - - + + + + + + - - - + + + @@ -318,7 +318,7 @@ - + @@ -333,6 +333,10 @@ + + + + @@ -350,6 +354,7 @@ + @@ -360,8 +365,8 @@ - - + + @@ -378,7 +383,7 @@ - + diff --git a/apps/vben5/apps/app-antd/src/layouts/basic.vue b/apps/vben5/apps/app-antd/src/layouts/basic.vue index c2682b198..eeb8302f4 100644 --- a/apps/vben5/apps/app-antd/src/layouts/basic.vue +++ b/apps/vben5/apps/app-antd/src/layouts/basic.vue @@ -1,10 +1,10 @@ + + + + diff --git a/apps/vben5/packages/@abp/account/src/components/index.ts b/apps/vben5/packages/@abp/account/src/components/index.ts index 807e2f91a..3bbd032e1 100644 --- a/apps/vben5/packages/@abp/account/src/components/index.ts +++ b/apps/vben5/packages/@abp/account/src/components/index.ts @@ -1,3 +1,4 @@ export { default as MyProfile } from './MyProfile.vue'; export { default as MySetting } from './MySetting.vue'; export { default as QrCodeLogin } from './QrCodeLogin.vue'; +export { default as UserLinkModal } from './UserLinkModal.vue'; diff --git a/apps/vben5/packages/@abp/account/src/hooks/useOAuthService.ts b/apps/vben5/packages/@abp/account/src/hooks/useOAuthService.ts index 92e064aeb..d5e87dd90 100644 --- a/apps/vben5/packages/@abp/account/src/hooks/useOAuthService.ts +++ b/apps/vben5/packages/@abp/account/src/hooks/useOAuthService.ts @@ -1,4 +1,7 @@ +import type { SigninRedirectArgs, SignoutRedirectArgs } from 'oidc-client-ts'; + import type { + LinkUserTokenRequest, PasswordTokenRequestModel, PhoneNumberTokenRequest, QrCodeTokenRequest, @@ -7,8 +10,12 @@ import type { import { userManager } from '../utils/auth'; export function useOAuthService() { - async function login() { - return userManager.signinRedirect(); + async function login(args?: SigninRedirectArgs) { + return userManager.signinRedirect(args); + } + + async function loginByLinkUser(input: LinkUserTokenRequest) { + return userManager.signinLinkUser(input); } async function loginByPassword(input: PasswordTokenRequestModel) { @@ -23,8 +30,8 @@ export function useOAuthService() { return userManager.signinQrCode(input); } - async function logout() { - return userManager.signoutRedirect(); + async function logout(args?: SignoutRedirectArgs) { + return userManager.signoutRedirect(args); } async function revokeTokens() { @@ -55,6 +62,7 @@ export function useOAuthService() { return { login, + loginByLinkUser, loginByPassword, loginBySmsCode, loginByQrCode, diff --git a/apps/vben5/packages/@abp/account/src/types/index.ts b/apps/vben5/packages/@abp/account/src/types/index.ts index 0f182a66b..dae3e2f1b 100644 --- a/apps/vben5/packages/@abp/account/src/types/index.ts +++ b/apps/vben5/packages/@abp/account/src/types/index.ts @@ -1,6 +1,8 @@ export * from './account'; export * from './bind'; export * from './external-logins'; +export * from './link-user'; export * from './profile'; export * from './token'; export * from './user'; +export type { SigninRedirectArgs } from 'oidc-client-ts'; diff --git a/apps/vben5/packages/@abp/account/src/types/link-user.ts b/apps/vben5/packages/@abp/account/src/types/link-user.ts new file mode 100644 index 000000000..c80c605f4 --- /dev/null +++ b/apps/vben5/packages/@abp/account/src/types/link-user.ts @@ -0,0 +1,14 @@ +interface LinkUserDto { + directlyLinked: boolean; + linkTenantId?: string; + linkTenantName?: string; + linkUserId: string; + linkUserName: string; +} + +interface UnLinkUserInput { + tenantId?: string; + userId: string; +} + +export type { LinkUserDto, UnLinkUserInput }; diff --git a/apps/vben5/packages/@abp/account/src/types/token.ts b/apps/vben5/packages/@abp/account/src/types/token.ts index 653b5cde8..cf06a2e11 100644 --- a/apps/vben5/packages/@abp/account/src/types/token.ts +++ b/apps/vben5/packages/@abp/account/src/types/token.ts @@ -38,6 +38,15 @@ interface PasswordTokenRequestModel { /** 用户名 */ username: string; } +/** 关联用户授权请求数据模型 */ +interface LinkUserTokenRequest { + /** 当前用户访问令牌 */ + accessToken?: string; + /** 关联用户租户Id */ + linkTenantId?: string; + /** 关联用户Id */ + linkUserId: string; +} /** 令牌撤销请求数据类型 */ interface RevokeTokenRequest { /** 令牌 */ @@ -92,6 +101,7 @@ interface ShouldChangePasswordError extends OAuthError { } export type { + LinkUserTokenRequest, OAuthError, OAuthTokenRefreshModel, OAuthTokenResult, diff --git a/apps/vben5/packages/@abp/account/src/utils/auth.ts b/apps/vben5/packages/@abp/account/src/utils/auth.ts index bc15f2775..b32ca9ae9 100644 --- a/apps/vben5/packages/@abp/account/src/utils/auth.ts +++ b/apps/vben5/packages/@abp/account/src/utils/auth.ts @@ -1,6 +1,7 @@ import type { Logger, UserManagerSettings } from 'oidc-client-ts'; import type { + LinkUserTokenRequest, PasswordTokenRequestModel, PhoneNumberTokenRequest, QrCodeTokenRequest, @@ -71,6 +72,28 @@ class AbpUserManager extends UserManager { params.set('userId', model.userId); } } + async signinLinkUser(params: LinkUserTokenRequest) { + const logger = this._logger.create('signinLinkUser'); + const body = new URLSearchParams({ + LinkUserId: params.linkUserId, + grant_type: 'link_user', + client_id: this.settings.client_id, + }); + if (params.accessToken) { + body.set('access_token', params.accessToken); + } + if (params.linkTenantId) { + body.set('LinkTenantId', params.linkTenantId); + } + const client_secret = this.settings.client_secret; + if (client_secret) { + body.set('client_secret', client_secret); + } + this._writeUserId(body, params); + this._writeTenantId(body, params); + this._writeTwoFactorToken(body, params); + return await this._fetchUser(logger, body); + } async signinQrCode(params: QrCodeTokenRequest) { const logger = this._logger.create('signinQrCode'); const client_secret = this.settings.client_secret; @@ -89,7 +112,6 @@ class AbpUserManager extends UserManager { this._writeTwoFactorToken(body, params); return await this._fetchUser(logger, body); } - override async signinResourceOwnerCredentials( params: PasswordTokenRequestModel, ) { @@ -111,7 +133,6 @@ class AbpUserManager extends UserManager { this._writeChangePasswordToken(body, params); return await this._fetchUser(logger, body); } - async signinSmsCode(params: PhoneNumberTokenRequest) { const logger = this._logger.create('signinSmsCode'); const client_secret = this.settings.client_secret; diff --git a/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionTable.vue b/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionTable.vue index fe687793c..72ebd68af 100644 --- a/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionTable.vue +++ b/apps/vben5/packages/@abp/ai-management/src/components/tools/AIToolDefinitionTable.vue @@ -140,7 +140,8 @@ const gridOptions: VxeGridProps = { custom: true, export: true, // import: true, - refresh: { + refresh: true, + refreshOptions: { code: 'query', }, zoom: true, diff --git a/apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceDefinitionTable.vue b/apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceDefinitionTable.vue index d59fb691e..dc35d5766 100644 --- a/apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceDefinitionTable.vue +++ b/apps/vben5/packages/@abp/ai-management/src/components/workspaces/WorkspaceDefinitionTable.vue @@ -130,7 +130,8 @@ const gridOptions: VxeGridProps = { custom: true, export: true, // import: true, - refresh: { + refresh: true, + refreshOptions: { code: 'query', }, zoom: true, diff --git a/apps/vben5/packages/@abp/auditing/src/components/audit-logs/AuditLogTable.vue b/apps/vben5/packages/@abp/auditing/src/components/audit-logs/AuditLogTable.vue index d841a8a50..7aa2848b8 100644 --- a/apps/vben5/packages/@abp/auditing/src/components/audit-logs/AuditLogTable.vue +++ b/apps/vben5/packages/@abp/auditing/src/components/audit-logs/AuditLogTable.vue @@ -241,7 +241,8 @@ const gridOptions: VxeGridProps = { custom: true, export: true, // import: true, - refresh: { + refresh: true, + refreshOptions: { code: 'query', }, zoom: true, diff --git a/apps/vben5/packages/@abp/auditing/src/components/loggings/LoggingDrawer.vue b/apps/vben5/packages/@abp/auditing/src/components/loggings/LoggingDrawer.vue index 2db94f182..ede5a944e 100644 --- a/apps/vben5/packages/@abp/auditing/src/components/loggings/LoggingDrawer.vue +++ b/apps/vben5/packages/@abp/auditing/src/components/loggings/LoggingDrawer.vue @@ -219,7 +219,7 @@ async function onGet(id: string) { {{ row.hResult }} - {{ row.helpURL }} + {{ row.helpUrl }} diff --git a/apps/vben5/packages/@abp/auditing/src/components/loggings/LoggingTable.vue b/apps/vben5/packages/@abp/auditing/src/components/loggings/LoggingTable.vue index edb0db0a0..d4bd06923 100644 --- a/apps/vben5/packages/@abp/auditing/src/components/loggings/LoggingTable.vue +++ b/apps/vben5/packages/@abp/auditing/src/components/loggings/LoggingTable.vue @@ -278,7 +278,8 @@ const gridOptions: VxeGridProps = { toolbarConfig: { custom: true, export: true, - refresh: { + refresh: true, + refreshOptions: { code: 'query', }, zoom: true, diff --git a/apps/vben5/packages/@abp/blob-management/package.json b/apps/vben5/packages/@abp/blob-management/package.json index de1e2f0ec..93fddb80b 100644 --- a/apps/vben5/packages/@abp/blob-management/package.json +++ b/apps/vben5/packages/@abp/blob-management/package.json @@ -37,13 +37,10 @@ "@vben/locales": "workspace:*", "@vben/stores": "workspace:*", "@vben/utils": "workspace:*", - "@vue-office/docx": "catalog:", - "@vue-office/excel": "catalog:", - "@vue-office/pdf": "catalog:", - "@vue-office/pptx": "catalog:", "ant-design-vue": "catalog:", "vue": "catalog:", "vue-demi": "catalog:", + "vue-files-preview": "catalog:", "vue-simple-uploader": "catalog:", "vxe-table": "catalog:" } diff --git a/apps/vben5/packages/@abp/blob-management/src/api/useBlobsApi.ts b/apps/vben5/packages/@abp/blob-management/src/api/useBlobsApi.ts index f1c109147..9ea8590f7 100644 --- a/apps/vben5/packages/@abp/blob-management/src/api/useBlobsApi.ts +++ b/apps/vben5/packages/@abp/blob-management/src/api/useBlobsApi.ts @@ -32,8 +32,26 @@ export function useBlobsApi() { }); } - function getContentApi(id: string): Promise { - return request(`/api/blob-management/blobs/uid/${id}/content`, { + function generateDownloadUrlApi(id: string): Promise { + return request( + `/api/blob-management/blobs/generate/download-url/${id}`, + { + method: 'GET', + }, + ); + } + + function generatePreviewUrlApi(id: string): Promise { + return request( + `/api/blob-management/blobs/generate/preview-url/${id}`, + { + method: 'GET', + }, + ); + } + + function downloadApi(id: string): Promise { + return request(`/api/blob-management/blobs/download/${id}`, { method: 'GET', responseType: 'blob', }); @@ -70,8 +88,10 @@ export function useBlobsApi() { cancel, createFolderApi, deleteApi, + downloadApi, getApi, - getContentApi, + generateDownloadUrlApi, + generatePreviewUrlApi, getFolderPagedListApi, getFilePagedListApi, getPagedListApi, diff --git a/apps/vben5/packages/@abp/blob-management/src/components/blobs/BlobFilePreviewModal.vue b/apps/vben5/packages/@abp/blob-management/src/components/blobs/BlobFilePreviewModal.vue index 55caa5ddf..69868c3ff 100644 --- a/apps/vben5/packages/@abp/blob-management/src/components/blobs/BlobFilePreviewModal.vue +++ b/apps/vben5/packages/@abp/blob-management/src/components/blobs/BlobFilePreviewModal.vue @@ -64,7 +64,7 @@ const blobType = ref(); const errorMessage = ref(''); const excelComponentKey = ref(0); // 只对 Excel 组件使用 key -const { getContentApi } = useBlobsApi(); +const { downloadApi } = useBlobsApi(); // 文件类型配置 const allowFiles: Record = { @@ -175,7 +175,7 @@ async function onInit() { } // 获取文件内容 - const content = await getContentApi(blob.value.id); + const content = await downloadApi(blob.value.id); // 检查文件大小 if (!isFileSizeValid(content)) { diff --git a/apps/vben5/packages/@abp/blob-management/src/components/blobs/BlobFilePreviewModal1.vue b/apps/vben5/packages/@abp/blob-management/src/components/blobs/BlobFilePreviewModal1.vue new file mode 100644 index 000000000..aac734a60 --- /dev/null +++ b/apps/vben5/packages/@abp/blob-management/src/components/blobs/BlobFilePreviewModal1.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/apps/vben5/packages/@abp/blob-management/src/components/blobs/BlobFileTable.vue b/apps/vben5/packages/@abp/blob-management/src/components/blobs/BlobFileTable.vue index 36dab6532..2d8cdd2ad 100644 --- a/apps/vben5/packages/@abp/blob-management/src/components/blobs/BlobFileTable.vue +++ b/apps/vben5/packages/@abp/blob-management/src/components/blobs/BlobFileTable.vue @@ -35,7 +35,7 @@ const kbUnit = 1 * 1024; const mbUnit = kbUnit * 1024; const gbUnit = mbUnit * 1024; -const { deleteApi, getPagedListApi } = useBlobsApi(); +const { deleteApi, getPagedListApi, generateDownloadUrlApi } = useBlobsApi(); const selectedKeys = ref([]); @@ -169,7 +169,7 @@ const [BlobFileUploadModal, uploadModalApi] = useVbenModal({ }); const [BlobFilePreviewModal, previewModalApi] = useVbenModal({ connectedComponent: defineAsyncComponent( - () => import('./BlobFilePreviewModal.vue'), + () => import('./BlobFilePreviewModal1.vue'), ), }); @@ -191,10 +191,11 @@ function onDownload(row: BlobDto) { centered: true, content: $t('BlobManagement.BlobWellDownloadMessage', [row.name]), onCancel: () => {}, - onOk: () => { + onOk: async () => { + const downloadUrl = await generateDownloadUrlApi(row.id); downloadFileFromUrl({ fileName: row.name, - source: `/api/blob-management/blobs/uid/${row.id}/content`, + source: downloadUrl, }); }, title: $t('AbpUi.AreYouSure'), diff --git a/apps/vben5/packages/@abp/blob-management/src/components/containers/BlobContainerTable.vue b/apps/vben5/packages/@abp/blob-management/src/components/containers/BlobContainerTable.vue index 2f544fe6f..832fa8162 100644 --- a/apps/vben5/packages/@abp/blob-management/src/components/containers/BlobContainerTable.vue +++ b/apps/vben5/packages/@abp/blob-management/src/components/containers/BlobContainerTable.vue @@ -109,7 +109,8 @@ const gridOptions: VxeGridProps = { toolbarConfig: { custom: true, export: true, - refresh: { + refresh: true, + refreshOptions: { code: 'query', }, zoom: true, diff --git a/apps/vben5/packages/@abp/data-protection/src/components/entity-type-infos/EntityTypeInfoTable.vue b/apps/vben5/packages/@abp/data-protection/src/components/entity-type-infos/EntityTypeInfoTable.vue index 37b37e797..574e3f8ee 100644 --- a/apps/vben5/packages/@abp/data-protection/src/components/entity-type-infos/EntityTypeInfoTable.vue +++ b/apps/vben5/packages/@abp/data-protection/src/components/entity-type-infos/EntityTypeInfoTable.vue @@ -91,7 +91,8 @@ const gridOptions: VxeGridProps = { }, }, toolbarConfig: { - refresh: { + refresh: true, + refreshOptions: { code: 'query', }, }, diff --git a/apps/vben5/packages/@abp/demo/src/components/books/BookTable.vue b/apps/vben5/packages/@abp/demo/src/components/books/BookTable.vue index c524544e0..858f22175 100644 --- a/apps/vben5/packages/@abp/demo/src/components/books/BookTable.vue +++ b/apps/vben5/packages/@abp/demo/src/components/books/BookTable.vue @@ -108,7 +108,8 @@ const gridOptions: VxeGridProps = { }, }, toolbarConfig: { - refresh: { + refresh: true, + refreshOptions: { code: 'query', }, }, diff --git a/apps/vben5/packages/@abp/features/src/components/features/FeatureModal.vue b/apps/vben5/packages/@abp/features/src/components/features/FeatureModal.vue index 57bd213f5..0d3ec8e92 100644 --- a/apps/vben5/packages/@abp/features/src/components/features/FeatureModal.vue +++ b/apps/vben5/packages/@abp/features/src/components/features/FeatureModal.vue @@ -269,7 +269,7 @@ async function onSubmit() { + diff --git a/apps/vben5/packages/@abp/settings/src/components/settings/SystemSetting.vue b/apps/vben5/packages/@abp/settings/src/components/settings/SystemSetting.vue index 25d0d2cc0..c1c144fe7 100644 --- a/apps/vben5/packages/@abp/settings/src/components/settings/SystemSetting.vue +++ b/apps/vben5/packages/@abp/settings/src/components/settings/SystemSetting.vue @@ -6,7 +6,7 @@ import { ref } from 'vue'; import { useVbenModal } from '@vben/common-ui'; import { $t } from '@vben/locales'; -import { isEmail, useAbpStore } from '@abp/core'; +import { isEmail } from '@abp/core'; import { FeatureModal } from '@abp/features'; import { Button, Form, InputSearch, message, Modal } from 'ant-design-vue'; @@ -19,14 +19,7 @@ defineOptions({ const FormItem = Form.Item; -const abpStore = useAbpStore(); -const { - getGlobalSettingsApi, - getTenantSettingsApi, - sendTestEmailApi, - setGlobalSettingsApi, - setTenantSettingsApi, -} = useSettingsApi(); +const { getSettingsApi, setSettingsApi, sendTestEmailApi } = useSettingsApi(); const [HostFeatureModal, featureModalApi] = useVbenModal({ connectedComponent: FeatureModal, }); @@ -34,18 +27,12 @@ const [HostFeatureModal, featureModalApi] = useVbenModal({ const sending = ref(false); async function onGet() { - const api = abpStore.application?.currentTenant.isAvailable - ? getTenantSettingsApi - : getGlobalSettingsApi; - const { items } = await api(); + const { items } = await getSettingsApi(); return items; } async function onSubmit(input: SettingsUpdateInput) { - const api = abpStore.application?.currentTenant.isAvailable - ? setTenantSettingsApi - : setGlobalSettingsApi; - await api(input); + await setSettingsApi(input); } async function onSendMail(email: string) { diff --git a/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDrawer.vue b/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDrawer.vue index 715ffb614..d00607eb5 100644 --- a/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDrawer.vue +++ b/apps/vben5/packages/@abp/tasks/src/components/job-infos/JobInfoDrawer.vue @@ -27,7 +27,7 @@ import { } from 'ant-design-vue'; import { useJobInfosApi } from '../../api/useJobInfosApi'; -import { JobPriority, JobType } from '../../types/job-infos'; +import { JobPriority, JobSource, JobType } from '../../types/job-infos'; defineOptions({ name: 'JobInfoDrawer', @@ -40,6 +40,9 @@ interface JobParamter { key: string; value: any; } +interface ModalState extends BackgroundJobInfoDto { + isCopy?: boolean; +} const activedTab = ref('basic'); const jobTypeOptions = reactive([ @@ -79,6 +82,7 @@ const jobPriorityOptions = reactive([ }, ]); const jobDefinetions = ref([]); +const jobArgsDisplayNameMap = ref>({}); const form = useTemplateRef('form'); const formModel = ref({} as BackgroundJobInfoDto); const { createApi, getApi, getDefinitionsApi, updateApi } = useJobInfosApi(); @@ -101,9 +105,9 @@ const [Drawer, drawerApi] = useVbenDrawer({ priority: JobPriority.Normal, } as BackgroundJobInfoDto; drawerApi.setState({ loading: true }); - const dto = drawerApi.getData(); - if (dto?.id) { - await onGet(dto.id); + const state = drawerApi.getData(); + if (state?.id) { + await onGet(state.id, state.isCopy); } else { await onInitDefaultJobs(); drawerApi.setState({ @@ -117,12 +121,23 @@ const [Drawer, drawerApi] = useVbenDrawer({ }, title: $t('BackgroundJobs:Edit'), }); -async function onGet(id: string) { + +async function onGet(id: string, isCopy?: boolean) { const dto = await getApi(id); + if (isCopy === true) { + dto.id = ''; + dto.name = ''; + dto.source = JobSource.User; + drawerApi.setState({ + title: $t('TaskManagement.BackgroundJobs:AddNew'), + }); + await onInitDefaultJobs(); + } else { + drawerApi.setState({ + title: `${$t('TaskManagement.BackgroundJobs:Edit')} - ${dto.name}`, + }); + } formModel.value = dto; - drawerApi.setState({ - title: `${$t('TaskManagement.BackgroundJobs:Edit')} - ${dto.name}`, - }); } async function onInitDefaultJobs() { @@ -148,14 +163,18 @@ async function onSubmit() { function onJobDefineChange(jobName: string) { formModel.value.args = {}; + jobArgsDisplayNameMap.value = {}; const jobDefine = jobDefinetions.value.find((x) => x.name === jobName); if (jobDefine) { const params: Record = {}; + const paramDisplayNames: Record = {}; jobDefine.paramters.forEach((param) => { params[param.name] = undefined; + paramDisplayNames[param.name] = param.displayName; }); formModel.value.args = params; formModel.value.type = jobDefine.name; + jobArgsDisplayNameMap.value = paramDisplayNames; } } @@ -206,6 +225,7 @@ function onDeleteParam(record: JobParamter) { > @@ -217,6 +237,7 @@ function onDeleteParam(record: JobParamter) { > @@ -228,6 +249,7 @@ function onDeleteParam(record: JobParamter) { > @@ -241,6 +263,7 @@ function onDeleteParam(record: JobParamter) {