Compare commits
7 Commits
4c892f6240
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| beebd6f31f | |||
| d67683aecd | |||
| e519a4d126 | |||
| 724062e7b3 | |||
| 255c372709 | |||
| 5844bcae1e | |||
| e090e7f834 |
@@ -7,7 +7,7 @@
|
||||
- [ ] Сделать обновление валидации от radiobutton
|
||||
- [ ] Добавить направления других институтов
|
||||
- [ ] Найти шаблоны других институтов и написать выбор шаблонов
|
||||
- [ ] Рефактор кода
|
||||
- [x] Рефактор кода
|
||||
|
||||
# Лицензия
|
||||
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover"/>
|
||||
<base href="/"/>
|
||||
@* TODO: скачать шрифты *@
|
||||
<meta property="og:image" content="/favicon.png" />
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="/css/styles.css" asp-append-version="true" />
|
||||
|
||||
112
src/Otchinslator/Components/Pages/FirstApril.razor
Normal file
112
src/Otchinslator/Components/Pages/FirstApril.razor
Normal file
@@ -0,0 +1,112 @@
|
||||
@page "/fstaprl"
|
||||
@inject AuthenticationStateProvider AuthenticationStateProvider
|
||||
@using Microsoft.AspNetCore.Authorization
|
||||
@using Microsoft.AspNetCore.Components.Authorization
|
||||
@using NPetrovich
|
||||
@using Otchinslator.Services
|
||||
@attribute [Authorize]
|
||||
@inject IStatementGenerator StatementGenerator
|
||||
|
||||
<PageTitle>Заяление отправлено | 1 апреля</PageTitle>
|
||||
|
||||
<style>
|
||||
html, body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
height: 100dvh;
|
||||
}
|
||||
</style>
|
||||
|
||||
@code {
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
|
||||
var userEmail = authState.User.Identity.Name;
|
||||
var userFIO = authState.User.Claims.FirstOrDefault(x => x.Type == "name")?.Value;
|
||||
|
||||
var petrovich = new Petrovich()
|
||||
{
|
||||
FirstName = userFIO.Split(' ')[0],
|
||||
LastName = userFIO.Split(' ')[1],
|
||||
MiddleName = userFIO.Split(' ').Length > 2 ? userFIO.Split(' ')[2] : "",
|
||||
Gender = Gender.Male
|
||||
};
|
||||
|
||||
userFIO = petrovich.InflectFirstNameTo(Case.Genitive) + " " + petrovich.InflectLastNameTo(Case.Genitive) + " " + petrovich.InflectMiddleNameTo(Case.Genitive);
|
||||
|
||||
var userData = new UserData
|
||||
{
|
||||
reason = "Прошу отчислить меня по собственному желанию в связи с не желанием продолжать обучение в данном учебном заведении, и планами перевестись в ДГТУ.",
|
||||
email = userEmail,
|
||||
phone = "",
|
||||
fio = userFIO,
|
||||
kurs = 1,
|
||||
isFreeEducation = true,
|
||||
isOchno = true,
|
||||
speciality = SpecialityType.Bakalavriat,
|
||||
direction = ""
|
||||
};
|
||||
var statement = await StatementGenerator.GenerateStatementAsync(userData, "frstaprl.docx");
|
||||
var pdf = await StatementGenerator.ConvertToPDFAsync(statement);
|
||||
|
||||
await using var fileStream = new FileStream("./PDFCache/" + userEmail.Split('@')[0] + ".pdf", FileMode.Create, FileAccess.Write);
|
||||
await pdf.CopyToAsync(fileStream);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
<dialog id="denyModal" class="modal modal-bottom sm:modal-middle">
|
||||
<div class="modal-box">
|
||||
<h3 class="text-lg font-bold text-center">С 1 апреля!</h3>
|
||||
<img src="https://risovach.ru/upload/2013/04/mem/moe-lico_15228723_orig_.jpeg" class="h-80 my-2 mx-auto"
|
||||
alt=""/>
|
||||
<div class="modal-action justify-center">
|
||||
<form method="dialog">
|
||||
<button class="btn btn-primary">Понял, принял</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</dialog>
|
||||
|
||||
<div class="relative flex flex-col items-center justify-center">
|
||||
<div class="text-center font-bold text-3xl md:text-5xl w-max italic mb-3">
|
||||
<br>Заявление на отчисление<p class="text-2xl font-normal">отправлено директору</p>
|
||||
</div>
|
||||
<div id="pdfrenderer" class="flex justify-center">
|
||||
</div>
|
||||
<div class="join w-96 sm:w-[27rem] mt-4 flex gap-2 justify-center">
|
||||
<button onclick="denyModal.showModal()" class="btn btn-error rounded-full flex-grow w-30 flex items-center justify-center">
|
||||
Отозвать
|
||||
</button>
|
||||
<a id="downloadPDF" target="_blank" href="/getStatement"
|
||||
class="btn btn-primary bg-base-200 border-base-200 rounded-full flex-grow-0 w-[3rem] flex items-center justify-center relative">
|
||||
<div class="absolute inset-0 flex items-center justify-center">
|
||||
<img class="p-2" src="img/pdf.svg" alt=""/>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.min.js"></script>
|
||||
<script>
|
||||
const pdfrenderer = document.getElementById('pdfrenderer');
|
||||
const url = '/getStatement';
|
||||
pdfrenderer.innerHTML = '<canvas id="pdf-canvas" class="w-96 sm:w-[27rem] rounded-2xl justify-center"></canvas>';
|
||||
pdfjsLib.getDocument(url).promise.then(function (pdf) {
|
||||
pdf.getPage(1).then(function (page) {
|
||||
const viewport = page.getViewport({scale: 1});
|
||||
|
||||
const canvas = document.getElementById('pdf-canvas');
|
||||
const context = canvas.getContext('2d');
|
||||
canvas.width = viewport.width;
|
||||
canvas.height = viewport.height;
|
||||
|
||||
const renderContext = {
|
||||
canvasContext: context,
|
||||
viewport: viewport
|
||||
};
|
||||
page.render(renderContext);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -5,13 +5,17 @@
|
||||
|
||||
<PageTitle>Отчислятор 3000</PageTitle>
|
||||
|
||||
<JS For="this" Args="[AuthenticationStateProvider.GetAuthenticationStateAsync().Result.User.Identity?.IsAuthenticated]" />
|
||||
<JS For="this"
|
||||
Args="[AuthenticationStateProvider.GetAuthenticationStateAsync().Result.User.Identity?.IsAuthenticated]"/>
|
||||
|
||||
<div class="relative">
|
||||
<dialog id="info_modal" class="modal modal-bottom sm:modal-middle">
|
||||
<div class="modal-box">
|
||||
<h3 class="text-lg font-bold">Сервис отчислений</h3>
|
||||
<p class="py-4">Привет, это НЕОФИЦИАЛЬНЫЙ сервис отчислений!<br><br>Авторизуясь Вы соглашаетесь передать личные данные, такие как email + фио (из авторизации ЮФУ), и все остальные запрошенные далее. На нашем сервере хранятся только Ваши сгенерированные pdf заявления, другая информация сохраняется только в браузере.<br><br>Автор: <a target="_blank" href="https://t.me/serega404">@@serega404</a></p>
|
||||
<p class="py-4">Привет, это НЕОФИЦИАЛЬНЫЙ сервис отчислений!<br><br>Авторизуясь Вы соглашаетесь передать
|
||||
личные данные, такие как email + фио (из авторизации ЮФУ), и все остальные запрошенные далее. На нашем
|
||||
сервере хранятся только Ваши сгенерированные pdf заявления, другая информация сохраняется только в
|
||||
браузере.<br><br>Автор: <a target="_blank" href="https://t.me/serega404">@@serega404</a></p>
|
||||
<div class="modal-action">
|
||||
<form method="dialog">
|
||||
<button class="btn">Закрыть</button>
|
||||
@@ -37,7 +41,7 @@
|
||||
<div
|
||||
class="text-center font-bold text-4xl md:text-5xl w-max absolute left-1/2 -top-1/2 transform -translate-x-1/2 italic">
|
||||
<br>Отчислятор 3000<br>
|
||||
<p class="text-2xl text-red-500">alpha</p></div>
|
||||
</div>
|
||||
<div class="flex flex-col space-y-4 w-96">
|
||||
<div class="card rounded-badge bg-base-200 p-4">
|
||||
@* <h2 class="card-title text-center text-3xl justify-center my-4">Мне нужно...</h2> *@
|
||||
|
||||
@@ -24,8 +24,6 @@ builder.Services.AddControllersWithViews(options =>
|
||||
}).AddMicrosoftIdentityUI().AddDataAnnotationsLocalization();
|
||||
builder.Services.Configure<ForwardedHeadersOptions>(options =>
|
||||
{
|
||||
options.KnownNetworks.Clear();
|
||||
options.KnownProxies.Clear();
|
||||
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
|
||||
});
|
||||
|
||||
@@ -42,7 +40,6 @@ builder.Services.AddRazorComponents()
|
||||
.AddInteractiveServerComponents();
|
||||
builder.Services.AddJSComponents();
|
||||
|
||||
builder.Services.AddRazorPages(); //////////////
|
||||
builder.Services.AddServerSideBlazor(); //////////////
|
||||
|
||||
builder.Services.AddOptions<GotenbergSharpClientOptions>()
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace Otchinslator.Services;
|
||||
|
||||
public interface IStatementGenerator
|
||||
{
|
||||
public Task<MemoryStream> GenerateStatementAsync(UserData userData);
|
||||
public Task<MemoryStream> GenerateStatementAsync(UserData userData, string TemplateName = "ictis.docx");
|
||||
public Task<Stream> ConvertToPDFAsync(MemoryStream stream);
|
||||
}
|
||||
|
||||
@@ -21,9 +21,10 @@ public class StatementGenerator(GotenbergSharpClient gotenbergSharpClient) : ISt
|
||||
private const string FreeEducationText = "за счет ассигнований федерального бюджета";
|
||||
private const string PaidEducationText = "на договорной (платной) основе";
|
||||
|
||||
public async Task<MemoryStream> GenerateStatementAsync(UserData userData)
|
||||
// TODO: Выбор темплейтов не реализован
|
||||
public async Task<MemoryStream> GenerateStatementAsync(UserData userData, string TemplateName = "ictis.docx")
|
||||
{
|
||||
byte[] textByteArray = File.ReadAllBytes("Templates/ictis.docx");
|
||||
byte[] textByteArray = File.ReadAllBytes("Templates/" + TemplateName);
|
||||
MemoryStream stream = new MemoryStream();
|
||||
stream.Write(textByteArray, 0, textByteArray.Length);
|
||||
using (WordprocessingDocument doc = WordprocessingDocument.Open(stream, true))
|
||||
|
||||
BIN
src/Otchinslator/Templates/frstaprl.docx
Normal file
BIN
src/Otchinslator/Templates/frstaprl.docx
Normal file
Binary file not shown.
Reference in New Issue
Block a user