# | Название видеоурока | Видео / Тесты | Решило | Рейтинг | Доступ |
---|---|---|---|---|---|
1 |
![]() |
|
|||
На этом уроке мы создадим тестовый проект с использованием технологии ASP.NET на MVC шаблоне и рассмотрим структуру проекта. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 30 мин. [Показать отчёт] Научился: MVC Model - ядро Controller - связь ядра с отображением View - интерфейс пользователя. localhost:1062/Home/About == имя сервера:порт/Имя контроллера/Имя вызываемого метода в контроллере |
|||||
2 | Выбор темы для проекта |
|
|||
На этом уроке мы обсудим, какой сайт будем делать. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 43 мин. [Показать отчёт] Научился: / - главная страница проекта Kirov 1934. /kirov/database - полный список фото- и видеоматериалов /kirov/best - туристические достопримечательности /search - поиск по адресам /faq - частые запросы пользователей /about - о сайте Сложности: Работал в банке с названием в 13 букв в нулевых годах. Запускал в работу POS-терминалы. С одной точкой возня была неожиданно тупиковая - не видел его сервер Процессинга в Кардцентре г. Тюмени. Ну никак. И с права заходил, и слева. И техподдержку напряг и связистов. Нет коннекта и хоть ты тресни. В очередной день начал стучаться терминалом в КЦ, тишина. И тут по чату выходит на связь из головного коллега и говорит: Дима, там твой терминал не пускают в бой - мне говорят стучится какой-то неутомимый хакер! Посмеялись тогда от души. Лет прошло немало, но история запомнилась. |
|||||
3 | Создание схемы проекта |
|
|||
На этом уроке мы ещё раз просмотрим сайт, и выберем страницы, которые будем создавать. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 28 мин. [Показать отчёт] Научился: не буду отклоняться от линии Евгения и Валерия, и начну с сайта историй. А дальше, если силы пребудут с нами, прикрутим к этому и фото с видеоматериалами. Благо, их вдоволь. Сложности: История для старта: Когда у вас появляются деньги – у вас появляются женщины. Когда у вас появляются женщины – у вас пропадают деньги. Когда у вас пропадают деньги – у вас пропадают женщины. Когда у вас пропадают женщины – у вас появляются деньги. Если вы сможете вырвать из этого порочного круга женщин - вы будите чертовски богатым мужчиной! |
|||||
4 | Создание пустых страниц |
1 тест |
|||
На этом уроке мы создадим новый пустой проект, добавим нужные контроллеры Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 38 мин. [Показать отчёт] Научился: создали pageController и storyController. Добавили методы для страниц сайта и создали в них представления по одному для каждой страницы. |
|||||
5 | Создание модели Story |
|
|||
На этом уроке мы создадим модель Story. В этой модели будят вся логика работы с историями. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 48 мин. [Показать отчёт] Научился: Модель содержит основной функционал, модель подключается к БД, модель - ядро логики проекта. Создали переменные для хранения заголовка и самого текста истории. Создали конструктор без подключения к БД с инициализацией переменных и заготовкой текстовки. Организовали доступ к переменным со свободным получением и закрытым редактированием. Создали ссылку на модель в контроллере story. Создали экземпляр класса Story в методе ActionResult number() Добавили в storyController юзинг (подключили) нашей модели(в моем случае Kirov1934.Models у Игромистра - DjMoney.Models). Пересоздали представление к методу ActionResult number() для появления в методе ссылки на новосозданную Модель. return View (); => return View(story); Контроллер - связующее звено между Моделью и Представлением. Пересоздали Вид number.cshtml удалив имеющийся и создав новый Empty с выбором в опциях нашей Модели(в моем случае Kirov1934.Models у Игромистра - DjMoney.Models). В заголовке <h2>...</h2> запросили заголовок из Модели, в параграфе <p>...</p> вызвали саму историю. Курсор расположив в методе ActionResult number() контроллера storyController жмём F5 и задерживаем дыхание. У кого ноуты старые, могут начинать дышать до завершения запуска ибо запускается небыстро. |
|||||
6 | Формирование меню |
|
|||
На этом уроке мы сформируем навигационное меню в шапке нашего сайта.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 41 мин. [Показать отчёт] Научился: _Layout.cshtml - макет базовой страницы @Html.ActionLink создаёт ссылку и имеет три строковых параметра: Application name - текст надписи являющейся гиперссылкой Index - имя метода Home - имя контроллера Для превращения Представления созданного без Модели в представление связанное с Моделью в файл Представления в начале добавляется строка вида @model DjMoney5.Models.Story где DjMoney5 - это название Модели |
|||||
7 | Установка сервера MySQL |
|
|||
На этом уроке мы установим MySQL Community Server и программу HeidiSQL для подключения к нему. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 2 мин. [Показать отчёт] Научился: поставил MySQL той же версии, что и в уроке, ибо в процессе скачивания почитал отчёты курсантов с предостережением о проблемах с последней версией. Перезакачал из старых и не нарвался на затыки. Успех радует. |
|||||
8 | Схема базы данных |
|
|||
На этом уроке мы создадим базу данных для нашего проекта, подготовим схему таблицы и напишем SQL запрос для её создания. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 30 мин. [Показать отчёт] Научился: SHOW DATABASES; - показать имеющиеся БД CREATE DATABASE STORY; - создать БД Стори use STORY; - использовать эту БД CREATE TABLE story (.....); - создать таблицу show tables; - показать таблицы explain story; - детализация таблицы show create table story; - вывести строку создания таблицы |
|||||
9 | Создание SQL-запросов |
|
|||
На этом уроке мы составим список задач для нашей базы и составим SQL запросы для решения каждой задачи. Все запросы протестируем в SQL-консоли. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 42 мин. [Показать отчёт] Научился: DELETE FROM story; грохнет все данные, но не сбросит автоинкремент. TRUNCATE TABLE story; - чистит и индексы, а не только данные таблицы. |
|||||
10 | Подключение к базе данных |
|
|||
Мы достигли Экватора нашего проекта! На этом уроке мы подключим наш проект к созданной базе данных на MySQL. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 1 час. 13 мин. [Показать отчёт] Научился: ПОМНИ! Если не хочешь блуждать ежиком в тумане - ставь версии как в уроке! Пока не поставил коннектора 6.9.8 - ничего не вытанцовывалось |
|||||
11 | Работа над ошибками |
|
|||
На этом уроке мы создадим механизм отлова ошибок при работе с базой данных и передачи их клиенту. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 4 час. 42 мин. [Показать отчёт] Научился: Создали представление View - Error для информирования о возможных ошибках. Вывод сообщений об ошибках реализован в виде HTML страницы. Применили структуру(переменную) @ViewBag, поместили его в теги параграфа <p></p> В storyController создали метод проверки на наличие ошибок и запуска вывода сообщения об ошибке. В методе обработки запроса пользователя public ActionResult Index() добавили ветку на вывод страницы с информацией об ошибке в случае её возникновения. В метод обработки ошибок добавили ссылку на представление Error.schtml с указанием полного пути к файлу Перешли к реализации отлова ошибок. В классе MySQL создали статические строковые переменные error и query с публичным доступом к чтению и приватным редактирование. Создали булевый метод возвращающий значение ошибки лишь при её наличии В классе MySQL добавили трай-кеч для материализации ошибок при их возникновении в методы MySQL и Select. Перенесли тестовый запрос в классе Story.sc из метода Story в метод random Запустили тест без вызова в контроллере storyController метода random из класса Story.cs - не взлетели Добавили вызов - взлетели. Пошли крушить код: в Селекте обратились к несуществующей таблице - компиляция успешна, вызов Случайная - ошибка с пояснением. (себе добавил дебага - вместо cshtml сначала ввёл schtml расширение файла представления - увидел ошибку обращения к несуществующему файлу. Пояснение было на экране - найти корень проблемы не составило труда). В ВебКонфиге порушили пароль подключения к БД - снова ошибка на экране. Поставили брякпойнт в методе random класса storyController и через F11 смотрим с открытием выпадающих меню. ЗЫ в финале видео услышал пожелание Игромистра к курсантам "нарабатывать свои 10 000 часов, чтобы стать..." 0пачки! |
|||||
12 | Запуск модели Story |
|
|||
На этом уроке мы запустим модель Story - допишем методы Number() и Random(), организуем ещё одну проверку ошибок. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 3 час. 9 мин. [Показать отчёт] Научился: В классе Story.cs переименовали методы применив заглавные буквы в начале названия в угоду традициям C#. Создали метод Number для вывода истории по номеру. Добавили объявления всех полей таблицы БД в класс Story.cs В контроллере storyController.cs в методе number добавили обращение к полю id в App_Start/RouteConfig.cs с конвертацией его в строковую переменную. Запустили - взлетели. В представление number.cshtml добавили остальные поля таблицы для вывода на экран. Запуск - не взлетели. Добавили "тернарник"(?) В C# двойной вопрос означает (??) - если выражение верно,выполняется слева от двух вопросов, если иначе - справа. Поправили отлов ошибки пустого запроса применив трайкеч. Для отлова ошибок несвязанных с SQL добавили в storyController.cs if адресацию на метод отлова таковых. Для обращения к экземпляру story в новом методе вынесли инициализацию и конструктор story из методов вверх класса storyController. IsError метод был добавлен у класс Story.cs PS Поговорка от Валерия: Жить легко очень трудно. |
|||||
13 | Что такое SQL-инъекция |
|
|||
На этом уроке мы сделаем бекап базы данных, затем продемонстрируем «взлом» страницы посредством SQL-инъекции, покажем, как от этого защититься и потом восстановим базу данных. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 4 час. 48 мин. [Показать отчёт] Научился: mysqldump -u root -p STORY > c:\safe\story418.sql - бекап БД drop table story; - удалить таблицу story mysql -u root -p story < c:\csharp\story3.sql - восстановить таблицу story из файла бэкапа Начали крушить. В адресной строке вызова истории по номеру после цифры номера истории добавив следующее '; DELETE FROM story; SELECT 'a грохнули все записи таблицы story В адресной строке вызова истории по номеру после цифры номера истории добавив следующее '; DROP TABLE story; SELECT 'a грохнули саму таблицу story Добавили метод адэдэслешс во имя экранирования апострофов, "восстановили" первый раз ЗАТЕРЕВ бэкап (боязно было), но был второй файл - он спас. Бэкап - наше всё. Инъекция - зло. |
|||||
14 | Рефакторинг модели Story |
|
|||
На этом уроке мы сделаем небольшой рефакторинг класса Story.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 2 час. 4 мин. [Показать отчёт] Научился: повторяющиеся строки == запахи кода. Избавляемся от ароматов сбором симметричного кода в один метод и ссылками на этот метод из места, откуда повторяющийся код изъяли. Напоминает эволюцию денег. Вместо таскания с собой обрубков серебра, выпустим бумажки, на которых напишем - это Рубль серебра. Таскать макулатуру удобнее, а серебро лежит в Грановитой Палате под присмотром стрельцов. Профит! |
|||||
15 | Работа со списком историй |
|
|||
На этом уроке мы сделаем вывод списка историй на главной странице.
Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 3 час. 50 мин. [Показать отчёт] Научился: Index.cshtml в представлениях дополнили привязкой к Модели.Story Туда же в цикл форич добавили размещение истории на Главную страницу. Дополнили pageController.cs вызовом метода генерации листа историй. Автоматом сделали для него заглушку в Story.cs В Story.cs объявили публичный список всех историй в виде массива Story[] list В Story.cs создали метод GenerateList() - запрос на получение списка историй Метод GenerateList() находящийся в Story.cs принимает в себя аргумент limit из вызова этого метода находящегося в pageController.cs в методе ActionResult. Там установили эту переменную в значение 10 (историй). В GenerateList(string mylimit) добавили трайкеч во имя парсинга из строковой переменной в целочисленную. Создали массив историй list с размером равным количеству строк таблицы в БД. Функцией ExtractRow с передачей в неё таблицы и номера элемента таблицы, в цикле от нуля до list.Length заполнили массив историй list. Обнаружили багу в представлении автора истории - енейм брался не с нулевой позиции, а с первой, второй, третьей по энэр. Fixed. |
|||||
16 | Добавление истории |
|
|||
На этом уроке мы реализуем отправку истории и добавление её в базу данных. Мы рассмотрим возможные ошибки, которые могут возникнуть при этом. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 17 час. 28 мин. [Показать отчёт] Научился: добавили привязку к Модели в представлении Views - story - add.cshtml Добавили поля(хелперы) для ввода пользователем своей истории для загрузки на сайт. Контроллер передаёт данные в Представление(что именно надо отобразить), для выполнения этого в storyController.cs в методе ActionResult add в return View() в скобки дописали story В Story.cs отредактировали доступ до публичного для строковых title, story, email В storyController.cs в методе ActionResult add добавили полям title, story, email значения по умолчанию. Добавили кнопку Сабмит за пределами хелперов. При нажатии в браузере менюхи "Добавить историю" отрабатывает метод GET, заполняющий поля значениями по умолчанию, хранящимися в ActionResult add, а при нажатии кнопки СОХРАНИТЬ отрабатывает метод POST. Продублировали метод add для ГЕТ и для ПОСТ. Добавили метод Insert возвращающий номер записи в типе лонг. Написали редирект для защиты от повторной отправки одной и той же истории. Отредактировали указание электропочты в истории, на случай, если нет @ Модифицировали сообщения об ошибках из булевого в строковый тип. |
|||||
17 | Валидация данных |
|
|||
На этом уроке мы реализуем проверку полей формы при отправке истории. Обсудим регулярное выражение для проверки адреса электропочты. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 2 час. 0 мин. [Показать отчёт] Научился: переменные title, story, email в модели Story заполняются после отправки формы. Их надо проверить на корректность заполнения. Добавили using System.ComponentModel.DataAnnotations Полям добавили Required с сообщением об ошибке. В представлении add.cshtml дописали параграф @Html.ValidationSummary() Поправили контроллер ифом на случай кривых данных ритёрном View(post). Применили @Html.ValidationMessage() для каждого поля. Тег mark метит желтым цветом. Применили в Модели Story контроль за вводом адреса с помощью [RegularExpression()] с маской имейла (все допустимые символы. |
|||||
18 | Оформление сайта |
|
|||
На этом уроке мы займемся внешним видом нашего сайта, будем оформлять страницы, используя возможности bootstrap 3. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 5 час. 6 мин. [Показать отчёт] Научился: @RenderBody() - приёмопередатчик наших ваяний в представлениях. Указание что открывать при старте располагается в Views/_ViewStart.schtml <ul></ul> - unsorted list <li></li> - Каждый элемент списка должен начинаться с тега <li>. Если к тегу <ul> применяется таблица стилей, то элементы <li> наследуют эти свойства. Внешний тег <ul> или <ol> устанавливает тип списка — маркированный или нумерованный. Сетка браузера по умолчанию состоит из ДВЕНАДЦАТИ столбцов. Content/Site.css - здесь лежат каскадные таблицы стилей, ЦЭЭСЭСЫ наши (CSS). |
|||||
19 | Размещение проекта в Интернете |
|
|||
В этом уроке мы зарегистрируемся на хостинге и разместим свой проект в Интернете, наконец-таки! Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 5 час. 39 мин. [Показать отчёт] Научился: Не надо заливать на FTP эти каталоги: Controllers Models, obj (?) - однако после дисконнекта его таки запулили на Сервер в видеоуроке, App_Data, App_Start Результат здесь: http://korchemkino-001-site1.ctempurl.com/ |
|||||
20 | Отказ от статика |
|
|||
Нам придётся отказаться от статичного класса базы данных, потому что статичный класс продолжает существование даже при новых обращениях к нему с новой страницы. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 5 час. 47 мин. [Показать отчёт] Научился: удалили определение static в следующих местах: static public class MySQL static private MySqlConnection con; static public string error { get; private set; } static public string query { get; private set; } static MySQL () static public DataTable Select (string myquery) static public DataTable Insert (string myquery) static public bool IsError () static public string addslashes (string text) создали деструктор коннекшена `MySQL() В storyController.cs создали внутреннюю переменную MySQL с именем sql Проинициализировали её в конструкторе public storyController () Поправили вызовы статичного класса MySQL на вызовы экземпляра sql нестатичного класса MySQL |
|||||
21 | ФИНАЛЬНЫЙ УРОК. Презентация |
без видео |
|||
Сделай видео-презентацию своей программы. На видео необходимо ответить на следующие вопросы: 0. Показать, что у тебя получилось. 1. Чему ты научился на этом курсе? 2. Что тебе понравилось, что нет? 3. Что ты ещё добавишь в свой проект? 4. Какой следующий курс ты будешь проходить? Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 27 мин. [Показать отчёт] Научился: впервые что-то опубликовал в глобальной сети, оформленное в свой огородик. Не видео, не пустопорожнюю болтовню, коей сеть переполнена, а некий участок, где можно рулить и гармонизировать и далее. Планов масса, способности растут не так быстро, как амбиции ) Научился взаимодействовать с хостингом, прежде это наблюдал лишь со стороны. Впервые воспользовался личной учёткой на забугорном FTP, впервые что-то вменяемое туда залил и увидел закачанный в одном месте и на одном компе результат в другом компьютере, подключившись к тому же хостингу, на основе учётных данных в почтовом ящике. Понравилась красота на экране, после обработки представлений Бутстрапом. Добавить хочу иллюстрации, ибо на данный момент весь контент слева, а справа место пустует - непорядок. Следующий курс - в сторону вебдизайна любопытен, хотя и прочие направления вкусны и разнообразны. Висагинасу и Пензе в ножки поклон за достойных мужей, сынов своих городов, выдавших на гора такие душевные видеоуроки, отвлекающие от осенней рутины. Видеообзор: SaUL1GySKm0 |
|||||
22 | VIP. Авторизация на сайте |
|
|||
На этом уроке мы создадим в базе данных таблицу users, добавим туда одну запись и реализуем авторизацию администратора Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 3 час. 25 мин. [Показать отчёт] Научился: исправили добавление истории (эх, раньше бы про это знать )) Материализовали проверку логина+пароля в форме входа на сайт. |
|||||
23 | VIP. Модерация записей |
|
|||
На этом уроке мы реализуем функционал администратора сайта. Администратор сможет подтверждать истории для публикации. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 5 час. 30 мин. [Показать отчёт] Научился: как Игромистр стукнул по столу (57 минута видео - рекомендую к прослушиванию вместо "Спокойной ночи, программисты"), так я понял, что ошибки будут исправлены. У меня в этот момент выскочила информация о негодном моем коде в чекере. Но вняв громогласному заявлению, что я это доделал (хотя на тот момент предвкушал длительные блуждания в поисках ошибки), я вчитался в подсказку на экране с сообщением об ошибке, там оказалась всего лишь пропущенная скобка в конце ифэлза. Дописал и всё взлетело. Вах! Евгений и Валерий - глыбы кодинга! Снимаю шляпу. Видеообзор: TaQPytZ5JN4 |
|||||
24 | VIP. Установка домена |
|
|||
На этом уроке мы покажем, как просто можно купить и привязать домен к вашему проекту. Отчёт отправил: 17947. Dmitry Sinitsin Выполнено за 7 час. 11 мин. [Показать отчёт] Научился: http://dima.pro43.ru/ Купил, хостинг прописывался лишь через письмо, нашел где лежит hosts (оказывается скачками по папкам эту файлу не увидать, над ручками путь прописать к папке etc тогда покажет!!!), пинг увидал, а сайт пока не кажет. Может на работе хитрый сысадмЕн пакостит как-нибудь? Дома проверю позже... Сложности: Дождаться оживления http://dima.pro43.ru/ Вы общаетесь с Алексей К. Алексей К.: Добрый день. Минуту. Алексей К.: https://www.ihead.ru/users/domains/ нажмите параметры у домена, далее "открыть редактор зоны" Алексей К.: там можете удалить существующие A-записи и добавить свои Дмитрий: Список доменов Вам не присвоен номер в биллинговой системе. Обратитесь в службу поддержки пользователей. Зарегистрировать новый домен Алексей К.: минуту Дмитрий: что-то не то видимо у меня на экране ) Алексей К.: обновите страницу Дмитрий: Вах! Спасибо! ))) Дмитрий: Пытаюсь добавить запись NS с таким хостингом NS1.SITE4NOW.NET в ответ неверный формат имени Дмитрий: не подскажете в чем мб дело? Алексей К.: изменение NS-серверов для доменов в зоне pro43.ru через личный кабинет не доступно. если вам неподходит вариант размещение зоны на наших серверах и использование нашего редактора DNS-зоны, напишите письмо на info@ihead.ru: прошу делегировать домен dima.pro43.ru на NS: NS1.SITE4NOW.NET, ... Алексей К.: тут вместо ... укажите все NS-серверы, на которые нужно делегировать домен Дмитрий: Спасибо!Исполняю. Дмитрий: Отправил письмо на info@ihead.ru Алексей К.: Сделано. Теперь вам нужно добавить поддержку домена на этих серверах Последний пункт лишь сейчас и увидел... |
|||||
Итого: 24 видеоурока |
8 час. 41 мин. 1 тест |
24 чел. | |||
Финалисты: Михаил Ермишин, Nromik, Елена, Аркадий, valerys Nikola, Tekashnik, Сергей, zhikharevav, Максим, Сергей Соколов, Ludmila, Алексей Хонин, Станислав, Константин, WildOrc, Алексей|BrisK|Кривицкий, alklokov, Dmitry Sinitsin, Владимир, Max, Александр, Rita, vip, Evgenii Kudriavtcev . |