dub4ek / shopapp Goto Github PK
View Code? Open in Web Editor NEWLicense: MIT License
License: MIT License
Проинсталировать Angular-CLI (https://github.com/angular/angular-cli)
и/или AngularConsole (https://angularconsole.com)
Создайте проект (ng new shop) и загрузите его на гитхаб без каких-либо дополнительных папок.
Код можете писать для себя в отдельных бренчах. Итоговый код добавляйте в мастер и после этого отправляйте мне.
В package.json замените содержимое команды start на ng lint && ng serve -o, чтобы при запуске проекта запускался линтинг и открывался браузер
Создайте компонент FirstComponent. Используйте его в AppComponent.
Добавьте несколько простых свойств для компонента FirstComponent и несколько свойств в виде массива. Выведите их в темплейт:
Создайте компонент ProductComponent. Добавьте кнопку Buy в шаблон. Реализуйте обработчик события клик onBuy(),
который выводит в консоль сообщение о покупке товара.
Создайте сервис ProductsService, который будет возвращать товары с помощью метода getProducts().
Модель товара ProductModel опишите интерфейсом и/или классом,
который реализует данный интерфейс. Создайте массив из нескольких товаров.
Создайте компонент ProductListComponent. Используйте в нем сервис ProductsService, получите и отобразите товары на станице
c помощью директивы *ngFor.
Создайте компонент (ng g c cart) и используйте его в AppComponent темплейте. Компонент должен отображать список купленых товаров.
Организуйте список в виде отдельного сервиса - CartService. Используйте директиву *ngIf + else для отображения корзины (CartComponent), если она не пустая.
Если корзина пустая отображать другой альтернативный блок с сообщением о пустой корзине.
Реализуйте любую дополнительную функциональность.
Создайте файл changelog.md в корне проекта и описывайте в нем то, что реализовали.
Исправьте ошибки линтинга, если таковые будут.
Загрузите ваш проект на github и отправьте мне ссылку ([email protected]). Cсылку надо отправлять после каждого задания.
Это будет сигнал для меня, что вы завершили его.
Несколько бест практисис (Возвращайтесь к этому списку в каждом домашнем задании. Если есть что добавить, предлагайте):
Angular: Services and DI
Создайте/модифицируйте сервис CartService (cart/services/cart.service.ts), который должен содержать данные корзины интернет магазина и управлять содержимым.
Сервис должен хранить информацию:
cartProducts - о добавленных товарах в корзину
totalQuantity - общее количество товаров в корзине
totalSum - общую сумму товаров в корзине
Сервис должен предоставлять следующий функционал:
addProduct() - добавить в корзину товар с количеством
removeProduct() - удалить указанный товар из корзины
increaseQuantity()/decreaseQuantity() - увеличить/уменьшить количество для указаного товара
removeAllProducts() - очистить корзину
updateCartData() - пересчитать общее количество товара и сумму после каждой операции, которая влияет на корзину
Создайте сервис LocalStorageService (core/services/local-storage.service.ts), который позволит работать
с window.localStorage (как класс, useClass).
Он должен предоставлять методы для:
Создайте сервис ConfigOptionsService (core/services/config-options.service.ts), который должен хранить объект настроек (id, login, email, ...).
Сервис должен предоставлять методы для установки и извлечения данных. Метод установки на вход принимает объект,
а метод извлечения данных возвращает объект. Предусмотреть возможность установки подмножества свойств.
Например, { id, login }
Создайте сервис ConstantsService (core/services/constant.service.ts), в виде готового литерала объекта,
например { App: "TaskManager", Ver: "1.0" }. Зарегистрируйте его, используя useValue.
Создайте сервис GeneratorService (core/services/generator.ts), который должен генерировать случайную последовательность символов длины n
из набора a-z, A-Z, 0-9. Создайте функцию GeneratorFactory(n: number), которая будет предоставлять сгенеренную строку, используя GeneratorService
Зарегистрируйте GeneratorFactory используя useFactory.
Создайте демо-компонент AboutComponent (layout/components/about.component.ts) и внедрите перечисленные выше сервисы.
Используйте декоратор @optional().
Напишите директиву shared/directives/, которая добавляет обработчик события click к хост элементу.
Клик изменяет размер шрифта элемента, рамку или что-то другое на Ваше усмотрение.
Добавьте @input() для директивы. Используйте ElementRef + Renderer2
Применить один или более встроенных пайпов в вашем приложении, например,
Изменить метод getProducts() сервиса ProductService так, чтобы он возвращал promise/observable.
Применить async пайп для отображения данных, предоставленных сервисом ProductService на странице.
Создайте OrderByPipe для сортировки массива объектов (shared/pipes/order-by.pipe.ts)
Пайп принимает два параметра:
Зарегистрируйте OrderByPipe в SharedModule.
Применить OrderByPipe в вашем приложении для сортировки товаров корзины,
реализовать возмомность сортировать массив товаров по цене, количеству, названию
c помощью выпадающего списка
Экспортируйте из SharedModule следующие модули CommonModule, FormsModule. Используйте SharedModule
ProductsModule, CartModule, а модули CommonModule, FormsModule уберите из импорта, если они там присутствуют.
Описать в changelog, где применены пайпы.
реализуйте бекэнд для вашего проекта, используя, например, json-server
создайте сервис для работы с HttpClient.
реализуйте часть методов по схеме Promise, а часть по схеме Observable.
реализуйте TimingInterceptor, который в консоль выводит длительность запросов.
Добавьте фильтр, чтобы время подсчитыалось только для конкретных запросов.
Angular 5+ Components
Продолжить модификацию Вашего предыдущего приложения
Разбить приложение на несколько модулей:
Создайте или модифицируйте ProductListComponent, который делегирует отображение списка товаров
компоненту ProductComponent. Товары компоненту предоставить с помощью метода getProducts() сервиса ProductService.
Реализовать возможность добавления товара в корзину (click), если товар есть в наличии (доступен).
Товар в корзину должен добавлять ProductListComponent.
ProductComponent реализовать как презентационный компонент с инпутами и аутпутами без зависимостей.
Если товара нет, кнопку делать недоступной.
Создайте или модифицируйте CartListComponent, который отображает список купленных товаров.
Кроме списка купленных товаров, отображать количество купленных товаров и общую сумму.
Создайте компонент СartItemComponent, который отображает одну сущность из списка выше.
Используйте этот компонент в CartListComponent.
Реализовать возможности: изменить количество товара, удалить товар из корзины.
По возможности использовать декораторы: @input(), @output().
По возможности использовать OnPush стратегию для презентационных компонентов.
По возможности использовать два или более метода-хука жизненого цикла компонента.
Использовать DOM событие (click, wheel, blur...).
Создать или модифицировать сервис (CartService) для предоставления данных компоненту CartListComponent,
подсчета количества и суммы.
Добавить в разметку AppComponent элемент <h1 #appTitle> с шаблонной переменной.
Использовать @ViewChild, получить доступ к DOM элементу темплейта,
установить заголовок для приложения из класса.
При наведении мышки на товар в корзине (CartItemComponent) стилизировать его изменением фона.
Для этого создать директиву и зарегистрировать ее в SharedModule.
Использовать @HostBinding, @HostListener декораторы.
По возможности применить директиву ngClass или ngStyle.
Реализуйте свою небольшую функциональность.
Опишите изменения в changelog проекта.
Если вы вели разработку в отдельной ветке, то добавьте все в мастер.
Замечание.
Не используйте для имен событий, которые генерят компоненты префикс on.
Используейте его для обработчиков этих событий.
Продолжите модифицировать Ваш проект по продаже чего угодно (книги, машины, продукты,...)
Реализуйте:
Список товаров (по аналогии TaskFeature Area)
/products-list
...
Карточку товара.
/product/:productID
...
Корзина (изменить количество, удалить из корзины) (по аналогии UserFeature Area)
/cart
...
Формирование заказа
/order
...
Админку (добавление/редактирование товара, количества, цены, ..., просмотр заказов).
/admin + canActivateGuard
/admin/products
/admin/product/add
/admin/product/edit:productID + resolve guard
/admin/orders
...
Админку защитить. Подгружать динамически, если у пользователя есть право работать как админ.
canActivateGuard
Любую дополнительную интересную для Вас функциональность. (опишите, что Вы реализуете в changelog).
Организуйте работу с localstorage. Например, для хранения товаров или заказов.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.