Browse Source

增加数据字典类型修改、删除接口

main-auditlogging
WangJunZzz 4 years ago
committed by GitHub
parent
commit
f2ff8922f3
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/Dtos/DeleteDataDictionaryDetailInput.cs
  2. 20
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/Dtos/UpdateDataDictinaryInput.cs
  3. 8
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/Dtos/UpdateDetailInput.cs
  4. 16
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/IDataDictionaryAppService.cs
  5. 13
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application/DataDictionaries/DataDictionaryAppService.cs
  6. 6
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/Aggregates/DataDictionary.cs
  7. 29
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs
  8. 18
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApi/DataDictionaries/DataDictionaryController.cs
  9. 20
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApiTests/DataDictionaries/DataDictionaryControllerTests.cs
  10. 20
      aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApiTests/Lion.AbpPro.DataDictionaryManagement.HttpApiTests.csproj
  11. 1
      aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Program.cs
  12. 100
      vben271/src/services/ServiceProxies.ts
  13. 70
      vben271/src/views/admin/dictionary/AbpDictionary.ts
  14. 54
      vben271/src/views/admin/dictionary/AbpDictionary.vue
  15. 72
      vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue

7
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/Dtos/DeleteDataDictionaryDetailInput.cs

@ -1,10 +1,11 @@
using System;
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dtos;
public class DeleteDataDictionaryDetailInput
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dtos
{
public class DeleteDataDictionaryDetailInput
{
public Guid DataDictionaryId { get; set; }
public Guid DataDictionayDetailId { get; set; }
}
}

20
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/Dtos/UpdateDataDictinaryInput.cs

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dtos
{
public class UpdateDataDictinaryInput
{
[Required]
public Guid Id { get; set; }
[Required]
public string Code { get; set; }
[Required]
public string DisplayText { get; set; }
public string Description { get; set; }
}
}

8
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/Dtos/UpdateDetailInput.cs

@ -1,10 +1,10 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dtos;
public class UpdateDetailInput
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dtos
{
public class UpdateDetailInput
{
[Required] public Guid DataDictionaryId { get; set; }
[Required] public Guid Id { get; set; }
@ -14,4 +14,6 @@ public class UpdateDetailInput
public string Description { get; set; }
public int Order { get; set; }
}
}

16
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/IDataDictionaryAppService.cs

@ -1,6 +1,7 @@
using System.Threading;
using System.Threading.Tasks;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dtos;
using Lion.AbpPro.Extension.Customs.Dtos;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
@ -48,5 +49,20 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
/// <param name="input"></param>
/// <returns></returns>
Task DeleteAsync(DeleteDataDictionaryDetailInput input);
/// <summary>
/// 删除字典类型
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task DeleteDictinaryTypeAsync(IdInput input);
/// <summary>
/// 修改数据字典
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task UpdateAsync(UpdateDataDictinaryInput input);
}
}

13
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application/DataDictionaries/DataDictionaryAppService.cs

@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Aggregates;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dtos;
using Lion.AbpPro.DataDictionaryManagement.Permissions;
using Lion.AbpPro.Extension.Customs.Dtos;
using Lion.AbpPro.Extension.System;
using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Dtos;
@ -112,5 +113,17 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
return _dataDictionaryManager.DeleteAsync(input.DataDictionaryId, input.DataDictionayDetailId);
}
[Authorize(DataDictionaryManagementPermissions.DataDictionaryManagement.Delete)]
public Task DeleteDictinaryTypeAsync(IdInput input)
{
return _dataDictionaryManager.DeleteDictinaryTypeAsync(input.Id);
}
[Authorize(DataDictionaryManagementPermissions.DataDictionaryManagement.Update)]
public Task UpdateAsync(UpdateDataDictinaryInput input)
{
return _dataDictionaryManager.UpdateAsync( input.Id, input.DisplayText, input.Description);
}
}
}

6
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/Aggregates/DataDictionary.cs

@ -114,5 +114,11 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Aggregates
Details.Remove(detail);
}
public void Update(Guid dataDictionayDetailId,string displayText,string description)
{
SetDescription(description);
SetDisplayText(displayText);
}
}
}

29
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs

@ -147,5 +147,34 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
entity.Details.Remove(detail);
await _dataDictionaryRepository.UpdateAsync(entity);
}
public async Task<DataDictionary> UpdateAsync(Guid dataDictionaryId,
string displayText,
string description)
{
var entity = await _dataDictionaryRepository.FindByIdAsync(dataDictionaryId);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
entity.Update(dataDictionaryId,displayText,description);
return await _dataDictionaryRepository.UpdateAsync(entity);
}
/// <summary>
/// 删除字典类型
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task DeleteDictinaryTypeAsync(Guid id)
{
var entity = await _dataDictionaryRepository.FindByIdAsync(id);
if (entity == null)
throw new DataDictionaryDomainException(message: "数据字典不存在");
var detail = entity.Details.FirstOrDefault(e => e.DataDictionaryId == id);
if (detail !=null )
{
entity.Details.Remove(detail);
await _dataDictionaryRepository.UpdateAsync(entity);
}
await _dataDictionaryRepository.DeleteAsync(id);
}
}
}

18
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApi/DataDictionaries/DataDictionaryController.cs

@ -1,9 +1,9 @@
using System.Threading.Tasks;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Dtos;
using Lion.AbpPro.Extension.Customs.Dtos;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
@ -67,5 +67,21 @@ namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries
{
return _dataDictionaryAppService.DeleteAsync(input);
}
[HttpPost("deleteDictinaryType")]
[SwaggerOperation(summary: "删除字典类型", Tags = new[] { "DataDictionary" })]
public Task DeleteDictinaryTypeAsync(IdInput input)
{
return _dataDictionaryAppService.DeleteDictinaryTypeAsync(input);
}
[HttpPost("update")]
[SwaggerOperation(summary: "修改字典类型", Tags = new[] { "DataDictionary" })]
public Task UpdateAsync(UpdateDataDictinaryInput input)
{
return _dataDictionaryAppService.UpdateAsync(input);
}
}
}

20
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApiTests/DataDictionaries/DataDictionaryControllerTests.cs

@ -0,0 +1,20 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Lion.AbpPro.DataDictionaryManagement.DataDictionaries;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Lion.AbpPro.DataDictionaryManagement.DataDictionaries.Tests
{
[TestClass()]
public class DataDictionaryControllerTests
{
[TestMethod()]
public void CreateAsyncTest()
{
Assert.Fail();
}
}
}

20
aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApiTests/Lion.AbpPro.DataDictionaryManagement.HttpApiTests.csproj

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>.NETCoreApp,Version=v6.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
<PackageReference Include="MSTest.TestAdapter" Version="2.2.3" />
<PackageReference Include="MSTest.TestFramework" Version="2.2.3" />
<PackageReference Include="coverlet.collector" Version="3.0.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Lion.AbpPro.DataDictionaryManagement.HttpApi\Lion.AbpPro.DataDictionaryManagement.HttpApi.csproj" />
</ItemGroup>
</Project>

1
aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Program.cs

@ -23,6 +23,7 @@ namespace Lion.AbpPro
{
webBuilder.ConfigureKestrel((context, options) => { options.Limits.MaxRequestBodySize = 1024 * 50; });
webBuilder.UseStartup<Startup>();
webBuilder.UseUrls("http://localhost:44315");
})
.UseSerilog((context, loggerConfiguration) =>
{

100
vben271/src/services/ServiceProxies.ts

@ -3255,7 +3255,39 @@ export class DataDictionaryServiceProxy extends ServiceProxyBase {
}
return Promise.resolve<void>(<any>null);
}
/**
*
* @param body (optional)
* @return Success
*/
update(body: UpdateDetailInput | undefined , cancelToken?: CancelToken | undefined): Promise<void> {
let url_ = this.baseUrl + "/DataDictionary/update";
url_ = url_.replace(/[?&]$/, "");
const content_ = JSON.stringify(body);
let options_ = <AxiosRequestConfig>{
data: content_,
method: "POST",
url: url_,
headers: {
"Content-Type": "application/json",
},
cancelToken
};
return this.transformOptions(options_).then(transformedOptions_ => {
return this.instance.request(transformedOptions_);
}).catch((_error: any) => {
if (isAxiosError(_error) && _error.response) {
return _error.response;
} else {
throw _error;
}
}).then((_response: AxiosResponse) => {
return this.transformResult(url_, _response, (_response: AxiosResponse) => this.processUpdateDetail(_response));
});
}
/**
*
* @param body (optional)
@ -3352,7 +3384,39 @@ export class DataDictionaryServiceProxy extends ServiceProxyBase {
}
return Promise.resolve<void>(<any>null);
}
/**
*
* @param body (optional)
* @return Success
*/
deleteDictinaryType(body: DeleteDataDictionaryInput | undefined , cancelToken?: CancelToken | undefined): Promise<void> {
let url_ = this.baseUrl + "/DataDictionary/deleteDictinaryType";
url_ = url_.replace(/[?&]$/, "");
const content_ = JSON.stringify(body);
let options_ = <AxiosRequestConfig>{
data: content_,
method: "POST",
url: url_,
headers: {
"Content-Type": "application/json",
},
cancelToken
};
return this.transformOptions(options_).then(transformedOptions_ => {
return this.instance.request(transformedOptions_);
}).catch((_error: any) => {
if (isAxiosError(_error) && _error.response) {
return _error.response;
} else {
throw _error;
}
}).then((_response: AxiosResponse) => {
return this.transformResult(url_, _response, (_response: AxiosResponse) => this.processDelete(_response));
});
}
/**
*
* @param body (optional)
@ -10017,6 +10081,42 @@ export interface IDeleteDataDictionaryDetailInput {
dataDictionayDetailId: string;
}
export class DeleteDataDictionaryInput implements IDeleteDataDictionaryInput {
Id!: string;
constructor(data?: IDeleteDataDictionaryInput) {
if (data) {
for (var property in data) {
if (data.hasOwnProperty(property))
(<any>this)[property] = (<any>data)[property];
}
}
}
init(_data?: any) {
if (_data) {
this.Id = _data["Id"];
}
}
static fromJS(data: any): DeleteDataDictionaryInput {
data = typeof data === 'object' ? data : {};
let result = new DeleteDataDictionaryInput();
result.init(data);
return result;
}
toJSON(data?: any) {
data = typeof data === 'object' ? data : {};
data["Id"] = this.Id;
return data;
}
}
export interface IDeleteDataDictionaryInput {
Id: string;
}
export class EmailSettingsDto implements IEmailSettingsDto {
smtpHost!: string | undefined;
smtpPort!: number;

70
vben271/src/views/admin/dictionary/AbpDictionary.ts

@ -7,9 +7,11 @@ import {
DataDictionaryServiceProxy,
SetDataDictinaryDetailInput,
DeleteDataDictionaryDetailInput,
DeleteDataDictionaryInput,
} from '/@/services/ServiceProxies';
import { h } from 'vue';
import { Switch } from 'ant-design-vue';
import { debug } from 'console';
const { t } = useI18n();
export const tableColumns: BasicColumn[] = [
{
@ -258,7 +260,53 @@ export const createDictionaryTypeFormSchema: FormSchema[] = [
},
},
];
//编辑字典类型
export const editDictionaryTypeFormSchema: FormSchema[] = [
{
field: 'code',
label: t('routes.admin.dictionaryCode'),
component: 'Input',
required: true,
colProps: {
span: 22,
},
},
{
field: 'displayText',
label: t('routes.admin.dictionaryDisplayText'),
component: 'Input',
required: true,
colProps: {
span: 22,
},
},
{
field: 'description',
label: t('routes.admin.dictionaryDescription'),
component: 'InputTextArea',
colProps: {
span: 22,
},
},
{
field: 'key',
label: '',
ifShow: false,
component: 'Input',
colProps: {
span: 18,
},
},
{
field: 'id',
label: '',
ifShow: false,
component: 'Input',
colProps: {
span: 18,
},
},
];
/**
*
*
@ -287,7 +335,16 @@ export async function createDictionaryTypeAsync({
changeOkLoading(false);
closeModal();
}
//编辑数据字典类型
export async function editDictionaryTypeAsync({ request, changeOkLoading, validate, closeModal }) {
changeOkLoading(true);
await validate();
const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy();
await _dataDictionaryServiceProxy.update(request);
message.success(t('common.operationSuccess'));
changeOkLoading(false);
closeModal();
}
//启用|禁用详情字典
export async function enableDictionaryAsync(input: SetDataDictinaryDetailInput) {
const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy();
@ -343,3 +400,12 @@ export async function deleleDetailAsync({ dataDictionaryId, dataDictionayDetailI
await _dataDictionaryServiceProxy.delete(request);
reload();
}
export async function deleteDictinaryTypeAsync({ Id, reloadType }) {
const _dataDictionaryServiceProxy = new DataDictionaryServiceProxy();
const request = new DeleteDataDictionaryInput();
request.Id = Id;
await _dataDictionaryServiceProxy.deleteDictinaryType(request);
reloadType();
}

54
vben271/src/views/admin/dictionary/AbpDictionary.vue

@ -18,6 +18,20 @@
{{ t('common.createText') }}</a-button
>
</template>
<template #action="{ record }">
<TableAction
:dropDownActions="[
{
label: t('common.editText'),
onClick: handleEditType.bind(null, record),
},
{
label: t('common.delText'),
onClick: handleDeleteDictinaryType.bind(null, record),
},
]"
/>
</template>
</BasicTable>
<BasicTable @register="registerTable" class="w-3/4 xl:w-4/5" size="small">
@ -51,12 +65,10 @@
/>
</template>
</BasicTable>
<CreateAbpDictionaryType
@reloadType="reloadType"
@register="registerCreateType"
></CreateAbpDictionaryType>
<CreateAbpDictionaryType @reloadType="reloadType" @register="registerCreateType" />
<CreateAbpDictionary @register="registerCreateModal" @reload="reload" />
<EditAbpDictionary @register="registerEditModal" @reload="reload" />
<EditAbpDictionaryType @register="registerEditTypeModal" @reload="reload" />
</PageWrapper>
</div>
</template>
@ -68,6 +80,7 @@
import { BasicModal, useModal } from '/@/components/Modal';
import CreateAbpDictionary from './CreateAbpDictionary.vue';
import EditAbpDictionary from './EditAbpDictionary.vue';
import EditAbpDictionaryType from './EditAbpDictionaryType.vue';
import CreateAbpDictionaryType from './CreateAbpDictionaryType.vue';
import { useI18n } from '/@/hooks/web/useI18n';
@ -79,6 +92,7 @@
searchDictionaryFormSchema,
getDictionaryDetailsAsync,
deleleDetailAsync,
deleteDictinaryTypeAsync,
} from './AbpDictionary';
import { useMessage } from '/@/hooks/web/useMessage';
import { Tag, message } from 'ant-design-vue';
@ -93,12 +107,14 @@
CreateAbpDictionaryType,
CreateAbpDictionary,
EditAbpDictionary,
EditAbpDictionaryType,
},
setup() {
const { t } = useI18n();
const [registerCreateModal, { openModal: createModal }] = useModal();
const [registerEditModal, { openModal: editModal }] = useModal();
const [registerEditTypeModal, { openModal: editTypeModal }] = useModal();
const [registerCreateType, { openModal: createTypeModal }] = useModal();
const selectedDataDictionaryIdRef = ref('');
const selectedDataDictionaryDisplayTextRef = ref('');
@ -119,6 +135,12 @@
canResize: true,
rowSelection: { type: 'radio' },
pagination: false,
actionColumn: {
width: 50,
title: t('common.action'),
dataIndex: 'action',
slots: { customRender: 'action' },
},
});
//
@ -140,7 +162,25 @@
createModal(true, { dictionaryCreate: dictionaryCreate });
}
};
const handleEditType = (record: Recordable) => {
editTypeModal(true, {
record: record,
});
};
const handleDeleteDictinaryType = async (record: Recordable) => {
let msg = t('common.askDelete');
createConfirm({
iconType: 'warning',
title: t('common.tip'),
content: msg,
onOk: async () => {
await deleteDictinaryTypeAsync({
Id: record.id,
reloadType,
});
},
});
};
const [registerTable, { reload }] = useTable({
columns: tableColumns,
formConfig: {
@ -172,7 +212,6 @@
record: record,
});
};
const handleCreateType = () => {
createTypeModal(true);
};
@ -196,8 +235,10 @@
registerTable,
registerCreateModal,
registerEditModal,
registerEditTypeModal,
handleCreate,
handleEdit,
handleEditType,
reload,
registerTypeTable,
registerCreateType,
@ -207,6 +248,7 @@
clearSelectedRowKeys,
t,
handleDelete,
handleDeleteDictinaryType,
};
},
});

72
vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue

@ -0,0 +1,72 @@
<template>
<BasicModal
:title="t('common.editText')"
:canFullscreen="false"
@ok="submit"
@cancel="cancel"
@register="registerModal"
:destroyOnClose="true"
:maskClosable="false"
:minHeight="100"
>
<BasicForm @register="registeDictionaryTypeForm" />
</BasicModal>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { BasicForm, useForm } from '/@/components/Form/index';
import { editDictionaryTypeFormSchema, editDictionaryTypeAsync } from './AbpDictionary';
export default defineComponent({
name: 'EditDictionary',
components: {
BasicModal,
BasicForm,
},
setup(_, { emit }) {
const { t } = useI18n();
const [registerModal, { closeModal, changeOkLoading }] = useModalInner((data) => {
setFieldsValue({
id: data.record.id,
code: data.record.code,
description: data.record.description,
displayText: data.record.displayText,
key: data.record.key,
});
});
const [registeDictionaryTypeForm, { setFieldsValue, getFieldsValue, validate, resetFields }] =
useForm({
labelWidth: 100,
schemas: editDictionaryTypeFormSchema,
showActionButtonGroup: false,
});
const submit = async () => {
try {
let request = getFieldsValue();
await editDictionaryTypeAsync({ request, changeOkLoading, validate, closeModal });
emit('reloadType');
} catch (error) {
changeOkLoading(false);
}
};
const cancel = () => {
resetFields();
closeModal();
};
return {
registerModal,
registeDictionaryTypeForm,
submit,
t,
cancel,
};
},
});
</script>
<style lang="less" scoped></style>
Loading…
Cancel
Save