分类: 其它

  • Python 学习笔记:常用核心库简介

    我近期在使用影刀开发各类自动化流程,发现即便借助影刀的指令体系,深入掌握 Python 第三方库依然至关重要。这些库覆盖了数据处理、可视化、网络请求、自动化等几乎所有编程场景,因此我整理了这份新手入门级的 Python 常用库笔记,包含核心功能、安装方式和极简示例,助力快速上手。

    一、基础必备库

    1. NumPy(数值计算基础)

    核心功能

    • 提供高性能的多维数组(ndarray) 数据结构,是科学计算的基础。
    • 支持向量化运算、矩阵操作、线性代数、傅里叶变换等数值计算。
    • 比 Python 原生列表快得多,是 Pandas、Matplotlib 等库的底层依赖。

    安装

    pip install numpy

    极简示例

    import numpy as np
    
    # 创建一维数组
    arr1 = np.array([1, 2, 3, 4])
    # 创建二维数组(矩阵)
    arr2 = np.array([[1, 2], [3, 4]])
    
    # 数组运算(向量化,无需循环)
    print(arr1 * 2)  # 输出:[2 4 6 8]
    print(arr2 + arr2)  # 输出:[[2 4], [6 8]]
    # 矩阵乘法
    print(arr2 @ arr2)  # 输出:[[7 10], [15 22]]

    2. Pandas(数据处理与分析)

    核心功能

    • 提供 DataFrame(表格型数据结构) 和 Series(一维序列),完美适配表格数据(如 Excel/CSV)。
    • 支持数据清洗(缺失值、重复值处理)、筛选、分组、合并、透视表等。
    • 是数据分析、数据挖掘的核心工具,能轻松处理几十万甚至百万行数据。

    安装

    pip install pandas

    极简示例

    import pandas as pd
    
    # 创建DataFrame(模拟表格数据)
    df = pd.DataFrame({
        "姓名": ["张三", "李四", "王五"],
        "年龄": [20, 25, 30],
        "城市": ["北京", "上海", "广州"]
    })
    
    # 数据查看
    print(df.head())  # 查看前n行(默认5行)
    # 数据筛选:筛选年龄>22的行
    print(df[df["年龄"] > 22])
    # 保存为CSV文件
    df.to_csv("user_info.csv", index=False)
    # 读取CSV文件
    df_read = pd.read_csv("user_info.csv")

    二、数据可视化库

    1. Matplotlib(基础可视化库)

    核心功能

    • Python 最基础的绘图库,支持绘制折线图、柱状图、散点图、直方图等几乎所有基础图表。
    • 高度可定制(标题、坐标轴、颜色、样式等),是其他可视化库(如 Seaborn)的底层。

    安装

    pip install matplotlib

    极简示例

    import matplotlib.pyplot as plt
    import numpy as np
    
    # 生成数据
    x = np.linspace(0, 10, 100)  # 0到10之间生成100个均匀分布的数
    y = np.sin(x)
    
    # 绘制折线图
    plt.plot(x, y, color="red", label="sin(x)")
    plt.xlabel("X轴")  # X轴标签
    plt.ylabel("Y轴")  # Y轴标签
    plt.title("正弦函数曲线")  # 标题
    plt.legend()  # 显示图例
    plt.show()  # 展示图表

    2. Seaborn(高级可视化库)

    核心功能

    • 基于 Matplotlib 封装,语法更简洁,默认样式更美观。
    • 专注于统计可视化(如箱线图、热力图、小提琴图、配对图),适配 Pandas 的 DataFrame。

    安装

    pip install seaborn

    极简示例

    import seaborn as sns
    import pandas as pd
    
    # 使用内置数据集
    tips = sns.load_dataset("tips")  # 餐饮小费数据集
    
    # 绘制柱状图(按性别分组,展示平均消费)
    sns.barplot(x="sex", y="total_bill", data=tips)
    # 绘制热力图(展示变量相关性)
    sns.heatmap(tips.corr(numeric_only=True), annot=True, cmap="coolwarm")

    三、网络请求与爬虫库

    1. Requests(HTTP 请求库)

    核心功能

    • 替代 Python 原生的 urllib,语法极简,支持 GET/POST 请求、Cookie、Headers、代理等。
    • 是爬虫、调用 API 接口的首选库。

    安装

    pip install requests

    极简示例

    import requests
    
    # GET请求(获取网页内容)
    response = requests.get("https://www.baidu.com")
    response.encoding = "utf-8"  # 设置编码
    print(response.text[:100])  # 打印前100个字符
    
    # POST请求(模拟表单提交)
    data = {"username": "test", "password": "123456"}
    response = requests.post("https://httpbin.org/post", data=data)
    print(response.json())  # 以JSON格式返回响应

    2. BeautifulSoup4(网页解析库)

    核心功能

    • 解析 HTML/XML 页面,提取标签、属性、文本等内容,搭配 Requests 实现爬虫。
    • 支持 CSS 选择器、正则表达式匹配,上手简单。

    安装

    pip install beautifulsoup4

    极简示例

    import requests
    from bs4 import BeautifulSoup
    
    # 获取网页内容
    response = requests.get("https://www.baidu.com")
    soup = BeautifulSoup(response.text, "html.parser")  # 解析HTML
    
    # 提取指定标签(比如所有a标签的href属性)
    a_tags = soup.find_all("a")  # 找到所有a标签
    for tag in a_tags[:5]:  # 打印前5个
        print(tag.get("href"), tag.text)

    四、自动化与实用工具库

    1. os & sys(系统交互库,内置)

    核心功能

    • os:操作文件/目录(创建、删除、遍历、路径拼接)、执行系统命令。
    • sys:获取系统参数(如命令行参数、Python 版本)、控制程序退出等。
    • 无需安装,Python 原生内置。

    极简示例

    import os
    import sys
    
    # os库示例:遍历指定目录下的文件
    print(os.listdir("."))  # 列出当前目录所有文件/文件夹
    os.makedirs("test_dir", exist_ok=True)  # 创建目录(已存在则不报错)
    
    # sys库示例:获取命令行参数
    print("Python版本:", sys.version)
    print("命令行参数:", sys.argv)  # 运行时传入的参数,如python test.py 123,则sys.argv=[test.py, 123]

    2. datetime(时间处理库,内置)

    核心功能

    • 处理日期、时间的解析、格式化、加减运算,替代原生 time 库的复杂操作。
    • 无需安装,Python 原生内置。

    极简示例

    from datetime import datetime, timedelta
    
    # 获取当前时间
    now = datetime.now()
    print(now.strftime("%Y-%m-%d %H:%M:%S"))  # 格式化输出:2026-03-11 10:00:00
    
    # 时间加减(比如3天后)
    after_3_days = now + timedelta(days=3)
    print(after_3_days.strftime("%Y-%m-%d"))
    
    # 解析字符串为时间
    time_str = "2026-01-01"
    time_obj = datetime.strptime(time_str, "%Y-%m-%d")
    print(time_obj)

    3. OpenPyXL(Excel 操作库)

    核心功能

    • 读写 Excel 文件(.xlsx 格式),支持单元格样式、公式、合并单元格等。
    • 替代老旧的 xlrd/xlwt,功能更全面。

    安装

    pip install openpyxl

    极简示例

    from openpyxl import Workbook, load_workbook
    
    # 创建新Excel并写入数据
    wb = Workbook()
    ws = wb.active  # 获取活跃工作表
    ws["A1"] = "姓名"
    ws["B1"] = "年龄"
    ws["A2"] = "张三"
    ws["B2"] = 20
    wb.save("test.xlsx")  # 保存文件
    
    # 读取Excel数据
    wb = load_workbook("test.xlsx")
    ws = wb.active
    print(ws["A2"].value)  # 输出:张三
    print(ws["B2"].value)  # 输出:20

    4. Playwright(现代自动化测试/爬虫库)

    核心功能

    • 由微软开发,支持无头浏览器自动化(Chrome、Firefox、Safari 全兼容)。
    • 相比 Selenium 更轻量、速度更快,API 设计更简洁,内置等待机制(无需手动加 sleep)。
    • 可用于网页自动化操作、动态渲染页面爬虫(如 JavaScript 加载的内容)、UI 自动化测试。
    • 支持同步/异步两种调用方式,新手优先学同步版即可。

    安装

    # 安装库
    pip install playwright
    # 安装浏览器驱动(首次使用必须执行,会下载Chrome/Firefox/Safari驱动)
    playwright install

    极简示例

    from playwright.sync_api import sync_playwright
    
    # 启动浏览器(headless=False 显示浏览器窗口,True 为无头模式)
    with sync_playwright() as p:
        # 选择浏览器:chromium/firefox/webkit
        browser = p.chromium.launch(headless=False)
        # 新建页面
        page = browser.new_page()
        # 访问网页
        page.goto("https://www.baidu.com")
    
        # 1. 输入并搜索(定位输入框,输入内容)
        page.locator("#kw").fill("Python Playwright")
        # 点击搜索按钮
        page.locator("#su").click()
    
        # 2. 等待页面加载并提取数据(等待标题出现)
        page.wait_for_selector("h3")
        # 提取所有搜索结果标题
        titles = page.locator("h3").all_text_contents()
        print("前5个搜索结果:")
        for title in titles[:5]:
            print(title)
    
        # 关闭浏览器
        browser.close()

    核心优势(对比传统爬虫/自动化工具)

    1. 能爬取动态渲染页面(如需要登录、滚动加载、JS 渲染的内容),解决 Requests 无法处理的场景。
    2. 内置自动等待:无需手动设置 time.sleep(),会等待元素加载完成后再操作,稳定性更高。
    3. 支持截图/录屏page.screenshot(path="baidu.png") 可保存页面截图,便于调试。

    五、其他常用库(快速了解)

    库名 核心用途 安装命令
    Scikit-learn 机器学习(分类、回归、聚类) pip install scikit-learn
    TensorFlow/PyTorch 深度学习(神经网络) pip install tensorflow / pip install torch
    Flask/Django Web 开发(轻量/全栈框架) pip install flask / pip install django
    Pillow 图片处理(裁剪、滤镜、格式转换) pip install pillow
    PyAutoGUI 键鼠自动化(模拟点击、输入) pip install pyautogui

    总结

    1. 基础核心库:NumPy 是数值计算基石,Pandas 是数据处理核心,二者是数据分析的必备组合。
    2. 可视化库:Matplotlib 是基础,Seaborn 更适合统计可视化,优先掌握折线图、柱状图、热力图等常用图表。
    3. 实用工具库:基础爬虫用 Requests+BeautifulSoup4 处理静态页面,Playwright 适配动态页面/网页自动化;os/datetime/OpenPyXL 覆盖日常文件、系统、时间和 Excel 操作场景。
  • MIDI音符代码表

    MIDI 音符代码是用于表示音符的数字系统,范围从0到127,对应不同的音高和八度。具体如下:

    1. 音符编号:每个音符对应一个唯一的编号,例如:

      • C4(中央C)的编号为60。
      • C5的编号为72。
    2. 音高与编号

      • 编号0对应C-1(最低音)。
      • 编号127对应G9(最高音)。
    3. 八度划分

      • 每增加12,编号提高一个八度。例如,C4为60,C5为72。
    4. 半音关系

      • 相邻编号相差一个半音。例如,C4为60,C#4/Db4为61。
    5. 常用音符示例

      • C4: 60
      • D4: 62
      • E4: 64
      • F4: 65
      • G4: 67
      • A4: 69
      • B4: 71
      • C5: 72
    6. 应用

      • MIDI音符代码用于音乐软件、硬件和数字乐器中,控制音符的播放。

    附表:

    编号 音符代码(二进制码) 音符代码(十六进制码) 所在音阶 音调
    0 0000000 00 -1 C
    1 0000001 01 -1 C#
    2 0000010 02 -1 D
    3 0000011 03 -1 D#
    4 0000100 04 -1 E
    5 0000101 05 -1 F
    6 0000110 06 -1 F#
    7 0000111 07 -1 G
    8 0001000 08 -1 G#
    9 0001001 09 -1 A
    10 0001010 0A -1 A#
    11 0001011 0B -1 B
    12 0001100 0C 0 C
    13 0001101 0D 0 C#
    14 0001110 0E 0 D
    15 0001111 0F 0 D#
    16 0010000 10 0 E
    17 0010001 11 0 F
    18 0010010 12 0 F#
    19 0010011 13 0 G
    20 0010100 14 0 G#
    21 0010101 15 0 A
    22 0010110 16 0 A#
    23 0010111 17 0 B
    24 0011000 18 1 C
    25 0011001 19 1 C#
    26 0011010 1A 1 D
    27 0011011 1B 1 D#
    28 0011100 1C 1 E
    29 0011101 1D 1 F
    30 0011110 1E 1 F#
    31 0011111 1F 1 G
    32 0100000 20 1 G#
    33 0100001 21 1 A
    34 0100010 22 1 A#
    35 0100011 23 1 B
    36 0100100 24 2 C
    37 0100101 25 2 C#
    38 0100110 26 2 D
    39 0100111 27 2 D#
    40 0101000 28 2 E
    41 0101001 29 2 F
    42 0101010 2A 2 F#
    43 0101011 2B 2 G
    44 0101100 2C 2 G#
    45 0101101 2D 2 A
    46 0101110 2E 2 A#
    47 0101111 2F 2 B
    48 0110000 30 3 C
    49 0110001 31 3 C#
    50 0110010 32 3 D
    51 0110011 33 3 D#
    52 0110100 34 3 E
    53 0110101 35 3 F
    54 0110110 36 3 F#
    55 0110111 37 3 G
    56 0111000 38 3 G#
    57 0111001 39 3 A
    58 0111010 3A 3 A#
    59 0111011 3B 3 B
    60 0111100 3C 4 C
    61 0111101 3D 4 C#
    62 0111110 3E 4 D
    63 0111111 3F 4 D#
    64 1000000 40 4 E
    65 1000001 41 4 F
    66 1000010 42 4 F#
    67 1000011 43 4 G
    68 1000100 44 4 G#
    69 1000101 45 4 A
    70 1000110 46 4 A#
    71 1000111 47 4 B
    72 1001000 48 5 C
    73 1001001 49 5 C#
    74 1001010 4A 5 D
    75 1001011 4B 5 D#
    76 1001100 4C 5 E
    77 1001101 4D 5 F
    78 1001110 4E 5 F#
    79 1001111 4F 5 G
    80 1010000 50 5 G#
    81 1010001 51 5 A
    82 1010010 52 5 A#
    83 1010011 53 5 B
    84 1010100 54 6 C
    85 1010101 55 6 C#
    86 1010110 56 6 D
    87 1010111 57 6 D#
    88 1011000 58 6 E
    89 1011001 59 6 F
    90 1011010 5A 6 F#
    91 1011011 5B 6 G
    92 1011100 5C 6 G#
    93 1011101 5D 6 A
    94 1011110 5E 6 A#
    95 1011111 5F 6 B
    96 1100000 60 7 C
    97 1100001 61 7 C#
    98 1100010 62 7 D
    99 1100011 63 7 D#
    100 1100100 64 7 E
    101 1100101 65 7 F
    102 1100110 66 7 F#
    103 1100111 67 7 G
    104 1101000 68 7 G#
    105 1101001 69 7 A
    106 1101010 6A 7 A#
    107 1101011 6B 7 B
    108 1101100 6C 8 C
    109 1101101 6D 8 C#
    110 1101110 6E 8 D
    111 1101111 6F 8 D#
    112 1110000 70 8 E
    113 1110001 71 8 F
    114 1110010 72 8 F#
    115 1110011 73 8 G
    116 1110100 74 8 G#
    117 1110101 75 8 A
    118 1110110 76 8 A#
    119 1110111 77 8 B
    120 1111000 78 9 C
    121 1111001 79 9 C#
    122 1111010 7A 9 D
    123 1111011 7B 9 D#
    124 1111100 7C 9 E
    125 1111101 7D 9 F
    126 1111110 7E 9 F#
    127 1111111 7F 9 G
  • 关于音符一拍的时值计算

    音符一拍的时值计算是音乐理论中的基础概念,涉及音符的时值和拍号:

    1. 音符时值

    音符时值表示音符的持续时间,常见音符及其时值如下:

    • 全音符:4拍
    • 二分音符:2拍
    • 四分音符:1拍
    • 八分音符:0.5拍
    • 十六分音符:0.25拍

    2. 拍号

    拍号决定每小节的拍数和每拍的时值,通常表示为分数,如4/4、3/4等。

    • 分子:每小节的拍数
    • 分母:每拍的音符类型(4代表四分音符,8代表八分音符)

    3. 计算一拍的时值

    以4/4拍为例:

    • 拍号:4/4
    • 每拍时值:四分音符(分母为4)
    • 每拍时长:1拍

    4. 不同拍号的时值计算

    • 3/4拍:每拍为四分音符,每小节3拍。
    • 6/8拍:每拍为八分音符,每小节6拍。

    5. 示例

    • 4/4拍:四分音符=1拍,二分音符=2拍,全音符=4拍。
    • 6/8拍:八分音符=1拍,四分音符=2拍,附点四分音符=3拍。

    6. 实际应用

    • 4/4拍:四分音符=1拍,八分音符=0.5拍。
    • 3/4拍:四分音符=1拍,二分音符=2拍。

    总结

    音符一拍的时值由拍号决定,分母指定每拍的音符类型,分子决定每小节的拍数。

  • Laravel 学习笔记

    一、前期准备:项目初始化与基础配置

    1.1 项目创建与依赖安装

    Laravel 内置API开发支持,无需额外引入前端脚手架,推荐使用纯净API项目初始化方式:

    # 创建Laravel项目
    composer create-project laravel/laravel laravel-api
    
    # 进入项目目录
    cd laravel-api
    
    # 禁用前端相关依赖(可选,纯API无需前端)
    rm -rf resources/js resources/css package.json vite.config.js

    1.2 环境配置与数据库连接

    修改根目录 .env 文件,配置核心环境变量,确保数据库、时区、接口响应格式适配后端API:

    # 应用基础配置
    APP_NAME=LaravelAPI
    APP_ENV=local
    APP_KEY=生成的密钥
    APP_DEBUG=true
    APP_URL=http://localhost:8000
    APP_TIMEZONE=Asia/Shanghai
    APP_LOCALE=zh-CN
    
    # 数据库配置(MySQL为例)
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=laravel_api
    DB_USERNAME=root
    DB_PASSWORD=
    
    # 接口跨域配置(后续详解)
    ALLOWED_ORIGINS=*

    生成应用密钥(必填,保障加密安全):

    php artisan key:generate

    二、路由:API路由定义与规范

    2.1 API专属路由文件

    Laravel 提供 routes/api.php 路由文件,专门用于定义后端接口,默认前缀 /api,无需手动添加,且不包含Session中间件,适配无状态API。

    2.2 基础路由定义

    use Illuminate\Support\Facades\Route;
    use App\Http\Controllers\Api\UserController;
    use App\Http\Controllers\Api\PostController;
    
    // 单接口路由
    Route::get('/test', function () {
        return response()->json([
            'code' => 200,
            'msg' => 'API接口正常',
            'data' => []
        ]);
    });
    
    // 控制器路由(推荐)
    Route::get('/users', [UserController::class, 'index']); // 用户列表
    Route::get('/users/{id}', [UserController::class, 'show']); // 单个用户
    Route::post('/users', [UserController::class, 'store']); // 创建用户
    Route::put('/users/{id}', [UserController::class, 'update']); // 更新用户
    Route::delete('/users/{id}', [UserController::class, 'destroy']); // 删除用户
    

    2.3 资源路由(RESTful规范)

    针对标准CRUD接口,使用资源路由简化定义,自动映射RESTful风格接口:

    // 完整资源路由
    Route::apiResource('posts', PostController::class);
    
    // 仅指定部分接口
    Route::apiResource('posts', PostController::class)->only(['index', 'show']);
    
    // 排除部分接口
    Route::apiResource('posts', PostController::class)->except(['destroy']);

    2.4 路由分组与中间件

    对接口进行分组管理,统一添加前缀、中间件(如鉴权、跨域):

    Route::prefix('v1')->group(function () {
        // 公开接口
        Route::post('/login', [AuthController::class, 'login']);
        Route::post('/register', [AuthController::class, 'register']);
    
        // 需鉴权接口
        Route::middleware('auth:sanctum')->group(function () {
            Route::get('/user/info', [AuthController::class, 'userInfo']);
            Route::apiResource('posts', PostController::class);
        });
    });

    三、控制器:API业务逻辑处理

    3.1 创建API专用控制器

    推荐在 app/Http/Controllers/Api 目录下创建控制器,区分前后端,命令行创建:

    # 创建基础控制器
    php artisan make:controller Api/UserController
    
    # 创建资源控制器(自带CRUD方法)
    php artisan make:controller Api/PostController --api

    3.2 控制器标准写法(API响应规范)

    后端API统一返回JSON格式数据,遵循 code+msg+data 响应规范,避免直接返回原生数据:

    <?php
    
    namespace App\Http\Controllers\Api;
    
    use App\Http\Controllers\Controller;
    use App\Models\User;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Hash;
    
    class UserController extends Controller
    {
        /**
         * 用户列表
         */
        public function index(Request $request)
        {
            // 分页查询
            $users = User::query()->paginate(10);
            return $this->success('用户列表获取成功', $users);
        }
    
        /**
         * 单个用户详情
         */
        public function show($id)
        {
            $user = User::find($id);
            if (!$user) {
                return $this->fail('用户不存在', 404);
            }
            return $this->success('用户详情获取成功', $user);
        }
    
        /**
         * 统一成功响应
         */
        protected function success($msg = '操作成功', $data = [], $code = 200)
        {
            return response()->json([
                'code' => $code,
                'msg' => $msg,
                'data' => $data
            ]);
        }
    
        /**
         * 统一失败响应
         */
        protected function fail($msg = '操作失败', $code = 400)
        {
            return response()->json([
                'code' => $code,
                'msg' => $msg,
                'data' => []
            ]);
        }
    }
    

    四、请求验证:参数校验与异常处理

    4.1 表单请求验证(推荐)

    创建独立验证类,分离校验逻辑与业务逻辑,命令行创建:

    php artisan make:request Api/UserStoreRequest

    编写验证规则(app/Http/Requests/Api/UserStoreRequest.php):

    <?php
    
    namespace App\Http\Requests\Api;
    
    use Illuminate\Foundation\Http\FormRequest;
    
    class UserStoreRequest extends FormRequest
    {
        /**
         * 权限判断
         */
        public function authorize()
        {
            return true; // 开放接口直接返回true
        }
    
        /**
         * 验证规则
         */
        public function rules()
        {
            return [
                'username' => 'required|string|unique:users|max:20',
                'email' => 'required|email|unique:users',
                'password' => 'required|string|min:6|confirmed',
            ];
        }
    
        /**
         * 自定义错误提示
         */
        public function messages()
        {
            return [
                'username.required' => '用户名不能为空',
                'email.unique' => '邮箱已被注册',
                'password.confirmed' => '两次密码不一致',
            ];
        }
    }
    

    4.2 控制器调用验证

    public function store(UserStoreRequest $request)
    {
        // 验证通过后获取安全参数
        $data = $request->validated();
        $data['password'] = Hash::make($data['password']);
        $user = User::create($data);
        return $this->success('用户创建成功', $user);
    }

    4.3 全局异常处理(API适配)

    修改 app/Exceptions/Handler.php,将异常转为JSON响应,避免页面报错:

    use Illuminate\Validation\ValidationException;
    
    public function register()
    {
        $this->renderable(function (ValidationException $e, $request) {
            if ($request->is('api/*')) {
                return response()->json([
                    'code' => 422,
                    'msg' => '参数校验失败',
                    'data' => $e->errors()
                ], 422);
            }
        });
    }

    五、数据库:迁移、模型与数据操作

    5.1 数据迁移(表结构管理)

    通过迁移文件管理数据库表,无需手动建表:

    # 创建迁移文件
    php artisan make:migration create_posts_table
    
    # 执行迁移(建表)
    php artisan migrate
    
    # 回滚迁移
    php artisan migrate:rollback

    迁移文件示例(创建文章表):

    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('content');
            $table->integer('user_id');
            $table->timestamps();
        });
    }

    5.2 模型定义与关联

    # 创建模型
    php artisan make:model Post

    模型配置(app/Models/Post.php):

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    
    class Post extends Model
    {
        use HasFactory;
    
        // 允许批量赋值字段
        protected $fillable = ['title', 'content', 'user_id'];
    
        /**
         * 关联用户(一对多)
         */
        public function user()
        {
            return $this->belongsTo(User::class);
        }
    }

    5.3 API常用数据操作

    • 分页查询Post::paginate(10),自动返回分页元数据

    • 条件筛选Post::where('user_id', $userId)->get()

    • 关联查询Post::with('user')->paginate(10)(预加载避免N+1问题)

    • 新增数据Post::create($validatedData)

    • 更新数据Post::findOrFail($id)->update($validatedData)

    • 删除数据Post::findOrFail($id)->delete()

    六、接口鉴权:Sanctum无状态认证

    6.1 Sanctum安装与配置

    Laravel官方推荐的轻量级API鉴权方案,无状态、适配纯后端接口:

    # 安装Sanctum
    composer require laravel/sanctum
    
    # 发布配置文件
    php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
    
    # 执行迁移(生成令牌表)
    php artisan migrate

    app/Models/User.php 引入令牌 trait:

    use Laravel\Sanctum\HasApiTokens;
    
    class User extends Authenticatable
    {
        use HasApiTokens, HasFactory, Notifiable;
    }

    6.2 登录签发令牌

    public function login(Request $request)
    {
        $credentials = $request->validate([
            'email' => 'required|email',
            'password' => 'required|string',
        ]);
    
        if (!Auth::attempt($credentials)) {
            return $this->fail('账号或密码错误', 401);
        }
    
        $user = Auth::user();
        // 签发令牌
        $token = $user->createToken('api_token')->plainTextToken;
    
        return $this->success('登录成功', [
            'token' => $token,
            'user' => $user
        ]);
    }

    6.3 鉴权中间件使用

    在路由中添加 auth:sanctum 中间件,保护接口:

    Route::middleware('auth:sanctum')->group(function () {
        Route::get('/user/profile', [AuthController::class, 'profile']);
        Route::apiResource('posts', PostController::class);
    });

    前端请求时,在请求头携带令牌:Authorization: Bearer 令牌值

    6.4 退出登录(销毁令牌)

    public function logout(Request $request)
    {
        $request->user()->currentAccessToken()->delete();
        return $this->success('退出登录成功');
    }

    七、跨域处理:API接口跨域解决方案

    纯后端API需解决跨域问题,Laravel 自带跨域中间件,修改配置文件 config/cors.php

    return [
        'paths' => ['api/*'],
        'allowed_methods' => ['*'],
        'allowed_origins' => ['*'], // 生产环境替换为具体域名
        'allowed_origins_patterns' => [],
        'allowed_headers' => ['*'],
        'exposed_headers' => [],
        'max_age' => 0,
        'supports_credentials' => false,
    ];

    修改后重启服务,跨域中间件自动生效。

    八、API优化与进阶技巧

    8.1 资源响应(格式化输出)

    使用API资源类统一数据返回格式,避免字段冗余:

    # 创建资源类
    php artisan make:resource PostResource

    资源类编写(app/Http/Resources/PostResource.php):

    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'content' => $this->content,
            'author' => $this->user->username ?? '',
            'create_time' => $this->created_at->toDateTimeString(),
        ];
    }

    控制器调用:return $this->success('获取成功', PostResource::collection($posts));

    8.2 接口限流(防恶意请求)

    使用Laravel内置限流中间件,限制接口请求频率:

    // 限制1分钟内最多60次请求
    Route::middleware('throttle:60,1')->group(function () {
        Route::post('/login', [AuthController::class, 'login']);
    });

    8.3 软删除与数据恢复

    迁移文件添加软删除字段,模型引入软删除trait,避免物理删除数据:

    // 迁移文件
    $table->softDeletes();
    
    // 模型
    use Illuminate\Database\Eloquent\SoftDeletes;
    class Post extends Model
    {
        use SoftDeletes;
    }

    九、接口调试与启动

    • 启动服务php artisan serve,默认地址 http://127.0.0.1:8000

    • 路由查看php artisan route:list,查看所有API路由详情

    • 调试工具:使用Postman、ApiFox等接口工具调试,无需前端页面

    • 日志查看:日志文件位于 storage/logs/laravel.log,排查后端异常

    需要我帮你导出纯文本Markdown文件,或者精简成一页速查版方便查阅吗?

  • 【Nginx】学习笔记

    常用命令

    • 检查配置文件正确性

      nginx -t
    • 重启服务

      sudo nginx -s reload
    • 停止服务

      sudo nginx -s quit|stop
    • 启动服务

      sudo nginx
    • 查看进程

      ps aux | grep nginx

    其它

    • 查找 nginx.conf 的位置

      find / -name nginx.conf
    • 指定启动配置文件

      sudo nginx -c /usr/local/nginx/conf/nginx.conf
    user root owner; # 运行时的用户名
    worker_processes 1; # 运行时的进程数
    error_log /var/log/nginx/error.log; # 错误日志存放位置
    pid /run/nginx.pid; # 设置 nginx 的 master 进程 ID 写入的位置
    events {
        worker_connections 1024; # 设置每个 woker 进程同时能为多少个连接提供服务
    }
    http {
        include mime.types; # 把 mime.types 这个文件的内容加载进来
        access_log /var/log/nginx/access.log  main; # 指令设置了访问的日志存储的位置
        index index.html index.htm; # 设置了当请求的地址里不包含特定的文件的时候,默认打开的文件
        server {
            server_name hezhiyi.com; # 创建基于主机名的虚拟主机
            root "/Users/GZZHIYI/Documents/web"; # 配置虚拟主机的根目录 
            location / { ... }; # 配置 nginx 怎么样响应请求的资源
        }
    }