• Как сделать удаление записи в MongoDb через n кол-во часов?

    @StepsOnes Автор вопроса
    Надеюсь кому-то поможет:

    // Shema
    import { Schema, model } from "mongoose";
    
    const TestSchema = new Schema({
        walletAddress: {
            type: String,
        },
        expireAt: {
            type: Date,
            default: Date.now,
            required: true
        }
    },)
    
    TestSchema.index( { "expireAt": 1 }, { expireAfterSeconds: 0 } );
    
    export default model('TestModel', TestSchema)
    
    // Controller
    
    class TestController {
        async add(req, res) {
            try {
                const { walletAddress, time } = req.body;
    
                const expireAt = new Date();
                expireAt.setHours(expireAt.getHours() + Number(time));
    
    
                const newWallet = await testSchema.create({
                    walletAddress,
                    expireAt
                });
    
                await newWallet.save()
    
                return res.json({newWallet})
            } catch(err) {
                console.log(err)
            }
        }
    
     
    }
    
    export default new TestController();
    Ответ написан
    Комментировать
  • Как перейти на другую страницу по якорной ссылке?

    @StepsOnes
    Для этого нужно получить текущий номер страницы из URL, затем заменить его на нужный и обновить страницу с новым URL. Можно сделать так:
    $('.scroll_link').on('click', function(e){
        e.preventDefault();
        let href = $(this).attr('href');
        let page = window.location.search.replace('?page=', '') || '1'; // получаем текущий номер страницы из URL
        let newHref = href.replace('?page=', `?page=${page}&`); // заменяем номер страницы на текущий
        window.location.href = newHref; // переходим на новую страницу
    });

    Затем, на новой странице скроллим к нужному элементу так, как было в первом примере.
    Ответ написан
    Комментировать
  • Как здать путь файлу в src = "" Spring?

    @StepsOnes
    Если вы хотите указать полный путь к файлу, то вы можете воспользоваться объектом RequestContext и получить текущий контекст запросов. Затем вы можете использовать метод getContextPath() для получения корневого пути и объединить его с путем к файлу из базы данных.

    Пример:
    <#assign requestContext = request.contextPath> //получаем корневой путь
    <#list images as image>
        <img src="${requestContext}${image.path}/${image.name}" alt="${image.originalFileName}">
    </#list>
    Ответ написан
  • Почему transitionend ломается если быстро нажимать на кнопку?

    @StepsOnes
    Проблема заключается в том, что при быстрых кликах на кнопку, очередные вызовы функции `translateY()` начинаются еще до того, как завершится предыдущая анимация (и соответственно, "transitionend" не успевает сработать). Это приводит к созданию множества слушателей события transitionend на одном элементе, что затрудняет правильную работу анимации при последующих кликах.

    Для решения этой проблемы можно добавить проверку наличия класса "translate" на элементе, перед добавлением его на кнопку. Если класс уже присутствует, то следует пропустить выполнение функции и не добавлять новый слушатель события transitionend:

    function translateY(e) {
      if (!e.classList.contains('translate')) {
        e.classList.add('translate');
        e.addEventListener('transitionend', function handler() {
          e.classList.remove('translate');
          e.removeEventListener('transitionend', handler);
        });
      }
    }


    В этом коде мы проверяем, не содержится ли наш элемент класса "translate" перед добавлением этого класса. Далее, если класса нет, то мы добавляем слушатель события transitionend, и при завершении анимации удаляем слушатель и удаляем класс "translate" с элемента.

    Такой подход обеспечивает правильную работу анимации при быстрых кликах на кнопку.

    Отмечу, что в целом, использование js для реализации простой анимации как в данном примере может считаться избыточным. В большинстве случаев, на такие анимации можно обойтись использованием только css (как вы и отметили, через псевдоклассы, например :active).
    Ответ написан
    Комментировать
  • Как отформатировать ячейки с гиперссылками?

    @StepsOnes
    Для форматирования ячеек с гиперссылками в Excel необходимо использовать специальный формат ячеек. В вашем коде вы создаете формат таблицы в переменной `table_format`, но этот формат не содержит опций для гиперссылок.

    Для создания формата ячеек с гиперссылками можно использовать следующий код:

    link_format = workbook.add_format({  # type: ignore
        'font_color': 'blue',
        'underline': 1,
        'valign': 'top',
        'text_wrap': True,
    })


    Затем, при записи данных в таблицу, можно указать этот формат для столбца с гиперссылками:

    writer.sheets[sheet_name].set_column('C:C', None, link_format)


    Эта строка кода устанавливает формат `link_format` для столбца "Ссылка" (столбец "C").

    В итоге, обновленный код будет выглядеть так:

    import pandas as pd
    
    sheet_name = 'sheet 1'
    width_list = [5, 25, 25, 15, 25, 30, 20]
    data_list = [{
        '#': 1,
        'Наименование': 'Тестовая страница 1',
        'Ссылка': 'https://test0000-link.ru/test-00001.html',
        'Автор': 'Автор 1',
        'Описание': 'Тестовое задание. Тестовое задание 1',
        'Примечание': '-',
        'E-Mail': 'не указан',
    },
        {
        '#': 2,
        'Наименование': 'Тестовая страница 2',
        'Ссылка': 'https://test0000-link.ru/test-00002.html',
        'Автор': 'Автор 2',
        'Описание': 'Тестовое задание. Тестовое задание 2',
        'Примечание': '-',
        'E-Mail': 'не указан',
    }
    ]
    
    df_ = pd.DataFrame(data_list)
    writer = pd.ExcelWriter('test.xlsx')
    workbook = writer.book
    
    header_format = workbook.add_format({  # type: ignore
        'bold': True,
        'text_wrap': True,
        'valign': 'top',
        'align': 'center',
        'fg_color': '#D7E4BC',
        'border': 1})
    
    table_format = workbook.add_format({  # type: ignore
        'valign': 'top',
        'text_wrap': True,
        'fg_color': '#E3DDDD'})
    
    link_format = workbook.add_format({  # type: ignore
        'font_color': 'blue',
        'underline': 1,
        'valign': 'top',
        'text_wrap': True,
    })
    
    df_.to_excel(writer, sheet_name=sheet_name, index=False)
    for col_num, value in enumerate(df_.columns.values):
        writer.sheets[sheet_name].write(0, col_num, value, header_format)
    
    for i in range(7):
        writer.sheets[sheet_name].set_column(i, i, width_list[i], table_format)
    
    writer.sheets[sheet_name].set_column('C:C', None, link_format)
    
    writer.close()
    Ответ написан
  • Почему-то форма не отправляет post данные?

    @StepsOnes
    В компоненте EventPostForm.vue, измените строку, которая отправляет данные на сервер, на следующую строку:

    this.$store.dispatch(actionTypes.addEvent, this.$route.params.id, {
      title: this.title,
      description: this.description,
      startDate: this.startDate,
      endDate: this.endDate
    }).then(event => {
      console.log(event);
      this.$router.push({ name: "editUser" });
    });


    Здесь store dispatch вызывает новое действие `addEvent`. Это действие принимает два аргумента: `context` и `payload`. `context` - это объект контекста, который хранит методы, геттеры, мутации и действия store. `payload` - это объект, содержащий данные, которые должны быть отправлены на сервер. В данном случае, он передает параметры события: заголовок, описание, дату начала и дату окончания.

    Кроме того, измените метод `addEvent()` файла events.js следующим образом:

    const addEvent = (id, credentials) => {
      return axios.post(`/user/${id}`, credentials);
    };
    
    export default { getEvents, addEvent };


    Здесь просто исправлено неправильное использование одинарных кавычек при указании URL запроса в фактическое использование обратных кавычек.

    После внесения этих изменений форма должна отправлять данные на сервер.
    Ответ написан
  • Как сделать галерею на css по типу Masonry?

    @StepsOnes
    Используя свойство `column-count` вы можете создавать многостолбцовые макеты (как в Masonry). Однако, по умолчанию, все элементы будут заполняться сверху вниз, а затем слева направо. Чтобы это изменить, можно задать свойства `column-fill: balance` и `break-inside: avoid-column`, которые разместят картинки по столбцам, начиная с левого столбца и заполняя равномерно по высоте.

    Вот CSS-класс для галереи на основе Masonry с горизонтальной ориентацией:

    .gallery-gallery-columns-3 {
      column-count: 4; /* Количество столбцов */
      column-gap: 1rem; /* Расстояние между столбцами */
      column-fill: balance; /* Равномерно заполнять столбцы */
    }
    
    .gallery-item {
      break-inside: avoid-column; /* Не переносить элементы на новый столбец */
      margin-bottom: 1rem; /* Расстояние между элементами */
    }


    С помощью этих свойств можно создать галерею на основе Masonry с горизонтальной ориентацией. Обратите внимание, что пример создаст четыре столбца для элементов, расстояние между столбцами составляет `1rem`, а между элементами `1rem`. Вы можете настроить эти значения под свои нужды.
    Ответ написан
    1 комментарий
  • Как написать функцию, которая вычисляет сумму чисел отрезка от -5 до 5?

    @StepsOnes
    function sumNumbers(start, end) {
      let sum = 0;
    
      for (let i = start; i <= end; i++) {
        sum = sum + i;
      }
    
      return sum;
    }
    
    console.log(sumNumbers(-5, 5)); // выводит 0
    Ответ написан
    3 комментария
  • Как в PIXI JS создать спрайт из Graphics?

    @StepsOnes
    Проблема может быть в использовании PIXI.autoDetectRenderer() и неинициализированном renderer. Насколько я понимаю, вы используете app для отрисовки спрайта и не должны использовать `renderer`, чтобы генерировать текстуру. Вместо этого вы можете использовать app.renderer, чтобы получить объект PIXI.Renderer.

    Попробуйте заменить renderer.generateTexture(graphics) на app.renderer.generateTexture(graphics). Должно выглядеть так:

    const app = new PIXI.Application({
        backgroundColor: 0xFFFFFF
    });
    
    document.body.appendChild(app.view);
    
    generateNewSprite();
    
    function generateNewSprite() {
        // Rectangle + line style 1
    
        var graphics = new PIXI.Graphics();
        graphics.lineStyle(2, 0xff0000, 1);
        graphics.beginFill(0x650A5A);
        graphics.drawRoundedRect(10, 10, 100, 100);
        graphics.endFill();
        let texture = app.renderer.generateTexture(graphics);
        texture.baseTexture.scaleMode = PIXI.SCALE_MODES.NEAREST;
        const sprite = new PIXI.Sprite(texture);
    
        sprite.anchor.set(0.5);
        sprite.scale.set(3);
        sprite.x = 0;
        sprite.y = 0;
    
        console.log("sprite x = " + sprite.x);
    
        // add it to the stage
        app.stage.addChild(sprite);
    }


    Это должно работать и отобразить на экране ваш спрайт, основанный на PIXI.Graphics
    Ответ написан
    Комментировать
  • Как на телеграф js при нажатии на кнопку дать команду боту?

    @StepsOnes
    Для того чтобы дать команду боту при нажатии на кнопку в Telegraf.js, нужно использовать метод ctx.telegram.command

    Вот пример, как это можно сделать:

    bot.action('my_button', (ctx, next) => {
      ctx.reply('Вы нажали на кнопку!');
      ctx.telegram.command('/my_command', ctx.state);
    });


    В данном примере, при нажатии на кнопку с идентификатором my_button бот отправляет пользователю ответ Вы нажали на кнопку! и выполняет команду /my_command.

    Обратите внимание, что вторым параметром метода ctx.telegram.command передаётся объект ctx.state который содержит информацию о контексте запроса (например, идентификатор пользователя). Если необходимо передать какие-то дополнительные параметры, можно использовать другой объект или добавить нужные свойства в ctx.state.

    Также стоит учитывать, что команда будет выполнена только если она зарегистрирована в боте. Поэтому перед использованием ctx.telegram.command нужно добавить обработчик для этой команды с помощью метода bot.command
    Ответ написан
    Комментировать
  • Почему бургер закрашивается?

    @StepsOnes
    button {
      border: none;
      background: transparent;
    }
    Ответ написан
    Комментировать
  • Как сделать бесконечную анимацию движения блоков справа налево?

    @StepsOnes Автор вопроса
    Спустя 2 часа поисков нашел эту статью, может кому пригодиться
    Ответ написан
    1 комментарий
  • Почему "Owl Carousel" некорректно работает на маленьком разрешении?

    @StepsOnes Автор вопроса
    Нашел проблему, указал родителю слайдера фиксированную ширину вместо max-width
    Ответ написан
    Комментировать
  • Как поставить свою 404 на GitHub Pages?

    @StepsOnes Автор вопроса
    нашел ошибку, из-за путей страница 404 к гитхабу не подключалась(
    Ответ написан
    Комментировать
  • Почему кнопка приобретает высоту?

    @StepsOnes Автор вопроса
    Я забыл, что указал родителю flex)
    Ответ написан
  • Почему у меня не отображается половина сайта, если я его запускаю не через VS code?

    @StepsOnes
    Ты наверное не правильно подключаешь css файл, попробуй подключать так - "href="./css/main.css">"
    Ответ написан
  • Почему когда загружаю сайт на хостинг плывут стили?

    @StepsOnes Автор вопроса
    Проблема была в кэше браузера)
    Ответ написан
    Комментировать