# ServiceManager 使用文档
本地 exe 服务管理工具,支持状态查询、启动、停止。
## 文件说明
| 文件 | 说明 |
|------|------|
| `ServiceManager.js` | 编译后的 JavaScript 类,可直接在浏览器或 Node.js 使用 |
| `ServiceManager.d.ts` | TypeScript 类型声明文件 |
| `ServiceManager.ts` | TypeScript 源码 |
| `test.html` | 功能演示页面 |
## 快速开始
### 1. 引入类
**浏览器(ES Module)**
```html
```
**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` | 获取所有服务状态 |
| `getServiceStatus(id)` | `id: string` | `Promise` | 获取单个服务状态 |
| `isConnected()` | - | `boolean` | 获取连接状态 |
#### 服务控制
| 方法 | 参数 | 返回 | 说明 |
|------|------|------|------|
| `startService(id)` | `id: string` | `Promise` | 启动服务 |
| `stopService(id)` | `id: string` | `Promise` | 停止服务 |
#### 自动刷新
| 方法 | 参数 | 说明 |
|------|------|------|
| `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/` | GET | 获取单个服务状态 |
| `/api/services//start` | POST | 启动服务 |
| `/api/services//stop` | POST | 停止服务 |
后端返回格式:
```json
{
"code": 0,
"data": [{
"id": "watchdog",
"name": "🔐 安全控件",
"exe_path": "C:\\path\\to\\watchdog.exe",
"running": true,
"pid": 1234,
"status": "running"
}]
}
```