From bf8c2f5597ffb8b6b3243bdfd48cd2b62c9a85dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=9D=E5=8D=81?= <392706283@qq.com> Date: Thu, 27 Jan 2022 15:34:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE=E5=AD=97?= =?UTF-8?q?=E5=85=B8=E7=B1=BB=E5=9E=8B=E4=BF=AE=E6=94=B9=E5=8F=8A=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=A2=9E=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AD=97=E5=85=B8=E7=B1=BB=E5=9E=8B=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E3=80=81=E5=88=A0=E9=99=A4=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/UpdateDataDictinaryInput.cs | 20 ++++ .../IDataDictionaryAppService.cs | 16 +++ .../DataDictionaryAppService.cs | 13 +++ .../Aggregates/DataDictionary.cs | 6 ++ .../DataDictionaries/DataDictionaryManager.cs | 29 +++++ .../DataDictionaryController.cs | 18 +++- .../DataDictionaryControllerTests.cs | 20 ++++ ...taDictionaryManagement.HttpApiTests.csproj | 20 ++++ .../host/Lion.AbpPro.HttpApi.Host/Program.cs | 1 + vben271/src/services/ServiceProxies.ts | 100 ++++++++++++++++++ .../views/admin/dictionary/AbpDictionary.ts | 70 +++++++++++- .../views/admin/dictionary/AbpDictionary.vue | 54 ++++++++-- .../dictionary/EditAbpDictionaryType.vue | 72 +++++++++++++ 13 files changed, 430 insertions(+), 9 deletions(-) create mode 100644 aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/Dtos/UpdateDataDictinaryInput.cs create mode 100644 aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApiTests/DataDictionaries/DataDictionaryControllerTests.cs create mode 100644 aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApiTests/Lion.AbpPro.DataDictionaryManagement.HttpApiTests.csproj create mode 100644 vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/Dtos/UpdateDataDictinaryInput.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/Dtos/UpdateDataDictinaryInput.cs new file mode 100644 index 00000000..2f5771ec --- /dev/null +++ b/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; } + } +} diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/IDataDictionaryAppService.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/IDataDictionaryAppService.cs index 49d1bc1f..27803a0b 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application.Contracts/DataDictionaries/IDataDictionaryAppService.cs +++ b/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 /// /// Task DeleteAsync(DeleteDataDictionaryDetailInput input); + + /// + /// 删除字典类型 + /// + /// + /// + Task DeleteDictinaryTypeAsync(IdInput input); + + /// + /// 修改数据字典 + /// + /// + /// + Task UpdateAsync(UpdateDataDictinaryInput input); + } } \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application/DataDictionaries/DataDictionaryAppService.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application/DataDictionaries/DataDictionaryAppService.cs index e2d26abb..13dd8619 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Application/DataDictionaries/DataDictionaryAppService.cs +++ b/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); + } } } \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/Aggregates/DataDictionary.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/Aggregates/DataDictionary.cs index 4c43325a..63485e38 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/Aggregates/DataDictionary.cs +++ b/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); + } } } \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs index 71e36252..f4734c4e 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.Domain/DataDictionaries/DataDictionaryManager.cs +++ b/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 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); + + } + /// + /// 删除字典类型 + /// + /// + /// + 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); + } } } \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApi/DataDictionaries/DataDictionaryController.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApi/DataDictionaries/DataDictionaryController.cs index ecc33061..39847e41 100644 --- a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApi/DataDictionaries/DataDictionaryController.cs +++ b/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); + } + } } \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApiTests/DataDictionaries/DataDictionaryControllerTests.cs b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApiTests/DataDictionaries/DataDictionaryControllerTests.cs new file mode 100644 index 00000000..ad95358d --- /dev/null +++ b/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(); + } + } +} \ No newline at end of file diff --git a/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApiTests/Lion.AbpPro.DataDictionaryManagement.HttpApiTests.csproj b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApiTests/Lion.AbpPro.DataDictionaryManagement.HttpApiTests.csproj new file mode 100644 index 00000000..8a3aeacf --- /dev/null +++ b/aspnet-core/modules/DataDictionaryManagement/src/Lion.AbpPro.DataDictionaryManagement.HttpApiTests/Lion.AbpPro.DataDictionaryManagement.HttpApiTests.csproj @@ -0,0 +1,20 @@ + + + + .NETCoreApp,Version=v6.0 + + false + + + + + + + + + + + + + + diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Program.cs b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Program.cs index 053d760b..7d5fc248 100644 --- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Program.cs +++ b/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(); + webBuilder.UseUrls("http://localhost:44315"); }) .UseSerilog((context, loggerConfiguration) => { diff --git a/vben271/src/services/ServiceProxies.ts b/vben271/src/services/ServiceProxies.ts index 134043f3..247fa8b8 100644 --- a/vben271/src/services/ServiceProxies.ts +++ b/vben271/src/services/ServiceProxies.ts @@ -3031,7 +3031,39 @@ export class DataDictionaryServiceProxy extends ServiceProxyBase { } return Promise.resolve(null); } + /** + * 更新字典类型 + * @param body (optional) + * @return Success + */ + update(body: UpdateDetailInput | undefined , cancelToken?: CancelToken | undefined): Promise { + let url_ = this.baseUrl + "/DataDictionary/update"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + + let options_ = { + 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) @@ -3121,7 +3153,39 @@ export class DataDictionaryServiceProxy extends ServiceProxyBase { } return Promise.resolve(null); } + /** + * 删除字典类型 + * @param body (optional) + * @return Success + */ + deleteDictinaryType(body: DeleteDataDictionaryInput | undefined , cancelToken?: CancelToken | undefined): Promise { + let url_ = this.baseUrl + "/DataDictionary/deleteDictinaryType"; + url_ = url_.replace(/[?&]$/, ""); + + const content_ = JSON.stringify(body); + let options_ = { + 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) @@ -8981,6 +9045,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)) + (this)[property] = (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; diff --git a/vben271/src/views/admin/dictionary/AbpDictionary.ts b/vben271/src/views/admin/dictionary/AbpDictionary.ts index bcc5e06d..5152625a 100644 --- a/vben271/src/views/admin/dictionary/AbpDictionary.ts +++ b/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(); +} + diff --git a/vben271/src/views/admin/dictionary/AbpDictionary.vue b/vben271/src/views/admin/dictionary/AbpDictionary.vue index d51f77f2..80c0ae48 100644 --- a/vben271/src/views/admin/dictionary/AbpDictionary.vue +++ b/vben271/src/views/admin/dictionary/AbpDictionary.vue @@ -18,6 +18,20 @@ {{ t('common.createText') }} + @@ -51,12 +65,10 @@ /> - + + @@ -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, }; }, }); diff --git a/vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue b/vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue new file mode 100644 index 00000000..f5da95b0 --- /dev/null +++ b/vben271/src/views/admin/dictionary/EditAbpDictionaryType.vue @@ -0,0 +1,72 @@ + + + + +