收益的主要思想:開發汽車共享服務的應用程序服務,並在地圖上顯示可用的汽車。在內容中 - 可以與Vehicles本質進行比較的所有內容:汽車,摩托車,任何車輛等。該應用程序應具有多功能:必須擁有大量頁面,具有接收,添加,更改和刪除實體的能力。
pager -A添加到頁面上。httpContextAccessor與用戶合作。UserStatusProvider狀態的存儲設施的過渡。使用SweetAlert2服務添加JS消息。ReadMe一起工作。Stripe支付服務的測試模式下連接到項目。將時間和日期選擇的功能添加到頁面上的放置。JS代碼的位置(由文件砸碎)。Brief Description 。他開始與汽車的評級一起工作。.NET 7 。在目錄頁面的搜索引擎上工作。RepositoryProvider替換大量不同的存儲庫,並降低了所有功能。JWToken Authentication添加到Web -Application Controllers。JWToken並在客戶端設置錯誤的頁面顯示。JSON文件到MongoDB Local的存儲。MongoDB Atlas群集,以進一步與雲服務合作。UI上工作。將Google Maps API標記從紅色更改為帶有名稱和圖像的汽車。實習的正式開始
Web應用程序過渡到完整的Clean Architecture 。Domain Layer並設置第一個型號。模型是在Rich Domain Models樣式中創建的。 Anemic Domain Models 。Application和Infrastructure Layers ,並與服務建立首次交互並設置DI 。PublicAPI一起創建的層。endpoints及其手動測試。Errors Handling及其處理的開始。Vehicle型號的一部分中添加Errors Handling 。endpoints的測試。Azure Key Vault功能以獲取Azure的秘密數據。實施咬合標誌是存儲有關汽車信息的選項之一。CustomerController及其手動測試添加新的endpoints 。VehicleController及其手動測試中添加新的endpoints 。IHttpClientFactory ,以創建客戶向PublicAPI發送申請的客戶。對於非範圍的發送消息的Polly配置,有可能在嚴重情況下等待和重新待發。PublicApi與Web部件一起綁定,檢查端點以及序列化序列化和避難所。JWToken ,並成功進入了帳戶。UI頁面上工作。errors handling 。html頁面和一些endpoints 。Bootstrap 5+新版本,並刪除註冊和授權頁面的邏輯。GoogleMaps Api和錯誤校正。Appsettings.json文件。設置和與Duende Identity Server第一次交互。Identity Server的規則,並從不必要的文件中清理項目。Duende Identity Server綁定到Web Application (客戶端部件)。Duende Identity Server一起過渡到使用自定義-MADE JWT-Authorization和創建Dashboard頁面(用戶個人帳戶)。MongoDB Entities合作的Duende Identity Server 。Duende Identity Server 。將AzureAD設置為授權方式之一。將新實體添加到MSSQL Server 。Identity Server設置有關的文件中清理項目。JwtBearer進行授權調整。設置AzureAD 。連接Azure Blob Storage是存儲汽車圖像的機制之一。Pipeline 。添加ActionNotes Repository作為應用程序的服務之一。Dashboard頁面上顯示有關客戶的一些數據有關的新機會。更新了添加了新列的數據庫的結構。 Pipeline配置為接收數據以提交有關客戶端帳戶的信息。Dashboard頁面上工作。Dashboard頁面上設置與車輛有關的操作。添加ajax功能以下載沒有更新的頁面。根據標準添加了搜索功能。pipeline供應以顯示目錄中汽車的數據。GoogleMaps Api 。Stripe支付服務添加集成。VehicleInformation頁面時,使用軟件方法。Azure VM合作。在AzureVM上設置Seq並託管異常服務。將海軍應用程序訪問到您的MSSQL數據庫中。Main branch Merge時進行GitHub Actions和自動Publish工作。Http轉移到Https並添加新功能的工作。Rental和Payment模式以及Azure VM情緒。Stripe Payment Service進行交互。Stripe相關的錯誤。在創建Stripe Checkout Sessions上的工作。Requests和Responses 。Runtime處理並獲得表格。DateTime錯誤糾正,數據庫中的請求以及應用程序功能。Routing-ом和設置頁面。.tagets文件,以解決不同項目中同一軟件包版本的問題。Endpoints上工作以編輯汽車數據。pipeline最終配置。server response分析儀上工作,並設置這些responses的通用處理程序。DateTime.Now (局部時間)轉換為對象DateTime.UtcNow (UTC Time)。Routing設置為REST樣式。pipeline上進行編輯信息。該項目是一個完整的Web應用程序,與PublicAPI在同一級別上運行,以Clean Architecture風格編寫,該應用程序允許任何擁有有效的租賃卡和駕駛執照的人,可以將另一個用戶的汽車送上一段時間,但也沒有註冊,但不是租用別人的汽車,但可以為他們的汽車提供其他用戶提供汽車。因此,應用程序的開發人員可以獲得優勢,收到用戶進行的一定百分比,並直接將用戶自己租用或租賃汽車。
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和MongoDB )GitHub Actions和Action Runners )Azure VM )還有其他...
整個項目都是從頭開始編寫的,使用bootstrap 5+來裝飾視覺組件,並使用Razor Pages的功能,嗯, C# .NET Core來編寫backend組件。作為互動模型,我選擇了MVC 。在出口,我們正在處理Client-Server MVC Wep App 。

一旦未經授權的用戶啟動了該應用程序,他就會立即看到主屏幕,其中包含有關該服務的信息。此頁麵包含所有必要的信息,以使自己熟悉服務的所有功能。最重要的是,您可以看到navbar元素,該元素始終在任何頁面上,並且不會從旨在執行附錄中用戶導航的視野中消失。 Navbar提供以下機會:

另外,在頁面上有一張來自Google的地圖,該地圖顯示了所有可用的位置,而不是從目錄中租用的汽車(標記出現在地圖上,根據該路,可以跟踪車輛的當前位置。當將其託付給標記時,將出現帶有其名稱的車輛的圖像)。作為限制,我選擇了明斯克市,即,地圖的位置是覆蓋整個城市地區的方式。如果說汽車將在布雷斯特街上的某個地方,那麼我們將不會在地圖上看到它(或者有必要更改卡的規模)。作為放置汽車的可用地點,我決定將自己限制在白俄羅斯,也就是說,由授權用戶放置的汽車應該在白俄羅斯共和國。但是,沒有什麼可以阻止用戶在另一個城市甚至一個國家創建汽車的訂單。
關於卡本身,它使用特殊鑰匙連接到應用程序,該鍵無需根據著名的緯度和經度找到位置的任何限制。

無論頁面如何,在最底部,都會有有關應用程序開發人員的信息,並鏈接到相應的社會。 SAM解決方案網絡和資源。

在與目錄的頁面上,將有機會查看有關汽車的所有負擔得起的簡短信息,並在目錄中提供的汽車中搜索標準。在頁面上有機會:

關於汽車的信息,提供了目錄:

該頁面還有機會引起實施對車輛的積分搜索所必需的形式。在這裡,向用戶提供了許多不同的過濾器,他可以在目錄中找到他感興趣的汽車。
因此,該目錄允許您考慮出現的車輛的各種,並為您的口味和顏色選擇任何副本。
用戶按下Log In後,他立即將其重定向到授權頁面。

在未經授權的用戶的授權頁面上,您需要輸入電子郵件(或登錄)和密碼以成功授權。當填寫字段的錯誤時,填寫時將顯示錯誤消息:

如果所有字段都正確填寫,但授權尚未通過,則用戶將提供有關授權失敗的消息:

有了成功的授權,已經授權的用戶將被重定向到儀表板頁面(個人帳戶),該頁面將有有關成功授權的消息,該消息將在出現後3秒自動消失。

如果用戶沒有自己的帳戶,則用戶需要創建自己的帳戶,將通過右Navbar元素上的Sign Up按鈕按下執行的頁面過渡。


在新用戶註冊的頁面上,有必要輸入一系列數據,以便該程序將客戶端輸入數據庫,並且註冊成功。整個頁面都充滿了驗證,如果某些內容未通過,則不會通知用戶發生錯誤的字段(與授權的蓬鬆相同)。成功註冊後,用戶將被重定向到註冊頁面,其中將有有關成功註冊的消息。
用戶成功進入他新創建的帳戶後,他將獲得機會,不僅可以查看目錄中有關汽車的更多詳細信息,還可以添加自己的汽車,以及對其他用戶使用汽車的行動和行動的跟踪統計信息。


在此頁面上,用戶將必須提供有關他的汽車的相關信息,並設定租用汽車的關稅。該頁面還具有驗證(類似於授權和註冊頁面)。但是,一旦用戶成功共享他的汽車,它將立即出現在他的帳戶中,但是,為了出版,管理員必須批准該應用程序,然後用戶可以通過其個人帳戶發布汽車,並以各種可能的方式與此汽車進行編輯。 (由於用戶添加了他的汽車,因此在目錄中向同一用戶展示它是不完全合乎邏輯且正確的。但是,他們仍然顯示在目錄中,但是通過使用有關這輛車的信息進入頁面上,所有者將無法租用它,但是他將能夠熟悉他的其他用戶的描述和代表)。
在授權用戶的儀表板頁面上,建議乞求乾燥其帳戶的統計數據。在此頁面上,用戶可以查看此類信息:
從儀表板頁面中,用戶有機會使用有關汽車的編輯信息或編輯帳戶信息的頁面進入頁面。

主頁允許用戶更改與他的帳戶關聯的某些字段(例如名稱,姓氏,暱稱,郵件等)
按下2個有迷你風的左側菜單在左側有幾個按鈕,這些按鈕也可以更改帳戶的一些信息。

單擊頭頁上的相應按鈕時,請邀請用戶選擇代表他的個人資料的一個化身之一。用戶選擇一個化身之一,然後他將單擊Apply並Save changes按鈕,將更新Avatar,並且用戶將能夠在其帳戶中觀察另一個圖像。

按下下一個按鈕時,用戶將有機會從他的帳戶中輸入新密碼,此後將完全更新其帳戶的密碼,並且在重新輸入帳戶時,舊密碼將無效。

用戶將新車添加到該帳戶後,管理員將成功確認他後,用戶將能夠發布他的汽車(他將成為其他用戶的刺激性租金),或將其隱藏。如果汽車被隱藏,則單擊相應的菜單時,用戶將能夠單擊相應的Modify按鈕,然後使用有關汽車的編輯信息轉到頁面。
在此頁面上,他將能夠更改有關汽車的總體信息(但是,他將無法更改汽車的形象及其類別,以至於如果他有這樣的機會,在管理員確認了汽車後,他可以加載任何圖像,此後其他用戶在其目錄中看到了錯誤和通用信息)。
TODO:更改以下所有內容。

一旦授權用戶按目錄中的車輛上的Information按鈕,他就會使用所選汽車打開相應的頁面,並提供有關該副本的更多詳細信息。從此頁面上,很快就有可能在用戶的個人帳戶中記錄下來的訂單。
授權後,我添加了一個將過渡到用戶個人帳戶的按鈕,該按鈕允許用戶跟踪其訂單和添加的汽車(到目前為止,只有Publish和Hide按鈕可以與汽車交互)。


在此頁面上,用戶不僅可以查看和更改他的信息,還可以控制他的汽車和訂單。在用戶數據之後,您可以看到以下計數器:
另外,在此頁面上,您可以查看此類信息:
使用汽車桌時,您可以觀察到3種顏色:
根據汽車的狀態和顏色,新/舊功能向用戶打開/阻止
如上所述,對於授權用戶的系統,可以輸入他的個人帳戶並跟踪與他的訂單有關的所有信息,以及該用戶為我們服務的其他用戶提供的汽車。但是,如果未輸入某些信息,如果用戶的數據已更改……或者發布汽車的用戶可以在其他人的背景下以某種方式выделться ? ? ?為了解決這些問題,我開發了有關當前用戶及其汽車的編輯信息的頁面:
從您的個人帳戶中,轉到頁面,並使用有關您自己的編輯信息,用戶可以單擊相應的Edit Profile按鈕

按下時,用戶打開了一個可以更改頁面上顯示的信息的頁面

特別是:其配置文件的頭像(從提出的7個圖像中選擇(1個默認圖像,分配給每個新用戶,還有6個供您選擇))

您也可以更改密碼。我以一種不需要的方式建立了一個新密碼(實際上,必須在安裝新密碼之前請求真實密碼)

從一個簡單的內容中,用戶可以更改此頁面上的任何字段(例如,配置文件的描述,他的電話號碼,電子郵件等)。更改所有字段用戶後,您必須單擊“相應的Save Changes按鈕(在安裝新密碼時按下Save按鈕時,將自動安裝新密碼)。如果在填寫字段時犯了某種錯誤,則用戶可以單擊Cancel Chnages按鈕,該按鈕將返回頁面為原始表單(對舊數據的圖案),或按Get Back ”按鈕,將其傳輸回其個人帳戶。
實際上,關於汽車,用戶還可以更改頁面上以前的信息:

但是,更改的可用字段數量是用戶的幾倍。為什麼呢?事實是,在發展時,這個想法發生在我身上:每輛車都會受到訂單數量的監控。但是,如果用戶可以完全更改汽車,請說出他的形象和名稱,該怎麼辦?這輛車的評分將保持不變,但是詳細說明將完全改變。至於我,這種方法可以在確定其他用戶方面發揮關鍵作用,例如:例如,一年前放置汽車的用戶顯然會損失將其舊車描述變為更新的用戶的用戶。因此,我得出的結論是,信息需要隱藏在編輯中,並且只有最必要的字段可用:具有關稅,描述和位置的字段。
授權用戶的Dubo可以查看目錄中其他用戶的汽車的詳細信息。從每輛車的頁面中,用戶可以通過使用此車的訂單進入頁面:

在此頁面上,他被邀請選擇一個可以使用汽車的時間段。

時間間隔的選擇是使用我安裝的daterangepicker元素進行的:開始時間 - 向下一個小時。結束時間(默認)是開始時間 + 1小時。因此,使用汽車的最小時間為1小時。我設定的狡猾時間是自開始以來的7天。付款金額的計算是根據公式進行的:乘以關稅/天 +小時數 *關稅/小時的天數。用戶做所有必要的準備工作並確認訂單後,他將被重定向到付款頁面:

在付款頁面上,為了再次重新訂單,提供了用戶所需的所有信息。付款後,用戶將能夠在其個人帳戶中找到汽車:擁有汽車的用戶將看到汽車被租用了,租用汽車的用戶將看到有關付費時間以及有關租賃租約剩餘時間和時間的所有信息。看起來如下:

當用戶決定提前完成訂單(該訂單並不以負責過期訂單的系統而結束,而是下達訂單的用戶)時,他有機會設置他在第n個時間內使用的汽車評級:

同樣,用戶可以選擇:將汽車的評分放置,然後按相應的Submit and Finish按鈕,並使用評分完成訂單,或通過單擊Finish and not submit按鈕來跳過評分,然後在不發送等級的情況下完成訂單。
評級本身可以在頁面上看到有關汽車的信息。根據用戶設定的評估,一般統計信息將顯示在頁面上。上面可以看到具有0星的汽車,下面顯示了帶有一個用戶的帶額定評級的汽車的頁面:下面顯示:

在本節中,我將嘗試描述,但是如何從內部安排項目,“黑匣子”內部發生了什麼。對於那些至少對C編程語言和編程方面有一點了解的人,這將有助於更好地理解該項目。
當然,為了使用任何數據,對於初學者,您需要決定,但是如何存儲它們?當然,超級項目用於存儲,例如Oracle,PostgreSQL,MySQL,MSSQL等數據庫。但是,這種方法的問題在於,只有在用戶設備上可以獲得與同一數據庫的連接時,才能獲得與數據庫相關的應用程序的訪問(對於這樣的功能,您必須向Gigants支付大量資金)。由於我沒有大量的錢,因此為了向任何用戶啟動該項目,而沒有遇到其測試和使用問題,我提出了在相對路徑的上下文中使用序列化和決定的想法。因此,從存儲庫中下載應用程序的用戶訪問的問題不應出現。
來自JSON文件的數據如何獲得,數據如何得到? (對於所有本地存放)
為了不與某些特定類型的存儲相關,我應用了深度注入方法,即在存儲設施和程序的本地存儲庫之間引入單例依賴性。也就是說:在我的程序中有一個接口:
public interface IVehiclesRepository該接口將是獲取數據的鏈接。在此接口中,應為特定服務實現一組方法,以便無論方法的實現如何,都可以使用。最主要的是,這些方法是在類似決定實現此接口的類中實現的。要實現本地接口,因為我和我將在文件中使用本地數據存儲,而不是在數據庫中,我決定使用Singleton方法,這意味著只有在第一次啟動期間才能創建服務對象,然後所有後續請求將通過同一服務。下面,我們清楚地表明,如果某人想通過接口獲得此服務的對象,我們將為它提供特定的實現(在這種情況下,是本地存儲庫的實現):
builder . Services . AddSingleton < IVehiclesRepository , VehiclesLocalRepository > ( ) ; // Где требуется IVehiclesRepository - дай реализацию VehiclesLocalRepository本地存儲庫本身以減少從文件到應用程序本身的下載量的方式實現。一旦出現對服務的首次吸引力,就可以執行SetUplocalrepository方法的工作。該方法將在puta中寫下一個列表<> json -file的對象,然後所有操作將直接通過此列表<> <>,如果數據會更改,則調用異步方法savechanges(),旨在編寫文件的更改(重新閱讀文件(重新閱讀)(我們與Lim的對象),因此我們在lim上進行了更改。我們在請求jon offecs of nign offim n offect of rectect of。因此,我應用的方法不僅允許用戶訪問最短的時間,而且還可以避免每次聯繫服務時每次從文件下載數據的負載過多。
在設計中,我確定了以下問題 - 將汽車添加到目錄中的用戶是否應該能夠與目錄中的同一輛汽車進行交互?當然不是。這種方法將允許將汽車添加到目錄中的用戶租用自己的汽車(這是什麼重點?)。為了避免此問題,我選擇了以下方法:
想像一下,目前沒有用戶或添加的汽車。在這裡,我們正在啟動我們的應用程序。在主頁上,我們看到了帶有0個標記的地圖,在目錄中也有0輛車。我們創建一個新帳戶,輸入,共享我們的汽車。但!汽車沒有出現在目錄中。問題是什麼?事實是,在將汽車展示在目錄中之前,添加它的用戶應該通過單擊所選汽車對面的Publish按鈕清楚地從其個人帳戶中發布汽車。一旦出版了他,目錄中的這個用戶將不會改變,他還將看到0輛車。然而!如果我們離開該帳戶或創建新帳戶,則將在目錄中看到該目錄,即他共享的同一輛汽車,並且由以前的用戶發布。因此,添加汽車並將其放入目錄中的用戶看不到自己的汽車(用戶可以在他的個人帳戶中看到他所有的汽車)。但!用戶分享他的汽車並將其從個人帳戶中放入目錄中,儘管他沒有在目錄中看到這輛車,但他可以轉到主頁,並註意他的汽車出現在標記表格上的事實(但是,他在目錄中仍然沒有)。事實是,該系統以標記的形式向地圖上的所有用戶展示了在您的個人帳戶中發布的所有用戶,而不管現在哪個用戶在系統中。但是,在目錄中,系統以標記形式顯示了在主頁上地圖上顯示的相同的汽車,但是還檢查了條件,即汽車所有者的ID不等於輸入帳戶的當前用戶的ID。對於未經授權的用戶,未檢查ID。他在目錄中與主頁上的地圖上顯示了相同的汽車。
因此,總結:
Publish按鈕將他從他的個人帳戶中出版(如果他決定通過按下Hide按鈕將其從目錄中刪除,將消失)將他從他的個人帳戶中發佈出來時,該汽車才會出現在目錄中和目錄中)當添加汽車時,該頁面使用諸如本地存儲(本地存儲)等技術來存儲汽車位置的坐標,以及特殊腳本和元素C# IFormFile來從塔樓獲取圖像。
本地存儲
假設我們是非常不專心的用戶,他們總是在頁面上犯錯誤。為了避免在更新頁面時每次重新輸入坐標,決定將GoogleMaps坐標存儲在本地存儲中,並在用戶離開添加汽車的頁面時清理此數據。由於使用GoogleMaps使用時使用的數據是特定的(表示浮點數據的類型不同),以避免使用數據進行大量操作,因此使用本地存儲,旨在將數據數量從一個表示形式減少到另一種表示形式。
iformfile和腳本
使用描繪時,我們無法從剃須刀頁面訪問用戶文件系統,因為它在安全系統的框架中根本無法接受,因此我們必須使用某些方法,例如使用IformFile。此類型的對象存儲了用戶選擇所選圖像的所有必要信息,同時對整個計算機文件系統不構成威脅。但是,這種方法的使用缺乏 - 如果用戶在添加汽車的頁面上重新允許錯誤,則需要一次又一次地選擇圖像。
在下面,我試圖描述我在項目設計和開發過程中提到的有趣的技術要點。
在從存儲庫中接收汽車時,我對如何解決此問題有2個想法:要么在每個聯繫控制器上形成一個帶有有關汽車信息的新對象,並將其傳輸到View ,或者從View中接受此對象,如果它已經轉移,而無需向存儲庫提出任何其他請求,並根據頁面進行修改。起初,我決定從View中瀏覽一個模型,但是我面臨一個諸如Model Binding類的問題,這些問題並沒有給出作為汽車模型的List :您要么需要使用Ajax ,而事先在JSON中使用Ajax,然後在JSON中進行模型,然後應對最終的JSON -Stroller或No Woite,或者我選擇了第一個鏈接(通過創建案例,就可以創建creation you the Controller-е )(因為創建案例),因為創建了creation yyaip you the the Inip,而不是在創建對象,因為它是在創建對象的鏈接)使用View本身。
最初,我提出了一個想法,即用戶可以在一定時間內下訂單,進行預付款並延遲訂單,為此,有必要在逾期時間內賺取額外的錢。但是,隨著這個想法的進一步發展,我確定了有關這種方法的軟件和法律概念的以下問題:
因此,我選擇了以下行動計劃:暗示該訂單在用戶下訂單使用汽車並為其付費的訂單開始,並且當使用時間等於付費時間時,相同的訂單準確結束。之後,該汽車立即向目錄中的其他用戶使用,當前訂單從已花費時間使用它的用戶的個人帳戶中消失。如果另一個用戶向同一輛車下訂單,到達該地點時發現該車在地圖上的位置不存在,則他有權起訴已經到期的人(實際上是客戶)。因此,每個訂購訂單的用戶都負責完成該訂單。