初始化仓库及v1.0.0提交

This commit is contained in:
2026-05-05 03:21:58 +08:00
commit 813bb02672
67 changed files with 5263 additions and 0 deletions

208
docs/API.md Normal file
View File

@@ -0,0 +1,208 @@
# API 文档
## 基础信息
- 基础 URL`/api`
- 响应格式JSON
- 认证方式JWT Bearer TokenAuthorization 头)
### 统一响应格式
```json
{
"success": true,
"data": {},
"message": "操作成功"
}
```
## 认证 API
### POST /auth/login
用户登录,获取 JWT 令牌。
**请求体:**
```json
{
"username": "admin",
"password": "123456"
}
```
**成功响应:**
```json
{
"success": true,
"data": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGc...",
"user": {
"id": 1,
"username": "admin",
"role": "admin"
}
}
}
```
### GET /auth/me
获取当前用户信息。(需认证)
**响应:**
```json
{
"success": true,
"data": {
"id": 1,
"username": "admin",
"role": "admin"
}
}
```
## 会话 API
### GET /sessions
获取当前用户的会话列表。(需认证)
**响应:**
```json
{
"success": true,
"data": [
{
"id": 1,
"user_id": 1,
"name": "新会话",
"provider": "newapi",
"model": "gpt-3.5-turbo",
"system_prompt": "",
"personality_id": null,
"thinking_mode": 0,
"created_at": "2024-01-01 00:00:00",
"updated_at": "2024-01-01 00:00:00"
}
]
}
```
### POST /sessions
创建新会话。(需认证)
**请求体:**
```json
{
"name": "新对话",
"provider": "newapi",
"model": "gpt-3.5-turbo",
"system_prompt": "",
"thinking_mode": false
}
```
### PUT /sessions/{id}
更新会话。(需认证)
### DELETE /sessions/{id}
删除会话。(需认证)
## 消息 API
### GET /sessions/{id}/messages
获取指定会话的消息列表。(需认证)
### POST /sessions/{id}/messages
保存消息到指定会话。(需认证)
**请求体:**
```json
{
"role": "user",
"content": "Hello!",
"file_info": null,
"thinking_content": null
}
```
## AI 对话 API
### POST /chat/completions
AI 对话请求SSE 流式响应)。(需认证)
**请求体:**
```json
{
"provider": "newapi",
"model": "gpt-3.5-turbo",
"messages": [
{"role": "user", "content": "Hello!"}
],
"stream": true,
"systemPrompt": "",
"thinkingMode": false
}
```
**SSE 响应格式:**
```
data: {"content":"Hello"}
data: {"content":"!"}
data: {"thinking":"Let me think..."}
data: [DONE]
```
## 文件上传 API
### POST /upload
上传文件。需认证multipart/form-data
**支持格式:** jpg, jpeg, png, gif, webp, js, ts, py, java, cpp, c, html, css, json, xml, txt, md, go, rs, php, rb, sql, yaml, yml, sh, bat
**大小限制:** 10MB
**响应:**
```json
{
"success": true,
"data": {
"url": "/uploads/xxx.jpg",
"name": "原始文件名.jpg",
"size": 1024,
"type": "jpg"
}
}
```
## 配置 API
### GET /config
获取系统配置。(需认证)
### PUT /config
更新系统配置。(需认证 + 管理员)
## 人格 API
### GET /personalities
获取人格列表。(需认证)
### POST /personalities
创建人格。(需认证 + 管理员)
### PUT /personalities/{id}
更新人格。(需认证 + 管理员)
### DELETE /personalities/{id}
删除人格。(需认证 + 管理员)
## 安装 API
### GET /install/status
检查安装状态。(无需认证)
### POST /install/test-db
测试数据库连接。(无需认证)
### POST /install/setup
执行安装。(无需认证)

138
docs/ARCHITECTURE.md Normal file
View File

@@ -0,0 +1,138 @@
# 架构说明
## 技术架构
本项目采用 PHP 8.0 原生 MVC 架构,不使用任何 PHP 框架。
```
┌──────────────────────────────────────────────┐
│ Nginx │
│ (Web 服务器 + 反向代理) │
└──────────┬───────────────────────────────────┘
┌──────────────────────────────────────────────┐
│ public/ │
│ (Web 根目录, 入口文件) │
│ api.php, login.php, chat.php, config.php │
└──────────┬───────────────────────────────────┘
┌─────┴─────┐
│ │
▼ ▼
┌─────────┐ ┌──────────────────────────────┐
│ PHP 页面 │ │ API (api.php) │
│ (视图) │ │ 路由分发 + 中间件处理 │
└────┬────┘ └──────┬───────────────────────┘
│ │
▼ ▼
┌──────────────────────────────────────────────┐
│ Controllers │
│ AuthController, ChatController, │
│ SessionController, MessageController, │
│ ConfigController, InstallController, │
│ UploadController │
└──────────┬───────────────────────────────────┘
┌─────┼─────────────┐
│ │ │
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌──────────────────────┐
│Models │ │Services│ │ Middleware │
│(数据) │ │(业务) │ │ Auth/Admin │
└───┬───┘ └───┬───┘ └──────────────────────┘
│ │
▼ ▼
┌────────┐ ┌─────────────────┐
│ MySQL │ │ AI Providers │
│(PDO) │ │ OpenAI/Claude/ │
│ │ │ NewAPI │
└────────┘ └─────────────────┘
```
## 目录结构
```
ai-chat/
├── public/ # Web 根目录
│ ├── api.php # API 统一入口(路由分发)
│ ├── login.php # 登录页面
│ ├── chat.php # 聊天主页面
│ ├── config.php # 配置管理页面
│ └── install.php # 安装向导页面
├── app/ # 应用代码(命名空间 App\
│ ├── Config/ # 配置类
│ │ ├── Database.php # 数据库连接(单例 PDO
│ │ └── AppConfig.php # 应用配置读写
│ ├── Controllers/ # 控制器
│ │ ├── AuthController.php
│ │ ├── ChatController.php
│ │ ├── SessionController.php
│ │ ├── MessageController.php
│ │ ├── ConfigController.php
│ │ ├── InstallController.php
│ │ └── UploadController.php
│ ├── Middleware/ # 中间件
│ │ ├── AuthMiddleware.php # JWT 认证
│ │ └── AdminMiddleware.php # 管理员权限
│ ├── Models/ # 数据模型
│ │ ├── User.php
│ │ ├── Session.php
│ │ ├── Message.php
│ │ ├── Config.php
│ │ └── Personality.php
│ ├── Services/ # 服务层
│ │ ├── AIService.php # AI 服务路由
│ │ ├── Installer.php # 安装迁移服务
│ │ └── Providers/ # AI 供应商
│ │ ├── OpenAIProvider.php
│ │ ├── ClaudeProvider.php
│ │ └── NewAPIProvider.php
│ └── Views/ # 视图模板
│ ├── login.php
│ ├── chat.php
│ ├── config.php
│ └── layout/
│ ├── header.php
│ └── footer.php
├── assets/ # 前端静态资源
│ ├── css/ # 样式
│ │ ├── style.css # 全局样式
│ │ ├── chat.css # 聊天界面样式
│ │ └── markdown.css # Markdown 渲染样式
│ ├── js/ # JavaScript
│ │ ├── api.js # API 调用封装
│ │ ├── chat.js # 聊天核心功能
│ │ ├── session.js # 会话管理
│ │ ├── upload.js # 文件上传
│ │ ├── markdown.js # Markdown 渲染
│ │ └── storage.js # 本地存储
│ └── img/ # 图片
├── config/ # JSON 配置文件
├── uploads/ # 用户上传文件
├── docs/ # 文档
└── composer.json # Composer 配置
```
## 请求流程
### API 请求流程
1. 客户端发送 HTTP 请求到 `/api/*`
2. Nginx 将请求转发到 `public/api.php`
3. api.php 解析路由,执行对应的中间件和控制器
4. 控制器调用模型/服务层处理业务逻辑
5. 返回 JSON 响应
### SSE 流式响应流程
1. 客户端发送 POST 请求到 `/api/chat/completions`
2. ChatController 设置 SSE 响应头
3. AIService 通过 cURL 连接 AI 供应商 API
4. 使用 CURLOPT_WRITEFUNCTION 回调逐块接收 AI 响应
5. 每块数据通过 SSE 格式发送给客户端
6. AI 响应完成后发送 `[DONE]` 信号
### 页面请求流程
1. 客户端访问 PHP 页面(如 `/chat.php`
2. Nginx 通过 PHP-FPM 执行 PHP 文件
3. PHP 文件引入布局模板和视图
4. 客户端通过 AJAX 加载数据

71
docs/DEPLOY.md Normal file
View File

@@ -0,0 +1,71 @@
# 部署指南
## 宝塔面板部署
### 1. 环境准备
在宝塔面板"软件商店"中安装:
- Nginx 1.22+
- PHP 8.0(在 PHP 设置中确保以下扩展已启用pdo_mysql、curl、mbstring、json、openssl
- MySQL 5.7 或 8.0
### 2. 创建网站
1. 网站 → 添加站点
2. 填写域名
3. PHP 版本选择 **PHP 8.0**
4. 数据库选择"不创建"
### 3. 部署代码
```bash
cd /www/wwwroot/your-domain.com
git clone <repository-url> .
composer install
```
### 4. 设置权限
```bash
chmod -R 755 .
chown -R www:www .
```
### 5. 配置 Nginx
1. 站点设置 → 网站目录 → 运行目录改为 `/public`
2. 站点设置 → 配置文件 → 添加 `docs/baota-nginx-snippet.conf` 中的配置
### 6. 运行安装向导
访问 `http://your-domain.com/install.php`
### 7. SSL 配置(可选)
站点设置 → SSL → Let's Encrypt → 申请证书
## 手动部署
### Nginx 配置
参考 `docs/nginx.conf` 文件,将 `root` 指向 `public/` 目录。
### PHP-FPM 配置
确保 PHP-FPM 监听 socket 配置正确(通常为 `/tmp/php-cgi-80.sock``127.0.0.1:9000`)。
### 目录权限
```bash
chown -R www-data:www-data /path/to/ai-chat
chmod 755 /path/to/ai-chat/uploads
chmod 755 /path/to/ai-chat/config
```
## 安全建议
1. 配置 SSL 证书HTTPS
2. 修改数据库默认端口
3. 定期更新 PHP 和 Nginx 版本
4. 限制 uploads 目录的执行权限
5. 禁止访问 app/、config/、vendor/ 等非公开目录(已在 Nginx 配置中设置)

35
docs/PERSONALITY.md Normal file
View File

@@ -0,0 +1,35 @@
# 人格系统说明
## 概述
人格系统允许用户选择不同的 AI 角色,每个角色有特定的系统提示词,从而影响 AI 的回答风格和专业领域。
## 预设人格
系统安装后自动创建以下 5 个预设人格:
| 名称 | 图标 | 说明 |
|------|------|------|
| 智能助手 | 🤖 | 全能智能助手,善于回答各种问题 |
| 代码专家 | 💻 | 专业编程专家,精通多种语言和框架 |
| 翻译官 | 🌐 | 多语言翻译专家 |
| 写作助手 | ✍️ | 专业写作助手,擅长各类文体 |
| 数学家 | 🔢 | 数学专家,善于解答数学问题 |
预设人格不可编辑和删除。
## 自定义人格
管理员可以在配置页面(`/config.php`)创建自定义人格:
- **名称**:人格的显示名称
- **图标**Emoji 图标
- **提示词**:系统提示词(定义 AI 的角色和行为)
- **描述**:简短描述
## 技术实现
- 人格数据存储在 `personalities` 数据表中
- 预设人格 `is_preset = 1`,自定义人格 `is_preset = 0`
- 选择人格后,其 `prompt` 字段作为 `system_prompt` 传递给 AI API
- 人格 API 路径:`/api/personalities`

View File

@@ -0,0 +1,86 @@
# ============================================================
# AI Chat 宝塔面板 Nginx 配置片段PHP-FPM 版本)
# ============================================================
#
# 【使用说明】
# 1. 本文件为宝塔面板专用的 Nginx 配置片段,不是完整的站点配置文件。
# 2. 使用步骤:
# a. 在宝塔面板中创建网站PHP 版本选择 PHP 8.0
# b. 将网站根目录指向 /path/to/ai-chat/public
# c. 登录宝塔面板 → 网站 → 找到你的站点 → 点击"设置"
# d. 在左侧菜单选择"配置文件"
# e. 将下方"配置内容开始"到"配置内容结束"之间的内容,
# 复制并粘贴到 server { } 块内(注意不要重复嵌套 server 块)
# f. 保存即可生效
# 3. 前置准备:
# - 在宝塔面板中安装 PHP 8.0 并启用
# - 安装 MySQL 5.7+ 或 8.0
# - 安装 Composer
# - 运行 composer install 安装 PHP 依赖
#
# ============================================================
# ↓↓↓ 配置内容开始 ↓↓↓
# === AI Chat 网站配置PHP-FPM ===
# 1. 默认路由
location / {
try_files $uri $uri/ /login.php;
}
# 2. API 路由 - 转发到 api.php
location /api/ {
try_files $uri /api.php$is_args$args;
fastcgi_pass unix:/tmp/php-cgi-80.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/api.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param REQUEST_URI $request_uri;
}
# 3. SSE 流式响应特殊配置AI对话需要
# 针对 Chat API 的 SSEServer-Sent Events流式响应
# 需要禁用所有缓冲以确保实时输出
location /api/chat/completions {
fastcgi_pass unix:/tmp/php-cgi-80.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/api.php;
fastcgi_param REQUEST_URI $request_uri;
# SSE 关键配置
fastcgi_buffering off;
proxy_buffering off;
add_header X-Accel-Buffering no;
# 超时设置5分钟
fastcgi_read_timeout 300s;
}
# 4. 静态资源缓存
location /assets/ {
expires 30d;
add_header Cache-Control "public, immutable";
}
# 5. 上传文件访问
location /uploads/ {
expires 7d;
add_header Cache-Control "public";
}
# 6. 禁止访问非公开目录(安全)
location ~ /(app|config|vendor|tests|scripts|)/ {
deny all;
return 404;
}
# 7. 禁止访问隐藏文件
location ~ /\. {
deny all;
return 404;
}
# 8. 上传文件大小限制
client_max_body_size 10m;
# ↑↑↑ 配置内容结束 ↑↑↑

110
docs/nginx.conf Normal file
View File

@@ -0,0 +1,110 @@
# AI Chat 应用 Nginx 配置PHP-FPM 版本)
# 将此文件复制到 /etc/nginx/sites-available/ 并创建软链接到 sites-enabled/
#
# 注意:本文件为完整的 Nginx 站点配置,适用于直接部署到 Nginx + PHP-FPM 的场景。
# 如果你使用宝塔面板管理服务器,请参考 baota-nginx-snippet.conf 文件中的配置片段。
#
# 前置条件:
# - PHP 8.0+ 已安装并启用 PHP-FPM
# - MySQL 5.7+ 已安装
# - Composer 已安装
# - 项目已部署到 /path/to/ai-chat/ 目录
server {
listen 80;
server_name your-domain.com;
# 网站根目录指向 public/
root /path/to/ai-chat/public;
index index.php login.php install.php;
# 安全 Headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Gzip 压缩
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
image/svg+xml;
# 默认路由 - PHP 文件
location / {
try_files $uri $uri/ /login.php;
}
# API 路由 - 所有 /api/ 请求转发到 api.php
location /api/ {
try_files $uri /api.php$is_args$args;
fastcgi_pass unix:/tmp/php-cgi-80.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/api.php;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param REQUEST_URI $request_uri;
}
# SSE 流式响应专用配置AI对话 API
location /api/chat/completions {
fastcgi_pass unix:/tmp/php-cgi-80.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/api.php;
fastcgi_param REQUEST_URI $request_uri;
# SSE 关键配置:禁用所有缓冲
fastcgi_buffering off;
fastcgi_cache off;
proxy_buffering off;
# 禁用 Nginx 缓冲
add_header X-Accel-Buffering no;
# SSE 超时设置5分钟
fastcgi_read_timeout 300s;
}
# 静态资源直接服务
location /assets/ {
alias /path/to/ai-chat/assets/;
expires 30d;
add_header Cache-Control "public, immutable";
}
# 上传文件直接服务
location /uploads/ {
alias /path/to/ai-chat/uploads/;
expires 7d;
add_header Cache-Control "public";
}
# PHP 文件处理
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi-80.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# 禁止访问非公开目录
location ~ /(app|config|vendor|tests|scripts|\.cospec)/ {
deny all;
return 404;
}
# 禁止访问隐藏文件
location ~ /\. {
deny all;
return 404;
}
# 上传文件大小限制
client_max_body_size 10m;
}