diff --git a/apps/web-antd/src/api/system/oauth2/client/index.ts b/apps/web-antd/src/api/system/oauth2/client/index.ts index 7c1db774..5817b858 100644 --- a/apps/web-antd/src/api/system/oauth2/client/index.ts +++ b/apps/web-antd/src/api/system/oauth2/client/index.ts @@ -55,3 +55,10 @@ export function updateOAuth2Client(data: SystemOAuth2ClientApi.OAuth2Client) { export function deleteOAuth2Client(id: number) { return requestClient.delete(`/system/oauth2-client/delete?id=${id}`); } + +/** 批量删除 OAuth2.0 客户端 */ +export function deleteOAuth2ClientList(ids: number[]) { + return requestClient.delete( + `/system/oauth2-client/delete-list?ids=${ids.join(',')}`, + ); +} diff --git a/apps/web-antd/src/views/system/oauth2/client/data.ts b/apps/web-antd/src/views/system/oauth2/client/data.ts index 4fd3df70..ba546ef4 100644 --- a/apps/web-antd/src/views/system/oauth2/client/data.ts +++ b/apps/web-antd/src/views/system/oauth2/client/data.ts @@ -109,6 +109,7 @@ export function useFormSchema(): VbenFormSchema[] { componentProps: { placeholder: '请输入授权范围', mode: 'tags', + allowClear: true, }, }, { @@ -179,6 +180,7 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'Input', componentProps: { placeholder: '请输入应用名', + allowClear: true, }, }, { @@ -197,21 +199,26 @@ export function useGridFormSchema(): VbenFormSchema[] { /** 列表的字段 */ export function useGridColumns(): VxeTableGridOptions['columns'] { return [ + { type: 'checkbox', width: 40 }, { field: 'clientId', title: '客户端编号', + minWidth: 120, }, { field: 'secret', title: '客户端密钥', + minWidth: 120, }, { field: 'name', title: '应用名', + minWidth: 120, }, { field: 'logo', title: '应用图标', + minWidth: 100, cellRender: { name: 'CellImage', }, @@ -219,6 +226,7 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'status', title: '状态', + minWidth: 80, cellRender: { name: 'CellDict', props: { type: DICT_TYPE.COMMON_STATUS }, @@ -227,20 +235,24 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { { field: 'accessTokenValiditySeconds', title: '访问令牌的有效期', + minWidth: 150, formatter: ({ cellValue }) => `${cellValue} 秒`, }, { field: 'refreshTokenValiditySeconds', title: '刷新令牌的有效期', + minWidth: 150, formatter: ({ cellValue }) => `${cellValue} 秒`, }, { field: 'authorizedGrantTypes', title: '授权类型', + minWidth: 100, }, { field: 'createTime', title: '创建时间', + minWidth: 180, formatter: 'formatDateTime', }, { diff --git a/apps/web-antd/src/views/system/oauth2/client/index.vue b/apps/web-antd/src/views/system/oauth2/client/index.vue index 388827b6..b15c872e 100644 --- a/apps/web-antd/src/views/system/oauth2/client/index.vue +++ b/apps/web-antd/src/views/system/oauth2/client/index.vue @@ -2,13 +2,17 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { SystemOAuth2ClientApi } from '#/api/system/oauth2/client'; -import { DocAlert, Page, useVbenModal } from '@vben/common-ui'; +import { ref } from 'vue'; + +import { confirm, DocAlert, Page, useVbenModal } from '@vben/common-ui'; +import { isEmpty } from '@vben/utils'; import { message } from 'ant-design-vue'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { deleteOAuth2Client, + deleteOAuth2ClientList, getOAuth2ClientPage, } from '#/api/system/oauth2/client'; import { $t } from '#/locales'; @@ -22,7 +26,7 @@ const [FormModal, formModalApi] = useVbenModal({ }); /** 刷新表格 */ -function onRefresh() { +function handleRefresh() { gridApi.query(); } @@ -40,20 +44,43 @@ function handleEdit(row: SystemOAuth2ClientApi.OAuth2Client) { async function handleDelete(row: SystemOAuth2ClientApi.OAuth2Client) { const hideLoading = message.loading({ content: $t('ui.actionMessage.deleting', [row.name]), - key: 'action_key_msg', + duration: 0, }); try { await deleteOAuth2Client(row.id as number); - message.success({ - content: $t('ui.actionMessage.deleteSuccess', [row.name]), - key: 'action_key_msg', - }); - onRefresh(); + message.success($t('ui.actionMessage.deleteSuccess', [row.name])); + handleRefresh(); } finally { hideLoading(); } } +/** 批量删除 OAuth2 客户端 */ +async function handleDeleteBatch() { + await confirm($t('ui.actionMessage.deleteBatchConfirm')); + const hideLoading = message.loading({ + content: $t('ui.actionMessage.deletingBatch'), + duration: 0, + }); + try { + await deleteOAuth2ClientList(checkedIds.value); + checkedIds.value = []; + message.success($t('ui.actionMessage.deleteSuccess')); + handleRefresh(); + } finally { + hideLoading(); + } +} + +const checkedIds = ref([]); +function handleRowCheckboxChange({ + records, +}: { + records: SystemOAuth2ClientApi.OAuth2Client[]; +}) { + checkedIds.value = records.map((item) => item.id!); +} + const [Grid, gridApi] = useVbenVxeGrid({ formOptions: { schema: useGridFormSchema(), @@ -75,12 +102,17 @@ const [Grid, gridApi] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, search: true, }, } as VxeTableGridOptions, + gridEvents: { + checkboxAll: handleRowCheckboxChange, + checkboxChange: handleRowCheckboxChange, + }, }); @@ -93,7 +125,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ /> - + diff --git a/apps/web-ele/src/views/system/oauth2/client/data.ts b/apps/web-ele/src/views/system/oauth2/client/data.ts index d0a52231..a6511cf9 100644 --- a/apps/web-ele/src/views/system/oauth2/client/data.ts +++ b/apps/web-ele/src/views/system/oauth2/client/data.ts @@ -1,15 +1,11 @@ import type { VbenFormSchema } from '#/adapter/form'; -import type { OnActionClickFn, VxeTableGridOptions } from '#/adapter/vxe-table'; -import type { SystemOAuth2ClientApi } from '#/api/system/oauth2/client'; +import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import { useAccess } from '@vben/access'; import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; import { getDictOptions } from '@vben/hooks'; import { z } from '#/adapter/form'; -const { hasAccessByCodes } = useAccess(); - /** 新增/修改的表单 */ export function useFormSchema(): VbenFormSchema[] { return [ @@ -52,9 +48,6 @@ export function useFormSchema(): VbenFormSchema[] { fieldName: 'logo', label: '应用图标', component: 'ImageUpload', - componentProps: { - limit: 1, - }, rules: 'required', }, { @@ -104,7 +97,7 @@ export function useFormSchema(): VbenFormSchema[] { component: 'Select', componentProps: { options: getDictOptions(DICT_TYPE.SYSTEM_OAUTH2_GRANT_TYPE), - mode: 'multiple', + multiple: true, placeholder: '请输入授权类型', }, rules: 'required', @@ -112,10 +105,9 @@ export function useFormSchema(): VbenFormSchema[] { { fieldName: 'scopes', label: '授权范围', - component: 'Select', + component: 'InputTag', componentProps: { placeholder: '请输入授权范围', - mode: 'tags', }, }, { @@ -124,37 +116,47 @@ export function useFormSchema(): VbenFormSchema[] { component: 'Select', componentProps: { placeholder: '请输入自动授权范围', - mode: 'multiple', - // TODO @芋艿:根据权限,自动授权范围 + multiple: true, + options: [], + }, + dependencies: { + triggerFields: ['scopes'], + componentProps: (values) => ({ + options: values.scopes + ? values.scopes.map((scope: string) => ({ + label: scope, + value: scope, + })) + : [], + }), }, }, { fieldName: 'redirectUris', label: '可重定向的 URI 地址', - component: 'Select', + component: 'InputTag', componentProps: { placeholder: '请输入可重定向的 URI 地址', - mode: 'tags', }, rules: 'required', }, { fieldName: 'authorities', label: '权限', - component: 'Select', + component: 'InputTag', componentProps: { placeholder: '请输入权限', - mode: 'tags', }, + rules: 'required', }, { fieldName: 'resourceIds', label: '资源', - component: 'Select', + component: 'InputTag', componentProps: { - mode: 'tags', placeholder: '请输入资源', }, + rules: 'required', }, { fieldName: 'additionalInformation', @@ -176,6 +178,7 @@ export function useGridFormSchema(): VbenFormSchema[] { component: 'Input', componentProps: { placeholder: '请输入应用名', + clearable: true, }, }, { @@ -192,18 +195,13 @@ export function useGridFormSchema(): VbenFormSchema[] { } /** 列表的字段 */ -export function useGridColumns( - onActionClick: OnActionClickFn, -): VxeTableGridOptions['columns'] { +export function useGridColumns(): VxeTableGridOptions['columns'] { return [ - { - type: 'checkbox', - width: 40, - }, + { type: 'checkbox', width: 40 }, { field: 'clientId', title: '客户端编号', - minWidth: 200, + minWidth: 120, }, { field: 'secret', @@ -213,12 +211,12 @@ export function useGridColumns( { field: 'name', title: '应用名', - minWidth: 300, + minWidth: 120, }, { field: 'logo', title: '应用图标', - minWidth: 80, + minWidth: 100, cellRender: { name: 'CellImage', }, @@ -235,19 +233,19 @@ export function useGridColumns( { field: 'accessTokenValiditySeconds', title: '访问令牌的有效期', - minWidth: 130, + minWidth: 150, formatter: ({ cellValue }) => `${cellValue} 秒`, }, { field: 'refreshTokenValiditySeconds', title: '刷新令牌的有效期', - minWidth: 130, + minWidth: 150, formatter: ({ cellValue }) => `${cellValue} 秒`, }, { field: 'authorizedGrantTypes', title: '授权类型', - minWidth: 180, + minWidth: 100, }, { field: 'createTime', @@ -256,29 +254,10 @@ export function useGridColumns( formatter: 'formatDateTime', }, { - field: 'operation', title: '操作', - minWidth: 130, - align: 'center', + width: 130, fixed: 'right', - cellRender: { - attrs: { - nameField: 'name', - nameTitle: 'OAuth2 客户端', - onClick: onActionClick, - }, - name: 'CellOperation', - options: [ - { - code: 'edit', - show: hasAccessByCodes(['system:oauth2-client:update']), - }, - { - code: 'delete', - show: hasAccessByCodes(['system:oauth2-client:delete']), - }, - ], - }, + slots: { default: 'actions' }, }, ]; } diff --git a/apps/web-ele/src/views/system/oauth2/client/index.vue b/apps/web-ele/src/views/system/oauth2/client/index.vue index ca6f0c92..3dc80eb8 100644 --- a/apps/web-ele/src/views/system/oauth2/client/index.vue +++ b/apps/web-ele/src/views/system/oauth2/client/index.vue @@ -1,8 +1,5 @@