แนวคิดหลักของการดำเนินการ: เพื่อพัฒนาบริการแอปพลิเคชันของบริการแชร์รถด้วยการแสดงรถยนต์ที่มีอยู่บนแผนที่ ในเนื้อหา - ทุกอย่างที่สามารถเปรียบเทียบกับสาระสำคัญ Vehicles : รถยนต์, รถจักรยานยนต์, ยานพาหนะใด ๆ ฯลฯ แอปพลิเคชันควรมีมัลติฟังก์ชั่น: จำเป็นต้องมีหน้าจำนวนมากที่มีความสามารถในการรับเพิ่มเปลี่ยนและลบเอนทิตี
pager -a ลงในหน้าhttpContextAccessorUserStatusProvider การเพิ่มข้อความ JS โดยใช้บริการ SweetAlert2ReadMeStripe ไปยังโครงการ การเพิ่มฟังก์ชั่นการเลือกเวลาและวันที่ลงในหน้าด้วยการจัดวางคำสั่งซื้อJS (ถูกทุบโดยไฟล์)Brief Description ที่เรียกว่าบัญชีที่วางรถของผู้ใช้ เขาเริ่มมีส่วนร่วมกับการให้คะแนนสำหรับรถยนต์.NET 7 ทำงานบนเครื่องมือค้นหาของหน้าแคตตาล็อกRepositoryProvider หนึ่งตัวและลดฟังก์ชั่นทั้งหมดสำหรับมันJWToken Authentication ลงในตัวควบคุม Web แอปพลิเคชันJWToken และตั้งค่าการแสดงหน้าของข้อผิดพลาดทางฝั่งไคลเอ็นต์JSON เป็นที่เก็บข้อมูลใน MongoDB LocalMongoDB Atlas เพื่อทำงานกับบริการคลาวด์ต่อไปUI การเปลี่ยนเครื่องหมาย Google Maps API จากสีแดงเป็นรถที่มีชื่อและรูปภาพจุดเริ่มต้นอย่างเป็นทางการของการฝึกงาน
Web แอปพลิเคชันหนึ่งเป็น Clean Architecture เต็มรูปแบบDomain Layer และตั้งค่ารุ่นแรก โมเดลถูกสร้างขึ้นในรูปแบบ Rich Domain Models Anemic Domain ModelsApplication และ Infrastructure Layers รวมถึงการตั้งค่าการโต้ตอบครั้งแรกกับบริการและตั้งค่า DIPublicAPIendpoints แรกและการทดสอบด้วยตนเองErrors Handling และการประมวลผลErrors Handling กับส่วนหนึ่งของรุ่น VehicleendpointsAzure Key Vault เพื่อรับข้อมูลลับด้วย Azure การใช้ธงกัดเป็นหนึ่งในตัวเลือกสำหรับการจัดเก็บข้อมูลเกี่ยวกับรถยนต์endpoints ใหม่ให้กับ CustomerController และการทดสอบด้วยตนเองendpoints ใหม่ให้กับ VehicleController และการทดสอบด้วยตนเองIHttpClientFactory เพื่อสร้างลูกค้าสำหรับการส่ง Requets ไปยัง PublicAPI การกำหนดค่า Polly สำหรับการส่งข้อความที่ไม่ใช่คลื่นวิทยุที่มีความเป็นไปได้ที่จะรอและเพิ่มอีกครั้งในกรณีที่มีสถานการณ์วิกฤติPublicApi พร้อมกับส่วน Web และตรวจสอบจุดสิ้นสุดและการทำให้เป็นอนุกรมและการลดลงของโปรแกรมระหว่างโปรแกรมJWToken ที่ได้รับจากเซิร์ฟเวอร์ทางฝั่งไคลเอ็นต์ด้วยการเข้าสู่บัญชีที่ประสบความสำเร็จUI ของการลงทะเบียนการอนุญาตและเพิ่มรถใหม่errors handling ในส่วนไคลเอนต์เมื่อเพิ่มรถใหม่html และ endpoints บางจุดBootstrap 5+ เวอร์ชันใหม่กว่าและลบตรรกะของหน้าการลงทะเบียนและการอนุญาตGoogleMaps Api และการแก้ไขข้อผิดพลาดAppsettings.json การตั้งค่าและการโต้ตอบครั้งแรกกับ Duende Identity ServerIdentity Server และทำความสะอาดโครงการจากไฟล์ที่ไม่จำเป็นDuende Identity Server กับ Web Application (ส่วนไคลเอนต์)Duende Identity Server เพื่อใช้งานที่กำหนดเอง -made JWT-Authorization และการสร้างหน้า Dashboard (บัญชีส่วนบุคคลของผู้ใช้)Duende Identity Server สำหรับการทำงานกับ MongoDB EntitiesDuende Identity Server การตั้งค่า AzureAD เป็นหนึ่งในวิธีการอนุญาต การเพิ่มเอนทิตีใหม่ไปยัง MSSQL ServerIdentity ServerJwtBearer ตั้งค่า AzureAD การเชื่อมต่อ Azure Blob Storage เป็นหนึ่งในกลไกสำหรับการจัดเก็บภาพรถยนต์Pipeline ระหว่างแอพเซิร์ฟเวอร์และฐานข้อมูลทั้งสอง เพิ่ม ActionNotes Repository เป็นหนึ่งในบริการของแอปพลิเคชันDashboard อัปเดตโครงสร้างของฐานข้อมูลซึ่งมีการเพิ่มคอลัมน์ใหม่ Pipeline ได้รับการกำหนดค่าให้รับข้อมูลเพื่อส่งข้อมูลเกี่ยวกับบัญชีของลูกค้าDashboardDashboard ฟังก์ชั่น ajax ถูกเพิ่มเข้ามาในการดาวน์โหลดเพจโดยไม่ต้องอัปเดต เพิ่มฟังก์ชั่นการค้นหาตามเกณฑ์pipeline ส่งข้อมูลบนรถยนต์ในแคตตาล็อกGoogleMaps ApiStripeVehicleInformationAzure VM การตั้งค่าบริการ Seq และ Hosting Exceptions บน Azurevm การตั้งค่าการเข้าถึงแอปพลิเคชันกองทัพเรือไปยังฐานข้อมูล MSSQL ของคุณGitHub Actions และ Publish อัตโนมัติเมื่อ Merge กับ Main branchHttp ไปยัง Https และเพิ่มฟังก์ชั่นใหม่Rental และ Payment ใหม่และอารมณ์ Azure VMStripe Payment Service ทางฝั่งเซิร์ฟเวอร์Stripe ทำงานเกี่ยวกับการสร้าง Stripe Checkout SessionsRequests เซิร์ฟเวอร์และ Responses เมื่อจัดการคำสั่งซื้อบนไคลเอนต์Runtime และรับแบบฟอร์มเมื่อเปลี่ยนสถานะของคำสั่งซื้อDateTime คำขอในฐานข้อมูลและทำงานเกี่ยวกับการทำงานของแอปพลิเคชันRouting-ом และตั้งค่าหน้าจอแสดงผลพร้อมข้อมูลข้อผิดพลาด.tagets เพื่อแก้ปัญหาของเวอร์ชันของแพ็คเกจเดียวกันในโครงการต่าง ๆEndpoints เพื่อแก้ไขข้อมูลรถยนต์pipeline ระหว่างตัวควบคุมทั้งหมดของไคลเอนต์และเซิร์ฟเวอร์หลังจากเพิ่มแอตทริบิวต์ลงในพารามิเตอร์ของคอนโทรลเลอร์server response ทางฝั่งไคลเอ็นต์และตั้งค่าตัวจัดการสากลของ responses เหล่านี้DateTime.Now (เวลาท้องถิ่น) เป็นวัตถุ DateTime.UtcNow (เวลา UTC)Routing ในส่วนเซิร์ฟเวอร์ในสไตล์ RESTpipeline เพื่อแก้ไขข้อมูล โครงการนี้เป็นแอปพลิเคชัน 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 and Action Runners )Azure VM )และคนอื่น ๆ ...
โครงการทั้งหมดถูกเขียนตั้งแต่เริ่มต้นโดยใช้ bootstrap 5+ เพื่อตกแต่งองค์ประกอบภาพรวมถึงการใช้ฟังก์ชันการทำงานของ Razor Pages ดี C# .NET Core สำหรับการเขียนส่วนประกอบ backend เป็นแบบจำลองของการมีปฏิสัมพันธ์ฉันเลือก MVC ที่ทางออกเรากำลังติดต่อกับ Client-Server MVC Wep App

ทันทีที่ผู้ใช้ที่ไม่ได้รับอนุญาตเปิดใช้งานแอปพลิเคชันเขาจะเห็นหน้าจอหลักพร้อมข้อมูลเกี่ยวกับบริการทันที หน้านี้มีข้อมูลที่จำเป็นทั้งหมดเพื่อทำความคุ้นเคยกับผู้ใช้ใหม่ด้วยความสามารถทั้งหมดของบริการ ด้านบนคุณสามารถเห็นองค์ประกอบ navbar ซึ่งเป็นเวลาทั้งหมดในหน้าใด ๆ และไม่หายไปจากฟิลด์วิสัยทัศน์ที่ออกแบบมาเพื่อดำเนินการนำทางผู้ใช้ในภาคผนวก Navbar ให้โอกาสต่อไปนี้:

นอกจากนี้ในหน้ามีแผนที่จาก Google ซึ่งแสดงตำแหน่งของทั้งหมดที่มีอยู่ไม่เช่ารถยนต์จากแคตตาล็อก (เครื่องหมายปรากฏบนแผนที่ตามที่ตั้งปัจจุบันของยานพาหนะสามารถติดตามได้เมื่อได้รับมอบหมายให้ทำเครื่องหมายภาพของยานพาหนะที่มีชื่อจะปรากฏขึ้น) ฉันเลือกเมืองมินสค์นั่นคือแผนที่ตั้งอยู่ในลักษณะที่ครอบคลุมพื้นที่ทั้งหมดของเมือง หากรถพูดว่าจะอยู่ที่ไหนสักแห่งบนถนนของเบรสต์เราจะไม่เห็นมันบนแผนที่ (หรือจำเป็นต้องเปลี่ยนขนาดของการ์ด) เนื่องจากสถานที่ที่มีอยู่สำหรับการวางรถยนต์ฉันตัดสินใจที่จะ จำกัด ตัวเองให้เบลารุสนั่นคือรถยนต์ที่ผู้ใช้ที่ได้รับอนุญาตควรอยู่ในสาธารณรัฐเบลารุส อย่างไรก็ตามไม่มีอะไรป้องกันไม่ให้ผู้ใช้สร้างคำสั่งซื้อสำหรับรถยนต์ในเมืองอื่นหรือแม้แต่ประเทศ
เกี่ยวกับการ์ดนั้นเชื่อมต่อกับแอปพลิเคชันโดยใช้คีย์พิเศษซึ่งทำงานได้โดยไม่มีข้อ จำกัด ใด ๆ สำหรับการค้นหาตำแหน่งตามละติจูดและลองจิจูดที่มีชื่อเสียง

โดยไม่คำนึงถึงหน้าเว็บที่ด้านล่างสุดจะมีข้อมูลเกี่ยวกับนักพัฒนาของแอปพลิเคชันและลิงก์ไปยังสังคมที่เกี่ยวข้อง SAM Solutions Networks และทรัพยากร

ในหน้าด้วยแคตตาล็อกผู้ใช้จะได้รับโอกาสในการดูข้อมูลสั้น ๆ ที่เหมาะสมทั้งหมดเกี่ยวกับรถยนต์รวมถึงการค้นหาเกณฑ์ระหว่างรถยนต์ที่ให้ไว้ในแคตตาล็อก ในหน้ามีโอกาส:

เกี่ยวกับข้อมูลเกี่ยวกับรถยนต์มีการนำเสนอแคตตาล็อก:

หน้านี้ยังมีโอกาสที่จะทำให้แบบฟอร์มที่จำเป็นสำหรับการดำเนินการค้นหาจุดสำหรับยานพาหนะ ที่นี่มีตัวกรองที่แตกต่างกันมากมายให้กับผู้ใช้ซึ่งเขาสามารถหารถยนต์ที่น่าสนใจสำหรับเขาในแคตตาล็อก
ดังนั้นแคตตาล็อกช่วยให้คุณพิจารณาการจัดประเภทของยานพาหนะที่นำเสนอและเลือกสำเนาใด ๆ ตามรสนิยมและสีของคุณ
ทันทีที่ผู้ใช้กด Log In ใช้เขาจะเปลี่ยนเส้นทางไปยังหน้าการอนุญาตทันที

ในหน้าการอนุญาตผู้ใช้ที่ไม่ได้รับอนุญาตคุณจะต้องป้อนอีเมลของคุณ (หรือเข้าสู่ระบบ) และรหัสผ่านเพื่อการอนุญาตที่ประสบความสำเร็จ เมื่อเกิดข้อผิดพลาดในการกรอกข้อมูลข้อความแสดงข้อผิดพลาดจะปรากฏขึ้นเมื่อกรอกข้อมูล:

หากฟิลด์ทั้งหมดเต็มไปอย่างถูกต้อง แต่การอนุญาตยังไม่ผ่านผู้ใช้จะนำเสนอข้อความเกี่ยวกับการอนุญาตที่ไม่สำเร็จ:

ด้วยการอนุญาตที่ประสบความสำเร็จผู้ใช้ที่ได้รับอนุญาตจะถูกเปลี่ยนเส้นทางไปยังหน้าแดชบอร์ด (บัญชีส่วนตัว) ซึ่งจะมีข้อความเกี่ยวกับการอนุญาตที่ประสบความสำเร็จซึ่งจะหายไปโดยอัตโนมัติ 3 วินาทีหลังจากปรากฏตัว

หากผู้ใช้ไม่มีบัญชีของตัวเองผู้ใช้จะต้องสร้างบัญชีของตัวเองการเปลี่ยนไปใช้หน้าเพื่อนำไปใช้ซึ่งดำเนินการผ่านการกดปุ่ม Sign Up ในองค์ประกอบ NAVBAR ด้านขวา


ในหน้าเว็บที่มีการลงทะเบียนผู้ใช้ใหม่จำเป็นต้องป้อนชุดข้อมูลเพื่อให้โปรแกรมป้อนไคลเอนต์ลงในฐานข้อมูลและการลงทะเบียนจะสำเร็จ ทั้งหน้าเต็มไปด้วยการตรวจสอบและหากมีบางสิ่งไม่ผ่านผู้ใช้จะไม่ได้รับแจ้งเกี่ยวกับฟิลด์ที่เกิดข้อผิดพลาด (เงินต้นเดียวกับที่มีขนดกของการอนุญาต) หลังจากการลงทะเบียนที่ประสบความสำเร็จผู้ใช้จะถูกเปลี่ยนเส้นทางไปยังหน้าการลงทะเบียนซึ่งจะมีข้อความเกี่ยวกับการลงทะเบียนที่ประสบความสำเร็จ
ทันทีที่ผู้ใช้เข้าสู่บัญชีที่สร้างขึ้นใหม่ได้สำเร็จเขาจะได้รับโอกาสไม่เพียง แต่จะดูข้อมูลรายละเอียดเพิ่มเติมเกี่ยวกับรถยนต์ในแคตตาล็อก แต่ยังเพิ่มรถยนต์ของเขาเองรวมถึงสถิติการติดตามการกระทำและการกระทำของผู้ใช้อื่น ๆ ด้วยรถยนต์ของเขา


ในหน้านี้ผู้ใช้จะต้องให้ข้อมูลที่เกี่ยวข้องเกี่ยวกับรถของเขารวมถึงกำหนดภาษีที่รถจะเช่า หน้ายังมีการตรวจสอบความถูกต้อง (คล้ายกับหน้าการอนุญาตและการลงทะเบียน) ทันทีที่ผู้ใช้ประสบความสำเร็จในการแชร์รถของเขามันจะปรากฏขึ้นทันทีในบัญชีของเขาอย่างไรก็ตามสำหรับการตีพิมพ์ผู้ดูแลระบบจะต้องอนุมัติแอปพลิเคชันหลังจากนั้นผู้ใช้จะสามารถเผยแพร่รถผ่านบัญชีส่วนตัวของเขารวมถึงแก้ไขข้อมูลและโต้ตอบกับรถคันนี้ในทุกวิถีทาง (เนื่องจากผู้ใช้เพิ่มรถของเขาจึงเป็นตรรกะว่ามันจะไม่สมเหตุสมผลและถูกต้องที่จะแสดงในแคตตาล็อกให้กับผู้ใช้รายเดียวกันอย่างไรก็ตามพวกเขายังคงแสดงในแคตตาล็อก แต่เมื่อไปที่หน้าด้วยข้อมูลเกี่ยวกับรถคันนี้เจ้าของจะไม่สามารถเช่าได้ แต่เขาจะสามารถทำความคุ้นเคยกับคำอธิบาย
ในหน้าแดชบอร์ดไปยังผู้ใช้ที่ได้รับอนุญาตมีการเสนอให้ขอให้แห้งสถิติของบัญชีของเขา ในหน้านี้ผู้ใช้สามารถดูข้อมูลเช่น:
จากหน้าแดชบอร์ดผู้ใช้มีโอกาสไปที่หน้าด้วยข้อมูลการแก้ไขเกี่ยวกับรถยนต์หรือในหน้าของข้อมูลการแก้ไขบัญชี

หน้าหัวอนุญาตให้ผู้ใช้เปลี่ยนบางฟิลด์ที่เกี่ยวข้องกับบัญชีของเขา (เช่นชื่อนามสกุลชื่อเล่นอีเมล ฯลฯ )
เมนูหัวมีปุ่มหลายปุ่มทางด้านซ้ายหลังจากกด 2 ปุ่มที่มีมินิลมซึ่งยังทำหน้าที่เปลี่ยนข้อมูลบางอย่างของบัญชี

เมื่อคลิกที่ปุ่มที่เกี่ยวข้องบนหน้าหัวผู้ใช้จะได้รับเชิญให้เลือกหนึ่งในอวตารที่จะเป็นตัวแทนของโปรไฟล์ของเขา ทันทีที่ผู้ใช้เลือกหนึ่งในอวตารหลังจากนั้นเขาจะคลิกที่ปุ่ม Apply และ Save changes อวตารจะได้รับการอัปเดตและผู้ใช้จะสามารถสังเกตภาพอื่นในบัญชีของเขาได้

เมื่อกดปุ่มถัดไปผู้ใช้จะมีโอกาสป้อนรหัสผ่านใหม่จากบัญชีของเขาหลังจากนั้นรหัสผ่านจากบัญชีจะได้รับการอัปเดตอย่างสมบูรณ์และรหัสผ่านเก่าจะไม่ถูกต้องเมื่อเข้าบัญชีอีกครั้ง

หลังจากผู้ใช้เพิ่มรถใหม่ลงในบัญชีและเขาจะได้รับการยืนยันอย่างประสบความสำเร็จโดยผู้ดูแลระบบผู้ใช้จะสามารถเผยแพร่รถของเขาได้ (เขาจะกลายเป็นคนที่จ่ายค่าเช่าให้กับผู้ใช้รายอื่น) หรือซ่อนมัน หากรถถูกซ่อนเมื่อคลิกที่เมนูที่เกี่ยวข้องผู้ใช้จะสามารถคลิกที่ปุ่ม Modify ที่เกี่ยวข้องแล้วไปที่หน้าด้วยข้อมูลการแก้ไขเกี่ยวกับรถยนต์
ในหน้านี้เขาจะสามารถเปลี่ยนข้อมูลโดยรวมเกี่ยวกับรถ (อย่างไรก็ตามเขาจะไม่สามารถเปลี่ยนภาพลักษณ์ของรถและหมวดหมู่ของเขาเพื่อจุดประสงค์ที่ว่าถ้าเขามีโอกาสเช่นนี้หลังจากยืนยันรถยนต์โดยผู้ดูแลระบบเขาสามารถโหลดภาพใด ๆ
TODO: เปลี่ยนทุกอย่างที่อยู่ด้านล่าง

ทันทีที่ผู้ใช้ที่ได้รับอนุญาตกดปุ่ม Information บนยานพาหนะจากแคตตาล็อกเขาจะเปิดหน้าเว็บที่เกี่ยวข้องกับรถที่เลือกและข้อมูลรายละเอียดเพิ่มเติมเกี่ยวกับสำเนา จากหน้านี้ในไม่ช้าก็เป็นไปได้ที่จะทำการสั่งซื้อที่จะบันทึกไว้ในบัญชีส่วนตัวของผู้ใช้
ฉันเพิ่มปุ่มสำหรับการเปลี่ยนไปใช้บัญชีส่วนตัวของผู้ใช้หลังจากได้รับอนุญาตซึ่งช่วยให้ผู้ใช้สามารถติดตามคำสั่งซื้อและรถยนต์ที่เพิ่มโดยเขา (จนถึงตอนนี้ Publish และ Hide ปุ่มเท่านั้นที่ใช้งานได้สำหรับการโต้ตอบกับรถยนต์)


ในหน้านี้ผู้ใช้จะไม่สามารถดูและเปลี่ยนข้อมูลของเขาได้ แต่ยังควบคุมรถยนต์และคำสั่งซื้อของเขาด้วย หลังจากข้อมูลผู้ใช้คุณสามารถดูตัวนับต่อไปนี้:
นอกจากนี้ในหน้านี้คุณสามารถดูข้อมูลดังกล่าวเป็น:
เมื่อทำงานกับโต๊ะรถยนต์คุณสามารถสังเกตได้ 3 สี:
ขึ้นอยู่กับสถานะและสีของรถยนต์ฟังก์ชั่นใหม่/เก่าจะเปิด/บล็อกให้กับผู้ใช้
ดังที่ได้กล่าวไว้ข้างต้นสำหรับระบบของผู้ใช้ที่ได้รับอนุญาตมันเป็นไปได้ที่จะป้อนบัญชีส่วนตัวของเขาและติดตามข้อมูลทั้งหมดที่เกี่ยวข้องกับคำสั่งซื้อของเขารวมถึงรถยนต์ที่ผู้ใช้รายนี้ให้ไว้สำหรับผู้ใช้รายอื่นของบริการของเรา แต่จะเกิดอะไรขึ้นถ้าข้อมูลบางอย่างไม่ได้ป้อนหากข้อมูลของผู้ใช้เปลี่ยนไป ... หรืออาจเป็นผู้ใช้ที่เผยแพร่รถยนต์ตัดสินใจที่จะ выделться กับฉากหลังของผู้อื่น ??? เพื่อแก้ปัญหาเหล่านี้ฉันได้พัฒนาหน้าด้วยข้อมูลการแก้ไขเกี่ยวกับผู้ใช้ปัจจุบันและเกี่ยวกับรถยนต์ของเขา:
จากบัญชีส่วนตัวของคุณไปที่หน้าด้วยข้อมูลการแก้ไขเกี่ยวกับตัวคุณเองผู้ใช้สามารถทำได้โดยคลิกที่ปุ่ม Edit Profile ที่สอดคล้องกัน

เมื่อกดผู้ใช้จะเปิดหน้าเว็บที่เขาสามารถเปลี่ยนข้อมูลใด ๆ ที่แสดงบนหน้าเว็บ

โดยเฉพาะอย่างยิ่ง: อวตารของโปรไฟล์ (เพื่อเลือก 7 ภาพจากที่เสนอ (1 ค่าเริ่มต้นซึ่งถูกกำหนดให้กับผู้ใช้ใหม่แต่ละคนและอีก 6 รายการให้เลือก))))))))))))))))))))

คุณสามารถเปลี่ยนรหัสผ่านของคุณได้ ฉันสร้างรหัสผ่านใหม่ในลักษณะที่ไม่จำเป็นต้องใช้รหัสก่อนหน้า (ในความเป็นจริงมันจำเป็นที่จะต้องขอรหัสผ่านจริงก่อนที่จะติดตั้งใหม่)

จากหนึ่งเดียวผู้ใช้สามารถเปลี่ยนฟิลด์ใด ๆ ในหน้านี้ (ตัวอย่างเช่นคำอธิบายของโปรไฟล์หมายเลขโทรศัพท์อีเมล ฯลฯ ) หลังจากที่ผู้ใช้ฟิลด์ทั้งหมดมีการเปลี่ยนแปลงคุณต้องคลิกที่ปุ่ม Save Changes ที่สอดคล้องกัน (รหัสผ่านใหม่จะถูกติดตั้งโดยอัตโนมัติเมื่อกดปุ่ม Save บนหน้าด้วยการติดตั้งรหัสผ่านใหม่) หากเกิดข้อผิดพลาดบางอย่างเมื่อกรอกข้อมูลฟิลด์ผู้ใช้สามารถคลิกที่ปุ่ม Cancel Chnages ซึ่งจะส่งคืนหน้าไปยังแบบฟอร์มดั้งเดิม (tobish ไปยังข้อมูลเก่า) หรือกดปุ่ม Get Back ซึ่งจะถ่ายโอนกลับไปยังบัญชีส่วนตัว
ที่จริงแล้วเกี่ยวกับรถยนต์ผู้ใช้ยังสามารถเปลี่ยนข้อมูลนี้หรือข้อมูลที่ก่อนหน้านี้ในหน้า:

อย่างไรก็ตามจำนวนฟิลด์ที่มีอยู่สำหรับการเปลี่ยนแปลงนั้นน้อยกว่าผู้ใช้หลายเท่า ทำไม? ความจริงก็คือเมื่อพัฒนาความคิดที่เกิดขึ้นกับฉัน: รถทุกคันถูกตรวจสอบโดยจำนวนคำสั่งซื้อ แต่ถ้าผู้ใช้สามารถเปลี่ยนรถได้อย่างสมบูรณ์พูดเปลี่ยนภาพและชื่อของเขา การจัดอันดับของรถคันนี้จะยังคงเหมือนเดิม แต่คำอธิบายโดยละเอียดจะเปลี่ยนไปอย่างสมบูรณ์ สำหรับฉันวิธีการดังกล่าวอาจมีบทบาทสำคัญในการกำหนดผู้ใช้รายอื่นซึ่งให้เลือกรถ: ตัวอย่างเช่นผู้ใช้ที่วางรถของเขาเมื่อปีที่แล้วจะสูญเสียผู้ใช้ที่จะเปลี่ยนคำอธิบายของรถเก่าของเขาเป็นคำอธิบายของใหม่มากขึ้น ดังนั้นฉันจึงสรุปได้ว่าข้อมูลจะต้องถูกซ่อนไว้จากการแก้ไขและมีเพียงฟิลด์ที่จำเป็นที่สุดเท่านั้น: ฟิลด์ที่มีอัตราภาษีคำอธิบายและสถานที่
Dubo จากผู้ใช้ที่ได้รับอนุญาตสามารถดูข้อมูลรายละเอียดเกี่ยวกับรถยนต์ของผู้ใช้รายอื่นในแคตตาล็อก จากหน้าของรถแต่ละคันผู้ใช้สามารถไปที่หน้าด้วยการจัดวางคำสั่งซื้อสำหรับการใช้รถคันนี้:

ในหน้านี้เขาได้รับเชิญให้เลือกช่วงเวลาที่เขาสามารถใช้รถได้

การเลือกช่วงเวลาดำเนินการโดยใช้องค์ประกอบ daterangepicker ซึ่งฉันติดตั้ง: เวลาเริ่มต้น - ปัดเศษไปยังชั่วโมงถัดไป เวลาสิ้นสุด (ค่าเริ่มต้น) คือเวลาเริ่มต้น + 1 ชั่วโมง ดังนั้นเวลาขั้นต่ำสำหรับการใช้รถคือ 1 ชั่วโมง เวลา Macismal ที่ฉันตั้งไว้คือ 7 วันตั้งแต่ต้น การคำนวณจำนวนเงินสำหรับการชำระเงินเกิดขึ้นตามสูตร: จำนวนวันที่คูณด้วยภาษี/วัน + จำนวนชั่วโมง * ภาษี/ชั่วโมง ทันทีที่ผู้ใช้ทำการเตรียมการที่จำเป็นทั้งหมดและยืนยันการสั่งซื้อ - เขาจะถูกเปลี่ยนเส้นทางไปยังหน้าการชำระเงิน:

ในหน้าการชำระเงินข้อมูลทั้งหมดที่จำเป็นสำหรับผู้ใช้จะได้รับเพื่อวาดคำสั่งซื้อของเขาอีกครั้ง ทันทีที่มีการชำระเงินผู้ใช้จะสามารถค้นหารถยนต์ในบัญชีส่วนตัวของพวกเขา: ผู้ใช้ที่เป็นเจ้าของรถจะเห็นว่ารถเช่าและผู้ใช้ที่เช่ารถจะเห็นข้อมูลทั้งหมดเกี่ยวกับเวลาที่จ่ายรวมถึงข้อมูลทั้งหมดเกี่ยวกับเวลาและเวลาที่เหลือของการเช่ารถคันนี้ มันมีลักษณะดังนี้:

เมื่อผู้ใช้ตัดสินใจที่จะทำตามคำสั่งของเขาล่วงหน้าก่อนกำหนด (คำสั่งซื้อไม่ได้จบลงด้วยระบบที่รับผิดชอบคำสั่งซื้อที่หมดอายุ แต่ผู้ใช้ที่ทำคำสั่งซื้อ) เขามีโอกาสตั้งค่าคะแนนรถที่เขาใช้ในครั้งที่ n:

อีกครั้งผู้ใช้มีตัวเลือก: ใส่คะแนนของรถแล้วกดปุ่ม Submit and Finish ที่สอดคล้องกันและเสร็จสิ้นการสั่งซื้อด้วยการให้คะแนนหรือข้ามขั้นตอนด้วยการจัดอันดับโดยคลิกที่ปุ่ม Finish and not submit และทำตามคำสั่งซื้อโดยไม่ต้องส่งการจัดอันดับ
การให้คะแนนนั้นสามารถเห็นได้บนหน้าเว็บพร้อมข้อมูลเกี่ยวกับรถ ขึ้นอยู่กับการประเมินที่กำหนดโดยผู้ใช้สถิติทั่วไปจะแสดงบนหน้า สามารถมองเห็นรถยนต์ที่มี 0 ดาวได้ด้านบนและหน้ามีรถที่มีการจัดอันดับจากผู้ใช้รายหนึ่งจะแสดงด้านล่าง:

ในส่วนนี้ฉันจะพยายามอธิบาย แต่วิธีการจัดทำโครงการจากภายในสิ่งที่เกิดขึ้นภายใน "กล่องดำ" สิ่งนี้จะช่วยให้เข้าใจโครงการได้ดีขึ้นสำหรับผู้ที่มีความคิดเล็กน้อยเกี่ยวกับภาษาการเขียนโปรแกรม C# และด้านการเขียนโปรแกรม
แน่นอนเพื่อทำงานกับข้อมูลใด ๆ สำหรับผู้เริ่มต้นคุณต้องตัดสินใจ แต่จะจัดเก็บได้อย่างไร? 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-файла). Таким образом, применённый мной подход не только позволит пользователю получать доступ в кратчайшие сроки, но и позволит избежать излишних нагрузок системы для загрузки данных из файлов каждый раз при обращении к сервису.
При проектировнии, мной была выявлена следующая проблема - А должен ли пользователь, добавивший автомобиль в каталог, иметь возможность взаимодействовать с тем же самым автомобилем из каталога? Конечно же нет. Такой подход позволит пользователю, добавившему автомобиль в каталог, арендовать свой же автомобиль (В чём смысл???). Для избежания этой проблемы, мной был выбран следующий подход:
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. แต่! The car does not appear in the catalog. What is the 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. อย่างไรก็ตาม! 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). แต่! 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 для получения файла изображения со сраницы.
Local Storage
Предположим, что мы - очень невнимательные пользователи, которые всё время допускают ошибки на страницах. Для того, чтобы избежать повторного ввода координат каждый раз при обновлении страницы, пной было принято решение хранить координаты GoogleMaps в локальном хранилище и чистить эти данные в случае покидания пользователем страницы добавления своего автомобиля. Так как данные, применяемые при работе с GoogleMaps являются специфическими (представление типа данных float отличаются знаком разделителя) чтоб избежать большого количества манипуляции с данными, используется локальное хранилище, которое призвано сократить число операция приведения данных из одного представления в другое.
IFormFile и скрипты
При работе с изображеним, мы не можем получать доступ к файловой системе пользователя со страницы Razor, так как это просто недопустимо в рамках работы системы безопасности, поэтому приходится использовать определённые подходы, например, как работа с IFormFile. Объекты этого типа хранят всю необходимую информацию о выбранном изображении, которое выберет пользователь, при этом не представляет никакой угрозы для файловой системы компьютера в целом. Однако использование такого подхода имеет недотаток - пользователю необходимо каждый раз выбирать изображение снова и снова, если пользователем повторно допускаются ошибки на странице добавления автомобиля.
Ниже я постарался описать интересные технические моменты, которые я предпринимал в течение проектирования и разработки проекта.
При работе с получением автомобилей из репозитория у меня было 2 идеи, как решить данную задачу: Либо при каждом обращении к контроллеру формировать новый объект с информацией о машинах и передавать его во View , либо же принимать этот объект из View , если он уже был передан однажды, при этом не делая никаких дополнительных запросов в репозиторий, и модифицировать согласно предпочтениям пользователя по количеству отображения автомобилей на странице и тд. Сначала я принял решение пойти через получение модели из View , однако столкнулся с такой проблемой, как Model Binding , которая просто так не даёт получить List переданных в качестве модели автомобилей: Либо нужно использовать Ajax , при этом заранее сериализовать модель в JSON и после чего десериализовать полученную JSON -строку в Controller-е , либо никак) Поэтому я выбрал первый путь (через создание объекта), так как в этом случае придётся манипулировать в основном со ссылками на данные, нежели чем с самими данными. (ps Также, работа через первый подход потребовала бы накладных расходов на проверку, а не добавилась ли в репозиторий новая машина, но уже другим пользователем, и если добавилась, также необходимо было бы добавить её в модельку, пришедшую из View )
Изначально, мной была заложена идея, что пользователь может как оформить заказ на определённое время, внеся предоплату, так и просросить его, за что потребуется внести дополнительные деньги за просроченное время. Однако, при дальнейшем развитии идеи, мной были выявлены следующие проблемы, касательно как программной, так и правовой идеи такого подхода:
Поэтому, мной был выбран следующий план действий: Подразумевается, что заказ начинается, как только пользователь оформляет заказ на пользование авто и оплачивает его, а заканчивается этот же заказ ровно тогда, когда время пользования станет равно оплаченному времени. После чего, автомобиль сразу становится доступным для других пользователей в каталоге, а нынешний заказ пропадает с личного кабинета пользователя, оплатившего время на его использование. Если другой пользователь оформит заказ на тот же автомобиль и при прибытии на место обнаружит, что автомобиль отсутствует на том месте, на котором он расположен на карте, он имеет право подать в суд на человека, который просрочил своё время (собственно как и заказчик). Таким образом, каждый пользователь, который оформляет заказ, берёт на себя ответственность закончить его во время.