分类 开发笔记 下的文章

这个问题非常常见,本质是 z-index 层级冲突。Element Plus 的 el-dialog 默认是挂载在当前组件上下文内(不是挂载到 body),而 el-table 的表格内容有时会开启 overflow 隐藏或 transform,导致 dialog 被裁剪或压在下面。

解决方案

非常简单,使用 append-to-body,将 el-dialog 输出到最外的层级。

<el-dialog
  v-model="visible"
  title="详情"
  append-to-body
>
  ...
</el-dialog>

在实际项目(特别是 Vite + Vue3 + Element Plus)中,建议所有全屏或模态层组件(如 Dialog、Drawer、Popconfirm)都加上 append-to-body,以避免被嵌套容器影响。

本文不谈商业服务,只讨论免费的服务。

如果不考虑商业用途,只是个人学习使用的话,那么 ipip.net 的地址库应该是最好用的,创始人是国内早期的站长。

2025-10-14T03:12:39.png

不过刚发现从2019年开始就停止更新了。。。

2025-10-14T03:15:22.png

企业版是正常更新的:

2025-10-14T03:19:52.png

但如果商业使用,ipip.net 就必须付费了。

还好有国外的这些。

2025-10-14T02:55:48.png

在中国大陆的实际表现(社区与实测汇总)

2025-10-14T02:56:15.png

平均城市级正确率在 60%左右,但省级准确率达 80–90%。

综合来说,推荐优先级如下:

GeoLite2 ≥ IP2Location DB9 ≥ DB-IP Lite

GeoLite2 下载地址

GeoLite2-City.mmdb

PS: 从 2019 年底开始,下载 GeoLite2-City.mmdb 必须先注册登录 MaxMind 帐号。这是 MaxMind 公司根据隐私法规(GDPR / CCPA)调整后实施的强制措施。

以前(2019 年前)GeoLite2 是完全公开的匿名下载;但自从隐私法规要求对 IP 数据分发进行追踪后,MaxMind 改为:“所有下载必须使用授权 License Key 进行身份验证。”

- 阅读剩余部分 -

过去两年,AI 产品的形态经历了一次悄无声息但深刻的转变。最初,人们把 ChatGPT 当成一个“万事通”的聊天窗口,各种外部 App 都在想办法“嵌入 Chat”。从最早的 ChatGPT 插件到后来的 Actions,每个 App 都希望被 ChatGPT 调用,希望在那一行对话背后,能让模型触发自己的服务。这种形态其实沿袭了传统互联网思维:AI 是一个超级入口,而所有第三方都是被调用的 API,它们被动等待用户的自然语言指令,然后在后台完成任务。这一时期的 Chat,更像一个智能中控台,App 只是工具箱里的螺丝刀。

但今年情况变了。OpenAI 推出了 Apps SDK,一切开始反转。过去是 App 嵌入 Chat,现在是 Chat 嵌入 App。这听起来只是语序的变化,实则是产品范式的质变。Apps SDK 让开发者可以构建自己的 MCP 服务端(Model Context Protocol Server),再配上前端 widget,小到一个查询组件,大到一个完整的操作界面,都能被模型直接加载到对话中。与此同时,App 自身也能反向调用 ChatGPT,让聊天成为自己应用内部的一部分。这意味着 ChatGPT 不再是一个独立入口,而开始“渗入”每一个 App 的界面、逻辑与体验之中。

- 阅读剩余部分 -

2025年了,马上2026年了,距离2017年微信小程序推出快10年了,应该选择什么框架开发微信小程序?还是用原生开发?

不得不说原生开发是最靠谱的方案之一,毕竟没有中间商,理论上坑是最少的。

如果你不嫌原生开发一个页面分4个文件麻烦,还是可以考虑的。而且绝大多数场景下,小程序只需要开发微信的就行了,其他家的小程序都不是主流,没有必要开发多端。

如果你跟我一样非常嫌弃原生的开发方式或者需要开发多端,那就需要考虑选择一款框架了。

MPX

MPX 是滴滴的研发团队出品,轻量,兼容原生,性能好,也支持跨平台,使用 vue 的语法,熟悉 vue 的还是比较推荐使用的。

缺点是 JetBrains 没有插件支持(原来有一个的,后来下架了)。

- 阅读剩余部分 -

WildCard 经历了停服风波后,一度传出可能会恢复的消息。

但由于监管合规问题,我觉得大概率要凉凉了。

果然,又经历了一场恢复停服风波后,现在应该尘埃落定,确定凉凉了,后面恢复的可能性应该很低了。

2025-10-09T09:21:49.png

在第一次停服的时候,我就开始寻找续费 ChatGPT 的方法。

然后我就找到了一个靠谱的方法,不过稍微有点麻烦,并且只适用于 Apple 用户。

准备工作

  1. 自己的美区 iCloud 的账号(无需绑定信用卡,没有可以买一个,租的不行哦);
  2. 支付宝;

步骤:

- 阅读剩余部分 -

本文适用于 macOS(包括 Intel 和 Apple Silicon/M 系列芯片),可在终端中直接操作,笔者使用的是 M4 MacBook Air,系统是最新的 macOS 26.0.1。

SDKMAN!(Software Development Kit Manager)是一个可以方便地安装、管理和切换不同版本的跨平台的命令行工具,类似于 Python 生态的 pyenv, Node.js 生态的 nvm。

笔者使用的是 macOS 操作系统,但 Windows/Linux 操作应该也是类似的。

安装 SDKMAN

打开 macOS 终端(Terminal),执行:

curl -s "https://get.sdkman.io" | bash

- 阅读剩余部分 -

需求:把日志文件 /var/www/demo/app.log 按天切分。

  1. 创建 logrotate 配置文件:
vim /etc/logrotate.d/demo

demo 是你的配置文件名,可以随便起。

配置内容:

/var/www/demo/app.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    copytruncate
}
  1. 手动测试
logrotate -f /etc/logrotate.d/demo

如果出现以下报错:

- 阅读剩余部分 -

在 PHP 8.5 中引入的 pipe 管道操作符 (|>) 是一个非常实用的新语法特性,它为函数调用链式表达提供了更清晰的写法。传统上,如果我们需要把一个值依次传入多个函数,往往要么嵌套调用(可读性差),要么借助临时变量。管道语法的核心思想是:将左边的表达式结果,作为参数传递给右边的函数。这样可以让代码像数据流一样从左到右自然流动。

例如,过去我们可能会写:

$result = strtoupper(trim($name));

使用管道语法后,可以改写为:

$result = $name |> trim($$) |> strtoupper($$);

- 阅读剩余部分 -