diff --git a/website/handlers/model/__init__.py b/website/handlers/alg_model/__init__.py
similarity index 100%
rename from website/handlers/model/__init__.py
rename to website/handlers/alg_model/__init__.py
diff --git a/website/handlers/model/handler.py b/website/handlers/alg_model/handler.py
similarity index 100%
rename from website/handlers/model/handler.py
rename to website/handlers/alg_model/handler.py
diff --git a/website/handlers/model/url.py b/website/handlers/alg_model/url.py
similarity index 94%
rename from website/handlers/model/url.py
rename to website/handlers/alg_model/url.py
index 5b7899f..dbf9d31 100644
--- a/website/handlers/model/url.py
+++ b/website/handlers/alg_model/url.py
@@ -1,4 +1,4 @@
-from website.handlers.model import handler
+from website.handlers.alg_model import handler
 
 handlers = [
     # ("/", handler.Handler),
diff --git a/website/handlers/model_hub/__init__.py b/website/handlers/alg_model_hub/__init__.py
similarity index 100%
rename from website/handlers/model_hub/__init__.py
rename to website/handlers/alg_model_hub/__init__.py
diff --git a/website/handlers/model_hub/handler.py b/website/handlers/alg_model_hub/handler.py
similarity index 100%
rename from website/handlers/model_hub/handler.py
rename to website/handlers/alg_model_hub/handler.py
diff --git a/website/handlers/model_hub/url.py b/website/handlers/alg_model_hub/url.py
similarity index 87%
rename from website/handlers/model_hub/url.py
rename to website/handlers/alg_model_hub/url.py
index 72a60c5..b7a083e 100644
--- a/website/handlers/model_hub/url.py
+++ b/website/handlers/alg_model_hub/url.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from website.handlers.model_hub import handler
+from website.handlers.alg_model_hub import handler
 
 handlers = [
 # ("/", handler.Handler),
diff --git a/website/handlers/enterprise_device/db.py b/website/handlers/enterprise_device/db.py
index 7c68785..cb85d35 100644
--- a/website/handlers/enterprise_device/db.py
+++ b/website/handlers/enterprise_device/db.py
@@ -1 +1,93 @@
-# -*- coding: utf-8 -*-
\ No newline at end of file
+# -*- coding: utf-8 -*-
+
+import logging
+
+from sqlalchemy import Column, Integer, String, DateTime
+from sqlalchemy.ext.declarative import declarative_base
+
+from website.db import get_session
+from website.handlers.enterprise_entity.db import EnterpriseEntityDB
+from website.handlers.enterprise_node.db import EnterpriseNodeDB
+
+Base = declarative_base()
+
+
+class EnterpriseDevice(Base):
+    __tablename__ = 'enterprise_device'
+
+    id = Column(Integer, primary_key=True)
+    suid = Column(String, len=10, default="")
+    entity_id = Column(Integer)
+    entity_suid = Column(String)
+    node_id = Column(Integer)
+    node_suid = Column(String)
+    classification = Column(String)
+    name = Column(String)
+    addr = Column(String)
+    device_model = Column(String)
+    param = Column(String)
+    comment = Column(String)
+    delete = Column("del", Integer, default=0)
+    create_time = Column(DateTime)
+    update_time = Column(DateTime)
+
+
+class EnterpriseDeviceDB(object):
+
+    def add_device(self, device):
+        entity_id = device["entity_id"]
+        node_id = device["node_id"]
+        entity_suid = EnterpriseEntityDB().get_entity_suid(entity_id)
+        node_suid = EnterpriseNodeDB().get_node_uid(node_id)
+
+        device["entity_suid"] = entity_suid
+        device["node_suid"] = node_suid
+
+        new_device = EnterpriseDevice(**device)
+        with get_session() as session:
+            try:
+                # session.execute(
+                #     text(
+                #         """INSERT INTO enterprise_device 
+                #         (suid, entity_id, entity_suid, node_id, node_suid, classification, name, addr, device_model, param, comment) 
+                #         values (:suid, :entity_id, :entity_suid, :node_id, :node_suid, :classification, :name, :addr, :device_model, :param, :comment)"""
+                #         ), 
+                #     device)
+                session.add(new_device)
+            except Exception as e:
+                logging.error("Failed to add device")
+                raise e
+
+        return
+
+    def edit_device(self, device):
+        device_id = device["id"]
+        with get_session() as session:
+            try:
+                session.query(EnterpriseDevice).filter(EnterpriseDevice.id == device_id).update(device)
+            except Exception as e:
+                logging.error("Failed to edit device")
+                raise e
+
+        return
+
+    def delete_device(self, device_id):
+        with get_session() as session:
+            try:
+                session.query(EnterpriseDevice).filter(EnterpriseDevice.id == device_id).update({"delete": 1})
+            except Exception as e:
+                logging.error("Failed to delete device")
+                raise e
+
+        return
+
+    def list_devices(self, node_id, pageNo, pageSize):
+        with get_session() as session:
+            try:
+                devices = session.query(EnterpriseDevice) \
+                    .filter(EnterpriseDevice.node_id == node_id, EnterpriseDevice.delete != 1) \
+                    .order_by(EnterpriseDevice.create_time.desc()).limit(pageSize).offset((pageNo - 1) * pageSize).all()
+            except Exception as e:
+                logging.error("Failed to list devices")
+                raise e
+            return devices
diff --git a/website/handlers/enterprise_device/handler.py b/website/handlers/enterprise_device/handler.py
index aa1b70d..a1623be 100644
--- a/website/handlers/enterprise_device/handler.py
+++ b/website/handlers/enterprise_device/handler.py
@@ -5,7 +5,7 @@ from sqlalchemy import text
 from website import errors, db
 from website.handler import APIHandler, authenticated
 from website.util import shortuuid
-
+from website.handlers.enterprise_device import db as DB_Device
 
 class DeviceClassificationAddHandler(APIHandler):
     """
@@ -94,39 +94,155 @@ class DeviceClassificationDeleteHandler(APIHandler):
 
 class DeviceAddHandler(APIHandler):
     """
-
+    - 描述:企业节点,添加设备
+    - 请求方式:post
+    - 请求参数:
+    >- entity_id, int, 企业id
+    >- node_id, int
+    >- name, string, 设备名称
+    >- addr, string, 设备位置
+    >- classification, string, 设备分类
+    >- device_model, string, 设备型号
+    >- param, string, 设备参数
+    >- comment, string, 备注
+    - 返回值:
+    ```
+        无
+    ```
     """
 
     @authenticated
     def post(self):
+        entity_id = self.get_int_argument('entity_id')
+        node_id = self.get_int_argument('node_id')
+        name = self.get_escaped_argument('name', '')
+        addr = self.get_escaped_argument('addr', '')
+        classification = self.get_escaped_argument('classification', '')
+        device_model = self.get_escaped_argument('device_model', '')
+        param = self.get_escaped_argument('param', '')
+        comment = self.get_escaped_argument('comment', '')
+
+        if not name:
+            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '设备名称不能为空')
+        if not entity_id or not node_id:
+            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点不能为空')
+
+        device_data = {
+            "entity_id": entity_id,
+            "node_id": node_id,
+            "name": name,
+            "addr": addr,
+            "classification": classification,
+            "device_model": device_model,
+            "param": param,
+            "comment": comment
+        }
+
+        db_device = DB_Device.EnterpriseDeviceDB()
+        db_device.add_device(device_data)
+
         self.finish()
 
 
 class DeviceEditHandler(APIHandler):
     """
-
+    - 描述:企业节点,编辑设备
+    - 请求方式:post
+    - 请求参数:
+    >- device_id, int, 设备id
+    >- name, string, 设备名称
+    >- addr, string, 设备位置
+    >- classification, string, 设备分类的short uuid
+    >- device_model, string, 设备型号
+    >- param, string, 设备参数
+    >- comment, string, 备注
+    - 返回值:无
     """
 
     @authenticated
     def post(self):
+        device_id = self.get_int_argument('device_id')
+        name = self.get_escaped_argument('name', '')
+        addr = self.get_escaped_argument('addr', '')
+        classification = self.get_escaped_argument('classification', '')
+        device_model = self.get_escaped_argument('device_model', '')
+        param = self.get_escaped_argument('param', '')
+        comment = self.get_escaped_argument('comment', '')
+        if not device_id:
+            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '设备id不能为空')
+        if not name:
+            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '设备名称不能为空')
+        
+        device_data = {
+            "id": device_id,
+            "name": name,
+            "addr": addr,
+            "classification": classification,
+            "device_model": device_model,
+            "param": param,
+            "comment": comment
+        }
+
+        db_device = DB_Device.EnterpriseDeviceDB()
+        db_device.edit_device(device_data)
         self.finish()
 
 
 class DeviceDeleteHandler(APIHandler):
     """
+    ### /enterprise/entity/nodes/device/delete
 
+    - 描述:企业节点,删除设备
+    - 请求方式:post
+    - 请求参数:
+    >- node_id, int
+    >- device_id, int, 设备id
+    - 返回值:无
     """
 
     @authenticated
     def post(self):
+        node_id = self.get_int_argument('node_id')
+        device_id = self.get_int_argument('device_id')
+        if not node_id or not device_id:
+            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点或设备不能为空')
+        db_device = DB_Device.EnterpriseDeviceDB()
+        db_device.delete_device(device_id)
         self.finish()
 
 
 class DeviceListHandler(APIHandler):
     """
-
+    - 描述:企业节点,设备列表
+    - 请求方式:post
+    - 请求参数:
+    > - pageNo
+    > - pageSize
+    > - node_id, int, 节点id
+    - 返回值:
+    ```
+        {
+            "count": 123,
+            "data": [
+                {
+                    "device_id":  123,
+                    "device_name": "xxx",
+                    "device_class": "xxx", 设备类型
+                    "deployed": 0, # 是否部署, 0/未部署, 1/已部署
+                },
+                ...
+            ]
+        }
+    ```
     """
 
     @authenticated
     def post(self):
+        node_id = self.get_int_argument('node_id')
+        pageNo = self.get_int_argument('pageNo', 1)
+        pageSize = self.get_int_argument('pageSize', 20)
+        if not node_id:
+            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '企业节点不能为空')
+        db_device = DB_Device.EnterpriseDeviceDB()
+        data = db_device.list_devices(node_id=node_id, pageNo=pageNo, pageSize=pageSize)
         self.finish()
diff --git a/website/handlers/enterprise_entity/db.py b/website/handlers/enterprise_entity/db.py
index 6da9824..bcc0682 100644
--- a/website/handlers/enterprise_entity/db.py
+++ b/website/handlers/enterprise_entity/db.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import logging
-from website.db import get_session
+from website.db import get_session, to_json
 from sqlalchemy import text
 
 class EnterpriseEntityDB(object):
@@ -9,8 +9,10 @@ class EnterpriseEntityDB(object):
         pass
 
         
-    def select_entity_suid(self, entity_id: int) -> str:
+    def get_entity_suid(self, entity_id: int) -> str:
         with get_session() as session:
             res = session.execute(text("select suid from enterprise where id=:id"), 
                 {"id": entity_id})
-            return res.fetchone()["suid"]
\ No newline at end of file
+            entity = to_json(res)
+
+            return entity["suid"] if entity else ""
\ No newline at end of file
diff --git a/website/handlers/enterprise_node/db.py b/website/handlers/enterprise_node/db.py
index 76061a3..59ca8f6 100644
--- a/website/handlers/enterprise_node/db.py
+++ b/website/handlers/enterprise_node/db.py
@@ -4,7 +4,7 @@ from typing import List, Dict, Any
 
 from sqlalchemy import text
 
-from website.db import get_session, to_json_list
+from website.db import get_session, to_json_list, to_json
 
 """
 CREATE TABLE `enterprise_node` (
@@ -119,4 +119,12 @@ class EnterpriseNodeDB(object):
             sql = ("update enterprise_node set del=1 where id=:id")
             param = {"id": node_id}
             session.execute(text(sql), param)
-        return 0
\ No newline at end of file
+        return 0
+    
+    def get_node_uid(self, node_id: int) -> str:
+        with get_session() as session:
+            sql = ("select suid from enterprise_node where id=:id")
+            param = {"id": node_id}
+            res = session.execute(text(sql), param)
+            node_list = to_json(res)
+            return node_list["suid"] if node_list else ""
\ No newline at end of file
diff --git a/website/handlers/enterprise_node/handler.py b/website/handlers/enterprise_node/handler.py
index e76fbd7..6dd9e27 100644
--- a/website/handlers/enterprise_node/handler.py
+++ b/website/handlers/enterprise_node/handler.py
@@ -39,7 +39,7 @@ class AddHandler(APIHandler):
             raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "参数错误")
 
         db_entity = DB_Entity.EnterpriseEntityDB()
-        entity_suid = db_entity.select_entity_suid(entity_id)
+        entity_suid = db_entity.get_entity_suid(entity_id)
 
         db_node = DB_Node.EnterpriseNodeDB()
         db_node.insert_node({