Задать вопрос
  • Как правильно спроектировать БД?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Контакты и специализации стоит вынести в отдельные таблицы, их может быть много у одного предприятия.
    Для реализации расписания по минимуму надо таблицу с id адреса предприятия (разные точки могут иметь разное расписание), днём недели (INT), началом и окончанием работы в эти дни (TIME), началом и окончанием обеденного перерыва (TIME). Плюс аналогичную таблицу исключений, где вместо дня недели поле даты (DATE).
    Ответ написан
    5 комментариев
  • Почему ВК api возвращает ошибку Error 5: User authorization failed: no access_token passed?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Стоит ознакомиться с API ВКонтакте по их статье.

    Ваше сообщение об ошибке однозначно указывает на её причину: User authorization failed: no access_token passed. – не авторизовать пользователя, выполняющего запрос по причине отсутствия access_token'а (ключа доступа).

    Для выполнения friends.get() требуется ключ ("access_token") либо сервисный – из настроек созданного вами Приложения ВК; либо пользователя – полученный в результате диалога авторизации пользователя.

    Также обязательно стало указывать используемую версию API, параметр v. Сейчас актуальная версия 5.74

    Чтобы просто попробовать, создайте приложение типа standalone и скопируйте из его Настроек значение Сервисного ключа:
    скрин
    5af6a32ecd7c0965325530.png

    В итоге ваш запрос будет выглядеть примерно так:
    https://api.vk.com/method/friends.get?user_id=babegone&v=5.74&access_token=supersecretsupersecret
    Ответ написан
    6 комментариев
  • Как отлавливать все ошибки, чтобы приложение не останавливалось?

    VoidVolker
    @VoidVolker Куратор тега JavaScript
    Dark side eye. А у нас печеньки! А у вас?
    Добавить блоки try-catch в критичных местах - особенно на операциях ввода/вывода. Так же следует отловить конкретно эту ошибку и выяснить где именно она возникает. Есть возможность отлова глобальных ошибок:
    https://nodejs.org/api/process.html#event-uncaught...
    process.on('uncaughtException', (err, origin) => { ... });

    Плюс, есть такие полезные утилиты, как PM2 например, которые позволяют автоматически перезапускать приложение в случае падения.
    Ответ написан
    1 комментарий
  • Какой почтовый сервис указывать для Яндекса в nodemailer?

    mahmudchon
    @mahmudchon
    Можете указать как Yandex, в списке он есть - https://nodemailer.com/smtp/well-known/
    Также такая реализация, на случай, если нет оф. поддержки.
    const transporter = nodemailer.createTransport({
        host: "smtp.yandex.ru",
        port: 465,
        secure: true, // true for 465, false for other ports
        auth: {
          user: "user", // generated ethereal user
          pass: "pass" // generated ethereal password
        }
      });
    Ответ написан
    Комментировать
  • Как правильней хранить и обновлять JWT для аутентификации?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Каждый JWT-токен это три блока - заголовок, полезная нагрузка и подпись. В заголовке хранится информация о самом токене (срок жизни, алгоритм подписи). Полезная нагрузка - информация приложения. Подпись - зашифрованный хэш первых двух частей. В распределённых системах выдавать токен может сервер авторизации, а использовать любой другой сервер. В таком случае подпись может быть асимметричной, закрытый ключ для подписания, открытый для проверки.

    Токены выдаются парой, рабочий + обновления.

    Рабочий токен выдаётся на короткое время (минуты - десятки минут). Внутри содержится срок окончания действия токена, идентификатор пользователя, его права, какая-то информация для минимизации обращений к БД по данному пользователю. Токен на сервере не сохраняется.

    Токен обновления выдаётся на длительное время (часы - дни). Внутри содержится срок окончания действия токена и идентификатор пользователя для автоматической аутентификации. Токен обновления (или его идентификатор, если он есть в токене) хранится в БД вместе с идентификатором пользователя.

    1. Клиент аутентифицируется/авторизуется на сервере со своим логином/паролем.
    2. Сервер генерирует пару токенов, короткоживущий рабочий и долгоживущий для обновления. Токен обновления записывается в БД.
    3. Клиент присылает запрос с рабочим токеном.
    4. Сервер проверяет токен.
    4а. Токен действительный и неистекший, сервер отвечает на запрос.
    4б. Токен действительный, но истекший, сервер сообщает о необходимости обновления токена.
    4в. Токен недействительный, сервер сообщает о необходимости входа по логину/паролю (на п.1).
    5. Клиент присылает токен обновления.
    6. Сервер проверяет токен, в том числе и в БД.
    6а. Токен обновления недействительный, сервер сообщает о необходимости входа по логину/паролю (на п.1).
    6б. Токен обновления действительный, но в БД отсутствует, сервер удаляет все токены обновления этого пользователя из БД и сообщает о необходимости входа по логину/паролю (на п.1).
    6в. Токен обновления действительный, но просроченный, сервер удаляет этот токен из БД и сообщает о необходимости входа по логину/паролю (на п.1).
    6г. Токен обновления действительный, непросроченный, в БД присутствует. Сервер удаляет этот токен из БД, генерирует новую пару, записывает новый токен обновления в БД и отправляет токены клиенту (на п.3).
    Ответ написан
    Комментировать
  • Как изменить ответ валидатора class-validator при валидации запроса?

    @lookingfor2 Автор вопроса
    // main.ts точка входа
    async function bootstrap() {
      const app = await NestFactory.create(AppModule, { cors: true });
    
      // We'll start by binding ValidationPipe at the application level,
      // thus ensuring all endpoints are protected from receiving incorrect data.
      app.useGlobalPipes(
        new ValidationPipe({
          exceptionFactory: (errors: ValidationError[]) => {
            return new BadRequestException(formatErrorsHelper(errors));
          },
        }),
      );
      // swagger
      const config = new DocumentBuilder()
        .setTitle('Salary365 manager API')
        .setDescription('Salary365 manager API description')
        .setVersion('1.0')
        .addBearerAuth(
          { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
          'access-token',
        )
        .build();
      const document = SwaggerModule.createDocument(app, config);
      SwaggerModule.setup('/api', app, document);
      // start listen and serve port from env
      await app.listen(process.env.APP_PORT);
    }

    // хелпер для мутации ответа
    import { ValidationError } from '@nestjs/common/interfaces/external/validation-error.interface';
    
    export const formatErrorsHelper = (errors: ValidationError[]) =>
      errors.map((item) => ({ [item.property]: Object.values(item.constraints) }));
    Ответ написан
    Комментировать
  • Как исправить ошибку "src refspec master does not match any"?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Нет ветки master, вот и ругается. Ветка по умолчанию на GitHub теперь называется main.

    Команда git branch -vv покажет какие ветки есть локально и с какими внешними ветками связаны.
    * main 0e02250 [origin/main] v.01

    Надо было делать git push origin main
    Либо просто git push т. е. отправить текущую ветку в связанную с ней ветку на внешнем репозитории.
    В нашем случае текущая ветка main (помеченная звёздочкой)
    отслеживает исходную ветку main в репозитории обозначенном как origin

    Что скрывается за сокращением origin покажет команда git remote -v
    origin	https://github.com/xxx/xxx.git (fetch)
    origin	https://github.com/xxx/xxx.git (push)
    Ответ написан
    Комментировать
  • Навигация по pgAdmin 4, просмотр записей таблиц?

    @mezhuev
    Системный администратор
    Через контекстное меню таблицы:
    4038b3f76392a2db5481262932949bcf.png
    Ответ написан
    5 комментариев
  • Как работать с confirm в react?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Итого (из комментариев) у топик-стартера настроен eslint и + ошибка в коде.
    Решение:
    1) использовать window.confirm вместо confirm
    2) передавать index (сейчас он у вас undefined)
    Ответ написан
    1 комментарий
  • Как пофиксить: Cannot find module 'widgets/example.scss' or its corresponding type declarations?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    В корне проекта создайте файл с расширением .d.ts так чтоб имя не совпадало с другими файлами по соседству, например global.d.ts и пропишите там следующее:
    declare module '*.scss' {
      const classNames: Record<string, string>;
      export default classNames;
    }
    Ответ написан
    1 комментарий
  • Как управлять ролями и правами Laravel 5 и VUE.JS?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Реализуется легко:

    на беке юзаете баунсер + $this->authorize/Gate::allows и проверяете нужные права, вне зависимости от фронта.
    на фронт с бека передаете берете массив пермишенов (абилитис в баунсере), в том же месте, где передаете юзера (не важно, отдельным запросом или сразу при загрузке страницы). Пишите во vuex'е нужные геттеры, как пример из моего проекта:

    export const can = (state) => (perm) => this.loggedIn(state) && state.authUser.abilities.includes(perm);
    export const canAny = (state) => (perms) => perms.some(x => this.can(state)(x));


    И юзаете директивы где нужно, предварительно импортнув нужные геттеры:

    v-if="can('chat.mute')"

    PS: не стоит писать свои директивы "v-can", ибо:
    1) они не информативны (непонятно, что они делают, если прав нет)
    2) прийдется написать с десяток таких, на все случаи жизни, типа "can-show", "can-if" и прочая лабудень.

    PS2: про "переход по страницам" и любые запросы на бек - ларавель сам кинет forbidden 403, проверяете интерцептором в axios'е на этот статус и кидаете на страницу с ошибкой/показываете окошко/нотификацию/птичку/кошку.
    Ответ написан
    Комментировать
  • Как во vue выводить динамические картикни из assets?

    @bagzon
    Backend PHP, NodeJs, JS
    Картинки должны быть статикой и никак не касаться фронта, я про разные require и другие костыли.
    На фронте должны известны только имена, и по относительному пути подсасываться (тупо подставлять в тег img src), они автоматически загрузятся браузером по указаному пути http: site.ru/public/image1.jpg
    Ответ написан
    Комментировать
  • Как во vue выводить динамические картикни из assets?

    Варианты есть:
    https://medium.com/front-end-weekly/webpack-and-dy...
    https://dev.to/pldg/lazy-load-images-with-webpack-5e80

    Но я бы порекомендовал вам такие картинки просто копировать кучей (папка public если используете vue-cli), а не импортировать с помощью webpack.
    А ещё лучше пересмотреть кейс. Динамичные картинки в неограниченном количестве скорее всего должны быть не частью интерфейса приложения, а где-то куда-то заливаться и приходить только в виде ссылок от серверного API.
    Тот же слайдер - в админке администратор загружает картинки, а приложение получает данные для слайдера и рендерит.
    Ответ написан
    Комментировать
  • Как во vue выводить динамические картикни из assets?

    @skuvaWeb
    Самый простой, и как по мне правильный вариант это
    data() {
        return {
            slides: [
                {image: require('@/assets/image1.jpg')},
            ]
        }
    }
    Ответ написан
    Комментировать
  • Как добавить пробелы между тысячными?

    @dev-sasha
    const numb = 1234567;
    const numbFmt = new Intl.NumberFormat('ru-RU').format(numb);
    console.log('Отформатированное число: ' + numbFmt); // 1 234 567


    const numb = 1234567;
    const numbFmt = numb.toLocaleString('ru-RU');
    console.log('Отформатированное число: ' + numbFmt);  // 1 234 567
    Ответ написан
    Комментировать
  • Как вернуть ответ валидатора Request в Ларавел в json?

    @jazzus
    LaravelRequest автоматом вернет ошибки и код в ответе. Т.е. можно не писать велосипеды.

    Достать ошибки в js скрипте (фреймворк VUE)
    // аякс запрос
    .catch((error)=> {
      this.errors = error.response.data.errors;
    });

    подсчитать ошибки в computed
    errors_count: function () {
       return Object.keys(this.errors).length;
    },

    будет доступно errors_count
    Ответ написан
    2 комментария
  • Как правильно реализовать локализацию БД в laravel?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    На мой взгляд использование пакетов для этой цели нецелесообразно.
    Обычная полиморфическая связь подойдет.

    И так, давайте представим что основной контент статьи на русском языке.
    Во первых, создадим модель нашей локализации:
    php artisan make:model Localization

    Укажем что это полиморфическая связь:
    protected $table = 'localization';
    
    public function lozalizable()
      {
          return $this->morphTo();
      }


    В нашей модели статей привяжем свежесозданную модель в качестве связи:
    public function lozalization(){
    	    return $this->morphOne('App\Localization', 'lozalizable');
    	}


    И создадим миграцию для модели Lozalizable:
    Schema::create('localization', function (Blueprint $table) {
            $table->increments('id');
            $table->string('field');
            $table->string('language');
            $table->string('value');
            $table->string('lozalizable_type');
            $table->integer('lozalizable_id');
            $table->timestamps();
          });


    Теперь, для создания локализации статьи с языком en выполним следующий код:
    $article = Article::create($Atricle);
    
    $localization = new Localization;
    $localization->language = 'en';
    $localization->field = 'content';
    $localization->value = 'Znachenye na english yazike';
    $article->localization()->save($localization); //привязываем к свежесозданному объекту Article новую локализацию


    С помощью scope функций в модели можно без особых проблем реализовать более удобное выдергивание нужного значения и языка:
    public function scopeGetLocalize($language, $field){
         return $this->localization()->where(['language' => $language, 'field' => $field])-> firstOrFail()->value;
    }


    В таком случае, скажем, поле title для локализации en можно выдергивать так:
    $article->getLocalize('en', 'title')
    Ответ написан
    19 комментариев
  • Как развернуть скачанный проект с github на laravel?

    @D3lphi
    В корневой папке проекта выполнить команду:
    composer install

    P.S: "Заранее" пишется слитно.
    Ответ написан
    Комментировать
  • Как загрузить готовый проект в пустой репозиторий?

    @tagplus5
    git commit -m 'initial commit'
    git push -u origin master

    Ответ написан
    Комментировать