From 0df1343d6aca2ff85fb56e0141f66096832e936c Mon Sep 17 00:00:00 2001 From: Ubuntu <phyer@sina.com> Date: Mon, 17 Mar 2025 17:48:25 +0800 Subject: [PATCH] merge --- Dockerfile | 29 +++++++++++ myrari/deployment.yaml | 45 +++++++++++++++++ myrari/service.yaml | 16 +++++++ public/images/law.jpg | Bin 0 -> 13278 bytes public/index.html | 106 ++++++++++++++++++++++++++++++++++++----- server.js | 2 +- 6 files changed, 186 insertions(+), 12 deletions(-) create mode 100644 Dockerfile create mode 100644 myrari/deployment.yaml create mode 100644 myrari/service.yaml create mode 100644 public/images/law.jpg diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4ed214f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +# Use official Node.js LTS image +FROM node:18-alpine + +# Set working directory +WORKDIR /app + +# Copy package files +COPY package*.json ./ + +# Install dependencies +RUN npm install + +# Copy application files +COPY public/images ./public/images +COPY . . + +# Expose the application port +EXPOSE 3000 + +# Set environment variables +ENV NODE_ENV=production + +# Health check endpoint +HEALTHCHECK --interval=30s --timeout=10s --start-period=5s \ + CMD curl -f http://localhost:3000/ || exit 1 + +# Run the application +CMD ["node", "server.js"] + diff --git a/myrari/deployment.yaml b/myrari/deployment.yaml new file mode 100644 index 0000000..da79451 --- /dev/null +++ b/myrari/deployment.yaml @@ -0,0 +1,45 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: myfari-app + namespace: farui + labels: + app: myfari +spec: + replicas: 3 + selector: + matchLabels: + app: myfari + template: + metadata: + labels: + app: myfari + spec: + containers: + - name: myfari + image: localhost:32000/public/myfari:v03 + ports: + - containerPort: 3000 + env: + - name: NODE_ENV + value: "production" + resources: + requests: + cpu: "100m" + memory: "128Mi" + limits: + cpu: "500m" + memory: "512Mi" + livenessProbe: + httpGet: + path: / + port: 3000 + initialDelaySeconds: 30 + periodSeconds: 10 + readinessProbe: + httpGet: + path: /ready + port: 3000 + initialDelaySeconds: 5 + periodSeconds: 5 + diff --git a/myrari/service.yaml b/myrari/service.yaml new file mode 100644 index 0000000..75c6c43 --- /dev/null +++ b/myrari/service.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Service +metadata: + name: myfari-service + namespace: farui + labels: + app: myfari +spec: + selector: + app: myfari + ports: + - protocol: TCP + port: 80 + targetPort: 3000 + type: ClusterIP + diff --git a/public/images/law.jpg b/public/images/law.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1aeddd779d35c6699b28c15b9e63e013b9ab8eb2 GIT binary patch literal 13278 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 GM*bfUaDwpw literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html index edc94ca..4b7eebd 100644 --- a/public/index.html +++ b/public/index.html @@ -3,8 +3,21 @@ <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Chat API</title> + <title>我的通义法睿</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" /> + <style> + .header-logo { + position: absolute; + top: 20px; + left: 20px; + width: 40px; + height: 40px; + z-index: 1000; + } + </style> +</head> +<body> + <img src="images/law.jpg" alt="Logo" class="header-logo"> <style> body { font-family: Arial, sans-serif; @@ -13,6 +26,7 @@ height: 100vh; display: flex; flex-direction: column; + position: relative; } .chat-container { flex: 1; @@ -41,6 +55,8 @@ background: #f5f5f5; position: sticky; bottom: 0; + display: flex; + align-items: center; } textarea { width: calc(100% - 90px); @@ -49,18 +65,19 @@ border: 1px solid #ddd; border-radius: 4px; resize: none; + margin-right: 10px; } button { - width: 40px; - height: 40px; - margin-left: 10px; + width: 20px; + height: 20px; + margin: 10px; background: #007bff; color: white; border: none; border-radius: 50%; cursor: pointer; opacity: 0.7; - transition: opacity 0.2s; + transition: opacity 0.2s, background-color 0.2s; display: flex; align-items: center; justify-content: center; @@ -68,28 +85,75 @@ button:hover { opacity: 1; } + button i { + font-size: 10px; + } + button:disabled { + background: #cccccc; + cursor: not-allowed; + opacity: 0.7; + } .message { - max-width: 70%; - margin-bottom: 15px; + width: 100%; + margin-bottom: 35px; padding: 10px; border-radius: 8px; position: relative; + box-sizing: border-box; + } + .user-message { + text-align: right; + } + .user-message div { + font-weight: bold; /* 加粗 */ + font-style: italic; /* 斜体 */ + display: inline-block; /* 确保文本块行为正常 */ + } + .bot-message { + text-align: left; } .copy-btn { position: absolute; right: 10px; bottom: -20px; + width: 40px; + height: 40px; background: none; border: none; cursor: pointer; color: #007bff; - font-size: 16px; + font-size: 20px; opacity: 0.7; transition: opacity 0.2s; padding: 0; display: flex; align-items: center; justify-content: center; + margin: 0; + } + .loading-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.3); + display: none; + justify-content: center; + align-items: center; + z-index: 1000; + } + .spinner { + width: 40px; + height: 40px; + border: 4px solid #f3f3f3; + border-top: 4px solid #007bff; + border-radius: 50%; + animation: spin 1s linear infinite; + } + @keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } } </style> </head> @@ -98,13 +162,15 @@ <div class="message-container" id="messageContainer"></div> <div class="input-container"> <textarea id="messageInput" placeholder="请输入您的问题..."></textarea> - <button onclick="sendMessage()" title="发送"><i class="fas fa-paper-plane"></i></button> - <button onclick="clearHistory()" style="margin-left: 10px; background-color: #ff4d4f;" title="清空历史"><i class="fas fa-trash-alt"></i></button> + <button id="sendButton" onclick="sendMessage()" title="发送"><i class="fas fa-paper-plane"></i></button> + <button onclick="clearHistory()" style="background-color: #ff4d4f;" title="清空历史"><i class="fas fa-trash-alt"></i></button> </div> </div> + <div class="loading-overlay" id="loadingOverlay"> + <div class="spinner"></div> + </div> <script> - // 维护对话历史 let conversationHistory = []; function formatMarkdown(text) { @@ -119,12 +185,20 @@ async function sendMessage() { const message = document.getElementById('messageInput').value; const messageContainer = document.getElementById('messageContainer'); + const sendButton = document.getElementById('sendButton'); + const loadingOverlay = document.getElementById('loadingOverlay'); if (!message) { alert('请输入消息'); return; } +<<<<<<< HEAD +======= + loadingOverlay.style.display = 'flex'; + sendButton.disabled = true; + +>>>>>>> 19980d6 (update prompt) const userMessageDiv = document.createElement('div'); userMessageDiv.className = 'message user-message'; userMessageDiv.innerHTML = ` @@ -153,6 +227,10 @@ botMessageDiv.className = 'message bot-message'; botMessageDiv.innerHTML = ` <div>${formattedText}</div> +<<<<<<< HEAD +======= + <button class="copy-btn" onclick="copyText(this)" title="复制"><i class="fas fa-copy"></i></button> +>>>>>>> 19980d6 (update prompt) `; messageContainer.appendChild(botMessageDiv); @@ -169,6 +247,9 @@ errorMessageDiv.className = 'message bot-message'; errorMessageDiv.textContent = '网络错误,请检查连接'; messageContainer.appendChild(errorMessageDiv); + } finally { + loadingOverlay.style.display = 'none'; + sendButton.disabled = false; } document.getElementById('messageInput').value = ''; @@ -190,6 +271,9 @@ </script> </body> </html> +<<<<<<< HEAD +======= +>>>>>>> 19980d6 (update prompt) diff --git a/server.js b/server.js index 586d7e3..b7b3e00 100644 --- a/server.js +++ b/server.js @@ -18,7 +18,7 @@ app.post('/api/chat', async (req, res) => { // 构建消息数组,包含系统提示、历史对话和当前消息 const messages = [ - { role: "system", content: "You are a helpful assistant." }, + { role: "system", content: "You are a senior legal expert and lawyer on domestic legal issues in mainland China. Provide clear, concise, and structured responses based on relevant laws and regulations. Use bullet points, numbered lists, or tables when appropriate. Cite cases from the case library when necessary." }, ...(history || []), // 添加历史对话 { role: "user", content: message } // 添加当前消息 ];