FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

lab4<->lab6 · Akkeup/JavaScript@f01cd58 · GitHub

Commit f01cd58

Browse files
authored andcommitted
lab4<->lab6
1 parent de7241a commit f01cd58

26 files changed

Lines changed: 374 additions & 60 deletions

‎README.md‎

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,17 @@ DNS, браузерный рендеринг, клиент-серверная м
3030

3131
* [Презентация](/lectures/lec4.pdf)
3232

33-
### Лекция 5. Асинхронный JavaScript
33+
### Лекция 5. Бэкенд на JavaScript
3434

35-
Event Loop, промисы, async/await, fetch
35+
Node.js. Бэкенд на JavaScript
3636

37-
* [Презентация](/lectures/lec5.pdf)
37+
* [Презентация](/lectures/lec6.pdf)
3838

39-
### Лекция 6. Бэкенд на JavaScript
39+
### Лекция 6. Асинхронный JavaScript
4040

41-
Node.js. Бэкенд на JavaScript
41+
Event Loop, промисы, async/await, fetch
4242

43-
* [Презентация](/lectures/lec6.pdf)
43+
* [Презентация](/lectures/lec5.pdf)
4444

4545
### Лекция 7. Web реального времени
4646

@@ -86,27 +86,30 @@ Service Workers, PWA, Virtual DOM, Deploy, Производительность
8686

8787
### Модуль 2
8888

89-
#### Лабораторная работа 4
89+
#### Лабораторная работа 6
9090

91-
Продолжение Лабораторной работы 3. Подключение к стороннему API (VK), Cors. Запросы XHR.
91+
Реализация собственного API на Node.js, подключение к интерфейсу.
9292

93-
* [Методические указания](/tutorials/lab4/README.md)
93+
* [Методические указания](/tutorials/backend/README.md)
9494

9595
#### Лабораторная работа 5
9696

97-
Продолжение Лабораторной работы 4. Замена коллбеков на промисы и/или await. Запросы fetch.
97+
Продолжение Лабораторной работы 3. Подключение к созданному API бэкенду, Cors. Запросы XHR.
9898

99-
* [Методические указания](/tutorials/lab5/README.md)
99+
* [Методические указания](/tutorials/ajax/README.md)
100100

101101
#### Лабораторная работа 6
102102

103-
Реализация собственного API на Node.js, подключение к интерфейсу.
103+
Продолжение Лабораторной работы 5. Замена коллбеков на промисы и/или await. Запросы fetch.
104104

105-
* [Методические указания](/tutorials/lab6/README.md)
105+
* [Методические указания](/tutorials/fetch/README.md)
106106

107107
#### Дополнительное задание
108108

109-
Продолжение Лабораторной работы 6 - добавление уведомлений/обновлений через Polling
109+
- Продолжение Лабораторной работы 6 - добавление уведомлений/обновлений через Polling
110+
- [Подключение](/tutorials/vk/README.md) к API VK
111+
112+
110113

111114
#### Рубежный контроль 2
112115

‎lectures/lec5.pdf‎

-1.62 MB
Binary file not shown.

‎lectures/lec5.pptx‎

-7.17 MB
Binary file not shown.

‎lectures/lec6.pdf‎

1.62 MB
Binary file not shown.

‎lectures/lec6.pptx‎

7.17 MB
Binary file not shown.

‎tutorials/ajax/README.md‎

Lines changed: 325 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,325 @@
1+
# Простое веб-приложение. Работа с Api
2+
3+
**Цель** данной лабораторной работы - взаимодействие с внешним Api через XMLHttpRequest. В ходе выполнения работы, вам предстоит ознакомиться с кодом реализации простого взаимодействия с внешним Api, получение данных и вывод их в интерфейс пользователя, и затем выполнить задания по варианту.
4+
5+
## План
6+
7+
1. Инструменты для работы
8+
2. Что такое XMLHttpRequest
9+
3. Работа с Api
10+
4. Api главной страницы
11+
5. Api страницы пользователя
12+
13+
## 1. Инструменты для работы
14+
15+
Для работы будем использовать инструменты из предыдущих лабораторной работы: [VS Code][vs-code] + [Live Server][vs-code-live-server].
16+
17+
**Перед началом работы необходимо установить на свой компьютер [Node.js][node-install].**
18+
19+
## 2. Что такое XMLHttpRequest
20+
21+
[XMLHttpRequest][xml] (или XHR) позволяет делать HTTP-запросы к серверу из браузера без перезагрузки страницы.
22+
Несмотря на наличие слова "XML" в названии, с помощью XHR можно работать с любыми типами данных, а не только с XML.
23+
С помощью XML можно загружать/скачивать файл, отслеживать прогрусс и многое другое.
24+
25+
## 3. Работа с Api
26+
27+
Перед началом работы с Api разберемся с тем, как мы это будем делать в нашем проекте.
28+
Первое с чего стоит начать - создадим еще один слой, где будем держать все методы работы с Api.
29+
30+
Сейчас структура проекта выглядит так
31+
32+
```bash
33+
├── pages
34+
├── components
35+
├── index.html
36+
├── main.js
37+
```
38+
39+
Добавим еще один слой `modules`
40+
41+
```bash
42+
├── pages
43+
├── components
44+
├── modules
45+
├── index.html
46+
├── main.js
47+
```
48+
49+
### Работа с константами
50+
51+
При работе нам понадобяться константы, чтобы не разрбрасывать их по всему проекты создадим отдельный файл под константы.
52+
53+
* Создаем файл `modules/consts.js`
54+
55+
```js
56+
export const groupId = GROUP_ID
57+
export const accessToken = 'ACCESS_TOKEN'
58+
export const version = '5.131'
59+
```
60+
61+
Описание полей:
62+
63+
* groupId - id группы, которую мы создали
64+
* accessToken - секретный ключ нашей группы
65+
* version - версия VK Api
66+
67+
Теперь, если нам нужно где-то получить константы, то мы просто импортируем файл и получаем наши константы.
68+
69+
### Работа с урлами
70+
71+
Для работы нам понадобятся урлы вк, чтобы их не объявлять сразу в коде, то сделаем отдельный файл для этого.
72+
73+
* Создаем файл `modules/urls.js`
74+
75+
```js
76+
import {accessToken, version} from "./consts.js";
77+
78+
class Urls {
79+
constructor() {
80+
this.url = 'https://api.vk.com/method'
81+
this.commonInfo = `access_token=${accessToken}&v=${version}`
82+
}
83+
84+
getUserInfo(userId) {
85+
return `${this.url}/users.get?user_ids=${userId}&fields=photo_400_orig&${this.commonInfo}`
86+
}
87+
88+
getGroupMembers(groupId) {
89+
return `${this.url}/groups.getMembers?group_id=${groupId}&fields=photo_400_orig&${this.commonInfo}`
90+
}
91+
}
92+
93+
export const urls = new Urls()
94+
```
95+
96+
Теперь, если нам нужно получить урл, то просто импортируем файл и получаем нужный нам урл.
97+
98+
```js
99+
import {urls} from "./urls.js";
100+
101+
urls.getGroupMembers()
102+
```
103+
104+
### Работа с Api
105+
106+
Мы будем работать с VK Api через XHR. Для удобства создадим класс, в котом опишем методы для работы с Api.
107+
108+
* Создаем файл `modules/ajax.js`
109+
110+
```js
111+
class Ajax {
112+
post(url, callback) {
113+
let xhr = new XMLHttpRequest()
114+
xhr.open('POST', getUrl(url))
115+
xhr.send()
116+
117+
xhr.onreadystatechange = () => {
118+
if (xhr.readyState === 4) {
119+
const data = JSON.parse(xhr.response)
120+
callback(data)
121+
}
122+
}
123+
}
124+
}
125+
126+
export const ajax = new Ajax();
127+
```
128+
129+
У нас есть готовый класс, через который мы можем выполнить POST запрос. Тут уже происходит вся нужная обработка и формирование JSON объекта из данных и вызов колбека. Если нужно будет, то в будущем мы можем сюда добавить GET, PUT, DELETE запросы.
130+
131+
```js
132+
import {ajax} from "./ajax.js";
133+
134+
ajax.post()
135+
```
136+
137+
## 4. Api главной страницы
138+
139+
Переведем нашу главную страницу на работу с Api.
140+
Сделаем так, чтобы на главной странице выводились пользователи нашей группы.
141+
142+
Первое с чего нужно начать - модифицировать получение данных.
143+
Сейчас мы рисуем карточки на основе объекта в коде.
144+
Нам нужно поменять на получение данных из Api и отрисовку карточек.
145+
146+
* Изменяем функцию получения данных
147+
148+
```js
149+
import {ajax} from "../../modules/ajax.js";
150+
import {urls} from "../../modules/urls.js";
151+
import {groupId} from "../../modules/consts.js";
152+
153+
154+
getData() {
155+
ajax.post(urls.getGroupMembers(groupId), (data) => {
156+
this.renderData(data.response.items)
157+
})
158+
}
159+
```
160+
161+
* Добавляем функцию отрисовки карточек по данным
162+
163+
```js
164+
renderData(items) {
165+
items.forEach((item) => {
166+
const productCard = new ProductCardComponent(this.pageRoot)
167+
productCard.render(item, this.clickCard.bind(this))
168+
})
169+
}
170+
```
171+
172+
* Модифицируем функцию отрисовки страницы
173+
174+
```js
175+
render() {
176+
this.parent.innerHTML = ''
177+
const html = this.getHTML()
178+
this.parent.insertAdjacentHTML('beforeend', html)
179+
180+
this.getData()
181+
}
182+
```
183+
184+
Так же нужно поменять структуру компонента `ProductCardComponent` под новое Api.
185+
У нас теперь передаются новые поля, которые нужно учитывать.
186+
В нашем Api нет полей `src`, `title` и `text`, необходимо заменить их на те поля, что есть в нашем Api.
187+
188+
```js
189+
getHTML(data) {
190+
return (
191+
`
192+
<div class="card" style="width: 300px;">
193+
<img class="card-img-top" src="${data.photo_400_orig}" alt="картинка">
194+
<div class="card-body">
195+
<h5 class="card-title">${data.first_name} ${data.last_name}</h5>
196+
<button class="btn btn-primary" id="click-card-${data.id}" data-id="${data.id}">Нажми на меня</button>
197+
</div>
198+
</div>
199+
`
200+
)
201+
}
202+
```
203+
204+
Теперь на главной странице у нас отображаются все пользователи нашей группы.
205+
Перейдем к модификации второй страницы.
206+
207+
## 5. Api страницы пользователя
208+
209+
Модифицируем страницу так, чтобы отображать данные пользователя, на которые нажали.
210+
211+
* Изменяем функцию получения данных
212+
213+
```js
214+
getData() {
215+
ajax.post(urls.getUserInfo(this.id), (data) => {
216+
this.renderData(data.response)
217+
})
218+
}
219+
```
220+
221+
* Добавляем функцию отрисовки карточек по данным
222+
223+
```js
224+
renderData(item) {
225+
const product = new ProductComponent(this.pageRoot)
226+
product.render(item[0])
227+
}
228+
```
229+
230+
* Модифицируем функцию отрисовки страницы
231+
232+
```js
233+
render() {
234+
this.parent.innerHTML = ''
235+
const html = this.getHTML()
236+
this.parent.insertAdjacentHTML('beforeend', html)
237+
238+
const backButton = new BackButtonComponent(this.pageRoot)
239+
backButton.render(this.clickBack.bind(this))
240+
241+
this.getData()
242+
}
243+
```
244+
245+
Нам нужно поменять структуру компонента `ProductComponent`, так же как мы сделалил с компонентом `ProductCardComponent`
246+
247+
```js
248+
getHTML(data) {
249+
return (
250+
`
251+
<div class="card mb-3" style="width: 540px;">
252+
<div class="row g-0">
253+
<div class="col-md-4">
254+
<img src="${data.photo_400_orig}" class="img-fluid" alt="картинка">
255+
</div>
256+
<div class="col-md-8">
257+
<div class="card-body">
258+
<h5 class="card-title">${data.first_name} ${data.last_name}</h5>
259+
</div>
260+
</div>
261+
</div>
262+
</div>
263+
`
264+
)
265+
}
266+
```
267+
268+
## Задание
269+
270+
Создать двухстраничное приложение из примера по вариантам.
271+
Вариант состоит из 2 методов и доп фильтра на эти методы.
272+
273+
Варианты:
274+
275+
### 1 вариант
276+
277+
Главная страница - [groups.getMembers](https://dev.vk.com/method/groups.getMembers).
278+
Получаем список пользователей группы и отображаем их.
279+
Необходимо сделать компонент для фильтра `sort` (см. groups.getMembers -> Параметры -> sort).
280+
281+
Вторая страница - [users.get](https://dev.vk.com/method/users.get).
282+
Отображаем выбранного пользователя на первой странице.
283+
284+
### 2 вариант
285+
286+
Главная страница - [groups.getMembers](https://dev.vk.com/method/groups.getMembers).
287+
Получаем список пользователей группы и отображаем их.
288+
Необходимо сделать компонент для фильтра `filter` (см. groups.getMembers -> Параметры -> filter).
289+
290+
Вторая страница - [users.get](https://dev.vk.com/method/users.get).
291+
Отображаем выбранного пользователя на первой странице.
292+
293+
### 3 вариант
294+
295+
Главная страница - [messages.getConversationMembers](https://dev.vk.com/method/messages.getConversationMembers).
296+
Получаем список участников беседы и отображаем их.
297+
У группы можно создать чат.
298+
Необходимо сделать несколько чатов у группы и добавить компонент для выбора `peer_id` (см. messages.getConversationMembers -> Параметры -> peer_id).
299+
300+
Вторая страница - [users.get](https://dev.vk.com/method/users.get).
301+
Отображаем выбранного пользователя на первой странице.
302+
303+
### 4 вариант
304+
305+
Главная страница - [messages.getConversations](https://dev.vk.com/method/messages.getConversations).
306+
Получаем список чатов и отображаем их.
307+
У группы можно создать несколько чатов.
308+
Необходимо сделать компонент для фильтра `filter` (см. messages.getConversations -> Параметры -> filter).
309+
310+
Вторая страница - [messages.getConversationsById](https://dev.vk.com/method/messages.getConversationsById).
311+
Отображаем выбранный чат на первой странице.
312+
313+
## Полезные ссылки
314+
315+
1. Почитать про **XMLHttpRequest** [тут][xml]
316+
2. Почитать про **VK Api** [тут][vk-api]
317+
318+
[vs-code]: https://code.visualstudio.com
319+
[vs-code-live-server]: https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer
320+
[node-install]: https://nodejs.org/en/download
321+
[xml]: https://learn.javascript.ru/xmlhttprequest
322+
[vk-api]: https://dev.vk.com/reference
323+
[vk-api-group-key]: https://dev.vk.com/api/access-token/getting-started#Ключ%20доступа%20сообщества
324+
[vk-api-create-group]: https://vk.com/groups?w=groups_create
325+
[cors-unblock]: https://chrome.google.com/webstore/detail/cors-unblock/lfhmikememgdcahcdlaciloancbhjino/related

0 commit comments

Comments
 (0)

Back | FazBrowse Home | New Git URL