Browse Source

Merge pull request #772 from colinin/upt-7.0.1

add support resource&language manager
pull/786/head
yx lin 3 years ago
committed by GitHub
parent
commit
0d967b5ed7
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 52
      apps/vue/src/api/localization/languages.ts
  2. 9
      apps/vue/src/api/localization/model/languagesModel.ts
  3. 12
      apps/vue/src/api/localization/model/resourcesModel.ts
  4. 8
      apps/vue/src/api/localization/model/textsModel.ts
  5. 52
      apps/vue/src/api/localization/resources.ts
  6. 18
      apps/vue/src/components/Form/src/hooks/useFormEvents.ts
  7. 56
      apps/vue/src/views/localization/languages/components/LanguageModal.vue
  8. 77
      apps/vue/src/views/localization/languages/components/LanguageTable.vue
  9. 6
      apps/vue/src/views/localization/resources/components/ModalData.ts
  10. 56
      apps/vue/src/views/localization/resources/components/ResourceModal.vue
  11. 77
      apps/vue/src/views/localization/resources/components/ResourceTable.vue
  12. 10
      apps/vue/src/views/localization/resources/components/TableData.ts
  13. 51
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/UI/Vben/VbenViewScriptGenerator.cs
  14. 4
      aspnet-core/modules/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json
  15. 4
      aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN/Abp/Dynamic/Queryable/IDynamicQueryableAppService.cs
  16. 8
      aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableAppService.cs
  17. 4
      aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.HttpApi/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableControllerBase.cs
  18. 3
      aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/en.json
  19. 3
      aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/zh-Hans.json
  20. 16
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs
  21. 15
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs
  22. 14
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateDto.cs
  23. 13
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateOrUpdateDto.cs
  24. 11
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageDto.cs
  25. 4
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageUpdateDto.cs
  26. 10
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateDto.cs
  27. 17
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateOrUpdateDto.cs
  28. 13
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceDto.cs
  29. 4
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceUpdateDto.cs
  30. 81
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs
  31. 2
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LocalizationManagementApplicationMapperProfile.cs
  32. 81
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs
  33. 8
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json
  34. 8
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json
  35. 37
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LocalizationErrorCodes.cs
  36. 13
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Language.cs
  37. 37
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LanguageProvider.cs
  38. 17
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Resource.cs
  39. 6
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/StaticLocalizationSaver.cs
  40. 51
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs
  41. 52
      aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs

52
apps/vue/src/api/localization/languages.ts

@ -1,5 +1,8 @@
import { defAbpHttp } from '/@/utils/http/abp';
import { LanguageListResult } from './model/languagesModel';
import { LanguageListResult, LanguageCreate, LanguageUpdate, Language } from './model/languagesModel';
const remoteServiceName = 'LocalizationManagement';
const controllerName = 'Language';
enum Api {
GetList = '/api/abp/localization/languages',
@ -10,3 +13,50 @@ export const getList = () => {
url: Api.GetList,
});
};
export const GetAsyncByName = (name: string) => {
return defAbpHttp.request<Language>({
service: remoteServiceName,
controller: controllerName,
action: 'GetAsync',
uniqueName: 'GetAsyncByName',
params: {
name: name,
},
});
};
export const CreateAsyncByInput = (input: LanguageCreate) => {
return defAbpHttp.request<Language>({
service: remoteServiceName,
controller: controllerName,
action: 'CreateAsync',
uniqueName: 'CreateAsyncByInput',
data: input,
});
};
export const UpdateAsyncByNameAndInput = (name: string, input: LanguageUpdate) => {
return defAbpHttp.request<Language>({
service: remoteServiceName,
controller: controllerName,
action: 'UpdateAsync',
uniqueName: 'UpdateAsyncByNameAndInput',
params: {
name: name,
},
data: input,
});
};
export const DeleteAsyncByName = (name: string) => {
return defAbpHttp.request<void>({
service: remoteServiceName,
controller: controllerName,
action: 'DeleteAsync',
uniqueName: 'DeleteAsyncByName',
params: {
name: name,
},
});
};

9
apps/vue/src/api/localization/model/languagesModel.ts

@ -8,12 +8,17 @@ export interface Language extends AuditedEntityDto<string> {
export interface LanguageCreateOrUpdate {
enable: boolean;
cultureName: string;
uiCultureName: string;
displayName: string;
flagIcon: string;
}
export interface LanguageCreate extends LanguageCreateOrUpdate {
cultureName: string;
uiCultureName: string;
}
export interface LanguageUpdate extends LanguageCreateOrUpdate {}
export interface LanguageListResult extends ListResultDto<Language> {}
export interface LanguagePagedResult extends PagedResultDto<Language> {}

12
apps/vue/src/api/localization/model/resourcesModel.ts

@ -1,4 +1,5 @@
export interface Resource {
id: string;
name: string;
displayName: string;
description: string;
@ -6,11 +7,18 @@ export interface Resource {
export interface ResourceCreateOrUpdate {
enable: boolean;
name: string;
displayName: string;
description: string;
description?: string;
defaultCultureName?: string;
}
export interface ResourceCreate extends ResourceCreateOrUpdate {
name: string;
}
export interface ResourceUpdate extends ResourceCreateOrUpdate {}
export interface ResourceListResult extends ListResultDto<Resource> {}
export interface ResourcePagedResult extends PagedResultDto<Resource> {}

8
apps/vue/src/api/localization/model/textsModel.ts

@ -1,12 +1,12 @@
export interface Text {
key: boolean;
key: string;
value: string;
cultureName: string;
resourceName: string;
}
export interface TextDifference {
key: boolean;
key: string;
value: string;
cultureName: string;
resourceName: string;
@ -15,7 +15,7 @@ export interface TextDifference {
}
export interface SetTextInput {
key: boolean;
key: string;
value: string;
cultureName: string;
resourceName: string;
@ -24,7 +24,7 @@ export interface SetTextInput {
export interface TextListResult extends ListResultDto<TextDifference> {}
export interface GetTextByKey {
key: boolean;
key: string;
cultureName: string;
resourceName: string;
}

52
apps/vue/src/api/localization/resources.ts

@ -1,5 +1,8 @@
import { defAbpHttp } from '/@/utils/http/abp';
import { ResourceListResult } from './model/resourcesModel';
import { ResourceListResult, Resource, ResourceCreate, ResourceUpdate } from './model/resourcesModel';
const remoteServiceName = 'LocalizationManagement';
const controllerName = 'Resource';
enum Api {
GetList = '/api/abp/localization/resources',
@ -10,3 +13,50 @@ export const getList = () => {
url: Api.GetList,
});
};
export const GetAsyncByName = (name: string) => {
return defAbpHttp.request<Resource>({
service: remoteServiceName,
controller: controllerName,
action: 'GetAsync',
uniqueName: 'GetAsyncByName',
params: {
name: name,
},
});
};
export const CreateAsyncByInput = (input: ResourceCreate) => {
return defAbpHttp.request<Resource>({
service: remoteServiceName,
controller: controllerName,
action: 'CreateAsync',
uniqueName: 'CreateAsyncByInput',
data: input,
});
};
export const UpdateAsyncByNameAndInput = (name: string, input: ResourceUpdate) => {
return defAbpHttp.request<Resource>({
service: remoteServiceName,
controller: controllerName,
action: 'UpdateAsync',
uniqueName: 'UpdateAsyncByNameAndInput',
params: {
name: name,
},
data: input,
});
};
export const DeleteAsyncByName = (name: string) => {
return defAbpHttp.request<void>({
service: remoteServiceName,
controller: controllerName,
action: 'DeleteAsync',
uniqueName: 'DeleteAsyncByName',
params: {
name: name,
},
});
};

18
apps/vue/src/components/Form/src/hooks/useFormEvents.ts

@ -77,11 +77,6 @@ export function useFormEvents({
const hasKey = Reflect.has(values, key);
value = handleInputNumberValue(schema?.component, value);
const { componentProps } = schema || {};
let _props = componentProps as any;
if (typeof componentProps === 'function') {
_props = _props({ formModel: unref(formModel) });
}
// 0| '' is allow
if (hasKey && fields.includes(key)) {
// time type
@ -91,20 +86,17 @@ export function useFormEvents({
for (const ele of value) {
arr.push(ele ? dateUtil(ele) : null);
}
unref(formModel)[key] = arr;
formModel[key] = arr;
} else {
const { componentProps } = schema || {};
let _props = componentProps as any;
if (typeof componentProps === 'function') {
_props = _props({ formModel });
}
unref(formModel)[key] = value ? (_props?.valueFormat ? value : dateUtil(value)) : null;
formModel[key] = value ? (_props?.valueFormat ? value : dateUtil(value)) : null;
}
} else {
unref(formModel)[key] = value;
}
if (_props?.onChange) {
_props?.onChange(value);
formModel[key] = value;
}
validKeys.push(key);
} else {
@ -112,14 +104,14 @@ export function useFormEvents({
try {
const value = nestKey.split('.').reduce((out, item) => out[item], values);
if (isDef(value)) {
unref(formModel)[nestKey] = unref(value);
formModel[nestKey] = value;
validKeys.push(nestKey);
}
} catch (e) {
// key not exist
if (isDef(defaultValueRef.value[nestKey])) {
//formModel[nestKey] = defaultValueRef.value[nestKey];
unref(formModel)[nestKey] = cloneDeep(unref(defaultValueRef.value[nestKey]));
formModel[nestKey] = cloneDeep(defaultValueRef.value[nestKey]);
}
}
});

56
apps/vue/src/views/localization/languages/components/LanguageModal.vue

@ -0,0 +1,56 @@
<template>
<BasicModal
@register="registerModal"
:title="L('Languages')"
:can-fullscreen="false"
:width="800"
:height="500"
@ok="handleSubmit"
>
<BasicForm @register="registerForm" />
</BasicModal>
</template>
<script lang="ts" setup>
import { nextTick } from 'vue';
import { BasicForm, useForm } from '/@/components/Form';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { getModalFormSchemas } from './ModalData';
import { formatToDateTime } from '/@/utils/dateUtil';
import { Language } from '/@/api/localization/model/languagesModel';
import { CreateAsyncByInput, UpdateAsyncByNameAndInput } from '/@/api/localization/languages';
const emits = defineEmits(['change', 'register']);
const { createMessage } = useMessage();
const { L } = useLocalization(['LocalizationManagement', 'AbpLocalization', 'AbpUi']);
const [registerForm, { setFieldsValue, resetFields, validate }] = useForm({
layout: 'vertical',
showActionButtonGroup: false,
schemas: getModalFormSchemas(),
transformDateFunc: (date) => {
return date ? formatToDateTime(date) : '';
},
});
const [registerModal, { closeModal }] = useModalInner((data: Language) => {
nextTick(() => {
resetFields();
setFieldsValue(data);
});
});
function handleSubmit() {
validate().then((input) => {
const api = input.id
? UpdateAsyncByNameAndInput(input.cultureName, input)
: CreateAsyncByInput(input);
api.then((dto) => {
createMessage.success(L('SuccessfullySaved'));
emits('change', dto);
closeModal();
});
});
}
</script>

77
apps/vue/src/views/localization/languages/components/LanguageTable.vue

@ -1,18 +1,58 @@
<template>
<div class="content">
<BasicTable @register="registerTable" />
<BasicTable @register="registerTable">
<template #toolbar>
<Button
v-auth="['LocalizationManagement.Language.Create']"
type="primary"
@click="handleAddNew"
>
{{ L('Language:AddNew') }}
</Button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:stop-button-propagation="true"
:actions="[
{
auth: 'LocalizationManagement.Language.Update',
label: L('Edit'),
icon: 'ant-design:edit-outlined',
onClick: handleEdit.bind(null, record),
},
{
auth: 'LocalizationManagement.Language.Delete',
label: L('Delete'),
color: 'error',
icon: 'ant-design:delete-outlined',
onClick: handleDelete.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
<LanguageModal @register="registerModal" />
</div>
</template>
<script lang="ts" setup>
import { onMounted } from 'vue';
import { Button } from 'ant-design-vue';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { BasicTable, useTable } from '/@/components/Table';
import { BasicTable, TableAction, useTable } from '/@/components/Table';
import { useModal } from '/@/components/Modal';
import { formatPagedRequest } from '/@/utils/http/abp/helper';
import { getList } from '/@/api/localization/languages';
import { getList, GetAsyncByName, DeleteAsyncByName } from '/@/api/localization/languages';
import { Language } from '/@/api/localization/model/languagesModel';
import { getDataColumns } from './TableData';
import LanguageModal from './LanguageModal.vue';
const { L } = useLocalization(['AbpLocalization', 'AbpUi']);
const { createConfirm, createMessage } = useMessage();
const { L } = useLocalization(['LocalizationManagement', 'AbpLocalization', 'AbpUi']);
const [registerModal, { openModal }] = useModal();
const [registerTable, { setTableData, getForm }] = useTable({
rowKey: 'cultureName',
title: L('Languages'),
@ -39,6 +79,11 @@
],
submitFunc: fetchLanguages,
},
actionColumn: {
width: 150,
title: L('Actions'),
dataIndex: 'action',
},
});
onMounted(fetchLanguages);
@ -50,4 +95,28 @@
});
});
}
function handleAddNew() {
openModal(true, {});
}
function handleEdit(record: Language) {
GetAsyncByName(record.cultureName).then((dto) => {
openModal(true, dto);
})
}
function handleDelete(record: Language) {
createConfirm({
iconType: 'warning',
title: L('AreYouSure'),
content: L('ItemWillBeDeletedMessage'),
onOk: () => {
return DeleteAsyncByName(record.cultureName).then(() => {
createMessage.success(L('SuccessfullyDeleted'));
fetchLanguages();
});
},
});
}
</script>

6
apps/vue/src/views/localization/resources/components/ModalData.ts

@ -55,5 +55,11 @@ export function getModalFormSchemas(): FormSchema[] {
label: L('DisplayName:Description'),
colProps: { span: 24 },
},
{
field: 'description',
component: 'InputTextArea',
label: L('DisplayName:Description'),
colProps: { span: 24 },
},
];
}

56
apps/vue/src/views/localization/resources/components/ResourceModal.vue

@ -0,0 +1,56 @@
<template>
<BasicModal
@register="registerModal"
:title="L('Resources')"
:can-fullscreen="false"
:width="800"
:height="500"
@ok="handleSubmit"
>
<BasicForm @register="registerForm" />
</BasicModal>
</template>
<script lang="ts" setup>
import { nextTick } from 'vue';
import { BasicForm, useForm } from '/@/components/Form';
import { BasicModal, useModalInner } from '/@/components/Modal';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { getModalFormSchemas } from './ModalData';
import { formatToDateTime } from '/@/utils/dateUtil';
import { Resource } from '/@/api/localization/model/resourcesModel';
import { CreateAsyncByInput, UpdateAsyncByNameAndInput } from '/@/api/localization/resources';
const emits = defineEmits(['change', 'register']);
const { createMessage } = useMessage();
const { L } = useLocalization(['LocalizationManagement', 'AbpUi']);
const [registerForm, { setFieldsValue, resetFields, validate }] = useForm({
layout: 'vertical',
showActionButtonGroup: false,
schemas: getModalFormSchemas(),
transformDateFunc: (date) => {
return date ? formatToDateTime(date) : '';
},
});
const [registerModal, { closeModal }] = useModalInner((data: Resource) => {
nextTick(() => {
resetFields();
setFieldsValue(data);
});
});
function handleSubmit() {
validate().then((input) => {
const api = input.id
? UpdateAsyncByNameAndInput(input.name, input)
: CreateAsyncByInput(input);
api.then((dto) => {
createMessage.success(L('SuccessfullySaved'));
emits('change', dto);
closeModal();
});
});
}
</script>

77
apps/vue/src/views/localization/resources/components/ResourceTable.vue

@ -1,17 +1,57 @@
<template>
<div class="content">
<BasicTable @register="registerTable" />
<BasicTable @register="registerTable">
<template #toolbar>
<Button
v-auth="['LocalizationManagement.Resource.Create']"
type="primary"
@click="handleAddNew"
>
{{ L('Language:AddNew') }}
</Button>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
:stop-button-propagation="true"
:actions="[
{
auth: 'LocalizationManagement.Resource.Update',
label: L('Edit'),
icon: 'ant-design:edit-outlined',
onClick: handleEdit.bind(null, record),
},
{
auth: 'LocalizationManagement.Resource.Delete',
label: L('Delete'),
color: 'error',
icon: 'ant-design:delete-outlined',
onClick: handleDelete.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
<ResourceModal @register="registerModal" />
</div>
</template>
<script lang="ts" setup>
import { onMounted } from 'vue';
import { Button } from 'ant-design-vue';
import { useMessage } from '/@/hooks/web/useMessage';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { BasicTable, useTable } from '/@/components/Table';
import { getList } from '/@/api/localization/resources';
import { BasicTable, TableAction, useTable } from '/@/components/Table';
import { useModal } from '/@/components/Modal';
import { getList, GetAsyncByName, DeleteAsyncByName } from '/@/api/localization/resources';
import { Resource } from '/@/api/localization/model/resourcesModel';
import { getDataColumns } from './TableData';
import ResourceModal from './ResourceModal.vue';
const { L } = useLocalization(['LocalizationManagement', 'AbpUi']);
const { createConfirm, createMessage } = useMessage();
const { L } = useLocalization(['LocalizationManagement', 'AbpLocalization', 'AbpUi']);
const [registerModal, { openModal }] = useModal();
const [registerTable, { setTableData, getForm }] = useTable({
rowKey: 'name',
title: L('Resources'),
@ -37,6 +77,11 @@
],
submitFunc: fetchResources,
},
actionColumn: {
width: 150,
title: L('Actions'),
dataIndex: 'action',
},
});
onMounted(fetchResources);
@ -48,4 +93,28 @@
});
});
}
function handleAddNew() {
openModal(true, {});
}
function handleEdit(record: Resource) {
GetAsyncByName(record.name).then((dto) => {
openModal(true, dto);
})
}
function handleDelete(record: Resource) {
createConfirm({
iconType: 'warning',
title: L('AreYouSure'),
content: L('ItemWillBeDeletedMessage'),
onOk: () => {
return DeleteAsyncByName(record.name).then(() => {
createMessage.success(L('SuccessfullyDeleted'));
fetchResources();
});
},
});
}
</script>

10
apps/vue/src/views/localization/resources/components/TableData.ts

@ -35,5 +35,15 @@ export function getDataColumns(): BasicColumn[] {
return last.description?.localeCompare(next.description) ?? -1;
},
},
{
title: L('DisplayName:DefaultCultureName'),
dataIndex: 'defaultCultureName',
align: 'left',
width: 150,
resizable: true,
sorter: (last, next) => {
return last.defaultCultureName?.localeCompare(next.defaultCultureName) ?? -1;
},
},
];
}

51
aspnet-core/modules/cli/LINGYUN.Abp.Cli/LINGYUN/Abp/Cli/UI/Vben/VbenViewScriptGenerator.cs

@ -26,11 +26,30 @@ public class VbenViewScriptGenerator : IVbenViewScriptGenerator, ISingletonDepen
.Select(module => module.Value)
.FirstOrDefault();
var updateAction = controllerModel.Actions
.Where(action => action.Value.Name.Contains("UpdateAsync"))
.Select(action => action.Value)
.FirstOrDefault();
var createAction = controllerModel.Actions
.Where(action => action.Value.Name.Contains("CreateAsync"))
.Select(action => action.Value)
.FirstOrDefault();
var getAction = controllerModel.Actions
.Where(action => action.Value.Name.Contains("GetAsync"))
.Select(action => action.Value)
.FirstOrDefault();
var modalContent = await _templateRenderer.RenderAsync(
"VbenModalView",
new
{
Key = "id",
HasCreate = createAction != null,
GetAction = getAction?.UniqueName ?? "GetAsyncById",
CreateAction = createAction?.UniqueName ?? "CreateAsyncByInput",
HasUpdate = updateAction != null,
UpdateAction = updateAction?.UniqueName ?? "UpdateAsyncByIdAndInput",
HasSubmit = createAction != null || updateAction != null,
Application = controllerModel.ControllerName,
ApiPath = $"/@/api/{moduleDefinition.RemoteServiceName.ToKebabCase()}/{controllerModel.ControllerName.ToKebabCase()}",
RemoteService = moduleDefinition.RemoteServiceName,
@ -62,6 +81,20 @@ public class VbenViewScriptGenerator : IVbenViewScriptGenerator, ISingletonDepen
.Where(action => action.Value.Name.Contains("UpdateAsync"))
.Select(action => action.Value)
.FirstOrDefault();
var createAction = controllerModel.Actions
.Where(action => action.Value.Name.Contains("CreateAsync"))
.Select(action => action.Value)
.FirstOrDefault();
// 高级查询
var getAvailableFieldsAction = controllerModel.Actions
.Where(action => action.Value.Name.Equals("GetAvailableFieldsAsync"))
.Select(action => action.Value)
.FirstOrDefault();
var advancedSearchAction = controllerModel.Actions
.Where(action => action.Value.Name.Equals("GetListAsyncByDynamicInput"))
.Select(action => action.Value)
.FirstOrDefault();
var tableContent = await _templateRenderer.RenderAsync(
"VbenTableView",
@ -69,10 +102,20 @@ public class VbenViewScriptGenerator : IVbenViewScriptGenerator, ISingletonDepen
{
Key = "id",
PagedRequest = pagedResultAction != null,
UpdatePermission = updateAction != null && updateAction.AllowAnonymous != null && updateAction.AllowAnonymous != true,
UpdatePermissionName = $"{moduleDefinition.RemoteServiceName.ToKebabCase()}.{controllerModel.ControllerName.ToKebabCase()}.Update",
DeletePermission = deleteAction != null && deleteAction.AllowAnonymous != null && deleteAction.AllowAnonymous != true,
DeletePermissionName = $"{moduleDefinition.RemoteServiceName.ToKebabCase()}.{controllerModel.ControllerName.ToKebabCase()}.Delete",
HasAdvancedSearch = getAvailableFieldsAction != null && advancedSearchAction != null,
AvailableFieldsAction = getAvailableFieldsAction?.UniqueName ?? "GetAvailableFieldsAsync",
AdvancedSearchAction = advancedSearchAction?.UniqueName ?? "GetListAsyncByDynamicInput",
GetListAction = pagedResultAction?.UniqueName ?? "GetListAsyncByInput",
HasCreate = createAction != null,
CreatePermission = createAction != null && createAction.AllowAnonymous != true,
CreatePermissionName = $"{moduleDefinition.RemoteServiceName.ToPascalCase()}.{controllerModel.ControllerName.ToPascalCase()}.Create",
HasUpdate = updateAction != null,
UpdatePermission = updateAction != null && updateAction.AllowAnonymous != true,
UpdatePermissionName = $"{moduleDefinition.RemoteServiceName.ToPascalCase()}.{controllerModel.ControllerName.ToPascalCase()}.Update",
HasDelete = deleteAction != null,
DeleteAction = deleteAction?.UniqueName ?? "DeleteAsyncById",
DeletePermission = deleteAction != null && deleteAction.AllowAnonymous != true,
DeletePermissionName = $"{moduleDefinition.RemoteServiceName.ToPascalCase()}.{controllerModel.ControllerName.ToPascalCase()}.Delete",
Application = controllerModel.ControllerName,
ModalName = $"{controllerModel.ControllerName.ToPascalCase()}Modal",
ApiPath = $"/@/api/{moduleDefinition.RemoteServiceName.ToKebabCase()}/{controllerModel.ControllerName.ToKebabCase()}",

4
aspnet-core/modules/cli/LINGYUN.Abp.Cli/Properties/launchSettings.json

@ -2,8 +2,8 @@
"profiles": {
"LINGYUN.Abp.Cli": {
"commandName": "Project",
"commandLineArgs": "generate-view -t vben-view -m auditing -o D:\\Projects\\Development\\view-script -url http://127.0.0.1:30000/"
//"commandLineArgs": "generate-proxy -t ts -asp uni-app-axios -u http://127.0.0.1:30025 -m Platform -o D:\\Projects\\Development\\type-script"
"commandLineArgs": "generate-view -t vben-view -m task-management -o D:\\Projects\\Development\\view-script -url http://127.0.0.1:30000/"
// "commandLineArgs": "generate-proxy -t ts -asp vben-dynamic -u http://127.0.0.1:30000 -m task-management -o D:\\Projects\\Development\\type-script"
}
}
}

4
aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application.Contracts/LINGYUN/Abp/Dynamic/Queryable/IDynamicQueryableAppService.cs

@ -13,7 +13,7 @@ public interface IDynamicQueryableAppService<TEntityDto>
/// <summary>
/// 根据动态条件查询数据
/// </summary>
/// <param name="input"></param>
/// <param name="dynamicInput"></param>
/// <returns></returns>
Task<PagedResultDto<TEntityDto>> GetListAsync(GetListByDynamicQueryableInput input);
Task<PagedResultDto<TEntityDto>> GetListAsync(GetListByDynamicQueryableInput dynamicInput);
}

8
aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.Application/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableAppService.cs

@ -56,16 +56,16 @@ public abstract class DynamicQueryableAppService<TEntity, TEntityDto> : Applicat
/// <summary>
/// 根据动态条件查询数据
/// </summary>
/// <param name="input"></param>
/// <param name="dynamicInput"></param>
/// <returns></returns>
public async virtual Task<PagedResultDto<TEntityDto>> GetListAsync(GetListByDynamicQueryableInput input)
public async virtual Task<PagedResultDto<TEntityDto>> GetListAsync(GetListByDynamicQueryableInput dynamicInput)
{
Expression<Func<TEntity, bool>> condition = (e) => true;
condition = condition.DynamicQuery(input.Queryable);
condition = condition.DynamicQuery(dynamicInput.Queryable);
var totalCount = await GetCountAsync(condition);
var entities = await GetListAsync(condition, input);
var entities = await GetListAsync(condition, dynamicInput);
return new PagedResultDto<TEntityDto>(totalCount,
MapToEntitiesDto(entities));

4
aspnet-core/modules/dynamic-queryable/LINGYUN.Abp.Dynamic.Queryable.HttpApi/LINGYUN/Abp/Dynamic/Queryable/DynamicQueryableControllerBase.cs

@ -24,8 +24,8 @@ public abstract class DynamicQueryableControllerBase<TEntityDto> : AbpController
[HttpPost]
[Route("search")]
public Task<PagedResultDto<TEntityDto>> GetListAsync(GetListByDynamicQueryableInput input)
public Task<PagedResultDto<TEntityDto>> GetListAsync(GetListByDynamicQueryableInput dynamicInput)
{
return DynamicQueryableAppService.GetListAsync(input);
return DynamicQueryableAppService.GetListAsync(dynamicInput);
}
}

3
aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/en.json

@ -17,6 +17,7 @@
"DisplayName:UiCultureName": "Ui Culture Name",
"DisplayName:DisplayName": "Display Name",
"DisplayName:FlagIcon": "Flag Icon",
"DisplayName:Description": "Description"
"DisplayName:Description": "Description",
"DisplayName:DefaultCultureName": "Default Culture"
}
}

3
aspnet-core/modules/localization/LINGYUN.Abp.AspNetCore.Mvc.Localization/LINGYUN/Abp/AspNetCore/Mvc/Localization/Resources/zh-Hans.json

@ -17,6 +17,7 @@
"DisplayName:UiCultureName": "Ui文件名称",
"DisplayName:DisplayName": "显示名称",
"DisplayName:FlagIcon": "旗帜图标",
"DisplayName:Description": "描述"
"DisplayName:Description": "描述",
"DisplayName:DefaultCultureName": "默认文化"
}
}

16
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ILanguageAppService.cs

@ -0,0 +1,16 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.LocalizationManagement;
public interface ILanguageAppService : IApplicationService
{
Task<LanguageDto> GetByNameAsync(string name);
Task<LanguageDto> CreateAsync(LanguageCreateDto input);
Task<LanguageDto> UpdateAsync(string name, LanguageUpdateDto input);
Task DeleteAsync(string name);
}

15
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/IResourceAppService.cs

@ -0,0 +1,15 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.LocalizationManagement;
public interface IResourceAppService : IApplicationService
{
Task<ResourceDto> GetByNameAsync(string name);
Task<ResourceDto> CreateAsync(ResourceCreateDto input);
Task<ResourceDto> UpdateAsync(string name, ResourceUpdateDto input);
Task DeleteAsync(string name);
}

14
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateDto.cs

@ -0,0 +1,14 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.LocalizationManagement;
public class LanguageCreateDto : LanguageCreateOrUpdateDto
{
[Required]
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxCultureNameLength))]
public string CultureName { get; set; }
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxUiCultureNameLength))]
public string UiCultureName { get; set; }
}

13
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageCreateOrUpdateDto.cs

@ -0,0 +1,13 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.LocalizationManagement;
public abstract class LanguageCreateOrUpdateDto
{
[Required]
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxDisplayNameLength))]
public string DisplayName { get; set; }
[DynamicStringLength(typeof(LanguageConsts), nameof(LanguageConsts.MaxFlagIconLength))]
public string FlagIcon { get; set; }
}

11
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageDto.cs

@ -0,0 +1,11 @@
using System;
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.LocalizationManagement;
public class LanguageDto : AuditedEntityDto<Guid>
{
public string CultureName { get; set; }
public string UiCultureName { get; set; }
public string DisplayName { get; set; }
public string FlagIcon { get; set; }
}

4
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/LanguageUpdateDto.cs

@ -0,0 +1,4 @@
namespace LINGYUN.Abp.LocalizationManagement;
public class LanguageUpdateDto : LanguageCreateOrUpdateDto
{
}

10
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateDto.cs

@ -0,0 +1,10 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.LocalizationManagement;
public class ResourceCreateDto : ResourceCreateOrUpdateDto
{
[Required]
[DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))]
public string Name { get; set; }
}

17
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceCreateOrUpdateDto.cs

@ -0,0 +1,17 @@
using Volo.Abp.Validation;
namespace LINGYUN.Abp.LocalizationManagement;
public abstract class ResourceCreateOrUpdateDto
{
public bool Enable { get; set; } = true;
[DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))]
public string DisplayName { get; set; }
[DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))]
public string Description { get; set; }
[DynamicStringLength(typeof(ResourceConsts), nameof(ResourceConsts.MaxNameLength))]
public string DefaultCultureName { get; set; }
}

13
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceDto.cs

@ -0,0 +1,13 @@
using System;
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.LocalizationManagement;
public class ResourceDto : AuditedEntityDto<Guid>
{
public bool Enable { get; set; }
public string Name { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
public string DefaultCultureName { get; set; }
}

4
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application.Contracts/LINGYUN/Abp/LocalizationManagement/ResourceUpdateDto.cs

@ -0,0 +1,4 @@
namespace LINGYUN.Abp.LocalizationManagement;
public class ResourceUpdateDto : ResourceCreateOrUpdateDto
{
}

81
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LanguageAppService.cs

@ -0,0 +1,81 @@
using LINGYUN.Abp.LocalizationManagement.Permissions;
using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.ObjectMapping;
namespace LINGYUN.Abp.LocalizationManagement;
[Authorize(LocalizationManagementPermissions.Language.Default)]
public class LanguageAppService : LocalizationAppServiceBase, ILanguageAppService
{
private readonly ILanguageRepository _repository;
public LanguageAppService(ILanguageRepository repository)
{
_repository = repository;
}
public async virtual Task<LanguageDto> GetByNameAsync(string name)
{
var language = await InternalGetByNameAsync(name);
return ObjectMapper.Map<Language, LanguageDto>(language);
}
[Authorize(LocalizationManagementPermissions.Language.Create)]
public async virtual Task<LanguageDto> CreateAsync(LanguageCreateDto input)
{
if (_repository.FindByCultureNameAsync(input.CultureName) != null)
{
throw new BusinessException(LocalizationErrorCodes.Language.NameAlreadyExists)
.WithData(nameof(Language.CultureName), input.CultureName);
}
var language = new Language(
GuidGenerator.Create(),
input.CultureName,
input.UiCultureName,
input.DisplayName,
input.FlagIcon);
language = await _repository.InsertAsync(language);
await CurrentUnitOfWork.SaveChangesAsync();
return ObjectMapper.Map<Language, LanguageDto>(language);
}
[Authorize(LocalizationManagementPermissions.Language.Delete)]
public async virtual Task DeleteAsync(string name)
{
var language = await InternalGetByNameAsync(name);
await _repository.DeleteAsync(language);
await CurrentUnitOfWork.SaveChangesAsync();
}
[Authorize(LocalizationManagementPermissions.Language.Update)]
public async virtual Task<LanguageDto> UpdateAsync(string name, LanguageUpdateDto input)
{
var language = await InternalGetByNameAsync(name);
language.SetFlagIcon(input.FlagIcon);
language.SetDisplayName(input.DisplayName);
await _repository.UpdateAsync(language);
await CurrentUnitOfWork.SaveChangesAsync();
return ObjectMapper.Map<Language, LanguageDto>(language);
}
private async Task<Language> InternalGetByNameAsync(string name)
{
var language = await _repository.FindByCultureNameAsync(name);
return language ?? throw new BusinessException(LocalizationErrorCodes.Language.NameNotFoundOrStaticNotAllowed)
.WithData(nameof(Language.CultureName), name);
}
}

2
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/LocalizationManagementApplicationMapperProfile.cs

@ -6,6 +6,8 @@ namespace LINGYUN.Abp.LocalizationManagement
{
public LocalizationManagementApplicationMapperProfile()
{
CreateMap<Language, LanguageDto>();
CreateMap<Resource, ResourceDto>();
}
}
}

81
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Application/LINGYUN/Abp/LocalizationManagement/ResourceAppService.cs

@ -0,0 +1,81 @@
using LINGYUN.Abp.LocalizationManagement.Permissions;
using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
using Volo.Abp;
namespace LINGYUN.Abp.LocalizationManagement;
[Authorize(LocalizationManagementPermissions.Resource.Default)]
public class ResourceAppService : LocalizationAppServiceBase, IResourceAppService
{
private readonly IResourceRepository _repository;
public ResourceAppService(IResourceRepository repository)
{
_repository = repository;
}
public async virtual Task<ResourceDto> GetByNameAsync(string name)
{
var resource = await InternalGetByNameAsync(name);
return ObjectMapper.Map<Resource, ResourceDto>(resource);
}
[Authorize(LocalizationManagementPermissions.Resource.Create)]
public async virtual Task<ResourceDto> CreateAsync(ResourceCreateDto input)
{
if (_repository.FindByNameAsync(input.Name) != null)
{
throw new BusinessException(LocalizationErrorCodes.Resource.NameAlreadyExists)
.WithData(nameof(Resource.Name), input.Name);
}
var resource = new Resource(
GuidGenerator.Create(),
input.Name,
input.DisplayName,
input.Description,
input.DefaultCultureName);
resource = await _repository.InsertAsync(resource);
await CurrentUnitOfWork.SaveChangesAsync();
return ObjectMapper.Map<Resource, ResourceDto>(resource);
}
[Authorize(LocalizationManagementPermissions.Resource.Delete)]
public async virtual Task DeleteAsync(string name)
{
var resource = await InternalGetByNameAsync(name);
await _repository.DeleteAsync(resource);
await CurrentUnitOfWork.SaveChangesAsync();
}
[Authorize(LocalizationManagementPermissions.Resource.Update)]
public async virtual Task<ResourceDto> UpdateAsync(string name, ResourceUpdateDto input)
{
var resource = await InternalGetByNameAsync(name);
resource.SetDisplayName(input.DisplayName);
resource.SetDescription(input.Description);
resource.SetDefaultCultureName(input.DefaultCultureName);
await _repository.UpdateAsync(resource);
await CurrentUnitOfWork.SaveChangesAsync();
return ObjectMapper.Map<Resource, ResourceDto>(resource);
}
private async Task<Resource> InternalGetByNameAsync(string name)
{
var resource = await _repository.FindByNameAsync(name);
return resource ?? throw new BusinessException(LocalizationErrorCodes.Resource.NameNotFoundOrStaticNotAllowed)
.WithData(nameof(Resource.Name), name);
}
}

8
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/en.json

@ -17,6 +17,12 @@
"Filter": "Filter",
"SaveAndNext": "Save & Next",
"SearchFilter": "Search",
"Text:AddNew": "Add New Text"
"Text:AddNew": "New Text",
"Language:AddNew": "New Language",
"Resource:AddNew": "New Resource",
"Localization:001100": "Language {CultureName} already exists!",
"Localization:001400": "Language name {CultureName} not found or built-in language operation not allowed!",
"Localization:002100": "Resource {Name} already exists!",
"Localization:002400": "Resource Name {Name} not found or built-in resource operation not allowed!"
}
}

8
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/Localization/Resources/zh-Hans.json

@ -17,6 +17,12 @@
"Filter": "过滤字符",
"SaveAndNext": "保存并下一步",
"SearchFilter": "请输入过滤字符",
"Text:AddNew": "添加新文档"
"Text:AddNew": "添加新文档",
"Language:AddNew": "添加新语言",
"Resource:AddNew": "添加新资源",
"Localization:001100": "语言 {CultureName} 已经存在!",
"Localization:001400": "没有找到名为 {CultureName} 的语言名称或内置语言不允许操作!",
"Localization:002100": "资源 {Name} 已经存在!",
"Localization:002400": "没有找到名为 {Name} 的资源名称或内置资源不允许操作!"
}
}

37
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain.Shared/LINGYUN/Abp/LocalizationManagement/LocalizationErrorCodes.cs

@ -0,0 +1,37 @@
namespace LINGYUN.Abp.LocalizationManagement;
public static class LocalizationErrorCodes
{
public const string Namespace = "Localization";
/// <summary>
/// 语言代码002
/// </summary>
public static class Language
{
public const string Prefix = Namespace + ":001";
/// <summary>
/// 语言 {CultureName} 已经存在
/// </summary>
public const string NameAlreadyExists = Prefix + "100";
/// <summary>
/// 没有找到名为 {CultureName} 的语言名称或内置语言不允许操作!
/// </summary>
public const string NameNotFoundOrStaticNotAllowed = Prefix + "400";
}
/// <summary>
/// 资源代码002
/// </summary>
public static class Resource
{
public const string Prefix = Namespace + ":002";
/// <summary>
/// 资源 {Name} 已经存在
/// </summary>
public const string NameAlreadyExists = Prefix + "100";
/// <summary>
/// 没有找到名为 {Name} 的资源名称或内置资源不允许操作!
/// </summary>
public const string NameNotFoundOrStaticNotAllowed = Prefix + "400";
}
}

13
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Language.cs

@ -3,7 +3,6 @@ using System;
using Volo.Abp;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.LocalizationManagement
{
@ -16,10 +15,12 @@ namespace LINGYUN.Abp.LocalizationManagement
public virtual string FlagIcon { get; set; }
protected Language() { }
public Language(
Guid id,
[NotNull] string cultureName,
[NotNull] string uiCultureName,
[NotNull] string displayName,
string flagIcon = null)
: base(id)
{
CultureName = Check.NotNullOrWhiteSpace(cultureName, nameof(cultureName), LanguageConsts.MaxCultureNameLength);
UiCultureName = Check.NotNullOrWhiteSpace(uiCultureName, nameof(uiCultureName), LanguageConsts.MaxUiCultureNameLength);
@ -32,6 +33,16 @@ namespace LINGYUN.Abp.LocalizationManagement
Enable = true;
}
public virtual void SetDisplayName(string displayName)
{
DisplayName = Check.NotNullOrWhiteSpace(displayName, nameof(displayName), LanguageConsts.MaxDisplayNameLength);
}
public virtual void SetFlagIcon(string flagIcon)
{
FlagIcon = Check.Length(flagIcon, nameof(flagIcon), LanguageConsts.MaxFlagIconLength);
}
public virtual void ChangeCulture(string cultureName, string uiCultureName = null, string displayName = null)
{
ChangeCultureInternal(cultureName, uiCultureName, displayName);

37
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/LanguageProvider.cs

@ -0,0 +1,37 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
namespace LINGYUN.Abp.LocalizationManagement;
[ExposeServices(
typeof(ILanguageProvider),
typeof(LanguageProvider))]
public class LanguageProvider : ILanguageProvider, ITransientDependency
{
protected ILanguageRepository Repository { get; }
public LanguageProvider(ILanguageRepository repository)
{
Repository = repository;
}
public async virtual Task<IReadOnlyList<LanguageInfo>> GetLanguagesAsync()
{
var languages = await Repository.GetActivedListAsync();
return languages.Select(MapToLanguageInfo).ToImmutableList();
}
protected virtual LanguageInfo MapToLanguageInfo(Language language)
{
return new LanguageInfo(
language.CultureName,
language.UiCultureName,
language.DisplayName,
language.FlagIcon);
}
}

17
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/Resource.cs

@ -14,10 +14,12 @@ namespace LINGYUN.Abp.LocalizationManagement
public virtual string DefaultCultureName { get; set; }
protected Resource() { }
public Resource(
Guid id,
[NotNull] string name,
[CanBeNull] string displayName = null,
[CanBeNull] string description = null,
[CanBeNull] string defaultCultureName = null)
: base(id)
{
Name = Check.NotNullOrWhiteSpace(name, nameof(name), ResourceConsts.MaxNameLength);
@ -27,5 +29,20 @@ namespace LINGYUN.Abp.LocalizationManagement
Enable = true;
}
public virtual void SetDisplayName(string displayName)
{
DisplayName = Check.Length(displayName, nameof(displayName), ResourceConsts.MaxDisplayNameLength);
}
public virtual void SetDescription(string description)
{
Description = Check.Length(description, nameof(description), ResourceConsts.MaxDescriptionLength);
}
public virtual void SetDefaultCultureName(string defaultCultureName)
{
DefaultCultureName = Check.Length(defaultCultureName, nameof(defaultCultureName), ResourceConsts.MaxDefaultCultureNameLength);
}
}
}

6
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.Domain/LINGYUN/Abp/LocalizationManagement/StaticLocalizationSaver.cs

@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
using Volo.Abp.Localization;
using Volo.Abp.Uow;
@ -14,6 +15,7 @@ namespace LINGYUN.Abp.LocalizationManagement;
[Dependency(ReplaceServices = true)]
public class StaticLocalizationSaver : IStaticLocalizationSaver, ITransientDependency
{
protected IGuidGenerator GuidGenerator { get; }
protected ILanguageRepository LanguageRepository { get; }
protected ITextRepository TextRepository { get; }
protected IResourceRepository ResourceRepository { get; }
@ -23,6 +25,7 @@ public class StaticLocalizationSaver : IStaticLocalizationSaver, ITransientDepen
protected AbpLocalizationPersistenceOptions LocalizationPersistenceOptions { get; }
public StaticLocalizationSaver(
IGuidGenerator guidGenerator,
IServiceProvider serviceProvider,
ILanguageRepository languageRepository,
ITextRepository textRepository,
@ -31,6 +34,7 @@ public class StaticLocalizationSaver : IStaticLocalizationSaver, ITransientDepen
IOptions<AbpLocalizationOptions> localizationOptions,
IOptions<AbpLocalizationPersistenceOptions> localizationPersistenceOptions)
{
GuidGenerator = guidGenerator;
ServiceProvider = serviceProvider;
LanguageRepository = languageRepository;
TextRepository = textRepository;
@ -51,6 +55,7 @@ public class StaticLocalizationSaver : IStaticLocalizationSaver, ITransientDepen
{
await LanguageRepository.InsertAsync(
new Language(
GuidGenerator.Create(),
language.CultureName,
language.UiCultureName,
language.DisplayName,
@ -71,6 +76,7 @@ public class StaticLocalizationSaver : IStaticLocalizationSaver, ITransientDepen
{
await ResourceRepository.InsertAsync(
new Resource(
GuidGenerator.Create(),
localizationResource.ResourceName,
localizationResource.ResourceName,
localizationResource.ResourceName,

51
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/LanguageController.cs

@ -0,0 +1,51 @@
using LINGYUN.Abp.LocalizationManagement.Permissions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
namespace LINGYUN.Abp.LocalizationManagement;
[Authorize(LocalizationManagementPermissions.Language.Default)]
[RemoteService(Name = LocalizationRemoteServiceConsts.RemoteServiceName)]
[Area("localization")]
[Route("api/localization/languages")]
public class LanguageController : AbpControllerBase, ILanguageAppService
{
private readonly ILanguageAppService _service;
public LanguageController(ILanguageAppService service)
{
_service = service;
}
[HttpGet]
[Route("{name}")]
public virtual Task<LanguageDto> GetByNameAsync(string name)
{
return _service.GetByNameAsync(name);
}
[HttpPost]
[Authorize(LocalizationManagementPermissions.Language.Create)]
public virtual Task<LanguageDto> CreateAsync(LanguageCreateDto input)
{
return _service.CreateAsync(input);
}
[HttpDelete]
[Route("{name}")]
[Authorize(LocalizationManagementPermissions.Language.Delete)]
public virtual Task DeleteAsync(string name)
{
return _service.DeleteAsync(name);
}
[HttpPut]
[Route("{name}")]
[Authorize(LocalizationManagementPermissions.Language.Update)]
public virtual Task<LanguageDto> UpdateAsync(string name, LanguageUpdateDto input)
{
return _service.UpdateAsync(name, input);
}
}

52
aspnet-core/modules/lt/LINGYUN.Abp.LocalizationManagement.HttpApi/LINGYUN/Abp/LocalizationManagement/ResourceController.cs

@ -0,0 +1,52 @@
using LINGYUN.Abp.LocalizationManagement.Permissions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.AspNetCore.Mvc;
namespace LINGYUN.Abp.LocalizationManagement;
[Authorize(LocalizationManagementPermissions.Resource.Default)]
[RemoteService(Name = LocalizationRemoteServiceConsts.RemoteServiceName)]
[Area("localization")]
[Route("api/localization/resources")]
public class ResourceController : AbpControllerBase, IResourceAppService
{
private readonly IResourceAppService _service;
public ResourceController(IResourceAppService service)
{
_service = service;
}
[HttpGet]
[Route("{name}")]
public virtual Task<ResourceDto> GetByNameAsync(string name)
{
return _service.GetByNameAsync(name);
}
[HttpPost]
[Authorize(LocalizationManagementPermissions.Resource.Create)]
public virtual Task<ResourceDto> CreateAsync(ResourceCreateDto input)
{
return _service.CreateAsync(input);
}
[HttpDelete]
[Route("{name}")]
[Authorize(LocalizationManagementPermissions.Resource.Delete)]
public virtual Task DeleteAsync(string name)
{
return _service.DeleteAsync(name);
}
[HttpPut]
[Route("{name}")]
[Authorize(LocalizationManagementPermissions.Resource.Update)]
public virtual Task<ResourceDto> UpdateAsync(string name, ResourceUpdateDto input)
{
return _service.UpdateAsync(name, input);
}
}
Loading…
Cancel
Save