daShangDao_psiWebApp/move/demo/README.md
2026-06-03 10:53:47 +08:00

191 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ServiceManager 使用文档
本地 exe 服务管理工具,支持状态查询、启动、停止。
## 文件说明
| 文件 | 说明 |
|------|------|
| `ServiceManager.js` | 编译后的 JavaScript 类,可直接在浏览器或 Node.js 使用 |
| `ServiceManager.d.ts` | TypeScript 类型声明文件 |
| `ServiceManager.ts` | TypeScript 源码 |
| `test.html` | 功能演示页面 |
## 快速开始
### 1. 引入类
**浏览器ES Module**
```html
<script type="module">
import { ServiceManager } from './ServiceManager.js';
</script>
```
**Node.js**
```javascript
// 如果使用 Node.js需要处理 fetch 兼容
// 推荐使用 node-fetch 或 axios
```
### 2. 基本使用
```javascript
// 创建实例
const sm = new ServiceManager('http://127.0.0.1:5000');
// 查询所有服务状态
const services = await sm.getServicesStatus();
console.log(services);
// 启动服务
await sm.startService('watchdog');
// 停止服务
await sm.stopService('watchdog');
```
## API 参考
### 静态方法
| 方法 | 说明 |
|------|------|
| `ServiceManager.enableDebug()` | 开启 DEBUG 模式,浏览器控制台输出详细日志 |
| `ServiceManager.disableDebug()` | 关闭 DEBUG 模式 |
| `ServiceManager.isDebugEnabled()` | 返回当前 DEBUG 状态 |
### 实例方法
#### 配置
| 方法 | 参数 | 说明 |
|------|------|------|
| `setBaseUrl(url)` | `url: string` | 设置 API 地址 |
| `getBaseUrl()` | - | 获取当前 API 地址 |
| `setPollInterval(ms)` | `ms: number` | 设置自动刷新间隔(毫秒) |
| `getPollInterval()` | - | 获取当前间隔 |
#### 状态查询
| 方法 | 参数 | 返回 | 说明 |
|------|------|------|------|
| `getServicesStatus()` | - | `Promise<ServiceInfo[]>` | 获取所有服务状态 |
| `getServiceStatus(id)` | `id: string` | `Promise<ServiceInfo \| null>` | 获取单个服务状态 |
| `isConnected()` | - | `boolean` | 获取连接状态 |
#### 服务控制
| 方法 | 参数 | 返回 | 说明 |
|------|------|------|------|
| `startService(id)` | `id: string` | `Promise<boolean>` | 启动服务 |
| `stopService(id)` | `id: string` | `Promise<boolean>` | 停止服务 |
#### 自动刷新
| 方法 | 参数 | 说明 |
|------|------|------|
| `startAutoRefresh(callback)` | `callback?: (services) => void` | 启动自动刷新 |
| `stopAutoRefresh()` | - | 停止自动刷新 |
| `isAutoRefreshRunning()` | - | 返回自动刷新状态 |
#### 事件与日志
| 方法 | 参数 | 说明 |
|------|------|------|
| `setOnStatusChange(callback)` | `callback: (service) => void` | 设置状态变化回调 |
| `getLogs()` | - | 获取所有日志 |
| `clearLogs()` | - | 清空日志 |
| `destroy()` | - | 销毁实例 |
## 类型定义
```typescript
interface ServiceInfo {
id: string;
name: string;
exe_path: string;
running: boolean;
pid: number | null;
port: number | null;
port_open: boolean | null;
status: 'running' | 'stopped';
}
interface LogEntry {
time: string;
level: 'info' | 'success' | 'error' | 'warn' | 'debug';
message: string;
data?: any;
}
```
## 完整示例
```javascript
// 1. 开启 DEBUG在浏览器控制台查看详细日志
ServiceManager.enableDebug();
// 2. 创建实例
const sm = new ServiceManager('http://127.0.0.1:5000');
// 3. 设置轮询间隔(可选,默认 3000ms
sm.setPollInterval(5000);
// 4. 设置状态变化回调
sm.setOnStatusChange((service) => {
console.log(`${service.name} 状态变化: ${service.status}`);
if (service.running) {
console.log(`PID: ${service.pid}`);
}
});
// 5. 启动自动刷新
sm.startAutoRefresh((services) => {
services.forEach(s => {
console.log(`${s.name}: ${s.status}`);
});
});
// 6. 或者手动查询
const services = await sm.getServicesStatus();
await sm.startService('watchdog');
await sm.stopService('watchdog');
// 7. 查看日志
const logs = sm.getLogs();
console.log(logs);
// 8. 停止自动刷新
sm.stopAutoRefresh();
// 9. 销毁实例
sm.destroy();
```
## 依赖后端
本工具需要配合 Flask 后端使用,后端需要提供以下 API
| 端点 | 方法 | 说明 |
|------|------|------|
| `/api/services` | GET | 获取所有服务状态 |
| `/api/services/<id>` | GET | 获取单个服务状态 |
| `/api/services/<id>/start` | POST | 启动服务 |
| `/api/services/<id>/stop` | POST | 停止服务 |
后端返回格式:
```json
{
"code": 0,
"data": [{
"id": "watchdog",
"name": "🔐 安全控件",
"exe_path": "C:\\path\\to\\watchdog.exe",
"running": true,
"pid": 1234,
"status": "running"
}]
}
```