这是基于vue-vben-admin 模板适用于abp Vnext的前端管理项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

160 lines
5.4 KiB

<template>
<BasicModal
v-bind="$attrs"
@register="registerModal"
:title="formTitle"
:width="660"
:min-height="400"
:mask-closable="false"
@ok="handleOk"
@visible-change="handleVisibleModal"
>
<Form
ref="formElRef"
:model="resourceRef"
:rules="formRules"
:label-col="{ span: 6 }"
:wrapper-col="{ span: 18 }"
>
<Tabs v-model:activeKey="tabActivedKey" @change="handleChangeTab">
<!-- Api 资源基本信息 -->
<TabPane key="basic" :tab="L('Basics')">
<FormItem name="enabled" :label="L('Resource:Enabled')">
<Checkbox v-model:checked="resourceRef.enabled">{{ L('Resource:Enabled') }}</Checkbox>
</FormItem>
<FormItem name="showInDiscoveryDocument" :label="L('ShowInDiscoveryDocument')">
<Checkbox v-model:checked="resourceRef.showInDiscoveryDocument">{{
L('ShowInDiscoveryDocument')
}}</Checkbox>
</FormItem>
<FormItem name="name" required :label="L('Name')">
<BInput v-model:value="resourceRef.name" :disabled="isEdit" />
</FormItem>
<FormItem name="displayName" :label="L('DisplayName')">
<BInput v-model:value="resourceRef.displayName" />
</FormItem>
<FormItem name="description" :label="L('Description')">
<BInput v-model:value="resourceRef.description" />
</FormItem>
<FormItem
name="allowedAccessTokenSigningAlgorithms"
:label="L('AllowedAccessTokenSigningAlgorithms')"
>
<BInput v-model:value="resourceRef.allowedAccessTokenSigningAlgorithms" />
</FormItem>
</TabPane>
<!-- Api 资源用户声明 -->
<TabPane key="claim" :tab="L('UserClaim')">
<UserClaim :target-claims="targetClaims" @change="handleClaimChange" />
</TabPane>
<!-- Api 资源范围 -->
<TabPane key="scope" :tab="L('Scope')">
<ApiResourceScope :target-scopes="targetScopes" @change="handleScopeChange" />
</TabPane>
<!-- Api 资源密钥/属性 -->
<TabPane key="advanced">
<template #tab>
<Dropdown>
<span
>{{ L('Advanced') }}
<DownOutlined />
</span>
<template #overlay>
<Menu @click="handleClickMenu">
<MenuItem key="ApiResourceSecret">{{ L('Secret') }}</MenuItem>
<MenuItem key="Properties">{{ L('Propertites') }}</MenuItem>
</Menu>
</template>
</Dropdown>
</template>
<component
:is="componentsRef[advancedComponent]"
:secrets="resourceRef.secrets"
:properties="resourceRef.properties"
@secrets-new="handleNewSecret"
@secrets-delete="handleDeleteSecret"
@props-new="handleNewProperty"
@props-delete="handleDeleteProperty"
/>
</TabPane>
</Tabs>
</Form>
</BasicModal>
</template>
<script lang="ts" setup>
import { ref, shallowRef, nextTick } from 'vue';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { DownOutlined } from '@ant-design/icons-vue';
import { Checkbox, Dropdown, Menu, Tabs, Form } from 'ant-design-vue';
import { Input } from '/@/components/Input';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { useModal } from '../hooks/useModal';
import { useSecret } from '../hooks/useSecret';
import { useScope } from '../hooks/useScope';
import { useClaim } from '../hooks/useClaim';
import { useProperty } from '../hooks/useProperty';
import ApiResourceScope from './ApiResourceScope.vue';
import ApiResourceSecret from './ApiResourceSecret.vue';
import UserClaim from '../../components/UserClaim.vue';
import Properties from '../../components/Properties.vue';
const FormItem = Form.Item;
const MenuItem = Menu.Item;
const TabPane = Tabs.TabPane;
const BInput = Input!;
const componentsRef = shallowRef({
'ApiResourceSecret': ApiResourceSecret,
'Properties': Properties,
});
const emits = defineEmits(['change', 'register']);
const { createMessage } = useMessage();
const { L } = useLocalization('AbpIdentityServer');
const formElRef = ref<any>(null);
const tabActivedKey = ref('basic');
const advancedComponent = ref('ApiResourceSecret');
const [registerModal, { changeOkLoading }] = useModalInner((val) => {
nextTick(() => {
fetchResource(val.id);
});
});
const {
isEdit,
resourceRef,
formRules,
formTitle,
fetchResource,
handleChangeTab,
handleVisibleModal,
handleSubmit,
} = useModal({
formElRef,
tabActivedKey,
});
const { handleNewSecret, handleDeleteSecret } = useSecret({ resourceRef });
const { handleNewProperty, handleDeleteProperty } = useProperty({ resourceRef });
const { targetClaims, handleClaimChange } = useClaim({ resourceRef });
const { targetScopes, handleScopeChange } = useScope({ resourceRef });
function handleClickMenu(e) {
tabActivedKey.value = 'advanced';
advancedComponent.value = e.key;
}
function handleOk() {
changeOkLoading(true);
handleSubmit().then(() => {
createMessage.success(L('Successful'));
emits('change');
}).finally(() => {
changeOkLoading(false);
});
}
</script>