Spring Boot 2.0 - Cấu trúc dự án và thực tiễn tốt nhất (Phần 2)

Tiếp nối phần đầu tiên của loạt bài về Spring Boot v2.0, đây là phần thứ hai và là phần kết luận chúng ta sẽ đi qua cấu trúc dự án ứng dụng cùng với một số đoạn quan trọng và các thực tiễn tốt nhất cần được xem xét khi thực hiện phát triển dựa trên Spring Boot .

Chỉ là một sự từ chối nhỏ, sau khi thiết lập bộ khởi động này và xem xét kỹ lưỡng, bạn có thể cảm thấy rằng đây không thực sự là một triển khai dịch vụ vi mô bằng Spring Boot, tôi phải nói rằng tôi hoàn toàn đồng ý với bạn, không phải vậy, đây là nguyên khối được phát triển trong Spring Boot. Bài viết này nói về việc học cách viết mã với các thực tiễn tốt nhất trong Spring Boot và lý tưởng là một hệ thống đặt chỗ nên có nhiều hơn một dịch vụ hoặc cơ sở mã, tôi hứa rằng tôi sẽ sớm xuất bản một loạt bài mới về cách sử dụng Spring Boot trong việc tạo ra một ứng dụng phân tán với sự trợ giúp của ngăn xếp Netflix OSS. Cho đến khi đó, vui lòng coi đây là điểm khởi đầu và sắp xếp cấu trúc dự án và các công cụ liên quan.

Mã nguồn

Mã nguồn cho bộ khởi động này có thể được sao chép từ kho GitHub sau:

Cấu trúc ứng dụng

Spring Boot là một khung công tác giúp cuộc sống của chúng tôi rất dễ dàng vì chúng tôi không phải chọn các phiên bản phụ thuộc khác nhau dựa trên phiên bản của Spring framework, tất cả đều được Spring Boot chăm sóc.

Tôi đã cố gắng làm theo cùng một ý thức hệ trong khi tạo cấu trúc dự án, ban đầu nó có vẻ như quá sức, nhưng tôi tin rằng một khi bạn bắt đầu viết các tác phẩm của mình, cấu trúc sẽ giúp bạn rất nhiều bằng cách tiết kiệm thời gian và suy nghĩ về các câu hỏi đã được trả lời . Cấu trúc trông như sau:

Mô hình & DTO

Các mô hình khác nhau của ứng dụng được tổ chức theo gói mô hình, các DTO (đối tượng truyền dữ liệu) của chúng có mặt trong gói dto. Có nhiều ý kiến ​​khác nhau về việc chúng ta có nên sử dụng DTO hay không, tôi thuộc nhóm những người nghĩ rằng chúng ta chắc chắn nên và không sử dụng DTO làm cho lớp mô hình của bạn được kết hợp rất chặt chẽ với lớp UI và đó là điều mà không dự án doanh nghiệp nào nên có nhận được vào.

Các DTO cho phép chúng tôi chỉ chuyển dữ liệu mà chúng tôi cần chia sẻ với giao diện người dùng chứ không phải toàn bộ đối tượng mô hình mà chúng tôi có thể đã tổng hợp bằng cách sử dụng một số đối tượng phụ và tồn tại trong cơ sở dữ liệu. Việc ánh xạ các mô hình tới các DTO có thể được xử lý bằng tiện ích ModelMapper, tuy nhiên nó chỉ hữu ích khi DTO của bạn gần giống với các mô hình liên quan không phải lúc nào cũng như vậy và do đó tôi thích sử dụng các lớp ánh xạ tùy chỉnh. Bạn có thể tìm thấy một số ví dụ dưới gói Gói dto / mapper.

Ví dụ, hãy để Lôi xem cách tổ chức mô hình Trip.java của chúng tôi:

Trip.java

Như chúng ta có thể thấy mô hình có các tham chiếu đến các bộ sưu tập Dừng, Xe buýt và Đại lý. Điều này là cần thiết để duy trì mối quan hệ giữa các bộ sưu tập khác nhau này với Chuyến đi. Mặc dù điều này không giống với khái niệm khóa ngoại trong MySQL và không có tầng mặc định nào được áp dụng ở đây, nhưng nó cho chúng ta một cách để mô phỏng tương tự trong MongoDB. Đối tượng truyền dữ liệu tương ứng trông như sau:

TripDto.java

Như tôi đã mô tả trước đó, các DTO không có nghĩa là hình ảnh phản chiếu của các đối tác mô hình của họ, mà chúng phải là một sự phản ánh về những gì giao diện người dùng hoặc đáp ứng api yêu cầu. Trong trường hợp này, không có ý nghĩa gì trong việc tạo mối quan hệ sáng tác giữa Chuyến đi và Xe buýt hoặc Đại lý hoặc Dừng, thay vào đó, các khóa chính của họ thực sự có thể thực hiện thủ thuật. Điều này không chỉ tách riêng các DTO này, nó còn làm giảm kích thước tổng thể của gói phản hồi sẽ truyền qua HTTP từ máy chủ đến máy khách.

Câu hỏi tiếp theo có thể là làm thế nào để chuyển đổi mô hình POJO sang DTO này, có nhiều cách để làm điều đó nhưng sở thích của tôi là rõ ràng và DIY như sau:

Dịch vụ và DAO

Các đối tượng truy cập dữ liệu (DAO) có mặt trong gói kho lưu trữ. Chúng là tất cả các phần mở rộng của giao diện MongoRep repository giúp lớp dịch vụ duy trì và truy xuất dữ liệu từ MongoDB.

Lớp dịch vụ được xác định trong gói dịch vụ, xem xét trường hợp nghiên cứu hiện tại, nó có ý nghĩa để tạo ra hai dịch vụ cơ bản:

  1. Dịch vụ người dùng và
  2. BusReservationService

Giải thích từng phương pháp trong các dịch vụ này nằm ngoài phạm vi của bài đăng trên blog này, tuy nhiên tôi sẽ liệt kê ra các giao diện hiển thị các hoạt động được hỗ trợ bởi các dịch vụ này.

UserService.java

BusReservationService.java

Ngoài việc chú ý các quy ước đặt tên phương thức, tôi chắc chắn rằng bạn đã nhận thấy rằng lớp dịch vụ không bao giờ chấp nhận một mô hình làm đầu vào và không bao giờ trả về một trong hai. Đây là một thực tiễn tốt nhất khác mà các nhà phát triển Spring nên tuân theo trong một kiến ​​trúc phân lớp. Lớp điều khiển tương tác với lớp dịch vụ để hoàn thành công việc bất cứ khi nào nó nhận được yêu cầu từ lớp xem hoặc lớp api, khi đó nó không nên có quyền truy cập vào các đối tượng mô hình và phải luôn luôn chuyển đổi theo các DTO trung tính.

Khi dịch vụ nhận được một đối tượng DTO, nó sẽ cố gắng hiểu ý nghĩa của nó bằng cách truy vấn đối tượng mô hình tương ứng từ cơ sở dữ liệu và sau đó thực hiện các thao tác cần thiết và tạo phản hồi DTO để gửi lại cho dịch vụ gọi. Cách tiếp cận này cho phép bạn thay đổi chế độ xem và mô hình một cách độc lập mà không phải lo lắng cái này có thể phá vỡ cái kia.

Để minh họa cho cách tiếp cận đã nói ở trên, hãy để lấy một ví dụ về hoạt động dịch vụ, cập nhậtPPPileile được sử dụng để cập nhật thông tin của người dùng. Định nghĩa phương thức trông như sau:

Bảo vệ

Cài đặt bảo mật được trình bày trong gói cấu hình và các cấu hình thực tế được thực hiện theo lớp có trong gói bảo mật. Ứng dụng này có các khái niệm bảo mật khác nhau cho cổng thông tin quản trị và API REST, đối với cổng thông tin tôi đã áp dụng cơ chế phiên mùa xuân mặc định dựa trên khái niệm sessionID và cookie. Đối với API REST, tôi đã sử dụng cơ chế xác thực dựa trên mã thông báo JWT.

Bảo mật cho web và apis được cấu hình cả trong cùng một lớp MultiHttpSecurityConfig.java. Nó có hai lớp tĩnh mở rộng từ WebSecurityConfigurerAd CHƯƠNG, cho phép chúng tôi cấu hình bảo mật http cho các yêu cầu đến.

Chú thích @Order cho phép các yêu cầu được quét qua các cấu hình khác nhau theo thứ tự được chỉ định. Vì vậy, một yêu cầu API đi qua ApiWebSecurityConfigurationAdOG và được tiếp thu ở đó, tuy nhiên trước tiên, yêu cầu của Quản trị viên phải thực hiện nhưng vì nó không phù hợp với tiêu chí mà Spring Security cố gắng thực hiện theo cấu hình tiếp theo với thứ tự cao hơn ngay lập tức trong trường hợp này là FormLoginWebSecurityConfigurerAd CHƯƠNG.

Các yêu cầu API phải thông qua ApiJWTAuthenticationFilter và ApiJWTAuthorizationFilter chịu trách nhiệm tạo và xác thực mã thông báo JWT được phát hành tại thời điểm đăng nhập. Nếu bạn đang tự hỏi nên sử dụng URL nào để xác thực API (đăng nhập) thì đây là:

http: // localhost: 8080 / api / auth

Và nếu bạn đang tự hỏi làm thế nào nó được cấu hình, thì câu trả lời nằm trong lớp ApiJWTAuthenticationFilter, hàm tạo của nó có thông tin được mã hóa sau:

this .setRequiresAuthenticationRequestMatcher (AntPathRequestMatcher mới ("/ api / auth", "POST"));

Điều này báo cho AbstractAuthenticationProcessingFilter kết nối xác thựcRequestMatcher với đường dẫn / api / auth ấn cho các yêu cầu API.

Ứng dụng quản trị viên chỉ được phép cho những người dùng có vai trò là AD ADININ. Tất cả các mật khẩu được mã hóa bằng BCryptPasswordEncoder và chúng tôi không bao giờ có thể thấy giá trị thực của chúng sau khi chúng được lưu trữ trong cơ sở dữ liệu.

Bộ điều khiển

Cuối cùng, nhưng phần quan trọng nhất là lớp điều khiển. Nó liên kết mọi thứ lại với nhau ngay từ khi yêu cầu bị chặn cho đến khi phản hồi được chuẩn bị và gửi lại. Lớp trình điều khiển có mặt trong gói trình điều khiển, các thực tiễn tốt nhất cho thấy rằng chúng tôi giữ lớp này được phiên bản để hỗ trợ nhiều phiên bản của ứng dụng và thực hành tương tự được áp dụng ở đây.

Hiện tại, mã chỉ xuất hiện dưới v1 nhưng theo thời gian, tôi hy vọng sẽ có các phiên bản khác nhau có các tính năng khác nhau. Các bộ điều khiển liên quan đến cổng thông tin quản trị có mặt trong gói ui và các đối tượng lệnh biểu mẫu liên quan của nó được đặt bên dưới gói lệnh. Các bộ điều khiển API REST được đặt trong gói api và các lớp yêu cầu tương ứng được đặt trong gói yêu cầu.

Bộ điều khiển bảng quản trị hoạt động trên khái niệm Spring WebMVC. Chúng đáp ứng các yêu cầu web đến với các đối tượng SpringA ModelAndView chứa dữ liệu sẽ được hiển thị trên các khung nhìn / biểu mẫu liên quan và tên của khung nhìn sẽ được hiển thị, một ví dụ từ lớp DashboardContoder như sau:

Yêu cầu và hình thức lệnh

Một lần nữa, có nhiều ý kiến ​​khác nhau giữa cộng đồng nhà phát triển về việc sử dụng các lớp riêng biệt để ánh xạ yêu cầu đến so với sử dụng DTO so với sử dụng các mô hình trực tiếp, cá nhân tôi là một người hâm mộ tách biệt chúng càng nhiều càng tốt để thúc đẩy khớp nối lỏng lẻo giữa UI và lớp điều khiển.

Các đối tượng yêu cầu và các lệnh biểu mẫu cung cấp cho chúng ta cách áp dụng mức xác nhận bổ sung cho các yêu cầu đến trước khi chúng được chuyển đổi thành các DTO để chuyển thông tin hợp lệ sang lớp dịch vụ để duy trì và truy xuất dữ liệu. Chúng ta có thể sử dụng DTO ở đây và một số nhà phát triển thích cách tiếp cận này vì nó giảm một số lớp bổ sung, tuy nhiên tôi thường thích tách logic xác thực khỏi các đối tượng chuyển và do đó có xu hướng sử dụng các đối tượng yêu cầu / lệnh trước chúng.

Một mẫu ví dụ lớp dựa trên BusFormCommand trông như sau:

Và một ví dụ về yêu cầu được gửi qua API, BookTicketRequest như sau:

Các tài nguyên tĩnh được nhóm dưới thư mục tài nguyên. Tất cả các đối tượng UI và các khía cạnh kiểu dáng của chúng có thể được đặt ở đây.

Lombok

Một trong những phàn nàn lớn nhất đối với Java là có bao nhiêu tiếng ồn có thể được tìm thấy trong một lớp. Dự án Lombok coi đây là một vấn đề và nhằm mục đích giảm tiếng ồn của một số người phạm tội tồi tệ nhất bằng cách thay thế chúng bằng một bộ chú thích đơn giản. Bạn sẽ thấy Lombok được tuyển dụng ở mọi nơi trong bộ công cụ khởi động này, nó thực sự đã giúp giảm các dòng mã, tiết kiệm rất nhiều thời gian và công sức phát triển và làm cho mã dễ đọc hơn rất nhiều. Một số chú thích quan trọng nhất mà tôi thích sử dụng là:

@Getter / @ Setter

Không bao giờ viết công khai int getFoo () {return foo;}.

@ToString

Không cần phải bắt đầu trình gỡ lỗi để xem các trường của bạn: Chỉ cần để lombok tạo toString cho bạn!

@EqualsAndHashCode

Bình đẳng được thực hiện dễ dàng: Tạo hashCode và bằng cách triển khai từ các trường của đối tượng của bạn ..

@Dữ liệu

Bây giờ tất cả cùng nhau: Một lối tắt cho @ToString, @EqualsAndHashCode, @Getter trên tất cả các trường và @Setter trên tất cả các trường không phải là cuối cùng và

@RequiredArssConstructor!

Về bản chất, một cái gì đó dài dòng như:

Có thể được viết đơn giản là:

Bạn có thể thấy rất rõ sự khác biệt, không chỉ sau này trông gọn gàng hơn nhiều, chúng tôi đã chuyển từ 59 dòng POJO nhàm chán sang tệp java lớp 8 dòng.

Phản hồi và xử lý ngoại lệ API

Tôi đã cố gắng thử nghiệm một chút với RuntimeExceptions và đưa ra một khung công tác nhỏ để xử lý toàn bộ các trường hợp ngoại lệ của ứng dụng bằng cách sử dụng một vài lớp và tệp thuộc tính. Nếu bạn cẩn thận quan sát gói ngoại lệ, nó bao gồm hai enum:

  1. EntityType và
  2. Loại ngoại lệ

Enum EntityType chứa tất cả các tên thực thể mà chúng ta đang sử dụng trong hệ thống để duy trì và những tên có thể dẫn đến ngoại lệ thời gian chạy. Enum ExceptionType bao gồm các ngoại lệ ở mức thực thể khác nhau, chẳng hạn như ngoại lệ EntityNotFound và trùng lặp.

Lớp BRSException có hai lớp tĩnh EntityNotFoundException và CopyateEntityException, đây là hai trường hợp ngoại lệ được ném rộng rãi nhất từ ​​lớp dịch vụ. Nó cũng chứa một tập hợp các phương thức quá tải throwException, lấy EntityType, ExceptionType và các đối số để đưa ra một thông báo được định dạng có mẫu có trong tệp custom.properies.

Sử dụng lớp này, tôi có thể trao quyền cho toàn bộ lớp dịch vụ để loại bỏ nhiều trường hợp ngoại lệ một cách thống nhất mà không làm lộn xộn cơ sở mã với tất cả các loại ngoại lệ thực thể KHÔNG BỊ XÓA và DUPLICATE.

Ví dụ: trong khi đăng nhập nếu bạn cố gắng sử dụng một địa chỉ email chưa được đăng ký, một ngoại lệ được nêu ra và ném bằng cách sử dụng một dòng mã sau đây -

ném ngoại lệ (USER, ENTITY_NOT_FOUND, userDto.getEmail ());

Điều này dẫn đến việc kết hợp tên của hai yếu tố enum USER (người dùng trên mạng) và ENTITY_NOT_FOUND (không phải là.found,) và xuất hiện với một khóa user.not.found có trong các tệp custom.properations như sau:

user.not.found = Người dùng được yêu cầu có email - {0} không tồn tại.

Chỉ cần thay thế thông số {0} bằng địa chỉ email được bao gồm trong ngoại lệ bị ném, bạn có thể nhận được một thông báo có định dạng tốt để hiển thị cho người dùng hoặc được gửi lại dưới dạng phản hồi của lệnh gọi API REST. Định nghĩa của lớp BRSException như sau:

Một phần quan trọng khác của khung công tác nhỏ này là lớp CustomResponseEntityExceptionHandler có dạng như sau:

Lớp này quan tâm đến các RuntimeExceptions này trước khi gửi phản hồi cho các yêu cầu API. Lời khuyên của bộ điều khiển là kiểm tra xem việc gọi lớp dịch vụ có dẫn đến EntityNotFoundException hoặc trùng lặpEntityException hay không và gửi phản hồi thích hợp cho người gọi.

Cuối cùng, tất cả các phản hồi API đều được gửi một cách thống nhất bằng cách sử dụng lớp Phản hồi có trong gói dto / hồi đáp. Lớp này cho phép chúng ta tạo các đối tượng thống nhất dẫn đến phản hồi như được hiển thị bên dưới (lớp này là phản hồi cho api api / v1 / reserved / stop Hồi api):

{
 Tình trạng thế giới
 "khối hàng": [
   {
    Mã nguồn của Nhật Bản
    Tên của Việt Nam
    Chi tiết về thế giới
   },
   {
    Mã nguồn
    Tên của tên tuổi:
    Chi tiết về thế giới
   }
 ]
}

Và khi có một ngoại lệ (ví dụ: tìm kiếm chuyến đi giữa hai điểm dừng không được liên kết bởi bất kỳ xe buýt nào), các phản hồi sau sẽ được gửi lại (kết quả của yêu cầu ap api / v1 / reserved / tripbystops Yêu cầu GET GET):

{
  Tình trạng trên mạng
  Lỗi trên máy tính bảng: Không có chuyến đi nào giữa điểm dừng nguồn - ‘STPD và điểm dừng - STPC lỗi có sẵn tại thời điểm này.
}
{
  Tình trạng trên mạng
  Lỗi
  {
    Dấu thời gian của người Nhật Bản: Tiếng chuông 2019 Từ 03 phút13T07: 47: 10.990 + 0000,
    Tin nhắn trên mạng: Có thể yêu cầu dừng với mã - STPF không tồn tại.
  }
}

Như bạn có thể quan sát, cả hai loại phản hồi, một loại có HTTP-200 và loại khác có HTTP-404, tải trọng phản hồi không thay đổi cấu trúc của nó và khung gọi có thể chấp nhận một cách mù quáng khi biết rằng có một trạng thái và lỗi hoặc trường tải trọng trong đối tượng JSON.

Tài liệu API

Điều quan trọng là phải ghi lại công việc của bạn (cũng như sự phát triển của nó) và đảm bảo API Spring Boot của bạn có sẵn theo cách dễ đọc cho các nhóm frontend (nội bộ) hoặc người tiêu dùng bên ngoài. Công cụ cho tài liệu API được sử dụng trong bộ khởi động này là Swagger2, bạn có thể mở cùng một trình duyệt trong url sau -

http: // localhost: 8080 / swagger-ui.html

Nó sẽ cung cấp cho bạn một giao diện người dùng có cấu trúc tốt, có hai thông số kỹ thuật:

1. Người dùng
2. BRS

Bạn có thể sử dụng thông số Người dùng để thực thi api đăng nhập để tạo mã thông báo Bearer. Mã thông báo sau đó nên được áp dụng trong cửa sổ bật lên của Author Authorize, mặc định sẽ áp dụng nó cho tất cả các apis được bảo mật (nhận và đăng cả hai). Xin lưu ý rằng bạn nên thêm từ từ Bear Bearer theo sau bởi một khoảng trắng, trước mã thông báo trước khi áp dụng nó trong hộp thoại ủy quyền.

Cấu hình của Swagger đang được lớp BrsConfiguration quan tâm. Tôi đã xác định hai thông số kỹ thuật ở đó với sự trợ giúp của các phương thức swaggerBRSApi và và swaggerUserApi. Vì phần đăng nhập theo mặc định được Spring Security chăm sóc, chúng tôi không thể phơi bày apis của nó một cách ngầm định như phần còn lại của apis được xác định trong hệ thống và vì lý do tương tự tôi đã định nghĩa một bộ điều khiển trong gói cấu hình có tên Ngay lập tức

Mục đích của nó là để tạo điều kiện cho việc tạo tài liệu vênh vang cho apis đăng nhập và đăng xuất, nó sẽ không bao giờ tồn tại trong vòng đời ứng dụng vì api / api / auth đã được xử lý bởi các bộ lọc bảo mật được xác định trong cơ sở mã. Dưới đây là một số ảnh chụp màn hình mẫu để giúp bạn hình dung mọi thứ tốt hơn một chút:

Giao diện người dùng vênh vang/ api / auth đăng nhập, lịch sự FakeControllHộp thoại ủy quyền để đăng ký mã thông báo BearerAPI BRSAPI BRS được liệt kê ra

Để sử dụng Giao diện người dùng Swagger và thực thi các API được bảo mật, trước tiên bạn cần vận hành các ứng dụng / api / auth, từ thông số người dùng và tạo mã thông báo Bearer. Khi mã thông báo được phát hành, bạn có thể đăng ký nó trong cửa sổ bật lên Ủy quyền và sau đó chuyển sang thông số BRS để thực thi các API được bảo mật. Nếu bạn không đăng ký mã thông báo thì bạn sẽ tiếp tục nhận được lỗi HTTP 401.

Bạn có thể gặp sự cố trong khi dùng thử Swagger-Ui cho các yêu cầu HTTP-GET có các tham số đó, đừng lo lắng, đó không phải là lỗi của mã, đó là quyết định của Swagger khi ngừng hỗ trợ thông số cơ thể cho các yêu cầu GET và DELETE . Như một giải pháp thay thế, bạn có thể sao chép yêu cầu cuộn tròn từ vênh vang và thực hiện nó trong cửa sổ đầu cuối và nó sẽ hoạt động tốt hoặc bạn có thể chọn sử dụng Postman hoặc một công cụ tương tự khi chúng không thực hiện một hạn chế chặt chẽ như vậy. Theo quan điểm của tôi, miễn là các thông số kỹ thuật API mở không giới hạn các thông số cơ thể trong các yêu cầu GET, các công cụ như Swagger cũng không nên, tuy nhiên đó là một cuộc gọi mà họ cần thực hiện chứ không phải chúng tôi là nhà phát triển.

Kiến trúc UI

Giao diện người dùng cho cổng quản trị được thiết kế bằng thiết kế vật liệu với sự trợ giúp của Bootstrap và khái niệm ứng dụng web đáp ứng. Giao diện người dùng là phía máy chủ được hiển thị bằng các mẫu Thymeleaf (công cụ tạo khuôn mẫu ưa thích trong Spring).

Cách làm việc tiêu chuẩn với Thymeleaf là sử dụng bao gồm. Điều này khá thường xuyên dẫn đến mã lặp đi lặp lại, đặc biệt, khi một trang web có nhiều trang và mỗi trang có một số thành phần có thể sử dụng lại (ví dụ: tiêu đề, điều hướng, thanh bên và chân trang). Nó được lặp đi lặp lại vì mỗi trang nội dung phải bao gồm các đoạn giống nhau tại cùng một vị trí. Điều này cũng có tác động tiêu cực khi bố cục trang thay đổi, ví dụ: khi đặt thanh bên từ bên trái sang bên phải.

Mẫu trang trí được sử dụng bởi phương ngữ Thymeleaf Layout giải quyết những vấn đề này. Trong ngữ cảnh của các công cụ mẫu, mẫu trang trí không hoạt động với bao gồm trên các trang nội dung nữa, nhưng nó đề cập đến một tệp mẫu phổ biến. Mỗi trang về cơ bản chỉ cung cấp nội dung chính và bằng cách mô tả mẫu cơ bản nào để sử dụng công cụ mẫu có thể xây dựng trang cuối cùng. Nội dung đang được trang trí với tệp mẫu. Cách tiếp cận này có lợi thế so với cách tiêu chuẩn bao gồm các đoạn:

  • Bản thân trang chỉ phải cung cấp nội dung.
  • Vì một tệp mẫu đang được sử dụng để xây dựng trang cuối cùng, các thay đổi toàn cầu có thể được áp dụng dễ dàng.
  • Mã trở nên ngắn hơn và sạch hơn.
  • Vì mỗi trang nội dung tham chiếu tệp mẫu nào sẽ sử dụng, nên dễ dàng sử dụng các mẫu khác nhau cho các khu vực khác nhau của ứng dụng (ví dụ: khu vực công cộng và khu vực quản trị).

Bố cục cho cổng thông tin quản trị được thiết kế như sau:

Blog Like Bố cục

Các khu vực riêng lẻ trong bố trí này phục vụ mục đích sau:

  • Tiêu đề: đoạn này được sử dụng cho nhập khẩu tĩnh (CSS và JavaScript), thẻ tiêu đề và thẻ meta.
  • Điều hướng: thanh điều hướng với hồ sơ người dùng ở trên cùng bên phải.
  • Nội dung: trình giữ chỗ nội dung sẽ được thay thế bởi trang được yêu cầu.
  • Thanh bên: một thanh bên để biết thêm thông tin.
  • Footer: khu vực chân trang cung cấp thông tin bản quyền.

Các thành phần này có thể được đặt trong thư mục tài nguyên / mẫu ở gốc cũng như dưới các đoạn thư mục con và bố cục. Khu vực nội dung trong bố cục này sẽ lưu trữ các trang sau:

  • bảng điều khiển
  • Đại lý
  • Xe buýt
  • Chuyến đi
  • Hồ sơ

Ngoài ra, một trang lỗi cho bất kỳ ngoại lệ chưa được xử lý nào được thiết kế với tên Lỗi error.html. Các trang đăng nhập và đăng ký được thiết kế riêng biệt với cổng thông tin mà người dùng đã đăng nhập có thể truy cập.

Chạy máy chủ cục bộ

Để có thể chạy ứng dụng Spring Boot này, trước tiên bạn cần xây dựng nó. Để xây dựng và đóng gói ứng dụng Spring Boot thành một tệp Jar thực thi với Maven, hãy sử dụng lệnh dưới đây. Bạn sẽ cần chạy nó từ thư mục dự án chứa tệp pom.xml.

gói maven

hoặc bạn cũng có thể sử dụng

mvn cài đặt sạch

Để chạy ứng dụng từ cửa sổ terminal, bạn có thể sử dụng lệnh java -jar. Điều này được cung cấp ứng dụng Spring Boot của bạn đã được đóng gói dưới dạng tệp jar thực thi.

mục tiêu java -jar / springboot-starterkit-0.0.1-SNAPSHOT.jar

Bạn cũng có thể sử dụng plugin Maven để chạy ứng dụng. Sử dụng ví dụ dưới đây để chạy ứng dụng Spring Boot của bạn với plugin Maven:

mvn spring-boot: chạy

Bạn có thể làm theo bất kỳ / tất cả các lệnh trên hoặc chỉ cần sử dụng cấu hình chạy được cung cấp bởi IDE yêu thích của bạn và chạy / gỡ lỗi ứng dụng từ đó cho mục đích phát triển. Khi máy chủ được thiết lập, bạn sẽ có thể truy cập vào giao diện quản trị viên tại URL sau:

http: // localhost: 8080

Và các API REST có thể được truy cập qua đường dẫn cơ sở sau:

http: // localhost: 8080 / api /

Một số điểm cuối api quan trọng như sau:

  • http: // localhost: 8080 / api / v1 / người dùng / đăng ký (HTTP: POST)
  • http: // localhost: 8080 / api / auth (HTTP: POST)
  • http: // localhost: 8080 / api / v1 / đặt chỗ / dừng (HTTP: GET)
  • http: // localhost: 8080 / api / v1 / reserved / tripbystops (HTTP: GET)
  • http: // localhost: 8080 / api / v1 / reserved / tripchedules (HTTP: GET)
  • http: // localhost: 8080 / api / v1 / reserved / bookticket (HTTP: POST)

Docker Container

Vui lòng sử dụng lệnh sau để xây dựng hình ảnh container:

docker build -t spring / starterkit.

Và lệnh sau để chạy container:

docker chạy -p 8080: 8080 spring / starterkit

Xin lưu ý khi bạn xây dựng hình ảnh chứa và nếu mongodb đang chạy cục bộ trên hệ thống của bạn, bạn sẽ cần cung cấp địa chỉ IP của hệ thống (hoặc IP của cơ sở dữ liệu được lưu trữ trên đám mây) trong tệp application.properations (hoặc env vars) để có thể kết nối đến cơ sở dữ liệu từ bên trong container.

Phần kết luận

Như bạn có thể thấy, bộ khởi động được thiết kế để giúp bạn tiết kiệm hàng giờ thời gian mã hóa bằng cách cung cấp cho bạn một giao diện và kiến ​​trúc được mã hóa hợp lý, hiệu quả và sạch sẽ để phát triển dựa trên chính bạn. Hãy dùng thử và chắc chắn cho tôi biết phản hồi của bạn.

Tôi hy vọng loạt bài viết này đã giúp bạn cải thiện bộ kỹ năng Spring Boot và nó đã cho bạn một nền tảng vững chắc để bắt đầu viết ứng dụng Spring Boot tiếp theo của bạn.

Chúc mọi người mã hóa!

Nếu nó thú vị hoặc hữu ích với bạn, vui lòng nhấn nút vỗ tay và giúp người khác tìm thấy câu chuyện này.

Bạn có biết bạn có thể cho tới 50 lần vỗ tay không?