样式:调整好
This commit is contained in:
parent
155c9f824c
commit
9190872fcb
199
PHP服务连接问题解决方案.md
199
PHP服务连接问题解决方案.md
|
|
@ -1,199 +0,0 @@
|
|||
# PHP 服务连接问题解决方案
|
||||
|
||||
## 问题描述
|
||||
Python 后端无法连接到 PHP 服务,报错:
|
||||
```
|
||||
HTTPConnectionPool(host='192.168.1.164', port=30100): Read timed out
|
||||
```
|
||||
|
||||
## 已完成的修复
|
||||
|
||||
### 1. 配置修正
|
||||
- ✅ 修改 `lover/deps.py`:移除硬编码 IP,从配置读取
|
||||
- ✅ 修改 `lover/config.py`:默认地址改为 `127.0.0.1:30100`
|
||||
- ✅ 修改 `.env`:端口从 `8080` 改为 `30100`
|
||||
- ✅ 减少超时时间:从 5 秒改为 3 秒
|
||||
- ✅ 改进错误处理:区分超时和连接错误
|
||||
|
||||
### 2. 启动脚本优化
|
||||
- ✅ 使用 `router.php` 而不是 `-t .`
|
||||
- ✅ 添加端口清理逻辑,自动终止占用端口的旧进程
|
||||
- ✅ 添加等待时间,确保服务完全启动
|
||||
|
||||
### 3. 测试工具
|
||||
创建了 `xunifriend_RaeeC/public/test_api.php` 用于测试:
|
||||
- `/test_api.php` - 测试 PHP 服务器基本响应
|
||||
- `/test_db` - 测试数据库连接
|
||||
|
||||
## 当前问题分析
|
||||
|
||||
### PHP 服务器状态
|
||||
```
|
||||
端口 30100 已被监听(进程 31592, 16636)
|
||||
但是请求超时,无法获得响应
|
||||
```
|
||||
|
||||
### 可能的原因
|
||||
|
||||
1. **数据库连接问题**
|
||||
- PHP 应用可能在启动时尝试连接数据库
|
||||
- 如果数据库连接失败或慢,会导致请求超时
|
||||
- 检查 `xunifriend_RaeeC/application/database.php` 配置
|
||||
|
||||
2. **PHP 内置服务器限制**
|
||||
- PHP 内置服务器是单线程的
|
||||
- 如果有请求阻塞,后续请求会超时
|
||||
- 建议使用 Apache 或 Nginx + PHP-FPM
|
||||
|
||||
3. **应用初始化问题**
|
||||
- ThinkPHP 框架初始化可能有问题
|
||||
- 检查 `xunifriend_RaeeC/application/admin/command/Install/install.lock` 是否存在
|
||||
|
||||
4. **路由配置问题**
|
||||
- API 路由可能未正确配置
|
||||
- 检查 `xunifriend_RaeeC/application/route.php`
|
||||
|
||||
## 解决步骤
|
||||
|
||||
### 步骤 1: 测试 PHP 服务器基本功能
|
||||
```cmd
|
||||
# 在浏览器或命令行测试
|
||||
curl http://127.0.0.1:30100/test_api.php
|
||||
```
|
||||
|
||||
预期响应:
|
||||
```json
|
||||
{
|
||||
"code": 1,
|
||||
"msg": "PHP 服务器运行正常",
|
||||
"time": 1738665600,
|
||||
"data": {
|
||||
"php_version": "8.0.0",
|
||||
"server_time": "2026-02-04 19:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 步骤 2: 测试数据库连接
|
||||
```cmd
|
||||
curl http://127.0.0.1:30100/test_db
|
||||
```
|
||||
|
||||
如果数据库连接失败,检查:
|
||||
- MySQL 是否运行
|
||||
- `xunifriend_RaeeC/application/database.php` 配置是否正确
|
||||
- 数据库用户名密码是否正确
|
||||
|
||||
### 步骤 3: 测试实际 API
|
||||
```cmd
|
||||
# 使用有效的 token 测试
|
||||
curl -H "token: YOUR_TOKEN_HERE" http://127.0.0.1:30100/api/user_basic/get_user_basic
|
||||
```
|
||||
|
||||
### 步骤 4: 检查 PHP 错误日志
|
||||
PHP 内置服务器的错误会显示在启动窗口中,查看是否有:
|
||||
- 数据库连接错误
|
||||
- 文件权限错误
|
||||
- PHP 语法错误
|
||||
- 缺少扩展
|
||||
|
||||
## 临时解决方案
|
||||
|
||||
### 方案 1: 使用开发环境兜底(已实现)
|
||||
Python 后端在开发环境下,如果 PHP 连接失败,会自动使用测试用户:
|
||||
```python
|
||||
# 在 lover/deps.py 中
|
||||
if settings.APP_ENV == "development" and settings.DEBUG:
|
||||
logger.warning(f"开发环境:token 验证失败({e.detail}),使用测试用户")
|
||||
return AuthedUser(id=70, reg_step=2, gender=0, nickname="test-user", token="")
|
||||
```
|
||||
|
||||
### 方案 2: 直接使用数据库认证
|
||||
修改 Python 后端,不依赖 PHP API,直接查询数据库:
|
||||
```python
|
||||
# 在 lover/deps.py 中添加
|
||||
def _fetch_user_from_db(token: str) -> Optional[dict]:
|
||||
"""直接从数据库获取用户信息"""
|
||||
from lover.db import get_db
|
||||
db = next(get_db())
|
||||
user = db.execute(
|
||||
"SELECT * FROM fa_user WHERE token = :token",
|
||||
{"token": token}
|
||||
).fetchone()
|
||||
return dict(user) if user else None
|
||||
```
|
||||
|
||||
### 方案 3: 重启 PHP 服务
|
||||
```cmd
|
||||
# 使用更新后的启动脚本,会自动清理旧进程
|
||||
启动项目.bat
|
||||
```
|
||||
|
||||
## 长期解决方案
|
||||
|
||||
### 推荐:使用 Nginx + PHP-FPM
|
||||
PHP 内置服务器不适合生产环境,建议:
|
||||
|
||||
1. 安装 Nginx
|
||||
2. 配置 PHP-FPM
|
||||
3. 配置 Nginx 反向代理
|
||||
|
||||
配置示例:
|
||||
```nginx
|
||||
server {
|
||||
listen 30100;
|
||||
server_name localhost;
|
||||
root C:/Users/Administrator/Desktop/Project/AI_GirlFriend/xunifriend_RaeeC/public;
|
||||
index index.php index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$query_string;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
fastcgi_pass 127.0.0.1:9000;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 调试命令
|
||||
|
||||
### 查看端口占用
|
||||
```cmd
|
||||
netstat -ano | findstr :30100
|
||||
```
|
||||
|
||||
### 终止进程
|
||||
```cmd
|
||||
taskkill /F /PID <进程ID>
|
||||
```
|
||||
|
||||
### 测试 PHP 配置
|
||||
```cmd
|
||||
D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe -v
|
||||
D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe -m # 查看已安装的扩展
|
||||
```
|
||||
|
||||
### 手动启动 PHP 服务器(用于调试)
|
||||
```cmd
|
||||
cd xunifriend_RaeeC\public
|
||||
D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe -S 0.0.0.0:30100 router.php
|
||||
```
|
||||
|
||||
## 下一步行动
|
||||
|
||||
1. **立即测试**:运行 `curl http://127.0.0.1:30100/test_api.php`
|
||||
2. **检查数据库**:确认 MySQL 正在运行
|
||||
3. **查看日志**:检查 PHP 启动窗口的错误信息
|
||||
4. **重启服务**:使用更新后的 `启动项目.bat`
|
||||
|
||||
## 文件修改记录
|
||||
|
||||
- `lover/deps.py` - 改进错误处理和超时设置
|
||||
- `lover/config.py` - 修正默认地址
|
||||
- `.env` - 修正端口配置
|
||||
- `启动项目.bat` - 添加端口清理和 router.php
|
||||
- `xunifriend_RaeeC/public/test_api.php` - 新增测试脚本
|
||||
|
|
@ -1,161 +0,0 @@
|
|||
@echo off
|
||||
chcp 65001 >nul
|
||||
title PHP 开发服务器
|
||||
|
||||
:MENU
|
||||
cls
|
||||
echo ========================================
|
||||
echo PHP 开发服务器启动脚本 (高级版)
|
||||
echo ========================================
|
||||
echo.
|
||||
echo 请选择启动模式:
|
||||
echo.
|
||||
echo [1] 快速启动 (端口 8080)
|
||||
echo [2] 自定义端口
|
||||
echo [3] 查看 PHP 信息
|
||||
echo [4] 退出
|
||||
echo.
|
||||
echo ========================================
|
||||
set /p choice=请输入选项 (1-4):
|
||||
|
||||
if "%choice%"=="1" goto QUICK_START
|
||||
if "%choice%"=="2" goto CUSTOM_PORT
|
||||
if "%choice%"=="3" goto PHP_INFO
|
||||
if "%choice%"=="4" goto END
|
||||
echo [错误] 无效选项,请重新选择
|
||||
timeout /t 2 >nul
|
||||
goto MENU
|
||||
|
||||
:QUICK_START
|
||||
set PORT=8080
|
||||
goto START_SERVER
|
||||
|
||||
:CUSTOM_PORT
|
||||
echo.
|
||||
set /p PORT=请输入端口号 (例如: 8080):
|
||||
if "%PORT%"=="" (
|
||||
echo [错误] 端口号不能为空
|
||||
timeout /t 2 >nul
|
||||
goto MENU
|
||||
)
|
||||
goto START_SERVER
|
||||
|
||||
:START_SERVER
|
||||
cls
|
||||
echo ========================================
|
||||
echo 正在启动 PHP 开发服务器...
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
REM 设置 PHP 路径
|
||||
set PHP_PATH=D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe
|
||||
|
||||
REM 检查 PHP 是否存在
|
||||
if not exist "%PHP_PATH%" (
|
||||
echo [错误] PHP 未找到: %PHP_PATH%
|
||||
echo.
|
||||
echo 请修改脚本中的 PHP_PATH 变量
|
||||
pause
|
||||
goto MENU
|
||||
)
|
||||
|
||||
REM 显示 PHP 版本
|
||||
echo [信息] PHP 版本:
|
||||
"%PHP_PATH%" -v | findstr /C:"PHP"
|
||||
echo.
|
||||
|
||||
REM 设置项目根目录
|
||||
set PROJECT_ROOT=%~dp0xunifriend_RaeeC\public
|
||||
|
||||
REM 检查项目目录是否存在
|
||||
if not exist "%PROJECT_ROOT%" (
|
||||
echo [错误] 项目目录未找到: %PROJECT_ROOT%
|
||||
pause
|
||||
goto MENU
|
||||
)
|
||||
|
||||
REM 获取本机 IP 地址
|
||||
for /f "tokens=2 delims=:" %%a in ('ipconfig ^| findstr /C:"IPv4"') do (
|
||||
set LOCAL_IP=%%a
|
||||
goto :IP_FOUND
|
||||
)
|
||||
:IP_FOUND
|
||||
set LOCAL_IP=%LOCAL_IP: =%
|
||||
|
||||
REM 设置服务器参数
|
||||
set HOST=0.0.0.0
|
||||
|
||||
echo [信息] 项目目录: %PROJECT_ROOT%
|
||||
echo [信息] 服务器端口: %PORT%
|
||||
echo.
|
||||
echo ========================================
|
||||
echo 访问地址:
|
||||
echo ========================================
|
||||
echo.
|
||||
echo [本地访问]
|
||||
echo http://127.0.0.1:%PORT%
|
||||
echo http://localhost:%PORT%
|
||||
echo.
|
||||
echo [局域网访问]
|
||||
echo http://%LOCAL_IP%:%PORT%
|
||||
echo.
|
||||
echo [管理后台]
|
||||
echo http://127.0.0.1:%PORT%/admin
|
||||
echo.
|
||||
echo ========================================
|
||||
echo.
|
||||
echo [提示] 按 Ctrl+C 停止服务器
|
||||
echo.
|
||||
|
||||
REM 询问是否打开浏览器
|
||||
set /p OPEN_BROWSER=是否自动打开浏览器? (Y/N):
|
||||
if /i "%OPEN_BROWSER%"=="Y" (
|
||||
echo [信息] 正在打开浏览器...
|
||||
start http://127.0.0.1:%PORT%
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [信息] 服务器启动中...
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
REM 启动 PHP 内置服务器
|
||||
cd /d "%PROJECT_ROOT%"
|
||||
"%PHP_PATH%" -S %HOST%:%PORT% -t .
|
||||
|
||||
pause
|
||||
goto MENU
|
||||
|
||||
:PHP_INFO
|
||||
cls
|
||||
echo ========================================
|
||||
echo PHP 信息
|
||||
echo ========================================
|
||||
echo.
|
||||
|
||||
set PHP_PATH=D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe
|
||||
|
||||
if not exist "%PHP_PATH%" (
|
||||
echo [错误] PHP 未找到: %PHP_PATH%
|
||||
pause
|
||||
goto MENU
|
||||
)
|
||||
|
||||
echo [PHP 版本]
|
||||
"%PHP_PATH%" -v
|
||||
echo.
|
||||
echo [PHP 配置文件]
|
||||
"%PHP_PATH%" --ini
|
||||
echo.
|
||||
echo [已加载的扩展]
|
||||
"%PHP_PATH%" -m
|
||||
echo.
|
||||
|
||||
pause
|
||||
goto MENU
|
||||
|
||||
:END
|
||||
echo.
|
||||
echo 感谢使用!
|
||||
timeout /t 1 >nul
|
||||
exit
|
||||
|
|
@ -209,8 +209,12 @@
|
|||
})
|
||||
},
|
||||
connectWebSocket() {
|
||||
// 根据 baseURLPy 构建 WebSocket URL
|
||||
let wsUrl = baseURLPy.replace('http://', 'ws://').replace('https://', 'wss://') + '/voice/call'
|
||||
console.log('WebSocket URL:', wsUrl)
|
||||
|
||||
this.socketTask = uni.connectSocket({
|
||||
url: 'wss://lovers.shandonghuixing.com/voice/call',
|
||||
url: wsUrl,
|
||||
header: {
|
||||
"content-type": "application/json",
|
||||
'Authorization': 'Bearer ' + uni.getStorageSync("token") || ""
|
||||
|
|
|
|||
|
|
@ -143,25 +143,28 @@
|
|||
<image class="home-header-icon" src="/static/images/replacement_switch.png" mode="aspectFit"></image>
|
||||
<text class="home-header-text">装扮设置</text>
|
||||
</view>
|
||||
<view class="home-header-spacer"></view>
|
||||
<view class="home-header-btn" @click="todynamics">
|
||||
<image class="home-header-icon" src="/static/images/dynamics_logo.png" mode="aspectFit"></image>
|
||||
<text class="home-header-text">朋友圈</text>
|
||||
</view>
|
||||
<view class="home-header-btn" @click="todiary">
|
||||
<image class="home-header-icon" src="/static/images/diary_a1.png" mode="aspectFit"></image>
|
||||
<text class="home-header-text">日记</text>
|
||||
</view>
|
||||
<view class="home-header-btn" @click="tophone">
|
||||
<image class="home-header-icon" src="/static/images/index_phone.png" mode="aspectFit"></image>
|
||||
<text class="home-header-text">语音通话</text>
|
||||
</view>
|
||||
<view class="home-header-btn" @click="tovoicecall">
|
||||
<image class="home-header-icon" src="/static/images/index_phone.png" mode="aspectFit"></image>
|
||||
<text class="home-header-text">视频通话</text>
|
||||
</view>
|
||||
<view class="home-header-btn" @click="tointimacy">
|
||||
<image class="home-header-icon" src="/static/images/index_intimate.png" mode="aspectFit"></image>
|
||||
<text class="home-header-text">邀请入驻</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 选择互动对象 -->
|
||||
<view class="home-title">
|
||||
<text class="home-title-icon">✦</text>
|
||||
<text class="home-title-text">选择一位互动对象</text>
|
||||
<text class="home-title-icon">✦</text>
|
||||
<text class="home-title-more" @click="toreplacement">搜索更多</text>
|
||||
</view>
|
||||
|
||||
|
||||
<!-- 主卡片区域 -->
|
||||
<view class="home-card">
|
||||
<view class="home-card-inner">
|
||||
|
|
@ -2059,21 +2062,23 @@
|
|||
});
|
||||
},
|
||||
tophone() {
|
||||
// if (this.getBobbiesList.level >= 2) {
|
||||
// uni.navigateTo({
|
||||
// url: '/pages/chat/phone'
|
||||
// });
|
||||
// } else {
|
||||
// uni.showToast({
|
||||
// title: '达到Lv.2才可以解锁电话',
|
||||
// icon: 'none',
|
||||
// position: 'top'
|
||||
// });
|
||||
// }
|
||||
console.log('tophone 方法被调用');
|
||||
uni.navigateTo({
|
||||
url: '/pages/chat/phone'
|
||||
});
|
||||
},
|
||||
todiary() {
|
||||
console.log('todiary 方法被调用');
|
||||
uni.navigateTo({
|
||||
url: '/pages/chat/diary'
|
||||
});
|
||||
},
|
||||
tovoicecall() {
|
||||
console.log('tovoicecall 方法被调用');
|
||||
uni.navigateTo({
|
||||
url: '/pages/chat/voiceCall'
|
||||
});
|
||||
},
|
||||
togift() {
|
||||
uni.navigateTo({
|
||||
url: '/pages/index/gift'
|
||||
|
|
@ -2226,12 +2231,30 @@
|
|||
OutfitList({}).then(res => {
|
||||
if (res && res.code == 1 && res.data) {
|
||||
this.homeLooksList = res.data.looks || [];
|
||||
// 如果有形象栏数据,默认选中第一个
|
||||
if (this.homeLooksList.length > 0) {
|
||||
|
||||
// 查找当前使用中的形象
|
||||
const currentLook = this.homeLooksList.find(look => look.is_current);
|
||||
|
||||
if (currentLook) {
|
||||
// 如果找到当前使用的形象,选中它
|
||||
this.selectedLookId = currentLook.id;
|
||||
this.currentLookImageUrl = currentLook.image_url;
|
||||
this.chatLoverAvatar = currentLook.image_url;
|
||||
|
||||
// 同步更新主图片
|
||||
if (this.loverBasicList) {
|
||||
this.loverBasicList.image_url = currentLook.image_url;
|
||||
}
|
||||
} else if (this.homeLooksList.length > 0) {
|
||||
// 如果没有标记为当前的,默认选中第一个
|
||||
this.selectedLookId = this.homeLooksList[0].id;
|
||||
this.currentLookImageUrl = this.homeLooksList[0].image_url;
|
||||
// 同时更新聊天头像
|
||||
this.chatLoverAvatar = this.homeLooksList[0].image_url;
|
||||
|
||||
// 同步更新主图片
|
||||
if (this.loverBasicList) {
|
||||
this.loverBasicList.image_url = this.homeLooksList[0].image_url;
|
||||
}
|
||||
}
|
||||
}
|
||||
}).catch(err => {
|
||||
|
|
@ -2243,6 +2266,12 @@
|
|||
switchLook(look) {
|
||||
if (!look || !look.id) return;
|
||||
|
||||
// 立即更新本地显示,避免延迟
|
||||
this.selectedLookId = look.id;
|
||||
if (this.loverBasicList) {
|
||||
this.loverBasicList.image_url = look.image_url;
|
||||
}
|
||||
|
||||
// 调用后端 API 切换形象
|
||||
uni.request({
|
||||
url: baseURLPy + '/outfit/looks/use/' + look.id,
|
||||
|
|
@ -2252,21 +2281,16 @@
|
|||
},
|
||||
success: (res) => {
|
||||
if (res.data && res.data.code === 1) {
|
||||
this.selectedLookId = look.id;
|
||||
this.currentLookImageUrl = look.image_url;
|
||||
|
||||
// 更新聊天页面的头像
|
||||
this.chatLoverAvatar = look.image_url;
|
||||
|
||||
// 更新女友基本信息(刷新图片)
|
||||
this.loverBasic();
|
||||
|
||||
uni.showToast({
|
||||
title: '形象切换成功',
|
||||
icon: 'success',
|
||||
duration: 1500
|
||||
});
|
||||
// 移除成功提示,静默切换
|
||||
} else {
|
||||
// 如果失败,恢复原来的图片
|
||||
this.loverBasic();
|
||||
uni.showToast({
|
||||
title: res.data.msg || '切换失败',
|
||||
icon: 'none',
|
||||
|
|
@ -2276,6 +2300,8 @@
|
|||
},
|
||||
fail: (err) => {
|
||||
console.error('切换形象失败:', err);
|
||||
// 如果失败,恢复原来的图片
|
||||
this.loverBasic();
|
||||
uni.showToast({
|
||||
title: '切换失败,请重试',
|
||||
icon: 'none',
|
||||
|
|
@ -5110,21 +5136,33 @@
|
|||
.home-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 20rpx 0;
|
||||
margin-bottom: 20rpx;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
gap: 15rpx;
|
||||
/* 隐藏滚动条 */
|
||||
scrollbar-width: none; /* Firefox */
|
||||
-ms-overflow-style: none; /* IE 10+ */
|
||||
}
|
||||
|
||||
.home-header::-webkit-scrollbar {
|
||||
display: none; /* Chrome Safari */
|
||||
}
|
||||
|
||||
.home-header-btn {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 8rpx;
|
||||
padding: 10rpx 15rpx;
|
||||
justify-content: center;
|
||||
gap: 6rpx;
|
||||
padding: 12rpx 16rpx;
|
||||
background: rgba(255, 255, 255, 0.8);
|
||||
border-radius: 16rpx;
|
||||
transition: all 0.3s ease;
|
||||
box-shadow: 0 2rpx 8rpx rgba(159, 71, 255, 0.1);
|
||||
min-width: 100rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.home-header-btn:active {
|
||||
|
|
@ -5133,17 +5171,16 @@
|
|||
}
|
||||
|
||||
.home-header-icon {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
width: 44rpx;
|
||||
height: 44rpx;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.home-header-text {
|
||||
font-size: 22rpx;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.home-header-spacer {
|
||||
flex: 1;
|
||||
white-space: nowrap;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* 选择互动对象标题 */
|
||||
|
|
|
|||
263
启动项目_改进版.bat
263
启动项目_改进版.bat
|
|
@ -1,263 +0,0 @@
|
|||
@echo off
|
||||
chcp 65001 >nul
|
||||
title AI 女友项目 - 启动服务 (改进版)
|
||||
|
||||
REM ==========================================
|
||||
REM 配置区域
|
||||
REM ==========================================
|
||||
set PHP_PATH=D:\2_part\php-8.0.0-Win32-vs16-x64\php.exe
|
||||
set PHP_PORT=30100
|
||||
set PYTHON_PORT=30101
|
||||
|
||||
REM ==========================================
|
||||
REM 检查 MySQL 是否运行
|
||||
REM ==========================================
|
||||
cls
|
||||
echo.
|
||||
echo ╔════════════════════════════════════╗
|
||||
echo ║ AI 女友项目 - 启动服务 ║
|
||||
echo ╚════════════════════════════════════╝
|
||||
echo.
|
||||
echo [检查] 正在检查 MySQL 服务...
|
||||
|
||||
netstat -ano | findstr :3306 >nul 2>&1
|
||||
if errorlevel 1 (
|
||||
echo [警告] MySQL 服务未运行(端口 3306 未监听)
|
||||
echo.
|
||||
echo 请先启动 MySQL 服务,否则 PHP 应用可能无法正常工作
|
||||
echo.
|
||||
set /p CONTINUE=是否继续启动?(Y/N):
|
||||
if /i not "!CONTINUE!"=="Y" (
|
||||
echo.
|
||||
echo 已取消启动
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
) else (
|
||||
echo [成功] MySQL 服务正在运行
|
||||
)
|
||||
echo.
|
||||
|
||||
REM ==========================================
|
||||
REM 清理旧的服务进程
|
||||
REM ==========================================
|
||||
echo [清理] 正在检查并清理旧的服务进程...
|
||||
echo.
|
||||
|
||||
REM 查找占用 30100 端口的进程并终止
|
||||
echo [清理] 检查端口 30100...
|
||||
for /f "tokens=5" %%a in ('netstat -ano ^| findstr :30100 2^>nul') do (
|
||||
echo [清理] 终止进程 PID: %%a
|
||||
taskkill /F /PID %%a >nul 2>&1
|
||||
)
|
||||
|
||||
REM 查找占用 30101 端口的进程并终止
|
||||
echo [清理] 检查端口 30101...
|
||||
for /f "tokens=5" %%a in ('netstat -ano ^| findstr :30101 2^>nul') do (
|
||||
echo [清理] 终止进程 PID: %%a
|
||||
taskkill /F /PID %%a >nul 2>&1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo [成功] 端口清理完成
|
||||
echo.
|
||||
|
||||
REM 等待端口完全释放
|
||||
echo [等待] 等待端口释放(3秒)...
|
||||
timeout /t 3 >nul
|
||||
echo.
|
||||
|
||||
REM ==========================================
|
||||
REM 检查 PHP
|
||||
REM ==========================================
|
||||
echo [检查] 正在检查 PHP...
|
||||
|
||||
if not exist "%PHP_PATH%" (
|
||||
echo [错误] PHP 未找到: %PHP_PATH%
|
||||
echo.
|
||||
echo 请修改脚本中的 PHP_PATH 变量
|
||||
echo.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
"%PHP_PATH%" -v >nul 2>&1
|
||||
if errorlevel 1 (
|
||||
echo [错误] PHP 无法运行
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [成功] PHP 已就绪
|
||||
echo.
|
||||
|
||||
REM ==========================================
|
||||
REM 检查 Python
|
||||
REM ==========================================
|
||||
echo [检查] 正在检查 Python...
|
||||
|
||||
python --version >nul 2>&1
|
||||
if errorlevel 1 (
|
||||
echo [错误] Python 未找到或未添加到 PATH
|
||||
echo.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [成功] Python 已就绪
|
||||
echo.
|
||||
|
||||
REM ==========================================
|
||||
REM 检查项目目录
|
||||
REM ==========================================
|
||||
echo [检查] 正在检查项目目录...
|
||||
|
||||
if not exist "%~dp0xunifriend_RaeeC\public" (
|
||||
echo [错误] PHP 项目目录未找到
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
if not exist "%~dp0lover" (
|
||||
echo [错误] Python 项目目录未找到
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [成功] 项目目录已就绪
|
||||
echo.
|
||||
|
||||
REM ==========================================
|
||||
REM 获取本机 IP
|
||||
REM ==========================================
|
||||
for /f "tokens=2 delims=:" %%a in ('ipconfig ^| findstr /C:"IPv4"') do (
|
||||
set LOCAL_IP=%%a
|
||||
goto :IP_FOUND
|
||||
)
|
||||
:IP_FOUND
|
||||
set LOCAL_IP=%LOCAL_IP: =%
|
||||
|
||||
REM ==========================================
|
||||
REM 显示启动信息
|
||||
REM ==========================================
|
||||
cls
|
||||
echo.
|
||||
echo ╔════════════════════════════════════╗
|
||||
echo ║ AI 女友项目 - 启动服务 ║
|
||||
echo ╚════════════════════════════════════╝
|
||||
echo.
|
||||
echo 准备启动以下服务:
|
||||
echo.
|
||||
echo [PHP 服务器]
|
||||
echo → 端口: %PHP_PORT%
|
||||
echo → 本地: http://127.0.0.1:%PHP_PORT%
|
||||
echo → 测试: http://127.0.0.1:%PHP_PORT%/test_api.php
|
||||
echo → 局域网: http://%LOCAL_IP%:%PHP_PORT%
|
||||
echo.
|
||||
echo [Python 后端]
|
||||
echo → 端口: %PYTHON_PORT%
|
||||
echo → 本地: http://127.0.0.1:%PYTHON_PORT%
|
||||
echo → 局域网: http://%LOCAL_IP%:%PYTHON_PORT%
|
||||
echo.
|
||||
echo ────────────────────────────────────
|
||||
echo.
|
||||
echo 按任意键开始启动...
|
||||
pause >nul
|
||||
|
||||
REM ==========================================
|
||||
REM 启动 PHP 服务器(使用 router.php)
|
||||
REM ==========================================
|
||||
cls
|
||||
echo.
|
||||
echo [1/2] 启动 PHP 服务器...
|
||||
echo.
|
||||
|
||||
start "PHP 服务器 - 端口 %PHP_PORT%" cmd /k "title PHP 服务器 - 端口 %PHP_PORT% && cd /d "%~dp0xunifriend_RaeeC\public" && echo [PHP 服务器] 正在启动... && echo [PHP 服务器] 端口: %PHP_PORT% && echo [PHP 服务器] 访问: http://127.0.0.1:%PHP_PORT% && echo [PHP 服务器] 测试: http://127.0.0.1:%PHP_PORT%/test_api.php && echo. && "%PHP_PATH%" -S 0.0.0.0:%PHP_PORT% router.php"
|
||||
|
||||
echo [成功] PHP 服务器已启动
|
||||
echo.
|
||||
|
||||
REM 等待 5 秒让 PHP 完全启动
|
||||
echo 等待 PHP 服务器启动(5秒)...
|
||||
timeout /t 5 >nul
|
||||
|
||||
REM ==========================================
|
||||
REM 测试 PHP 服务器
|
||||
REM ==========================================
|
||||
echo.
|
||||
echo [测试] 正在测试 PHP 服务器...
|
||||
echo.
|
||||
|
||||
powershell -Command "try { $response = Invoke-WebRequest -Uri 'http://127.0.0.1:%PHP_PORT%/test_api.php' -TimeoutSec 5; if ($response.StatusCode -eq 200) { Write-Host '[成功] PHP 服务器响应正常' -ForegroundColor Green } else { Write-Host '[警告] PHP 服务器响应异常' -ForegroundColor Yellow } } catch { Write-Host '[错误] PHP 服务器无响应' -ForegroundColor Red; Write-Host $_.Exception.Message -ForegroundColor Red }"
|
||||
|
||||
echo.
|
||||
set /p CONTINUE_PYTHON=PHP 服务器已启动,是否继续启动 Python 后端?(Y/N):
|
||||
if /i not "%CONTINUE_PYTHON%"=="Y" (
|
||||
echo.
|
||||
echo 已取消 Python 后端启动
|
||||
echo.
|
||||
echo 按任意键退出...
|
||||
pause >nul
|
||||
exit /b 0
|
||||
)
|
||||
|
||||
REM ==========================================
|
||||
REM 启动 Python 后端
|
||||
REM ==========================================
|
||||
echo.
|
||||
echo [2/2] 启动 Python 后端...
|
||||
echo.
|
||||
|
||||
start "Python 后端 - 端口 %PYTHON_PORT%" cmd /k "title Python 后端 - 端口 %PYTHON_PORT% && cd /d "%~dp0" && echo [Python 后端] 正在启动... && echo [Python 后端] 端口: %PYTHON_PORT% && echo [Python 后端] 访问: http://127.0.0.1:%PYTHON_PORT% && echo [Python 后端] API 文档: http://127.0.0.1:%PYTHON_PORT%/docs && echo. && python -m uvicorn lover.main:app --host 0.0.0.0 --port %PYTHON_PORT% --reload"
|
||||
|
||||
echo [成功] Python 后端已启动
|
||||
echo.
|
||||
|
||||
REM 等待 3 秒让 Python 完全启动
|
||||
echo 等待 Python 后端启动(3秒)...
|
||||
timeout /t 3 >nul
|
||||
|
||||
REM ==========================================
|
||||
REM 显示完成信息
|
||||
REM ==========================================
|
||||
cls
|
||||
echo.
|
||||
echo ╔════════════════════════════════════╗
|
||||
echo ║ 启动成功! ║
|
||||
echo ╚════════════════════════════════════╝
|
||||
echo.
|
||||
echo [PHP 服务器] ✓ 已启动
|
||||
echo → http://127.0.0.1:%PHP_PORT%
|
||||
echo → http://127.0.0.1:%PHP_PORT%/test_api.php (测试)
|
||||
echo → http://127.0.0.1:%PHP_PORT%/admin
|
||||
echo → http://%LOCAL_IP%:%PHP_PORT%
|
||||
echo.
|
||||
echo [Python 后端] ✓ 已启动
|
||||
echo → http://127.0.0.1:%PYTHON_PORT%
|
||||
echo → http://127.0.0.1:%PYTHON_PORT%/docs
|
||||
echo → http://%LOCAL_IP%:%PYTHON_PORT%
|
||||
echo.
|
||||
echo ────────────────────────────────────
|
||||
echo.
|
||||
echo 提示:
|
||||
echo • 两个服务已在独立窗口中启动
|
||||
echo • 可以在窗口中查看运行日志
|
||||
echo • 关闭对应窗口可停止服务
|
||||
echo • 如果 PHP API 超时,请检查 MySQL 是否运行
|
||||
echo.
|
||||
echo 按任意键打开浏览器测试...
|
||||
pause >nul
|
||||
|
||||
REM ==========================================
|
||||
REM 打开浏览器测试
|
||||
REM ==========================================
|
||||
start http://127.0.0.1:%PHP_PORT%/test_api.php
|
||||
timeout /t 1 >nul
|
||||
start http://127.0.0.1:%PYTHON_PORT%/docs
|
||||
|
||||
echo.
|
||||
echo 浏览器已打开!
|
||||
echo.
|
||||
echo 按任意键退出(不影响服务运行)...
|
||||
pause >nul
|
||||
exit
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
===========================================
|
||||
添加打电话按钮 - 代码补丁
|
||||
===========================================
|
||||
|
||||
文件:xuniYou/pages/index/index.vue
|
||||
位置:约第 302-318 行(聊天输入框区域)
|
||||
|
||||
===========================================
|
||||
步骤 1:找到以下代码
|
||||
===========================================
|
||||
|
||||
<!-- 底部输入框 -->
|
||||
<view class="chat-input-bar">
|
||||
<input
|
||||
class="chat-message-input"
|
||||
v-model="chatInputText"
|
||||
placeholder="输入消息..."
|
||||
confirm-type="send"
|
||||
:adjust-position="true"
|
||||
:hold-keyboard="false"
|
||||
@confirm="sendChatMessage"
|
||||
@blur="onInputBlur"
|
||||
/>
|
||||
<view class="chat-send-btn" @click="sendChatMessage">
|
||||
<text>发送</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
===========================================
|
||||
步骤 2:替换为以下代码
|
||||
===========================================
|
||||
|
||||
<!-- 底部输入框 -->
|
||||
<view class="chat-input-bar">
|
||||
<!-- 打电话按钮 -->
|
||||
<view class="chat-phone-btn" @click="tophone">
|
||||
<image class="chat-phone-icon" src="/static/images/phone_a1.png" mode="aspectFit"></image>
|
||||
</view>
|
||||
|
||||
<input
|
||||
class="chat-message-input"
|
||||
v-model="chatInputText"
|
||||
placeholder="输入消息..."
|
||||
confirm-type="send"
|
||||
:adjust-position="true"
|
||||
:hold-keyboard="false"
|
||||
@confirm="sendChatMessage"
|
||||
@blur="onInputBlur"
|
||||
/>
|
||||
<view class="chat-send-btn" @click="sendChatMessage">
|
||||
<text>发送</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
===========================================
|
||||
步骤 3:添加样式
|
||||
===========================================
|
||||
|
||||
在 <style> 部分(约第 4916 行附近)的 .chat-input-bar 样式后面添加:
|
||||
|
||||
/* 打电话按钮 */
|
||||
.chat-phone-btn {
|
||||
width: 80rpx;
|
||||
height: 80rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||
border-radius: 50%;
|
||||
margin-right: 20rpx;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.chat-phone-icon {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
===========================================
|
||||
完成!
|
||||
===========================================
|
||||
|
||||
保存文件后,重新编译前端项目。
|
||||
|
||||
测试步骤:
|
||||
1. 打开应用
|
||||
2. 进入聊天页面
|
||||
3. 应该能看到输入框左侧有一个紫色的圆形按钮
|
||||
4. 点击按钮进入语音通话页面
|
||||
|
||||
===========================================
|
||||
87
清理端口.bat
87
清理端口.bat
|
|
@ -1,87 +0,0 @@
|
|||
@echo off
|
||||
chcp 65001 >nul
|
||||
title 清理端口 30100 和 30101
|
||||
|
||||
echo.
|
||||
echo ╔════════════════════════════════════╗
|
||||
echo ║ 清理端口 30100 和 30101 ║
|
||||
echo ╚════════════════════════════════════╝
|
||||
echo.
|
||||
|
||||
REM ==========================================
|
||||
REM 清理端口 30100
|
||||
REM ==========================================
|
||||
echo [清理] 正在检查端口 30100...
|
||||
echo.
|
||||
|
||||
set FOUND_30100=0
|
||||
for /f "tokens=5" %%a in ('netstat -ano ^| findstr :30100 2^>nul') do (
|
||||
set FOUND_30100=1
|
||||
echo [终止] 进程 PID: %%a
|
||||
taskkill /F /PID %%a >nul 2>&1
|
||||
if errorlevel 1 (
|
||||
echo [警告] 无法终止进程 %%a
|
||||
) else (
|
||||
echo [成功] 已终止进程 %%a
|
||||
)
|
||||
)
|
||||
|
||||
if %FOUND_30100%==0 (
|
||||
echo [信息] 端口 30100 未被占用
|
||||
)
|
||||
|
||||
echo.
|
||||
|
||||
REM ==========================================
|
||||
REM 清理端口 30101
|
||||
REM ==========================================
|
||||
echo [清理] 正在检查端口 30101...
|
||||
echo.
|
||||
|
||||
set FOUND_30101=0
|
||||
for /f "tokens=5" %%a in ('netstat -ano ^| findstr :30101 2^>nul') do (
|
||||
set FOUND_30101=1
|
||||
echo [终止] 进程 PID: %%a
|
||||
taskkill /F /PID %%a >nul 2>&1
|
||||
if errorlevel 1 (
|
||||
echo [警告] 无法终止进程 %%a
|
||||
) else (
|
||||
echo [成功] 已终止进程 %%a
|
||||
)
|
||||
)
|
||||
|
||||
if %FOUND_30101%==0 (
|
||||
echo [信息] 端口 30101 未被占用
|
||||
)
|
||||
|
||||
echo.
|
||||
echo ────────────────────────────────────
|
||||
echo.
|
||||
echo [完成] 端口清理完成!
|
||||
echo.
|
||||
|
||||
REM 等待端口完全释放
|
||||
echo [等待] 等待端口完全释放(3秒)...
|
||||
timeout /t 3 >nul
|
||||
|
||||
echo.
|
||||
echo [验证] 验证端口状态...
|
||||
echo.
|
||||
|
||||
netstat -ano | findstr :30100
|
||||
if errorlevel 1 (
|
||||
echo [✓] 端口 30100 已释放
|
||||
) else (
|
||||
echo [✗] 端口 30100 仍被占用
|
||||
)
|
||||
|
||||
netstat -ano | findstr :30101
|
||||
if errorlevel 1 (
|
||||
echo [✓] 端口 30101 已释放
|
||||
) else (
|
||||
echo [✗] 端口 30101 仍被占用
|
||||
)
|
||||
|
||||
echo.
|
||||
echo 按任意键退出...
|
||||
pause >nul
|
||||
82
诊断问题.bat
82
诊断问题.bat
|
|
@ -1,82 +0,0 @@
|
|||
@echo off
|
||||
chcp 65001 >nul
|
||||
title 诊断 PHP 服务器问题
|
||||
|
||||
echo.
|
||||
echo ╔════════════════════════════════════╗
|
||||
echo ║ 诊断 PHP 服务器问题 ║
|
||||
echo ╚════════════════════════════════════╝
|
||||
echo.
|
||||
|
||||
REM ==========================================
|
||||
REM 1. 检查 MySQL 服务
|
||||
REM ==========================================
|
||||
echo [1/5] 检查 MySQL 服务...
|
||||
echo.
|
||||
|
||||
netstat -ano | findstr :3306 >nul 2>&1
|
||||
if errorlevel 1 (
|
||||
echo [✗] MySQL 服务未运行(端口 3306 未监听)
|
||||
echo.
|
||||
echo 这可能是导致 PHP API 超时的原因!
|
||||
echo 请启动 MySQL 服务后再试。
|
||||
echo.
|
||||
) else (
|
||||
echo [✓] MySQL 服务正在运行
|
||||
echo.
|
||||
)
|
||||
|
||||
REM ==========================================
|
||||
REM 2. 检查 PHP 服务器
|
||||
REM ==========================================
|
||||
echo [2/5] 检查 PHP 服务器...
|
||||
echo.
|
||||
|
||||
netstat -ano | findstr :30100 >nul 2>&1
|
||||
if errorlevel 1 (
|
||||
echo [✗] PHP 服务器未运行(端口 30100 未监听)
|
||||
echo.
|
||||
) else (
|
||||
echo [✓] PHP 服务器正在运行
|
||||
echo.
|
||||
)
|
||||
|
||||
REM ==========================================
|
||||
REM 3. 测试 PHP 基本响应
|
||||
REM ==========================================
|
||||
echo [3/5] 测试 PHP 基本响应...
|
||||
echo.
|
||||
|
||||
powershell -Command "try { $response = Invoke-WebRequest -Uri 'http://127.0.0.1:30100/test_api.php' -TimeoutSec 5; Write-Host '[✓] PHP 服务器响应正常' -ForegroundColor Green; Write-Host '响应内容:' -ForegroundColor Cyan; $response.Content } catch { Write-Host '[✗] PHP 服务器无响应' -ForegroundColor Red; Write-Host '错误:' $_.Exception.Message -ForegroundColor Red }"
|
||||
|
||||
echo.
|
||||
|
||||
REM ==========================================
|
||||
REM 4. 测试 PHP 调试接口
|
||||
REM ==========================================
|
||||
echo [4/5] 测试 PHP 调试接口(包含数据库检查)...
|
||||
echo.
|
||||
|
||||
powershell -Command "try { $response = Invoke-WebRequest -Uri 'http://127.0.0.1:30100/debug.php' -TimeoutSec 10; Write-Host '[✓] 调试接口响应正常' -ForegroundColor Green; Write-Host '响应内容:' -ForegroundColor Cyan; $response.Content } catch { Write-Host '[✗] 调试接口无响应' -ForegroundColor Red; Write-Host '错误:' $_.Exception.Message -ForegroundColor Red }"
|
||||
|
||||
echo.
|
||||
|
||||
REM ==========================================
|
||||
REM 5. 测试实际 API
|
||||
REM ==========================================
|
||||
echo [5/5] 测试实际 API(需要有效 token)...
|
||||
echo.
|
||||
|
||||
powershell -Command "try { $response = Invoke-WebRequest -Uri 'http://127.0.0.1:30100/api/user_basic/get_user_basic' -Headers @{'token'='test-token'} -TimeoutSec 10; Write-Host '[✓] API 响应正常' -ForegroundColor Green; Write-Host '响应内容:' -ForegroundColor Cyan; $response.Content } catch { Write-Host '[✗] API 无响应或返回错误' -ForegroundColor Yellow; Write-Host '错误:' $_.Exception.Message -ForegroundColor Yellow; Write-Host ''; Write-Host '这是正常的,因为使用了无效的 token' -ForegroundColor Gray }"
|
||||
|
||||
echo.
|
||||
echo ════════════════════════════════════
|
||||
echo.
|
||||
echo 诊断完成!
|
||||
echo.
|
||||
echo 如果看到以下问题:
|
||||
echo • MySQL 未运行 → 请启动 MySQL 服务
|
||||
echo • PHP 服务器无响应 → 检查 PHP 启动窗口的错误信息
|
||||
echo • 数据库连接失败 → 检查 xunifriend_RaeeC/.env 中的数据库配置
|
||||
echo.
|
||||
pause
|
||||
Loading…
Reference in New Issue
Block a user