• Какими способами можно получить первое попавшееся изображение?

    Vertenz
    @Vertenz
    Мечтетель
    Самый простой способ это добавить поле на бэке в основное тело сущности при учете определенных фильтров, например цвета. И надо декомпозировать, чтобы не тащить все вплоть до изображения. Не очень понятно что значит перво попавшуюся, вряд ли же подойдут и из других товаров и ведь нужно отталкиваться от правильно выбранного цвета?

    Но если ответ всегда такой, то можно так, возьмем для пример один из присланных вами товаров и распарсим.
    const jsonString = `{"items":[{"id":2,"title":"Футболка","slug":"futbolka","price":1000,"colors":[{"id":77,"color":{"id":27,"title":"white","code":"#ffffff"},"gallery":[{"file":{"url":"ссылка на изображение","name":"36efa79c31cb4400f8f9ce69a7d6f6a6.png","originalName":"Rectangle 13++.png","extension":"png","size":"63.5 Кб"}}]}],"seasons":[{"id":3,"title":"Лето","code":"summer","productsCount":10}],"materials":[{"id":1,"title":"Хлопок","code":"cotton","productsCount":6},{"id":2,"title":"Шерсть","code":"wool","productsCount":4}]}]}`;
    
    const data = JSON.parse(jsonString);
    
    // дальше перебором ищем где есть изображение
    if (data?.items[0]?.colors.length) {
    for (let i = 0; i <= data.items[0].colors.length; i++) {
       // проваливаемся в еще один цикл уже на элементы в gallery, и там ищем url, и если есть то заканчиваем цикл через r
       for (let j = 0; j <= data.items[0].colors[i].length; j++) {
         //и еще цикл на галерии
       for (let n = 0; n <= data.items[0].colors[i].gallery.length; j++) {
         if (data?.items[0]?.colors[i]?.gallery[n]?.url) {
         return data.items[0].colors[i].gallery[n].url;
       }
    }
    
       }
    }
    }
    
    // не забудьте дописать выход из всех циклов

    но это выглядит очень странно, можно еще чрез forEach, но его не оставить, тч если будет миллион товаров то все упадет

    items.forEach(item => {
      const keys = Object.keys(item);
      let imageKey = '';
    
      keys.some(key => {
        if (typeof item[key] === 'object' && item[key] !== null) {
          const subkeys = Object.keys(item[key]);
          const file = subkeys.find(subkey => {
            if (typeof item[key][subkey] === 'object' && item[key][subkey] !== null) {
              return item[key][subkey].hasOwnProperty('url');
            }
            return false;
          });
          if (file) {
            imageKey = key;
            return true;
          }
        }
        return false;
      });
    
      return `${item.title}"  "${imageKey}`; 
    // можно дальше делать что угодно с ключем или сразу брать изображение 
    });


    Но честно говоря я бы еще раз подумал над ТЗ :) И точно бы вел довел бы до дочернего элемента только содержимое gallery и тогда можно обойтись без этих безумств. И проверить уже только элементы внутри gallery
    Ответ написан
  • Нужно ловить динамическую информацию, которая подгружается на сайт?

    Vertenz
    @Vertenz
    Мечтетель
    Если я правильно понял задачу, то можно дождаться появления дерева и элементов нужных вам. Но придется всегда знать класс (и под каким он индексом) или id или data. Дальше берем этот элемент, проверяем есть ли он, после того как находим берем данные из всех дочерних узлов.
    Можете вставить этот код в консоль в браузере чтобы проверить.
    const arr = document.getElementsByClassName('seller-details__parameter');
    (function traverse(node = arr[0]) {
      // Проверяем тип узла, чтобы получить только текстовые узлы
      if (node.nodeType === Node.TEXT_NODE && node.textContent.trim() !== '') {
        console.log(node.textContent);
      }
      // Рекурсивно обходим все дочерние узлы
      node.childNodes.forEach(traverse);
    })();
    Ответ написан
    2 комментария
  • Как отключить CORS в NUXT?

    Vertenz
    @Vertenz
    Мечтетель
    Дело в разных портах, доступ должен все равно работать если разрешен. Проверьте через разрешение всему, будет ли работать, тут отвечал как дать такой доступ :)
    Если очень хочется именно в накст то можно использовать этот пакет, но решение плохое, так как вы перекладываете логику серверной части на фронт.
    const cors = require('cors');
    
    module.exports = {
      serverMiddleware: [
        cors()
      ]
    }


    Так же можно добавить проксирование в накст. Но я бы все же начал с того, чтобы дать доступ * (всему) и попробовал бы так. Если не подходит то добавляйте скрин ошибки, может что-то по мимо междоменного еще
    Ответ написан
    Комментировать
  • Как убрать все после слова регулярным выражением?

    Vertenz
    @Vertenz
    Мечтетель
    Для примера с датой, можно разбить на такой паттерн ^ - начало строки \d{2} - две цифры (день месяца) \s - пробельный символ \w+ - одно или более словесных символов (месяц). Но только в том случае если всегда повторяющийся.
    const dateStr = '02 апреля, 21:10';
    const dateRegex = /^(\d{2}\s\w+)/;
    const match = dateStr.match(dateRegex);
    
    if (match) {
      const date = match[1];
      console.log(date); // '02 апреля'
    }


    Для самары можно разбить на сам город, \s* - пробелы, (.*) - все после. Если Самара тоже динамический параметр и вам есть откуда его барть, то можно сохранять в переменную и добавлять в регулярку.
    const str = 'Алабинскаяот 31 мин.Российскаяот 31 мин.Московскаяот 31 мин.Самарская область, Самара, Буянова ул. , 42';
    const regex = /Самара,\s*(.*)/;
    const match = str.match(regex);
    
    if (match) {
      const result = match[1];
      console.log(result); // 'Буянова ул. , 42'
    }
    Ответ написан
    4 комментария
  • Parrot os не работает звук, как исправить?

    Vertenz
    @Vertenz
    Мечтетель
    Довольно сложно без логов, но может приблизит к решению)
    Проверьте выход для наушников на всякий случай.
    Убедитесь, что звуковая карта настроена на правильное устройство ввода и вывода. Вы можете проверить это, открыв Панель управления -> Звук.
    Проверьте уровень громкости звука в настройках системы и в самом приложении, из которого вы пытаетесь воспроизвести звук.
    Если у вас установлена нестандартная звуковая карта или драйвер, попробуйте переустановить драйвера или загрузить последнюю версию.
    Если ничего из вышеперечисленного не сработало, попробуйте установить пакет alsa-utils и запустить alsamixer в терминале, чтобы проверить настройки звука.
    Если все еще не работает, попробуйте проверить журналы системы, чтобы увидеть, есть ли какие-либо ошибки связанные с аудио.
    Ответ написан
    3 комментария
  • Какие медиа-запросы в CSS использовать для адаптации под планшеты?

    Vertenz
    @Vertenz
    Мечтетель
    Зависит от задачи, по мимо разрешения экрана, а это уже точно 1240 (за счет айпадов) и до примерно 765.
    Так же стоит определять тач скрин если от этого
    @media (hover: none) {
      /* Стили для устройств с тачскрином */
    }


    а по поводу размеров
    @media (min-width: 765px) and (max-width: 1240px) {
      /* Стили для планшетов */
    }
    Ответ написан
    Комментировать
  • Как вставить готовый iframe в шаблон Vue3/Nuxt3?

    Vertenz
    @Vertenz
    Мечтетель
    есть несколько вариантов, во-первых, вам надо вставить ссылку в фрем, и так можно избежать v-html
    <iframe :src="iftame.src"></iframe>

    Либо попробовать через otherHTMl

    const iframe = myapi.getIframe()
        const iframe = response.data.outerHTML
        return { iframeHtml }
    Ответ написан
    Комментировать
  • Как в nuxt3 подключить базу данных?

    Vertenz
    @Vertenz
    Мечтетель
    Надеюсь правильно понял вопрос:) Nuxt 3 использует свой fetch и свои настройки, но чтобы было привычнее и проще поддерживать можно использовать axios, как минимум больше найдете информации.
    modules: [
        '@nuxtjs/axios',
      ],
      axios: {
        baseURL: 'https://my-rds-endpoint.amazonaws.com',
        credentials: true,
        auth: {
          username: 'db-username',
          password: 'db-password',
        },
        headers: {
          'Content-Type': 'application/json',
        },
      },


    в зависимости от того какой стиль вы используете и на каком этапе вам это нужно вы можете использовать аксиос (далее больше псевдокод для примера)
    const { data } = await $axios.get('/my-data')
      return { myData: data }
    Ответ написан
    Комментировать
  • Как динамически импортировать EditorJS в Vue 3?

    Vertenz
    @Vertenz
    Мечтетель
    можно попробовать через определение того что процесс на клиенте
    if (process.client) {
      import('editorjs').then(EditorJS => {
        // Здесь можно использовать EditorJS
        const editor = new EditorJS(/* настройки */);
      });
    }
    Ответ написан
    Комментировать
  • После перехода на vite появилась ошибк Cannot access 'Layout' before initialization?

    Vertenz
    @Vertenz
    Мечтетель
    если у вас хранятся правльно лейауты, то нужно просто передавать имя.
    layout: 'default',
    Ответ написан
    Комментировать
  • Как сделать custom input на vue3?

    Vertenz
    @Vertenz
    Мечтетель
    Крестик оберуть в transition, задать стили. Повесть v-if на блок с крестиком, который проверяет есть ли что-то в инпуте.
    Дальше повесить @click на крестик. И при клике изменять данные на пустоту.
    Без кода не очень понятна вложенность у вас, но есть что просто передавайте события через emit
    Ответ написан
    Комментировать
  • Как подключить Vuetify к Nuxt?

    Vertenz
    @Vertenz
    Мечтетель
    В первую очередь проверьте все ли пакеты загружены и vuetify есть в
    package.json

    Если у вас nuxt 3, то вам нужно его подключить через плагины.
    В папке
    plugins
    создать
    vuetify.js
    (название можно менять).
    import { createVuetify, ThemeDefinition } from "vuetify";
    import {
    VApp,
    } from "vuetify/components";
    
    export default defineNuxtPlugin((nuxtApp) => {
      const vuetify = createVuetify({
        locale: {
          fallback: "ru", // локаль если нужны переключения языков
        },
        theme: {
     // тут кастомные темы
        },
        components: {
          VApp, // тут компоненты вьютифая
        },
        ssr: true, // nuxt 3 - ssr
      });
    
      nuxtApp.vueApp.use(vuetify);
    });


    так же в
    nuxt.cinfig.ts
    вам понадобиться добавить стили вьютифая и при билде сам пакет

    css: [
        "vuetify/lib/styles/main.sass",
        "@mdi/font/css/materialdesignicons.min.css", // если нужны mdi
      ],
    
      build: {
        transpile: ["vuetify"],
      },


    Если nuxt 2 то пять плагин
    import Vue from 'vue'
    import Vuetify from 'vuetify'
    import 'vuetify/dist/vuetify.min.css'
    
    Vue.use(Vuetify)
    
    export default new Vuetify({
      icons: {
        iconfont: 'mdi'
      }
    })


    Добавляем в конфиг
    export default {
      plugins: [
        { src: '~/plugins/vuetify.js' }
      ]
    }


    также нужно импортировать CSS-файл Vuetify в свой проект, как указано в vuetify.js. Если вы используете Sass или Less, вы можете импортировать их в свой файл стилей вместо CSS-файла.
    Ответ написан
    Комментировать
  • Как правильно общаться с базой данных во Vue?

    Vertenz
    @Vertenz
    Мечтетель
    Если правильно понял задачу) То у вас идет авторизация, дальше получили данные о пользователе. Чтобы не тащить их во все нужные компоненты то их можно сохранить в стор. Дальше просто при перезагрузке приложения или в необходимых для вас случаях вы можете проверять время изменения данных на бэке и у вас (или какой-то id изменения), чтобы понять нужен ли новый запрос.
    Ответ написан
  • Как передать blob объект на сервер?

    Vertenz
    @Vertenz
    Мечтетель
    Если правильно понял, то есть на фронте форма с инпутом файла, и его надо отправить на бэк?
    И если да, то сперва надо получить файл
    this.file = event.target.files[0]; //можно через реф при нажатии на кнопку отправить если не нужны проверки

    Потом нужно создать форму, добавить туда поле с правильным именем (проверьте доку или уточни у бэка), и дальше пост по нужному пути
    conts formData = new FormData();
          formData.append('правильное_имя_ключа', this.file);
    
          axios.post('правильный_путь', formData, {
            headers: {
              'Content-Type': 'multipart/form-data'
            }
          }).then(response => {
            // что-то отобразить при успешной отправке
          }).catch(error => {
            // что-то отобразить при ошибке
          });
    Ответ написан
    1 комментарий
  • Ошибка eslint,ошибка есть-но ошибку по какой-то причине не выводит?

    Vertenz
    @Vertenz
    Мечтетель
    а это вся ошибка которую отдает линт? и настроен ли в редакторе кода линт, так можно посмотреть хотя бы строчку на которую ругается? Может ругаться на |. Проверь так
    <template>
      <div class="navbar">
        <nav>
          <router-link to="/">Home</router-link> | <router-link to="/about">About</router-link> | <router-link to="/test">Test</router-link>
        </nav>
      </div>
    </template>
    Ответ написан
    Комментировать
  • Npm install завершается "Killed". В чем может быть проблема?

    Vertenz
    @Vertenz Автор вопроса
    Мечтетель
    Спасибо стаку 38127667/npm-install-ends-with-killed :)
    Проблема в нехватке памяти. Решилось все добавлением файла подкачки на 1гб. Делал через fallocate, так как не знал, точно ли в этом проблема.
    Ответ написан
    Комментировать
  • Ошибка значения: background-color Неправильная функция RGB ). Почему валидатор CSS ругается на переменную?

    Vertenz
    @Vertenz
    Мечтетель
    Скорее всего ожидается на входе значение rgb, а не ссылка на переменную. Так в целом должно все у вас работать https://jsfiddle.net/jhw75cmL/
    Ответ написан
    1 комментарий
  • При работе ноутбука бывают щелчки, что это может быть?

    Vertenz
    @Vertenz
    Мечтетель
    Если очень кратко то, лучше в сервисный или лично (но посмотреть хотя бы несколько видео перед разбором и быть очень аккуратной с шлейфами), или просто забить, если не мешает.

    Стук есть всегда?
    При запуске чего-то, что загружает видеокарту (игры, 3д моделирование и тд) чаще ли звук, меняется ли?
    Какого типа диск, hhd или ssd?

    Простите за вопрос, но зачем хранить гарантию, если вы не отдадите его в сервисный центр? Если переживаете за детали, то запишите просто все, что у вас установлены. (Какая у вас ОС? Могу подсказать, как найти данные о комплектующих) Запишите среднюю температуру, чтобы понять не украли ли кулеры. Отдавайте в центр, а после сверьте с вашими записями. Можете там еще пригрозить, что все записали.
    Ответ написан
    6 комментариев
  • Почему не работает отправка сообщения с сайта?

    Vertenz
    @Vertenz
    Мечтетель
    Проверьте smtp ssl яндекса, и на всякий случай подключите язык
    <?php
    
    $name = $_POST['name'];
    $email = $_POST['email'];
    $msg = $_POST['message'];
    
    require_once('phpmailer/PHPMailerAutoload.php');
    $mail = new PHPMailer;
    $mail->CharSet = 'utf-8';
    //тут бы я добавил еще язык/ Путь, само собой, зависит от установки
    $mail->setLanguage('ru', '../vendor/phpmailer/phpmailer/language');
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;
    
    $mail->isSMTP(); 
    $mail->Host = 'imap.yandex.ru'; //тут скорее 'ssl://smtp.yandex.ru' проверьте на сайте яндекса
    $mail->SMTPAuth = true; 
    $mail->Username = 'artur**********@yandex.ru'; 
    $mail->Password = '***********; 
    $mail->SMTPSecure = 'ssl'; 
    $mail->Port = 465;
    
    $mail->setFrom('test@domain.ru', 'Иван Обрамов'); 
    $mail->addAddress('artur.sidorenko.02@mail.ru', 'Артур Сидоренко'); 
    //$mail->addAddress('ellen@example.com'); 
    //$mail->addReplyTo('info@example.com', 'Information');
    //$mail->addCC('cc@example.com');
    //$mail->addBCC('bcc@example.com');
    //$mail->addAttachment('/var/tmp/file.tar.gz'); 
    //$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); 
    $mail->isHTML(true); 
    
    $mail->Subject = 'Данные';
    $mail->Body = '
    Пользователь оставил данные
    
    Имя: ' . $name . '
    
    E-mail: ' . $email . ''; '
    
    Сообщение: ' . $message . '';
    
    if(!$mail->send()) {
    return false;
    } else {
    return true;
    }
    
    ?>
    Ответ написан
    4 комментария
  • Как исправить CORS ошибку?

    Vertenz
    @Vertenz
    Мечтетель
    Сервер локальный?
    В настройках сервера надо указать прием заголовков, вот несколько примеров (на всякий случай напишу с разрешенными всеми заголовками, измените для себя на те, что нужны именно вам):
    • nginx:
      if ($request_method = 'OPTIONS') {
              add_header 'Access-Control-Allow-Origin' '*';
              add_header 'Access-Control-Allow-Headers' '*';
              ddd_header 'Access-Control-Allow-Methods', '*';
              return 204;
           }
           if ($request_method = 'POST') {
              add_header 'Access-Control-Allow-Origin' '*';
              add_header 'Access-Control-Allow-Headers' '*';
              ddd_header 'Access-Control-Allow-Methods', '*';
           }
           if ($request_method = 'GET') {
              add_header 'Access-Control-Allow-Origin' '*';
              add_header 'Access-Control-Allow-Headers' '*';
              ddd_header 'Access-Control-Allow-Methods', '*';
           }


    • node.js: res.header('Access-Control-Allow-Methods', '*');
    • php:
      header('Access-Control-Allow-Origin: *');
      header('Access-Control-Allow-Methods: *');



    если не поможет присылайте результат, попробуем разобраться
    Ответ написан
    1 комментарий