From 8400dbfab9a688df8174d96707cf4c8c79c4b45c Mon Sep 17 00:00:00 2001 From: zguiy <1415466602@qq.com> Date: Sat, 28 Jun 2025 22:38:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=85=B7=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 201 +- package-lock.json | 4250 ++++++++++++++++- package.json | 38 +- postcss.config.js | 6 + public/index.html | 526 ++ server/index.js | 32 + server/routes/api.js | 216 + src/App.vue | 42 +- src/components/BackToTop.vue | 49 + src/components/HelloWorld.vue | 41 - src/components/LanguageToggle.vue | 72 + src/components/ThemeToggle.vue | 68 + src/components/ToolHeader.vue | 23 + src/components/tools/Base64ToImage.vue | 402 ++ .../tools/ChromeBookmarkRecovery.vue | 361 ++ src/components/tools/CodeFormatter.vue | 565 +++ src/components/tools/ColorTools.vue | 461 ++ src/components/tools/CronGenerator.vue | 621 +++ src/components/tools/CryptoTools.vue | 418 ++ src/components/tools/CssGradientGenerator.vue | 332 ++ src/components/tools/DateCalculator.vue | 550 +++ src/components/tools/EncodingConverter.vue | 306 ++ .../tools/HtmlMarkdownConverter.vue | 939 ++++ src/components/tools/HttpTester.vue | 432 ++ src/components/tools/ImageCompressor.vue | 502 ++ src/components/tools/ImageToIco.vue | 838 ++++ src/components/tools/ImageWatermark.vue | 773 +++ src/components/tools/IpLookup.vue | 426 ++ src/components/tools/JsonConverter.vue | 1058 ++++ src/components/tools/JsonEditor.vue | 843 ++++ src/components/tools/JsonFormatter.vue | 847 ++++ src/components/tools/JwtDecoder.vue | 525 ++ src/components/tools/NumberBaseConverter.vue | 464 ++ src/components/tools/QrcodeGenerator.vue | 289 ++ src/components/tools/RegexTester.vue | 404 ++ src/components/tools/TextCounter.vue | 299 ++ src/components/tools/TextSpaceStripper.vue | 711 +++ src/components/tools/TimestampConverter.vue | 256 + src/components/tools/TimezoneConverter.vue | 654 +++ src/components/tools/UnicodeConverter.vue | 323 ++ src/components/tools/UrlEncoder.vue | 341 ++ .../tools/YmlPropertiesConverter.vue | 489 ++ src/composables/useLanguage.ts | 53 + src/composables/useTheme.ts | 55 + src/config/categories.ts | 18 + src/config/i18n/en.ts | 212 + src/config/i18n/index.ts | 23 + src/config/i18n/zh.ts | 663 +++ src/config/tools.ts | 187 + src/main.ts | 47 +- src/router/index.ts | 26 + src/style.css | 371 +- src/types/tools.ts | 65 + src/utils/api.ts | 76 + src/views/HomeView.vue | 248 + src/views/NotFoundView.vue | 41 + src/views/ToolView.vue | 197 + tailwind.config.js | 42 + tsconfig.app.json | 5 + tsconfig.json | 19 +- 60 files changed, 23197 insertions(+), 144 deletions(-) create mode 100644 postcss.config.js create mode 100644 public/index.html create mode 100644 server/index.js create mode 100644 server/routes/api.js create mode 100644 src/components/BackToTop.vue delete mode 100644 src/components/HelloWorld.vue create mode 100644 src/components/LanguageToggle.vue create mode 100644 src/components/ThemeToggle.vue create mode 100644 src/components/ToolHeader.vue create mode 100644 src/components/tools/Base64ToImage.vue create mode 100644 src/components/tools/ChromeBookmarkRecovery.vue create mode 100644 src/components/tools/CodeFormatter.vue create mode 100644 src/components/tools/ColorTools.vue create mode 100644 src/components/tools/CronGenerator.vue create mode 100644 src/components/tools/CryptoTools.vue create mode 100644 src/components/tools/CssGradientGenerator.vue create mode 100644 src/components/tools/DateCalculator.vue create mode 100644 src/components/tools/EncodingConverter.vue create mode 100644 src/components/tools/HtmlMarkdownConverter.vue create mode 100644 src/components/tools/HttpTester.vue create mode 100644 src/components/tools/ImageCompressor.vue create mode 100644 src/components/tools/ImageToIco.vue create mode 100644 src/components/tools/ImageWatermark.vue create mode 100644 src/components/tools/IpLookup.vue create mode 100644 src/components/tools/JsonConverter.vue create mode 100644 src/components/tools/JsonEditor.vue create mode 100644 src/components/tools/JsonFormatter.vue create mode 100644 src/components/tools/JwtDecoder.vue create mode 100644 src/components/tools/NumberBaseConverter.vue create mode 100644 src/components/tools/QrcodeGenerator.vue create mode 100644 src/components/tools/RegexTester.vue create mode 100644 src/components/tools/TextCounter.vue create mode 100644 src/components/tools/TextSpaceStripper.vue create mode 100644 src/components/tools/TimestampConverter.vue create mode 100644 src/components/tools/TimezoneConverter.vue create mode 100644 src/components/tools/UnicodeConverter.vue create mode 100644 src/components/tools/UrlEncoder.vue create mode 100644 src/components/tools/YmlPropertiesConverter.vue create mode 100644 src/composables/useLanguage.ts create mode 100644 src/composables/useTheme.ts create mode 100644 src/config/categories.ts create mode 100644 src/config/i18n/en.ts create mode 100644 src/config/i18n/index.ts create mode 100644 src/config/i18n/zh.ts create mode 100644 src/config/tools.ts create mode 100644 src/router/index.ts create mode 100644 src/types/tools.ts create mode 100644 src/utils/api.ts create mode 100644 src/views/HomeView.vue create mode 100644 src/views/NotFoundView.vue create mode 100644 src/views/ToolView.vue create mode 100644 tailwind.config.js diff --git a/README.md b/README.md index 33895ab..7513769 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,200 @@ -# Vue 3 + TypeScript + Vite +# Vue 工具集 - Vue Tools Kit -This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/server/index.js b/server/index.js new file mode 100644 index 0000000..0362ef1 --- /dev/null +++ b/server/index.js @@ -0,0 +1,32 @@ +const express = require('express') +const cors = require('cors') +const path = require('path') + +const app = express() +const PORT = process.env.PORT || 3001 + +// 中间件 +app.use(cors()) +app.use(express.json()) +app.use(express.urlencoded({ extended: true })) + +// 静态文件服务 +app.use(express.static(path.join(__dirname, '../dist'))) + +// API路由 +app.use('/api', require('./routes/api')) + +// 健康检查 +app.get('/health', (req, res) => { + res.json({ status: 'ok', timestamp: new Date().toISOString() }) +}) + +// 处理Vue Router的历史模式 +app.get('*', (req, res) => { + res.sendFile(path.join(__dirname, '../dist/index.html')) +}) + +// 启动服务器 +app.listen(PORT, () => { + console.log(`服务器运行在 http://localhost:${PORT}`) +}) \ No newline at end of file diff --git a/server/routes/api.js b/server/routes/api.js new file mode 100644 index 0000000..c0e4e98 --- /dev/null +++ b/server/routes/api.js @@ -0,0 +1,216 @@ +const express = require('express') +const router = express.Router() +const { promisify } = require('util') +const { exec } = require('child_process') +const execAsync = promisify(exec) + +// IP查询API +router.get('/ip/:ip?', async (req, res) => { + try { + const ip = req.params.ip || req.ip || req.connection.remoteAddress + + // 如果是IPv6的IPv4映射地址,提取IPv4部分 + const cleanIp = ip.replace(/^::ffff:/, '') + + // 使用免费的IP查询服务 + const fetch = require('node-fetch') + const response = await fetch(`http://ip-api.com/json/${cleanIp}?lang=zh-CN`) + const data = await response.json() + + if (data.status === 'success') { + res.json({ + success: true, + data: { + ip: cleanIp, + country: data.country, + region: data.regionName, + city: data.city, + isp: data.isp, + timezone: data.timezone, + lat: data.lat, + lon: data.lon + } + }) + } else { + res.json({ + success: false, + message: '无法查询该IP地址信息' + }) + } + } catch (error) { + console.error('IP查询错误:', error) + res.status(500).json({ + success: false, + message: '服务器内部错误' + }) + } +}) + +// 获取当前IP +router.get('/myip', (req, res) => { + const ip = req.ip || req.connection.remoteAddress + const cleanIp = ip.replace(/^::ffff:/, '') + + res.json({ + success: true, + data: { + ip: cleanIp + } + }) +}) + +// 代理请求API(用于HTTP测试工具) +router.post('/proxy', async (req, res) => { + try { + const { url, method = 'GET', headers = {}, body } = req.body + + if (!url) { + return res.status(400).json({ + success: false, + message: 'URL参数不能为空' + }) + } + + const fetch = require('node-fetch') + + const options = { + method: method.toUpperCase(), + headers: { + 'User-Agent': 'Vue-Tools-Kit/1.0.0', + ...headers + } + } + + if (body && ['POST', 'PUT', 'PATCH'].includes(options.method)) { + options.body = body + } + + const startTime = Date.now() + const response = await fetch(url, options) + const endTime = Date.now() + + const responseHeaders = {} + for (const [key, value] of response.headers.entries()) { + responseHeaders[key] = value + } + + const responseBody = await response.text() + + res.json({ + success: true, + data: { + status: response.status, + statusText: response.statusText, + headers: responseHeaders, + body: responseBody, + responseTime: endTime - startTime, + url: response.url + } + }) + + } catch (error) { + console.error('代理请求错误:', error) + res.status(500).json({ + success: false, + message: error.message || '请求失败' + }) + } +}) + +// Markdown转换API +router.post('/markdown/convert', (req, res) => { + try { + const { content, type } = req.body + + if (!content) { + return res.status(400).json({ + success: false, + message: '内容不能为空' + }) + } + + if (type === 'html-to-md') { + // HTML转Markdown + const TurndownService = require('turndown') + const turndownService = new TurndownService() + const markdown = turndownService.turndown(content) + + res.json({ + success: true, + data: { result: markdown } + }) + } else if (type === 'md-to-html') { + // Markdown转HTML + const { marked } = require('marked') + const html = marked(content) + + res.json({ + success: true, + data: { result: html } + }) + } else { + res.status(400).json({ + success: false, + message: '不支持的转换类型' + }) + } + + } catch (error) { + console.error('Markdown转换错误:', error) + res.status(500).json({ + success: false, + message: '转换失败: ' + error.message + }) + } +}) + +// 文件格式化API +router.post('/format/code', (req, res) => { + try { + const { content, type } = req.body + + if (!content) { + return res.status(400).json({ + success: false, + message: '内容不能为空' + }) + } + + let formatted = content + + switch (type) { + case 'json': + try { + const parsed = JSON.parse(content) + formatted = JSON.stringify(parsed, null, 2) + } catch (e) { + throw new Error('JSON格式错误') + } + break + + case 'xml': + // 简单的XML格式化 + formatted = content + .replace(/>\n<') + .replace(/^\s*\n/gm, '') + break + + default: + throw new Error('不支持的格式化类型') + } + + res.json({ + success: true, + data: { result: formatted } + }) + + } catch (error) { + console.error('代码格式化错误:', error) + res.status(500).json({ + success: false, + message: error.message || '格式化失败' + }) + } +}) + +module.exports = router \ No newline at end of file diff --git a/src/App.vue b/src/App.vue index 3e63bec..7a5b620 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,30 +1,26 @@ - - + + diff --git a/src/components/BackToTop.vue b/src/components/BackToTop.vue new file mode 100644 index 0000000..4a4a11a --- /dev/null +++ b/src/components/BackToTop.vue @@ -0,0 +1,49 @@ + + + + + \ No newline at end of file diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue deleted file mode 100644 index b58e52b..0000000 --- a/src/components/HelloWorld.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - diff --git a/src/components/LanguageToggle.vue b/src/components/LanguageToggle.vue new file mode 100644 index 0000000..d3c5edd --- /dev/null +++ b/src/components/LanguageToggle.vue @@ -0,0 +1,72 @@ + + + \ No newline at end of file diff --git a/src/components/ThemeToggle.vue b/src/components/ThemeToggle.vue new file mode 100644 index 0000000..cdd6f0f --- /dev/null +++ b/src/components/ThemeToggle.vue @@ -0,0 +1,68 @@ + + + + + \ No newline at end of file diff --git a/src/components/ToolHeader.vue b/src/components/ToolHeader.vue new file mode 100644 index 0000000..c1e0b71 --- /dev/null +++ b/src/components/ToolHeader.vue @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/src/components/tools/Base64ToImage.vue b/src/components/tools/Base64ToImage.vue new file mode 100644 index 0000000..2855009 --- /dev/null +++ b/src/components/tools/Base64ToImage.vue @@ -0,0 +1,402 @@ + + + + + \ No newline at end of file diff --git a/src/components/tools/DateCalculator.vue b/src/components/tools/DateCalculator.vue new file mode 100644 index 0000000..e952f58 --- /dev/null +++ b/src/components/tools/DateCalculator.vue @@ -0,0 +1,550 @@ + + + \ No newline at end of file diff --git a/src/components/tools/EncodingConverter.vue b/src/components/tools/EncodingConverter.vue new file mode 100644 index 0000000..4b1c4d1 --- /dev/null +++ b/src/components/tools/EncodingConverter.vue @@ -0,0 +1,306 @@ +