作者: admin

  • Laravel 9 使用 Vite 整合 Vue 3

    Laravel 作为一个全栈开发框架,天然支持把前后端集成在一起开发,避免了前后端两个项目在不同开发工具中进行切换,节省很多时间,开发体验更好,真是自由全栈开发者的一大利器。

    在本文中,我们将使用 vite 在 laravel 9 中安装 vue 3。

    创建 Laravel 项目

    composer create-project laravel/laravel laravel-vite-vue

    安装 vue 3 和 vue-loader

    npm install vue@next vue-loader@next

    安装 plugin-vue

    npm i @vitejs/plugin-vue

    安装其它依赖

    npm install

    编辑 vite.config.js

    import { defineConfig } from 'vite';
    import laravel from 'laravel-vite-plugin';
    import vue from '@vitejs/plugin-vue'
    
    export default defineConfig({
        plugins: [
            vue(),
            laravel([
                'resources/css/app.css',
                'resources/js/app.js',
            ]),
        ],
    });

    修改 resources/js/app.js

    import './bootstrap';
    
    import { createApp } from 'vue';
    
    import app from './Page/app.vue'
    
    createApp(app).mount("#app")

    在 resources/Page 文件夹下添加 app.vue,内容如下

    <template>
        <h1>
            Laravel 9 vite with vue 3
        </h1>
    </template>

    编辑 resources/views/welcome.blade.php

    <!DOCTYPE html>
    <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
        <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1">
    
            <title>Laravel 9 with vue 3 vite</title>
    
        </head>
        <body>
            <div id="app"></div>
            @vite('resources/js/app.js')
        </body>
    </html>

    执行 npm run devphp artisan serve

    最后打开 https://lwbj.cn:8000 就可以看效果了。

    对于高版本Laravel,应该大同小异,以此为参考进行。

  • wordpress获取某一篇文章所在分类的子分类

    要获取某篇文章所在分类的子分类,可以首先通过 get_the_category() 获取文章的分类 ID,然后再根据该分类的 ID 获取子分类。

    以下是一个示例代码:

    $post_id = 123; // 文章的 ID
    $categories = get_the_category($post_id);
    
    if (!empty($categories)) {
        $parent_category_id = $categories[0]->term_id; // 获取文章的第一个分类的 ID
        $taxonomy = 'category'; // 分类的 taxonomy,通常是 'category'
    
        $args = array(
            'taxonomy'     => $taxonomy,
            'parent'        => $parent_category_id,
            'hide_empty'    => false, // 是否排除没有文章的分类
        );
    
        $subcategories = get_terms($args);
    
        if (!empty($subcategories) && !is_wp_error($subcategories)) {
            foreach ($subcategories as $subcategory) {
                echo '子分类名称: ' . $subcategory->name . '<br>';
                echo '子分类链接: ' . get_term_link($subcategory) . '<br>';
            }
        } else {
            echo '没有找到子分类。';
        }
    } else {
        echo '文章没有分类。';
    }
    

    说明:

    • get_the_category($post_id) 获取文章所属的分类。如果文章属于多个分类,它会返回一个分类数组,这里我们使用了第一个分类的 ID($categories[0]->term_id)。
    • 然后,使用该分类 ID 查询其子分类,get_terms() 返回该分类下的子分类列表。

    这段代码假设文章有至少一个分类,并且你希望基于第一个分类获取子分类。如果文章有多个分类,你可以根据需求修改代码,选择不同的分类来获取子分类。

  • wordPress 取某个分类的子分类

    在 WordPress 中,可以通过 get_terms() 函数来获取某个分类的子分类。假设你已经知道父分类的 ID,可以使用如下代码来获取该父分类的子分类:

    $parent_category_id = 123; // 父分类的 ID
    $taxonomy = 'category'; // 分类的 taxonomy,通常是 'category'
    
    $args = array(
        'taxonomy'     => $taxonomy,
        'parent'        => $parent_category_id,
        'hide_empty'    => false, // 是否排除没有文章的分类
    );
    
    $subcategories = get_terms($args);
    
    if (!empty($subcategories) && !is_wp_error($subcategories)) {
        foreach ($subcategories as $subcategory) {
            echo '子分类名称: ' . $subcategory->name . '<br>';
            echo '子分类链接: ' . get_term_link($subcategory) . '<br>';
        }
    } else {
        echo '没有找到子分类。';
    }
    

    说明:

    • parent:传入父分类的 ID 来获取其子分类。
    • taxonomy:指定要查询的分类法(通常是 category)。
    • hide_empty:设置为 false 以确保获取所有子分类,包括没有文章的分类。

    你可以根据需要调整查询参数,获取不同的分类或更复杂的分类数据。

  • Laravel中123456加密后的文本

    开发中,有时需要重置密码,以下是123456加密后的文本,可以直接替换数据库中的密码字段,把密码改为123456。

    $2y$10$sZKmNv.T8JUqNN7ZaLfzd.xvNGbAf5EWP5OQ2csOmhnRIWuDsip3W

  • Laravel返回JSON时禁用中文转码

    Laravel在返回JSON时,会对中文进行转码,转码后的内容无法用肉眼直接识别,所以为了调试方便,可以禁止对中文进行转码:

    setEncodingOptions(JSON_UNESCAPED_UNICODE);

  • Debian+Nginx+PHP HTTPS配置模板

    Nginx+PHP+HTTPS的配置模板,如果要部署其它网站,可以基于此进行修改:

    # 处理 HTTP 请求,所有请求都重定向到 https://lwbj.cn
    server {
        listen 80;
        server_name lwbj.cn www.lwbj.cn;  # 同时匹配带 www 和不带 www 的域名
    
        # 所有请求都重定向到 https://lwbj.cn
        return 301 https://lwbj.cn$request_uri;
    }
    
    # 处理不带 www 的 HTTPS 请求,重定向到带 www 的域名
    server {
        listen 443 ssl http2;
        server_name lwbj.cn;  # 不带 www 的域名
    
        ssl_certificate /etc/nginx/ssl/www.lwbj.cn.pem;  # 证书路径
        ssl_certificate_key /etc/nginx/ssl/www.lwbj.cn.key;  # 证书路径
    
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
        ssl_ecdh_curve secp384r1;
        ssl_session_timeout 10m;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        ssl_stapling on;
        ssl_stapling_verify on;
    
        # 重定向所有不带 www 的 HTTPS 请求到 www.lwbj.cn
        return 301 https://lwbj.cn$request_uri;
    }
    
    # 处理带 www 的 HTTPS 请求
    server {
        listen 443 ssl http2;
        root /var/www/www.lwbj.cn; # 确保这里是正确的根目录路径
        index index.html index.htm index.php index.nginx-debian.html;
    
        server_name  www.lwbj.cn;
        client_max_body_size 20m;
    
        ssl_certificate /etc/nginx/ssl/www.lwbj.cn.pem; # 确保证书路径正确
        ssl_certificate_key /etc/nginx/ssl/www.lwbj.cn.net.key; # 确保证书路径正确
    
        #加上TLSv1,HTTPS检测会报PCI DSS不合规
        ssl_protocols  TLSv1.2 TLSv1.3;# Requires nginx >= 1.13.0 else use TLSv1.2
        ssl_prefer_server_ciphers on;
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
        ssl_ecdh_curve secp384r1; # Requires nginx >= 1.1.0
        ssl_session_timeout 10m;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off; # Requires nginx >= 1.5.9
        ssl_stapling on; # Requires nginx >= 1.3.7
        ssl_stapling_verify on; # Requires nginx => 1.3.7
    
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
    
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        }
    }
  • Debian+Nginx+PHP配置模板

    Nginx+PHP+HTTP的配置模板,如果要部署其它网站,可以基于此进行修改:

    server {
        listen 80;
        root /var/www/www.example.com;
        # Add index.php to the list if you are using PHP
        index index.html index.htm index.php index.nginx-debian.html;
    
        server_name www.example.com example.com;
    
        client_max_body_size 20m;
    
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
    
        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
    
            # With php-fpm (or other unix sockets):
            fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        }
    }
  • Debian配置系统时区

    运行命令:

    dpkg-reconfigure tzdata

    根据需要选择,很简单。

    dpkg-reconfigure tzdata 是一个用于重新配置系统时区的命令。

    在基于 Debian 的 Linux 系统(如 Ubuntu)中,tzdata 是一个提供时区信息的软件包。通过运行 dpkg-reconfigure tzdata,你可以重新设置系统的时区,以确保系统显示的时间是正确的。

    设置完成后,命令会显示类似以下的信息:

    Current default time zone: 'Asia/Shanghai'
    Local time is now:      Fri Nov 29 18:45:00 CST 2024
    Universal Time is now:  Fri Nov 29 10:45:00 UTC 2024

    可以执行date命令以查看当前时间。

  • Laravel上线一定要优化的两个配置

    1、缓存配置信息:php artisan config:cache

    该操作把配置信息从.env缓存到php文件中,否则会因为高并发,多个请求同时读取.env文件,会造成读取失败,从而读取到了config文件夹下的默认配置信息,会造成数据库连接失败,或读取不到 APPP_KEY 等错误。

    2、打开opcache,这个真的会有很大的性能提升!执行 vi /etc/php/8.3/fpm/php.ini,注意不同服务器上的版本和路径。

    具体修改地方如下图:

    去掉zend_extension前面的注释

    设置opcache.enable=1
  • Laravel用户登录

    Laravel中做登录,真的太简单了,框架已经集成了大多数的功能,我们只需要把相关数据传递过去即可。代码如下:

    <?php
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Auth;
    
    class LoginController extends Controller
    {
        public function index()
        {
            // 如果用户已登录,则直接跳转到之前页面
            if (Auth::check()) {    
                return redirect(url()->previous());
            }
          
            return view('login');
        }
    
        public function login(Request $request)
        {
            $credentials = $request->validate([
                'username' => ['required'],
                'password' => ['required'],
            ]);
     
            if (Auth::attempt($credentials, $request->remember)) {
                $request->session()->regenerate(); 
                return redirect()->intended();
            }
     
            return back()->withErrors([
                'loginError' => '用户名或密码不正确。',
            ])->onlyInput('username');
        }
    
        public function logout(Request $request)
        {
            Auth::logout();
            $request->session()->invalidate();
            $request->session()->regenerateToken();
            return redirect('/')->with('success', '退出成功!');
        }
    }

    相应的路由如下:

    Route::get('/login', [LoginController::class, 'index'])->name('login.index');
    Route::post('/login', [LoginController::class, 'login'])->name('login');
    Route::get('/logout', [LoginController::class, 'logout'])->middleware('auth')->name('logout');