本次提交包含大量代码优化、功能新增与服务端配置更新: 1. 修复分析报告统计数据,调整CMake策略设置 2. 优化APP权限配置、编辑器与聊天界面组件 3. 更新依赖库版本与pubspec配置 4. 新增文件传输服务端、信令服务器相关配置与脚本 5. 完善用户注销功能与数据库迁移脚本 6. 优化多处动画效果、代码风格与日志输出 7. 新增多种调试与部署脚本,修复已知BUG
98 lines
2.8 KiB
Python
98 lines
2.8 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
============================================================
|
|
闲言工具箱 — IP归属地修复部署脚本
|
|
创建时间: 2026-05-12
|
|
作用: 上传修复ip_city为空的UserSecurity.php到服务器
|
|
============================================================
|
|
"""
|
|
|
|
import paramiko
|
|
import time
|
|
|
|
HOST = '123.207.67.197'
|
|
PORT = 22
|
|
USER = 'root'
|
|
PASS = '520Kiss123'
|
|
|
|
REMOTE_APP_PATH = '/www/wwwroot/tools.wktyl.com/application'
|
|
|
|
LOCAL_FILE = r'e:\project\flutter\f\xianyan\docs\toolsapi\application\api\controller\UserSecurity.php'
|
|
REMOTE_FILE = f'{REMOTE_APP_PATH}/api/controller/UserSecurity.php'
|
|
|
|
ssh = paramiko.SSHClient()
|
|
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
|
ssh.connect(HOST, PORT, USER, PASS)
|
|
|
|
sftp = ssh.open_sftp()
|
|
|
|
# 备份
|
|
timestamp = time.strftime('%Y%m%d_%H%M%S')
|
|
backup = f"{REMOTE_FILE}.bak.{timestamp}"
|
|
try:
|
|
sftp.rename(REMOTE_FILE, backup)
|
|
print(f"✅ 备份: {backup}")
|
|
except:
|
|
print("⚠️ 无需备份")
|
|
|
|
# 上传
|
|
sftp.put(LOCAL_FILE, REMOTE_FILE)
|
|
sftp.chmod(REMOTE_FILE, 0o644)
|
|
print("✅ 上传: UserSecurity.php (含queryIpLocation修复)")
|
|
|
|
# 清理缓存
|
|
ssh.exec_command(f'rm -rf {REMOTE_APP_PATH}/../runtime/cache/* {REMOTE_APP_PATH}/../runtime/temp/*')
|
|
print("✅ 缓存已清理")
|
|
|
|
# 验证文件
|
|
stat = sftp.stat(REMOTE_FILE)
|
|
print(f"✅ 文件大小: {stat.st_size} bytes")
|
|
|
|
sftp.close()
|
|
|
|
# 测试: 登录后检查ip_city
|
|
print("\n--- 测试: 登录后ip_city是否自动填充 ---")
|
|
import requests as req
|
|
|
|
session = req.Session()
|
|
session.headers.update({
|
|
"Accept": "application/json",
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
})
|
|
|
|
resp = session.post('https://tools.wktyl.com/api/user_security/login', data={
|
|
'account': 'apitest_user',
|
|
'password': '123456',
|
|
}, timeout=15)
|
|
login_data = resp.json()
|
|
if login_data.get('code') == 1:
|
|
token = login_data['data']['userinfo']['token']
|
|
user_id = login_data['data']['userinfo']['id']
|
|
print(f"✅ 登录成功 (user_id={user_id})")
|
|
|
|
# 查询设备列表
|
|
resp2 = session.get(
|
|
'https://tools.wktyl.com/api/user_center/myDevices',
|
|
headers={'token': token},
|
|
timeout=15,
|
|
)
|
|
devices_data = resp2.json()
|
|
if devices_data.get('code') == 1:
|
|
devices = devices_data.get('data', {}).get('devices', [])
|
|
for d in devices:
|
|
ip_city = d.get('ip_city', '')
|
|
ip_range = d.get('ip_range', '')
|
|
device_name = d.get('device_name', '')
|
|
print(f" 设备: {device_name} | ip_city={ip_city} | ip_range={ip_range}")
|
|
if ip_city:
|
|
print(" ✅ ip_city已自动填充!")
|
|
else:
|
|
print(" ⚠️ ip_city仍为空")
|
|
else:
|
|
print(f" ❌ 设备列表查询失败: {devices_data.get('msg')}")
|
|
else:
|
|
print(f"❌ 登录失败: {login_data.get('msg')}")
|
|
|
|
ssh.close()
|
|
print("\n部署完成!")
|