Рубрики
Без рубрики

Давайте разработаем Приложение для Электронной Коммерции С Нуля С использованием Java

Мы собираемся создать приложение для электронной коммерции с использованием Java, серверной части Spring, создать веб-интерфейс в Vue.js , а… Помеченный javascript, java.

Мы собираемся создать приложение для электронной коммерции с использованием Java, серверной части Spring, создать веб-интерфейс в Vue.js , и мобильный пользовательский интерфейс с использованием Android. Оставайтесь с нами!

Каждой платформе электронной коммерции нужны пользователи, поэтому в первом уроке мы будем создавать и отображать профили пользователей. Сначала мы собираемся создать внутренние API-интерфейсы с использованием Java и Spring boot, затем мы собираемся создать пользовательский интерфейс в Vue.js и мобильное приложение для Android.

Живая Демонстрация

Вы можете протестировать API по следующей ссылке swagger. Вы можете создать и перечислить всех пользователей.

Ссылка

О Весеннем Фреймворке

Spring Framework – это основная платформа разработки приложений Java/J2EE с открытым исходным кодом для более продуктивной разработки приложений. Это самый популярный Java-фреймворк с долей использования 30%. Функции Spring Framework обеспечивают эффективную разработку от простых веб-приложений до сложных корпоративных приложений.

Основными концепциями, от которых зависит фреймворк Spring, являются:

  1. Внедрение зависимостей (DI)
  2. Аспектно-ориентированное программирование (AOP)
  3. Java Persistence API (JPA) ## Предварительные требования
  4. Знания в области базовой Java
  5. Навыки кодирования
  6. Знания в области сервлетов и JSP
  7. Набор для разработки Java (JDK)
  8. IntelliJ IDEA Ultimate — с открытым исходным кодом (рекомендуется)
  9. База данных MySQL — Вы можете получить ее здесь!
  10. Хороший браузер (рекомендуется Chrome)

Убедитесь, что у вас установлено все перечисленное необходимое программное обеспечение и вы обладаете базовыми знаниями о цикле запроса-ответа, а также о веб-контейнерах. Что еще? Давайте перейдем к учебнику!

Настройка проекта

  • Приложение набора инструментов Open Spring
  • Нажмите Файл -> Создать -> Проект ->Проект Spring Starter
  • Укажите необходимые данные в открывшемся диалоговом окне ## Зависимости Зависимости, которые я добавляю в этот проект, приведены ниже. Вы можете либо добавить их во время создания самого проекта, либо позже выполнить поиск по ним в репозитории Maven и добавить теги требуемой версии в pom.xml файл.
  • Полотно стартера пружинного ботинка
  • Кот и Джаспер
  • Данные стартера пружинной загрузки JPA
  • Соединитель Mysql java
  • Испытание стартера пружинного ботинка
  • Развязность 2
  • Пользовательский интерфейс Swagger ## Иерархия проектов Иерархия – это важная вещь, на которую следует обратить внимание в структуре дизайна приложения Spring boot. Иерархия моего проекта выглядит следующим образом.

Обзор нашего серверного приложения

В этом приложении Spring приведены важные пакеты, которые вы должны знать перед началом работы.

Это весенняя архитектура. Внешний мир вызывает API-интерфейсы REST, которые взаимодействуют со Службой. Служба вызывает хранилище. Хранилище взаимодействует с базой данных. Мы следуем этому шаблону, чтобы сделать кодовую базу ремонтопригодной, вместо того, чтобы использовать спагетти-код, который в долгосрочной перспективе может стать кошмаром.

Давайте сначала рассмотрим контроллеры Rest

Контроллер

package com.webtutsplus.ecommerce.controller;

import java.util.List;

import javax.validation.Valid;

import com.webtutsplus.ecommerce.model.UserProfile;
import com.webtutsplus.ecommerce.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.webtutsplus.ecommerce.common.ApiResponse;

@RestController
@RequestMapping("/user")
public class    UserController {

    @Autowired private UserService userService;

    @GetMapping("/")
    public ResponseEntity> getUsers() {
        List dtos = userService.listProfiles();
        return new ResponseEntity>(dtos, HttpStatus.OK);
    }

    @PostMapping("/add")
    public ResponseEntity addSurvey(@RequestBody @Valid UserProfile profile) {
        userService.addProfile(profile);
        return new ResponseEntity<>(new ApiResponse(true, "Profile has been created."), HttpStatus.CREATED);
    }   
}

Класс пользовательского контроллера предоставляет два HTTP-метода GET и Post. Функция Getmapping возвращает полный список пользователей, а функция Post Mapping сохраняет новый профиль пользователя в базе данных.

Как мы видим, Пользовательские контроллеры имеют ссылку на Службу пользователей.

Услуга

Как мы знаем, платформа spring boot соответствует модели POJO, и каждый контроллер имеет свой собственный интерфейс службы, который предоставляет методы/операции, выполняемые в приложении.

В классе обслуживания есть только два метода перечисления профилей и добавления профилей, которые предоставляют информацию. В будущем мы можем расширить или добавить дополнительные функциональные возможности в соответствии с требованиями.

package com.webtutsplus.ecommerce.service;

import java.util.List;

import com.webtutsplus.ecommerce.model.UserProfile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.webtutsplus.ecommerce.repository.UserProfileRepository;

@Service
public class UserService {

    @Autowired private UserProfileRepository userRepo;


    public void addProfile(UserProfile userProfile) {
        userRepo.save(userProfile);
    }

    public List listProfiles(){
        return userRepo.findAll();      
    }

}

Сервис вызывает UserProfileRepository, который взаимодействует с базой данных в виде моделей. Давайте взглянем на модель пользователя.

Модель

Класс model является зеркалом таблицы user_profile в базе данных в виде объекта java. Доступ ко всем атрибутам возможен через этот класс. Вы также можете обновить значения атрибутов с помощью класса model, который также вносит изменения в таблицу базы данных.

package com.webtutsplus.ecommerce.model;


import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;


@Entity
@Table(name="user_profile")
public class UserProfile {

    private long id;
    private String username;
    private String email;
    private String firstName;
    private String lastName;

    public UserProfile() {}

    public UserProfile(long id, String username, String email, String firstName, String lastName) {
        super();
        this.id = id;
        this.username = username;
        this.email = email;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

}

Результат

После этого сохраните файл и запустите приложение. Теперь ваш кот прослушивает порт 8182.

[Ссылка] 138.68.64.95:8080/api/swagger-пользовательский интерфейс.html#/пользовательский контроллер

Что такое развязность

Swagger – это язык описания интерфейса для описания API-интерфейсов RESTful, выраженных с использованием JSON. Swagger используется вместе с набором программных средств с открытым исходным кодом для проектирования, создания, документирования и использования веб-сервисов RESTful. Swagger включает в себя автоматизированную документацию, генерацию кода и генерацию тестовых примеров.

Вы можете получить доступ к документации по приложению, введя следующий URL-адрес в своем браузере.

Вы можете отредактировать информацию о своем API в документации.swaggerConfig.java класс и метод getApiInfo().

Swagger очень полезен на стороне разработчика, потому что он предоставляет очень удобную для пользователя информацию об API, а также предоставляет способ тестирования API.

    private ApiInfo getApiInfo() {
        Contact contact = new Contact("webtutsplus", "http://webtutsplus.com", "contact.webtutsplus@gmail.com");
        return new ApiInfoBuilder()
                .title("User Profile API")
                .description("Documentation User profile api")
                .version("1.0.0")
                .license("Apache 2.0")
                .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
                .contact(contact)
                .build();
}

Теперь мы рассмотрим некоторые дополнительные занятия, которые тоже играют важную роль.

общий

В этом пакете есть два класса

· В этом пакете есть два класса

package com.webtutsplus.ecommerce.common;

import java.time.LocalDateTime;

public class ApiResponse {
    private final boolean success;
    private final String message;

    public ApiResponse(boolean success, String message) {
        this.success = success;
        this.message = message;
    }

    public boolean isSuccess() {
        return success;
    }

    public String getMessage() {
        return message;
    }

    public String getTimestamp() {
        return LocalDateTime.now().toString();
    }
}

Этот класс предоставляет статус ответа API. У него есть три метода: Успех (), получение сообщения (), получение метки времени (). Метод getTimestamp () возвращает текущую дату и время в строковом формате. Отметка времени получения

package com.webtutsplus.ecommerce.common;

import java.util.List;

public class PagedList {
    private int totalPages;
    private long totalElements;
    private boolean hasNext;
    private boolean hasPrevious;

    private List data;

    public int getTotalPages() {
        return totalPages;
    }
    public void setTotalPages(int totalPages) {
        this.totalPages = totalPages;
    }
    public long getTotalElements() {
        return totalElements;
    }
    public void setTotalElements(long totalElements) {
        this.totalElements = totalElements;
    }
    public boolean isHasNext() {
        return hasNext;
    }
    public void setHasNext(boolean hasNext) {
        this.hasNext = hasNext;
    }
    public boolean isHasPrevious() {
        return hasPrevious;
    }
    public void setHasPrevious(boolean hasPrevious) {
        this.hasPrevious = hasPrevious;
    }

    public List getData() {
        return data;
    }
    public void setData(List data) {
        this.data = data;
    }
}

Этот класс содержит всю информацию о страницах в структуре данных списка и предоставляет общее количество страниц, общее количество элементов, имеет Следующий, имеет предыдущие атрибуты, получатель и установщик.

Конфигурация

В этих пакетах есть два подпакета с именами документация и безопасность.

· Документация

В этом пакете содержится информация о продукте и API.

Метод API продукта предоставляет информацию о продукте и получает метод Api Info, возвращающий информацию об Api, такую как контакт, название, версия, лицензия.

package com.webtutsplus.ecommerce.config.documentation;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket productApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(getApiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.webtutsplus.ecommerce"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo getApiInfo() {
        Contact contact = new Contact("Umar Draz", "-", "umar.umar82@gmail.com");
        return new ApiInfoBuilder()
                .title("User Profile API")
                .description("Documentation User profile api")
                .version("1.0.0")
                .license("Apache 2.0")
                .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
                .contact(contact)
                .build();
    }
}

Безопасность

Этот класс очень важен для приложений, поскольку он обеспечивает базовую безопасность для всего приложения по протоколу HTTP или HTTPS. Он также реализует конфигурацию для пользователей, определяющую, какие пользователи имеют доступ к каким страницам или репозиториям.

package com.webtutsplus.ecommerce.config.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception 
    {
        http
         .csrf().disable()
         .authorizeRequests().anyRequest().authenticated()
         .and()
         .httpBasic();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) 
            throws Exception 
    {
        auth.inMemoryAuthentication()
            .withUser("admin")
            .password("admin")
            .roles("USER");
    }

    @Override
    public void configure(WebSecurity registry) throws Exception {
        registry.ignoring()
        .antMatchers("/docs/**").antMatchers("/actuator/**").antMatchers("/v2/api-docs", "/configuration/ui",
                "/swagger-resources/**", "/configuration/security", "/swagger-ui.html", "/webjars/**");
    }
}

Исключение

Этот класс используется в случае исключения на любом этапе приложения. Он имеет два класса Обработчик исключений и исключение проверки, которое возникает при возникновении ошибки проверки в приложении во время выполнения.

Он имеет два класса Обработчик исключений и исключение проверки, которое возникает при возникновении ошибки проверки в приложении во время выполнения.

package com.webtutsplus.ecommerce.exception;

import com.webtutsplus.ecommerce.common.ApiResponse;
import org.springframework.core.NestedExceptionUtils;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;


@ControllerAdvice
public class ExceptionHandlerAdvice {

    @ExceptionHandler(DataIntegrityViolationException.class)
    public ResponseEntity conflict(DataIntegrityViolationException ex){
        String message = getMostSpecificMessage(ex);

        return new ResponseEntity(new ApiResponse(false, message), HttpStatus.CONFLICT);
    }

//  @ExceptionHandler(AccessDeniedException.class)
//  public ResponseEntity accessDenied(AccessDeniedException ex){
//      String message = ex.getMessage();
//      
//      return new ResponseEntity(new ApiResponse(false, message), HttpStatus.FORBIDDEN);
//  }

    @ExceptionHandler(ValidationException.class)
    public ResponseEntity validationException(ValidationException ex){
        String message = ex.getMessage();

        return new ResponseEntity(new ApiResponse(false, message), HttpStatus.UNPROCESSABLE_ENTITY);
    }

    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
    public ResponseEntity methodArgumentTypeMismatchException(MethodArgumentTypeMismatchException ex){
        ex.printStackTrace();

        String message = ex.getMessage();
        return new ResponseEntity(new ApiResponse(false, message), HttpStatus.INTERNAL_SERVER_ERROR);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity unhandledExceptions(Exception ex){
        String message = NestedExceptionUtils.getMostSpecificCause(ex).getMessage();

        ex.printStackTrace();

        return new ResponseEntity(new ApiResponse(false, message), HttpStatus.INTERNAL_SERVER_ERROR);
    }

    private String getMostSpecificMessage(DataIntegrityViolationException ex) {
        String message = NestedExceptionUtils.getMostSpecificCause(ex).getMessage();

        if(message.contains("Detail:")) {
            message = message.substring(message.indexOf("Detail:")+"Detail:".length());
        }

        return message;
    }
}

Он имеет два класса Обработчик исключений и исключение проверки, которое возникает при возникновении ошибки проверки в приложении во время выполнения.

package com.webtutsplus.ecommerce.exception;

public class ValidationException extends RuntimeException{
    private static final long serialVersionUID = 6064663768170825752L;

    public ValidationException(String message) {
        super(message);
    }

    public ValidationException(String message, Throwable cause) {
        super(message, cause);
    }
}

Надеюсь, вы отлично провели время с нами! Следуйте за нами для таких замечательных и потрясающих уроков!

Следуйте следующему уроку, в котором мы создадим пользовательский интерфейс в обоих Vue.js и Андроид.

Оригинал: “https://dev.to/nilmadhab/let-s-develop-an-e-commerce-application-from-scratch-using-java-g1d”