Service Application Service

This commit is contained in:
Sedat ÖZTÜRK 2025-08-20 10:31:56 +03:00
parent d891ae3f85
commit 7e3809f7bb
14 changed files with 7192 additions and 381 deletions

View file

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Application.Dtos;
namespace Kurs.Platform.Services;
public class ServiceDto : FullAuditedEntityDto<Guid>
{
public string? Icon { get; set; }
public string Title { get; set; }
public string? Description { get; set; }
public string Type { get; set; }
public List<ServiceFeatureDto> Features { get; set; } = new();
}
public class ServiceFeatureDto : EntityDto<Guid>
{
public string Name { get; set; }
}

View file

@ -17,5 +17,4 @@ public class DataSourceAppService : CrudAppService<
public DataSourceAppService(IRepository<DataSource, Guid> repo) : base(repo)
{
}
}

View file

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Kurs.Platform.Entities;
using Kurs.Platform.Services;
using Volo.Abp.Domain.Repositories;
namespace Kurs.Platform.Dashboard;
public class ServiceAppService : PlatformAppService
{
private readonly IRepository<Service, Guid> serviceRepository;
public ServiceAppService(
IRepository<Service, Guid> serviceRepository)
{
this.serviceRepository = serviceRepository;
}
public async Task<List<ServiceDto>> GetListAsync()
{
var entity = await serviceRepository.GetListAsync();
return ObjectMapper.Map<List<Service>, List<ServiceDto>>(entity);
}
}

View file

@ -0,0 +1,14 @@
using AutoMapper;
using Kurs.Platform.Entities;
using Kurs.Platform.Services;
namespace Kurs.Platform;
public class ServiceAutoMapperProfile : Profile
{
public ServiceAutoMapperProfile()
{
CreateMap<Service, ServiceDto>();
CreateMap<ServiceFeature, ServiceFeatureDto>();
}
}

View file

@ -277,6 +277,8 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
}
foreach (var item in items.LanguageTexts)
{
try
{
if (!keys.Any(a => a.Key == item.Key))
{
@ -308,6 +310,11 @@ public class PlatformDataSeeder : IDataSeedContributor, ITransientDependency
});
}
}
catch (Exception ex)
{
throw new Exception($"Hata veren Kod:' ResourceName='{item.ResourceName}', Key='{item.Key}'.");
}
}
foreach (var item in items.GlobalSearch)
{

View file

@ -3461,18 +3461,14 @@
"path": "/admin/menuManager",
"componentPath": "@/views/menu/MenuManager",
"routeType": "protected",
"authority": [
"App.Menus.Manager"
]
"authority": ["App.Menus.Manager"]
},
{
"key": "admin.listFormManagement.wizard",
"path": "/admin/listform/wizard",
"componentPath": "@/views/admin/listForm/Wizard",
"routeType": "protected",
"authority": [
"App.Listforms.Wizard"
]
"authority": ["App.Listforms.Wizard"]
},
{
"key": "admin.listFormManagement.edit",
@ -3493,18 +3489,14 @@
"path": "/admin/forumManagement",
"componentPath": "@/views/forum/Management",
"routeType": "protected",
"authority": [
"App.ForumManagement"
]
"authority": ["App.ForumManagement"]
},
{
"key": "admin.ai",
"path": "/admin/ai",
"componentPath": "@/views/ai/Assistant",
"routeType": "protected",
"authority": [
"Abp.Identity.Ai"
]
"authority": ["Abp.Identity.Ai"]
},
{
"key": "admin.profile.general",
@ -3546,36 +3538,28 @@
"path": "/admin/settings",
"componentPath": "@/views/settings/Settings",
"routeType": "protected",
"authority": [
"App.Setting"
]
"authority": ["App.Setting"]
},
{
"key": "admin.identity.user.detail",
"path": "/admin/users/detail/:userId",
"componentPath": "@/views/admin/user-management/Details",
"routeType": "protected",
"authority": [
"AbpIdentity.Users.Update"
]
"authority": ["AbpIdentity.Users.Update"]
},
{
"key": "admin.identity.ous",
"path": "/admin/ous",
"componentPath": "@/views/admin/organization-unit/OrganizationUnits",
"routeType": "protected",
"authority": [
"Abp.Identity.OrganizationUnits"
]
"authority": ["Abp.Identity.OrganizationUnits"]
},
{
"key": "admin.forum",
"path": "/admin/forum",
"componentPath": "@/views/forum/Forum",
"routeType": "protected",
"authority": [
"App.ForumManagement.Publish"
]
"authority": ["App.ForumManagement.Publish"]
},
{
"key": "admin.list",
@ -3624,108 +3608,84 @@
"path": "/admin/developerkit",
"componentPath": "@/views/developerKit/DashboardPage",
"routeType": "protected",
"authority": [
"App.DeveloperKit"
]
"authority": ["App.DeveloperKit"]
},
{
"key": "admin.developerkit.entities",
"path": "/admin/developerkit/entities",
"componentPath": "@/views/developerKit/EntityPage",
"routeType": "protected",
"authority": [
"App.DeveloperKit.Entity"
]
"authority": ["App.DeveloperKit.Entity"]
},
{
"key": "admin.developerkit.entities.new",
"path": "/admin/developerkit/entities/new",
"componentPath": "@/views/developerKit/EntityDetailPage",
"routeType": "protected",
"authority": [
"App.DeveloperKit.Entity"
]
"authority": ["App.DeveloperKit.Entity"]
},
{
"key": "admin.developerkit.entities.edit",
"path": "/admin/developerkit/entities/edit/:id",
"componentPath": "@/views/developerKit/EntityDetailPage",
"routeType": "protected",
"authority": [
"App.DeveloperKit.Entity"
]
"authority": ["App.DeveloperKit.Entity"]
},
{
"key": "admin.developerkit.migrations",
"path": "/admin/developerkit/migrations",
"componentPath": "@/views/developerKit/MigrationPage",
"routeType": "protected",
"authority": [
"App.DeveloperKit.Migrations"
]
"authority": ["App.DeveloperKit.Migrations"]
},
{
"key": "admin.developerkit.endpoints",
"path": "/admin/developerkit/endpoints",
"componentPath": "@/views/developerKit/EndpointPage",
"routeType": "protected",
"authority": [
"App.DeveloperKit.Endpoints"
]
"authority": ["App.DeveloperKit.Endpoints"]
},
{
"key": "admin.developerkit.components",
"path": "/admin/developerkit/components",
"componentPath": "@/views/developerKit/ComponentPage",
"routeType": "protected",
"authority": [
"App.DeveloperKit.Components"
]
"authority": ["App.DeveloperKit.Components"]
},
{
"key": "admin.developerkit.components.new",
"path": "/admin/developerkit/components/new",
"componentPath": "@/views/developerKit/ComponentDetailPage",
"routeType": "protected",
"authority": [
"App.DeveloperKit.Components"
]
"authority": ["App.DeveloperKit.Components"]
},
{
"key": "admin.developerkit.components.view",
"path": "/admin/developerkit/components/view/:id",
"componentPath": "@/views/developerKit/ComponentDetailPage",
"routeType": "protected",
"authority": [
"App.DeveloperKit.Components"
]
"authority": ["App.DeveloperKit.Components"]
},
{
"key": "admin.developerkit.components.edit",
"path": "/admin/developerkit/components/edit/:id",
"componentPath": "@/views/developerKit/CodePage",
"routeType": "protected",
"authority": [
"App.DeveloperKit.Components"
]
"authority": ["App.DeveloperKit.Components"]
},
{
"key": "admin.reportManagement",
"path": "/admin/reports/management",
"componentPath": "@/views/report/DashboardPage",
"routeType": "protected",
"authority": [
"App.Reports.Management"
]
"authority": ["App.Reports.Management"]
},
{
"key": "admin.reports.view",
"path": "/admin/reports/:id",
"componentPath": "@/views/report/ReportViewerPage",
"routeType": "protected",
"authority": [
"App.Reports.Categories"
]
"authority": ["App.Reports.Categories"]
}
],
"Languages": [
@ -9874,12 +9834,6 @@
"tr": "Ölçü Birimi Kategorileri",
"en": "Units of Measure Categories"
},
{
"resourceName": "Platform",
"key": "App.Definitions.Uom",
"tr": "Ölçü Birimi",
"en": "Units of Measure"
},
{
"resourceName": "Platform",
"key": "App.Definitions.Uom",
@ -13944,10 +13898,7 @@
"descriptionKey": "Abp.Localization.DefaultLanguage.Description",
"defaultValue": "en",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.SiteManagement",
@ -13981,10 +13932,7 @@
"descriptionKey": "Abp.Localization.Timezone.Description",
"defaultValue": "UTC",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.SiteManagement",
@ -14140,11 +14088,7 @@
"descriptionKey": "App.SiteManagement.Theme.Style.Description",
"defaultValue": "dx.light.compact",
"isVisibleToClients": true,
"providers": [
"U",
"G",
"D"
],
"providers": ["U", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.SiteManagement",
@ -14192,10 +14136,7 @@
"descriptionKey": "App.SiteManagement.General.NewMemberNotificationEmails.Description",
"defaultValue": "system@sozsoft.com",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.SiteManagement",
@ -14211,10 +14152,7 @@
"descriptionKey": "App.SiteManagement.General.TimedLoginEmails.Description",
"defaultValue": "system@sozsoft.com",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.SiteManagement",
@ -14230,11 +14168,7 @@
"descriptionKey": "App.Sender.Sms.PostaGuvercini.Url.Description",
"defaultValue": "https://www.postaguvercini.com/api_http",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.Sender",
@ -14250,11 +14184,7 @@
"descriptionKey": "App.Sender.Sms.PostaGuvercini.Username.Description",
"defaultValue": "2AIlj4QlCrvlbDDBS/712A==",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": true,
"mainGroupKey": "App.Sender",
@ -14270,11 +14200,7 @@
"descriptionKey": "App.Sender.Sms.PostaGuvercini.Password.Description",
"defaultValue": "oTuwyZM9sxfJI+jDH5wJAw==",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": true,
"mainGroupKey": "App.Sender",
@ -14290,11 +14216,7 @@
"descriptionKey": "App.Sender.WhatsApp.Url.Description",
"defaultValue": "https://graph.facebook.com/v21.0",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.Sender",
@ -14310,11 +14232,7 @@
"descriptionKey": "App.Sender.WhatsApp.PhoneNumberId.Description",
"defaultValue": "442035112335974",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.Sender",
@ -14330,11 +14248,7 @@
"descriptionKey": "App.Sender.WhatsApp.Token.Description",
"defaultValue": "EAANoftqZAJ64BO5oPwXPqniUtNGF70u8TKvQVzGZBaYQh5UY8fYrgQkcXP9UbQUqT9PWRah1L7TzcBIiWQMacT8AkmZB33AP1begLoywIZCsQSdBSUz21GQaCowfVosYgBoXSyqH8irSBPQDLIjxxVxrC2n76SD9X6zPXeHgOqIPY92DqJXplstWrlhtZCAZDZD",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.Sender",
@ -14350,11 +14264,7 @@
"descriptionKey": "App.Sender.WhatsApp.TemplateName.Description",
"defaultValue": "kurs_platform_notification",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.Sender",
@ -14370,10 +14280,7 @@
"descriptionKey": "App.Sender.Rocket.Url.Description",
"defaultValue": "https://chat.sozsoft.com/api/v1",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.Sender",
@ -14389,10 +14296,7 @@
"descriptionKey": "App.Sender.Rocket.UserId.Description",
"defaultValue": "LfpzPjzag4QJXm84N",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.Sender",
@ -14408,10 +14312,7 @@
"descriptionKey": "App.Sender.Rocket.Token.Description",
"defaultValue": "jvqALawvXn0Q7c6FfHJV3h58DCHDfQLgFF5y7oIc7oc",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "App.Sender",
@ -14427,11 +14328,7 @@
"descriptionKey": "Abp.Mailing.DefaultFromDisplayName.Description",
"defaultValue": "Kurs",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Mailing",
@ -14447,11 +14344,7 @@
"descriptionKey": "Abp.Mailing.DefaultFromAddress.Description",
"defaultValue": "system@sozsoft.com",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Mailing",
@ -14467,11 +14360,7 @@
"descriptionKey": "Abp.Mailing.Smtp.UserName.Description",
"defaultValue": "system@sozsoft.com",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Mailing",
@ -14487,11 +14376,7 @@
"descriptionKey": "Abp.Mailing.Smtp.Password.Description",
"defaultValue": "QT9L7BCl1CT/1Hq19HoSlQ==",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": true,
"mainGroupKey": "Abp.Mailing",
@ -14507,11 +14392,7 @@
"descriptionKey": "Abp.Mailing.Smtp.Host.Description",
"defaultValue": "127.0.0.1",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Mailing",
@ -14527,11 +14408,7 @@
"descriptionKey": "Abp.Mailing.Smtp.Port.Description",
"defaultValue": "25",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Mailing",
@ -14547,11 +14424,7 @@
"descriptionKey": "Abp.Mailing.Smtp.Domain.Description",
"defaultValue": "sozsoft.com",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Mailing",
@ -14567,11 +14440,7 @@
"descriptionKey": "Abp.Mailing.Smtp.EnableSsl.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Mailing",
@ -14587,11 +14456,7 @@
"descriptionKey": "Abp.Mailing.AWS.Profile.Description",
"defaultValue": "mail-sdk-user",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Mailing",
@ -14607,11 +14472,7 @@
"descriptionKey": "Abp.Mailing.AWS.Region.Description",
"defaultValue": "eu-central-1",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Mailing",
@ -14627,11 +14488,7 @@
"descriptionKey": "Abp.Mailing.AWS.AccessKey.Description",
"defaultValue": "aXW8L21rP6dPO6Txj76Be2FCpWRBa25EMrSAVL76",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Mailing",
@ -14647,11 +14504,7 @@
"descriptionKey": "Abp.Mailing.AWS.AccessKeyId.Description",
"defaultValue": "AKIATULUYBLX4IY3S2P1",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Mailing",
@ -14667,10 +14520,7 @@
"descriptionKey": "Abp.Account.IsSelfRegistrationEnabled.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Account",
@ -14686,10 +14536,7 @@
"descriptionKey": "Abp.Account.EnableLocalLogin.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Account",
@ -14705,11 +14552,7 @@
"descriptionKey": "Abp.Account.TwoFactor.Enabled.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Account",
@ -14725,10 +14568,7 @@
"descriptionKey": "Abp.Account.Captcha.MaxFailedAccessAttempts.Description",
"defaultValue": "3",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Account",
@ -14744,10 +14584,7 @@
"descriptionKey": "Abp.Account.Captcha.EndPoint.Description",
"defaultValue": "https://challenges.cloudflare.com/turnstile/v0/siteverify",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Account",
@ -14763,10 +14600,7 @@
"descriptionKey": "Abp.Account.Captcha.SiteKey.Description",
"defaultValue": "0x4AAAAAAAGadwQME-GSYuJU",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Account",
@ -14782,10 +14616,7 @@
"descriptionKey": "Abp.Account.Captcha.SecretKey.Description",
"defaultValue": "0x4AAAAAAAGad_f_WP47IcNBs9FTu5DhNX8",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Account",
@ -14801,11 +14632,7 @@
"descriptionKey": "Abp.Identity.Profile.General.RequireVerifiedAccount.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -14821,11 +14648,7 @@
"descriptionKey": "Abp.Identity.Profile.General.BlacklistedEmailProviders.Description",
"defaultValue": "gmail.com\r\nyahoo.com\r\nhotmail.com",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -14841,11 +14664,7 @@
"descriptionKey": "Abp.Identity.Password.ForceUsersToPeriodicallyChangePassword.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -14861,11 +14680,7 @@
"descriptionKey": "Abp.Identity.Password.PasswordChangePeriodDays.Description",
"defaultValue": "0",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -14881,11 +14696,7 @@
"descriptionKey": "Abp.Identity.Password.RequiredLength.Description",
"defaultValue": "6",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -14901,11 +14712,7 @@
"descriptionKey": "Abp.Identity.Password.RequiredUniqueChars.Description",
"defaultValue": "1",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -14921,11 +14728,7 @@
"descriptionKey": "Abp.Identity.Password.RequireNonAlphanumeric.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -14941,11 +14744,7 @@
"descriptionKey": "Abp.Identity.Password.RequireLowercase.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -14961,11 +14760,7 @@
"descriptionKey": "Abp.Identity.Password.RequireUppercase.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -14981,11 +14776,7 @@
"descriptionKey": "Abp.Identity.Password.RequireDigit.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -15001,11 +14792,7 @@
"descriptionKey": "Abp.Identity.Lockout.AllowedForNewUsers.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -15021,11 +14808,7 @@
"descriptionKey": "Abp.Identity.Lockout.LockoutDuration.Description",
"defaultValue": "300",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -15041,11 +14824,7 @@
"descriptionKey": "Abp.Identity.Lockout.MaxFailedAccessAttempts.Description",
"defaultValue": "5",
"isVisibleToClients": false,
"providers": [
"T",
"G",
"D"
],
"providers": ["T", "G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -15061,10 +14840,7 @@
"descriptionKey": "Abp.Identity.SignIn.RequireConfirmedEmail.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -15080,10 +14856,7 @@
"descriptionKey": "Abp.Identity.SignIn.RequireConfirmedPhoneNumber.Description",
"defaultValue": "False",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -15099,10 +14872,7 @@
"descriptionKey": "Abp.Identity.User.IsUserNameUpdateEnabled.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -15118,10 +14888,7 @@
"descriptionKey": "Abp.Identity.User.IsEmailUpdateEnabled.Description",
"defaultValue": "True",
"isVisibleToClients": false,
"providers": [
"G",
"D"
],
"providers": ["G", "D"],
"isInherited": false,
"isEncrypted": false,
"mainGroupKey": "Abp.Identity",
@ -17408,9 +17175,7 @@
"props": null,
"description": null,
"isActive": true,
"dependencies": [
"AxiosListComponent"
]
"dependencies": ["AxiosListComponent"]
}
],
"ReportCategories": [

View file

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Entities.Auditing;
namespace Kurs.Platform.Entities;
public class Service : FullAuditedAggregateRoot<Guid>
{
// Icon component adı (ör: "FaCode")
public string? Icon { get; set; }
public string Title { get; set; }
public string? Description { get; set; }
public string Type { get; set; }
public ICollection<ServiceFeature> Features { get; set; }
protected Service()
{
Features = [];
}
public Service(Guid id, string title, string type)
: base(id)
{
Title = title;
Type = type;
Features = [];
}
}
public class ServiceFeature : Entity<Guid>
{
public Guid ServiceItemId { get; set; }
public string Name { get; set; }
public ServiceFeature() { }
public ServiceFeature(Guid id, Guid serviceItemId, string name)
: base(id)
{
ServiceItemId = serviceItemId;
Name = name;
}
}

View file

@ -91,6 +91,8 @@ public class PlatformDbContext :
public DbSet<ReportGenerated> ReportGenerated { get; set; }
public DbSet<ReportCategory> ReportCategories { get; set; }
public DbSet<Demo> Demos { get; set; }
public DbSet<Service> Services { get; set; }
public DbSet<ServiceFeature> ServiceFeatures { get; set; }
#region Entities from the modules
@ -803,5 +805,33 @@ public class PlatformDbContext :
b.Property(x => x.NumberOfUsers).IsRequired();
b.Property(x => x.Message).IsRequired().HasMaxLength(2000);
});
builder.Entity<Service>(b =>
{
b.ToTable(PlatformConsts.DbTablePrefix + nameof(Service), PlatformConsts.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.Title)
.IsRequired()
.HasMaxLength(128);
b.Property(x => x.Description).HasMaxLength(512);
b.Property(x => x.Icon).HasMaxLength(64);
// 1 - N ilişki
b.HasMany(x => x.Features)
.WithOne()
.HasForeignKey(f => f.ServiceItemId);
});
builder.Entity<ServiceFeature>(b =>
{
b.ToTable(PlatformConsts.DbTablePrefix + nameof(ServiceFeature), PlatformConsts.DbSchema);
b.ConfigureByConvention();
b.Property(x => x.Name)
.IsRequired()
.HasMaxLength(128);
});
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,73 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Kurs.Platform.Migrations
{
/// <inheritdoc />
public partial class Service : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "PService",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Icon = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true),
Title = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false),
Description = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: true),
Type = table.Column<string>(type: "nvarchar(max)", nullable: true),
ExtraProperties = table.Column<string>(type: "nvarchar(max)", nullable: false),
ConcurrencyStamp = table.Column<string>(type: "nvarchar(40)", maxLength: 40, nullable: false),
CreationTime = table.Column<DateTime>(type: "datetime2", nullable: false),
CreatorId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
LastModificationTime = table.Column<DateTime>(type: "datetime2", nullable: true),
LastModifierId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
IsDeleted = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
DeleterId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
DeletionTime = table.Column<DateTime>(type: "datetime2", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_PService", x => x.Id);
});
migrationBuilder.CreateTable(
name: "PServiceFeature",
columns: table => new
{
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
ServiceItemId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
Name = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_PServiceFeature", x => x.Id);
table.ForeignKey(
name: "FK_PServiceFeature_PService_ServiceItemId",
column: x => x.ServiceItemId,
principalTable: "PService",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_PServiceFeature_ServiceItemId",
table: "PServiceFeature",
column: "ServiceItemId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "PServiceFeature");
migrationBuilder.DropTable(
name: "PService");
}
}
}

View file

@ -3446,6 +3446,94 @@ namespace Kurs.Platform.Migrations
b.ToTable("PSector", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.Service", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.IsRequired()
.HasMaxLength(40)
.HasColumnType("nvarchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime2")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("uniqueidentifier")
.HasColumnName("CreatorId");
b.Property<Guid?>("DeleterId")
.HasColumnType("uniqueidentifier")
.HasColumnName("DeleterId");
b.Property<DateTime?>("DeletionTime")
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("Description")
.HasMaxLength(512)
.HasColumnType("nvarchar(512)");
b.Property<string>("ExtraProperties")
.IsRequired()
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
b.Property<string>("Icon")
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<bool>("IsDeleted")
.ValueGeneratedOnAdd()
.HasColumnType("bit")
.HasDefaultValue(false)
.HasColumnName("IsDeleted");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime2")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("uniqueidentifier")
.HasColumnName("LastModifierId");
b.Property<string>("Title")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<string>("Type")
.HasColumnType("nvarchar(max)");
b.HasKey("Id");
b.ToTable("PService", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.ServiceFeature", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uniqueidentifier");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("nvarchar(128)");
b.Property<Guid>("ServiceItemId")
.HasColumnType("uniqueidentifier");
b.HasKey("Id");
b.HasIndex("ServiceItemId");
b.ToTable("PServiceFeature", (string)null);
});
modelBuilder.Entity("Kurs.Platform.Entities.Uom", b =>
{
b.Property<Guid>("Id")
@ -6246,6 +6334,15 @@ namespace Kurs.Platform.Migrations
b.Navigation("ReportCategory");
});
modelBuilder.Entity("Kurs.Platform.Entities.ServiceFeature", b =>
{
b.HasOne("Kurs.Platform.Entities.Service", null)
.WithMany("Features")
.HasForeignKey("ServiceItemId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("Kurs.Platform.Entities.Uom", b =>
{
b.HasOne("Kurs.Platform.Entities.UomCategory", "UomCategory")
@ -6487,6 +6584,11 @@ namespace Kurs.Platform.Migrations
b.Navigation("Parameters");
});
modelBuilder.Entity("Kurs.Platform.Entities.Service", b =>
{
b.Navigation("Features");
});
modelBuilder.Entity("Kurs.Platform.Entities.UomCategory", b =>
{
b.Navigation("Uoms");

View file

@ -0,0 +1,22 @@
export type ItemType = 'service' | 'support'
export interface Service {
icon?: React.ReactNode
title: string
description?: string
type: ItemType
features: string[]
}
export interface ServiceFeature {
serviceItemId: string
name: string
}
export interface ServiceDto {
icon?: React.ReactNode
title: string
description?: string
type: ItemType
features: string[]
}

View file

@ -0,0 +1,16 @@
import { PagedAndSortedResultRequestDto, PagedResultDto } from '../proxy'
import apiService, { Config } from './api.service'
import { ServiceDto } from '@/proxy/services/models'
export class ServiceService {
apiName = 'Default'
getList = () =>
apiService.fetchData<ServiceDto[]>(
{
method: 'GET',
url: '/api/app/service',
},
{ apiName: this.apiName },
)
}

View file

@ -1,18 +1,28 @@
import React from 'react'
import { FaCode, FaGlobe, FaServer, FaUsers, FaShieldAlt, FaCog, FaCheckCircle } from 'react-icons/fa';
import {
FaCode,
FaGlobe,
FaServer,
FaUsers,
FaShieldAlt,
FaCog,
FaCheckCircle,
} from 'react-icons/fa'
import { Link } from 'react-router-dom'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { ROUTES_ENUM } from '@/routes/route.constant'
import { Helmet } from 'react-helmet'
import { ServiceDto } from '@/proxy/services/models'
const Services: React.FC = () => {
const { translate } = useLocalization()
const services = [
const services: ServiceDto[] = [
{
icon: <FaCode className="w-12 h-12 text-blue-600" />,
title: translate('::Public.services.software.title'),
description: translate('::Public.services.software.desc'),
type: 'service',
features: [
translate('::Public.services.software.features.analysis'),
translate('::Public.services.software.features.design'),
@ -25,6 +35,7 @@ const Services: React.FC = () => {
icon: <FaUsers className="w-12 h-12 text-purple-600" />,
title: translate('::Public.services.web.title'),
description: translate('::Public.services.web.desc'),
type: 'service',
features: [
translate('::Public.services.web.features.frontend'),
translate('::Public.services.web.features.backend'),
@ -37,6 +48,7 @@ const Services: React.FC = () => {
icon: <FaShieldAlt className="w-12 h-12 text-green-600" />,
title: translate('::Public.services.mobile.title'),
description: translate('::Public.services.mobile.desc'),
type: 'service',
features: [
translate('::Public.services.mobile.features.design'),
translate('::Public.services.mobile.features.native'),
@ -49,6 +61,7 @@ const Services: React.FC = () => {
icon: <FaServer className="w-12 h-12 text-red-600" />,
title: translate('::Public.services.database.title'),
description: translate('::Public.services.database.desc'),
type: 'service',
features: [
translate('::Public.services.database.features.design'),
translate('::Public.services.database.features.optimization'),
@ -61,6 +74,7 @@ const Services: React.FC = () => {
icon: <FaGlobe className="w-12 h-12 text-yellow-600" />,
title: translate('::Public.services.integration.title'),
description: translate('::Public.services.integration.desc'),
type: 'service',
features: [
translate('::Public.services.integration.features.api'),
translate('::Public.services.integration.features.middleware'),
@ -73,6 +87,7 @@ const Services: React.FC = () => {
icon: <FaCog className="w-12 h-12 text-indigo-600" />,
title: translate('::Public.services.consulting.title'),
description: translate('::Public.services.consulting.desc'),
type: 'service',
features: [
translate('::Public.services.consulting.features.tech'),
translate('::Public.services.consulting.features.project'),
@ -81,13 +96,11 @@ const Services: React.FC = () => {
translate('::Public.services.consulting.features.training'),
],
},
]
const supportPlans = [
{
icon: <FaUsers className="w-12 h-12 text-pink-600" />, // Remote Branch Support
title: translate('::Public.services.support.branchRemote.title'),
price: translate('::Public.services.support.branchRemote.price'),
period: translate('::Public.services.support.branchRemote.period'),
description: '',
type: 'support',
features: [
translate('::Public.services.support.branchRemote.features.priority'),
translate('::Public.services.support.branchRemote.features.remote'),
@ -97,9 +110,10 @@ const Services: React.FC = () => {
],
},
{
icon: <FaServer className="w-12 h-12 text-orange-600" />, // Backup Support
title: translate('::Public.services.support.backup.title'),
price: translate('::Public.services.support.backup.price'),
period: translate('::Public.services.support.backup.period'),
description: '',
type: 'support',
features: [
translate('::Public.services.support.backup.features.daily'),
translate('::Public.services.support.backup.features.encrypted'),
@ -109,9 +123,10 @@ const Services: React.FC = () => {
],
},
{
icon: <FaGlobe className="w-12 h-12 text-cyan-600" />, // SMS Support
title: translate('::Public.services.support.sms.title'),
price: translate('::Public.services.support.sms.price'),
period: translate('::Public.services.support.sms.period'),
description: '',
type: 'support',
features: [
translate('::Public.services.support.sms.features.packages'),
translate('::Public.services.support.sms.features.bulk'),
@ -153,7 +168,9 @@ const Services: React.FC = () => {
<div className="py-16">
<div className="container mx-auto px-4">
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{services.map((service, index) => (
{services
.filter((a) => a.type === 'service')
.map((service, index) => (
<div
key={index}
className="bg-white rounded-xl shadow-lg p-8 hover:shadow-xl transition-shadow"
@ -182,10 +199,15 @@ const Services: React.FC = () => {
{translate('::Public.services.support.title')}
</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
{supportPlans.map((plan, index) => (
<div key={index} className="bg-white rounded-xl shadow-lg p-8 border border-gray-200">
{services
.filter((a) => a.type === 'support')
.map((plan, index) => (
<div
key={index}
className="bg-white rounded-xl shadow-lg p-8 border border-gray-200"
>
<div className="mb-6">{plan.icon}</div>
<h3 className="text-xl font-bold mb-4">{plan.title}</h3>
<ul className="space-y-3 mb-8">
{plan.features.map((feature, fIndex) => (
<li key={fIndex} className="flex items-center space-x-2 text-gray-700">