• Почему вместо laravel вижу nginx?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Сделал так
    sudo chown -R serii:www-data laravel_projects
    sudo chmod -R 775 laravel_projects
    Ответ написан
  • Почему не работает laravel после клонирования?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Проблема решена.
    Ключ не сгенерировал.
    sudo chown -R www-data:www-data storage
    cp .env.example .env
    php artisan key:generate
    php artisan cache:clear 
    php artisan config:clear
    Ответ написан
    Комментировать
  • Как добавить динамиически страницы в sitemap wp?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Нашел решение.

    add_action("init", "eg_create_sitemap");
    
    $sitemap_path = ABSPATH . "sitemap.xml";
    $pages_path = ABSPATH . "pages.xml";
    $ads_path = ABSPATH . "ads-list.xml";
    
    if (file_exists($sitemap_path)) {
    	unlink($sitemap_path);
    }
    if (file_exists($pages_path)) {
    	unlink($pages_path);
    }
    if (file_exists($ads_path)) {
    	unlink($ads_path);
    }
    
    function createUrlXml() {
    	$url_sitemap = '<?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/css" href="' . get_template_directory_uri() . '/helpers/sitemap.css"?>';
    	$url_sitemap .= "\n" . '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
    	$url_sitemap .= "\t" . '<url>' . "\n" . "\t\t" . '<loc>https://www.imprendocasa.it/ads-list.xml</loc>' . "\n\t\t" . '<lastmod>2021-09-30T01:10:02.000000Z</lastmod>' . "\n\t\t" . '<changefreq>monthly</changefreq>' . "\n\t" . '
        </url>' . "\n";
    	$url_sitemap .= "\t" . '<url>' . "\n" . "\t\t" . '<loc>https://www.imprendocasa.it/pages.xml</loc>' . "\n\t\t" . '
            <lastmod>2021-09-30T01:10:02.000000Z</lastmod>' . "\n\t\t" . '<changefreq>monthly</changefreq>' . "\n\t" . '
        </url>' . "\n";
    	$url_sitemap .= '</urlset>';
    	return $url_sitemap;
    }
    
    function createPagesSitemap() {
    	$postsForSitemap = get_posts(array('numberposts' => -1, 'orderby' => 'modified', 'post_type' => array('post', 'page'), 'order' => 'DESC'));
    	$pages_sitemap = '<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/css" href="' . get_template_directory_uri() . '/helpers/sitemap.css"?>';
    	$pages_sitemap .= "\n" . '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
    	foreach ($postsForSitemap as $post) {
    		setup_postdata($post);
    		$postdate = explode(" ", $post->post_modified);
    		$pages_sitemap .= "\t" . '<url>' . "\n" . "\t\t" . '<loc>' . get_permalink($post->ID) . '</loc>' . "\n\t\t" . '
            <lastmod>' . $postdate[0] . '</lastmod>' . "\n\t\t" . '<changefreq>monthly</changefreq>' . "\n\t" . '</url>' . "\n";
    	}
    	$pages_sitemap .= '</urlset>';
    	return $pages_sitemap;
    }
    
    function createAdsSitemap() {
    	$adsForSitemap = getPropertiesId();
    	$adsForSitemap = json_decode($adsForSitemap)->data;
    	$ads_sitemap = '<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/css" href="' . get_template_directory_uri() . '/helpers/sitemap.css"?>';
    	$ads_sitemap .= "\n" . '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
    	foreach ($adsForSitemap as $item) {
    		$ads_sitemap .= "\t" . '<url>' . "\n" . "\t\t" . '<loc>https://www.imprendocasa.it/ads?id=' . $item->id . '</loc>' . "\n\t\t" . '<lastmod>' . $item->updated_at . '</lastmod>' . "\n\t\t" . '<changefreq>monthly</changefreq>' . "\n\t" . '</url>' . "\n";
    	}
    	$ads_sitemap .= '</urlset>';
    	return $ads_sitemap;
    }
    
    function eg_create_sitemap() {
    	$url_sitemap = createUrlXml();
    	$pages_sitemap = createPagesSitemap();
    	$ads_sitemap = createAdsSitemap();
    
    	global $sitemap_path;
    	global $pages_path;
    	global $ads_path;
    
    	$fp = fopen($sitemap_path, 'w');
    	fwrite($fp, $url_sitemap);
    	fclose($fp);
    
    	$fp = fopen($pages_path, 'w');
    	fwrite($fp, $pages_sitemap);
    	fclose($fp);
    
    	$fp = fopen($ads_path, 'w');
    	fwrite($fp, $ads_sitemap);
    	fclose($fp);
    }


    $adsForSitemap - получаю данные из api.
    Ответ написан
    Комментировать
  • Error: listen EADDRINUSE: address already in use :::3000?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Решение пришло самобой.
    Если еще раз внести какие-нибудь изменения в файлах на сервере через 10 несколько секунд после появления ошибка, то ошибка исчезнет.
    Ответ написан
    Комментировать
  • Почему не работают страницы в nuxt на стороне сервера?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Решил проблему.
    Файл ecosystem.config.js
    module.exports = {
      apps: [
        {
          name: "Pallina",
          exec_mode: "cluster",
          instances: "max", // Or a number of instances
          script: "server/index.js",
          args: "start",
        },
      ],
    };

    package.json не трогаем.

    Файл /etc/nginx/sites-avaible/default
    server {
             server_name burdujaserii.ru;
     
             gzip            on;
             gzip_types      text/plain application/xml text/css application/javascript;
             gzip_min_length 1000;
     
             root /home/boss/apps/nuxt-pallinagelateria;
     
             location / {
                     proxy_redirect                      off;
                     proxy_set_header Host               $host;
                     proxy_set_header X-Real-IP          $remote_addr;
                     proxy_set_header X-Forwarded-For    $proxy_add_x_forwarded_for;
                     proxy_set_header X-Forwarded-Proto  $scheme;
                     proxy_read_timeout          1m;
                     proxy_connect_timeout       1m;
                     proxy_pass http://localhost:3000; # Ð~_оÑ~@Ñ~B на коÑ~BоÑ~@ом запÑ~CÑ~AкаеÑ~BÑ~AÑ~O node.js пÑ~@иложение
         }
     
     
         listen [::]:443 ssl http2  ipv6only=on; # managed by Certbot
         listen 443 ssl http2 ; # managed by Certbot
         ssl_certificate /etc/letsencrypt/live/burdujaserii.ru/fullchain.pem; # managed by Certbot
         ssl_certificate_key /etc/letsencrypt/live/burdujaserii.ru/privkey.pem; # managed by Certbot
         include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
         ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
     
    }


    Еще установил ssl, который сгенерировал дополнительную конфигурацию в default.
    sudo apt install certbot python3-certbot-nginx # Отвечаем 'y'
    sudo certbot --nginx -d your-domain.com -d www.your-domain.com
    certbot renew --dry-run(certificat will be to 90 days)
    
    When certificat will finish need to tipy in terminal
    certbot renew


    Через pm2 запускаю проект.
    pm2 start id
    pm2 logs
    Ответ написан
    Комментировать
  • Как оптимизировать проверку токена в nuxt?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Сделал следующим образом.
    В контроллере
    const create = async (req, res) => {
      if (!req.headers.authorization) {
        return res.status(500).json({ status: "error", message: "token absent" });
      } else {
        const token = req.headers.authorization.split("Bearer ")[1];
        jwt.verify(token, process.env.JWT, async function (err, decoded) {
          if (err) {
            return res
              .status(500)
              .json({ status: "error", message: "token invalid" });
          } else {
            try {
              await LocationModel.create(req.body);
              res.status(201).json({ status: 1, message: "success" });
            } catch (error) {
              res.status(500).json({ status: 0, message: error.message });
            }
          }
        });
      }
    };


    Тут прходится копипастить.

    И на фронтенде добавляю headers Authorization.
    this.$axios
                .$patch(
                  process.env.baseUrl + "/api/v1/location/" + this.$route.params.id,
                  reqData,
                  {
                    headers: {
                      Authorization: this.$auth.$storage._state["_token.local"],
                    },
                  }
                )
                .then(() => {
                  this.loading = false;
                  this.$router.push(`/admin/location/?slug=${this.slug}`);
                })
                .catch((err) => {
                  if (err.response) {
                    console.log(
                      err.response.data.message,
                      "err.response.data.message"
                    );
                    this.$message.error(err.response.data.message);
                    this.loading = false;
                  } else if (err.request) {
                    this.$message.error(err.request);
                    console.log(err.request, "err.request");
                    this.loading = false;
                  }
                });
    Ответ написан
    Комментировать
  • Как отключить клашиву fn на клавиатуре logitech k580?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Нажатие fn+Esc переключает клавишу fn.
    Ответ написан
    Комментировать
  • Как октлючить wp-sitemap.xml в wordpress?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Вопрос решен.
    Банально, забыл подключить файлик sitemap.php в functions.php.

    Просто пришлось сделать карту для нескольких сайтов, и у некоторых работало.
    Еще, я использую для seo rankmath, и у плагина отключил sitemap.
    Ответ написан
    Комментировать
  • Где найти пример работы nuxt auth?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Я закончил с авторизацией. Работает и с local storage и с cookie. "

    nuxt.config.js
    axios: { proxy: true },
      proxy: { "/api/": process.env.BASE_URL + "/" },
      auth: {
        strategies: {
          local: {
            token: {
              property: "token",
              global: true
              // required: true,
              // type: 'Bearer'
            },
            user: {
              property: "user",
              autoFetch: false
            },
            endpoints: {
              login: { url: "/api/login", method: "post" },
              logout: { url: "/api/auth/logout", method: "post" },
              user: { url: "/api/auth/user", method: "get" }
            }
          }
        }
      },


    auth routes

    const { Router } = require("express");
    const router = Router();
    const {
      login,
      register,
      user,
      logout
    } = require("./../controllers/auth.controller");
    
    router.post("/api/login", login);
    router.post("/api/auth/register", register);
    router.get("/api/auth/user", user);
    router.post("/api/auth/logout", logout);
    
    module.exports = router;


    auth controllers
    const User = require("./../models").User;
    const Sequelize = require("sequelize");
    const Op = Sequelize.Op;
    const bcrypt = require("bcrypt-nodejs");
    const jwt = require("jsonwebtoken");
    
    module.exports.login = async (req, res) => {
      const login = req.body.login;
      const password = req.body.password;
    
      try {
        const candidate = await User.findOne({
          where: {
            login: {
              [Op.eq]: login
            }
          }
        });
        if (candidate) {
          if (bcrypt.compareSync(password, candidate.password)) {
            const token = jwt.sign(
              {
                user: candidate.login,
                userId: candidate.id
              },
              process.env.JWT,
              { expiresIn: "2h" }
            );
    
            res
              .status(200)
              .json({ status: 1, message: "You are logged in", token });
          } else {
            res.status(200).json({ status: 0, message: "User not found" });
          }
        } else {
          res.status(200).json({ status: 0, message: "User not found" });
        }
      } catch (error) {
        throw error;
        return res.status(500).json(error);
      }
    };
    
    module.exports.register = async (req, res) => {
      const { login, password } = req.body.data;
      try {
        const candidate = await User.findOne({
          where: {
            login: {
              [Op.eq]: login
            }
          }
        });
        if (candidate) {
          res.status(200).json({ status: 0, message: "User exists" });
        } else {
          const salt = bcrypt.genSaltSync(10);
          await User.create({
            login: login,
            password: bcrypt.hashSync(password, salt)
          });
          res.status(200).json({ status: 1, message: "User was created" });
        }
      } catch (error) {
        throw error;
        return res.status(500).json(error);
      }
    };
    
    module.exports.user = async (req, res) => {
      const token = req.headers["authorization"];
      const newToken = token.replace("Bearer ", "");
      if (token) {
        jwt.verify(newToken, process.env.JWT, (error, decode) => {
          if (error) {
            res.status(403).json({ status: 0, message: "invalid token", error });
          } else {
            res.status(200).json({ status: 1, user: decode.user });
          }
        });
      } else {
        res.status(500).json({ status: 0, message: "Please, send a token" });
      }
    };
    
    module.exports.logout = (req, res) => {
      res.status(200).json({ status: 1, message: "You are logged in", token: "" });
    };


    Logout

    methods: {
        logout() {
          this.$auth.logout();
        }
      }


    Login
    submitForm() {
          this.loading = true;
          this.$refs.ruleForm.validate(async valid => {
            if (valid) {
              try {
                const data = {
                  login: this.ruleForm.login,
                  password: this.ruleForm.password
                };
                const response = await this.$auth.loginWith("local", {
                  data: this.ruleForm
                });
    
                this.loading = false;
    
                if (response.data.status === 1) {
                  this.$message.success(response.data.message);
                  window.location.href = process.env.baseUrl;
                } else {
                  this.$message.warning(response.data.message);
                }
              } catch (error) {
                this.loading = false;
              }
            } else {
              this.loading = false;
              console.log("error submit!!");
              return false;
            }
          });
        }
    Ответ написан
    Комментировать
  • Как оптимизировать nuxt js?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Нашел решение проблемы.
    Правильно выше написали, что нужно promiseAll использовать.
    И вот решение:
    fetch({ store }) {
        const result = [];
        if (store.getters['home/home'].length === 0) {
          result.push(store.dispatch('home/fetchHome'));
        }
        if (store.getters["solutions/getSolutions"].length === 0) {
          result.push(store.dispatch('solutions/fetchSolutions'));
        }
        if (store.getters["tipo/getTipo"].length === 0) {
          result.push(store.dispatch('tipo/fetchTipo'));
        }
        if (store.getters["portfolio/getPortfolio"].length === 0) {
          result.push(store.dispatch('portfolio/fetchPortfolio'));
        }
        if (store.getters["options/getOptions"].length === 0) {
          result.push(store.dispatch('options/fetchOptions'));
        }
    
        return Promise.all(result)
          .then((data) => console.log(data))
          .catch((error) => console.log(error));
      },
    Ответ написан
    Комментировать
  • Почему не работает store в nuxt?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Наверное я понял, если не так, то можете меня поправить.

    dispatch нужно вызвать только на странице, а не в блоках. Вот как я реализовал на главной.

    async fetch({ store }) {
        try {
          if (store.getters['home/home'].length === 0) {
            await store.dispatch('home/fetchHome');
          }
          if (store.getters["solutions/getSolutions"].length === 0) {
            await store.dispatch('solutions/fetchSolutions');
          }
          if (store.getters["tipo/getTipo"].length === 0) {
            await store.dispatch('tipo/fetchTipo');
          }
        } catch (e) {
          console.log(e, 'e')
        }


    А в блоках вызвать уже гетеры.

    Есть, конечно и способ в store/index.js вызвать nuxtServerInit, и туда вызвать все dispatch.

    Только я не знаю, если у меня будут много запросов, то сайт не будет слишком долго открыватся в первый раз?
    Ответ написан
    Комментировать
  • Как в vue хранить компонент в массиве?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Все заработало. Спасибо за поддержку.

    Проблема была в том, что у иконок не было высоты и ширины, попровил и теперь нормально отображаются.
    Ответ написан
    Комментировать
  • Erro: status command not found exit 127?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Нашел решение, может кому пригодится.
    Банально, но пришлось установить i3blocks.
    sudo apt install i3blocks
    Ответ написан
    Комментировать
  • "The plugin generated 249 characters of unexpected output during activation"?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Решил проблему.

    Создал метод, чтобы проверить, если существует база данных.
    public function checkIfTableExist()
    	{
    		global $wpdb;
    		$table_name = $wpdb->prefix . "google_analitycs_table";
    		if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") === $table_name) {
    			return true;
    		}
    		return false;
    	}


    И потом проверил.

    if ($googleAnalyticsPlugin->checkIfTableExist()) {
    	$googleAnalyticsPlugin->register();
    }
    Ответ написан
    Комментировать
  • Как настроить eslint между phpstorm и vuejs?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Установил плагин https://eslint.vuejs.org/user-guide/#installation

    И в шторме задал отступы для файлов js и vue, убрал табы и задал 2 пробела.
    Ответ написан
    Комментировать
  • Как задать задержку перед отправкой файлов по ftp?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Решил проблему.
    Связался с разработчиками из phpstorm, подсказали, что нужно gulp запускать из самого редактора, а не из терминала.
    Ответ написан
    Комментировать
  • Почему не работает shortcode в wp-backery?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Решение проблемы банальная.
    Заказчик перенес сайт на другой хостинг, и данные ftp поменялись.
    Нужно было просто проверить изменения в файлах локально и на сайте.
    Вдруг кому пригодится такое решение.
    Ответ написан
    Комментировать
  • Почему не работает sourcemap?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Решил проблему.
    Оказывается что браузер хром показывает кэшированную версию.
    Если в инкогнито посмотреть, то все норм.
    Ответ написан
    Комментировать
  • Как работать совместно с репозиторием на bitbucket?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Я решил проблему.
    Просто я не обратил внимание, что нужно дать права на запись, у напарника были права только на чтение.
    5f46607a6008f215224086.jpeg
    Ответ написан
    Комментировать
  • Как отобразить jquery datepicker ui после перезагрузки страницы?

    serii81
    @serii81 Автор вопроса
    Я люблю phр...
    Добавил еще input type hidden c id и полем name и связал его к datepicker, который привязан к диву.
    Вот итоговый код:
    if ($('html').attr('lang') === 'it-IT') {
    		$.datepicker.setDefaults(
    			$.extend(
    				{'dateFormat': 'dd-mm-yy'},
    				$.datepicker.regional['it']
    			)
    		);
    	} else {
    		$.datepicker.setDefaults(
    			$.extend(
    				{'dateFormat': 'dd-mm-yy'},
    				$.datepicker.regional['en']
    			)
    		);
    	}
    	$('.datepicker-class').datepicker({
    		minDate: 0,
    		altField: "#your-date",
    		beforeShowDay: $.datepicker.noWeekends,
    	})
    Ответ написан
    Комментировать