mr-sliy 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +145 -0
- package/database/schema.sql +187 -0
- package/package.json +74 -0
- package/scripts/download-tree-sitter.js +171 -0
- package/scripts/postinstall.js +134 -0
- package/src/agent/agent.js +563 -0
- package/src/agent.js +87 -0
- package/src/cli/index.js +1643 -0
- package/src/config/index.js +232 -0
- package/src/engine/dualModeEngine.js +486 -0
- package/src/index.js +165 -0
- package/src/middlewares/errorHandler.js +166 -0
- package/src/middlewares/index.js +23 -0
- package/src/routes/aiRoutes.js +117 -0
- package/src/routes/configRoutes.js +31 -0
- package/src/routes/index.js +75 -0
- package/src/routes/issueRoutes.js +195 -0
- package/src/routes/projectRoutes.js +46 -0
- package/src/routes/reportRoutes.js +40 -0
- package/src/routes/scanRoutes.js +245 -0
- package/src/routes/userRoutes.js +47 -0
- package/src/services/ast/parser.js +503 -0
- package/src/services/detection/detector.js +934 -0
- package/src/services/llm/providers.js +1107 -0
- package/src/services/rag/agent.js +375 -0
- package/src/services/vector/knowledgeBase.js +863 -0
- package/src/skills/Skill.js +38 -0
- package/src/skills/code-analysis/index.js +272 -0
- package/src/skills/code-detection/index.js +166 -0
- package/src/skills/code-detection/rules/console-log.js +45 -0
- package/src/skills/code-detection/rules/deep-nesting.js +76 -0
- package/src/skills/code-detection/rules/duplicate-code.js +57 -0
- package/src/skills/code-detection/rules/high-complexity.js +109 -0
- package/src/skills/code-detection/rules/index.js +59 -0
- package/src/skills/code-detection/rules/long-functions.js +54 -0
- package/src/skills/code-detection/rules/magic-numbers.js +48 -0
- package/src/skills/code-detection/rules/missing-comment.js +64 -0
- package/src/skills/code-detection/rules/null-check.js +71 -0
- package/src/skills/code-detection/rules/unnecessary-else.js +46 -0
- package/src/skills/code-detection/rules/unused-functions.js +57 -0
- package/src/skills/code-detection/rules/unused-imports.js +57 -0
- package/src/skills/code-detection/rules/unused-variables.js +54 -0
- package/src/skills/code-optimization/index.js +319 -0
- package/src/skills/index.js +152 -0
- package/src/utils/crypto.js +212 -0
- package/src/utils/database.js +125 -0
- package/src/utils/helpers.js +226 -0
- package/src/utils/logger.js +202 -0
- package/src/utils/mysql.js +198 -0
- package/src/utils/response.js +124 -0
package/src/index.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express应用主文件
|
|
3
|
+
* 创建并配置Express服务器
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const express = require('express');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { config, validate } = require('./config');
|
|
9
|
+
const { logger, requestLogger } = require('./utils/logger');
|
|
10
|
+
const { closeDatabase } = require('./utils/database');
|
|
11
|
+
const {
|
|
12
|
+
securityMiddleware,
|
|
13
|
+
corsMiddleware,
|
|
14
|
+
rateLimitMiddleware,
|
|
15
|
+
bodyParserMiddleware,
|
|
16
|
+
errorHandler,
|
|
17
|
+
notFoundHandler
|
|
18
|
+
} = require('./middlewares');
|
|
19
|
+
|
|
20
|
+
// 导入路由
|
|
21
|
+
const routes = require('./routes');
|
|
22
|
+
|
|
23
|
+
// 创建Express应用
|
|
24
|
+
const app = express();
|
|
25
|
+
|
|
26
|
+
// 验证配置
|
|
27
|
+
if (!validate()) {
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ============================================
|
|
32
|
+
// 配置中间件
|
|
33
|
+
// ============================================
|
|
34
|
+
|
|
35
|
+
// 安全中间件
|
|
36
|
+
app.use(securityMiddleware);
|
|
37
|
+
|
|
38
|
+
// CORS中间件
|
|
39
|
+
app.use(corsMiddleware);
|
|
40
|
+
|
|
41
|
+
// 请求体解析中间件
|
|
42
|
+
app.use(bodyParserMiddleware);
|
|
43
|
+
|
|
44
|
+
// 请求日志中间件
|
|
45
|
+
app.use(requestLogger);
|
|
46
|
+
|
|
47
|
+
// 静态文件服务(用于报告文件)
|
|
48
|
+
const reportsDir = path.join(__dirname, '..', 'reports');
|
|
49
|
+
app.use('/reports', express.static(reportsDir));
|
|
50
|
+
|
|
51
|
+
// ============================================
|
|
52
|
+
// API路由
|
|
53
|
+
// ============================================
|
|
54
|
+
|
|
55
|
+
// API路由前缀
|
|
56
|
+
app.use('/api', rateLimitMiddleware);
|
|
57
|
+
|
|
58
|
+
// 注册业务路由
|
|
59
|
+
app.use('/api', routes);
|
|
60
|
+
|
|
61
|
+
// 健康检查路由
|
|
62
|
+
app.get('/health', (req, res) => {
|
|
63
|
+
res.json({
|
|
64
|
+
success: true,
|
|
65
|
+
code: 200,
|
|
66
|
+
message: '服务运行正常',
|
|
67
|
+
data: {
|
|
68
|
+
status: 'healthy',
|
|
69
|
+
mode: config.defaultMode,
|
|
70
|
+
timestamp: new Date().toISOString()
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// 根路由
|
|
76
|
+
app.get('/', (req, res) => {
|
|
77
|
+
res.json({
|
|
78
|
+
success: true,
|
|
79
|
+
code: 200,
|
|
80
|
+
message: '代码优化智能体API服务',
|
|
81
|
+
data: {
|
|
82
|
+
name: 'Code Optimizer Agent',
|
|
83
|
+
version: '1.0.0',
|
|
84
|
+
description: '基于Tree-sitter与RAG的多语言代码优化智能体',
|
|
85
|
+
endpoints: {
|
|
86
|
+
health: '/health',
|
|
87
|
+
api: '/api',
|
|
88
|
+
docs: '/api/docs'
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// ============================================
|
|
95
|
+
// 错误处理
|
|
96
|
+
// ============================================
|
|
97
|
+
|
|
98
|
+
// 404处理
|
|
99
|
+
app.use(notFoundHandler);
|
|
100
|
+
|
|
101
|
+
// 全局错误处理
|
|
102
|
+
app.use(errorHandler);
|
|
103
|
+
|
|
104
|
+
// ============================================
|
|
105
|
+
// 启动服务器
|
|
106
|
+
// ============================================
|
|
107
|
+
|
|
108
|
+
const PORT = config.server.port;
|
|
109
|
+
const HOST = config.server.host;
|
|
110
|
+
|
|
111
|
+
// 启动HTTP服务器
|
|
112
|
+
const server = app.listen(PORT, HOST, () => {
|
|
113
|
+
logger.info(`服务器启动成功: http://${HOST}:${PORT}`);
|
|
114
|
+
logger.info(`运行模式: ${config.defaultMode}`);
|
|
115
|
+
logger.info(`环境: ${config.server.nodeEnv}`);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// ============================================
|
|
119
|
+
// 进程事件处理
|
|
120
|
+
// ============================================
|
|
121
|
+
|
|
122
|
+
// 优雅关闭
|
|
123
|
+
process.on('SIGTERM', gracefulShutdown);
|
|
124
|
+
process.on('SIGINT', gracefulShutdown);
|
|
125
|
+
|
|
126
|
+
// 未捕获异常处理
|
|
127
|
+
process.on('uncaughtException', (err) => {
|
|
128
|
+
logger.error('未捕获异常:', err);
|
|
129
|
+
gracefulShutdown();
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// 未处理的Promise拒绝
|
|
133
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
134
|
+
logger.error('未处理的Promise拒绝:', reason);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 优雅关闭函数
|
|
139
|
+
*/
|
|
140
|
+
function gracefulShutdown() {
|
|
141
|
+
logger.info('正在关闭服务器...');
|
|
142
|
+
|
|
143
|
+
server.close((err) => {
|
|
144
|
+
if (err) {
|
|
145
|
+
logger.error('关闭服务器失败:', err);
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
logger.info('服务器已关闭');
|
|
150
|
+
|
|
151
|
+
// 关闭数据库连接
|
|
152
|
+
closeDatabase();
|
|
153
|
+
|
|
154
|
+
process.exit(0);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// 强制关闭超时
|
|
158
|
+
setTimeout(() => {
|
|
159
|
+
logger.error('强制关闭服务器');
|
|
160
|
+
closeDatabase();
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}, 10000);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
module.exports = app;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Express中间件模块
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const helmet = require('helmet');
|
|
6
|
+
const cors = require('cors');
|
|
7
|
+
const rateLimit = require('express-rate-limit');
|
|
8
|
+
const { config } = require('../config');
|
|
9
|
+
const { logger } = require('../utils/logger');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 安全中间件配置
|
|
13
|
+
*/
|
|
14
|
+
const securityMiddleware = [
|
|
15
|
+
// Helmet安全头
|
|
16
|
+
helmet({
|
|
17
|
+
contentSecurityPolicy: {
|
|
18
|
+
directives: {
|
|
19
|
+
defaultSrc: ["'self'"],
|
|
20
|
+
styleSrc: ["'self'", "'unsafe-inline'"],
|
|
21
|
+
scriptSrc: ["'self'"],
|
|
22
|
+
imgSrc: ["'self'", 'data:', 'https:'],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
crossOriginEmbedderPolicy: false,
|
|
26
|
+
}),
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* CORS中间件配置
|
|
31
|
+
*/
|
|
32
|
+
const corsMiddleware = cors({
|
|
33
|
+
origin: config.cors.origins,
|
|
34
|
+
credentials: config.cors.credentials,
|
|
35
|
+
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
|
|
36
|
+
allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'],
|
|
37
|
+
exposedHeaders: ['X-Total-Count', 'X-Page-Size'],
|
|
38
|
+
maxAge: 86400, // 24小时
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 速率限制中间件
|
|
43
|
+
*/
|
|
44
|
+
const rateLimitMiddleware = rateLimit({
|
|
45
|
+
windowMs: config.rateLimit.windowMs,
|
|
46
|
+
max: config.rateLimit.max,
|
|
47
|
+
message: {
|
|
48
|
+
success: false,
|
|
49
|
+
code: 429,
|
|
50
|
+
message: '请求过于频繁,请稍后再试',
|
|
51
|
+
timestamp: new Date().toISOString()
|
|
52
|
+
},
|
|
53
|
+
standardHeaders: true,
|
|
54
|
+
legacyHeaders: false,
|
|
55
|
+
handler: (req, res, next, options) => {
|
|
56
|
+
logger.warn(`速率限制触发: ${req.ip} - ${req.method} ${req.url}`);
|
|
57
|
+
res.status(429).json(options.message);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 请求体解析中间件
|
|
63
|
+
*/
|
|
64
|
+
const bodyParserMiddleware = [
|
|
65
|
+
// JSON解析
|
|
66
|
+
require('express').json({
|
|
67
|
+
limit: '10mb',
|
|
68
|
+
strict: true,
|
|
69
|
+
}),
|
|
70
|
+
// URL编码解析
|
|
71
|
+
require('express').urlencoded({
|
|
72
|
+
extended: true,
|
|
73
|
+
limit: '10mb',
|
|
74
|
+
}),
|
|
75
|
+
];
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 错误处理中间件
|
|
79
|
+
*/
|
|
80
|
+
function errorHandler(err, req, res, next) {
|
|
81
|
+
logger.error('错误处理中间件捕获:', err);
|
|
82
|
+
|
|
83
|
+
// JWT错误
|
|
84
|
+
if (err.name === 'UnauthorizedError') {
|
|
85
|
+
return res.status(401).json({
|
|
86
|
+
success: false,
|
|
87
|
+
code: 401,
|
|
88
|
+
message: '无效的认证令牌',
|
|
89
|
+
timestamp: new Date().toISOString()
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// 验证错误
|
|
94
|
+
if (err.name === 'ValidationError') {
|
|
95
|
+
return res.status(400).json({
|
|
96
|
+
success: false,
|
|
97
|
+
code: 400,
|
|
98
|
+
message: '参数验证失败',
|
|
99
|
+
errors: err.errors,
|
|
100
|
+
timestamp: new Date().toISOString()
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// 语法错误
|
|
105
|
+
if (err instanceof SyntaxError && err.status === 400 && 'body' in err) {
|
|
106
|
+
return res.status(400).json({
|
|
107
|
+
success: false,
|
|
108
|
+
code: 400,
|
|
109
|
+
message: 'JSON解析错误',
|
|
110
|
+
timestamp: new Date().toISOString()
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// 数据库错误
|
|
115
|
+
if (err.code === 'SQLITE_CONSTRAINT') {
|
|
116
|
+
return res.status(400).json({
|
|
117
|
+
success: false,
|
|
118
|
+
code: 400,
|
|
119
|
+
message: '数据约束冲突',
|
|
120
|
+
timestamp: new Date().toISOString()
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// 默认错误
|
|
125
|
+
const statusCode = err.status || err.statusCode || 500;
|
|
126
|
+
const message = err.message || '服务器内部错误';
|
|
127
|
+
|
|
128
|
+
res.status(statusCode).json({
|
|
129
|
+
success: false,
|
|
130
|
+
code: statusCode,
|
|
131
|
+
message,
|
|
132
|
+
errors: config.server.nodeEnv === 'development' ? err.stack : undefined,
|
|
133
|
+
timestamp: new Date().toISOString()
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* 404处理中间件
|
|
139
|
+
*/
|
|
140
|
+
function notFoundHandler(req, res, next) {
|
|
141
|
+
res.status(404).json({
|
|
142
|
+
success: false,
|
|
143
|
+
code: 404,
|
|
144
|
+
message: `路由未找到: ${req.method} ${req.url}`,
|
|
145
|
+
timestamp: new Date().toISOString()
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* 异步错误捕获包装器
|
|
151
|
+
*/
|
|
152
|
+
function asyncHandler(fn) {
|
|
153
|
+
return (req, res, next) => {
|
|
154
|
+
Promise.resolve(fn(req, res, next)).catch(next);
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
module.exports = {
|
|
159
|
+
securityMiddleware,
|
|
160
|
+
corsMiddleware,
|
|
161
|
+
rateLimitMiddleware,
|
|
162
|
+
bodyParserMiddleware,
|
|
163
|
+
errorHandler,
|
|
164
|
+
notFoundHandler,
|
|
165
|
+
asyncHandler
|
|
166
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 中间件导出模块
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const {
|
|
6
|
+
securityMiddleware,
|
|
7
|
+
corsMiddleware,
|
|
8
|
+
rateLimitMiddleware,
|
|
9
|
+
bodyParserMiddleware,
|
|
10
|
+
errorHandler,
|
|
11
|
+
notFoundHandler,
|
|
12
|
+
asyncHandler
|
|
13
|
+
} = require('./errorHandler');
|
|
14
|
+
|
|
15
|
+
module.exports = {
|
|
16
|
+
securityMiddleware,
|
|
17
|
+
corsMiddleware,
|
|
18
|
+
rateLimitMiddleware,
|
|
19
|
+
bodyParserMiddleware,
|
|
20
|
+
errorHandler,
|
|
21
|
+
notFoundHandler,
|
|
22
|
+
asyncHandler
|
|
23
|
+
};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI优化路由模块
|
|
3
|
+
* 处理AI代码优化相关请求
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const express = require('express');
|
|
7
|
+
const router = express.Router();
|
|
8
|
+
const { optimizeWithRAG } = require('../services/rag/agent');
|
|
9
|
+
const { success, error } = require('../utils/response');
|
|
10
|
+
const { logger } = require('../utils/logger');
|
|
11
|
+
const { getFileLanguage } = require('../utils/helpers');
|
|
12
|
+
const { isOnlineMode } = require('../config');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* AI优化代码片段
|
|
16
|
+
*/
|
|
17
|
+
router.post('/optimize', async (req, res) => {
|
|
18
|
+
const startTime = Date.now();
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const { code, filePath, language, issueType, message } = req.body;
|
|
22
|
+
|
|
23
|
+
if (!code) {
|
|
24
|
+
return res.status(400).json(error('缺少代码片段', 400));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// 检查是否为在线模式
|
|
28
|
+
if (!isOnlineMode()) {
|
|
29
|
+
return res.json(error('当前为离线模式,无法使用AI优化功能'));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// 构建issue对象
|
|
33
|
+
const issue = {
|
|
34
|
+
id: null,
|
|
35
|
+
codeSnippet: code
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// 构建上下文
|
|
39
|
+
const context = {
|
|
40
|
+
language: language || getFileLanguage(filePath || 'unknown.js'),
|
|
41
|
+
issueType: issueType || 'general',
|
|
42
|
+
message: message || '优化建议',
|
|
43
|
+
taskId: null
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// 执行RAG优化
|
|
47
|
+
const result = await optimizeWithRAG(issue, context);
|
|
48
|
+
|
|
49
|
+
if (!result.success) {
|
|
50
|
+
return res.json(error(result.message));
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
logger.info('AI优化完成');
|
|
54
|
+
|
|
55
|
+
return res.json(success({
|
|
56
|
+
optimizationId: result.optimizationId,
|
|
57
|
+
optimizedCode: result.optimizedCode,
|
|
58
|
+
explanation: result.explanation,
|
|
59
|
+
suggestions: result.suggestions,
|
|
60
|
+
similarSnippets: result.similarSnippets,
|
|
61
|
+
tokensUsed: result.tokensUsed,
|
|
62
|
+
durationMs: Date.now() - startTime
|
|
63
|
+
}));
|
|
64
|
+
} catch (err) {
|
|
65
|
+
logger.error('AI优化失败:', err);
|
|
66
|
+
return res.status(500).json(error(err.message));
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 获取优化历史
|
|
72
|
+
*/
|
|
73
|
+
router.get('/history', (req, res) => {
|
|
74
|
+
try {
|
|
75
|
+
const limit = parseInt(req.query.limit) || 10;
|
|
76
|
+
const { getOptimizationHistory } = require('../services/rag/agent');
|
|
77
|
+
const history = getOptimizationHistory(limit);
|
|
78
|
+
|
|
79
|
+
return res.json(success({
|
|
80
|
+
total: history.length,
|
|
81
|
+
history
|
|
82
|
+
}));
|
|
83
|
+
} catch (err) {
|
|
84
|
+
logger.error('获取优化历史失败:', err);
|
|
85
|
+
return res.status(500).json(error(err.message));
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* 应用优化建议
|
|
91
|
+
*/
|
|
92
|
+
router.post('/apply', async (req, res) => {
|
|
93
|
+
try {
|
|
94
|
+
const { optimizationId, filePath, originalCode, optimizedCode } = req.body;
|
|
95
|
+
|
|
96
|
+
if (!filePath || !optimizedCode) {
|
|
97
|
+
return res.status(400).json(error('缺少必要参数', 400));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 这里应该实现实际的代码替换逻辑
|
|
101
|
+
// 由于安全考虑,实际应用中应该由前端或IDE插件完成替换
|
|
102
|
+
|
|
103
|
+
logger.info(`优化建议已应用: ${optimizationId}`);
|
|
104
|
+
|
|
105
|
+
return res.json(success({
|
|
106
|
+
optimizationId,
|
|
107
|
+
filePath,
|
|
108
|
+
applied: true,
|
|
109
|
+
message: '优化建议已应用,请在IDE中确认更改'
|
|
110
|
+
}));
|
|
111
|
+
} catch (err) {
|
|
112
|
+
logger.error('应用优化失败:', err);
|
|
113
|
+
return res.status(500).json(error(err.message));
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
module.exports = router;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置路由模块
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
const express = require('express');
|
|
6
|
+
const router = express.Router();
|
|
7
|
+
const { getDatabase } = require('../utils/database');
|
|
8
|
+
const { success, error } = require('../utils/response');
|
|
9
|
+
|
|
10
|
+
router.get('/', (req, res) => {
|
|
11
|
+
try {
|
|
12
|
+
const db = getDatabase();
|
|
13
|
+
const stmt = db.prepare('SELECT config_key, config_value, config_type, description FROM sys_config WHERE is_public = 1');
|
|
14
|
+
const configs = stmt.all();
|
|
15
|
+
|
|
16
|
+
const configMap = {};
|
|
17
|
+
configs.forEach(c => {
|
|
18
|
+
configMap[c.config_key] = {
|
|
19
|
+
value: c.config_value,
|
|
20
|
+
type: c.config_type,
|
|
21
|
+
description: c.description
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
return res.json(success(configMap));
|
|
26
|
+
} catch (err) {
|
|
27
|
+
return res.status(500).json(error(err.message));
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
module.exports = router;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 路由注册模块
|
|
3
|
+
* 统一管理所有API路由
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const express = require('express');
|
|
7
|
+
const router = express.Router();
|
|
8
|
+
|
|
9
|
+
// 导入各业务模块路由
|
|
10
|
+
const userRoutes = require('./userRoutes');
|
|
11
|
+
const configRoutes = require('./configRoutes');
|
|
12
|
+
const projectRoutes = require('./projectRoutes');
|
|
13
|
+
const scanRoutes = require('./scanRoutes');
|
|
14
|
+
const issueRoutes = require('./issueRoutes');
|
|
15
|
+
const aiRoutes = require('./aiRoutes');
|
|
16
|
+
const reportRoutes = require('./reportRoutes');
|
|
17
|
+
|
|
18
|
+
// 注册路由
|
|
19
|
+
router.use('/users', userRoutes);
|
|
20
|
+
router.use('/config', configRoutes);
|
|
21
|
+
router.use('/projects', projectRoutes);
|
|
22
|
+
router.use('/scan', scanRoutes);
|
|
23
|
+
router.use('/issues', issueRoutes);
|
|
24
|
+
router.use('/ai', aiRoutes);
|
|
25
|
+
router.use('/reports', reportRoutes);
|
|
26
|
+
|
|
27
|
+
// API文档路由
|
|
28
|
+
router.get('/docs', (req, res) => {
|
|
29
|
+
res.json({
|
|
30
|
+
success: true,
|
|
31
|
+
code: 200,
|
|
32
|
+
message: 'API文档',
|
|
33
|
+
data: {
|
|
34
|
+
endpoints: {
|
|
35
|
+
users: {
|
|
36
|
+
base: '/api/users',
|
|
37
|
+
methods: ['GET', 'POST', 'PUT', 'DELETE'],
|
|
38
|
+
description: '用户管理'
|
|
39
|
+
},
|
|
40
|
+
config: {
|
|
41
|
+
base: '/api/config',
|
|
42
|
+
methods: ['GET', 'PUT'],
|
|
43
|
+
description: '系统配置'
|
|
44
|
+
},
|
|
45
|
+
projects: {
|
|
46
|
+
base: '/api/projects',
|
|
47
|
+
methods: ['GET', 'POST', 'PUT', 'DELETE'],
|
|
48
|
+
description: '项目管理'
|
|
49
|
+
},
|
|
50
|
+
scan: {
|
|
51
|
+
base: '/api/scan',
|
|
52
|
+
methods: ['POST', 'GET'],
|
|
53
|
+
description: '代码扫描'
|
|
54
|
+
},
|
|
55
|
+
issues: {
|
|
56
|
+
base: '/api/issues',
|
|
57
|
+
methods: ['GET', 'PUT'],
|
|
58
|
+
description: '代码缺陷'
|
|
59
|
+
},
|
|
60
|
+
ai: {
|
|
61
|
+
base: '/api/ai',
|
|
62
|
+
methods: ['POST', 'GET'],
|
|
63
|
+
description: 'AI优化'
|
|
64
|
+
},
|
|
65
|
+
reports: {
|
|
66
|
+
base: '/api/reports',
|
|
67
|
+
methods: ['GET', 'POST'],
|
|
68
|
+
description: '报告管理'
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
module.exports = router;
|