Die Hauptidee des Verfahrens: Entwickeln Sie einen Anwendungsdienst des Autofreigabedienstes mit der Anzeige der verfügbaren Autos auf der Karte. Inhaltlich - alles, was mit der Essenz Vehicles verglichen werden kann: Autos, Motorräder, Fahrzeuge usw. Die Anwendung sollte multifunktional sein: Es ist erforderlich, eine große Anzahl von Seiten mit der Möglichkeit zu haben, Entitäten zu empfangen, hinzuzufügen, zu ändern und zu löschen.
pager -a zur Seite.httpContextAccessorUserStatusProvider . Hinzufügen von JS -Nachrichten mit dem SweetAlert2 -Dienst.ReadMe .Stripe -Zahlungsdienstes zum Projekt. Hinzufügen der Funktionalität der Auswahl von Zeit und Datum zur Seite mit der Platzierung der Bestellung.JS -Code (durch Dateien zerschlagen).Brief Description des Kontos hinzugefügt, in dem das Auto des Benutzers platziert wurde. Er begann, die Bewertung für Autos zu bewerten..NET 7 . Arbeiten Sie an der Suchmaschine der Katalogseite.RepositoryProvider und die Verringerung der gesamten Funktionalität dafür.JWToken Authentication zu Web -Application Controllern.JWToken und richten Sie die Seitenanzeige eines Fehlers auf der Client -Seite ein.JSON -Dateien in Speicher in MongoDB Local .MongoDB Atlas Cluster, um weiter mit dem Cloud -Dienst zu arbeiten.UI . Ändern des Google Maps API -Markers von rot zu einem Auto mit Namen und Bild.Der offizielle Beginn des Praktikums
Web zur vollständigen Clean Architecture .Domain Layer und richten Sie die ersten Modelle ein. Modelle werden im Stil Rich Domain Models erstellt. Anemic Domain Models .Application und Infrastructure Layers sowie die ersten Interaktionen mit dem Dienst und die Einrichtung DI .PublicAPI .endpoints und deren manuelle Tests.Errors Handling und seiner Verarbeitung.Errors Handling Vehicle .endpoints .Azure Key Vault , um geheime Daten mit Azure zu erhalten. Implementierung von Beißfahnen als eine der Optionen zum Speichern von Informationen über Autos.endpoints zu CustomerController und deren manuelle Tests.endpoints zu VehicleController und deren manuelle Tests.IHttpClientFactory hinzu, um Kunden für das Senden von Anforderungen an PublicAPI zu erstellen. Polly -Konfiguration für nicht -metnamische Senden von Nachrichten mit der Möglichkeit des Wartens und einer erneuten Weitergabe in kritischen Situationen.PublicApi zusammen mit Web -Teil und Überprüfung der Endpunkte und der Inter -Programm -Serialisierung und -Deserisierung.JWToken vom Server auf der Clientseite mit einem erfolgreichen Eingang zum Konto.UI -Seiten der Registrierung, Autorisierung und Hinzufügen eines neuen Autos.errors handling im Client -Teil beim Hinzufügen eines neuen Autos.html -Seiten und einigen endpoints .Bootstrap 5+ und Entfernen der Logik der Seite der Registrierung und Autorisierung.GoogleMaps Api und Fehlerkorrektur.Appsettings.json -Datei. Einstellungen und die erste Interaktion mit Duende Identity Server .Identity Server eingerichtet und das Projekt von unnötigen Dateien reinigt.Duende Identity Server an Web Application (Client -Teil).Duende Identity Server zur Verwendung von benutzerdefinierten JWT-Authorization und Erstellen der Dashboard -Seite (Benutzerpersonenkonto) zurück.Duende Identity Server für die Arbeit mit MongoDB Entities aufzubauen.Duende Identity Server . AzureAD als eine der Möglichkeiten der Autorisierung festlegen. Hinzufügen neuer Entitäten zum MSSQL Server .Identity Server beziehen.JwtBearer . AzureAD einstellen. Anschluss Azure Blob Storage als einer der Mechanismen zum Speichern von Autos.Pipeline zwischen der Server -App und beiden Datenbanken eingerichtet. Fügen Sie ActionNotes Repository als einen der Dienste für die Anwendung hinzu.Dashboard -Seite anzuzeigen. Aktualisierte die Struktur der Datenbank, in der eine neue Spalte hinzugefügt wurde. Pipeline ist so konfiguriert, dass Daten zum Einreichen von Informationen zum Kundenkonto eingereicht werden.Dashboard -Seite.Dashboard -Seite. ajax -Funktionen werden hinzugefügt, um eine Seite ohne Aktualisierung herunterzuladen. Eine Suchfunktion nach Kriterien hinzugefügt.pipeline -Versorgung zum Anzeigen von Daten zu Autos im Katalog.GoogleMaps Api .Stripe Payment Service.VehicleInformation .Azure VM . Einstellen Seq und Hosting -Ausnahmendienstes auf Azurevm. Einrichten des Zugriffs einer Marineanwendung auf Ihre MSSQL -Datenbank.GitHub Actions und automatische Publish in Merge mit Main branch .Http zu Https und Hinzufügen neuer Funktionen.Rental und Payment und Azure VM Stimmung.Stripe Payment Service auf der Serverseite.Stripe verbunden sind. Arbeiten Sie an der Erstellung von Stripe Checkout Sessions .Requests und Responses beim Manipulieren von Bestellungen auf dem Client ein.Runtime und Erhalt eines Formulars beim Ändern des Status einer Bestellung.DateTime , Anforderungen in der Datenbank und arbeiten Sie an der Funktionalität der Anwendung.Routing-ом und Einrichtung von Seiten mit Fehlerinformationen..tagets , um das Problem der Version derselben Pakete in verschiedenen Projekten zu lösen.Endpoints zum Bearbeiten von Autodaten.pipeline zwischen allen Controllern des Clients und dem Server, nachdem die Parameter von Controllern Attribute hinzugefügt wurden.server response -Analysator und richten Sie den universellen Handler dieser responses ein.DateTime.Now (lokale Zeit) zum Object DateTime.UtcNow (UTC -Zeit).Routing -Einstellung auf dem Serverteil im REST .pipeline zum Bearbeiten von Informationen. Dieses Projekt ist eine vollständige Web , die auf derselben Ebene mit PublicAPI arbeitet und im Clean Architecture Style geschrieben wurde und jeder Person, die über eine gültige Mietkarte und einen Führerschein verfügt, für eine Weile ein Auto eines anderen Benutzers erhalten kann, das auch registriert ist, aber nicht mit dem Ziel, das Auto eines anderen zu mieten, sondern ihre Autos für ihre Autos mit anderen Benutzern zur Verfügung stellen. Daher kann der Vorteil sowohl von den Entwicklern der Anwendung als auch von den von den Benutzern durchgeführten Transaktionen und direkten Nutzern selbst erhalten werden, die ihre Autos mieten oder vermieten.
Stripe )SweetAlert2 )Google Maps API )Stripe )ErrorOr NuGet Package )JWT Bearer NuGet Package )Azure Key Vault )Azure Blob Storage )Azure AD )Seq Service )Polly )Lets Encrypt Service )PVS Studio )MSSQL und MongoDB )GitHub Actions und Action Runners )Azure VM )und andere ...
Das gesamte Projekt wurde von Grund backend neu geschrieben, wobei bootstrap 5+ zur Dekoration der visuellen Komponente sowie die Funktionalität Razor Pages verwendet C# .NET Core . Als Interaktionsmodell habe ich mich für MVC entschieden. Am Ausgang haben wir es mit Client-Server MVC Wep App zu tun.

Sobald ein nicht autorisierter Benutzer die Anwendung auf den Markt bringt, sieht er sofort den Hauptbildschirm mit Informationen über den Dienst. Diese Seite enthält alle erforderlichen Informationen, um sich mit dem neuen Benutzer mit allen Funktionen des Dienstes vertraut zu machen. Oben sehen Sie das navbar -Element, das auf einer der Seiten ständig ist und nicht aus dem Sichtfeld verschwindet, um die Benutzernavigation im Anhang durchzuführen. Navbar bietet die folgenden Möglichkeiten:

Auf der Seite befindet sich auch eine Karte von Google, auf der der Standort aller verfügbaren und nicht gemieteten Autos aus dem Katalog angezeigt wird (Markierungen werden auf der Karte angezeigt, wonach der aktuelle Standort der Fahrzeuge verfolgt werden kann. Wenn er dem Marker anvertraut wird, wird ein Bild eines Fahrzeugs mit seinem Namen angezeigt). Als Einschränkung habe ich die Stadt Minsk ausgewählt, dh die Karte befindet sich so, dass sie das gesamte Gebiet der Stadt abdeckt. Wenn das Auto beispielsweise irgendwo auf den Straßen von Brest sein wird, werden wir es nicht auf der Karte sehen (oder es ist erforderlich, die Skala der Karte zu ändern). Als verfügbare Standorte für die Platzierung von Autos entschied ich mich, mich auf Belarus zu beschränken, dh ein von einem autorisierter Benutzer platzierter Auto sollte in der Republik Belarus sein. Nichts verhindert jedoch, dass der Benutzer eine Bestellung für ein Auto in einer anderen Stadt oder sogar in einem Land erstellt.
In Bezug auf die Karte selbst wurde sie unter Verwendung eines speziellen Schlüssels mit der Anwendung verbunden, die ohne Beschränkungen für die Suche nach einem Standort gemäß dem berühmten Breitengrad und Längengrad funktioniert.

Unabhängig von der Seite finden Sie ganz unten Informationen über die Entwickler der Anwendung und Links zum entsprechenden Social. SAM Solutions -Netzwerke und Ressourcen.

Auf der Seite mit dem Katalog erhalten die Benutzer die Möglichkeit, alle erschwinglichen kurzen Informationen über die Autos anzuzeigen und nach Kriterien unter den im Katalog angegebenen Autos zu suchen. Auf der Seite gibt es eine Gelegenheit:

In Bezug auf Informationen zu Autos wird der Katalog vorgestellt:

Die Seite hat auch die Möglichkeit, das für die Implementierung einer Punktsuche nach Fahrzeugen erforderliche Formular zu verursachen. Hier werden dem Benutzer viele verschiedene Filter zur Verfügung gestellt, mit denen er im Katalog für ihn interessiert ist.
Mit dem Katalog können Sie das Sortiment der vorgestellten Fahrzeuge berücksichtigen und eine Kopie nach Geschmack und Farbe auswählen.
Sobald der Benutzer das Log In drückt, leitet er sofort auf die Autorisierungsseite um.

Auf der Autorisierungsseite, einem nicht autorisierten Benutzer, müssen Sie Ihre E -Mail (oder Anmeldung) und Ihr Passwort für eine erfolgreiche Genehmigung eingeben. Wenn ein Fehler beim Ausfüllen des Feldes auszufüllen, wird beim Ausfüllen eine Fehlermeldung angezeigt:

Wenn alle Felder korrekt gefüllt sind, die Autorisierung jedoch nicht übergeben wurde, wird der Benutzer eine Nachricht über die erfolglose Genehmigung vorlegen:

Mit einer erfolgreichen Autorisierung wird ein bereits autorisierter Benutzer auf die Dashboard -Seite (persönliches Konto) umgeleitet, auf der es eine Nachricht über eine erfolgreiche Autorisierung gibt, die automatisch 3 Sekunden nach seinem Erscheinen verschwindet.

Wenn der Benutzer kein eigenes Konto hat, muss der Benutzer sein eigenes Konto erstellen, den Übergang zur implementierenden Seite, die über die Drücke Sign Up auf dem rechten Navigations -Element durchgeführt wird.


Auf der Seite mit der Registrierung eines neuen Benutzers müssen eine Reihe von Daten eingegeben werden, damit das Programm den Client in die Datenbank eingibt und die Registrierung erfolgreich ist. Die gesamte Seite ist mit Validierung gefüllt, und wenn etwas nicht passt, wird der Benutzer nicht über das Feld mitgeteilt, in dem der Fehler aufgetreten ist (das gleiche Prinzip wie mit der zotteligen Autorisierung). Nach einer erfolgreichen Registrierung wird der Benutzer auf die Registrierungsseite umgeleitet, auf der eine Nachricht über eine erfolgreiche Registrierung vorliegt.
Sobald der Benutzer in seinem neu erstellten Konto erfolgreich eintritt, wird er nicht nur die Möglichkeit erhalten, detailliertere Informationen über Autos im Katalog zu sehen, sondern auch seine eigenen Autos hinzuzufügen sowie Statistiken zu ihren Aktionen und Aktionen anderer Benutzer mit seinen Autos zu verfolgen.


Auf dieser Seite muss der Benutzer relevante Informationen über sein Auto bereitstellen und den Tarif festlegen, an dem das Auto gemietet wird. Die Seite hat auch eine Validierung (ähnlich der Seite zur Autorisierung und Registrierung). Sobald der Benutzer sein Auto erfolgreich teilt, wird er sofort in seinem Konto angezeigt. Für seine Veröffentlichung muss der Administrator die Anwendung genehmigen. Danach kann der Benutzer das Auto über sein persönliches Konto veröffentlichen, Informationen bearbeiten und auf jede mögliche Weise mit diesem Auto interagieren. (Da der Benutzer sein Auto hinzugefügt hat, ist es logisch, dass es nicht ganz logisch und korrekt ist, es demselben Benutzer im Katalog anzuzeigen. Sie zeigen jedoch immer noch im Katalog, aber indem er mit Informationen über dieses Auto auf die Seite gehe, kann er es nicht mieten, aber er kann seine Beschreibung und seine Darstellung für andere Benutzer für andere Benutzer kennenlernen.)
Auf der Dashboard -Seite zu einem autorisierten Benutzer wird vorgeschlagen, die Statistiken seines Kontos zu trocknen. Auf dieser Seite kann der Benutzer Informationen wie folgt anzeigen:
Auf der Dashboard -Seite hat der Benutzer die Möglichkeit, mit Bearbeitungsinformationen zum Auto oder auf der Seite der Bearbeitung von Kontoinformationen auf die Seiten zu gelangen.

Auf der Hauptseite kann der Benutzer einige Felder ändern, die seinem Konto zugeordnet sind (z. B. Name, Nachname, Spitzname, Mail usw.)
Das Kopfmenü verfügt über mehrere Tasten links, nachdem es 2 gedrückt hat, von denen es Mini-Winds gibt, die auch dazu dienen, einige Informationen über das Konto zu ändern.

Beim Klicken auf die entsprechende Schaltfläche auf der Hauptseite ist der Benutzer eingeladen, einen der Avatare auszuwählen, die sein Profil darstellen. Sobald der Benutzer einen der Avatare auswählt, wird der Avatar auf Apply und Save changes aktualisiert und der Benutzer kann ein anderes Bild in seinem Konto beobachten.

Wenn die nächste Taste gedrückt wird, hat der Benutzer die Möglichkeit, ein neues Passwort aus seinem Konto einzugeben. Danach wird das Passwort aus seinem Konto vollständig aktualisiert und das alte Passwort ist ungültig, wenn das Konto erneut eingeführt wird.

Nachdem der Benutzer dem Konto ein neues Auto hinzugefügt hat und er vom Administrator erfolgreich bestätigt wird, kann der Benutzer sein Auto veröffentlichen (er wird ein schärfe zur Miete an andere Benutzer) oder es verbergen. Wenn das Auto versteckt ist, kann der Benutzer beim Klicken auf das entsprechende Menü auf die entsprechende Schaltfläche Modify klicken und dann mit Bearbeitungsinformationen zum Auto zur Seite wechseln.
Auf dieser Seite wird er in der Lage sein, die Gesamtinformationen über das Auto zu ändern (er kann das Bild des Autos und seiner Kategorie jedoch nicht ändern, wenn er eine solche Gelegenheit hätte, nachdem er das Auto durch den Administrator bestätigt hatte, nach dem, nach dem andere Benutzer in seinem Katalog falsche und universelle Informationen gesehen hätten).
TODO: Ändern Sie alles, was unten geht.

Sobald der autorisierte Benutzer die Information im Fahrzeug aus dem Katalog drückt, öffnet er die entsprechende Seite mit dem ausgewählten Auto und detailliertere Informationen zur Kopie. Auf dieser Seite wird es bald möglich sein, Bestellungen zu erstellen, die im persönlichen Konto des Benutzers aufgezeichnet werden.
Ich habe nach der Autorisierung eine Schaltfläche für den Übergang zum persönlichen Konto des Benutzers hinzugefügt, mit dem der Benutzer seine Bestellungen und die von ihm hinzugefügten Autos verfolgen kann (bisher Publish und Hide Tasten für die Interaktion mit Autos aktiv).


Auf dieser Seite ist der Benutzer nicht nur in der Lage, seine Informationen anzusehen und zu ändern, sondern auch seine Autos und Bestellungen zu kontrollieren. Nach den Benutzerdaten können Sie den folgenden Zähler sehen:
Auf dieser Seite können Sie auch Informationen wie folgt anzeigen:
Bei der Arbeit mit einem Auto -Tisch können Sie 3 Farben beobachten:
Abhängig vom Zustand und der Farbe des Autos sind neue/alte Funktionen für den Benutzer geöffnet/blockiert
Wie oben erwähnt, ist es für das System eines autorisierten Benutzers möglich, sein persönliches Konto einzugeben und alle Informationen zu seinen Bestellungen sowie die Autos zu verfolgen, die dieser Benutzer für andere Benutzer unseres Dienstes bereitgestellt hat. Aber was ist, wenn einige Informationen nicht eingegeben wurden, wenn sich die Daten des Benutzers geändert haben ... oder vielleicht der Benutzer, der ein Auto veröffentlicht hat, beschließt, sich irgendwie vor dem Hintergrund anderer выделться ? Um diese Probleme zu lösen, habe ich Seiten mit Bearbeitung von Informationen über den aktuellen Benutzer und über seine Autos entwickelt:
Gehen Sie in Ihrem persönlichen Konto in der Seite mit Edit Profile über sich

Beim Drücken öffnet der Benutzer eine Seite, auf der er alle Informationen ändern kann, die auf der Seite angezeigt werden

Insbesondere: Der Avatar seines Profils (um aus 7 Bildern aus dem vorgeschlagenen (1 Standard, der jedem neuen Benutzer zugewiesen ist, und 6 andere zur Auswahl))

Sie können auch Ihr Passwort ändern. Ich habe die Einrichtung eines neuen Passworts so gemacht, dass der vorherige nicht benötigt wird (in Wirklichkeit wäre es erforderlich, ein echtes Passwort anzufordern, bevor ein neues installiert wurde).

Aus einfacher kann der Benutzer die Felder auf dieser Seite ändern (z. B. Beschreibung des Profils, seine Telefonnummer, E-Mail usw.). Nachdem alle Feldnutzer geändert wurden, müssen Sie auf die entsprechende Schaltfläche Save Changes klicken (das neue Kennwort wird automatisch installiert, wenn die Schaltfläche Save auf der Seite mit der Installation eines neuen Kennworts gedrückt wird). Wenn beim Ausfüllen der Felder eine Art von Fehler gemacht wurde, kann der Benutzer auf die Schaltfläche Cancel Chnages klicken, die die Seite in sein ursprüngliches Formular (zu den alten Daten) zurückgibt oder die Schaltfläche Get Back drückt, die sie auf sein persönliches Konto übertragen.
Tatsächlich kann der Benutzer in Bezug auf Autos auch diese oder die Informationen ändern, die auf der Seite zuvor waren:

Die Anzahl der verfügbaren Felder zur Änderung ist jedoch um ein Vielfaches weniger als die des Benutzers. Warum so? Tatsache ist, dass mir bei der Entwicklung die Idee in der Idee kam: Jedes Auto wird durch die Anzahl der Bestellungen überwacht. Aber was wäre, wenn der Benutzer das Auto vollständig ändern könnte, sagen wir, sein Bild und seinen Namen ändern? Die Bewertung dieses Autos würde gleich bleiben, aber die detaillierte Beschreibung hätte sich vollständig geändert. Ein solcher Ansatz könnte eine Schlüsselrolle bei der Bestimmung anderer Benutzer spielen, für das das Auto ausgewählt werden soll: Zum Beispiel würde ein Benutzer, der sein Auto vor einem Jahr platziert hat, eindeutig gegen einen Benutzer verlieren, der die Beschreibung seines alten Autos in eine Beschreibung eines neuen. Daher kam ich zu dem Schluss, dass die Informationen nicht bearbeitet werden müssen und nur die notwendigsten Felder verfügbar sind: Felder mit Tarif, Beschreibung sowie Ort.
Dubo von autorisierten Benutzern können detaillierte Informationen zu Autos anderer Benutzer im Katalog anzeigen. Auf der Seite jedes Autos kann der Benutzer mit der Platzierung der Bestellung für die Verwendung dieses Autos zur Seite gehen:

Auf dieser Seite ist er eingeladen, einen Zeitraum zu wählen, in dem er das Auto benutzen kann.

Die Auswahl des Zeitintervalls wird mit dem daterangepicker -Element durchgeführt, in dem ich installiert wurde: die Startzeit - rund in die nächste Stunde. Die Endzeit (Standard) ist die Startzeit + 1 Stunde. Somit beträgt die Mindestzeit für die Verwendung des Autos 1 Stunde. Die Macismal -Zeit, die ich festgelegt habe, beträgt 7 Tage von Anfang an. Die Berechnung des Zahlungsbetrags erfolgt gemäß der Formel: Die Anzahl der Tage multipliziert mit dem Tarif/Tag + der Anzahl der Stunden * Tarif/Stunde. Sobald der Benutzer alle notwendigen Vorbereitungen vornimmt und die Bestellung bestätigt, wird er auf die Zahlungsseite umgeleitet:

Auf der Zahlungsseite werden alle für den Benutzer erforderlichen Informationen gegeben, um seine Bestellung erneut neu zu zeichnen. Sobald die Zahlung geleistet wird, können Benutzer Autos auf seinem persönlichen Konto finden: Der Benutzer, dem das Auto gehört, wird feststellen, dass das Auto gemietet wurde, und der Benutzer, der das Auto gemietet hat, wird vollständige Informationen über die bezahlte Zeit sowie alle Informationen über die verbleibende Zeit und Zeit des Endes des Mietvertrags für dieses Auto sehen. Es sieht wie folgt aus:

Wenn der Benutzer beschließt, seine Bestellung vor dem Zeitplan abzuschließen (die Bestellung endet nicht mit dem System, das für die abgelaufenen Bestellungen verantwortlich ist, sondern der Benutzer, der die Bestellung erteilt hat), hat er die Möglichkeit, die Autobewertung zu setzen, die er über die n -te Zeitzeit verwendet hat:

Auch hier hat der Benutzer die Wahl: Legen Sie eine Bewertung des Autos und drücken Sie dann die entsprechende Submit and Finish und vervollständigen Sie die Bestellung mit der Bewertung oder überspringen Sie einen Schritt mit der Bewertung, indem Sie auf Finish and not submit und die Bestellung abschließen, ohne die Bewertung zu senden.
Die Bewertung selbst ist auf der Seite mit Informationen über das Auto zu sehen. Abhängig von den von den Benutzern festgelegten Bewertungen werden allgemeine Statistiken auf der Seite angezeigt. Ein Auto mit 0 Sternen ist oben zu sehen, und eine Seite mit einem Auto mit einer Put -bewerteten Bewertung eines Benutzers wird unten angezeigt:

In diesem Abschnitt werde ich versuchen zu beschreiben, aber wie das Projekt von innen angeordnet ist, was in der "Black Box" passiert. Dies wird dazu beitragen, das Projekt besser für diejenigen zu verstehen, die mindestens eine kleine Vorstellung von der C# -Programmiersprache und der Programmieraspekte haben.
Um mit Daten zu arbeiten, müssen Sie natürlich entscheiden, aber wie können Sie sie speichern? Of course, super large projects are used for storage such a database as Oracle, PostgreSQL, MySQL, MSSQL and others. However, the problem of this approach is that access to applications tied to databases can only be obtained if the connection to the same database can be obtained on the user's device (for such a function you have to pay large amounts of money to gigants). Since I do not have large amounts of money, in order to start the project to any user and not experience problems with its testing and use, I put forward the idea of using serialization and decering in the contexts of relative paths. Thus, the problems with obtaining access from users who downloaded the application from the repository should not arise.
Каким же образом происходит получение данных из JSON-файлов и как вообще устроено получение данных? (Для всех локальных хранилищ)
Для того, чтобы не привязываться к какому-то определённому типу хранилищ, мной был применён подход Dependency Injection, а именно внедрение Singleton зависимостей между хранилищами и локальным репозиторием программы. То есть: в моей программе есть интерфейс:
public interface IVehiclesRepositoryЭтот интерфейс будет являться связующим звеном для получения данных. В данном интерфейсе есть набор методов, которые должны быть реализованы для того или иного сервиса, чтоб им можно было пользоваться независимо от реализации методов. Главное, чтоб эти методы были реализованы в том классе, который решит реализовать этот интерфейс. Для реализации локального интерфейса, так как я исользую локальное хранилище данных в файлах, а не в БД, я решил использовать Singleton подход, что будет означать, что объект сервиса будет создаваться только при первом обрпщении к нему, после чего все последующие запросы будут проходить через тот самый сервис. Ниже, мы явно указываем, что если кто-то захочет получить объект этого сервиса через интерфейс, мы дадим ему конкретную реализацию (В данном случае реализацию локального репозитория):
builder . Services . AddSingleton < IVehiclesRepository , VehiclesLocalRepository > ( ) ; // Где требуется IVehiclesRepository - дай реализацию VehiclesLocalRepositoryСами же локальные репозитории реализованы таким образом, чтоб уменьшить количество загрузок из файлов в само приложение. Как только происходит первое обращение к сервису - производится работа метода SetUpLocalRepository. Этот метод запишет в путой объект List<> модели, считанные из JSON - файла, после чего все манипуляции будут проходить непосредственно через сам этот List<>, а если данные будут меняться - будет вызываться асинхронный метод SaveChanges(), который призван асинхронно записать изменения в файл (Повторное считывание файла не происходит, так как мы работаем с объектом List<>, который мы также изменили перед тем, как запрашивать обновление JSON-файла). Таким образом, применённый мной подход не только позволит пользователю получать доступ в кратчайшие сроки, но и позволит избежать излишних нагрузок системы для загрузки данных из файлов каждый раз при обращении к сервису.
In design, I identified the following problem - should the user who added the car to the catalog be able to interact with the same car from the catalog? Natürlich nicht. This approach will allow the user who added the car to the directory to rent his own car (what's the point ???). To avoid this problem, I chose the following approach:
Imagine that at the moment, there are no users or added cars. Here we are launching our application. On the main page we see a map with 0 markers, and in the catalog there are also 0 cars. We create a new account, enter it, share our car. ABER! The car does not appear in the catalog. Was ist das Problem? The fact is that before displaying the car in the catalog, the user who added it should clearly publish a car from his personal account by clicking the Publish button opposite the selected car. As soon as he has been published, nothing will change for this user in the catalog, he will also see 0 cars. JEDOCH! If we leave the account or create a new one, the catalog will be seen in the catalog that the same car that he shared and which was published by the previous user. Thus, the user who added the car and placed it in the catalog cannot see his own cars (the user can see all his added cars in his personal account). ABER! After the user shares his car and places it in a catalog from his personal account, although he does not see this car in the catalog, he can go to the main page and pay attention to the fact that his car appeared on the marker’s form (however, he still does not have in the catalog). The fact is that the system shows any user all cars on the map in the form of a marker, which were published in your personal account, regardless of which user is now in the system. However, in the catalog, the system shows the same cars that are shown on the map on the main page in the form of markers, but the condition is also checked that the ID of the owner of the car is not equal to the ID of the current user entering the account. For an unauthorized user, the ID is not checked. He is shown the same cars in the catalog as on the map on the main page.
Таким образом, подводя итог:
Publish (И пропадёт, если он решит убрать его из каталога путём нажатия кнопки Hide ) При добавлении автомобиля, на странице использованы такие технологии, как локальное хранилище данных (Local Storage) для хранения координат местоположения автомобиля, а также специальные скрипты и элемент C# IFormFile для получения файла изображения со сраницы.
Lokale Speicherung
Предположим, что мы - очень невнимательные пользователи, которые всё время допускают ошибки на страницах. Для того, чтобы избежать повторного ввода координат каждый раз при обновлении страницы, пной было принято решение хранить координаты GoogleMaps в локальном хранилище и чистить эти данные в случае покидания пользователем страницы добавления своего автомобиля. Так как данные, применяемые при работе с GoogleMaps являются специфическими (представление типа данных float отличаются знаком разделителя) чтоб избежать большого количества манипуляции с данными, используется локальное хранилище, которое призвано сократить число операция приведения данных из одного представления в другое.
IFormFile и скрипты
При работе с изображеним, мы не можем получать доступ к файловой системе пользователя со страницы Razor, так как это просто недопустимо в рамках работы системы безопасности, поэтому приходится использовать определённые подходы, например, как работа с IFormFile. Объекты этого типа хранят всю необходимую информацию о выбранном изображении, которое выберет пользователь, при этом не представляет никакой угрозы для файловой системы компьютера в целом. Однако использование такого подхода имеет недотаток - пользователю необходимо каждый раз выбирать изображение снова и снова, если пользователем повторно допускаются ошибки на странице добавления автомобиля.
Ниже я постарался описать интересные технические моменты, которые я предпринимал в течение проектирования и разработки проекта.
При работе с получением автомобилей из репозитория у меня было 2 идеи, как решить данную задачу: Либо при каждом обращении к контроллеру формировать новый объект с информацией о машинах и передавать его во View , либо же принимать этот объект из View , если он уже был передан однажды, при этом не делая никаких дополнительных запросов в репозиторий, и модифицировать согласно предпочтениям пользователя по количеству отображения автомобилей на странице и тд. Сначала я принял решение пойти через получение модели из View , однако столкнулся с такой проблемой, как Model Binding , которая просто так не даёт получить List переданных в качестве модели автомобилей: Либо нужно использовать Ajax , при этом заранее сериализовать модель в JSON и после чего десериализовать полученную JSON -строку в Controller-е , либо никак) Поэтому я выбрал первый путь (через создание объекта), так как в этом случае придётся манипулировать в основном со ссылками на данные, нежели чем с самими данными. (ps Также, работа через первый подход потребовала бы накладных расходов на проверку, а не добавилась ли в репозиторий новая машина, но уже другим пользователем, и если добавилась, также необходимо было бы добавить её в модельку, пришедшую из View )
Изначально, мной была заложена идея, что пользователь может как оформить заказ на определённое время, внеся предоплату, так и просросить его, за что потребуется внести дополнительные деньги за просроченное время. Однако, при дальнейшем развитии идеи, мной были выявлены следующие проблемы, касательно как программной, так и правовой идеи такого подхода:
Поэтому, мной был выбран следующий план действий: Подразумевается, что заказ начинается, как только пользователь оформляет заказ на пользование авто и оплачивает его, а заканчивается этот же заказ ровно тогда, когда время пользования станет равно оплаченному времени. После чего, автомобиль сразу становится доступным для других пользователей в каталоге, а нынешний заказ пропадает с личного кабинета пользователя, оплатившего время на его использование. Если другой пользователь оформит заказ на тот же автомобиль и при прибытии на место обнаружит, что автомобиль отсутствует на том месте, на котором он расположен на карте, он имеет право подать в суд на человека, который просрочил своё время (собственно как и заказчик). Таким образом, каждый пользователь, который оформляет заказ, берёт на себя ответственность закончить его во время.