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 }  // 添加当前消息
         ];