форма регистрации на java

Форма авторизации пользователя

Всем привет!
Создала макет формы авторизации пользователя в системе, хочу прописать прямо там условия, например: если имя пользователя =user и пароль = 1234, то появляется сообщение : Добро пожаловать!, а если нет, то сообщение: Такого пользователя нет.. Прошу помощи с прописыванием условия в коде и выводам таких сообщений.

форма авторизации
Друзья, здравствуйте! Я новичок, как на данном форуме, так и в java (на стадии начального.

Не получается форма авторизации
Пишу приложение для базы данных swing (по учебе). Использую hibernate. Нужно сделать.

Использование электронных токенов для авторизации пользователя
Здравствуйте, В некоторых банках для авторизации бизнес-клиентов используются электронные токены.

Форма авторизации пользователя
Необходимо написать простейшее условие. Если логин=123, пароль=123, то. пользователь будет.

Форма авторизации пользователя
Уважаемые коллеги, сломал себе все. Осталось последняя рабочая копия. Помогите пожалуйста. Нужно.

Форма авторизации пользователя
Разработать оконное приложение, которое имитирует поведение формы авторизации пользователя в.

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

Не работает форма обратной связи и форма авторизации
Не работает форма обратной связи и форма авторизации. Когда регистрируешься и нажимаешь на кнопку.

Форма авторизации и форма Регистрации(Личный кабинет)
Здравствуйте! Подскажите мне пожалуйста, как мне сделать личный кабинет после авторизации, чтобы я.

Источник

Создаём веб-приложение с Java Servlets

Авторизуйтесь

Создаём веб-приложение с Java Servlets

Одной из самых приятных особенностей Java является её многогранная природа. Конечно, создание традиционных десктопных и даже мобильных приложений — это здорово. Но что, если вы хотите уйти с проторенных дорожек и зайти на территорию разработки web приложений на Java? Для вас есть хорошая новость: в комплекте с языком идёт полноценный Servlet API, который позволяет вам создавать надёжные веб-приложения без особых хлопот.

Это статья для продолжающих. Если вы только начинаете знакомство с Java, советуем пройти быстрый старт, посмотреть видеокурс и выбрать одну из книг для новичков.

Создание приложений на Java с помощью Servlets

Встречайте сервлеты, особый тип Java-программ, выполняемый в пределах веб-контейнера (также называемый контейнером сервлетов, как, например, Tomcat и Jelly), которые позволяют обрабатывать запросы клиентов и ответы сервера просто и эффективно. Сейчас не время и не место дотошно объяснять вам, что из себя представляет сервлет. Достаточно сказать, что сервлеты создаются и уничтожаются их контейнерами, а не разработчиком, и действуют как промежуточный уровень между клиентами (как правило, веб-браузерами) и другими приложениями, запущенными на сервере (например, базами данных).

Сервлет — классная штука, которая помимо всего прочего может принимать данные от клиента, как правило через GET и POST-запросы, работать с cookie и параметрами сеанса. А ещё она обрабатывает данные через дополнительные уровни приложений и отправляет выходные данные клиенту как в текстовом, так и в бинарном форматах (HTML, XML, PDF, JPG, GIF и т.д.), во многих случаях используя Java Server Pages (JSP) файлы.

Лучше всего начинать работу с сервлетами через конкретный пример. Мы создадим простое веб-приложение, которое позволит клиентам регистрироваться с помощью простой HTML-формы. Данные, предоставленные клиентами, будут собираться сервлетом и проверяться валидаторами.

Разбираемся с конфигурационными файлами

Чтобы вы понимали структуру нашего будущего приложения, вот как она будет выглядеть:

форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

Первым шагом к созданию приложения является определение так называемого дескриптора развёртывания. Он указывает, как приложение должно быть развёрнуто в определенной среде. Когда дело касается веб-приложений, дескриптор развёртывания представляет собой простой XML-файл, называемый web.xml и является частью стандартной спецификации Java EE. В нашем случае он будет выглядеть так:

25–26 ноября, Москва и онлайн, От 24 000 до 52 000 ₽

Так как наше приложение будет использовать Servlet API и Java Servlet Pages (JSP) для отображения данных клиента, нам нужно загрузить все необходимые JAR. Maven сделает за нас трудную работу, вот как будет выглядеть файл POM:

Если говорить просто, pom.xml определяет все зависимости, необходимые для работы с сервлетами: JSP, Java Standard Tag Library (JSTL) и Java Expression Language (JEL).

Итак, мы уже создали конфигурационные файлы приложения. Однако в текущем состоянии оно буквально ничего не делает. Мы хотим, чтобы клиенты могли регистрироваться с помощью HTML-формы, поэтому следующее, что нам нужно сделать, — это создать JSP-файлы, которые будут отображать вышеупомянутую форму и данные клиента после успешного завершения регистрации. Этим мы сейчас и займёмся.

Работаем над внешним видом

Внешний вид приложения будет определяться двумя JSP-файлами — в контексте MVC они называются представлениями. Первый будет отвечать за отображение формы регистрации и возможных ошибок, вызванных после проверки введённых данных. Второй будет обычной страницей приветствия, в которой будут показаны данные, введённые клиентом, после успешного завершения процесса регистрации.

Вот первый JSP-файл:

Скоро мы увидим, как сервлет связывается с URL processcustomer и как он взаимодействует с введёнными данными. А пока давайте посмотрим на JSP-файл, который отвечает за страницу приветствия:

Теперь, когда мы разобрались с отображением страниц, следующим шагом будет создание сервлета, ответственного за сбор данных клиента из POST-запросов и подтверждение данных простым способом.

Пишем контроллер

Написать сервлет, способный получить данные из формы регистрации, проще простого. Всё, что нам нужно сделать, — это написать подкласс для класса HttpServlet и реализовать его методы doGet() или doPost() (или оба, если надо). В данном случае сервлет будет взаимодействовать с данными, поступающими из POST-запросов.

Вот как он выглядит:

Валидаторы — это простые классы, которые проверяют определённые свойства, например, является ли строка пустой и выглядит ли email как email. На GitLab автора можно посмотреть на их реализацию.

Результат валидации влияет на дальнейший ход событий: если данные не валидны, клиент перенаправляется через объект RequestDispatcher на страницу регистрации, где отображаются соответствующие ошибки. Если всё в порядке, то отображается страница приветствия.

Итак, мы создали целое веб-приложение на Java, которое позволяет зарегистрировать клиентов с помощью HTML-формы, базового сервлета и нескольких JSP-файлов. Пора его запустить.

Запускаем приложение

Для запуска приложения нужно проделать следующие шаги:

Заключение

Итак, вы приобрели все навыки, необходимые для создания собственного веб-приложения на Java без необходимости прибегать к сложным фреймворкам. Всё, что вам нужно, — Servlet API, технология вроде JSP для отображения и встроенные средства Java. Здорово, правда?

Стоит отметить, что реализация класса CustomerController подчеркивает достоинства и недостатки сервлетов: с одной стороны, он вкратце показывает, насколько легко обрабатывать параметры запроса и отправлять ответы клиенту в разных форматах. Но эта функциональность имеет свою цену: обе реализации интерфейсов HttpServletResponse и HttpServletResponse являются обычными локаторами служб. Нельзя сказать, что это плохо, поскольку локаторы просто содержат данные. Однако нужно помнить, что эти реализации будут всегда привязаны к сервлету.

Источник

Регистрация и авторизация с помощью Spring Security на примере простого приложения

В этой статье будет рассмотрено создание простого веб приложения с использованием Spring Boot и Spring Security. В приложении будет реализована регистрация новых пользователей и авторизация, ограничение доступа к страницам сайта в зависимости от роли пользователя.
Главная цель статьи показать как можно ограничить доступ к различным страницам сайта для пользователей с разными ролями.

Что будет представлять из себя приложение

Сайт со следующими страницам:

Что будем использовать

Содержание

1. Описание основных используемых аннотаций

Controller – специальный тип класса, применяемый в MVC приложениях. Похож на обычный сервлет HttpServlet, работающий с объектами HttpServletRequest и HttpServletResponse, но с расширенными возможностями от Spring Framework.
Repository – указывает, что класс используется для задания перечня
необходимых работ по поиску, получению и сохранению данных. Аннотация может использоваться для реализации шаблона DAO.
Service – указывает, что класс является сервисом для реализации бизнес логики.
Configuration – эта аннотация используется для классов, которые определяют bean-компоненты.
Autowired – аннотация позволяет автоматически установить значение поля. Функциональность этой аннотации заключается в том, что нам не нужно заботиться о том, как лучше всего Bean’у передать экземпляр другого Bean’a. Spring сам найдет нужный Bean и подставит его значение в свойство, которое отмечено аннотацией.

Немного информации о Spring Security

Самым фундаментальным объектом является SecurityContextHolder. В нем хранится информация о текущем контексте безопасности приложения, который включает в себя подробную информацию о пользователе (принципале), работающим с приложением. Spring Security использует объект Authentication, пользователя авторизованной сессии.

«Пользователь» – это просто Object. В большинстве случаев он может быть
приведен к классу UserDetails. UserDetails можно представить, как адаптер между БД пользователей и тем что требуется Spring Security внутри SecurityContextHolder.

Для создания UserDetails используется интерфейс UserDetailsService, с единственным методом:

2. Создание нового проекта в IDE

Мы будем использовать систему сборки Maven.

форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

Под GroupId подразумевается уникальный идентификатор компании (или ваше личное доменное имя), которая выпускает проект. ArtefactId – это просто название нашего проекта.

форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

После завершения создания проекта отроется файл pom.xml, Idea предложит включить автоимпорт – не отказывайтесь. В этом файле будут содержаться все зависимости (библиотеки), используемые в проекте.

форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

3. Создание структуры проекта (пакетов)

Сразу перейдем к созданию пакетов. Структура проекта, которая должна получиться показана ниже.

форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

Теперь коротко о том, что будет храниться в каждом пакете:

Далее добавляем зависимости для работы модулей Spring, драйвер БД PostgreSQL, сервера Tomcat, JSTL.

По умолчанию maven будет использовать старую версию java 1.6, чтобы это исправить указываем версию явно.

Также добавляем плагин, позволяющий упаковывать архивы jar или war и запускать их «на месте»:

Свойство spring.jpa.show-sql выводит тела запросов к БД в консоль.
spring.jpa.hibernate.ddl-auto позволяет задать стратегию формирования БД на основе наших моделей, имеет разные значения (none, create, update и др.). update в данном случае значит, что таблицы БД и поля будут созданы на основе наших моделей и буду изменяться вместе с ними.

Забегая вперед можно отметить, что нам нужно будет только создать БД с именем spring, а таблицы пользователей, ролей и их связующая таблица вместе с внешними ключами будут сформированы автоматически на основе моделей (пакет entity), к созданию которых мы сейчас перейдем.

4. Добавление сущностей, контроллеров, сервисов, репозиториев и представлений

4.1. Добавление сущностей (моделей)

Обязательное требование для всех сущностей: приватные поля, геттеры и сеттеры для всех полей и пустой конструктор (в примерах не представлены). Их не нужно писать вручную, нажмите Alt+Insert и Idea сделает это за вас.

Для импорта необходимых классов и библиотек используем комбинацию клавиш Alt+Enter.

форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

User. В начале об аннотациях: Entity говорит о том, что поля класса имеют отображение в БД, Table(name = «t_user») указывает с какой именно таблицей.

GenerationType.IDENTITY параметр IDENTITY значит, что генерацией id будет заниматься БД. Существует другие стратегии. SEQUENCE – использует встроенный в базы данных, такие как PostgreSQL или Oracle, механизм генерации последовательных значений (sequence). TABLE – используется отдельная таблица с проинициализированным значениями ключей. Еще один вариант – AUTO, hibernate сам выберет из одну вышеописанных стратегий, но рекомендуется указывать стратегию явно.

Поле, находящееся под аннотацией Transient, не имеет отображения в БД. Список ролей связан с пользователем отношением многие ко многим (один пользователь может иметь несколько ролей с одной стороны и у одной роли может быть несколько пользователей с другой);FetchType.EAGER – «жадная» загрузка, т.е. список ролей загружается вместе с пользователем сразу (не ждет пока к нему обратятся).

Для того, чтобы в дальнейшим использовать класс Userв Spring Security, он должен реализовывать интерфейс UserDetails. Для этого нужно переопределить все его методы. Но в нашем примере мы будем использовать только метод getAuthorities(), он возвращает список ролей пользователя. Поэтому для остальных методов измените возвращаемое значение на true.

Role. Этот класс должен реализовывать интерфейс GrantedAuthority, в котором необходимо переопределить только один метод getAuthority() (возвращает имя роли). Имя роли должно соответствовать шаблону: «ROLE_ИМЯ», например, ROLE_USER. Кроме конструктора по умолчанию необходимо добавить еще пару публичных конструкторов: первый принимает только id, второй id и name.

Здесь же можно добавить ограничения на поля. Size(min=2) – значит, что минимальная длина поля 2, в случае если ограничение нарушено будет выведено сообщение.

4.2. Реализация слоя доступа к данным и сервисного слоя

Spring Data предоставляет набор готовых реализаций для создания слоя, обеспечивающего доступ к БД. Интерфейс JpaRepository предоставляет набор стандартных методов (findBy, save, deleteById и др.) для работы с БД.

Т.о. просто создав интерфейс и унаследовав JpaRepository можно выполнять стандартные запросы к БД. Если понадобиться специфичный метод просто добавляем его в интерфейс, опираясь на подсказки Idea. Например, нам нужен метод поиска пользователя в БД по имени. Пишем тип возвращаемого объекта, а затем IDE предлагает возможные варианты. Т.е. в данном случае имя метода определяет, тело запроса.

форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

При необходимости можно использовать аннотацию Query над методом и писать запросы на HQL или SQL (нужно добавить nativeQuery = true).

RoleRepository. Создаем аналогично, собственные методы тут не понадобятся.

UserService. Содержит методы для бизнес-логики приложения. Этот класс реализует интерфейс UserDetailsService (необходим для Spring Security), в котором нужно переопределить один метод loadUserByUsername().

В этом классе можно увидеть еще один способ выполнения SQL запроса — с помощью EntityManager.

Рассмотрим метод saveUser(User user).

Сначала происходит поиск в БД по имени пользователя, если пользователь с таким именем уже существует метод заканчивает работу. Если имя пользователя не занято, добавляется роль ROLE_USER. Чтобы не хранить пароль в «сыром» виде он предварительно хэшируется с помощью bCryptPasswordEncoder. Затем новый пользователь сохраняется в БД.

4.3. Добавление контроллеров

Для страниц, которые никак не обрабатываются сервером, а просто возвращают страницу, маппинг можно настроить в конфигурации. Страница login обрабатывается Spring Security контроллером по умолчанию, поэтому для неё отдельный контроллер не требуется.

RegistrationController. Отдельный контроллер нужен для страницы регистрации. Для обработки GET запроса используется аннотация @GetMapping(«/registration»), для POST – @PostMapping(«/registration»).

Чтобы что-то добавить или получить со страницы мы обращаемся к model. В GET запросе на страницу добавляется новый пустой объект класса User. Это сделано для того, чтобы при POST запросе не доставать данные из формы регистрации по одному (username, password, passwordComfirm), а сразу получить заполненный объект userForm.

Метод addUser() в качестве параметров ожидает объект пользователя (userForm), который был добавлен при GET запросе. Аннотация Valid проверяет выполняются ли ограничения, установленные на поля, в данном случае длина не меньше 2 символов. Если ограничения не были выполнены, то bindingResult будет содержать ошибки.

Если пароль и его подтверждение не совпадают добавляем сообщение на страницу и возвращаем её. В конце пробуем сохранить добавить пользователя в БД.

Метод saveUser() возвращает false, если пользователь с таким именем уже существует и true, если пользователь сохранен в БД. При неудачной попытке сохранения – добавляем сообщение об ошибке и возвращаем страницу. При удачном сохранении пользователя – переходим на главную страницу.

AdminController. Доступ к странице admin имеют только пользователи с ролью администратора. В методе userList() нет ничего нового, он получает данные всех пользователей и добавляет их на страницу.

Метод deleteUser() использует аннотацию RequestParam т.е. в представлении будет форма, которая должная передать два параметра – userId и action. Ссылка будет иметь вид http://localhost:8080/admin?userId=24&action=delete при выполнении такого запроса будет удален пользователь с >
Еще один вариант передать параметры в URL – использовать PathVariable. С помощью этой аннотации мы получаем отдельные части URL, для метод getUser() URL будет выглядеть следующим образом: http://localhost:8080/admin/gt/24, после перехода выведется список всех пользователей с id>24.

WebSecurityConfig. Содержит 2 бина BCryptPasswordEncoder и AuthenticationManager, которые, уже встречались ранее в классе userService.
Кроме этого в методе configure() настраивается доступ к различным ресурсам сайта. В качестве параметров метода antMatchers() передаем пути, для которых хотим установить ограничение. Затем указываем, пользователям с какой ролью будет доступна эта страница/страницы.

4.4. Добавление представлений

index.jsp Главная страница, ниже представлены 2 варианта — для гостя и для авторизованного пользователя.

форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

Для скрытия части контента на странице для авторизованных пользователей (ссылка на страницу регистрации и авторизации) можно использовать тег authorize из библиотеки тегов Spring Security. Параметр access принимает несколько выражений, можно, например, установить ограничение в зависимости от роли пользователя hasRole(‘ADMIN’).

registration.jsp Страница регистрации.
форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

Эту страницу, как уже говорилось, обрабатывает контроллер Spring’а по умолчанию. Важно указать действие: action=»/login» и name инпутов.

admin.jsp Страница администратора.

форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

news.jsp Страница новостей статическая. Используется только для демонстрации прав пользователей, поэтому содержание на ваш выбор.

5. Запуск приложения

В main класс Application нужно добавить следующее:

Перед тем, как переходить к следующему шагу, убедитесь в том, что структура вашего проекта соответствует представленной в начале.

Пришло время создать пустую БД с именем spring, это нужно сделать перед первым запуском приложения и только один раз.

Можете запустить приложение и посмотреть, как измениться БД – в ней создадутся 3 пустые таблицы. Нужно добавить роли пользователей в таблицу t_role:

Теперь можно попробовать зарегистрироваться. В приложение не предусмотрено метода для регистрации пользователя-администратора, но он нужен для демонстрации. Поэтому после регистрации нового пользователя, добавьте в таблицу пользователь-роли запись, дающую эту роль:

форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

Если после добавления прав администратора вы не можете зайти на страницу администратора (ошибка 403) – перезайдите на сайт.

К странице http://localhost:8080/admin доступ имеет только пользователь с ролью администратора. http://localhost:8080/news увидит любой зарегистрированный пользователь. Также можно попробовать перейти на страницы регистрации и логина, будучи авторизированным на сайте.

Заключение

В итоге было создано веб приложение, в котором мы можем управлять доступом пользователей к страницам сайта применяя роли. Можно назначать несколько ролей одному пользователю. Например, при регистрации нового пользователя добавляем базовую для всех роль User, а затем при запросе дополнительных привилегий пользователем можем дать ему допустим роль Writer, которая позволит ему добавлять новые новости на сайт.

Файлы css и js были созданы, но их содержимое не было представлено. При желании можно добавить дизайн, например, используя Bootstrap и интерактивности с помощью js.

Источник

Русские Блоги

Окно регистрации Java и функции входа в систему

Сначала поговорим о реализации функции в окне.

Перед реализацией функции вам необходимо знать несколько вещей:

1.Поскольку пароль и имя пользователя помещаются в txt, необходимы некоторые знания ввода-вывода.:
File file = new File (path); читать txt

file.exists () определяет, существует ли файл

file.createNewFile (); Создать новый файл

FileInputStream fis = new FileInputStream(file);
InputStream: это суперкласс всех байтовых входных потоков, и обычно используются его подклассы: FileInputStream и т. д., которые могут выводить байтовые потоки;

InputStreamReader isr = new InputStreamReader(fis,“utf-8”);
InputStreamReader: это мост между потоком байтов и потоком символов, может выводить поток байтов как поток символов и может указывать набор символов для потока байтов и может выводить отдельные символы ;

BufferedReader br = new BufferedReader(isr);
BufferedReader: обеспечивает общее чтение буферизованного текста, readLine считывает текстовую строку, считывает текст из потока ввода символов, буферизует каждый символ, тем самым обеспечивая эффективный символ, массив и строку Читать.

br.readLine () метод чтения

line.equals () метод сравнения строк

FileWriter fw = new FileWriter(“D:\user.txt”,true);
// Создаем объект класса потока вывода символов и связываем его с существующим файлом. Если файл не существует, создайте его.
// Добавление true означает, что, когда fw снова запишет файл, он продолжит запись в конец файла и не будет его перезаписывать.

fw.write (str + «\ n»); Метод записи

2. Напишите общее представление о связанных функциях:

То есть определить, существует ли имя пользователя при регистрации, в противном случае запишите имя пользователя и пароль в текстовый файл и оцените, правильны ли имя пользователя и пароль при входе в систему, если да, то вход в систему успешен

Нужна функция регистрации UserRegister (), отвечающая за оценку успешности регистрации;
требует функции входа в систему UserLogin (), которая отвечает за оценку успешности входа;
Нужна функция IsUserExist (), чтобы определять, существует ли имя пользователя во время регистрации;
Нужна функция WriteInFile (), которая записывает имя пользователя и пароль в txt при регистрации;
Функция IsFileExist (), которая должна определить, существует ли текстовый файл в начале;

Затем конкретный код:

На основе предыдущих функций в сочетании с javafx:
Относительно просто использовать макет GridPane для отслеживания действий кнопок входа и регистрации.

Обобщите вещи в оконной химии:
1. Прежде всего, это должно быть использование сетки, например:
pane.add () добавляет элементы на панель
Есть инструкции по обработке местоположения добавленных нами вещей (хотя их все еще много, и я этого не понимаю)
pane.setAlignment( Pos.CENTER);
pane.setPadding(new Insets(16,17,18,19));
pane.setHgap(5.5);
pane.setVgap(9.5);
GridPane.setHalignment(login, HPos.RIGHT);
GridPane.setHalignment(register, HPos.RIGHT);

Далее идет общий код:

Ошибки в реализации функции раньше: (пока не понял)

1. Определите, существует ли имя пользователя, а оператор if не может существовать.
форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

2. fw.close () должен существовать
форма регистрации на java. Смотреть фото форма регистрации на java. Смотреть картинку форма регистрации на java. Картинка про форма регистрации на java. Фото форма регистрации на java

Опыт:
Сначала мне показалось, что это гигантская задача, но позже она стала яснее после разделения небольших функций.
Я не знаю, не знаю ли я или не знаком с некоторыми конкретными функциями реализации, я действительно могу полагаться только на информацию в Интернете.
При написании этого кода я сначала нашел пример кода в Интернете. Прочитав его полностью,
Затем напишите свои собственные идеи и постепенно улучшайте код. Если вы не понимаете его, прочтите еще раз и, наконец,
был реализован, и я чувствую, что многого удалось добиться.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *