Салимов Руслан IT - видео - все видео
Новые видео из канала RuTube на сегодня - 20 April 2026 г.
Новые видео из канала RuTube на сегодня - 20 April 2026 г.
В этом видео будем разбираться с IDE Cursor 2.0 и работой с ИИ! Смоделируем и решим реальную таску на примере уже существующего проекта на Next.js, переведем интерфейс на русский, английский и татарский языки с использованием i18n Мой ТГ канал: https://t.me/salimov_it Мой канал на rutube: https://rutube.ru/channel/28468267/ Мой канал на youtube: https://www.youtube.com/@salimov-dev Стартовый проект: https://github.com/Salimov-dev/next-course-final Итоговый проект: https://github.com/Salimov-dev/cursor_course 00:00 Вступление 01:05 Про себя и ИИ 09:16 Установка Cursor 12:36 Качаем и подключаем проект 16:56 Восстанавливаем .env с ИИ 21:50 Подключаем Postgres 25:30 Про конференцию HolyJS 26:31 Настраиваем Cursor 31:55 Работаем с git 36:45 Подключаем i18 с ИИ 57:18 Переводим проект на другие языки 01:02:00 Немного про результат 01:04:30 Генерим превью для видео с ИИ 01:06:12 КонецВ этом видео мы шаг за шагом разберём, как интегрировать RTK Query в React-приложение для работы с API, создадим API для управления продуктами и реализуем полный CRUD-функционал. Вы узнаете, как настроить productsApi, использовать хуки RTK Query, обрабатывать ответы и ошибки, а также применять ленивую загрузку и мутации. Подписывайся на мой ТГ канал: t.me/salimov_it там ты найдешь ссылки на стартовый и итоговый проекты! Мой ТГ: https://t.me/Rogooo Мой канал на rutube: https://rutube.ru/channel/28468267/ Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 00:29 Клонируем проект 01:13 Знакомимся с проектом 03:48 Знакомимся с RTK Query 08:55 Создаем productsApi 13:11 Подключем reducer и middleware в store 15:30 Применяем productsApi в приложении 20:55 transformResponse 21:59 transformErrorResponse 23:00 keepUnusedDataFor 24:10 useLazyGetProductsQuery 25:10 refetch() 26:31 Созданием CRUD 34:50 Применяем CRUD в приложении 36:00 Для чего unwrap() 38:11 КонецВ этом обучающем видео мы шаг за шагом создадим страницу интернет-магазина на React с использованием Redux Toolkit (RTK)! Вы узнаете, как настроить управление состоянием для списка продуктов и корзины, реализовать загрузку данных с API, добавление товаров в корзину и их удаление. Всё это на основе реального проекта с чистым и современным кодом. Что вы узнаете: - Как настроить Redux Toolkit в проекте React для управления состоянием. - Создание slice для продуктов и корзины с использованием createSlice. - Асинхронная загрузка данных с API (https://dummyjson.com) с помощью createAsyncThunk. - Реализация функционала добавления, удаления и очистки корзины. - Интеграция с Ant Design для создания красивого UI. - Лучшие практики типизации с TypeScript и работы с Redux. Репа готового проекта из видео: https://github.com/Salimov-dev/redux-toolkit Мой ТГ: https://t.me/Rogooo Мой канал на rutube: https://rutube.ru/channel/28468267/ Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 01:20 Инициализация проекта "Счетчик" 03:12 Знакомимся с RTK 11:15 Установка и настройка первого store 16:56 Применяем CounterStore 23:41 Создание отдельных селекторов в store 28:54 Рефакторинг перед вторым проектом 30:20 Создание ProductsPage 31:20 Устанавливаем Redux devtools 32:56 Инициализация проекта "Продукты с корзиной" 50:01 Создание ProductsStore 58:10 Создание createAsyncThunk 01:02:50 Применяем ProductsStore в ProductsPage 01:02:50 Используем паттерн "Устаревшие данные" 01:09:30 Создание корзины товаров 01:17:22 Создание CartStore 01:21:52 Применяем CartStore 01:26:40 Создание метода "Очистка корзины" 01:29:05 Создание метода "Удаление товара из корзины" 01:33:31 Создание метода "Добавление товара в корзину" 01:37:08 КонецВ этом видео мы улучшаем навигацию в React-приложении при помощи React Router! Реализуем продвинутую кнопку "Назад" с учётом переходов с внешних ресурсов, добавляем ленивую загрузку страниц (lazy loading) для оптимизации, обрабатываем ошибки с помощью ErrorBoundary и настраиваем сброс скролла с ScrollRestoration. Код, шаги и объяснения — всё внутри! Подписывайся, если хочешь больше уроков по React и фронтенду! В этом видео мы улучшаем навигацию в React-приложении при помощи React Router! Реализуем продвинутую кнопку "Назад" с учётом переходов с внешних ресурсов, добавляем ленивую загрузку страниц (lazy loading) для оптимизации, обрабатываем ошибки с помощью ErrorBoundary и настраиваем сброс скролла с ScrollRestoration. Код, шаги и объяснения — всё внутри! Подписывайся, если хочешь больше уроков по React и фронтенду! Репа проекта: https://github.com/Salimov-dev/browser-router-advanced Мой ТГ: https://t.me/Rogooo Мой канал на rutube: https://rutube.ru/channel/28468267 Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 00:40 Клонирование проекта 01:30 Быстро знакомимся с кодом 05:56 Блокируем возврат на внешнюю ссылку 12:52 Выносим кнопку "Назад" в App 16:00 Дорабатываем handleGoBack с document.referrer 18:50 Возврат на определенную страницу fromPath 23:30 Учимся работа со скроллом 26:14 Подключаем ленивую загрузку LazyLoading 29:42 Подлючаем ErrorBoundary 35:00 Моделируем ошибку загрузки страницы 40:17 Фикс бага у скролла с помощью scrollRestoration 43:00 Конец Мой ТГ: https://t.me/Rogooo Мой канал на rutube: https://rutube.ru/channel/28468267 Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 00:40 Клонирование проекта 01:30 Быстро знакомимся с кодом 05:56 Блокируем возврат на внешнюю ссылку 12:52 Выносим кнопку "Назад" в App 16:00 Дорабатываем handleGoBack с document.referrer 18:50 Возврат на определенную страницу fromPath 23:30 Учимся работа со скроллом 26:14 Подключаем ленивую загрузку LazyLoading 29:42 Подлючаем ErrorBoundary 35:00 Моделируем ошибку загрузки страницы 40:17 Фикс бага у скролла с помощью scrollRestoration 43:00 КонецВ этом видео разбираем, как работать с localStorage и sessionStorage — двумя мощными инструментами для хранения данных на стороне клиента. Узнайте: ✅ Как сохранять и получать данные. ✅ В чем разница между localStorage и sessionStorage. Репа проекта: https://github.com/Salimov-dev/localstorage Мой ТГ: https://t.me/Rogooo Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 00:28 Инициализация проекта 01:48 Подготавливаем проект 05:27 Знакомимся с LocalStorage 07:10 Сохраняем состояние collapsed menu в LocalStorage 09:58 Используем состояние collapsed menu из LocalStorage 12:52 Отличия LocalStorage от SessionStorage 13:20 Выносим sidebar в отдельный компонент 14:50 Создаём новый компонент AddObject 17:45 Учимся работать с объектами parse() и stringify() 21:35 Очищаем LocalStorage.clear() 22:45 Получаем длинну LocalStorage.length 23:16 Получаем элемент по LocalStorage.key() 23:45 Удаляем элемент LocalStorage.removeItem() 25:11 Работаем с SessionStorage 26:30 КонецВ этом видео я покажу, как создавать свои собственные сниппеты в Visual Studio Code. Сниппеты — это мощный инструмент, который позволяет автоматизировать рутинные задачи и писать код быстрее. Мой ТГ: https://t.me/Rogooo Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 01:15 Инициализация проекта 02:15 Создание нового компонента вручную 06:03 Использование Simple React Snippets 08:01 Создание собственного сниппета 12:31 Использование tab stops 13:50 Использование placeholders 14:52 Комбинируем все подходы 16:41 КонецВ этом видео мы погружаемся в мир MobX — мощной библиотеки для управления состоянием в React-приложениях. На примере двух простых приложений (Счётчика и TODO-приложения) я покажу, как настроить MobX, работать с синхронными и асинхронными операциями, использовать геттеры и сеттеры, а также добавлять реактивные реакции для автоматизации логики и многое другое Репа готового проекта из видео: https://github.com/Salimov-dev/mobx-public Mobx: https://mobx.js.org/ Мой ТГ: https://t.me/Rogooo Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 00:42 Инициализация проекта 02:02 Подготавливаем проект 10:15 Устанавливаем Mobx 11:01 Синхронные операции: Counter store 13:55 makeObservable() 15:30 get() и computed 16:34 makeAutoObservable() 16:50 set() 20:35 Переносим saveCount и removeSavedCount 23:05 Асинхронные операции: Todo store 29:04 RunInAction() 31:13 Action() 32:40 Отличия action/runInAction и try-catch/then-catch 34:15 Выводим todo на клиенте 34:20 Reaction() 38:10 When() 38:50 КонецВ этом видео мы подробно разберём, как работать с Axios — одним из самых популярных инструментов для отправки HTTP-запросов в JavaScript. Вы научитесь отправлять запросы к API, создавать экземпляры Axios, обрабатывать ошибки и организовывать код с помощью универсального сервиса. Что вы узнаете: - Как отправлять GET, POST, PUT и DELETE запросы на API (на примере Dummyjson.com) - Создание экземпляра Axios для удобной работы с API - Обработка ошибок - Настройка перехватчиков (interceptors) - Создание универсального сервиса для работы с запросами - Создание постраничной навигации с сервера Этот видеоурок подойдёт как для начинающих, так и для тех, кто хочет структурировать свои знания и улучшить навыки работы с Axios. Репа проекта: https://github.com/Salimov-dev/axios-public Мой ТГ: https://t.me/Rogooo Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 01:03 Инициализация проекта 01:58 Верстаем проект 06:33 Получаем Product с API https://dummyjson.com/ 10:29 Верстаем карточки с продуктами 17:10 Используем Axios 18:20 Обрабатываем ошибки в catch 22:30 Создание экземпляра axios 24:16 Создание отдельного config для axios 25:05 Выносим http сервис в отд компонент 25:46 Выносим метод обработки ошибок getErrorMessage() 26:38 Создаем универсальный сервис для Products 29:09 Создаем перехватчик request 32:05 Создаем перехватчик response 34:35 Создаем постраничная навигацию с API 42:14 КонецВ этом видео мы разберём всё, что нужно знать о React Router DOM v7! Вы узнаете, как настроить маршрутизацию в React-приложениях, работать с динамическими параметрами, вложенными маршрутами и защищёнными страницами. Мы также рассмотрим новые фичи и улучшения в версии 7, которые сделают вашу разработку ещё удобнее. Репа проекта: https://github.com/Salimov-dev/browser-router-v7 Мой ТГ: https://t.me/Rogooo Мой канал на rutube: https://rutube.ru/channel/28468267 00:00 Вступление 00:40 Инициализация проекта 01:30 Верстаем проект 05:20 Установка React-router-dom 05:38 Подготовка проекта под роутинг 08:34 Делаем роуты для React-router-dom 11:20 Связываем роуты с левым меню 14:31 Связываем роуты с выпадающим меню 16:18 Изучаем useParams() 17:44 Изучаем useSearchParams() 20:38 Изучаем как вернуться на страницу назад 21:25 Делаем активным пункт меню 24:10 Далем PrivateRoute 26^40 КонецВ этом видео продолжим учиться работать с библиотекой @pbe/react-yandex-maps — это обертка для API Яндекс.Карт, которая позволяет отображать карты Яндекса в вашем React приложении с минимальными усилиями Изучим гео-объект Polygone, будем "рисовать" свои полигоны ввиде ЗОН ДОСТАВКИ прямо на карте, научимся их редактировать, добавлять новые точки к полигонам и самое главное - научимся определять вхождение метки в зоны нашей доставки! Стартовый проект для работы с картами: https://github.com/Salimov-dev/yandex-maps-start Репа готового проекта из видео: https://github.com/Salimov-dev/react-yandex-maps-polygon-public Яндекс кабинет разработчика: https://developer.tech.yandex.ru/services/3 React Yandex Maps: https://pbe-react-yandex-maps.vercel.app Примеры определения координат: https://yandex.ru/map-constructor/location-tool/ Типизация карт: npm i @types/yandex-maps Мой ТГ: https://t.me/Rogooo Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 01:58 Устанавливаем и знакомимся со стартовым проектом 05:50 Знакомство с Polygon 08:49 Готовим стартовый проект к работе 12:46 Создаем первый Polygon 19:09 Редактируем точки и площадь Polygon 26:20 Добавление новых точек в Polygon 32:30 Добавляем имя и цвет Polygon 39:01 Делаем множество Polygons 46:40 Добавляем selector для выбора Polygon 50:13 Редактируем определенный Polygon из select 58:06 Определяем вхождение Метки в границы Polygon 01:07 Конец и просьбаВ этом видео мы научимся работать с абсолютными путями, они же - Path Aliases, Module Aliases или Absolute Imports. Будем превращать пути типа "../../assets/logo.png" в "@assets/logo.png" Готовый проект: https://github.com/Salimov-dev/path-aliases Мой ТГ: https://t.me/Rogooo Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 00:40 Инициализация проекта на vite 01:31 Обсудим проблемы относительных путей 02:36 Готовим проекта для работы 07:23 Устанавлиаем path, url и @types/node 08:20 Работаем с vite.config.ts 11:40 Работаем с tsconfig.json 14:41 Применяем новые алиасы в приложении 16:42 КонецВ этом видео продолжим учиться работать с библиотекой @pbe/react-yandex-maps — это обертка для API Яндекс.Карт, которая позволяет отображать карты Яндекса в вашем React приложении с минимальными усилиями Изучим гео-объект Circle, будем определять входит ли метка в зону доставки (в радиус объекта Circle) Стартовый проект для работы с картами: https://github.com/Salimov-dev/yandex-maps-start Репа готового проекта из видео: https://github.com/Salimov-dev/react-yandex-maps-circle Яндекс кабинет разработчика: https://developer.tech.yandex.ru/services/3 React Yandex Maps: https://pbe-react-yandex-maps.vercel.app Примеры определения координат: https://yandex.ru/map-constructor/location-tool/ Типизация карт: npm i @types/yandex-maps Мой ТГ: https://t.me/Rogooo Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 01:05 Устанавливаем и знакомимся со стартовым проектом 04:17 Начинаем работать с Circle 09:31 Определяем вхождение в радиус Circle 12:54 Выводим на экран результат вхождения 14:40 Исправляем ошибки 16:50 КонецКороткий видео-обзор-презентация на выполненное тестовое задание на позицию Middle FullStack React/Nest Целью задания было создание каталога товаров, с возможностью их добавления/редактирования/удаления Пагинация/фильтрация/сортировка на стороне сервера Добавление фото с сохранением на сервере Репа тестового на гитхабе: https://github.com/Salimov-dev/online-store-page Тестовое реализовано на основе проекта JWT авторизации https://youtu.be/a_lnj0To8sQ Его репа тут https://github.com/Salimov-dev/auth-project Стек клиента: - React - TypeScript - Vite - Ant-design - Axios - Styled-components - Zustand Стек сервера: - Nest - Passport-JWT - Prisma - Faker Мой ТГ: https://t.me/Rogooo Мой канал на youtube: https://www.youtube.com/@salimov-devВ этом видео мы научимся работать с библиотекой styled-components — это инструмент для стилизации компонентов в React, который позволяет писать стили с использованием JavaScript и упрощает управление стилями в приложении Готовый проект: https://github.com/Salimov-dev/styled-components Мой ТГ: https://t.me/Rogooo Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 01:59 Инициализация проекта на vite 02:45 Немного о проекте и разметке 03:55 Начинаем работать со styled-components 07:23 Учимся использовать hover 10:18 Применяем props для передачи цвета 12:43 Переносим анимацию 16:48 Стилизуем h1, p и button 20:34 Работаем над стилями App 22:10 Разница между app.css и index.css 23:02 КонецВ этом видео научимся работать с библиотекой @pbe/react-yandex-maps — это обертка для API Яндекс.Карт, которая позволяет отображать карты Яндекса в вашем React приложении с минимальными усилиями Готовый проект: https://github.com/Salimov-dev/pbe-react-yandex-maps Мой ТГ: https://t.me/Rogooo Мой канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 01:18 Инициализация проекта на vite 02:53 Начинаем работать с @pbe/react-yandex-maps 07:25 Получаем ключ API в кабинете разработчика 09:06 Получаем адрес и координаты по клику на карте 14:26 Ставим метку на карту после клика 15:17 Добавляем другие инструменты на карту 16:59 Выводим на экран координаты и адрес 24:39 Подключаем отображение панорамы 31:50 Сохраняем объекты в localStorage и отображаем в таблице 43:25 Отображаем все объекты на отдельной карте 46:16 Кто Красавчик?В этом видео разберемся как настроить fullstack jwt авторизацию, используя React и Nest Мы будем разрабатывать проект с полного нуля, создадим формы логина и регистрации на клиенте, используя React, Typescript, Zustand, And-design, Axios На стороне сервера разберемся с механизмом JWT авторизации на Nest, научимся использовать access и refresh токены, JWT стратегии, Pasport.js, а в качестве базы данных будем использовать Postgres Сценарий ролика заранее я не писал, в основном лайвкодил и потом нарезал уже видео на фрагменты Я применял каждую технологию по мере необходимости, чтобы ты мог видеть как работает каждая из них Видео получилось длинным, моменты со своими затупами и оговорками я вырезал, а вот допущенные ошибки и неверные решения я оставил, чтобы ты видел, какие проблемы возникают в процессе разработки и как их можно решить И еще, примерно первый час иногда будут возникать проблемки со звуком и моментами немного жесткая нарезка получилась, но это только в начале Готовый проекта: https://github.com/Salimov-dev/auth-project Мой ТГ: https://t.me/Rogooo Мой канал на youtube: https://www.youtube.com/@salimov-dev 03:45:51 [СЕРВЕР] Установка refreshToken в cookies 03:59:22 [СЕРВЕР] Получаем refreshToken в каждом ответе от сервера 04:05:36 [СЕРВЕР] Работаем с refreshToken и accessToken 04:13:41 [СЕРВЕР] Создание модуля для токена token и рефакторинг 04:24:10 [СЕРВЕР] Разносим модели prisma по разным файлам 04:26:27 [КЛИЕНТ] Дорабатываем http.service 04:28:43 [КЛИЕНТ] Подключение стора zustand и создание useAuthStore 04:39:00 [КЛИЕНТ] Разработка useTokenStore 04:42:00 [КЛИЕНТ] Создание отдельного сервиса authService 04:54:22 [КЛИЕНТ] Разрабатываем tokenService 04:55:39 [КЛИЕНТ] Разрабатываем userService 04:56:39 [КЛИЕНТ] Разрабатываем userStore 04:57:45 [КЛИЕНТ] Дорабатываем http.service 05:02:17 [КЛИЕНТ] Сохраняем состояние isAuth в сторе useAuthStore 05:06:28 [КЛИЕНТ] Создаем appLoader 05:07:41 [КЛИЕНТ] Выводим имя пользователя на клиенте и подключаем dropdown 05:19:03 [КЛИЕНТ/СЕРВЕР] Делаем автоматический login после регистрации 05:20:03 [КЛИЕНТ] Очищаем форму и закрываем модальное окно после запроса 05:23:21 [КЛИЕНТ] Рефакторинг 05:25:40 [КЛИЕНТ] Добавляем лоадер на имя пользователя 05:26:46 [КЛИЕНТ] Исправляем обработчик ошибок 05:28:07 [КЛИЕНТ] КонецВ этом видео разберемся как настроить fullstack jwt авторизацию, используя React и Nest Мы будем разрабатывать проект с полного нуля, создадим формы логина и регистрации на клиенте, используя React, Typescript, Zustand, And-design, Axios На стороне сервера разберемся с механизмом JWT авторизации на Nest, научимся использовать access и refresh токены, JWT стратегии, Pasport.js, а в качестве базы данных будем использовать Postgres Сценарий ролика заранее я не писал, в основном лайвкодил и потом нарезал уже видео на фрагменты Я применял каждую технологию по мере необходимости, чтобы ты мог видеть как работает каждая из них Видео получилось длинным, моменты со своими затупами и оговорками я вырезал, а вот допущенные ошибки и неверные решения я оставил, чтобы ты видел, какие проблемы возникают в процессе разработки и как их можно решить И еще, примерно первый час иногда будут возникать проблемки со звуком и моментами немного жесткая нарезка получилась, но это только в начале Готовый проекта: https://github.com/Salimov-dev/auth-project Мой ТГ: https://t.me/Rogooo Канал на youtube: https://www.youtube.com/@salimov-dev 00:00 Вступление 01:16 [КЛИЕНТ] Инициализация клиента на vite 02:50 [КЛИЕНТ] Верстка хедера, форм логина и регистрации 37:55 [КЛИЕНТ] Создание абсолютных путей для компонентов 42:41 [СЕРВЕР] Инициализация сервера на nest 47:33 [СЕРВЕР] Создание модуля авторизации auth 52:13 [КЛИЕНТ] Связываем форму регистрации с модулем авторизации 57:33 [СЕРВЕР] Установка CORS 59:50 [СЕРВЕР] Создание DTO для register 01:03:42 [СЕРВЕР] Подключение PRISMA и создание моделей в prisma 01:14:56 [СЕРВЕР] Рефакторинг 01:17:30 [СЕРВЕР] Настройка валидации через class-validator 01:21:25 [СЕРВЕР] Хеширование пароля через bcrypt 01:24:00 [СЕРВЕР] Рефакторинг 01:26:47 [СЕРВЕР] Создание модуля пользователя user 01:30:32 [СЕРВЕР] Разрабатываем user.service и user.controller 01:39:39 [СЕРВЕР] Прорабатываем метод регистрации register 01:54:14 [КЛИЕНТ] Обрабатываем ошибки в форме регистрации и выводим на экран 02:11:40 [КЛИЕНТ] Рефакторинг 02:25:00 [КЛИЕНТ] Разрабатываем метод логина 02:32:48 [СЕРВЕР] Разрабатываем метод логина 02:42:25 [СЕРВЕР] Начало работы с JWT, установка зависимостей 02:46:12 [СЕРВЕР] Реализация JWT - модель токена, функция refreshToken 02:55:46 [СЕРВЕР] Рефакторинг 03:01:42 [КЛИЕНТ] Получаем accessToken и устанавливаем его в localStorage 03:07:51 [КЛИЕНТ] Прикрепляем accessToken к каждому запросу через axios.interceptors 03:10:50 [СЕРВЕР] Реализация JWT strategy 03:24:45 [СЕРВЕР] Рефакторинг 03:31:43 [КЛИЕНТ/СЕРВЕР] Подведение кратких итогов по проделанной работе в авторизации 03:37:38 [КЛИЕНТ] Обрабатываем ошибку 401 через axios.interceptorsВ этом видео расскажу как пользоваться страницей Проработка базы объектов, как своевременно совершать звонки по нашей базе Собственников, как не упустить ни один объект из фокуса внимания Грядка ЦРМ: ridge-crm.ru Телеграм: t.me/ridge_crm VK: vk.com/ridgecrm Почта: ridge-crm@mail.ruВ этом видео расскажу как пользоваться страницей Презентация, как создавать и согласовывать новые объекты через презентацию Грядка ЦРМ: ridge-crm.ru Телеграм: t.me/ridge_crm VK: vk.com/ridgecrm Почта: ridge-crm@mail.ruВ этом видео расскажу как пользоваться страницей Команда, как добавлять пользователей, как пополнять баланс и многое другое Таймкоды: 00:00 | Интерфейс компонента 01:35 | Добавление члена команды 02:46 | Редактирование члена команды 03:36 | Пополнение баланса Грядка ЦРМ: ridge-crm.ru Телеграм: t.me/ridge_crm VK: vk.com/ridgecrm Почта: ridge-crm@mail.ru