一个基于 Rust 后端 + React 前端的全栈校园回忆图片分享平台,支持多学校独立运营、OAuth 2.0 校园认证、AI 自动审核、EXIF 信息提取、实时统计与定时任务。
Memories 是一个多学校 (Multi-Tenant) 校园回忆图片分享平台。每个学校可以独立配置 OAuth 认证、Logo 和品牌信息,用户通过校园墙账号登录后可以上传、浏览、搜索校园回忆图片。平台内置 AI 自动审核机制,确保内容安全合规。
- 🏫 多校区 / 多学校的统一回忆分享平台
- 📸 毕业季、校庆等活动的照片收集与展示
- 🔍 按时间、标签、学校分类检索历史照片
- 🛡️ 需要内容审核的 UGC 图片平台
✅ 编译通过 (Rust 1.93.0, 0 错误, 38 非关键警告)
✅ 所有核心功能已实现
┌──────────────────────────────────────────────────────┐
│ 用户浏览器 │
│ (React SPA + Tailwind CSS) │
└──────────────┬───────────────────────────────────────┘
│ HTTP/HTTPS
▼
┌──────────────────────────────────────────────────────┐
│ Nginx (前端静态资源) │
│ Port 80/443 │
└──────────────┬───────────────────────────────────────┘
│ API 代理 (/api/*)
▼
┌──────────────────────────────────────────────────────┐
│ Actix-web 后端服务 (Rust) │
│ Port 8080 │
│ ┌──────────┬──────────┬──────────┬──────────┐ │
│ │ Handlers │ Services │ Models │ Utils │ │
│ │ (API层) │ (业务层) │ (数据层) │ (工具层) │ │
│ └──────────┴──────────┴──────────┴──────────┘ │
│ ┌──────────────────────────────────────────┐ │
│ │ 调度器: 定时统计 + 链接保活 + 内存清理 │ │
│ └──────────────────────────────────────────┘ │
└──────────────┬───────────────────────────────────────┘
│ SQL (SQLx 异步)
▼
┌──────────────────────────────────────────────────────┐
│ PostgreSQL 16 数据库 │
│ Port 5432 │
│ 20 张迁移表: schools, users, images, tags, stats... │
└──────────────────────────────────────────────────────┘
│
▼ (可选)
┌──────────────────────────────────────────────────────┐
│ 外部服务集成 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ OAuth 2.0 │ │ OpenAI │ │ 图床服务 │ │
│ │ 校园墙 │ │ AI 审核 │ │ 图片存储 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└──────────────────────────────────────────────────────┘
| 类别 | 技术 | 说明 |
|---|---|---|
| 语言 | Rust 2021 Edition | 内存安全、高性能 |
| Web 框架 | Actix-web 4.x | 异步 Actor 模型 HTTP 服务器 |
| 数据库驱动 | SQLx 0.7 | 异步、编译时 SQL 校验的 PostgreSQL 驱动 |
| 异步运行时 | Tokio 1.x | Rust 异步生态核心 |
| OAuth 2.0 | oauth2 4.x + reqwest | 校园墙 OAuth 认证集成 |
| AI 集成 | async-openai 0.23 | OpenAI API 调用 (支持自定义 Base URL) |
| EXIF 解析 | kamadak-exif 0.5 | 读取 JPEG 图片拍摄时间 |
| 定时任务 | tokio-cron-scheduler 0.11 | Cron 表达式调度 |
| 序列化 | serde + serde_json | JSON 序列化/反序列化 |
| 日志 | tracing + tracing-subscriber | 结构化日志 |
| 验证 | validator 0.18 | 请求参数校验 |
| 错误处理 | anyhow + thiserror | 灵活的错误处理 |
| 类别 | 技术 | 说明 |
|---|---|---|
| 框架 | React 19 | UI 组件库 |
| 语言 | TypeScript 5 | 类型安全 |
| 构建 | Vite 6 | 快速开发与构建 |
| 样式 | Tailwind CSS 4 | 实用优先的 CSS 框架 |
| 状态管理 | Zustand 5 | 轻量级全局状态 |
| 数据请求 | TanStack Query (React Query) | 缓存与自动刷新 |
| 路由 | React Router 7 | 客户端路由 |
| 表单 | react-hook-form + Zod | 表单验证 |
| 通知 | sonner | Toast 通知组件 |
| 布局 | react-masonry-css | 瀑布流图片布局 |
| 类别 | 技术 | 说明 |
|---|---|---|
| 数据库 | PostgreSQL 16 | 关系型数据库 |
| 容器化 | Docker + Docker Compose | 一键部署 |
| 反向代理 | Nginx (前端容器内) | 静态资源 + API 代理 |
Memories/
├── Cargo.toml # Rust 项目配置 (依赖、二进制入口)
├── Cargo.lock # 依赖锁文件
├── docker-compose.yml # Docker 三服务编排 (PG + 后端 + 前端)
├── Dockerfile # 后端多阶段构建镜像
├── package.json # 根目录包信息
├── .env.example # 环境变量模板
├── .gitignore
│
├── migrations/ # 数据库迁移脚本 (按序执行)
│ ├── 001_create_schools.sql # 学校表
│ ├── 002_create_users.sql # 用户表
│ ├── 003_create_images.sql # 图片表
│ ├── 004_create_image_tags.sql # 图片标签表
│ ├── 005_create_site_config.sql # 网站配置表
│ ├── 006_create_external_services.sql # 外部服务/友链表
│ ├── 007_create_global_stats.sql # 全局统计表
│ ├── 008_create_school_stats.sql # 学校统计表
│ ├── 009_fix_timestamp_types.sql # 时间戳类型修正
│ ├── 010_add_oauth_config_to_schools.sql # 学校 OAuth 配置字段
│ ├── 011_create_operation_logs.sql # 操作日志表
│ ├── 012_add_icp_filing.sql # ICP 备案号字段
│ ├── 013_add_backup_ai_config.sql # 备用 AI 配置
│ ├── 014_add_member_role.sql # 成员角色扩展
│ ├── 015_add_ai_providers.sql # AI 提供商多源支持
│ ├── 016_add_theme_config.sql # 主题配置
│ ├── 017_add_brand_slogan_github.sql # 品牌标语 + GitHub 链接
│ ├── 018_add_help_center_and_icons.sql # 帮助中心 + 图标配置
│ ├── 019_add_developers_changelog.sql # 开发者 + 更新日志
│ └── 020_add_user_fields.sql # 用户扩展字段
│
├── scripts/ # 运维脚本
│ ├── install-commands.sh # 安装全局 CLI 命令
│ └── memories-stop.sh # 停止服务脚本
│
├── src/ # Rust 后端源代码
│ ├── main.rs # 应用入口:路由、中间件、启动流程
│ ├── lib.rs # 模块声明
│ ├── config.rs # 配置管理 (环境变量 → Config 结构体)
│ ├── database.rs # 数据库连接池 + 迁移 + 默认配置初始化
│ ├── scheduler.rs # 定时任务调度器
│ │
│ ├── handlers/ # HTTP 请求处理器 (Controller 层)
│ │ ├── mod.rs # 模块导出
│ │ ├── auth.rs # OAuth 登录/回调/登出/用户信息
│ │ ├── image.rs # 图片上传/列表/详情/修改/删除
│ │ ├── admin.rs # 管理后台: 审核/用户管理/统计
│ │ ├── search.rs # 图片搜索/热门标签
│ │ ├── public.rs # 公开接口: 站点配置/学校列表
│ │ └── database.rs # 数据库管理接口 (调试用)
│ │
│ ├── models/ # 数据模型 (对应数据库表)
│ │ ├── mod.rs # 统一导出所有模型
│ │ ├── user.rs # 用户模型 + 角色管理
│ │ ├── school.rs # 学校模型 + OAuth 配置
│ │ ├── image.rs # 图片模型 + 搜索/分页/标签关联
│ │ ├── tag.rs # 标签模型 + 热门统计
│ │ ├── config.rs # 站点配置 + 外部服务
│ │ ├── stats.rs # 全局统计 + 学校统计
│ │ ├── ai_provider.rs # AI 提供商模型
│ │ └── operation_log.rs # 操作日志模型
│ │
│ ├── services/ # 业务逻辑服务层
│ │ ├── mod.rs
│ │ ├── oauth.rs # OAuth 2.0 认证流程
│ │ ├── ai_review.rs # AI 自动审核 (OpenAI 兼容 API)
│ │ ├── exif_parser.rs # EXIF 拍摄时间提取
│ │ ├── stats_updater.rs # 统计数据定时更新
│ │ ├── maintenance.rs # 运维任务: 链接保活/限流/内存清理
│ │ ├── school_init.rs # 首次运行学校初始化向导
│ │ ├── operation_log_service.rs # 操作日志记录
│ │ └── realtime_stats.rs # 实时统计查询
│ │
│ ├── utils/ # 工具模块
│ │ ├── mod.rs
│ │ ├── response.rs # 统一 JSON 响应格式
│ │ ├── validation.rs # 输入验证函数
│ │ └── process_lock.rs # 进程锁 (PID 文件管理)
│ │
│ └── bin/ # 额外的二进制入口
│ ├── cli.rs # CLI 工具 (数据库初始化/学校管理)
│ ├── stop.rs # 停止服务命令
│ └── commands/ # CLI 子命令模块
│
├── frontend/ # React 前端应用
│ ├── package.json # 前端依赖
│ ├── vite.config.ts # Vite 构建配置
│ ├── tsconfig.json # TypeScript 配置
│ ├── index.html # HTML 入口
│ ├── nginx.conf # 生产环境 Nginx 配置
│ ├── Dockerfile # 前端 Docker 镜像
│ ├── README.md # 前端文档
│ ├── GLOBAL_CONTEXT_MENU_USAGE.md # 全局右键菜单文档
│ └── src/
│ ├── main.tsx # React 入口
│ ├── App.tsx # 根组件 + 路由
│ ├── components/ # 组件
│ │ ├── admin/ # 管理后台组件
│ │ ├── auth/ # 认证组件
│ │ ├── common/ # 通用组件 (右键菜单等)
│ │ ├── image/ # 图片卡片/瀑布流
│ │ └── layout/ # 布局组件
│ ├── pages/ # 页面组件
│ ├── services/ # API 调用封装
│ ├── stores/ # Zustand 状态
│ ├── hooks/ # 自定义 Hooks
│ ├── types/ # TypeScript 类型
│ ├── lib/ # 工具库
│ └── assets/ # 静态资源
│
└── target/ # Rust 编译产物 (gitignore)
| 依赖 | 最低版本 | 说明 |
|---|---|---|
| Rust | 1.75+ | 推荐使用 rustup 安装 |
| PostgreSQL | 16 | 或使用 Docker 容器 |
| Node.js | 20+ | 前端构建 |
| Docker | 24+ | (可选) 容器化部署 |
这是最快捷的部署方式,会自动启动 PostgreSQL + 后端 + 前端三个服务。
# 1. 克隆项目
cd Memories
# 2. 配置环境变量
cp .env.example .env
# 编辑 .env,设置 DB_PASSWORD 和 OPENAI_API_KEY
# 3. 启动所有服务
docker-compose up -d
# 4. 查看运行状态
docker-compose ps
# 5. 查看日志
docker-compose logs -f app
# 6. 停止服务
docker-compose down启动后访问:
- 前端页面:
http://localhost - 后端 API:
http://localhost:8080/api
# 1. 启动 PostgreSQL (如果未安装可使用 Docker)
docker run -d --name memories-pg \
-e POSTGRES_DB=memories \
-e POSTGRES_USER=memories_user \
-e POSTGRES_PASSWORD=memories_password \
-p 5432:5432 \
postgres:16-alpine
# 2. 配置环境变量
export DATABASE_URL="postgresql://memories_user:memories_password@localhost:5432/memories"
export SESSION_SECRET="dev-secret-change-in-production"
export OPENAI_API_KEY="sk-your-key" # 可选,不设置则跳过 AI 审核
export RUST_LOG="memories=debug"
# 3. 运行数据库迁移 (或直接 cargo run 自动迁移)
cargo run --bin memories-cli -- init-db
# 4. 创建学校 (交互式)
cargo run --bin memories-cli -- create-school
# 5. 启动后端服务
cargo run
# 服务器监听 http://0.0.0.0:8080首次运行:系统会自动检测数据库状态,如果没有学校数据,会进入交互式创建向导。
cd frontend
# 安装依赖
npm install
# 开发模式 (热更新)
npm run dev
# 访问 http://localhost:5173
# 生产构建
npm run build详见 配置与部署 章节。
完整的 API 文档请参阅 API_DOCUMENTATION.md。以下是快速参考:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/site/config |
获取网站全局配置 |
| GET | /api/site/external-services |
获取友情链接列表 |
| GET | /api/schools |
获取学校列表 |
| GET | /api/schools/{id} |
获取学校详情 |
| GET | /api/images |
分页获取已审核图片 |
| GET | /api/images/{id} |
获取图片详情+标签 |
| GET | /api/search/images |
多维度搜索图片 |
| GET | /api/search/tags |
获取热门标签排行 |
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/auth/login?school_id={id} |
发起 OAuth 登录 (302 重定向) |
| GET | /api/auth/callback?code=&state= |
OAuth 回调处理 |
| POST | /api/auth/logout |
登出 |
| GET | /api/auth/profile |
获取当前用户信息 |
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/images/upload |
上传图片 |
| PUT | /api/images/{id} |
修改图片信息 |
| DELETE | /api/images/{id} |
删除图片 |
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/admin/images/pending |
获取待审核图片 |
| PUT | /api/admin/images/{id}/review?action=approve|reject |
审核图片 |
| GET | /api/admin/users |
用户列表 (分页) |
| PUT | /api/admin/users/{id}/role |
修改用户角色 |
| GET | /api/admin/stats/global |
全局统计数据 |
| GET | /api/admin/stats/schools |
各学校统计数据 |
项目包含 20 个数据库迁移脚本,按序号依次执行。以下是核心表的设计:
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | UUID | PK, DEFAULT gen_random_uuid() | 学校唯一标识 |
| name | VARCHAR(100) | NOT NULL, UNIQUE | 学校名称 |
| logo_url | TEXT | 学校 Logo 图片 URL | |
| oauth_base_url | TEXT | NOT NULL | OAuth 服务器基础 URL |
| oauth_client_id | VARCHAR(255) | OAuth 客户端 ID (010 迁移添加) | |
| oauth_client_secret | VARCHAR(255) | OAuth 客户端密钥 (010 迁移添加) | |
| oauth_scope | VARCHAR(255) | DEFAULT 'profile tenant' | OAuth 权限范围 (010 迁移添加) |
| created_at | TIMESTAMP | DEFAULT NOW() | 创建时间 |
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | UUID | PK, DEFAULT gen_random_uuid() | 用户唯一标识 |
| qq_number | VARCHAR(20) | UNIQUE, NOT NULL | QQ 号 (OAuth 标识) |
| role | VARCHAR(10) | CHECK (user/admin/member) | 用户角色 (014 添加 member) |
| nickname | VARCHAR(100) | 昵称 (020 迁移添加) | |
| avatar_url | TEXT | 头像 URL (020 迁移添加) | |
| created_at | TIMESTAMP | DEFAULT NOW() | 注册时间 |
| updated_at | TIMESTAMP | DEFAULT NOW() | 更新时间 |
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGSERIAL | PK | 自增主键 |
| url | TEXT | NOT NULL | 图片存储 URL |
| shot_timestamp | TIMESTAMP | NOT NULL | 拍摄时间 (来自 EXIF 或上传时间) |
| upload_timestamp | TIMESTAMP | DEFAULT NOW() | 上传时间 |
| last_maintenance_timestamp | TIMESTAMP | DEFAULT NOW() | 最后维护时间 (链接保活) |
| name | VARCHAR(255) | 图片名称/标题 | |
| description | TEXT | 图片描述/备注 | |
| file_size | BIGINT | 文件大小 (字节) | |
| school_id | UUID | FK → schools(id) CASCADE | 所属学校 |
| uploader_id | UUID | FK → users(id) SET NULL | 上传者 |
| file_type | VARCHAR(10) | CHECK (jpg/png/webp/gif) | 文件类型 |
| is_anonymous | BOOLEAN | DEFAULT FALSE | 是否匿名投稿 |
| status | VARCHAR(20) | CHECK (approved/pending/rejected) | 审核状态 |
| created_at | TIMESTAMP | DEFAULT NOW() | 创建时间 |
| updated_at | TIMESTAMP | DEFAULT NOW() | 更新时间 |
| 字段 | 类型 | 约束 | 说明 |
|---|---|---|---|
| id | BIGSERIAL | PK | 自增主键 |
| image_id | BIGINT | FK → images(id) CASCADE | 关联图片 |
| tag | VARCHAR(50) | NOT NULL | 标签文本 |
包含网站名称、Logo、公告、投稿规则、关于页面、隐私政策、服务条款、AI 配置、ICP 备案号、主题配色、品牌标语、GitHub 链接、帮助中心、图标配置、开发者信息、更新日志等 30+ 字段。
友情链接/外部服务信息:名称、URL、描述、图标。
每日统计快照:总图片数、总大小、平均大小、时间跨度、用户数、通过率、匿名率、文件类型分布、学校数量等。
按学校维度的每日统计快照,字段结构与全局统计类似。
记录管理员操作:操作类型、操作者、目标、详情、时间。
支持配置多个 AI 服务提供商,每个提供商有独立的 API Key、Base URL、Model。
- 每个学校拥有独立的 OAuth 配置、Logo、品牌信息
- 图片按 school_id 隔离,用户通过所属学校的 OAuth 登录
- 支持通过 CLI 工具动态添加/管理学校
- 对接校园墙 OAuth 2.0 授权码模式 (Authorization Code Grant)
- 流程:用户点击登录 → 重定向到校园墙授权页 → 用户授权 → 回调带回 code → 后端换取 token → 获取用户信息 → 创建/更新本地用户 → 建立 Session
- 第一个登录的用户自动设为管理员
- 图片上传后自动触发异步 AI 审核
- 使用 OpenAI 兼容 API (支持自定义 Base URL,可接入任何兼容服务)
- 支持主备双 AI 配置 (Migration 013),主 AI 不可用时自动切换备用
- 审核结果:
approved(通过) /rejected(拒绝) + 建议标签 - 审核失败时图片保持
pending状态,等待管理员手动处理
- 上传图片时自动下载到临时目录
- 使用
kamadak-exif解析 JPEG 拍摄时间 - 无 EXIF 数据时使用上传时间作为拍摄时间
- 解析完成后自动清理临时文件
| 任务 | Cron 表达式 | 说明 |
|---|---|---|
| 全局统计更新 | 每天 03:00 | 计算全局图片数、大小、通过率、类型分布等 |
| 学校统计更新 | 每天 04:00 | 按学校维度计算各项统计指标 |
| 链接保活检查 | 定期执行 | 检查超过 60 天未维护的图片链接 |
| 内存清理 | 定期执行 | 清理过期缓存和临时数据 |
- 全局 API 限流:默认 60 请求/分钟 (可通过
RATE_LIMIT_REQUESTS_PER_MINUTE配置) - 上传限流:默认 10 次/小时 (可通过
UPLOAD_RATE_LIMIT_PER_HOUR配置) - 超限返回 HTTP 429 状态码
- PID 文件锁:在项目根目录创建
memories.pid,防止重复启动 - 优雅关闭:捕获 SIGINT/SIGTERM 信号,等待当前请求完成后关闭
- 全局停止命令:
memories-stop可远程停止服务 - 详见 PROCESS_MANAGEMENT.md
| 变量名 | 默认值 | 说明 |
|---|---|---|
DATABASE_URL |
(必填) | PostgreSQL 连接字符串 |
SESSION_SECRET |
默认值 (请修改) | Session 加密密钥 |
SERVER_HOST |
0.0.0.0 |
服务器监听地址 |
SERVER_PORT |
8080 |
服务器监听端口 |
RATE_LIMIT_REQUESTS_PER_MINUTE |
60 |
全局 API 限流 (次/分钟) |
UPLOAD_RATE_LIMIT_PER_HOUR |
10 |
上传限流 (次/小时) |
LINK_MAINTENANCE_DAYS_THRESHOLD |
60 |
链接保活阈值 (天) |
DB_ADMIN_PASSWORD |
admin123 |
数据库管理密码 |
AI_API_KEY / OPENAI_API_KEY |
(空) | 主 AI API 密钥 |
AI_BASE_URL |
https://api.openai.com/v1 |
主 AI API 地址 |
AI_MODEL |
gpt-3.5-turbo |
主 AI 模型名称 |
AI_BACKUP_API_KEY / BACKUP_OPENAI_API_KEY |
(空) | 备用 AI API 密钥 |
AI_BACKUP_BASE_URL |
https://api.openai.com/v1 |
备用 AI API 地址 |
AI_BACKUP_MODEL |
gpt-3.5-turbo |
备用 AI 模型名称 |
RUST_LOG |
memories=info |
日志级别 (trace/debug/info/warn/error) |
# 启动所有服务
docker-compose up -d
# 仅启动数据库 (用于本地开发)
docker-compose up -d postgres
# 重新构建并启动
docker-compose up -d --build
# 查看各服务状态
docker-compose ps
# 停止并清理
docker-compose down -v # -v 同时删除数据卷创建 /etc/systemd/system/memories.service:
[Unit]
Description=Memories Backend Service
After=network.target postgresql.service
[Service]
Type=simple
User=memories
WorkingDirectory=/opt/memories
Environment="DATABASE_URL=postgresql://..."
Environment="SESSION_SECRET=your-secret"
Environment="RUST_LOG=info"
ExecStart=/opt/memories/target/release/memories
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable memories
sudo systemctl start memories
sudo systemctl status memoriesMemories 内置了完整的进程管理功能,详见 PROCESS_MANAGEMENT.md。
快速参考:
# 启动服务
cargo run
# 停止服务 (三种方式)
memories-stop # 全局命令 (需安装)
./scripts/memories-stop.sh # 直接脚本
Ctrl+C # 终端信号
# 安装全局命令
./scripts/install-commands.sh
# 清理残留 PID 文件
rm memories.pid# 1. 编译
cargo build
# 2. 运行 CLI 初始化数据库
cargo run --bin memories-cli -- init-db
# 3. 创建学校
cargo run --bin memories-cli -- create-school
# 4. 启动开发服务器
cargo runcargo run --bin memories-cli -- help # 帮助信息
cargo run --bin memories-cli -- init-db # 初始化数据库
cargo run --bin memories-cli -- create-school # 交互式创建学校
cargo run --bin memories-cli -- delete-schools # 删除所有学校 (危险!)详见 CLI_USAGE.md。
迁移脚本位于 migrations/ 目录,按序号自动执行。添加新迁移时:
- 创建新 SQL 文件,命名格式
NNN_description.sql - 重启应用,SQLx 会自动运行未执行的迁移
- Rust: 遵循标准 Rust 风格 (
rustfmt) - TypeScript/React: 遵循 ESLint 规则
- API 响应: 统一使用
utils::response模块的 JSON 格式 - 错误处理: Handler 层捕获错误并返回友好信息,Service 层使用
anyhow::Result
# 设置详细日志
export RUST_LOG=memories=debug,sqlx=debug
cargo run
# 检查编译错误
cargo check
# 运行测试
cargo test
# 查看 API 文档
# 访问 http://localhost:8080/api/... 端点| 文档 | 说明 |
|---|---|
| API_DOCUMENTATION.md | 完整 API 接口文档 (请求/响应示例、错误码) |
| CLI_USAGE.md | CLI 工具使用指南 |
| PROCESS_MANAGEMENT.md | 进程管理详解 |
| BUILD_STATUS.md | 编译状态报告 |
| COMPILATION_FIX_PROGRESS.md | 编译修复历史 |
| COMPILATION_SUCCESS.md | 编译成功报告 |
| frontend/README.md | 前端项目文档 |
| frontend/GLOBAL_CONTEXT_MENU_USAGE.md | 全局右键菜单使用指南 |
MIT
Memories — 让校园回忆永不褪色 📸
- 所有修改操作需身份验证
- 管理员操作需 admin 权限
- SQL 参数化查询防注入
- 输入验证和 sanitization
- 修复编译错误 - 解决当前存在的类型导出和 trait 实现问题
- 完善中间件 - 重新实现认证和限流中间件
- 添加测试 - 编写单元测试和集成测试
- 性能优化 - 添加缓存层(Redis)
- 文档完善 - 补充 API 文档和使用指南
MIT