分类: 其它

  • 【Godot】节点分类列表(4.0+ 版本)

    1. 基础节点(Base Nodes)

    这是所有节点的根基础。

    节点 说明
    Object 所有类的根
    Node 所有场景节点基础
    Window 窗口节点
    Viewport 渲染视口
    CanvasItem 2D 可绘制节点基础
    Node3D 3D 节点基础
    Control UI 节点基础

    2. 2D 节点(Node2D 系列)

    常用 2D 节点

    节点 作用
    Node2D 2D 节点基础
    Sprite2D 显示图片
    AnimatedSprite2D 2D 动画精灵
    Polygon2D 多边形绘制
    Line2D 绘制线条
    Parallax2D 视差背景
    Marker2D 位置标记
    RemoteTransform2D 同步 Transform

    2D 物理节点

    节点 作用
    CharacterBody2D 角色控制
    RigidBody2D 刚体
    StaticBody2D 静态物体
    Area2D 区域检测
    CollisionShape2D 碰撞体
    CollisionPolygon2D 多边形碰撞
    RayCast2D 射线检测
    ShapeCast2D 形状检测

    2D 地图与导航

    节点 作用
    TileMap 瓦片地图
    NavigationRegion2D 导航区域
    NavigationAgent2D AI 寻路
    NavigationObstacle2D 导航障碍

    2D 特效节点

    节点 作用
    GPUParticles2D GPU 粒子
    CPUParticles2D CPU 粒子
    Light2D 2D 灯光
    PointLight2D 点光源
    DirectionalLight2D 平行光
    FogVolume 雾效

    3. 3D 节点(Node3D 系列)

    常用 3D 节点

    节点 作用
    Node3D 3D 基础节点
    MeshInstance3D 显示模型
    Sprite3D 3D 精灵
    Label3D 3D 文本
    Camera3D 摄像机
    Marker3D 标记点

    3D 物理节点

    节点 作用
    CharacterBody3D 3D 角色
    RigidBody3D 刚体
    StaticBody3D 静态碰撞
    Area3D 区域检测
    CollisionShape3D 碰撞体
    RayCast3D 射线
    VehicleBody3D 车辆
    VehicleWheel3D 车轮

    3D 光照与环境

    节点 作用
    DirectionalLight3D 平行光
    OmniLight3D 点光
    SpotLight3D 聚光灯
    WorldEnvironment 全局环境
    ReflectionProbe 反射探针
    Decal 投影贴花
    LightmapGI 光照烘焙
    VoxelGI 实时 GI

    3D 导航

    节点 作用
    NavigationRegion3D 导航区域
    NavigationAgent3D 寻路 AI
    NavigationLink3D 导航连接
    NavigationObstacle3D 障碍

    3D 特效

    节点 作用
    GPUParticles3D GPU 粒子
    CPUParticles3D CPU 粒子
    FogVolume 体积雾
    AudioStreamPlayer3D 3D 音效

    4. UI 节点(Control 系列)

    基础 UI

    节点 作用
    Control UI 基础
    Label 文本
    Button 按钮
    TextureRect 图片
    Panel 面板
    ColorRect 纯色块
    RichTextLabel 富文本

    输入控件

    节点 作用
    LineEdit 单行输入
    TextEdit 多行输入
    CheckBox 复选框
    OptionButton 下拉菜单
    Slider 滑块
    SpinBox 数值输入

    容器布局

    节点 作用
    HBoxContainer 横向布局
    VBoxContainer 纵向布局
    GridContainer 网格布局
    MarginContainer 边距
    CenterContainer 居中
    ScrollContainer 滚动

    UI 弹窗

    节点 作用
    Popup 弹窗基础
    PopupMenu 菜单
    AcceptDialog 对话框
    FileDialog 文件选择

    5. 音频节点

    节点 作用
    AudioStreamPlayer 2D 音频
    AudioStreamPlayer2D 2D 空间音频
    AudioStreamPlayer3D 3D 空间音频
    AudioListener3D 音频监听
    AudioEffect 音效处理

    6. 动画节点

    节点 作用
    AnimationPlayer 动画播放
    AnimationTree 动画状态机
    Tween 补间动画
    AnimatedSprite2D 帧动画
    Skeleton2D 2D 骨骼
    Skeleton3D 3D 骨骼

    7. 网络节点

    节点 作用
    MultiplayerSpawner 网络生成
    MultiplayerSynchronizer 数据同步
    WebSocketPeer WebSocket
    ENetMultiplayerPeer ENet 网络

    8. 数据与资源节点

    节点 作用
    Resource 资源基类
    PackedScene 场景资源
    Shader Shader
    Animation 动画资源
    Theme UI 主题

    9. 调试与辅助节点

    节点 作用
    Timer 定时器
    HTTPRequest HTTP 请求
    VisibleOnScreenNotifier2D 可见检测
    VisibleOnScreenEnabler2D 自动启停
    Path2D 路径
    PathFollow2D 路径跟随
  • 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,排查后端异常
  • 【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 怎么样响应请求的资源
        }
    }