From 6daea9a5a185dcc291f3307cbef2bac72dca6cd2 Mon Sep 17 00:00:00 2001 From: Wonder Date: Sun, 5 Oct 2025 18:12:51 +0800 Subject: [PATCH] =?UTF-8?q?=20=F0=9F=94=84Update:=20T3/=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E5=88=9D=E6=AD=A5=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/package-lock.json | 7 + frontend/package.json | 1 + frontend/src/App.vue | 79 ++++- frontend/src/assets/main.css | 139 +++++++-- frontend/src/components/ChatPanel.vue | 386 ++++++++++++++++++++++++ frontend/src/components/ConfigPanel.vue | 369 ++++++++++++++++++++++ frontend/src/main.js | 6 +- frontend/src/utils/encryption.js | 36 +++ 8 files changed, 993 insertions(+), 30 deletions(-) create mode 100644 frontend/src/components/ChatPanel.vue create mode 100644 frontend/src/components/ConfigPanel.vue create mode 100644 frontend/src/utils/encryption.js diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 978f918..5ee32d9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,6 +8,7 @@ "name": "frontend", "version": "0.0.0", "dependencies": { + "crypto-js": "^4.2.0", "vue": "^3.5.22" }, "devDependencies": { @@ -1686,6 +1687,12 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", diff --git a/frontend/package.json b/frontend/package.json index f764a6a..6e8152a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,6 +12,7 @@ "preview": "vite preview" }, "dependencies": { + "crypto-js": "^4.2.0", "vue": "^3.5.22" }, "devDependencies": { diff --git a/frontend/src/App.vue b/frontend/src/App.vue index af9fa97..e3fff03 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,3 +1,80 @@ \ No newline at end of file +
+ +
+

厂商配置

+ +
+ + +
+

AI 对话

+ +
+
+ + + + + + \ No newline at end of file diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css index 67f3a04..41ec21e 100644 --- a/frontend/src/assets/main.css +++ b/frontend/src/assets/main.css @@ -1,34 +1,117 @@ - -#app { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - font-weight: normal; +/* 全局样式 */ +* { + box-sizing: border-box; } -a, -.green { - text-decoration: none; - color: hsla(160, 100%, 37%, 1); - transition: 0.4s; - padding: 3px; +body { + margin: 0; + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-color: #f5f7fa; + color: #333; } -@media (hover: hover) { - a:hover { - background-color: hsla(160, 100%, 37%, 0.2); +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} + +/* 重置默认样式 */ +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +/* 表单样式 */ +.form-group { + margin-bottom: 1rem; +} + +.form-group label { + display: block; + margin-bottom: 0.5rem; + font-weight: 600; +} + +.form-group input, +.form-group select, +.form-group textarea { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ced4da; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +.form-group input:focus, +.form-group select:focus, +.form-group textarea:focus { + color: #212529; + background-color: #fff; + border-color: #86b7fe; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} + +/* 按钮样式 */ +.btn { + display: inline-block; + font-weight: 400; + text-align: center; + vertical-align: middle; + cursor: pointer; + user-select: none; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + line-height: 1.5; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} + +.btn-primary { + color: #fff; + background-color: #007bff; + border-color: #007bff; +} + +.btn-primary:hover { + color: #fff; + background-color: #0069d9; + border-color: #0062cc; +} + +.btn-primary:disabled { + color: #fff; + background-color: #6c757d; + border-color: #6c757d; +} + +/* 响应式设计 */ +@media (max-width: 768px) { + .app-container { + padding: 10px; } -} - -@media (min-width: 1024px) { - body { - display: flex; - place-items: center; + + .app-main { + grid-template-columns: 1fr; } - - #app { - display: grid; - grid-template-columns: 1fr 1fr; - padding: 0 2rem; - } -} +} \ No newline at end of file diff --git a/frontend/src/components/ChatPanel.vue b/frontend/src/components/ChatPanel.vue new file mode 100644 index 0000000..e0ce462 --- /dev/null +++ b/frontend/src/components/ChatPanel.vue @@ -0,0 +1,386 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/components/ConfigPanel.vue b/frontend/src/components/ConfigPanel.vue new file mode 100644 index 0000000..449d32a --- /dev/null +++ b/frontend/src/components/ConfigPanel.vue @@ -0,0 +1,369 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/main.js b/frontend/src/main.js index 0ac3a5f..26c68d2 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -2,5 +2,9 @@ import './assets/main.css' import { createApp } from 'vue' import App from './App.vue' +import CryptoJS from 'crypto-js' -createApp(App).mount('#app') +// 将CryptoJS挂载到全局,供组件使用 +const app = createApp(App) +app.config.globalProperties.$crypto = CryptoJS +app.mount('#app') diff --git a/frontend/src/utils/encryption.js b/frontend/src/utils/encryption.js new file mode 100644 index 0000000..62367d1 --- /dev/null +++ b/frontend/src/utils/encryption.js @@ -0,0 +1,36 @@ +// AES-256 加密/解密工具 +// 注意:这是一个简化版本,实际生产环境应使用更安全的加密库 + +import CryptoJS from 'crypto-js' + +// 密钥(在实际应用中应使用更安全的方式管理) +const SECRET_KEY = 'ai-api-tool-secret-key-2025' + +/** + * 加密函数 + * @param {string} text - 要加密的文本 + * @returns {string} - 加密后的文本 + */ +export function encrypt(text) { + try { + return CryptoJS.AES.encrypt(text, SECRET_KEY).toString() + } catch (error) { + console.error('加密失败:', error) + throw new Error('加密失败') + } +} + +/** + * 解密函数 + * @param {string} encryptedText - 要解密的文本 + * @returns {string} - 解密后的文本 + */ +export function decrypt(encryptedText) { + try { + const bytes = CryptoJS.AES.decrypt(encryptedText, SECRET_KEY) + return bytes.toString(CryptoJS.enc.Utf8) + } catch (error) { + console.error('解密失败:', error) + throw new Error('解密失败') + } +} \ No newline at end of file