From 7710abcf9e3e0a1a6495b9ffba3b15535c9fe7d7 Mon Sep 17 00:00:00 2001
From: huang <1724659546@qq.com>
Date: Tue, 30 Sep 2025 23:17:32 +0800
Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=AE=BE=E5=A4=87=E6=A8=A1?=
 =?UTF-8?q?=E6=9D=BF=E7=AE=A1=E7=90=86=E7=95=8C=E9=9D=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
 src/api/deviceTemplate.js             |  53 +++++
 src/api/index.js                      |   2 +
 src/components/DeviceTemplateForm.vue | 282 ++++++++++++++++++++++++++
 src/components/DeviceTemplateList.vue | 178 +++++++++++++++-
 src/services/deviceTemplateService.js |  79 ++++++++
 5 files changed, 592 insertions(+), 2 deletions(-)
 create mode 100644 src/api/deviceTemplate.js
 create mode 100644 src/components/DeviceTemplateForm.vue
 create mode 100644 src/services/deviceTemplateService.js
diff --git a/src/api/deviceTemplate.js b/src/api/deviceTemplate.js
new file mode 100644
index 00000000..109a2708
--- /dev/null
+++ b/src/api/deviceTemplate.js
@@ -0,0 +1,53 @@
+import http from '../utils/http.js';
+
+/**
+ * 设备模板管理API
+ */
+export class DeviceTemplateApi {
+  /**
+   * 获取设备模板列表
+   * @returns {Promise} 设备模板列表
+   */
+  static list() {
+    return http.get('/api/v1/device-templates');
+  }
+
+  /**
+   * 创建新设备模板
+   * @param {Object} deviceTemplateData 设备模板数据
+   * @returns {Promise} 创建结果
+   */
+  static create(deviceTemplateData) {
+    return http.post('/api/v1/device-templates', deviceTemplateData);
+  }
+
+  /**
+   * 获取设备模板详情
+   * @param {string|number} id 设备模板ID
+   * @returns {Promise} 设备模板详情
+   */
+  static get(id) {
+    return http.get(`/api/v1/device-templates/${id}`);
+  }
+
+  /**
+   * 更新设备模板信息
+   * @param {string|number} id 设备模板ID
+   * @param {Object} deviceTemplateData 设备模板数据
+   * @returns {Promise} 更新结果
+   */
+  static update(id, deviceTemplateData) {
+    return http.put(`/api/v1/device-templates/${id}`, deviceTemplateData);
+  }
+
+  /**
+   * 删除设备模板
+   * @param {string|number} id 设备模板ID
+   * @returns {Promise} 删除结果
+   */
+  static delete(id) {
+    return http.delete(`/api/v1/device-templates/${id}`);
+  }
+}
+
+export default DeviceTemplateApi;
\ No newline at end of file
diff --git a/src/api/index.js b/src/api/index.js
index 1a529417..eacb715a 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -1,6 +1,7 @@
 import { AreaControllerApi, DeviceApi } from './device.js';
 import PlanApi from './plan.js';
 import UserApi from './user.js';
+import DeviceTemplateApi from './deviceTemplate.js'; // 导入设备模板API
 
 /**
  * API客户端
@@ -11,6 +12,7 @@ export class ApiClient {
     this.devices = DeviceApi;
     this.plans = PlanApi;
     this.users = UserApi;
+    this.deviceTemplates = DeviceTemplateApi; // 添加设备模板API
   }
 }
 
diff --git a/src/components/DeviceTemplateForm.vue b/src/components/DeviceTemplateForm.vue
new file mode 100644
index 00000000..ff499855
--- /dev/null
+++ b/src/components/DeviceTemplateForm.vue
@@ -0,0 +1,282 @@
+
+  
+    
+      
+        
+      
+
+      
+        
+      
+
+      
+        
+      
+
+      
+        
+          
+          
+        
+      
+
+      
+        
+      
+
+      
+        
+      
+    
+
+    
+      
+    
+  
+
+
+
+
+
\ No newline at end of file
diff --git a/src/components/DeviceTemplateList.vue b/src/components/DeviceTemplateList.vue
index cfd07aee..1d5b628f 100644
--- a/src/components/DeviceTemplateList.vue
+++ b/src/components/DeviceTemplateList.vue
@@ -3,17 +3,160 @@
     
       
         
       
-      
+      
+      
+      
+        
+      
+      
+      
+      
+        
+        重新加载
+      
+      
+      
+      
+        
+        
+        
+        
+        
+          
+            {{ formatCategory(scope.row.category) }}
+          
+        
+        
+        
+        
+        
+          
+            编辑
+            删除
+          
+        
+      
     
+
+    
+    
   
 
 
 
 
@@ -31,10 +174,41 @@ export default {
   padding: 15px 0;
 }
 
+.title-container {
+  display: flex;
+  align-items: center;
+  gap: 5px;
+}
+
 .page-title {
   margin: 0;
   font-size: 1.5rem;
   font-weight: bold;
   line-height: 1;
 }
+
+.refresh-btn {
+  color: black;
+  background-color: transparent;
+  padding: 0;
+  width: 24px;
+  height: 24px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: none;
+}
+
+.loading {
+  padding: 20px 0;
+}
+
+.error {
+  padding: 20px 0;
+  text-align: center;
+}
+
+.retry-btn {
+  margin-top: 15px;
+}
 
\ No newline at end of file
diff --git a/src/services/deviceTemplateService.js b/src/services/deviceTemplateService.js
new file mode 100644
index 00000000..22156825
--- /dev/null
+++ b/src/services/deviceTemplateService.js
@@ -0,0 +1,79 @@
+import apiClient from '../api/index.js';
+
+class DeviceTemplateService {
+  /**
+   * 获取设备模板列表
+   * @returns {Promise} 设备模板列表
+   */
+  async getDeviceTemplates() {
+    try {
+      const response = await apiClient.deviceTemplates.list();
+      return response.data || [];
+    } catch (error) {
+      console.error('获取设备模板列表失败:', error);
+      throw error;
+    }
+  }
+
+  /**
+   * 创建新设备模板
+   * @param {Object} deviceTemplateData 设备模板数据
+   * @returns {Promise