Михаил Воронов
Веб-разработчик №1*

Список оказываемых услуг

  • Разработка веб-приложений «под ключ» (сайты, админки, ...)
  • Разработка серверной части с REST-интерфейсом (+ документация)
  • Разработка коннекторов для разноплановых API интеграций (автоматизация бизнесс-процессов)
  • Разработка модулей для проектов на базе Laravel / WordPress / OpenCart
  • Разработка Chat Bots / Mini Apps для Telegram

Преимущества работы со мной

  • Индвидуально подхожу к работе с каждым клиентом
  • Строго соблюдаю оговоренные сроки
  • Пишу код согласно стандартам и лучшим практикам
  • При разработке тщательно продумываю архитектуру и логику
  • Оказываю последующую техническую поддержку собственного кода

Перечень технологий используемых при разработке

  • Нативные: PHP, HTML, CSS, JavaScript
  • Фреймворки: Laravel, Vue, Bootstrap
  • Базы данных: MySQL, SQLite, MongoDB
  • Шаблонизаторы: Blade, Twig
  • Интерфейсы: REST, SOAP, GraphQL
  • Прочее: Redis, Sphinx, FFmpeg

Отзывы

Сергей Васьков - 30.09.2024
за выполнение заказа Написать JS скрипт-калькулятор для добавления в корзину
Все чётко и быстро, комментарии и пожелания были учтены. Скрипт работает как задумывалось. Рекомендую.
Никита Белозёров - 30.09.2024
за выполнение заказа Нужно исправить ошибку при входе на сайт
Выполнено быстро. Всем доволен. Всем советую.
Илья Кочкин - 27.02.2024
за выполнение заказа JavaScript для гугл таблиц
Отличный специалист, все прошло хорошо.
Александр Белоусов - 26.02.2024
за выполнение заказа Настроить MongoDB на сервере для продакшена
Спасибо за работу, работа была сделана быстро и качественно.
Эдуард Ильиных - 15.02.2024
за выполнение заказа Доработать скрипт, который передает данные с формы в amoCRM
Отлично выполнена задача. Быстро, качественно. Рекомендую.
Читать все отзывы

Портфолио

Калькулятор стоимости полиса ОСАГО
Калькулятор стоимости полиса ОСАГО
Многоступенчатый фильтр подбора аккумулятора для OpenCart
Многоступенчатый фильтр подбора аккумулятора для OpenCart
Подключение и настройка поискового движка Sphinx
Подключение и настройка поискового движка Sphinx
Автоматизация действий в системе МойСклад
Автоматизация действий в системе МойСклад
Смотреть все работы

Примеры кода

HTML
CSS
JS
PHP
<!DOCTYPE html>
<html lang="ru">
    <head>
        <title>Курс рубля по отношению к выбранной валюте</title>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta name="robots" content="noindex, nofollow">
        
        <link rel="stylesheet" href="./common.css">
    </head>
    <body>
        <p>Выберите валюту и нажмите на кнопку:</p>
        <p>
            <select name="currency">
                <option value="">---</option>
                <option value="AUD">Австралийский доллар</option>
                <option value="AZN">Азербайджанский манат</option>
                <option value="GBP">Фунт стерлингов Соединенного королевства</option>
                <option value="AMD">Армянских драмов</option>
                <option value="BYN">Белорусский рубль</option>
                <option value="BGN">Болгарский лев</option>
                <option value="BRL">Бразильский реал</option>
                <option value="HUF">Венгерских форинтов</option>
                <option value="HKD">Гонконгских долларов</option>
                <option value="DKK">Датских крон</option>
                <option value="USD">Доллар США</option>
                <option value="EUR">Евро</option>
                <option value="INR">Индийских рупий</option>
                <option value="KZT">Казахстанских тенге</option>
                <option value="CAD">Канадский доллар</option>
                <option value="KGS">Киргизских сомов</option>
                <option value="CNY">Китайских юаней</option>
                <option value="MDL">Молдавских леев</option>
                <option value="NOK">Норвежских крон</option>
                <option value="PLN">Польский злотый</option>
                <option value="RON">Румынский лей</option>
                <option value="XDR">СДР (специальные права заимствования)</option>
                <option value="SGD">Сингапурский доллар</option>
                <option value="TJS">Таджикских сомони</option>
                <option value="TRY">Турецкая лира</option>
                <option value="TMT">Новый туркменский манат</option>
                <option value="UZS">Узбекских сумов</option>
                <option value="UAH">Украинских гривен</option>
                <option value="CZK">Чешских крон</option>
                <option value="SEK">Шведских крон</option>
                <option value="CHF">Швейцарский франк</option>
                <option value="ZAR">Южноафриканских рэндов</option>
                <option value="KRW">Вон Республики Корея</option>
                <option value="JPY">Японских иен</option>
            </select>
            = <span id="rub-value">???</span> RUB
        </p>
        <p><button type="button" name="get_course">Получить курс</button></p>

        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <script src="./init.js"></script>
    </body>
</html>
@import url('https://fonts.googleapis.com/css?family=Roboto:400,700');

body {
    margin: 0;
    padding: 10px 20px;
    font-family: Roboto, Arial, sans-serif;
    font-size: 14px;
    line-height: 19px;
}
p {
    margin: 10px 0;
}
select {
    width: 190px;
}
button {
    margin-top: 5px;
}
$('button[name="get_course"]').on('click', function () {
    let currency = $('select[name="currency"]').val();
    
    if (! currency) {
        alert('Выберите валюту.');
        return;
    }
    
    $('#rub-value').text('???');
    $('button[name="get_course"]')
        .prop('disabled', true)
        .data('text', $('button[name="get_course"]').text())
        .text('Выполняем...');
    
    $.get('./get_course.php', {
        currency: currency
    }, function(result) {
        if (result.error) {
            alert(result.error);
        } else {
            $('#rub-value').text(result.data);
        }
    }, 'json').done(function() {
        $('button[name="get_course"]')
            .prop('disabled', false)
            .text($('button[name="get_course"]').data('text'));
    });
});
<?php

/**
* Get content by CURL
* 
* @param string $url
* @return string|null
*/
function getContent($url): ?string
{
    $curlOptions = [
        CURLOPT_URL => $url,
        CURLOPT_SSL_VERIFYHOST => false,
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_CONNECTTIMEOUT => 10,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_RETURNTRANSFER => true
    ];
    
    $curlHandler = curl_init();
    curl_setopt_array($curlHandler, $curlOptions);
    $content = curl_exec($curlHandler);
    $httpCode = curl_getinfo($curlHandler, CURLINFO_HTTP_CODE);
    curl_close($curlHandler);
    
    if ($httpCode != 200) {
        return null;
    }
    return $content;
}

$output = [];
$currency = $_GET['currency'] ?? null;

if (! $currency) {
    $output['error'] = 'Валюта не выбрана.';
} else {
    $data = getContent('https://www.cbr.ru/scripts/XML_daily.asp?date_req=' .
        date('d/m/Y', strtotime('+1 day'))
    );

    if (! $data) {
        $output['error'] = 'Данные не могут быть получены! Повторите попытку позднее.';
    } else {
        $xml = simplexml_load_string($data);
        
        foreach ($xml->Valute as $valute) {
            if ($valute->CharCode == $currency) {
                $value = (float) str_replace(',', '.', $valute->Value);
                $value = round($value, 2);
                $output['data'] = str_replace('.', ',', $value);
                
                break;
            }
        }
        
        if (! isset($output['data'])) {
            $output['error'] = 'Валюта не найдена!';
        }
    }
}

echo json_encode($output);
Данный код получает текущий курс рубля по отношению к выбранной валюте, используя XML-API ЦБ РФ.
Код полностью рабочий. Демо-версия примера доступна по ссылке https://voronoff.dev/demo/index.html