AI写了一个自用的链接跳转网页程序

2025年12月8日 13点热度 0人点赞 0条评论

业务需要,某些业务二维码不便随意发给客户,解析二维码获得链接,使用链接跳转生成新链接再生成新的二维码,网上找了几个链接跳转服务和动态二维码之类的,都不符合预期,特别是有限期设定的功能,使用AI写了一个

示例:https://yangjinyou.com/page/dwz/redirect.php?c=BMGmwi

# dwz 短网址服务(仅展示不发代码,AI写的,没有什么技术含量)

## 概述
- 一个轻量、可自部署的短网址(URL Shortener)与链接管理工具。
- 支持登录保护、链接创建/编辑/删除、到期控制、访问次数统计、二维码生成。
- 使用 PHP + PDO 连接 MySQL,表结构在首次运行时自动初始化。

## 技术栈
- 语言与运行时:PHP 7.4+/8.x(需启用 `pdo_mysql` 扩展)
- 数据库:MySQL 5.7+/8.0(InnoDB,`utf8mb4`)
- 依赖:纯原生 PHP,无 Composer 依赖

## 目录结构
```
/dwz
├── config.php # 数据库配置(主机/端口/库名/用户/密码/字符集)
├── db.php # 数据库连接与表结构初始化
├── password_config.php # 密码哈希读取/验证/更新
├── auth.php # 登录态校验拦截器
├── login.php # 登录页
├── logout.php # 退出
├── change_password.php # 修改密码
├── index.php # 管理首页(创建短链、列表、编辑、删除、二维码)
├── update.php # 编辑更新接口
├── delete.php # 删除接口
└── redirect.php # 跳转页(带过期提示与访问计数)
```

## 功能说明
- 登录保护:
- 进入管理页需先登录;登录成功后持久化 Session。
- 默认初始密码为 `admin123`(首次运行会写入哈希)。请及时修改。
- 创建短链:
- 输入原始 URL、可选名称,支持有效期:永久、1小时、1天、7天、30天。
- 自动生成 6 位大小写字母+数字的短码;冲突时会重试。
- 管理列表:
- 展示最近 100 个短链,包含短码、名称、原链接、创建时间、有效期、访问次数、二维码。
- 支持编辑(短码、名称、URL、有效期)与删除。
- 跳转与统计:
- `redirect.php?c=短码` 自动跳转到原链接,过期则展示到期页面。
- 每次跳转会将 `hits` 计数 +1。
- 二维码:
- 生成指向短链接的二维码图片;页面内可导出画布。

## 配置
- 数据库配置位于 `config.php`:
```php
return [
'host' => '',
'port' => 3306,
'dbname' => '',
'user' => '',
'pass' => '',
'charset' => 'utf8mb4',
];
```
- 连接读取与初始化:`dwz/db.php:3–5` 使用 `config.php` 构造 DSN 并连接,随后创建/补齐表结构。
- 建议将 `config.php` 置于访问控制之下,并在版本控制中忽略,以避免敏感信息泄露。

## 数据库
- 表结构在 `dwz/db.php` 中自动初始化:
```sql
CREATE TABLE IF NOT EXISTS links (
id INT AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(32) UNIQUE NOT NULL,
url TEXT NOT NULL,
created_at INT NOT NULL,
expires_at INT NULL,
name VARCHAR(255) NULL,
hits INT NOT NULL DEFAULT 0
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS settings (
`key` VARCHAR(64) PRIMARY KEY,
`value` VARCHAR(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
- 说明:
- `links.code` 唯一,作为短链标识。
- `created_at`/`expires_at` 为 Unix 时间戳(秒)。
- `settings` 存储键值配置,目前用于保存登录密码的 MD5 哈希(键名:`password_hash`)。

## 初始化与部署
1. 创建数据库与用户(示例):
```sql
CREATE DATABASE dwzdwz CHARACTER SET utf8mb4;
CREATE USER 'dwzdwz'@'127.0.0.1' IDENTIFIED BY 'Aa123456';
GRANT ALL PRIVILEGES ON dwzdwz.* TO 'dwzdwz'@'127.0.0.1';
FLUSH PRIVILEGES;
```
2. 配置 `dwz/config.php` 为上述连接信息。
3. 将 `/dwz` 目录部署到 Web 根或配置虚拟主机,确保 PHP 开启 `pdo_mysql`。
4. 访问 `login.php` 登录管理后台(默认密码:`admin123`),并在 `change_password.php` 及时修改。

## 运行与使用
- 管理页:`index.php`
- 新建短链后会显示短链接示例:`redirect.php?c=XXXXXX`
- 列表支持编辑、删除、二维码预览与导出画布。
- 跳转页:`redirect.php?c=XXXXXX`
- 已过期返回到期提示;未过期 1 秒后自动跳转。
- 登录退出:`login.php` / `logout.php`
- 修改密码:`change_password.php`

## 代码参考
- 连接与建表:`dwz/db.php:3–19`
- 列补齐(兼容旧表):`dwz/db.php:20–25`
- 默认密码写入:`dwz/db.php:26–33`(MD5('admin123'))
- 密码读取/更新:`dwz/password_config.php:4–7`、`dwz/password_config.php:23–25`
- 创建短链:`dwz/index.php:27–54`(含冲突重试与有效期计算)
- 跳转与计数:`dwz/redirect.php:68–71`
- 编辑更新:`dwz/update.php:24–33`
- 删除:`dwz/delete.php:14–17`

## 安全与合规
- 强制使用 HTTPS,避免明文传输密码与会话。
- 生产环境请更改默认密码并限制数据库用户权限(仅对 `dwzdwz` 库授权)。
- 将 `config.php` 从版本库中忽略,并设置 Web 服务器禁止直接下载。
- 输入校验与过滤:创建/编辑接口已经校验 URL 与短码格式,并对输出进行转义。

## 迁移提示(从 SQLite 到 MySQL)
- 旧版本使用 `database/dwz.sqlite`;现已改为 MySQL。
- 迁移流程:导出旧库的 `links`/`settings` 数据(CSV/SQL),按当前表结构导入 MySQL;字段映射一致。
- 若 MySQL 中已有旧表且缺少列,程序会在运行时自动补齐 `name` 与 `hits` 列。

## 常见问题
- 无法连接数据库:
- 检查 `config.php` 内容、数据库服务是否运行、`pdo_mysql` 是否启用、用户权限是否授予。
- 短码重复:
- 创建时会重试 5 次;若仍失败,请手动重试或增大短码长度(修改 `index.php:9–16`)。
- 登录失败:
- 默认密码为 `admin123`;若忘记密码,可直接更新 `settings` 表中的 `password_hash` 为新的 MD5 值。

## 后续扩展建议
- 接入更安全的密码哈希(如 `password_hash`/`password_verify`,Bcrypt/Argon2)。
- 增加 API 接口(REST)以便外部系统调用。
- 引入分页与检索功能、支持自定义码长度与字符集。
- 增加访问日志表与来源统计分析。

kenny

这个人很懒,什么都没留下

文章评论