样式:调整好
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() {
|
connectWebSocket() {
|
||||||
|
// 根据 baseURLPy 构建 WebSocket URL
|
||||||
|
let wsUrl = baseURLPy.replace('http://', 'ws://').replace('https://', 'wss://') + '/voice/call'
|
||||||
|
console.log('WebSocket URL:', wsUrl)
|
||||||
|
|
||||||
this.socketTask = uni.connectSocket({
|
this.socketTask = uni.connectSocket({
|
||||||
url: 'wss://lovers.shandonghuixing.com/voice/call',
|
url: wsUrl,
|
||||||
header: {
|
header: {
|
||||||
"content-type": "application/json",
|
"content-type": "application/json",
|
||||||
'Authorization': 'Bearer ' + uni.getStorageSync("token") || ""
|
'Authorization': 'Bearer ' + uni.getStorageSync("token") || ""
|
||||||
|
|
|
||||||
|
|
@ -143,25 +143,28 @@
|
||||||
<image class="home-header-icon" src="/static/images/replacement_switch.png" mode="aspectFit"></image>
|
<image class="home-header-icon" src="/static/images/replacement_switch.png" mode="aspectFit"></image>
|
||||||
<text class="home-header-text">装扮设置</text>
|
<text class="home-header-text">装扮设置</text>
|
||||||
</view>
|
</view>
|
||||||
<view class="home-header-spacer"></view>
|
|
||||||
<view class="home-header-btn" @click="todynamics">
|
<view class="home-header-btn" @click="todynamics">
|
||||||
<image class="home-header-icon" src="/static/images/dynamics_logo.png" mode="aspectFit"></image>
|
<image class="home-header-icon" src="/static/images/dynamics_logo.png" mode="aspectFit"></image>
|
||||||
<text class="home-header-text">朋友圈</text>
|
<text class="home-header-text">朋友圈</text>
|
||||||
</view>
|
</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">
|
<view class="home-header-btn" @click="tointimacy">
|
||||||
<image class="home-header-icon" src="/static/images/index_intimate.png" mode="aspectFit"></image>
|
<image class="home-header-icon" src="/static/images/index_intimate.png" mode="aspectFit"></image>
|
||||||
<text class="home-header-text">邀请入驻</text>
|
<text class="home-header-text">邀请入驻</text>
|
||||||
</view>
|
</view>
|
||||||
</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">
|
||||||
<view class="home-card-inner">
|
<view class="home-card-inner">
|
||||||
|
|
@ -2059,21 +2062,23 @@
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
tophone() {
|
tophone() {
|
||||||
// if (this.getBobbiesList.level >= 2) {
|
console.log('tophone 方法被调用');
|
||||||
// uni.navigateTo({
|
|
||||||
// url: '/pages/chat/phone'
|
|
||||||
// });
|
|
||||||
// } else {
|
|
||||||
// uni.showToast({
|
|
||||||
// title: '达到Lv.2才可以解锁电话',
|
|
||||||
// icon: 'none',
|
|
||||||
// position: 'top'
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: '/pages/chat/phone'
|
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() {
|
togift() {
|
||||||
uni.navigateTo({
|
uni.navigateTo({
|
||||||
url: '/pages/index/gift'
|
url: '/pages/index/gift'
|
||||||
|
|
@ -2226,12 +2231,30 @@
|
||||||
OutfitList({}).then(res => {
|
OutfitList({}).then(res => {
|
||||||
if (res && res.code == 1 && res.data) {
|
if (res && res.code == 1 && res.data) {
|
||||||
this.homeLooksList = res.data.looks || [];
|
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.selectedLookId = this.homeLooksList[0].id;
|
||||||
this.currentLookImageUrl = this.homeLooksList[0].image_url;
|
this.currentLookImageUrl = this.homeLooksList[0].image_url;
|
||||||
// 同时更新聊天头像
|
|
||||||
this.chatLoverAvatar = 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 => {
|
}).catch(err => {
|
||||||
|
|
@ -2243,6 +2266,12 @@
|
||||||
switchLook(look) {
|
switchLook(look) {
|
||||||
if (!look || !look.id) return;
|
if (!look || !look.id) return;
|
||||||
|
|
||||||
|
// 立即更新本地显示,避免延迟
|
||||||
|
this.selectedLookId = look.id;
|
||||||
|
if (this.loverBasicList) {
|
||||||
|
this.loverBasicList.image_url = look.image_url;
|
||||||
|
}
|
||||||
|
|
||||||
// 调用后端 API 切换形象
|
// 调用后端 API 切换形象
|
||||||
uni.request({
|
uni.request({
|
||||||
url: baseURLPy + '/outfit/looks/use/' + look.id,
|
url: baseURLPy + '/outfit/looks/use/' + look.id,
|
||||||
|
|
@ -2252,21 +2281,16 @@
|
||||||
},
|
},
|
||||||
success: (res) => {
|
success: (res) => {
|
||||||
if (res.data && res.data.code === 1) {
|
if (res.data && res.data.code === 1) {
|
||||||
this.selectedLookId = look.id;
|
|
||||||
this.currentLookImageUrl = look.image_url;
|
|
||||||
|
|
||||||
// 更新聊天页面的头像
|
// 更新聊天页面的头像
|
||||||
this.chatLoverAvatar = look.image_url;
|
this.chatLoverAvatar = look.image_url;
|
||||||
|
|
||||||
// 更新女友基本信息(刷新图片)
|
// 更新女友基本信息(刷新图片)
|
||||||
this.loverBasic();
|
this.loverBasic();
|
||||||
|
|
||||||
uni.showToast({
|
// 移除成功提示,静默切换
|
||||||
title: '形象切换成功',
|
|
||||||
icon: 'success',
|
|
||||||
duration: 1500
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
|
// 如果失败,恢复原来的图片
|
||||||
|
this.loverBasic();
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: res.data.msg || '切换失败',
|
title: res.data.msg || '切换失败',
|
||||||
icon: 'none',
|
icon: 'none',
|
||||||
|
|
@ -2276,6 +2300,8 @@
|
||||||
},
|
},
|
||||||
fail: (err) => {
|
fail: (err) => {
|
||||||
console.error('切换形象失败:', err);
|
console.error('切换形象失败:', err);
|
||||||
|
// 如果失败,恢复原来的图片
|
||||||
|
this.loverBasic();
|
||||||
uni.showToast({
|
uni.showToast({
|
||||||
title: '切换失败,请重试',
|
title: '切换失败,请重试',
|
||||||
icon: 'none',
|
icon: 'none',
|
||||||
|
|
@ -5110,21 +5136,33 @@
|
||||||
.home-header {
|
.home-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
|
||||||
padding: 20rpx 0;
|
padding: 20rpx 0;
|
||||||
margin-bottom: 20rpx;
|
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 {
|
.home-header-btn {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 8rpx;
|
justify-content: center;
|
||||||
padding: 10rpx 15rpx;
|
gap: 6rpx;
|
||||||
|
padding: 12rpx 16rpx;
|
||||||
background: rgba(255, 255, 255, 0.8);
|
background: rgba(255, 255, 255, 0.8);
|
||||||
border-radius: 16rpx;
|
border-radius: 16rpx;
|
||||||
transition: all 0.3s ease;
|
transition: all 0.3s ease;
|
||||||
box-shadow: 0 2rpx 8rpx rgba(159, 71, 255, 0.1);
|
box-shadow: 0 2rpx 8rpx rgba(159, 71, 255, 0.1);
|
||||||
|
min-width: 100rpx;
|
||||||
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.home-header-btn:active {
|
.home-header-btn:active {
|
||||||
|
|
@ -5133,17 +5171,16 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.home-header-icon {
|
.home-header-icon {
|
||||||
width: 40rpx;
|
width: 44rpx;
|
||||||
height: 40rpx;
|
height: 44rpx;
|
||||||
|
object-fit: contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
.home-header-text {
|
.home-header-text {
|
||||||
font-size: 22rpx;
|
font-size: 22rpx;
|
||||||
color: #666;
|
color: #666;
|
||||||
}
|
white-space: nowrap;
|
||||||
|
text-align: center;
|
||||||
.home-header-spacer {
|
|
||||||
flex: 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 选择互动对象标题 */
|
/* 选择互动对象标题 */
|
||||||
|
|
|
||||||
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