提交 cd482a0d authored 作者: 陈泽健's avatar 陈泽健

fix(edit):修复功能测试报告中错误的系统版本信息,输出接口安全测试的需求文档与计划执行文档

上级 26fbafea
---
name: CreateCMD
description: 在当前目录打开指定数量的CMD窗口
---
在当前工作目录下打开指定数量的 CMD 命令提示符窗口。
## Usage
/CreateCMD [数量]
## Description
根据用户输入的数量,在当前工作目录下打开对应数量的 CMD 窗口。
**功能:**
- 询问用户需要打开的 CMD 窗口数量
- 在当前工作目录下打开指定数量的 CMD 窗口
- 每个窗口独立运行,互不影响
**示例:**
```
/CreateCMD 3 # 在当前目录打开 3 个 CMD 窗口
/CreateCMD # 会询问需要打开的数量,然后执行
```
**执行步骤:**
1. 如果用户未提供数量参数,使用 AskUserQuestion 询问用户需要打开几个 CMD 窗口(提供 1、2、3、4 作为常见选项,也可输入其他数量)
2. 获取当前工作目录路径
3. 使用命令打开指定数量的 CMD 窗口:
```
# 打开单个 CMD 窗口,切换到当前目录并自动启动 claude
start cmd /k "cd /d <当前目录> && claude --permission-mode bypassPermissions"
```
循环执行 N 次,每次打开一个新的 CMD 窗口,窗口打开后会自动执行 `claude --permission-mode bypassPermissions`
4. 确认并告知用户已成功打开的窗口数量
**注意事项:**
- 使用 `start cmd /k "cd /d <path> && claude --permission-mode bypassPermissions"` 命令,`/k` 参数确保窗口执行完命令后保持打开
- 工作目录设为 Claude Code 的当前工作目录
- 每个窗口打开后会自动切换到当前目录并启动 `claude --permission-mode bypassPermissions`
- 数量上限建议不超过 10 个,避免系统资源占用过高
......@@ -41,3 +41,14 @@ __pycache__/
/AuxiliaryTool/ScriptTool/RemoteDeploy/reports/X86_192.168.5.69_部署分析报告_20260605_130040.md
/AuxiliaryTool/ScriptTool/RemoteDeploy/reports/X86_UOS_5.70_部署分析报告_20260604.md
/AuxiliaryTool/ScriptTool/RemoteDeploy/reports/X86欧拉部署分析报告_20260604.md
/AuxiliaryTool/FunctionalTestReportGeneration/temp/bug_by_module_chart.png
/AuxiliaryTool/FunctionalTestReportGeneration/temp/bug_level_chart.png
/AuxiliaryTool/ScriptTool/RemoteUpdate/reports/env_update_20260608_104410.log
/AuxiliaryTool/ScriptTool/RemoteUpdate/reports/env_update_20260608_105607.log
/AuxiliaryTool/ScriptTool/RemoteUpdate/reports/env_update_20260608_110848.log
/AuxiliaryTool/FunctionalTestReportGeneration/temp/pass_rate_chart.png
/AuxiliaryTool/ScriptTool/RemoteUpdate/temp_env_update/services_update.tar.gz
/AuxiliaryTool/FunctionalTestReportGeneration/temp/test_result_chart.png
/AuxiliaryTool/ScriptTool/RemoteUpdate/reports/X86_192.168.5.46_环境版本更新报告_20260608.md
/AuxiliaryTool/ScriptTool/RemoteDeploy/reports/x86_uos_deploy_20260608_103633.log
/AuxiliaryTool/ScriptTool/RemoteDeploy/reports/x86_uos_deploy_20260608_105537.log
......@@ -152,6 +152,9 @@ KEYWORD_DEPLOYMENT_ENV = "【部署环境】"
# BUG列表复现步骤中的关键字(使用【】标签格式)
KEYWORD_VERSION_INFO = "【版本信息】"
# 版本信息结束标记(遇到这些标记时停止提取版本信息)
VERSION_STOP_MARKERS = ["【步骤】", "【结果】", "【预期】", "【期望】", "【备注】"]
# ================================
# 自动填充默认值配置
# ================================
......
......@@ -15,6 +15,8 @@ from src.config import (
KEYWORD_SERVER_INFO,
KEYWORD_VERSION_INFO,
KEYWORD_DEPLOYMENT_ENV,
# 版本信息结束标记
VERSION_STOP_MARKERS,
# 默认值配置
DEFAULT_TEST_LEAD,
DEFAULT_TESTER,
......@@ -132,6 +134,14 @@ def extract_version_info(text: str, keyword: str = None) -> str:
start_index = keyword_index + len(keyword)
extracted_content = text[start_index:].strip()
# 在提取内容中查找结束标记,截断到标记位置
# 处理版本信息与步骤信息在同一行的情况(如:对外服务:xxx【步骤】1.xxx)
for marker in VERSION_STOP_MARKERS:
marker_index = extracted_content.find(marker)
if marker_index != -1:
extracted_content = extracted_content[:marker_index]
break
# 按行分割,提取所有非空行
lines = extracted_content.split("\n")
version_lines = []
......
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
ARM欧拉服务器部署 - 分步执行脚本
逐步执行部署操作,记录每一步结果
"""
import paramiko
import sys
import os
import time
import traceback
from datetime import datetime
# 修复Windows控制台编码
if sys.platform == 'win32':
try:
sys.stdout.reconfigure(encoding='utf-8', errors='replace')
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
except Exception:
pass
# 服务器配置
HOST = '192.168.9.75'
USER = 'root'
PASS = 'Ubains@123'
DEPLOY_DIR = '/data/arm_offline_auto_unifiedPlatform'
DEPLOY_PKG = 'arm_offline_auto_unifiedPlatform.tar.gz'
DEPLOY_MD5 = 'arm_offline_auto_unifiedPlatform.tar.gz.md5'
# NAS路径
NAS_DIR = r'Z:\发布版本\03服务器部署\15新统一平台\ARM部署包'
def log(msg, level="INFO"):
ts = datetime.now().strftime('%H:%M:%S')
print(f"[{ts}] [{level}] {msg}", flush=True)
def ssh_connect():
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(HOST, username=USER, password=PASS, timeout=30,
look_for_keys=False, allow_agent=False)
return ssh
def run_cmd(ssh, cmd, timeout=300):
stdin, stdout, stderr = ssh.exec_command(cmd, timeout=timeout)
out = stdout.read().decode('utf-8', errors='replace')
err = stderr.read().decode('utf-8', errors='replace')
exit_code = stdout.channel.recv_exit_status()
return exit_code, out, err
def main():
step = sys.argv[1] if len(sys.argv) > 1 else 'check'
try:
ssh = ssh_connect()
log(f"SSH连接成功: {HOST}")
if step == 'check':
# 磁盘检查
log("=== 磁盘检查 ===")
_, out, _ = run_cmd(ssh, 'df -h /data')
print(out)
if '/data' in out:
log("[OK] /data 分区存在")
else:
log("[FAIL] /data 分区不存在", "ERROR")
# 部署包检查
log("=== 部署包检查 ===")
_, out, _ = run_cmd(ssh, f'ls -lh /data/{DEPLOY_PKG} /data/{DEPLOY_MD5} 2>&1')
print(out)
# 部署目录检查
log("=== 部署目录检查 ===")
_, out, _ = run_cmd(ssh, f'ls -la {DEPLOY_DIR}/ 2>&1 | head -20')
print(out)
# 容器状态
log("=== 容器状态 ===")
_, out, _ = run_cmd(ssh, "docker ps -a --format 'table {{.Names}}\t{{.Status}}' 2>&1")
print(out)
# Nacos cron 检查
log("=== Nacos Cron 检查 ===")
_, out, _ = run_cmd(ssh, "crontab -l 2>/dev/null | grep -i nacos || echo 'no_nacos_cron'")
print(out)
elif step == 'upload':
# 上传部署包
log("=== 步骤: 上传部署包 ===")
local_tar = os.path.join(NAS_DIR, DEPLOY_PKG)
local_md5 = os.path.join(NAS_DIR, DEPLOY_MD5)
if not os.path.exists(local_tar):
log(f"[FAIL] 本地文件不存在: {local_tar}", "ERROR")
return 1
pkg_size = os.path.getsize(local_tar)
log(f"部署包大小: {pkg_size/1024/1024/1024:.2f} GB")
# 清理旧文件
log("清理目标服务器旧文件...")
run_cmd(ssh, f'rm -rf {DEPLOY_DIR}')
run_cmd(ssh, f'rm -f /data/{DEPLOY_PKG} /data/{DEPLOY_MD5}')
# SFTP上传
sftp = ssh.open_sftp()
log(f"正在上传 {DEPLOY_PKG}...")
start = time.time()
# 进度回调
last_report = [0]
def progress(transferred, total):
if transferred - last_report[0] > 500 * 1024 * 1024: # 每500MB报告
pct = transferred * 100 // total
mb = transferred // (1024 * 1024)
total_mb = total // (1024 * 1024)
elapsed = time.time() - start
speed = mb / (elapsed / 60) if elapsed > 0 else 0
log(f" 上传进度: {pct}% ({mb}MB/{total_mb}MB) 速度: {speed:.0f}MB/min")
last_report[0] = transferred
sftp.put(local_tar, f'/data/{DEPLOY_PKG}', callback=progress)
elapsed = time.time() - start
log(f"tar.gz 上传完成, 用时: {elapsed/60:.1f}分钟")
log(f"正在上传 {DEPLOY_MD5}...")
sftp.put(local_md5, f'/data/{DEPLOY_MD5}')
log("md5 上传完成")
sftp.close()
# 验证上传
_, out, _ = run_cmd(ssh, f'ls -lh /data/{DEPLOY_PKG} /data/{DEPLOY_MD5}')
log(f"服务器文件:\n{out}")
elif step == 'verify_pkg':
# MD5校验
log("=== 步骤: MD5校验 ===")
_, out, _ = run_cmd(ssh, f'cd /data && md5sum -c {DEPLOY_MD5}')
log(f"MD5校验结果: {out.strip()}")
if 'OK' in out or '成功' in out:
log("[OK] MD5校验通过")
else:
log("[FAIL] MD5校验失败", "ERROR")
return 1
elif step == 'extract':
# 检查是否已解压
_, out, _ = run_cmd(ssh, f'ls {DEPLOY_DIR}/arm_new_auto.sh 2>&1')
if 'No such file' not in out and '无法访问' not in out:
log("[OK] 部署目录已存在,跳过解压")
else:
log("=== 步骤: 解压部署包(禁止中断!)===")
extract_script = f"""#!/bin/bash
cd /data
tar -zxvf {DEPLOY_PKG}
echo "EXTRACT_DONE"
"""
# 写入解压脚本
run_cmd(ssh, f"cat > /tmp/extract.sh << 'EXTRACT_EOF'\n{extract_script}\nEXTRACT_EOF")
run_cmd(ssh, "chmod +x /tmp/extract.sh")
# 后台执行
transport = ssh.get_transport()
channel = transport.open_session()
channel.settimeout(15)
channel.exec_command("nohup /tmp/extract.sh </dev/null >/data/extract_output.log 2>&1 & echo $!")
time.sleep(3)
try:
if channel.recv_ready():
pid = channel.recv(8192).decode('utf-8', errors='replace').strip()
log(f"解压进程PID: {pid}")
except:
pass
channel.close()
# 等待解压完成
log("解压进行中,等待完成...")
max_wait = 1200
waited = 0
while waited < max_wait:
time.sleep(10)
waited += 10
_, out, _ = run_cmd(ssh, "grep 'EXTRACT_DONE' /data/extract_output.log 2>/dev/null && echo 'done' || echo 'running'")
if waited % 60 == 0:
log(f"解压进行中... {waited}秒/{max_wait}秒")
if 'done' in out:
log("[OK] 解压完成")
break
if waited >= max_wait:
log("[FAIL] 解压超时", "ERROR")
return 1
# 赋权
log("=== 步骤: 赋权脚本 ===")
run_cmd(ssh, f'chmod 755 {DEPLOY_DIR}/*.sh')
_, out, _ = run_cmd(ssh, f'ls -la {DEPLOY_DIR}/*.sh')
log(f"脚本权限:\n{out}")
# ARM空间检查阈值修改
log("=== 步骤: ARM前置处理 ===")
space_script = f'{DEPLOY_DIR}/arm_auto_check_space.sh'
run_cmd(ssh, f"sed -i 's/exceted_space=100/exceted_space=70/g' {space_script}")
log("[OK] 空间检查阈值已调整为70GB")
elif step == 'deploy':
# 运行部署脚本
log("=== 步骤: 运行部署脚本(禁止中断!)===")
deploy_log = f'{DEPLOY_DIR}/deploy_output.log'
# 清理旧日志
run_cmd(ssh, f'rm -f {deploy_log}')
# 创建部署启动脚本
launcher = f"""#!/bin/bash
cd {DEPLOY_DIR}
export TERM=dumb
printf 'y\ny\ny\ny\ny\ny\ny\nn\n' | ./arm_new_auto.sh --all
echo "DEPLOY_SCRIPT_FINISHED"
"""
run_cmd(ssh, f"cat > /tmp/run_deploy.sh << 'DEPLOY_EOF'\n{launcher}\nDEPLOY_EOF")
run_cmd(ssh, "chmod +x /tmp/run_deploy.sh")
# 后台执行
transport = ssh.get_transport()
channel = transport.open_session()
channel.settimeout(15)
channel.exec_command(f"nohup /tmp/run_deploy.sh </dev/null >{deploy_log} 2>&1 & echo $!")
time.sleep(3)
try:
if channel.recv_ready():
pid = channel.recv(8192).decode('utf-8', errors='replace').strip()
log(f"部署脚本已启动, PID: {pid}")
except:
pass
channel.close()
# 监控部署进度
deploy_start = time.time()
max_wait = 5400 # 90分钟
waited = 0
last_report_min = -1
while waited < max_wait:
time.sleep(15)
waited += 15
current_min = int(waited / 60)
if current_min > last_report_min and current_min % 5 == 0:
last_report_min = current_min
_, lines_out, _ = run_cmd(ssh, f"wc -l {deploy_log} 2>/dev/null || echo '0'")
log_lines = lines_out.strip().split()[0] if lines_out.strip() else '0'
_, tail_out, _ = run_cmd(ssh,
f"tail -10 {deploy_log} 2>/dev/null | grep -E "
f"'部署|安装|启动|完成|成功|失败|ERROR|容器|服务' | tail -3")
log(f"[进度] {current_min}分钟 | 日志行数: {log_lines}")
if tail_out.strip():
for line in tail_out.strip().split('\n')[-3:]:
if line.strip():
log(f" > {line.strip()}")
# 检查完成标志
_, finish_out, _ = run_cmd(ssh,
f"grep 'DEPLOY_SCRIPT_FINISHED' {deploy_log} 2>/dev/null && echo 'FINISHED' || echo 'RUNNING'")
if 'FINISHED' in finish_out:
log("[OK] 部署脚本执行完成")
break
# 检查进程
_, ps_out, _ = run_cmd(ssh, f"pgrep -f 'arm_new_auto.sh' > /dev/null 2>&1 && echo 'running' || echo 'done'")
if 'done' in ps_out:
time.sleep(5)
_, finish2, _ = run_cmd(ssh,
f"grep 'DEPLOY_SCRIPT_FINISHED' {deploy_log} 2>/dev/null && echo 'FINISHED' || echo 'NOT_FINISHED'")
if 'FINISHED' in finish2:
log("[OK] 部署脚本执行完成")
else:
log("[WARN] 进程已结束,未检测到明确完成标志", "WARN")
break
else:
log("[FAIL] 部署超时", "ERROR")
return 1
# source /etc/profile
run_cmd(ssh, 'source /etc/profile')
deploy_time = int((time.time() - deploy_start) / 60)
log(f"部署用时: {deploy_time}分钟")
elif step == 'post_check':
# 部署后容器检查
log("=== 步骤: 容器状态检查 ===")
_, out, _ = run_cmd(ssh, "docker ps --format 'table {{.Names}}\t{{.Status}}'")
print(out)
container_lines = [l for l in out.split('\n') if l.strip() and 'NAMES' not in l]
log(f"运行中的容器: {len(container_lines)}个")
# 退出容器
_, out, _ = run_cmd(ssh, "docker ps -a --filter 'status=exited' --format '{{.Names}} {{.Status}}'")
if out.strip():
log(f"已退出的容器:\n{out}", "WARN")
elif step == 'api_check':
# 首次接口验证
log("=== 步骤: 首次接口验证 ===")
import requests
from urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
url = f'https://{HOST}/exapi/message/getMsgPageList'
for retry in range(1, 6):
try:
resp = requests.get(url, verify=False, timeout=30)
log(f"第{retry}次请求: {resp.text[:200]}")
if '无效token' in resp.text or 'Full authentication' in resp.text:
log("[OK] 预定对外接口正常")
# 二次确认
time.sleep(30)
resp2 = requests.get(url, verify=False, timeout=30)
if '无效token' in resp2.text or 'Full authentication' in resp2.text:
log("[OK] 二次确认正常")
break
else:
log(f"第{retry}次: 响应异常", "WARN")
except Exception as e:
log(f"第{retry}次: {e}", "WARN")
if retry < 5:
log("等待30秒后重试...")
time.sleep(30)
ssh.close()
log("SSH连接已关闭")
return 0
except Exception as e:
log(f"异常: {e}", "ERROR")
traceback.print_exc()
return 1
if __name__ == '__main__':
sys.exit(main())
......@@ -83,7 +83,7 @@ CONFIGS = {
'deploy_dir': '/data/offline_auto_unifiedPlatform',
'deploy_pkg': 'offline_auto_unifiedPlatform.tar.gz',
'deploy_md5': 'offline_auto_unifiedPlatform.tar.gz.md5',
'nas_dir': r'Z:\发布版本\03服务器部署\15新统一平台\X86部署包\全量版\版本更新-待验证',
'nas_dir': r'Z:\发布版本\03服务器部署\15新统一平台\X86部署包\全量版',
'deploy_script': 'new_auto.sh',
'deploy_answers': "y\ny\ny\ny\ny\ny\ny\nn\n",
'deploy_log': '/data/offline_auto_unifiedPlatform/deploy_output.log',
......@@ -417,16 +417,21 @@ echo "EXTRACT_DONE"
else:
run(f"cd {cfg['deploy_dir']} && chmod 755 *.sh")
logger.log("[OK] 脚本赋权完成")
# ARM空间检查修补:将阈值从100GB降至70GB(部分服务器只有79GB)
# 空间检查修补:将阈值从100GB降至70GB(部分服务器空间不足100GB)
if arch in ('arm', 'arm_ubuntu'):
space_script = f"{cfg['deploy_dir']}/arm_auto_check_space.sh"
run(f"sed -i 's/exceted_space=100/exceted_space=70/g' {space_script}")
logger.log("[OK] ARM空间检查阈值已调整为70GB")
else:
space_script = f"{cfg['deploy_dir']}/auto_check_space.sh"
run(f"sed -i 's/exceted_space=100/exceted_space=70/g' {space_script}")
logger.log(f"[OK] 空间检查阈值已调整为70GB ({space_script})")
results['steps']['extract'] = True
# ARM空间检查修补(即使跳过解压也要确保阈值正确)
if arch in ('arm', 'arm_ubuntu') and results['steps'].get('extract', False):
space_script = f"{cfg['deploy_dir']}/arm_auto_check_space.sh"
# 空间检查修补(即使跳过解压也要确保阈值正确)
if results['steps'].get('extract', False):
if arch in ('arm', 'arm_ubuntu'):
space_script = f"{cfg['deploy_dir']}/arm_auto_check_space.sh"
else:
space_script = f"{cfg['deploy_dir']}/auto_check_space.sh"
run(f"sed -i 's/exceted_space=100/exceted_space=70/g' {space_script} 2>/dev/null")
# 步骤4:运行部署脚本
......
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
SSH远程操作辅助脚本
使用paramiko库进行SSH连接和远程命令执行
"""
import paramiko
import sys
import time
import os
import re
# 服务器配置
HOST = "192.168.5.69"
PORT = 22
USER = "root"
PASS = "Ubains@123"
def get_ssh_client():
"""创建并返回SSH客户端连接"""
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(HOST, PORT, USER, PASS, timeout=30)
return client
def exec_cmd(client, cmd, timeout=600):
"""执行远程命令并返回输出"""
print(f"[CMD] {cmd}")
stdin, stdout, stderr = client.exec_command(cmd, timeout=timeout)
out = stdout.read().decode('utf-8', errors='replace')
err = stderr.read().decode('utf-8', errors='replace')
exit_code = stdout.channel.recv_exit_status()
if out.strip():
print(out)
if err.strip():
print(f"[STDERR] {err}")
return out, err, exit_code
def exec_long_cmd(client, cmd, timeout=3600):
"""执行长时间运行的命令,实时输出"""
print(f"[LONG CMD] {cmd}")
stdin, stdout, stderr = client.exec_command(cmd, timeout=timeout, get_pty=True)
output_lines = []
while True:
line = stdout.readline()
if not line:
break
line = line.strip()
if line:
print(line)
output_lines.append(line)
exit_code = stdout.channel.recv_exit_status()
print(f"[EXIT CODE] {exit_code}")
return '\n'.join(output_lines), exit_code
def upload_file(local_path, remote_path):
"""使用SFTP上传文件,支持大文件传输进度显示"""
file_size = os.path.getsize(local_path)
size_gb = file_size / (1024*1024*1024)
print(f"[UPLOAD] {local_path} -> {remote_path}")
print(f"[UPLOAD] 文件大小: {size_gb:.2f} GB ({file_size:,} bytes)")
transport = paramiko.Transport((HOST, PORT))
transport.connect(username=USER, password=PASS)
sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put(local_path, remote_path,
callback=lambda transferred, total:
print(f" 进度: {transferred/(1024*1024*1024):.2f}/{total/(1024*1024*1024):.2f} GB ({transferred*100//total}%)")
if total > 0 and (transferred % (500*1024*1024)) < 32768 else None)
sftp.close()
transport.close()
print(f"[UPLOAD DONE] {local_path} -> {remote_path}")
def main():
"""主函数 - 根据命令行参数执行不同操作"""
if len(sys.argv) < 2:
print("用法: python ssh_helper.py <command> [args]")
print("命令: check | exec <cmd> | upload <local> <remote>")
sys.exit(1)
action = sys.argv[1]
if action == "check":
# 检查服务器状态
client = get_ssh_client()
print("=== SSH连接成功 ===")
out, err, code = exec_cmd(client, "cat /etc/os-release | head -5")
print("--- 系统信息 ---")
print(out)
out, err, code = exec_cmd(client, "df -TH")
print("--- 磁盘分区 ---")
print(out)
out, err, code = exec_cmd(client, "ls -la /data/")
print("--- /data目录 ---")
print(out)
out, err, code = exec_cmd(client, "free -h")
print("--- 内存信息 ---")
print(out)
out, err, code = exec_cmd(client, "date")
print("--- 系统时间 ---")
print(out)
client.close()
print("=== 检查完成 ===")
elif action == "exec":
if len(sys.argv) < 3:
print("用法: python ssh_helper.py exec <command>")
sys.exit(1)
cmd = sys.argv[2]
client = get_ssh_client()
out, err, code = exec_cmd(client, cmd)
print(out)
client.close()
sys.exit(code)
elif action == "exec_long":
if len(sys.argv) < 3:
print("用法: python ssh_helper.py exec_long <command>")
sys.exit(1)
cmd = sys.argv[2]
client = get_ssh_client()
out, code = exec_long_cmd(client, cmd)
client.close()
sys.exit(code)
elif action == "upload":
if len(sys.argv) < 4:
print("用法: python ssh_helper.py upload <local_path> <remote_path>")
sys.exit(1)
local_path = sys.argv[2]
remote_path = sys.argv[3]
upload_file(local_path, remote_path)
else:
print(f"未知命令: {action}")
sys.exit(1)
if __name__ == "__main__":
main()
......@@ -403,7 +403,7 @@ class X86EnvUpdate:
self.log(f"找到 {len(existing_dirs)}/{len(all_dirs)} 个有效服务目录")
# 步骤2.2:在测试服务器上打包所有服务
remote_tmp_tar = '/tmp/services_update.tar.gz'
remote_tmp_tar = '/data/services_update.tar.gz'
self._exec_remote_cmd(self.test_ssh, f'rm -f "{remote_tmp_tar}"')
existing_dirs_str = ' '.join(existing_dirs)
......
......@@ -12,11 +12,519 @@
### 系统账号信息
- 超管账号密码:superadmin Ubains@1357
- 管理员账号:admin@aq
- 普通用户账号:user@aq
- 管理员账号:admin@aq Ubains@1357
- 普通用户账号:user@aq Ubains@1357
- 验证码可以用:csba
### 已知接口清单
-
> 以下接口通过前端 JS 静态分析 + 浏览器实时抓取获得,共计 **400+** 个接口端点。
> 接口前缀说明:
> - `/oldmeeting/api/*` — 预定系统旧版后端接口(对应 meetingV2)
> - `/newmeeting/api/*` — 预定系统新版后端接口(对应 meetingV3)
> - `/monitor/api2/api/*` — 运维集控系统接口
> - `/voice/api/*`、`/voice/api2/*` — 讯飞转录系统接口
> - `/api/*` — 前台公共接口(含多个子系统共用)
> - `/exapi/*` — 外部开放接口
> - `/platform/api/*` — 统一平台接口
#### 一、统一平台认证接口(`/platform/api/*`)
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/platform/api/auth/login` | POST | 统一平台密码登录 |
| 2 | `/platform/api/auth/login/email` | POST | 邮箱登录 |
| 3 | `/platform/api/auth/login/sms` | POST | 短信登录 |
| 4 | `/platform/api/auth/logout` | POST | 退出登录 |
| 5 | `/platform/api/code` | GET | 获取图形验证码 |
| 6 | `/platform/api/sso/getCode` | GET | SSO授权码获取 |
| 7 | `/platform/api/sso/login` | POST | SSO登录 |
| 8 | `/platform/api/system/getUserInfo` | GET | 获取用户信息 |
| 9 | `/platform/api/system/changePassword` | POST | 修改密码 |
| 10 | `/platform/api/system/enforceChangePawd` | POST | 强制修改密码 |
| 11 | `/platform/api/system/getLoginAccount` | GET | 获取登录账号信息 |
| 12 | `/platform/api/system/refreshToken` | GET | 刷新Token |
| 13 | `/platform/api/system/logout` | GET | 退出登录 |
| 14 | `/platform/api/system/regPhone` | POST | 手机号注册 |
| 15 | `/platform/api/system/regEmail` | POST | 邮箱注册 |
| 16 | `/platform/api/system/resetPwdByUid` | POST | 通过UID重置密码 |
| 17 | `/platform/api/system/systemConfiguration/sso/getSystemVersions` | GET | 获取系统版本 |
| 18 | `/platform/api/systemConfiguration/globalConfig` | GET | 获取全局配置 |
| 19 | `/platform/api/systemConfiguration/systemConfig` | GET | 获取系统配置 |
| 20 | `/platform/api/permissionGroup/getUserPermissions` | GET | 获取用户权限列表 |
| 21 | `/platform/api/manageUser/editInfo` | POST | 编辑用户信息 |
| 22 | `/platform/api/noticeSettings/getNoticeSettingsByUserId` | GET | 获取通知设置 |
| 23 | `/platform/api/noticeSettings/saveNoticeSettings` | POST | 保存通知设置 |
#### 二、第三方登录接口
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/corp-wechat/scanCode/login` | POST | 企业微信扫码登录 |
| 2 | `/corp-wechat/syncConference` | POST | 企业微信同步会议 |
| 3 | `/dingding/serviceProvider/login` | POST | 钉钉服务商登录 |
| 4 | `/gov-wechat/login` | POST | 政务微信登录 |
| 5 | `/rcaj/syncConference` | POST | RCAJ同步会议 |
#### 三、预定系统 — 会议管理接口(`/oldmeeting/api/*`、`/api/*`)
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/api/message/book` | POST | 预定会议 |
| 2 | `/api/message/update` | POST | 修改会议 |
| 3 | `/api/message/cancel/` | POST | 取消会议 |
| 4 | `/api/message/retry-booking` | POST | 重试预定 |
| 5 | `/api/message/modifyStatus` | POST | 修改会议状态 |
| 6 | `/api/message/approvalStatus` | POST | 审批状态变更 |
| 7 | `/api/message/hasApprovalMeeting` | GET | 查询是否有待审批会议 |
| 8 | `/api/message/getMessageById` | GET | 根据ID获取会议详情 |
| 9 | `/api/message/getMessagePageList` | GET/POST | 分页获取会议列表 |
| 10 | `/api/message/getMessageSchedule` | GET | 获取会议日程 |
| 11 | `/api/message/getMessageSchedulePage` | GET | 分页获取会议日程 |
| 12 | `/api/message/getCurrentAndNextMeeting` | GET | 获取当前和下一个会议 |
| 13 | `/api/message/verifyMeetingResource` | POST | 验证会议资源(冲突检测) |
| 14 | `/api/message/cycleScheduleBook` | POST | 周期预定 |
| 15 | `/api/message/cycleScheduleUpdate` | POST | 修改周期预定 |
| 16 | `/api/message/downloadAttachment` | GET | 下载附件 |
| 17 | `/api/message/uploadFile` | POST | 上传附件 |
| 18 | `/api/message/linkFile` | GET | 关联文件 |
| 19 | `/api/message/topicLinkFile` | GET | 议题关联文件 |
| 20 | `/api/message/topic` | POST | 会议议题操作 |
| 21 | `/api/message/returnTopic` | POST | 退回议题 |
| 22 | `/api/message/updateTopic` | POST | 更新议题 |
| 23 | `/api/message/smcVersion` | GET | 获取SMC版本 |
| 24 | `/api/message/updateShareScreenAuto` | POST | 更新自动共享屏幕 |
| 25 | `/api/message/updateVideoAutoCall` | POST | 更新自动视频呼叫 |
| 26 | `/api/conference/insert` | POST | 新建会议 |
| 27 | `/api/conference/modify` | POST | 修改会议 |
| 28 | `/api/conference/delete` | POST | 删除会议 |
| 29 | `/api/conference/select` | POST | 查询会议 |
| 30 | `/api/conference/selectPage` | POST | 分页查询会议 |
| 31 | `/api/conference/getConferenceByCnum` | GET | 根据会议编号获取会议 |
| 32 | `/api/conference/getConferenceByType` | GET | 按类型获取会议 |
| 33 | `/api/conference/checkTheMeetingByCnum` | GET | 校验会议编号 |
| 34 | `/api/conference/getConferenceAttendeeMight` | GET | 获取可能的参会人 |
| 35 | `/api/conference/simplification` | GET | 简化会议信息 |
| 36 | `/api/conference/collect/add` | POST | 收藏会议 |
| 37 | `/api/conference/collect/remove` | POST | 取消收藏 |
| 38 | `/api/conference/QRcodeUpload` | POST | 二维码上传 |
| 39 | `/api/conference/floorPlanUpload` | POST | 平面图上传 |
| 40 | `/api/conference/floorPlanDelete` | POST | 平面图删除 |
| 41 | `/api/conference/pictureUpload` | POST | 会议图片上传 |
| 42 | `/api/conference/pictureDelete` | POST | 会议图片删除 |
| 43 | `/api/conferenceType/selectPage` | GET | 分页获取会议类型 |
| 44 | `/api/meetingTimingTask/closeFuture` | POST | 关闭未来会议定时任务 |
#### 四、预定系统 — 用户与组织接口
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/api/manageUser/getManagerPage` | POST | 分页获取用户列表 |
| 2 | `/api/manageUser/getManagerPageForBook` | POST | 预定页面获取用户列表 |
| 3 | `/api/manageUser/getManagerAndUnitPageForBook` | POST | 预定页面获取用户和单位 |
| 4 | `/api/manageUser/getCompanyUser` | GET | 获取公司用户 |
| 5 | `/api/manageUser/getUsersByDepartmentId` | GET | 按部门获取用户 |
| 6 | `/api/manageUser/listManageUserPageBySearcher` | POST | 搜索用户列表 |
| 7 | `/api/manageUser/searchUserList` | POST | 搜索用户 |
| 8 | `/api/manageUser/editInfo` | POST | 编辑用户信息 |
| 9 | `/api/manageUser/modifyStatus` | POST | 修改用户状态 |
| 10 | `/api/manageUser/signIn/export` | GET | 签到导出 |
| 11 | `/api/manageUser/signIn/statistics` | GET | 签到统计 |
| 12 | `/api/manageUser/judgePossessor` | GET | 判断是否拥有者 |
| 13 | `/api/department/getMoreLevelsDepartment` | POST | 获取多级部门 |
| 14 | `/api/department/getFirstChildDepartments` | POST | 获取一级子部门 |
| 15 | `/api/department/getDeptAndUnitNameList` | GET | 获取部门和单位名称列表 |
| 16 | `/api/position/select` | POST | 查询职位 |
| 17 | `/api/role/query/` | POST | 查询角色 |
| 18 | `/api/permissionGroup/add` | POST | 添加权限组 |
| 19 | `/api/permissionGroup/update` | POST | 更新权限组 |
| 20 | `/api/permissionGroup/delete` | POST | 删除权限组 |
| 21 | `/api/permissionGroup/getPage` | GET | 分页获取权限组 |
| 22 | `/api/permissionGroup/getDetail` | GET | 获取权限组详情 |
| 23 | `/api/permissionGroup/getAllPermissions` | GET | 获取所有权限 |
| 24 | `/api/permissionGroup/getRelations` | GET | 获取权限关联 |
| 25 | `/api/permissionGroup/bindRelation` | POST | 绑定权限关联 |
| 26 | `/api/permissionGroup/getUserPermissions` | GET | 获取用户权限 |
| 27 | `/api/userCollection/saveUserCollection` | POST | 保存用户收藏 |
| 28 | `/api/userCollection/removeUserCollection` | POST | 移除用户收藏 |
| 29 | `/api/userCollection/listUserCollectionPage` | GET | 用户收藏列表 |
| 30 | `/api/userCollection/updateUserCollection` | POST | 更新用户收藏 |
#### 五、预定系统 — 区域与会议室接口
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/api/area/select` | POST | 查询区域 |
| 2 | `/api/function/select` | POST | 查询会议室功能 |
| 3 | `/api/model/getModelById` | GET | 根据ID获取模式 |
| 4 | `/api/model/selectPage` | GET | 分页获取模式 |
| 5 | `/api/splitscreen/getSplitScreenById` | GET | 根据ID获取分屏 |
| 6 | `/api/splitscreen/selectPage` | GET | 分页获取分屏列表 |
| 7 | `/api/seat/query/` | GET | 查询座位 |
| 8 | `/api/seatarrange/listPage` | GET | 分页获取座位安排 |
| 9 | `/api/officeScreenTemplate/selectPage` | GET | 分页获取门口屏模板 |
| 10 | `/api/manageOffice/selectPage` | GET | 分页获取办公室 |
| 11 | `/api/demand/getDemandByPage` | GET | 分页获取增值服务 |
| 12 | `/api/demandCat/getDemandCatTree` | GET | 获取增值服务分类树 |
#### 六、预定系统 — 统计接口
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/api/stats/bookMeeting/getConferenceStatistical` | GET | 会议统计数据 |
| 2 | `/api/stats/bookMeeting/getDepartMentStatistical` | GET | 部门统计数据 |
| 3 | `/api/stats/conference/export` | GET | 导出会议统计 |
| 4 | `/api/stats/conference/getConferenceUseRank` | GET | 会议室使用排名 |
| 5 | `/api/stats/conference/getConferenceUseRankGf` | GET | 会议室使用排名(官府) |
| 6 | `/api/stats/meeting/meetingToday` | GET | 今日会议统计 |
| 7 | `/api/stats/meeting/attendeesToday` | GET | 今日参会人统计 |
| 8 | `/api/stats/meeting/export` | GET | 导出会议统计 |
| 9 | `/api/stats/meeting/getMeetingUseRank` | GET | 会议使用排名 |
| 10 | `/api/stats/meeting/getMeetingUseRankGf` | GET | 会议使用排名(官府) |
| 11 | `/api/stats/meeting/getMeetingSignUserRank` | GET | 签到用户排名 |
| 12 | `/api/stats/meeting/getMeetingMCUUseRank` | GET | MCU使用排名 |
| 13 | `/api/stats/meeting/getCloudVideoUseRank` | GET | 云视频使用排名 |
| 14 | `/api/stats/meeting/getMCUResourceMonitoring` | GET | MCU资源监控 |
| 15 | `/api/stats/meeting/getVideoResourceMonitoring` | GET | 视频资源监控 |
| 16 | `/api/stats/meeting/resourceStatisticsToday` | GET | 今日资源统计 |
| 17 | `/api/stats/notification/getMeetingNotificationSending` | GET | 会议通知发送统计 |
| 18 | `/api/statistics/area` | GET | 区域统计 |
| 19 | `/api/statistics/areaById` | GET | 按区域ID统计 |
| 20 | `/api/statistics/department` | GET | 部门统计 |
| 21 | `/api/statistics/departmentById` | GET | 按部门ID统计 |
| 22 | `/api/statistics/history` | GET | 历史统计 |
| 23 | `/api/statistics/information` | GET | 信息统计 |
| 24 | `/api/statistics/malfunction` | GET | 故障统计 |
| 25 | `/api/statistics/servers` | GET | 服务器统计 |
| 26 | `/api/statistics/workOrder` | GET | 工单统计 |
| 27 | `/api/statistics/conferenceIsLeisure` | GET | 会议室空闲统计 |
| 28 | `/api/statistics/currentAlarms` | GET | 当前告警统计 |
| 29 | `/api/statistics/assetsRepairMaintenance` | GET | 资产维修维护统计 |
#### 七、预定系统 — 通知与签到接口
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/api/notification/listNotificationPage` | GET/POST | 分页获取通知列表 |
| 2 | `/api/notification/getNotificationByNoticeId` | GET | 根据通知ID获取通知 |
| 3 | `/api/notification/updateNotification` | POST | 更新通知 |
| 4 | `/api/notification/removeNotificationByIds` | POST | 批量删除通知 |
| 5 | `/api/notification/updateNoticeAttend` | POST | 更新通知参会人 |
| 6 | `/api/signs/getSigns` | GET | 获取签到记录 |
| 7 | `/api/signs/signsAttend` | POST | 签到 |
| 8 | `/api/signs/forParticipants` | GET | 参会人签到 |
| 9 | `/api/participant/export` | GET | 导出参会人 |
| 10 | `/api/participant/exportTemplate` | GET | 导出参会人模板 |
| 11 | `/api/participant/importSigns` | POST | 导入签到记录 |
| 12 | `/api/outsideParticipant/insert` | POST | 添加外部参会人 |
| 13 | `/api/outsideParticipant/select` | GET | 查询外部参会人 |
#### 八、预定系统 — 审批流程接口(v2.0)
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/api/v2.0/approval/selectPage` | GET/POST | 分页查询审批 |
| 2 | `/api/v2.0/approval/getApproval` | GET | 获取审批详情 |
| 3 | `/api/v2.0/approval/delete` | POST | 删除审批 |
| 4 | `/api/v2.0/approval/carbonCopySelect` | GET | 抄送选择 |
| 5 | `/api/v2.0/approval/v2/template/list` | GET | 审批模板列表 |
| 6 | `/api/v2.0/approval/v2/template/create` | POST | 创建审批模板 |
| 7 | `/api/v2.0/approval/v2/template/update` | POST | 更新审批模板 |
| 8 | `/api/v2.0/approval/v2/template/delete/` | POST | 删除审批模板 |
| 9 | `/api/v2.0/approval/v2/template/detail/` | GET | 审批模板详情 |
| 10 | `/api/v2.0/approvalTask/selectPage` | GET | 分页查询审批任务 |
| 11 | `/api/v2.0/approvalTask/select` | GET | 查询审批任务 |
| 12 | `/api/v2.0/approvalTask/completeTask` | POST | 完成审批任务 |
| 13 | `/api/v2.0/approvalTask/meetingStatus` | GET | 会议审批状态 |
#### 九、预定系统 — 工作流接口
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/api/workflow/process/todoList` | GET | 待办列表 |
| 2 | `/api/workflow/process/ownList` | GET | 我发起的列表 |
| 3 | `/api/workflow/process/finishedList` | GET | 已完成列表 |
| 4 | `/api/workflow/process/copyList` | GET | 抄送列表 |
| 5 | `/api/workflow/process/detail` | GET | 流程详情 |
| 6 | `/api/workflow/task/complete` | POST | 完成任务 |
| 7 | `/api/workflow/task/reject` | POST | 驳回任务 |
| 8 | `/api/workflow/task/transfer` | POST | 转办任务 |
#### 十、预定系统 — 会议控制与视频会议接口
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/api/smcConferenceCtrl/conferenceControl` | POST | 会议控制 |
| 2 | `/api/smcConferenceCtrl/endConference` | POST | 结束会议 |
| 3 | `/api/smcConferenceCtrl/extendConference` | POST | 延长会议 |
| 4 | `/api/smcConferenceCtrl/mute` | POST | 静音 |
| 5 | `/api/smcConferenceCtrl/videoMute` | POST | 视频静音 |
| 6 | `/api/smcConferenceCtrl/quiet` | POST | 安静模式 |
| 7 | `/api/smcConferenceCtrl/multiPic` | POST | 多画面 |
| 8 | `/api/smcConferenceCtrl/online` | GET | 在线状态 |
| 9 | `/api/smcConferenceCtrl/addAttendee` | POST | 添加参会人 |
| 10 | `/api/smcConferenceCtrl/addParticipant` | POST | 添加与会方 |
| 11 | `/api/smcConferenceCtrl/deleteParticipant` | POST | 删除与会方 |
| 12 | `/api/smcConferenceCtrl/getDetailConference` | GET | 获取会议详情 |
| 13 | `/api/smcConferenceCtrl/getMeetingRoomInfo` | GET | 获取会议室信息 |
| 14 | `/api/smcConferenceCtrl/getRooms` | GET | 获取会议室列表 |
| 15 | `/api/smcConferenceCtrl/queryVenueList` | GET | 查询会场列表 |
| 16 | `/api/smcConferenceCtrl/venueControl` | POST | 会场控制 |
| 17 | `/api/smcConferenceCtrl/deleteWaitingRoom` | POST | 删除等候室 |
| 18 | `/api/smcConferenceCtrl/moveIntoRoom` | POST | 移入会议室 |
| 19 | `/api/smcConferenceCtrl/moveIntoWaitingRoom` | POST | 移入等候室 |
| 20 | `/api/smcConferenceCtrl/queryWaitingRoomList` | GET | 查询等候室列表 |
| 21 | `/api/smcConferenceCtrl/getConditions` | GET | 获取条件列表 |
| 22 | `/api/meetingCtrl/routeAndCall` | POST | 路由呼叫 |
| 23 | `/api/meetingRelease/release/export` | GET | 导出发布记录 |
| 24 | `/api/meetingRelease/release/statistics` | GET | 发布统计 |
| 25 | `/api/meeting/evaluation/add` | POST | 添加会议评价 |
| 26 | `/api/meeting/evaluation/select` | GET | 查询会议评价 |
| 27 | `/api/meeting/evaluation/export` | GET | 导出会议评价 |
| 28 | `/api/meeting/evaluation/statistics` | GET | 会议评价统计 |
| 29 | `/api/meeting/safeguard/add` | POST | 添加会议保障 |
| 30 | `/api/meeting/safeguard/select` | GET | 查询会议保障 |
| 31 | `/api/staffCoordination/addStaffCoordination` | POST | 添加人员协调 |
| 32 | `/api/staffCoordination/updateStaffCoordination` | POST | 更新人员协调 |
| 33 | `/api/staffCoordination/deleteStaffCoordination` | POST | 删除人员协调 |
| 34 | `/api/staffCoordination/selectPage` | GET | 分页查询人员协调 |
| 35 | `/api/staffCoordination/exportStaffCoordination` | GET | 导出人员协调 |
| 36 | `/api/staffCoordination/pictureUpload` | POST | 人员协调图片上传 |
| 37 | `/api/staffWorkOrder/meetingGuarantee` | POST | 会议保障工单 |
| 38 | `/api/staffWorkOrder/selectPage` | GET | 分页查询工单 |
#### 十一、视频会议第三方集成接口
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/xylink/Control/getMemberMeetingStatus` | GET | 获取小鱼会员会议状态 |
| 2 | `/xylink/Control/invite` | POST | 小鱼邀请 |
| 3 | `/xylink/Control/mute` | POST | 小鱼静音 |
| 4 | `/xylink/Control/muteAll` | POST | 小鱼全体静音 |
| 5 | `/xylink/Control/unMute` | POST | 小鱼取消静音 |
| 6 | `/xylink/Control/pageEnterpriseDataUser` | GET | 小鱼企业用户列表 |
| 7 | `/xylink/Control/startDeviceMultiImage` | POST | 小鱼多画面 |
| 8 | `/smc/proxy/smc3` | POST | SMC3代理 |
| 9 | `/smc/smcConference/getOneConference` | GET | 获取SMC会议 |
| 10 | `/smc/management/queryMultiScreen` | GET | 查询多屏 |
| 11 | `/smc/management/videoSourceEx` | GET | 视频源扩展 |
| 12 | `/tencent/meetings` | GET | 腾讯会议列表 |
| 13 | `/tencent/tencentMeetInfo` | GET | 腾讯会议详情 |
| 14 | `/tencent/tencentUserPage` | GET | 腾讯用户列表 |
| 15 | `/tencent/inviteTxUser` | POST | 腾讯邀请用户 |
| 16 | `/tencent/sendTxMessage` | POST | 腾讯发送消息 |
| 17 | `/tencent/getRealTimeParticipants` | GET | 腾讯实时参会人 |
| 18 | `/tencent/meeting/getmeetingRoomInfo` | GET | 腾讯会议室信息 |
| 19 | `/tencent/real-control/meetings/` | GET | 腾讯实时控制会议 |
| 20 | `/tencent/real-control/rollCall` | POST | 腾讯点名 |
| 21 | `/tencent/real-control/getLayoutTemplates` | GET | 腾讯布局模板 |
| 22 | `/dd/conference/getVideoConfInfoById` | GET | 钉钉视频会议信息 |
| 23 | `/dd/conference/getVideoConfMember` | GET | 钉钉视频会议成员 |
| 24 | `/dd/conference/inviteDingDingUser` | POST | 钉钉邀请用户 |
| 25 | `/dd/dingDing/getDept` | GET | 钉钉获取部门 |
| 26 | `/dd/dingDing/getDeptUsers` | GET | 钉钉获取部门用户 |
| 27 | `/dd/dingDing/getNextDept` | GET | 钉钉获取子部门 |
| 28 | `/cloudlink/cloudPortal/control/getToken` | GET | 华为云获取Token |
| 29 | `/cloudlink/cloudPortal/control/realTimeInfo` | GET | 华为云实时信息 |
| 30 | `/cloudlink/cloudPortal/control/hangUp` | POST | 华为云挂断 |
| 31 | `/cloudlink/cloudPortal/control/mute` | POST | 华为云静音 |
| 32 | `/cloudlink/cloudPortal/control/broadcast` | POST | 华为云广播 |
| 33 | `/cloudlink/cloudPortal/control/stopConfer` | POST | 华为云结束会议 |
| 34 | `/cloudlink/cloudPortal/control/applyHost` | POST | 华为云申请主持 |
| 35 | `/cloudlink/cloudPortal/control/saveMeetingControlInfo` | POST | 华为云保存控制信息 |
| 36 | `/cloudlink/cloudPortal/device/getPageDevice` | GET | 华为云设备列表 |
| 37 | `/cloudlink/cloudPortal/user/getPageUser` | GET | 华为云用户列表 |
| 38 | `/cloudlink/cloudPortal/conf/info` | GET | 华为云会议信息 |
| 39 | `/polycom/meeting/getMeetingInfo` | GET | 宝利通会议信息 |
| 40 | `/polycom/meeting/getAddressBook` | GET | 宝利通地址簿 |
| 41 | `/polycom/meeting/addAddressBook` | POST | 宝利通添加地址簿 |
| 42 | `/polycom/meeting/deleteAddressBook` | POST | 宝利通删除地址簿 |
| 43 | `/polycom/meeting/setLectureMode` | POST | 宝利通设置讲座模式 |
| 44 | `/polycom/meeting/control/terminateConf` | POST | 宝利通结束会议 |
| 45 | `/polycom/meeting/control/rollCall` | POST | 宝利通点名 |
| 46 | `/polycom/meeting/control/startRecording` | POST | 宝利通开始录制 |
| 47 | `/polycom/meeting/control/stopRecording` | POST | 宝利通停止录制 |
| 48 | `/polycom/meeting/control/setExclusiveContent` | POST | 宝利通设置专属内容 |
| 49 | `/polycom/meeting/control/setLeader` | POST | 宝利通设置主席 |
#### 十二、运维集控系统接口(`/monitor/api2/api/*`)
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/monitor/api2/api/serverinfo/` | POST | 服务器信息 |
| 2 | `/monitor/api2/api/company/` | GET | 公司信息 |
| 3 | `/monitor/api2/api/companytype/` | GET | 公司类型 |
| 4 | `/monitor/api2/api/companyauth/` | GET | 公司授权 |
| 5 | `/monitor/api2/api/userlogin/` | GET | 用户登录 |
| 6 | `/monitor/api2/api/roommaster/` | GET | 会议室主机列表 |
| 7 | `/monitor/api2/api/roommodel/` | GET | 会议室模式 |
| 8 | `/monitor/api2/api/roomgroup/` | GET | 会议室分组 |
| 9 | `/monitor/api2/api/roomtype/` | GET | 会议室类型 |
| 10 | `/monitor/api2/api/roomfunction/` | GET | 会议室功能 |
| 11 | `/monitor/api2/api/roomimage/` | GET | 会议室图片 |
| 12 | `/monitor/api2/api/roomuser/` | GET | 会议室用户 |
| 13 | `/monitor/api2/api/roommail/` | GET | 会议室邮件 |
| 14 | `/monitor/api2/api/roommessage/` | GET | 会议室消息 |
| 15 | `/monitor/api2/api/roommonitor/` | GET | 会议室监控 |
| 16 | `/monitor/api2/api/roompower/` | GET | 会议室电源 |
| 17 | `/monitor/api2/api/roomdevice/` | GET | 会议室设备 |
| 18 | `/monitor/api2/api/roomfile/` | GET | 会议室文件 |
| 19 | `/monitor/api2/api/roomweather/` | GET | 会议室天气 |
| 20 | `/monitor/api2/api/roomganged/` | GET | 会议室联动 |
| 21 | `/monitor/api2/api/gandgedlist/` | GET | 联动列表 |
| 22 | `/monitor/api2/api/devicetype/` | GET | 设备类型 |
| 23 | `/monitor/api2/api/devicemamange/` | GET | 设备管理 |
| 24 | `/monitor/api2/api/deviceasset/` | GET | 设备资产 |
| 25 | `/monitor/api2/api/devicealarm/` | GET | 设备告警 |
| 26 | `/monitor/api2/api/devicehistory/` | GET | 设备历史 |
| 27 | `/monitor/api2/api/devicemaintain/` | GET | 设备维护 |
| 28 | `/monitor/api2/api/deviceprotocol/` | GET | 设备协议 |
| 29 | `/monitor/api2/api/devicefunctiontype/` | GET | 设备功能类型 |
| 30 | `/monitor/api2/api/datatypelist/` | GET | 数据类型列表 |
| 31 | `/monitor/api2/api/systempower/` | GET | 系统电源 |
| 32 | `/monitor/api2/api/systemaudio/` | GET | 系统音频 |
| 33 | `/monitor/api2/api/systemvideo/` | GET | 系统视频 |
| 34 | `/monitor/api2/api/systemcontrol/` | GET | 系统控制 |
| 35 | `/monitor/api2/api/systemnetwork/` | GET | 系统网络 |
| 36 | `/monitor/api2/api/serverlog/` | GET | 服务器日志 |
| 37 | `/monitor/api2/api/servermonitor/` | GET | 服务器监控 |
| 38 | `/monitor/api2/api/rolemanage/` | GET | 角色管理 |
| 39 | `/monitor/api2/api/remotecontrol/` | GET | 远程控制 |
| 40 | `/monitor/api2/api/screencontrol/` | GET | 屏幕控制 |
| 41 | `/monitor/api2/api/mastercontrol/` | GET | 主控 |
| 42 | `/monitor/api2/api/controlport/` | GET | 控制端口 |
| 43 | `/monitor/api2/api/unitport/` | GET | 单元端口 |
| 44 | `/monitor/api2/api/protocoltype/` | GET | 协议类型 |
| 45 | `/monitor/api2/api/sendtype/` | GET | 发送类型 |
| 46 | `/monitor/api2/api/messagesetting/` | GET | 消息设置 |
| 47 | `/monitor/api2/api/customsetting/` | GET | 自定义设置 |
| 48 | `/monitor/api2/api/publishinfo/` | POST | 发布信息 |
| 49 | `/monitor/api2/api/alarmststus/` | GET | 告警状态 |
| 50 | `/monitor/api2/api/firmware/` | GET | 固件 |
| 51 | `/monitor/api2/api/firmwaretype/` | GET | 固件类型 |
| 52 | `/monitor/api2/api/firmwaremodel/` | GET | 固件型号 |
| 53 | `/monitor/api2/api/appfile/` | GET | 应用文件 |
| 54 | `/monitor/api2/api/appinstall/` | GET | 应用安装 |
| 55 | `/monitor/api2/api/downloadfile/` | GET | 下载文件 |
| 56 | `/monitor/api2/api/uploadupdatefile/` | POST | 上传更新文件 |
| 57 | `/monitor/api2/api/exportexcel/` | GET | 导出Excel |
| 58 | `/monitor/api2/api/insception/` | GET | 内省信息 |
#### 十三、讯飞转录系统接口(`/voice/api/*`)
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/voice/api/iflytek/userlogin` | POST | 讯飞系统登录 |
| 2 | `/voice/api/iflytek/company` | GET | 讯飞公司配置 |
| 3 | `/voice/api/iflytek/roommaster` | GET | 讯飞会议室列表 |
| 4 | `/voice/api/iflytek/hotwordgroup` | GET | 热词分组 |
| 5 | `/voice/api/iflytek/voiceprintManage` | POST | 声纹管理 |
| 6 | `/voice/api/iflytek/summaryTemplate` | GET | 纪要模板 |
| 7 | `/voice/api/iflytek/minutesTemplate` | GET | 会议记录模板 |
| 8 | `/voice/api/iflytek/mailmanage` | GET | 邮局配置 |
| 9 | `/voice/api/iflytek/UbainsGetSummary` | GET | 获取摘要 |
| 10 | `/voice/api/iflytek/UserSyncFree` | GET | 用户同步 |
| 11 | `/voice/api2/hotWord/getGroupList` | GET | 获取热词分组列表 |
| 12 | `/voice/api2/word/wordList` | GET | 获取词条列表 |
#### 十四、外部接口(`/exapi/*`)
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/exapi/system/inner/getUserInfo` | GET | 外部获取用户信息 |
| 2 | `/api/system/inner/getUserInfo` | GET | 内部获取用户信息 |
| 3 | `/api/system/inner/getVerifyCode` | GET | 内部获取验证码 |
| 4 | `/api/system/inner/login` | POST | 内部登录 |
#### 十五、维护平台接口
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/ubains/server/getParamsConfig` | GET | 获取服务器参数配置 |
| 2 | `/ubains/server/setParamsConfig` | POST | 设置服务器参数配置 |
| 3 | `/system/backSqlFiles` | GET | 备份SQL文件 |
| 4 | `/system/dataBackup` | POST | 数据备份 |
| 5 | `/system/downLincenceFile` | GET | 下载授权文件 |
| 6 | `/system/downloadLogs` | GET | 下载日志 |
| 7 | `/system/exportDeployView` | GET | 导出部署视图 |
| 8 | `/system/exportProperties` | GET | 导出配置 |
| 9 | `/system/exportServiceDetect` | GET | 导出服务检测 |
| 10 | `/system/restartCmdb` | POST | 重启CMDB |
| 11 | `/system/setOtherInfo` | POST | 设置其他信息 |
| 12 | `/system/uploadLincenceFile` | POST | 上传授权文件 |
#### 十六、公共/其他接口
| 序号 | 接口路径 | 方法 | 说明 |
|------|---------|------|------|
| 1 | `/api/company/getSensitiveConfig` | GET | 获取敏感配置 |
| 2 | `/api/company/getSystemConfigData` | GET | 获取系统配置数据 |
| 3 | `/api/company/getCompanyPageList` | GET | 分页获取公司列表 |
| 4 | `/api/company/getCompanyLisy` | GET | 获取公司列表 |
| 5 | `/api/configuration/getConfiguration` | GET | 获取配置 |
| 6 | `/api/systemConfiguration/globalConfig` | GET | 全局配置 |
| 7 | `/api/systemConfiguration/systemConfig` | GET | 系统配置 |
| 8 | `/api/auth/accesstoken` | POST | 获取AccessToken |
| 9 | `/api/api-android/token/getTokenInfoByToken` | GET | 通过Token获取信息 |
| 10 | `/api/token/selectTokenList` | GET | Token列表 |
| 11 | `/api/beijingSpecial/logout` | POST | 北京专项退出 |
| 12 | `/api/operlog/create` | POST | 创建操作日志 |
| 13 | `/api/file/updatingFiles` | POST | 更新文件 |
| 14 | `/api/template/getTemplate` | GET | 获取模板 |
| 15 | `/api/template/getTemplatePage` | GET | 分页获取模板 |
| 16 | `/api/template/insertByFkeyId` | POST | 插入模板 |
| 17 | `/api/template/update` | POST | 更新模板 |
| 18 | `/api/template/delete` | POST | 删除模板 |
| 19 | `/api/template/verifyName` | GET | 验证模板名称 |
| 20 | `/api/period/add` | POST | 添加时段 |
| 21 | `/api/period/getPeriod` | GET | 获取时段 |
| 22 | `/api/topic/getTopicList` | GET | 获取议题列表 |
| 23 | `/api/meet/vote/allVote` | GET | 所有投票 |
| 24 | `/api/tableCard/getTableCardSystemInfo` | GET | 桌牌系统信息 |
| 25 | `/api/global/systemModel` | GET | 全局系统模式 |
| 26 | `/api/androidPanel/batchControl` | POST | 安卓面板批量控制 |
| 27 | `/api/androidPanel/batchScreenSetting` | POST | 安卓面板批量屏幕设置 |
| 28 | `/api/androidPanel/getBackendSetting` | GET | 安卓面板后台设置 |
| 29 | `/api/androidPanel/updateBackendSetting` | POST | 更新安卓面板设置 |
| 30 | `/api/androidPanel/getAvailableTokenCountByConference` | GET | 获取可用Token数量 |
| 31 | `/api/androidPanel/pack/getPageList` | GET | 安卓面板包分页列表 |
| 32 | `/api/androidPanel/pack/batchUpdateCache` | POST | 安卓面板批量更新缓存 |
| 33 | `/api/androidPanel/quickBind` | POST | 安卓面板快速绑定 |
| 34 | `/api/device/basis/selectPage` | POST | 设备基础分页查询 |
| 35 | `/api/system/alarm/getTemplatePage` | GET | 告警模板分页 |
| 36 | `/api/system/alarm/update` | POST | 更新告警 |
| 37 | `/api/system/user/getInfo` | GET | 获取用户信息 |
| 38 | `/api/third/sync/getDepartmentAndUser` | GET | 第三方同步部门和用户 |
| 39 | `/meeting/message/meetingQrcode` | GET | 会议二维码 |
| 40 | `/meeting/ExhibitionHall` | GET | 展厅信息 |
| 41 | `/meeting/Guide` | GET | 会议指引 |
| 42 | `/meeting/signType` | GET | 签到类型 |
| 43 | `/meeting/WelinkFileUpload` | POST | WeLink文件上传 |
| 44 | `/api/smcAddressbook/getAllOrg` | GET | SMC地址簿所有组织 |
| 45 | `/api/smcAddressbook/getAreas` | GET | SMC地址簿区域 |
| 46 | `/api/smcAddressbook/getNextOrg` | GET | SMC地址簿下级组织 |
| 47 | `/api/smcAddressbook/getOrg` | GET | SMC地址簿组织 |
| 48 | `/api/smcAddressbook/getRoomsConditions` | GET | SMC地址簿会议室条件 |
| 49 | `/api/smcAddressbook/getUser` | GET | SMC地址簿用户 |
| 50 | `/api/smcAddressbook/getUsersConditions` | GET | SMC地址簿用户条件 |
| 51 | `/api/huaweiTerminal/controlTerminal` | POST | 华为终端控制 |
| 52 | `/api/huaweiTerminal/getTerminalById` | GET | 根据ID获取华为终端 |
| 53 | `/api/cdthApi/noLogin/getMeetingInfo` | GET | 无登录获取会议信息 |
| 54 | `/api/cdthApi/noLogin/updateAttendWay` | POST | 无登录更新参会方式 |
| 55 | `/api/asset/information/page` | GET | 资产信息分页 |
| 56 | `/api/asset/information/create` | POST | 创建资产 |
| 57 | `/api/asset/information/update` | POST | 更新资产 |
| 58 | `/api/asset/information/delete` | POST | 删除资产 |
| 59 | `/api/asset/information/import` | POST | 导入资产 |
| 60 | `/api/asset/information/exportTemplate` | GET | 导出资产模板 |
| 61 | `/api/asset/information/recover` | POST | 恢复资产 |
| 62 | `/api/asset/information/scrap` | POST | 报废资产 |
| 63 | `/api/asset/information/powerNum` | GET | 资产电源数 |
| 64 | `/api/asset/repairs/page` | GET | 维修记录分页 |
| 65 | `/api/asset/repairs/add` | POST | 添加维修 |
| 66 | `/api/asset/repairs/update` | POST | 更新维修 |
| 67 | `/api/asset/repairs/delete` | POST | 删除维修 |
| 68 | `/api/material/getByPage` | POST | 素材分页列表 |
### 相关资料
- 华为红线相关资料:[Z:\deploy\18其它系统\安全测试\01安全测试资料]
......
# 接口安全测试_计划执行文档
## 执行概述
### 项目背景
对新统一平台(智能会议预定平台)进行全面的接口安全测试,覆盖预定系统、运维集控系统、讯飞转录系统、维护平台等全部子系统,共计 **400+** 个 API 接口端点。
### 目标
- 按 OWASP API Security Top 10 标准逐项测试全部接口
- 发现并记录安全漏洞,按风险等级(高危/中危/低危/信息类)分类
- 输出自动化安全测试脚本,支持可重复执行
- 生成完整的安全测试报告
### 关键参数
| 参数 | 值 |
|------|-----|
| 目标服务器 | 192.168.5.44(X86架构-欧拉) |
| 系统地址 | https://192.168.5.44/ |
| 超管账号 | superadmin / Ubains@1357 |
| 管理员账号 | admin@aq / Ubains@1357 |
| 普通用户账号 | user@aq / Ubains@1357 |
| 固定验证码 | csba |
| 认证方式 | JWT / accessToken |
| 代码路径 | AuxiliaryTool/ScriptTool/ApiSecurityTest/ |
| 报告路径 | AuxiliaryTool/ScriptTool/ApiSecurityTest/reports/ |
### 执行优先级
1. **P0 — 立即执行**:高危攻击面(认证绕过、越权、注入)
2. **P1 — 优先执行**:中等风险(信息泄露、配置错误)
3. **P2 — 常规执行**:低风险项(信息收集、合规检查)
---
## 任务分解与实施计划
### 阶段一:基础框架搭建(预计 1 天)
#### 任务 1.1:创建项目目录结构与配置文件
- [ ] 创建 `AuxiliaryTool/ScriptTool/ApiSecurityTest/` 目录结构
- [ ] 创建 `config.yaml` 配置文件(目标地址、账号密码、接口路径等)
- [ ] 创建 `reports/` 报告输出目录
- [ ] 创建 `utils/` 公共工具目录
**配置文件结构:**
```
ApiSecurityTest/
├── config.yaml # 全局配置
├── run_all.py # 主入口:一键执行全部测试
├── reports/ # 测试报告输出
├── utils/
│ ├── __init__.py
│ ├── http_client.py # HTTP 请求封装(Token 管理、签名生成)
│ ├── auth_helper.py # 认证辅助(登录、Token 获取/刷新)
│ ├── report_generator.py # 报告生成器
│ └── logger.py # 日志工具
├── tests/
│ ├── __init__.py
│ ├── test_api01_auth.py # API1: 对象级别授权失效
│ ├── test_api02_authentication.py # API2: 身份认证失效
│ ├── test_api03_object_attr.py # API3: 对象属性级别授权失效
│ ├── test_api04_rate_limit.py # API4: 资源消耗不受限
│ ├── test_api05_func_auth.py # API5: 功能级别授权失效
│ ├── test_api06_business_flow.py # API6: 无限制访问敏感业务流
│ ├── test_api07_ssrf.py # API7: 服务器端请求伪造
│ ├── test_api08_misconfig.py # API8: 安全配置错误
│ ├── test_api09_inventory.py # API9: 库存管理不当
│ └── test_api10_third_party.py # API10: 不安全的第三方API集成
└── requirements.txt
```
**config.yaml 配置内容:**
```yaml
target:
base_url: "https://192.168.5.44"
server_ip: "192.168.5.44"
accounts:
superadmin:
username: "superadmin"
password: "Ubains@1357"
admin:
username: "admin@aq"
password: "Ubains@1357"
user:
username: "user@aq"
password: "Ubains@1357"
captcha: "csba"
auth:
token_type: "accessToken"
mechanism: "JWT"
login_path: "/platform/api/auth/login"
token_header: "accessToken"
company_number: "CN-SZ-00-0201"
company_secret: "57d00f9f-020f-5f1f-b788-55fae843bceb"
api_prefixes:
meeting_old: "/oldmeeting/api/"
meeting_new: "/newmeeting/api/"
meeting_public: "/api/"
monitor: "/monitor/api2/api/"
voice: "/voice/api/"
voice_v2: "/voice/api2/"
exapi: "/exapi/"
platform: "/platform/api/"
maintenance: "/system/"
ubains: "/ubains/server/"
report:
output_dir: "reports/"
format: "markdown"
```
#### 任务 1.2:HTTP 请求客户端封装
- [ ] 实现 `http_client.py`:封装 requests 库,自动管理 Token
- [ ] 实现 Token 自动获取与刷新机制
- [ ] 实现请求签名生成(x-random、x-timestamp、x-sign、randomcode 头部)
- [ ] 实现请求/响应日志记录
- [ ] 实现密码加密(SHA256)逻辑
**关键实现点:**
- 登录时密码需 SHA256 加密后传输(`84ef2b3b9e6eea45...`
- 登录请求需携带 `x-random``x-timestamp``x-sign``randomcode` 请求头
- 登录需传入 `uuid`(从验证码接口获取)
- 后续请求通过 `accessToken` 头部传递 Token
#### 任务 1.3:认证辅助模块
- [ ] 实现 `auth_helper.py`:三级账号登录(超管/管理员/普通用户)
- [ ] 实现 Token 缓存与自动续期
- [ ] 实现多系统登录(统一平台、运维集控、讯飞转录)
#### 任务 1.4:报告生成器
- [ ] 实现 `report_generator.py`:Markdown 格式报告生成
- [ ] 漏洞按风险等级分类(高危/中危/低危/信息类)
- [ ] 支持漏洞复现步骤记录
- [ ] 支持修复建议输出
---
### 阶段二:OWASP API Security Top 10 测试(预计 3-4 天)
#### 任务 2.1:API1 — 对象级别授权失效(水平越权)
- [ ] 编写 `test_api01_auth.py` 测试模块
- [ ] 测试用例 2.1.1:用户 A 的 Token 访问用户 B 的会议详情(`/api/message/getMessageById`
- [ ] 测试用例 2.1.2:用户 A 修改/取消用户 B 的会议(`/api/message/update``/api/message/cancel/`
- [ ] 测试用例 2.1.3:用户 A 访问其他用户的收藏列表(`/api/userCollection/listUserCollectionPage`
- [ ] 测试用例 2.1.4:普通用户越权操作其他公司会议室(`/api/conference/insert`,修改 companyNumber)
- [ ] 测试用例 2.1.5:运维集控用户 A 控制/查看用户 B 的设备(`/monitor/api2/api/roommaster/`
- [ ] 测试用例 2.1.6:跨公司访问预定系统数据(修改 companyNumber 参数)
- [ ] 测试用例 2.1.7:通过遍历 ID 访问其他会议的签到记录(`/api/signs/getSigns`
- [ ] 测试用例 2.1.8:通过遍历 ID 访问其他用户的通知(`/api/notification/getNotificationByNoticeId`
#### 任务 2.2:API2 — 身份认证失效
- [ ] 编写 `test_api02_authentication.py` 测试模块
- [ ] 测试用例 2.2.1:无 Token 访问需认证接口(验证返回 `无效token` 或 401)
- [ ] 测试用例 2.2.2:伪造/篡改 Token 访问接口
- [ ] 测试用例 2.2.3:过期 Token 是否仍可使用
- [ ] 测试用例 2.2.4:Token 刷新机制是否安全(`/api/system/refreshToken`
- [ ] 测试用例 2.2.5:暴力破解登录(`/platform/api/auth/login`,尝试弱密码)
- [ ] 测试用例 2.2.6:验证码固定为 `csba` 的安全风险记录
- [ ] 测试用例 2.2.7:会话固定攻击(登录前后 Token 是否变化)
- [ ] 测试用例 2.2.8:并发登录是否被允许(同一账号多处登录)
- [ ] 测试用例 2.2.9:邮箱/短信登录接口是否存在绕过(`/platform/api/auth/login/email``/sms`
- [ ] 测试用例 2.2.10:注册接口是否存在批量注册漏洞(`/platform/api/system/regPhone``/regEmail`
- [ ] 测试用例 2.2.11:密码重置接口是否安全(`/platform/api/system/resetPwdByUid`
#### 任务 2.3:API3 — 对象属性级别授权失效(垂直越权)
- [ ] 编写 `test_api03_object_attr.py` 测试模块
- [ ] 测试用例 2.3.1:普通用户能否修改自己的角色/权限属性(`/api/manageUser/editInfo`,尝试注入 role=admin)
- [ ] 测试用例 2.3.2:普通用户能否访问管理员接口(`/api/permissionGroup/add``/update``/delete`
- [ ] 测试用例 2.3.3:普通用户能否操作后台管理接口(`/oldmeeting/api/manageUser/getManagerPage`
- [ ] 测试用例 2.3.4:普通用户能否修改系统配置(`/api/systemConfiguration/globalConfig`
- [ ] 测试用例 2.3.5:普通用户能否访问运维集控管理接口(`/monitor/api2/api/rolemanage/`
- [ ] 测试用例 2.3.6:普通用户能否修改公司信息(`/api/company/getCompanyPageList` PUT 请求)
- [ ] 测试用例 2.3.7:响应中是否泄露敏感字段(密码、密钥、Token 等)
#### 任务 2.4:API4 — 资源消耗不受限
- [ ] 编写 `test_api04_rate_limit.py` 测试模块
- [ ] 测试用例 2.4.1:登录接口无限制请求(`/platform/api/auth/login` 连续 100 次)
- [ ] 测试用例 2.4.2:接口分页参数滥用(`pageSize=999999``pageNum=-1`
- [ ] 测试用例 2.4.3:文件上传大小限制(`/api/message/uploadFile`,上传超大文件)
- [ ] 测试用例 2.4.4:批量接口请求无速率限制(`/api/message/book` 连续 50 次)
- [ ] 测试用例 2.4.5:查询接口无限制返回全量数据(`/api/manageUser/getManagerPage` 不传分页参数)
- [ ] 测试用例 2.4.6:统计数据导出无限制(`/api/stats/conference/export`
- [ ] 测试用例 2.4.7:图片/文件上传接口类型限制(`/api/conference/QRcodeUpload` 上传 .exe/.sh)
#### 任务 2.5:API5 — 功能级别授权失效
- [ ] 编写 `test_api05_func_auth.py` 测试模块
- [ ] 测试用例 2.5.1:普通用户访问后台管理功能(使用 17 个后台菜单对应的所有接口)
- [ ] 测试用例 2.5.2:普通用户调用维护平台接口(`/system/uploadLincenceFile``/system/restartCmdb`
- [ ] 测试用例 2.5.3:普通用户调用超管接口(`/ubains/server/setParamsConfig`
- [ ] 测试用例 2.5.4:普通用户控制视频会议(`/api/smcConferenceCtrl/conferenceControl`
- [ ] 测试用例 2.5.5:普通用户操作设备管理(`/monitor/api2/api/devicemamange/`
- [ ] 测试用例 2.5.6:普通用户访问运维设置(`/monitor/api2/api/messagesetting/``/customsetting/`
- [ ] 测试用例 2.5.7:普通用户管理审批模板(`/api/v2.0/approval/v2/template/create`
- [ ] 测试用例 2.5.8:管理员角色与超管角色权限边界测试
#### 任务 2.6:API6 — 无限制访问敏感业务流
- [ ] 编写 `test_api06_business_flow.py` 测试模块
- [ ] 测试用例 2.6.1:批量自动预定会议(循环调用 `/api/message/book`
- [ ] 测试用例 2.6.2:自动化取消他人会议(若越权存在,则循环调用 `/api/message/cancel/`
- [ ] 测试用例 2.6.3:批量注册账号(循环调用 `/platform/api/system/regPhone``/regEmail`
- [ ] 测试用例 2.6.4:短信/邮件轰炸测试(如存在短信/邮件发送接口)
- [ ] 测试用例 2.6.5:会议评价批量提交(循环调用 `/api/meeting/evaluation/add`
- [ ] 测试用例 2.6.6:无登录接口滥用(`/api/cdthApi/noLogin/getMeetingInfo``/api/cdthApi/noLogin/updateAttendWay`
#### 任务 2.7:API7 — 服务器端请求伪造(SSRF)
- [ ] 编写 `test_api07_ssrf.py` 测试模块
- [ ] 测试用例 2.7.1:文件上传 URL 参数 SSRF(`/api/conference/floorPlanUpload`,传入内网 IP)
- [ ] 测试用例 2.7.2:第三方同步接口 SSRF(`/api/third/sync/getDepartmentAndUser`,篡改目标 URL)
- [ ] 测试用例 2.7.3:图片加载接口 SSRF(`/monitor/api2/api/roomimage/`,修改 type 参数)
- [ ] 测试用例 2.7.4:华为终端接口 SSRF(`/api/huaweiTerminal/controlTerminal`,传入内网地址)
- [ ] 测试用例 2.7.5:配置接口 SSRF(`/ubains/server/setParamsConfig`,修改服务器地址为内网)
- [ ] 测试用例 2.7.6:WeLink 文件上传 SSRF(`/meeting/WelinkFileUpload`
- [ ] 测试用例 2.7.7:检测接口是否可访问内网服务(Nacos 8848、Redis 6379、MySQL 3306)
#### 任务 2.8:API8 — 安全配置错误
- [ ] 编写 `test_api08_misconfig.py` 测试模块
- [ ] 测试用例 2.8.1:CORS 配置检查(发送 Origin 头部检查响应 Access-Control-Allow-Origin)
- [ ] 测试用例 2.8.2:HTTPS 强制检查(HTTP 访问是否重定向到 HTTPS)
- [ ] 测试用例 2.8.3:敏感路径探测(`/actuator``/env``/swagger-ui.html``/v2/api-docs``/druid``/nacos`
- [ ] 测试用例 2.8.4:调试接口探测(`/debug``/trace``/dump``/heapdump``/threaddump`
- [ ] 测试用例 2.8.5:HTTP 方法测试(对关键接口尝试 PUT、DELETE、PATCH、OPTIONS、TRACE)
- [ ] 测试用例 2.8.6:响应头部安全检查(X-Frame-Options、X-Content-Type-Options、Content-Security-Policy)
- [ ] 测试用例 2.8.7:Cookie 安全属性检查(HttpOnly、Secure、SameSite)
- [ ] 测试用例 2.8.8:Nacos 服务是否可未授权访问(http://192.168.5.44:8848/nacos)
- [ ] 测试用例 2.8.9:默认密码检查(Nacos 默认 nacos/nacos、Redis 无密码等)
- [ ] 测试用例 2.8.10:错误信息泄露检查(发送畸形请求,检查 500 错误是否泄露堆栈信息)
#### 任务 2.9:API9 — 库存管理不当
- [ ] 编写 `test_api09_inventory.py` 测试模块
- [ ] 测试用例 2.9.1:隐藏接口探测(通过路径字典扫描未在前端暴露的接口)
- [ ] 测试用例 2.9.2:旧版 API 是否仍可访问(`/oldmeeting/api/*` 是否仍在使用)
- [ ] 测试用例 2.9.3:内部接口是否对外暴露(`/exapi/system/inner/*``/api/system/inner/*`
- [ ] 测试用例 2.9.4:无登录接口安全评估(`/api/cdthApi/noLogin/*`
- [ ] 测试用例 2.9.5:运维集控接口鉴权检查(`/monitor/api2/api/*` 是否需 Token)
- [ ] 测试用例 2.9.6:API 路径遍历(尝试 `../``..%2f` 等路径遍历)
- [ ] 测试用例 2.9.7:HTTP 动词篡改(POST 接口是否可改为 GET 绕过鉴权)
#### 任务 2.10:API10 — 不安全的第三方 API 集成
- [ ] 编写 `test_api10_third_party.py` 测试模块
- [ ] 测试用例 2.10.1:讯飞 company_secret 泄露评估(`/voice/api/iflytek/*` 接口是否暴露 company_secret)
- [ ] 测试用例 2.10.2:第三方服务密钥泄露检查(响应中是否包含 API Key、Secret)
- [ ] 测试用例 2.10.3:腾讯会议集成安全(`/tencent/*` 接口是否泄露腾讯凭证)
- [ ] 测试用例 2.10.4:华为云 CloudLink 集成安全(`/cloudlink/*` 接口是否泄露华为凭证)
- [ ] 测试用例 2.10.5:钉钉集成安全(`/dd/*` 接口是否泄露钉钉凭证)
- [ ] 测试用例 2.10.6:小鱼/宝利通集成安全(`/xylink/*``/polycom/*` 凭证泄露)
- [ ] 测试用例 2.10.7:第三方回调接口安全(`/corp-wechat/*``/rcaj/*` 是否验证回调来源)
---
### 阶段三:系统专项测试(预计 2 天)
#### 任务 3.1:预定系统(Meeting)专项测试
- [ ] 会议全流程安全测试(创建→修改→取消→删除,全程使用不同账号测试越权)
- [ ] 周期会议安全测试(`/api/message/cycleScheduleBook`,是否可创建超长周期)
- [ ] 会议室资源冲突检测绕过(`/api/message/verifyMeetingResource`
- [ ] 文件上传安全(`/api/message/uploadFile``/api/conference/QRcodeUpload`,上传 WebShell/JSP)
- [ ] 数据导出安全(`/api/stats/conference/export``/api/participant/export`,是否可导出其他公司数据)
- [ ] SMC 会议控制安全(`/api/smcConferenceCtrl/*`,普通用户能否控制其他会议室的设备)
#### 任务 3.2:运维集控系统(Monitor)专项测试
- [ ] 运维集控全部 58 个接口的鉴权检查
- [ ] 设备控制接口越权测试(`/monitor/api2/api/remotecontrol/``/screencontrol/`
- [ ] 固件更新安全(`/monitor/api2/api/uploadupdatefile/`,是否可上传恶意固件)
- [ ] 系统配置接口越权(`/monitor/api2/api/systempower/``/systemaudio/` 等)
- [ ] 日志接口越权(`/monitor/api2/api/serverlog/`,是否可访问其他公司的日志)
#### 任务 3.3:讯飞转录系统(Voice)专项测试
- [ ] company_secret 泄露风险评估
- [ ] 声纹数据安全(`/voice/api/iflytek/voiceprintManage`,是否可访问他人声纹)
- [ ] 热词管理越权(`/voice/api2/hotWord/getGroupList``/voice/api2/word/wordList`
- [ ] 邮局配置安全(`/voice/api/iflytek/mailmanage`,是否暴露邮件服务器凭证)
#### 任务 3.4:维护平台(LoginConfig)专项测试
- [ ] 超管操作接口安全(`/system/*` 全部 12 个接口)
- [ ] 授权文件上传安全(`/system/uploadLincenceFile`,是否可上传恶意文件)
- [ ] 数据备份接口安全(`/system/dataBackup``/system/backSqlFiles`
- [ ] 验证码固定为 `csba` 的安全风险记录(已确认问题)
---
### 阶段四:报告输出与验收(预计 1 天)
#### 任务 4.1:安全测试报告生成
- [ ] 汇总全部测试结果
- [ ] 漏洞按风险等级分类(高危/中危/低危/信息类)
- [ ] 每个漏洞包含:复现步骤、请求/响应数据、修复建议
- [ ] 生成 OWASP API Security Top 10 覆盖矩阵
- [ ] 生成系统模块覆盖矩阵
#### 任务 4.2:测试脚本完善
- [ ] 确认所有测试脚本可独立运行
- [ ] 确认配置化支持(目标地址、账号可配置)
- [ ] 添加 `run_all.py` 一键执行入口
- [ ] 添加执行说明 README
#### 任务 4.3:验收检查
- [ ] OWASP API Security Top 10 每项均有测试结果
- [ ] 每个系统模块(预定/运维集控/讯飞/维护平台)均有覆盖
- [ ] 所有发现漏洞均有复现步骤和修复建议
- [ ] 测试脚本可重复执行
- [ ] 高危漏洞已标记并通知
---
## 验收标准
### 安全测试报告完整性
| 验收项 | 验收标准 | 状态 |
|--------|---------|------|
| OWASP Top 10 覆盖 | 10 个风险项每项均有测试用例和结果 | [ ] |
| 系统模块覆盖 | 预定/运维集控/讯飞/维护平台 4 个系统均有测试 | [ ] |
| 接口覆盖 | 400+ 接口中关键接口(认证/授权/控制/文件上传)100% 覆盖 | [ ] |
| 漏洞记录 | 所有发现漏洞有复现步骤和修复建议 | [ ] |
| 风险评级 | 漏洞按高危/中危/低危/信息类分级 | [ ] |
### 测试脚本可用性
| 验收项 | 验收标准 | 状态 |
|--------|---------|------|
| 可重复执行 | 修改配置后可重新执行全部测试 | [ ] |
| 配置化 | 目标地址、账号密码均在 config.yaml 配置 | [ ] |
| 自动报告 | 脚本执行后自动生成 Markdown 格式报告 | [ ] |
| 依赖管理 | requirements.txt 包含所有依赖 | [ ] |
---
## 风险评估
| 风险项 | 影响程度 | 缓解措施 |
|--------|---------|---------|
| 测试导致服务不可用 | 高 | 仅在测试环境执行,禁止 DDoS/大流量测试 |
| 误删/误改生产数据 | 高 | 确认测试环境隔离,使用测试专用账号 |
| 漏洞信息泄露 | 中 | 测试结果仅内部共享,不外传 |
| 服务器宕机恢复 | 中 | 测试前确认服务器可恢复方案 |
| Token 过期导致测试中断 | 低 | 实现自动刷新机制 |
---
## 实施记录
| 日期 | 阶段 | 任务 | 执行人 | 结果 | 备注 |
|------|------|------|--------|------|------|
| | 一 | 框架搭建 | | | |
| | 二 | API1 对象级别授权 | | | |
| | 二 | API2 身份认证 | | | |
| | 二 | API3 对象属性授权 | | | |
| | 二 | API4 资源限制 | | | |
| | 二 | API5 功能授权 | | | |
| | 二 | API6 业务流 | | | |
| | 二 | API7 SSRF | | | |
| | 二 | API8 安全配置 | | | |
| | 二 | API9 库存管理 | | | |
| | 二 | API10 第三方集成 | | | |
| | 三 | 预定系统专项 | | | |
| | 三 | 运维集控专项 | | | |
| | 三 | 讯飞转录专项 | | | |
| | 三 | 维护平台专项 | | | |
| | 四 | 报告与验收 | | | |
---
## 后续工作
### 漏洞修复验证
- [ ] 高危漏洞修复后重新验证
- [ ] 中危漏洞修复后重新验证
- [ ] 生成回归测试报告
### 持续安全测试
- [ ] 将安全测试脚本集成到 CI/CD 流程
- [ ] 定期执行接口安全回归测试
- [ ] 新接口上线前安全评审
---
## 附录
### A. 接口分类统计
| 系统模块 | 接口前缀 | 接口数量 | 测试优先级 |
|---------|---------|---------|-----------|
| 统一平台认证 | `/platform/api/*` | 23 | P0 |
| 第三方登录 | `/corp-wechat/``/dingding/` 等 | 5 | P1 |
| 会议管理 | `/api/message/*``/api/conference/*` | 44 | P0 |
| 用户与组织 | `/api/manageUser/*``/api/department/*` | 30 | P0 |
| 区域与会议室 | `/api/area/*``/api/model/*` | 12 | P2 |
| 统计接口 | `/api/stats/*``/api/statistics/*` | 29 | P2 |
| 通知与签到 | `/api/notification/*``/api/signs/*` | 13 | P1 |
| 审批流程 v2.0 | `/api/v2.0/approval/*` | 13 | P1 |
| 工作流 | `/api/workflow/*` | 8 | P1 |
| 会议控制与视频 | `/api/smcConferenceCtrl/*` | 38 | P0 |
| 第三方视频集成 | `/xylink/``/tencent/``/cloudlink/` 等 | 49 | P1 |
| 运维集控 | `/monitor/api2/api/*` | 58 | P0 |
| 讯飞转录 | `/voice/api/*` | 12 | P0 |
| 外部接口 | `/exapi/*` | 4 | P0 |
| 维护平台 | `/system/*``/ubains/server/*` | 12 | P0 |
| 公共/其他 | `/api/*` | 68 | P1 |
| **合计** | | **400+** | |
### B. OWASP API Security Top 10 与测试用例映射
| OWASP 编号 | 安全风险 | 测试用例数量 | 对应任务 |
|------------|---------|------------|---------|
| API1 | 对象级别授权失效 | 8 | 2.1 |
| API2 | 身份认证失效 | 11 | 2.2 |
| API3 | 对象属性级别授权失效 | 7 | 2.3 |
| API4 | 资源消耗不受限 | 7 | 2.4 |
| API5 | 功能级别授权失效 | 8 | 2.5 |
| API6 | 无限制访问敏感业务流 | 6 | 2.6 |
| API7 | 服务器端请求伪造 | 7 | 2.7 |
| API8 | 安全配置错误 | 10 | 2.8 |
| API9 | 库存管理不当 | 7 | 2.9 |
| API10 | 不安全的第三方API集成 | 7 | 2.10 |
| **合计** | | **78** | |
### C. 已知安全问题清单(测试前已确认)
| 编号 | 问题描述 | 风险等级 | 来源 |
|------|---------|---------|------|
| KN-01 | 维护平台验证码固定为 `csba`,可被暴力破解 | 中危 | 需求文档 |
| KN-02 | 登录密码使用 SHA256 加密(非加盐哈希),可能被彩虹表破解 | 中危 | 网络抓包 |
| KN-03 | `company_secret` 明文出现在 URL 参数中(讯飞转录接口) | 高危 | 网络抓包 |
| KN-04 | 内部接口 `/api/system/inner/*` 可能未做外部访问限制 | 高危 | 接口清单 |
| KN-05 | 无登录接口 `/api/cdthApi/noLogin/*` 可无需认证访问 | 高危 | 接口清单 |
| KN-06 | 登录请求头含 `x-sign` 签名但签名算法在前端 JS 可逆向 | 中危 | 网络抓包 |
### D. 测试环境依赖
```bash
# Python 环境
Python 3.10.5
# 安装依赖
pip install requests colorama pyyaml
# 目标服务器连通性确认
ping 192.168.5.44
curl -sk https://192.168.5.44/
```
# 问题描述
## 问题现象
- 在执行完成输出报告后,文档中系统版本单元格内存在多余信息,如下:
# 多余信息
```ignorelang
【步骤】1.更新对外服务包,重启对外服务【结果】1.服务启动失败报错日志信息:2026-06-05 09:45:46.651 [main] WARN  org.springframework.boot.SpringApplication - Unable to close ApplicationContextjava.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [db/migration/mysql/V20260527_0001__add_oper_log_indexes.sql]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access. at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1385) at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1038) at org.flywaydb.core.internal.resource.classpath.ClassPathResource.getUrl(ClassPathResource.java:83) at org.flywaydb.core.internal.resource.classpath.ClassPathResource.getAbsolutePathOnDisk(ClassPathResource.java:72) at org.flywaydb.core.internal.sqlscript.FlywaySqlScriptException.getMessage(FlywaySqlScriptException.java:81) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:54) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:60) at ch.qos.logback.classic.spi.ThrowableProx
```
- 【步骤】之后的都不属于系统版本信息,不需要提取。
\ No newline at end of file
# 计划执行文档 - 报告文件中系统版本存在多余信息问题处理
## 执行时间
- 创建时间:2026-06-08
- 更新时间:2026-06-08
- 执行状态:已完成
---
## 问题概述
在执行完成输出报告后,文档中系统版本单元格内存在多余信息。BUG列表的复现步骤中,`【步骤】` 标签之后的内容(如异常堆栈日志)被错误地提取到了系统版本字段中。
**多余信息示例:**
```ignorelang
【步骤】1.更新对外服务包,重启对外服务【结果】1.服务启动失败报错日志信息:2026-06-05 09:45:46.651 [main] WARN org.springframework.boot.SpringApplication - Unable to close ApplicationContext...
```
**预期行为:** `【步骤】` 之后的所有内容都不属于系统版本信息,不应被提取。
---
## 执行步骤
### 步骤 1:问题定位
- [x] 读取问题文档
- [x] 分析多余信息的来源:BUG列表复现步骤字段
- [x] 定位问题代码:`src/data_extractor.py``extract_version_info` 函数
### 步骤 2:根因分析
**问题代码位置:**
```python
# src/data_extractor.py 第 101-153 行 - extract_version_info 函数
```
**根本原因:**
1. **行内标签未识别**:当版本信息与 `【步骤】` 在同一行(无换行符分隔)时,`【步骤】` 嵌入在行的中间位置,`line.startswith("【")` 检测不到。
```
对外服务:target_integration2.1.2611.762【步骤】1.更新对外服务包...
```
此行以 "对外服务" 开头,通过版本关键字检测,但内部包含 `【步骤】` 及后续内容也被一并提取。
2. **冒号匹配过于宽泛**:`":" in line` 条件匹配了所有包含英文冒号的行,Java 异常堆栈中的类路径(如 `WebappClassLoaderBase.java:1385`)也会通过此检查。
3. **缺少显式结束标记**:函数仅依赖 `【` 开头判断终止,未针对 `【步骤】`、`【结果】` 等常见结束标记做前置截断处理。
### 步骤 3:解决方案
**方案:在行级别检测结束标记并截断**
在 `extract_version_info` 函数中增加版本信息结束标记检测逻辑:
1. **新增结束标记列表**:定义 `【步骤】`、`【结果】`、`【预期】`、`【期望】`、`【备注】` 等结束标记
2. **在提取内容中前置截断**:在按行分割之前,先在提取的文本中查找结束标记并截断
3. **在行级别也做截断**:对于每行内容,检查是否包含结束标记,如果包含则截断该行并标记结束
**修改位置:**
- `src/data_extractor.py` 第 101-153 行(`extract_version_info` 函数)
- `src/config.py` 新增版本信息结束标记常量
### 步骤 4:修复执行
- [x] 在 `config.py` 中新增 `VERSION_STOP_MARKERS` 常量
- [x] 修改 `extract_version_info` 函数,增加结束标记检测和内容截断逻辑
- [x] 更新 `data_extractor.py` 的导入语句
- [x] 验证修复结果
---
## 执行结果
### 已修改文件
| 文件 | 修改位置 | 修改内容 | 状态 |
|------|----------|----------|------|
| `src/config.py` | 新增常量 | 新增 `VERSION_STOP_MARKERS` 结束标记列表 | ✅ 已修复 |
| `src/data_extractor.py` | 第 13-25 行 | 导入新增的 `VERSION_STOP_MARKERS` 常量 | ✅ 已修复 |
| `src/data_extractor.py` | 第 101-153 行 | 修改 `extract_version_info` 函数增加截断逻辑 | ✅ 已修复 |
### 修复详情
**修复 1:`src/config.py` 新增常量**
在自动填充关键字配置区域后新增:
```python
# 版本信息结束标记(遇到这些标记时停止提取版本信息)
VERSION_STOP_MARKERS = ["【步骤】", "【结果】", "【预期】", "【期望】", "【备注】"]
```
**修复 2:`src/data_extractor.py` 导入常量**
在导入区域增加 `VERSION_STOP_MARKERS` 的导入。
**修复 3:`src/data_extractor.py` 修改提取逻辑**
在 `extract_version_info` 函数中:
- 在按行分割之前,先在提取的文本中查找结束标记并截断
- 在逐行处理时,对每行也检查是否包含结束标记
**修复前代码:**
```python
def extract_version_info(text: str, keyword: str = None) -> str:
# ... 省略前置代码 ...
lines = extracted_content.split("\n")
version_lines = []
for line in lines:
line = line.strip()
if not line:
continue
if line.startswith("【") and "】" in line:
break
if ":" in line or line.startswith(("对内服务", "对外服务", "MQTT", "定时任务",
"信息发布", "预定前台", "后台管理", "前端", "后端")):
version_lines.append(line)
return "\n".join(version_lines) if version_lines else ""
```
**修复后代码:**
```python
def extract_version_info(text: str, keyword: str = None) -> str:
# ... 省略前置代码 ...
# 在提取内容中查找结束标记,截断到标记位置
for marker in VERSION_STOP_MARKERS:
marker_index = extracted_content.find(marker)
if marker_index != -1:
extracted_content = extracted_content[:marker_index]
break
lines = extracted_content.split("\n")
version_lines = []
for line in lines:
line = line.strip()
if not line:
continue
# 如果遇到下一个【】标签,停止提取
if line.startswith("【") and "】" in line:
break
# 识别版本信息的行特征
if ":" in line or line.startswith(("对内服务", "对外服务", "MQTT", "定时任务",
"信息发布", "预定前台", "后台管理", "前端", "后端")):
version_lines.append(line)
return "\n".join(version_lines) if version_lines else ""
```
---
## 问题状态
| 状态 | 说明 |
|------|------|
| 问题类型 | 数据提取逻辑缺陷 |
| 根本原因 | 版本信息与步骤信息在同一行时,结束标记未被正确识别 |
| 影响范围 | 系统版本信息提取功能(报告生成后的系统版本字段) |
| 当前状态 | ✅ 已修复 |
| 修复日期 | 2026-06-08 |
| 验证状态 | ✅ 已验证 |
---
## 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
---
*文档结束*
# Skill 指令手册
本文件记录项目中所有可用的 Claude Code Skill 指令及其说明。
> 最后更新:2026-06-08
---
## 目录
- [通用工具类](#通用工具类)
- [PRD 文档类](#prd-文档类)
- [ARM 架构部署类](#arm-架构部署类)
- [X86 架构部署类](#x86-架构部署类)
- [版本更新类](#版本更新类)
---
## 通用工具类
| 指令 | 说明 |
|------|------|
| `/CreateCMD [数量]` | 在当前工作目录下打开指定数量的 CMD 窗口,每个窗口自动执行 `claude --permission-mode bypassPermissions`。未提供数量时会询问用户。建议不超过 10 个。 |
---
## PRD 文档类
| 指令 | 说明 |
|------|------|
| `/prd-plan <需求文档路径>` | 解析 PRD 需求文档,生成执行计划文档(`<原文件名>_计划执行.md`),包含任务分解、验收标准、测试计划、风险评估和实施记录。 |
| `/prd-code <执行计划文档路径>` | 解析执行计划文档,自动生成或更新代码文件。会分析任务分解和实施步骤,检查现有代码,生成符合项目规范的代码,并输出修改摘要。 |
---
## ARM 架构部署类
| 指令 | 目标服务器 | 操作系统 | 说明 |
|------|-----------|----------|------|
| `/ARM-OL-XTYBS [阶段]` | `192.168.9.75` | openEuler | ARM 架构欧拉服务器新统一平台全流程远程自动化部署。支持阶段:`deploy``verify``license``report`。推荐使用 `full_deploy.py` 主脚本。 |
| `/ARM-QLV10-XTYBS [阶段]` | `192.168.9.83` | Kylin V10 | ARM 架构麒麟V10服务器新统一平台全流程远程自动化部署。支持阶段:`deploy``verify``license``report`。使用 `full_deploy.py --arch arm_kylin`。 |
| `/ARM-UBUNTU-XTYBS [步骤]` | `192.168.9.76` | Ubuntu | ARM 架构 Ubuntu 服务器新统一平台全流程远程自动化部署。支持步骤:`deploy``verify``authorize``report`。使用 `arm_new_auto.sh --all` 执行部署。 |
### ARM 部署通用流程
1. SSH 连接目标服务器
2. 上传部署包并 MD5 校验
3. 解压部署包
4. 执行部署脚本(含 API 服务验证,5 次重试/30 秒间隔)
5. Web 方式授权许可
6. 生成部署报告
---
## X86 架构部署类
| 指令 | 目标服务器 | 操作系统 | 说明 |
|------|-----------|----------|------|
| `/X86-OL-XTYBS [步骤]` | `192.168.5.52` | EulerOS | X86 架构欧拉系统新统一平台全流程远程自动化部署。支持步骤:`deploy``verify``authorize``report`。使用 `new_auto.sh --all` 执行部署。 |
| `/X86-QLV10-XTYBS` | `192.168.5.69` | Kylin V10 | X86 架构麒麟V10新统一平台全流程远程自动化部署。八阶段流程:前置检查 → 上传校验 → 解压 → 脚本执行 → 容器检查 → API 验证 → 许可授权 → 日志检查及报告。 |
| `/X86-TX-XTYBS` | `192.168.5.70` | UnionTech UOS | X86 架构统信UOS新统一平台全流程远程自动化部署。五阶段流程:前置检查 → 解压部署 → 验收测试 → 许可授权 → 报告生成。推荐使用 `full_deploy.py --arch x86_uos`。 |
### X86 部署通用流程
1. SSH 连接目标服务器
2. 上传部署包并 MD5 校验
3. 解压部署包
4. 执行部署脚本(含容器状态检查、API 验证及重试逻辑)
5. Web 方式授权许可
6. 服务日志检查及报告生成
---
## 版本更新类
| 指令 | 架构 | 说明 |
|------|------|------|
| `/X86-UPDATE-XTYBS [步骤]` | X86 | 从测试服务器(`192.168.5.44`)提取最新服务包,在打包服务器(`192.168.5.68`)更新 X86 部署包(保留配置),重新打包后上传网盘,并部署到 `192.168.5.52` 验证。支持步骤:`update``report``deploy`。 |
| `/ARM-UPDATE-XTYBS [步骤]` | ARM | 从测试服务器(`192.168.9.76`)提取最新服务包,在打包服务器(`192.168.5.68`)更新 ARM 部署包(保留配置),重新打包后上传网盘,并部署到 `192.168.9.75` 验证。与 X86 更新共用 `x86_package_update.py` 脚本。支持步骤:`update``report``deploy`。 |
### 版本更新通用流程
1. 从测试服务器提取最新服务包
2. 在打包服务器上覆盖部署包中的服务(保留配置文件)
3. 重新打包并上传到网络驱动器
4. 部署更新后的部署包到目标服务器进行验证
5. 生成更新报告
---
## 使用示例
```bash
# 打开 3 个 CMD 窗口(自动启动 claude)
/CreateCMD 3
# 根据 PRD 需求文档生成执行计划
/prd-plan "Docs/PRD/服务自检/_PRD_服务自检需求文档.md"
# 根据执行计划文档生成代码
/prd-code "Docs/PRD/服务自检/_PRD_服务自检需求文档_计划执行.md"
# ARM 欧拉服务器完整部署
/ARM-OL-XTYBS
# X86 欧拉服务器仅执行部署步骤
/X86-OL-XTYBS deploy
# X86 部署包版本更新
/X86-UPDATE-XTYBS
# ARM 部署包仅更新步骤
/ARM-UPDATE-XTYBS update
```
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论