Преглед на файлове

завернул cinema в докер; поправил лекцию с разбором демо-экзамена

Евгений Колесников преди 2 години
родител
ревизия
d4ee833895
променени са 6 файла, в които са добавени 45 реда и са изтрити 50 реда
  1. 15 44
      articles/f6_demo_1.md
  2. 13 0
      cinema/Dockerfile
  3. 2 1
      cinema/api.rest
  4. 10 0
      cinema/docker-compose.yml
  5. 1 1
      cinema/package.json
  6. 4 4
      cinema/swagger/cinema.yml

+ 15 - 44
articles/f6_demo_1.md

@@ -85,35 +85,10 @@
 
     **Во-вторых**, создайте в репозитории ветку: `git checkout -b Module_1`
 
-    **В-третьих**, при работе желательно в основной ветке (`Module_Х`) держать только **РАБОЧИЙ** код, чтобы было что оценивать не зависимо от того, на каком месте вы остановились. Для этого создайте ещё одну ветку, например **work** (`git checkout -b work`) и работайте в ней. После отладки какой-то фичи (например, сделали авторизацию) фиксируете изменения, переключаетесь на основную ветку (Module_1), сливаете ветки и заливаете основную ветку в репозиторий. Затем возвращаетесь в ветку **work**:
+    **В-третьих**, при работе желательно в основной ветке (`Module_Х`) держать только **РАБОЧИЙ** код, чтобы было что оценивать не зависимо от того, на каком месте вы остановились (отладили кусок кода - запушили на сервер).
 
-    * фиксируем изменения в ветке work
 
-        ```
-        git add .
-        git commit -m "сделал авторизацию"
-        ```
-
-    * переключаемся на ветку Module_1
-
-        ```
-        git checkout Module_1
-        ```
-
-    * сливаем изменения из ветки work (в текущую) и, при желании, пушим на удаленный сервер
-
-        ```
-        git merge work
-        git push origin Module_1
-        ```
-
-    * возвращаемся в рабочую ветку
-
-        ```
-        git checkout work
-        ```
-
-    итоговая структура репозиториев должна получиться примерно такая:
+    Итоговая структура репозиториев должна получиться примерно такая:
 
     * Module_1 (репозиторий)
         - Module_1 (ветка)
@@ -124,16 +99,16 @@
 
 >Необходимо корректно обрабатывать запросы к серверу. В случае получения ошибки от сервера или отсутствия соединения с сетью Интернет необходимо отобразить соответствующий текст ошибки с помощью диалогового окна.
 
-Тут вам придумывать ничего не надо - в классе **Http** уже есть пример, как перехватывать исключения
+Тут вам придумывать ничего не надо - в классе **Http** уже все реализовано.
 
 >Необходимо строго следовать предложенному дизайну. Макеты приложения доступны по ссылке:
 https://www.figma.com/file/tD64TlCMQEqlr8OTv6bW2o/KOD1.4-Variant3?node-id=0%3A1 
 >
->Описание протокола API доступно по ссылке: ~~https://app.swaggerhub.com/apis-docs/WorldSkills-MAD/WorldCinema/1.0.0~~ (так как АПИ на момент написания этих лекций не доступно, то я нарисовал своё АПИ и Swagger для него лежит [тут](http://swagger.kolei.ru?url=http://cinema.kolei.ru/swagger/cinema.yml))
+>Описание протокола API доступно по ссылке: https://swagger.kolei.ru?url=https://cinema.kolei.ru/swagger/cinema.yml
 
->Проект приложения должен быть структурирован по экранам, то есть исходные файлы конкретного экрана должны быть в соответствующей папке. Общие для нескольких экранов классы необходимо поместить в папку common.
+>Проект приложения должен быть структурирован по экранам, то есть исходные файлы конкретного экрана должны быть в соответствующей папке. Общие для нескольких экранов классы необходимо поместить в папку `common`.
 
-В андроиде нужно делать не папки, а пакеты. Например, создаёте пакет LaunchScreen и в него переносите MainActivity. Для остальных окон сначала делаете пакет, например SignUpScreen, затем в этом пакете создаёте SignUpActivity.
+В андроиде нужно делать не папки, а пакеты. Например, создаёте пакет `LaunchScreen` и в него переносите `MainActivity`. Для остальных окон сначала делаете пакет, например `SignUpScreen`, затем в этом пакете создаёте `SignUpActivity`.
 
 Критерий | Баллы
 ---------|:----:
@@ -273,23 +248,21 @@ override fun onCreate(savedInstanceState: Bundle?) {
 
 **Swagger** - это фреймворк для спецификации *RESTful API*. Его прелесть заключается в том, что он дает возможность не только интерактивно просматривать спецификацию, но и отправлять запросы.
 
-Открываем [ссылку](http://swagger.kolei.ru?url=http://cinema.kolei.ru/swagger/cinema.yml) на описание АПИ и смотрим что там есть:
+Открываем [ссылку](https://swagger.kolei.ru?url=https://cinema.kolei.ru/swagger/cinema.yml) на описание АПИ и смотрим что там есть:
 
 ![](../img/f6_005.png)
 
-В начале идёт общая информация. Нам тут пока интереснен только так называемый базовый URL. Здесь он находится в блоке Servers (`http://cinema.areas.su`), но может быть написан и просто текстом (как базовые урлы для картинок и видео).
-
-**ВАЖНО!!!** *figma* и *swagger* на момент написания этой лекции работают, а вот сервер АПИ - нет, видимо его запускали только на время работы демо-экзамена. Я написал простенький симулятор этого сервера, он доступен по адресу `http://cinema.kolei.ru`.
+В начале идёт общая информация. Нам тут пока интереснен только так называемый базовый URL. Здесь он находится в блоке Servers (`https://cinema.kolei.ru`), но может быть написан и просто текстом (как базовые урлы для картинок и видео).
 
 Дальше идут описания методов АПИ. Рассмотрим подробно метод Регистрация:
 
 ![](../img/f6_006.png)
 
-1. В заголовке указано какой метод и "путь" используются для запроса. К пути надо добавить "базовый урл" и получим полный адрес запроса: `http://cinema.areas.su/auth/register`
+1. В заголовке указано какой метод и "путь" используются для запроса. К пути надо добавить "базовый урл" и получим полный адрес запроса: `https://cinema.kolei.ru/auth/register`
 
 1. В параметрах (Parameters) указываются параметры GET-запросов, передаваемые в строке запроса. У нас тут пусто.
 
-1. Тело запроса (Request body). Тут указано что тело запроса обязательно должно присутсвовать (required) и формат `application/json`
+1. Тело запроса (Request body). Тут указано что тело запроса обязательно должно присутствовать (required) и формат `application/json`
 
     В теле запроса должна быть JSON-строка. Пример её можно посмотреть на вкладке **Example value**, но нам интереснее вкладка **schema** - на ней описаны типы данных (string), описание поля (что это такое вообще) и, возможно, обязательность использования поля. Например, для поля **email** расписан шаблон, которому оно должно соответсвовать.
 
@@ -390,7 +363,7 @@ registrationButton.setOnItemClickListener { parent, view, position, id ->
 
         Http.call(
             Http.buildRequest(
-                "http://s4a.kolei.ru/login",
+                "https://cinema.kolei.ru/auth/register",
                 json.toString()
             ),
             registrationCallback
@@ -488,9 +461,7 @@ Email проверяется на удовлетворение шаблону и
 
 ### Скруглённые углы у постера
 
-Есть вариант с программным изменением картинки, но он не учитывает последующую возможную обрезку картинки (понадобится при выводе аватарки). 
-
-Есть более простой и наглядный вариант: элемент **ImageView** заворачивается в контейнер **androidx.cardview.widget.CardView**, которому и задаётся радиус:
+Элемент **ImageView** заворачивается в контейнер **androidx.cardview.widget.CardView**, которому и задаётся радиус:
 
 ```xml
 <androidx.cardview.widget.CardView
@@ -508,7 +479,7 @@ Email проверяется на удовлетворение шаблону и
 
 ![](../img/f6_015.png)
 
-Для перехода между экранами внизу главного экрана есть панель навигации. Для её реализации есть отдельный механизм, который мы пока не рассматривали. Вы можете сюда поместить горизонтальный **LinearLayout**.
+Для перехода между экранами внизу главного экрана есть панель навигации. Для её реализации есть activity с "Bottom Navigation". Но можете сюда поместить горизонтальный **LinearLayout**.
 
 ### Экран "профиль пользователя"
 
@@ -553,7 +524,7 @@ Email проверяется на удовлетворение шаблону и
 ```kt
 Http.call(
     Http.buildRequest(
-        "http://cinema.kolei.ru/user",
+        "https://cinema.kolei.ru/user",
         headers = mapOf("Authorization" to "Bearer ${app.token}")
     ),
     userCallback
@@ -1141,7 +1112,7 @@ override fun onActivityResult(
 >https://www.figma.com/file/tD64TlCMQEqlr8OTv6bW2o/KOD1.4-Variant3?node-id=0%3A1 
 >
 >Описание протокола API доступно по ссылке:
->http://swagger.kolei.ru?url=http://cinema.kolei.ru/swagger/cinema.yml 
+>https://swagger.kolei.ru?url=https://cinema.kolei.ru/swagger/cinema.yml 
 >
 >Проект приложения должен быть структурирован по экранам, то есть исходные файлы конкретного экрана должны быть в соответствующей папке. Общие для нескольких экранов классы необходимо поместить в папку `common`.
 >

+ 13 - 0
cinema/Dockerfile

@@ -0,0 +1,13 @@
+FROM node:14-alpine
+
+RUN mkdir -p /opt/app
+
+WORKDIR /opt/app
+
+COPY . .
+
+RUN npm install
+
+EXPOSE 3019
+
+CMD [ "npm", "start" ]

+ 2 - 1
cinema/api.rest

@@ -1,4 +1,5 @@
-@url=http://cinema.kolei.ru
+#@url=http://cinema.kolei.ru
+@url=http://localhost:3019
 
 # http://swagger.kolei.ru?url=http://cinema.kolei.ru/swagger/cinema.yml
 

+ 10 - 0
cinema/docker-compose.yml

@@ -0,0 +1,10 @@
+version: '3'
+
+services:
+  nodejs:
+    build:
+      context: .
+    container_name: cinema
+    restart: always
+    ports:
+      - 3019:3019

+ 1 - 1
cinema/package.json

@@ -4,7 +4,7 @@
   "description": "тестовый сервер для разбора демо-экзамена по мобильной разработке",
   "main": "index.js",
   "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
+    "start": "node index.js"
   },
   "author": "kei",
   "license": "ISC",

+ 4 - 4
cinema/swagger/cinema.yml

@@ -11,14 +11,14 @@ info:
     
     Требования к email: email должен соответствовать паттерну **name@domenname.ru**, где имя и домен второго уровня могут состоять только из маленьких букв и цифр, домен верхнего уровня - только из маленьких букв. Длина домена верхнего уровня - не более 3х символов.
     
-    **BASE URL**: http://cinema.kolei.ru
+    **BASE URL**: https://cinema.kolei.ru
     
-    **BASE URL** Для видео: http://cinema.kolei.ru/up/video/
+    **BASE URL** Для видео: https://cinema.kolei.ru/up/video/
     
-    **BASE URL** Для изображений и аватаров: http://cinema.kolei.ru/up/images/
+    **BASE URL** Для изображений и аватаров: https://cinema.kolei.ru/up/images/
 
 servers:
-  - url: http://cinema.kolei.ru
+  - url: https://cinema.kolei.ru
 
 tags:
   - name: auth