Skip to content

Commit ea109a4

Browse files
author
Taois
committed
feat: 新版准备中
1 parent a2b511b commit ea109a4

39 files changed

+5556
-12
lines changed

README.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
# drpyS(drpy-node)
2-
32
[![zread](https://img.shields.io/badge/Ask_Zread-_.svg?style=plastic&color=00b0aa&labelColor=000000&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTQuOTYxNTYgMS42MDAxSDIuMjQxNTZDMS44ODgxIDEuNjAwMSAxLjYwMTU2IDEuODg2NjQgMS42MDE1NiAyLjI0MDFWNC45NjAxQzEuNjAxNTYgNS4zMTM1NiAxLjg4ODEgNS42MDAxIDIuMjQxNTYgNS42MDAxSDQuOTYxNTZDNS4zMTUwMiA1LjYwMDEgNS42MDE1NiA1LjMxMzU2IDUuNjAxNTYgNC45NjAxVjIuMjQwMUM1LjYwMTU2IDEuODg2NjQgNS4zMTUwMiAxLjYwMDEgNC45NjE1NiAxLjYwMDFaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik00Ljk2MTU2IDEwLjM5OTlIMi4yNDE1NkMxLjg4ODEgMTAuMzk5OSAxLjYwMTU2IDEwLjY4NjQgMS42MDE1NiAxMS4wMzk5VjEzLjc1OTlDMS42MDE1NiAxNC4xMTM0IDEuODg4MSAxNC4zOTk5IDIuMjQxNTYgMTQuMzk5OUg0Ljk2MTU2QzUuMzE1MDIgMTQuMzk5OSA1LjYwMTU2IDE0LjExMzQgNS42MDE1NiAxMy43NTk5VjExLjAzOTlDNS42MDE1NiAxMC42ODY0IDUuMzE1MDIgMTAuMzk5OSA0Ljk2MTU2IDEwLjM5OTlaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik0xMy43NTg0IDEuNjAwMUgxMS4wMzg0QzEwLjY4NSAxLjYwMDEgMTAuMzk4NCAxLjg4NjY0IDEwLjM5ODQgMi4yNDAxVjQuOTYwMUMxMC4zOTg0IDUuMzEzNTYgMTAuNjg1IDUuNjAwMSAxMS4wMzg0IDUuNjAwMUgxMy43NTg0QzE0LjExMTkgNS42MDAxIDE0LjM5ODQgNS4zMTM1NiAxNC4zOTg0IDQuOTYwMVYyLjI0MDFDMTQuMzk4NCAxLjg4NjY0IDE0LjExMTkgMS42MDAxIDEzLjc1ODQgMS42MDAxWiIgZmlsbD0iI2ZmZiIvPgo8cGF0aCBkPSJNNCAxMkwxMiA0TDQgMTJaIiBmaWxsPSIjZmZmIi8%2BCjxwYXRoIGQ9Ik00IDEyTDEyIDQiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPgo8L3N2Zz4K&logoColor=ffffff)](https://zread.ai/hjdhnx/drpy-node)
4-
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/hjdhnx/drpy-node)
5-
3+
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/hjdhnx/drpy-node)
4+
![drpyS](./public/images/drpys.png)
65
nodejs作为服务端的drpy实现。全面升级异步写法
76
~~积极开发中,每日一更~~,当前进度 `100%`
87
~~找工作中,随缘更新~~

controllers/admin.js

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
/**
2+
* Admin Controller - 后台管理界面控制器
3+
* 提供 admin 面板所需的 API 接口和静态文件服务
4+
*/
5+
6+
import path from 'path';
7+
import fs from 'fs';
8+
import fastifyStatic from '@fastify/static';
9+
10+
// 配置相关
11+
const CONFIG_PATH = path.join(process.cwd(), 'config/env.json');
12+
13+
// 获取配置
14+
async function getConfig(req, reply) {
15+
try {
16+
const { key } = req.query;
17+
18+
if (!fs.existsSync(CONFIG_PATH)) {
19+
return reply.send({});
20+
}
21+
22+
const configContent = fs.readFileSync(CONFIG_PATH, 'utf-8');
23+
const config = JSON.parse(configContent);
24+
25+
if (key) {
26+
const keys = key.split('.');
27+
let value = config;
28+
for (const k of keys) {
29+
value = value?.[k];
30+
}
31+
return reply.send(value !== undefined ? value : null);
32+
}
33+
34+
return reply.send(config);
35+
} catch (e) {
36+
reply.code(500).send({ error: e.message });
37+
}
38+
}
39+
40+
// 更新配置
41+
async function updateConfig(req, reply) {
42+
try {
43+
const { action, key, value } = req.body;
44+
45+
if (action === 'set') {
46+
const systemTools = await import('../drpy-node-mcp/tools/systemTools.js');
47+
const result = await systemTools.manage_config({ action, key, value: String(value) });
48+
if (result.isError) {
49+
return reply.code(400).send({ error: result.content[0].text });
50+
}
51+
return reply.send({ success: true, message: result.content[0].text });
52+
}
53+
54+
reply.code(400).send({ error: 'Invalid action' });
55+
} catch (e) {
56+
reply.code(500).send({ error: e.message });
57+
}
58+
}
59+
60+
// MCP 工具调用接口
61+
async function callMCP(req, reply) {
62+
try {
63+
const { name, arguments: args } = req.body;
64+
65+
let handler;
66+
switch (name) {
67+
case 'read_logs':
68+
const systemTools = await import('../drpy-node-mcp/tools/systemTools.js');
69+
handler = systemTools.read_logs;
70+
break;
71+
case 'restart_service':
72+
const systemTools2 = await import('../drpy-node-mcp/tools/systemTools.js');
73+
handler = systemTools2.restart_service;
74+
break;
75+
case 'list_sources':
76+
const spiderTools = await import('../drpy-node-mcp/tools/spiderTools.js');
77+
handler = spiderTools.list_sources;
78+
break;
79+
case 'get_routes_info':
80+
const spiderTools2 = await import('../drpy-node-mcp/tools/spiderTools.js');
81+
handler = spiderTools2.get_routes_info;
82+
break;
83+
case 'get_drpy_api_list':
84+
const apiTools = await import('../drpy-node-mcp/tools/apiTools.js');
85+
handler = apiTools.get_drpy_api_list;
86+
break;
87+
case 'validate_spider':
88+
case 'check_syntax':
89+
case 'get_spider_template':
90+
case 'debug_spider_rule':
91+
const spiderTools3 = await import('../drpy-node-mcp/tools/spiderTools.js');
92+
handler = spiderTools3[name];
93+
break;
94+
case 'sql_query':
95+
const dbTools = await import('../drpy-node-mcp/tools/dbTools.js');
96+
handler = dbTools.sql_query;
97+
break;
98+
case 'list_directory':
99+
case 'read_file':
100+
const fsTools = await import('../drpy-node-mcp/tools/fsTools.js');
101+
handler = fsTools[name];
102+
break;
103+
default:
104+
return reply.code(404).send({ error: 'Tool not found' });
105+
}
106+
107+
if (!handler) {
108+
return reply.code(404).send({ error: 'Tool not found' });
109+
}
110+
111+
const result = await handler(args || {});
112+
113+
if (result.isError) {
114+
return reply.code(400).send({ error: result.content[0].text });
115+
}
116+
117+
const content = result.content[0].text;
118+
try {
119+
return reply.send(JSON.parse(content));
120+
} catch {
121+
return reply.send(content);
122+
}
123+
} catch (e) {
124+
reply.code(500).send({ error: e.message });
125+
}
126+
}
127+
128+
// 导出路由配置 - 使用标准控制器模式
129+
export default (fastify, options, done) => {
130+
// Admin 面板静态文件目录
131+
const adminDistPath = path.join(process.cwd(), 'drpy-node-admin/dist');
132+
133+
if (fs.existsSync(adminDistPath)) {
134+
fastify.log.info('Serving admin panel from ' + adminDistPath);
135+
136+
// 注册静态文件服务(在 API 路由之前注册,避免冲突)
137+
fastify.register(fastifyStatic, {
138+
root: adminDistPath,
139+
prefix: '/admin/',
140+
decorateReply: false,
141+
index: ['index.html']
142+
});
143+
}
144+
145+
// API 路由(必须在静态文件服务之后注册,避免被静态文件拦截)
146+
fastify.get('/admin/config', getConfig);
147+
fastify.post('/admin/config', updateConfig);
148+
fastify.post('/admin/mcp', callMCP);
149+
150+
done();
151+
}

controllers/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import m3u8ProxyController from './m3u8-proxy.js';
2424
import unifiedProxyController from './unified-proxy.js';
2525
import githubController from './github.js';
2626
import websocketServerController from "./websocketServer.js";
27+
// import adminController from './admin.js';
2728

2829
export const registerRoutes = (fastify, options) => {
2930
fastify.register(formBody);
@@ -52,6 +53,7 @@ export const registerRoutes = (fastify, options) => {
5253
fastify.register(m3u8ProxyController, options);
5354
fastify.register(unifiedProxyController, options);
5455
fastify.register(githubController, options);
56+
// fastify.register(adminController, options);
5557
};
5658

5759
export const registerWsRoutes = (wsApp, options) => {

drpy-node-admin/README.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# DRPY Node Admin
2+
3+
drpy-node 后台管理界面 - 基于 Vue3 + Tailwind CSS 构建的现代化管理系统。
4+
5+
## 功能特性
6+
7+
- 🎨 现代化 UI 设计,支持亮色/暗色主题
8+
- 📱 完全响应式,适配 PC 和移动端
9+
- 🚀 基于 Vite 构建,快速开发体验
10+
- 🔧 环境变量可视化配置
11+
- 📦 源文件管理和验证
12+
- 📋 实时日志查看
13+
- 📚 API 文档查看
14+
- 📁 文件浏览和编辑
15+
- 🗄️ 数据库查询
16+
17+
## 开发
18+
19+
```bash
20+
# 安装依赖
21+
npm install
22+
23+
# 启动开发服务器
24+
npm run dev
25+
26+
# 构建生产版本
27+
npm run build
28+
29+
# 预览生产构建
30+
npm run preview
31+
```
32+
33+
## 技术栈
34+
35+
- **Vue 3** - 渐进式 JavaScript 框架
36+
- **Vite** - 下一代前端构建工具
37+
- **Tailwind CSS** - 实用优先的 CSS 框架
38+
- **Vue Router** - 官方路由管理
39+
- **Pinia** - Vue 3 状态管理
40+
- **Axios** - HTTP 客户端
41+
42+
## 项目结构
43+
44+
```
45+
drpy-node-admin/
46+
├── src/
47+
│ ├── api/ # API 接口
48+
│ ├── components/ # 公共组件
49+
│ ├── router/ # 路由配置
50+
│ ├── stores/ # Pinia 状态管理
51+
│ ├── utils/ # 工具函数
52+
│ ├── views/ # 页面组件
53+
│ ├── App.vue # 根组件
54+
│ ├── main.js # 入口文件
55+
│ └── style.css # 全局样式
56+
├── public/ # 静态资源
57+
├── index.html # HTML 模板
58+
├── vite.config.js # Vite 配置
59+
├── tailwind.config.js # Tailwind 配置
60+
└── package.json # 项目配置
61+
```
62+
63+
## 与 drpy-node 集成
64+
65+
Admin 面板通过 drpy-node-mcp 与主项目通信,需要后端提供相应的 API 接口。
66+
67+
## License
68+
69+
MIT

drpy-node-admin/index.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!DOCTYPE html>
2+
<html lang="zh-CN">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>DRPY Node Admin</title>
7+
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
8+
</head>
9+
<body class="bg-gray-50 dark:bg-gray-900">
10+
<div id="app"></div>
11+
<script type="module" src="/src/main.js"></script>
12+
</body>
13+
</html>

0 commit comments

Comments
 (0)