Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Client.Wasm/Components/StudentCard.razor
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
</CardHeader>
<CardBody>
<UnorderedList Unstyled>
<UnorderedListItem>Номер <Strong>№X "Название лабораторной"</Strong></UnorderedListItem>
<UnorderedListItem>Вариант <Strong>№Х "Название варианта"</Strong></UnorderedListItem>
<UnorderedListItem>Выполнена <Strong>Фамилией Именем 65ХХ</Strong> </UnorderedListItem>
<UnorderedListItem><Link To="https://puginarug.com/">Ссылка на форк</Link></UnorderedListItem>
<UnorderedListItem>Номер <Strong>№1 "Кэширование"</Strong></UnorderedListItem>
<UnorderedListItem>Вариант <Strong>№5 "Сотрудник компании"</Strong></UnorderedListItem>
<UnorderedListItem>Выполнена <Strong>Дубовой Ксенией 6511</Strong> </UnorderedListItem>
<UnorderedListItem><Link To="https://github.com/kseniaDubova/cloud-development">Ссылка на форк</Link></UnorderedListItem>
</UnorderedList>
</CardBody>
</Card>
16 changes: 8 additions & 8 deletions Client.Wasm/wwwroot/appsettings.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"BaseAddress": ""
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"BaseAddress": "https://localhost:7557/api/CompanyEmployee"
}
22 changes: 20 additions & 2 deletions CloudDevelopment.sln
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36811.4
# Visual Studio Version 18
VisualStudioVersion = 18.3.11520.95 d18.3
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client.Wasm", "Client.Wasm\Client.Wasm.csproj", "{AE7EEA74-2FE0-136F-D797-854FD87E022A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CompanyEmployee.AppHost", "CompanyEmployee\CompanyEmployee.AppHost\CompanyEmployee.AppHost.csproj", "{3DA5A78A-EE77-4CEE-939A-B2F287B5064E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CompanyEmployee.ServiceDefaults", "CompanyEmployee\CompanyEmployee.ServiceDefaults\CompanyEmployee.ServiceDefaults.csproj", "{E501EBE6-6C75-F32D-E33D-C91D9EC70245}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CompanyEmployee.ApiService", "CompanyEmployee\CompanyEmployee.ApiService\CompanyEmployee.ApiService.csproj", "{671A22B7-0FB8-972F-2D51-70DD14E5C4A2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -15,6 +21,18 @@ Global
{AE7EEA74-2FE0-136F-D797-854FD87E022A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AE7EEA74-2FE0-136F-D797-854FD87E022A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AE7EEA74-2FE0-136F-D797-854FD87E022A}.Release|Any CPU.Build.0 = Release|Any CPU
{3DA5A78A-EE77-4CEE-939A-B2F287B5064E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3DA5A78A-EE77-4CEE-939A-B2F287B5064E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3DA5A78A-EE77-4CEE-939A-B2F287B5064E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3DA5A78A-EE77-4CEE-939A-B2F287B5064E}.Release|Any CPU.Build.0 = Release|Any CPU
{E501EBE6-6C75-F32D-E33D-C91D9EC70245}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E501EBE6-6C75-F32D-E33D-C91D9EC70245}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E501EBE6-6C75-F32D-E33D-C91D9EC70245}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E501EBE6-6C75-F32D-E33D-C91D9EC70245}.Release|Any CPU.Build.0 = Release|Any CPU
{671A22B7-0FB8-972F-2D51-70DD14E5C4A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{671A22B7-0FB8-972F-2D51-70DD14E5C4A2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{671A22B7-0FB8-972F-2D51-70DD14E5C4A2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{671A22B7-0FB8-972F-2D51-70DD14E5C4A2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\CompanyEmployee.ServiceDefaults\CompanyEmployee.ServiceDefaults.csproj" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Aspire.StackExchange.Redis.DistributedCaching" Version="13.1.2" />
<PackageReference Include="Bogus" Version="35.6.5" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="10.1.4" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="10.1.4" />
</ItemGroup>

</Project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
@ApiService_HostAddress = http://localhost:5497

GET {{ApiService_HostAddress}}/weatherforecast/
Accept: application/json

###
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
namespace CompanyEmployee.ApiService.Models;

/// <summary>
/// Модель сотрудника компании
/// </summary>
public class CompanyEmployeeModel
{
/// <summary>
/// Идентификатор сотрудника в системе
/// </summary>
public required int Id { get; set; }

/// <summary>
/// ФИО
/// </summary>
public required string FullName { get; set; }

/// <summary>
/// Должность
/// </summary>
public required string JobTitle { get; set; }

/// <summary>
/// Отдел
/// </summary>
public required string Department { get; set; }

/// <summary>
/// Дата приема
/// </summary>
public required DateOnly AdmissionDate { get; set; }

/// <summary>
/// Оклад
/// </summary>
public required decimal Salary { get; set; }

/// <summary>
/// Электронная почта
/// </summary>
public required string Email { get; set; }

/// <summary>
/// Номер телефона
/// </summary>
public required string PhoneNumber { get; set; }

/// <summary>
/// Индикатор увольнения
/// </summary>
public bool Dismissal { get; set; } = false;

/// <summary>
/// Дата увольнения
/// </summary>
public DateOnly? DismissalDate { get; set; }
}
49 changes: 49 additions & 0 deletions CompanyEmployee/CompanyEmployee.ApiService/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using CompanyEmployee.ApiService.Services;
using CompanyEmployee.ServiceDefaults;

var builder = WebApplication.CreateBuilder(args);

builder.AddServiceDefaults();
builder.AddRedisDistributedCache("redis");

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.AddCors(options =>
{
options.AddPolicy("wasm", policy =>
{
policy.AllowAnyOrigin()
.WithMethods("GET")
.WithHeaders("Content-Type");
});
});

builder.Services.AddSingleton<CompanyEmployeeGenerator>();
builder.Services.AddScoped<CompanyEmployeeService>();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}

app.MapDefaultEndpoints();
app.UseHttpsRedirection();
app.UseCors("wasm");

app.MapGet("/api/CompanyEmployee", async (HttpContext context, CompanyEmployeeService service) =>
{
var idString = context.Request.Query["id"];

if (!int.TryParse(idString, out var id))
return Results.BadRequest("Invalid id");

var employee = await service.GetEmployeeAsync(id);

return Results.Ok(employee);
});

app.Run();
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "http://localhost:5497",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "https://localhost:7557;http://localhost:5497",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
using Bogus;
using Bogus.DataSets;
using CompanyEmployee.ApiService.Models;

namespace CompanyEmployee.ApiService.Services;

/// <summary>
/// Генератор сотрудника
/// </summary>
public class CompanyEmployeeGenerator
{

/// <summary>
/// Справочник профессий сотрудников
/// </summary>
private static readonly string[] _professionTypes =
[
"Developer",
"Manager",
"Analyst"
];

/// <summary>
/// Справочник суффиксов для профессий
/// </summary>
private static readonly string[] _suffix =
[
"Junior",
"Middle",
"Senior"
];

/// <summary>
/// Генерация должности
/// </summary>
private static string GenerateJobTitle(Faker f)
{
var suffix = f.PickRandom(_suffix);
var profession = f.PickRandom(_professionTypes);

return $"{suffix} {profession}";
}

/// <summary>
/// Генерация зарплаты
/// </summary>
private static decimal GenerateSalary(Faker f, string jobTitle)
{
var level = jobTitle.Split(' ')[0];

var (min, max) = level switch
{
"Junior" => (50000m, 90000m),
"Middle" => (90000m, 150000m),
"Senior" => (150000m, 250000m),
_ => (50000m, 250000m)
};

return Math.Round(f.Random.Decimal(min, max), 2);
}

/// <summary>
/// Генерация полного имени
/// </summary>
private static string GenerateFullName(Faker f)
{
var gender = f.PickRandom<Bogus.DataSets.Name.Gender>();

var firstName = f.Name.FirstName(gender);
var lastName = f.Name.LastName(gender);

var fatherName = f.Name.FirstName(Bogus.DataSets.Name.Gender.Male);

string patronymic;

if (fatherName.EndsWith("й") || fatherName.EndsWith("ь"))
{
patronymic = fatherName[..^1] + (gender == Name.Gender.Male ? "евич" : "евна");
}
else
{
patronymic = fatherName + (gender == Name.Gender.Male ? "ович" : "овна");
}

return $"{lastName} {firstName} {patronymic}";
}

/// <summary>
/// Генерация даты уволнения
/// </summary>
private static DateOnly? GenerateDismissalDate(Faker f, bool Dismissal, DateOnly AdmissionDate)
{
return Dismissal ? f.Date.BetweenDateOnly(AdmissionDate, DateOnly.FromDateTime(DateTime.UtcNow)) : null;
}

/// <summary>
/// Преднастроенный генератор
/// </summary>
private static readonly Faker<CompanyEmployeeModel> _faker = new Faker<CompanyEmployeeModel>("ru")
.RuleFor(e => e.FullName, f => GenerateFullName(f))
.RuleFor(e => e.JobTitle, f => GenerateJobTitle(f))
.RuleFor(e => e.Department, f => f.Commerce.Department())
.RuleFor(e => e.AdmissionDate, f => f.Date.PastDateOnly(10))
.RuleFor(e => e.Salary, (f, e) => GenerateSalary(f, e.JobTitle))
.RuleFor(e => e.Email, (f, e) => f.Internet.Email())
.RuleFor(x => x.PhoneNumber, f => f.Phone.PhoneNumber("+7(###)###-##-##"))
.RuleFor(x => x.Dismissal, f => f.Random.Bool())
.RuleFor(x => x.DismissalDate, (f, e) => GenerateDismissalDate(f, e.Dismissal, e.AdmissionDate));

/// <summary>
/// Генерация сотрудника
/// </summary>
public CompanyEmployeeModel Generate(int id)
{
var emploee = _faker.Generate();
emploee.Id = id;
return emploee;
}
}
Loading
Loading