From 5b962e02efc295e8f5064e44e9fc93135bd997fa Mon Sep 17 00:00:00 2001
From: zhouping <zhouping@supervision.ltd>
Date: Wed, 17 Jul 2024 14:52:14 +0800
Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=B3=BB=E7=BB=9F=E6=97=A5?=
 =?UTF-8?q?=E5=BF=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md                                     |  4 +-
 mysql_app.sql                                 |  2 +-
 nginx.conf                                    |  1 +
 website/consts.py                             | 25 ++++++++++++-
 website/db/alg_model/alg_model.py             |  2 +-
 website/db/enterprise/enterprise.py           |  2 +-
 website/handler.py                            | 37 ++++++++++---------
 website/handlers/alg_model/handler.py         | 20 +++++++++-
 website/handlers/alg_model_hub/handler.py     | 12 ++++--
 .../handlers/enterprise_busi_model/handler.py |  9 ++++-
 website/handlers/enterprise_device/handler.py | 20 +++++++---
 website/handlers/enterprise_entity/handler.py | 10 ++++-
 website/handlers/enterprise_node/handler.py   | 18 +++++++--
 website/handlers/file/handler.py              |  2 +-
 website/handlers/system/handler.py            | 20 +++++-----
 15 files changed, 135 insertions(+), 49 deletions(-)

diff --git a/README.md b/README.md
index 7b8180f..5cc1fed 100644
--- a/README.md
+++ b/README.md
@@ -305,7 +305,9 @@ command 可以使用动态参数,例如:--port=88%(process_num)02d,默认
 Dockerfile中首行配置 FROM 192.168.10.94:5000/generalai:v1,使用的是开发环境的docker registry镜像
 这个image中包含工程运行需要的基础环境,包括各种包,supervisor
 
-镜像制作:docker build -t lemon .
+镜像制作:
+    docker build -t lemon .
+
 镜像导出:
 export: 
     docker export lemon_web lemon.tar  # lemon_web是docker-compose.yml中的container name, 或者使用container id
diff --git a/mysql_app.sql b/mysql_app.sql
index 2d3db51..849216c 100644
--- a/mysql_app.sql
+++ b/mysql_app.sql
@@ -48,7 +48,7 @@ CREATE TABLE `enterprise`  (
   `industry` int NOT NULL,
   `contact` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
   `phone` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
-  `summary` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
+  `summary` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,
   `logo` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,
   `account` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
   `pwd` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
diff --git a/nginx.conf b/nginx.conf
index efcfb4f..bcf7e0b 100644
--- a/nginx.conf
+++ b/nginx.conf
@@ -2,6 +2,7 @@ server {
     listen 8989;
     server_name 192.168.10.94;
 
+    client_max_body_size 300M;
     root /app/lemon/dist;
 
     location ^~ /api {
diff --git a/website/consts.py b/website/consts.py
index 17cc912..5091fa5 100644
--- a/website/consts.py
+++ b/website/consts.py
@@ -45,4 +45,27 @@ device_status_map = {
 # 系统状态
 system_status_not_active = 9000  # 未激活
 system_status_activated = 9001  # 已激活
-system_status_expire_atall = 9003  # 完全过期
\ No newline at end of file
+system_status_expire_atall = 9003  # 完全过期
+
+op_type_add = 1001  # 新增
+op_type_add_str = u"新增"
+
+op_type_edit = 1002  # 编辑
+op_type_edit_str = u"编辑"
+
+op_type_list = 1003  # 查询
+op_type_list_str = u"查询"
+
+op_type_delete = 1004  # 删除
+op_type_delete_str = u"删除"
+
+op_type_upload = 1005  # 上传
+op_type_upload_str = u"上传"
+
+op_type_map = {
+    op_type_add: op_type_add_str,
+    op_type_edit: op_type_edit_str,
+    op_type_list: op_type_list_str,
+    op_type_delete: op_type_delete_str,
+    op_type_upload: op_type_upload_str,
+}
diff --git a/website/db/alg_model/alg_model.py b/website/db/alg_model/alg_model.py
index 685eafc..3c66a54 100644
--- a/website/db/alg_model/alg_model.py
+++ b/website/db/alg_model/alg_model.py
@@ -97,4 +97,4 @@ class ModelRepositry(object):
 
     def get_model_count(self) -> int:
         with get_session() as session:
-            return session.query(Model).count()
+            return session.query(Model).filter(Model.delete == 0).count()
diff --git a/website/db/enterprise/enterprise.py b/website/db/enterprise/enterprise.py
index 823498d..5b67179 100644
--- a/website/db/enterprise/enterprise.py
+++ b/website/db/enterprise/enterprise.py
@@ -19,7 +19,7 @@ def get_enterprise_device_count(id: int) -> int:
 # 获取所有企业实体数量
 def get_enterprise_entity_count(engine: Any) -> int:
     with engine.connect() as conn:
-        count_sql_text = "select count(*) from enterprise "
+        count_sql_text = "select count(*) from enterprise where del=0 "
         count = conn.execute(text(count_sql_text)).fetchone()
         if count:
             return count[0]
diff --git a/website/handler.py b/website/handler.py
index 361e60c..a08043b 100644
--- a/website/handler.py
+++ b/website/handler.py
@@ -496,7 +496,7 @@ def authenticated_admin(method):
     return wrapper
 
 
-def operation_log(primary_menu, sub_menu, ope_type, content, comment):
+def operation_log(primary_menu, sub_menu, ope_type, content, comment=""):
     """
     Add logging to a function. level is the logging
     level, name is the logger name, and message is the
@@ -507,22 +507,25 @@ def operation_log(primary_menu, sub_menu, ope_type, content, comment):
     def decorate(func):
         @functools.wraps(func)
         def wrapper(self, *args, **kwargs):
-            with self.app_mysql.connect() as conn:
-                conn.execute(text(
-                    "insert into sys_log(user, ip, primary_menu, sub_menu, op_type, content, comment) "
-                    "values(:user, :ip, :primary_menu, :sub_menu, :op_type, :content, :comment)"
-                ),
-                    {"user": self.current_user.name,
-                     "ip": self.request.headers[
-                         "X-Forwarded-For"] if "X-Forwarded-For" in self.request.headers else self.request.remote_ip,
-                     "primary_menu": primary_menu,
-                     "sub_menu": sub_menu,
-                     "op_type": ope_type,
-                     "content": content,
-                     "comment": comment
-                     }
-                )
-                conn.commit()
+            try:
+                with self.app_mysql.connect() as conn:
+                    conn.execute(text(
+                        "insert into sys_log(user, ip, primary_menu, sub_menu, op_type, content, comment) "
+                        "values(:user, :ip, :primary_menu, :sub_menu, :op_type, :content, :comment)"
+                    ),
+                        {"user": self.current_user.name,
+                         "ip": self.request.headers[
+                             "X-Forwarded-For"] if "X-Forwarded-For" in self.request.headers else self.request.remote_ip,
+                         "primary_menu": primary_menu,
+                         "sub_menu": sub_menu,
+                         "op_type": ope_type,
+                         "content": content,
+                         "comment": comment
+                         }
+                    )
+                    conn.commit()
+            except Exception as e:
+                logging.info("operation log error: %s" % e)
 
             return func(self, *args, **kwargs)
 
diff --git a/website/handlers/alg_model/handler.py b/website/handlers/alg_model/handler.py
index 272bea0..4a96490 100644
--- a/website/handlers/alg_model/handler.py
+++ b/website/handlers/alg_model/handler.py
@@ -8,7 +8,7 @@ from website import consts
 from website import db_mysql
 from website import errors
 from website import settings
-from website.handler import APIHandler, authenticated
+from website.handler import APIHandler, authenticated, operation_log
 from website.util import md5, shortuuid
 
 
@@ -19,6 +19,7 @@ class ClassificationAddHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型列表", consts.op_type_add_str, "添加模型分类", "")
     def post(self):
         name = self.get_escaped_argument("name", "")
         if not name:
@@ -53,6 +54,7 @@ class ClassificationEditHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型列表", consts.op_type_edit_str, "编辑模型分类", "")
     def post(self):
         classification_id = self.get_int_argument("id")
         name = self.get_escaped_argument("name", "")
@@ -75,6 +77,7 @@ class ClassificationListHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型列表", consts.op_type_list_str, "查询模型分类", "")
     def post(self):
         with self.app_mysql.connect() as conn:
             cur = conn.execute(text("""select id, name from model_classification"""))
@@ -89,6 +92,7 @@ class ClassificationDeleteHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型列表", consts.op_type_delete_str, "删除模型分类", "")
     def post(self):
         classification_id = self.get_int_argument("id")
         if not classification_id:
@@ -110,6 +114,7 @@ class ListHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型列表", consts.op_type_list_str, "查询模型列表", "")
     def post(self):
         pageNo = self.get_int_argument("pageNo", 1)
         pageSize = self.get_int_argument("pageSize", consts.PAGE_SIZE)
@@ -124,7 +129,7 @@ class ListHandler(APIHandler):
 
             param = {}
 
-            sql_count = "select count(id) from model where del=0 "
+            sql_count = "select count(id) from model m where m.del=0 "
             param_count = {}
 
             if name:
@@ -161,6 +166,7 @@ class ListHandler(APIHandler):
 
 class ListSimpleHandler(APIHandler):
     @authenticated
+    @operation_log("模型管理", "模型列表", consts.op_type_list_str, "查询模型列表", "")
     def post(self):
         with self.app_mysql.connect() as conn:
             sql = "select id, name from model where del=0"
@@ -176,6 +182,7 @@ class AddHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "添加模型", consts.op_type_add_str, "添加模型", "")
     def post(self):
         name = self.get_escaped_argument("name", "")
         model_type = self.get_int_argument(
@@ -218,6 +225,7 @@ class EditHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "编辑模型", consts.op_type_edit_str, "编辑模型", "")
     def post(self):
         mid = self.get_int_argument("id")
         name = self.get_escaped_argument("name", "")
@@ -258,6 +266,7 @@ class InfoHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型信息", consts.op_type_list_str, "查询模型信息", "")
     def post(self):
         mid = self.get_int_argument("id")
         if not mid:
@@ -300,6 +309,7 @@ class DeleteHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型列表", consts.op_type_delete_str, "删除模型", "")
     def post(self):
         mid = self.get_int_argument("id")
         if not mid:
@@ -329,6 +339,7 @@ class VersionAddHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型版本", consts.op_type_add_str, "添加模型版本", "")
     def post(self):
         mid = self.get_int_argument("model_id")
         version = self.get_escaped_argument("version", "")
@@ -382,6 +393,7 @@ class VersionEditHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型版本", consts.op_type_edit_str, "编辑模型版本", "")
     def post(self):
         version_id = self.get_int_argument("version_id")
         version = self.get_escaped_argument("version", "")
@@ -445,6 +457,7 @@ class VersionListHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型版本", consts.op_type_list_str, "模型版本列表", "")
     def post(self):
         model_id = self.get_int_argument("model_id")
         pageNo = self.get_int_argument("pageNo", 1)
@@ -524,6 +537,7 @@ class VersionInfoHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型版本", consts.op_type_list_str, "查询模型版本详情", "")
     def post(self):
         version_id = self.get_int_argument("version_id")
         response = {
@@ -606,6 +620,7 @@ class VersionSetDefaultHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型版本", consts.op_type_edit_str, "设置模型版本为默认版本", "")
     def post(self):
         version_id = self.get_int_argument("version_id")
         model_id = self.get_int_argument("model_id")
@@ -644,6 +659,7 @@ class VersionDeleteHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型版本", consts.op_type_delete_str, "删除模型版本", "")
     def post(self):
         version_id = self.get_int_argument("version_id")
         if not version_id:
diff --git a/website/handlers/alg_model_hub/handler.py b/website/handlers/alg_model_hub/handler.py
index 72a68cd..2d6d471 100644
--- a/website/handlers/alg_model_hub/handler.py
+++ b/website/handlers/alg_model_hub/handler.py
@@ -9,7 +9,7 @@ from website import consts
 from website import db_mysql
 from website import errors
 from website import settings
-from website.handler import APIHandler, authenticated
+from website.handler import APIHandler, authenticated, operation_log
 
 
 class ListHandler(APIHandler):
@@ -38,6 +38,7 @@ class ListHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型运行库", consts.op_type_list_str, "查询模型运行库列表", "")
     def post(self):
         pageNo = self.get_int_argument("pageNo", 1)
         pageSize = self.get_int_argument("pageSize", consts.PAGE_SIZE)
@@ -104,6 +105,7 @@ class SyncHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型运行库", consts.op_type_list_str, "查询模型运行库镜像", "")
     def post(self):
         host = self.get_escaped_argument("host", "")
         port = self.get_int_argument("port")
@@ -142,6 +144,7 @@ class AddHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型运行库", consts.op_type_add_str, "新建模型运行库", "")
     def post(self):
         name = self.get_escaped_argument("name", "")
         host = self.get_escaped_argument("host", "")
@@ -173,7 +176,7 @@ class AddHandler(APIHandler):
         self.finish()
 
 
-class EditHandler(APIHandler):
+class  EditHandler(APIHandler):
     """
     - 描述: 编辑模型运行库
     - 请求方式:post
@@ -188,6 +191,7 @@ class EditHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型运行库", consts.op_type_edit_str, "编辑模型运行库", "")
     def post(self):
         id = self.get_int_argument("id")
         name = self.get_escaped_argument("name", "")
@@ -195,7 +199,7 @@ class EditHandler(APIHandler):
         port = self.get_int_argument("port")
         path = self.get_escaped_argument("path", "")
         comment = self.get_escaped_argument("comment", "")
-        if not id or not name or not host or not port or path:
+        if not id or not name or not host or not port or not path:
             raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, "parameter error")
         with self.app_mysql.connect() as conn:
             conn.execute(
@@ -235,6 +239,7 @@ class InfoHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型运行库", consts.op_type_list_str, "查询模型运行库信息", "")
     def post(self):
         hid = self.get_int_argument("id")
         if not id:
@@ -266,6 +271,7 @@ class DeleteHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("模型管理", "模型运行库", consts.op_type_delete_str, "删除模型运行库", "")
     def post(self):
         hid = self.get_int_argument("id")
         if not id:
diff --git a/website/handlers/enterprise_busi_model/handler.py b/website/handlers/enterprise_busi_model/handler.py
index cca761a..60500cd 100644
--- a/website/handlers/enterprise_busi_model/handler.py
+++ b/website/handlers/enterprise_busi_model/handler.py
@@ -3,8 +3,8 @@ import json
 import logging
 from sqlalchemy import text
 
-from website import db_mysql, errors
-from website.handler import APIHandler, authenticated
+from website import db_mysql, errors, consts
+from website.handler import APIHandler, authenticated, operation_log
 from website.util import shortuuid
 from website.db.enterprise_busi_model import enterprise_busi_model as DB_BusiModel
 from website.db.enterprise_busi_model import enterprise_busi_model_node_device as DB_BusiModelNodeDevice
@@ -35,6 +35,7 @@ class ListHandler(APIHandler):
     ```
     """
     @authenticated
+    @operation_log("企业管理", "业务模型", consts.op_type_list_str, "查询企业部署的业务模型列表", "")
     def post(self):
         pageNo = self.get_int_argument("pageNo", 1)
         pageSize = self.get_int_argument("pageSize", 10)
@@ -63,6 +64,7 @@ class AddHandler(APIHandler):
     - 返回值:无
     """
     @authenticated
+    @operation_log("企业管理", "业务模型", consts.op_type_add_str, "添加企业部署的业务模型", "")
     def post(self):
         entity_id = self.get_int_argument("entity_id")
         name = self.get_escaped_argument("name", "")
@@ -131,6 +133,7 @@ class InfoHandler(APIHandler):
     ```
     """
     @authenticated
+    @operation_log("企业管理", "业务模型", consts.op_type_list_str, "查询企业部署的业务模型详情")
     def post(self):
         busimodel_id = self.get_int_argument("id")
     
@@ -189,6 +192,7 @@ class EditHandler(APIHandler):
     - 返回值:无
     """
     @authenticated
+    @operation_log("企业管理", "业务模型", consts.op_type_edit_str, "编辑企业部署的业务模型")
     def post(self):
         busimodel_id = self.get_int_argument("id")
     
@@ -255,6 +259,7 @@ class EditHandler(APIHandler):
 
 class DeleteHandler(APIHandler):
     @authenticated
+    @operation_log("企业管理", "业务模型", consts.op_type_delete_str, "删除企业部署的业务模型")
     def post(self):
         busimodel_id = self.get_int_argument("id")
         if not busimodel_id:
diff --git a/website/handlers/enterprise_device/handler.py b/website/handlers/enterprise_device/handler.py
index 0a60987..4c3eb2f 100644
--- a/website/handlers/enterprise_device/handler.py
+++ b/website/handlers/enterprise_device/handler.py
@@ -16,7 +16,7 @@ from website.db.enterprise_busi_model import enterprise_busi_model_node_device a
 from website.db.enterprise_device import enterprise_device as DB_Device
 from website.db.enterprise_node import enterprise_node as DB_Node
 from website.db.enterprise_node import enterprise_node_base_model_conf as DB_NodeBaseModelConf
-from website.handler import APIHandler, authenticated
+from website.handler import APIHandler, authenticated, operation_log
 from website.util import date_util
 from website.util import shortuuid
 
@@ -37,6 +37,7 @@ class DeviceClassificationAddHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "设备管理", consts.op_type_add_str, "添加设备分类")
     def post(self):
         name = self.get_escaped_argument("name", "")
         with self.app_mysql.connect() as conn:
@@ -82,6 +83,7 @@ class DeviceClassificationHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "设备管理", consts.op_type_list_str, "设备分类列表")
     def post(self):
         with self.app_mysql.connect() as conn:
             cur = conn.execute(
@@ -105,6 +107,7 @@ class DeviceClassificationDeleteHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "设备管理", consts.op_type_delete_str, "删除设备分类")
     def post(self):
         did = self.get_int_argument("id")
 
@@ -151,6 +154,7 @@ class DeviceAddHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "设备管理", consts.op_type_add_str, "企业节点,添加设备")
     def post(self):
         entity_id = self.get_int_argument("entity_id")
         node_id = self.get_int_argument("node_id")
@@ -204,6 +208,7 @@ class DeviceEditHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "设备管理", consts.op_type_edit_str, "企业节点,编辑设备")
     def post(self):
         device_id = self.get_int_argument("device_id")
         name = self.get_escaped_argument("name", "")
@@ -243,6 +248,7 @@ class DeviceDeleteHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "设备管理", consts.op_type_delete_str, "企业节点,删除设备")
     def post(self):
         # node_id = self.get_int_argument('node_id')
         device_id = self.get_int_argument("device_id")
@@ -281,6 +287,7 @@ class DeviceListHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "设备管理", consts.op_type_list, "企业节点,设备列表")
     def post(self):
         node_id = self.get_int_argument("node_id")
         pageNo = self.get_int_argument("pageNo", 1)
@@ -329,7 +336,8 @@ class DeviceInfoHandler(APIHandler):
         }
     ```
     """
-
+    @authenticated
+    @operation_log("企业管理", "设备管理", consts.op_type_list, "企业节点,设备信息")
     def post(self):
         device_id = self.get_int_argument("device_id")
         if not device_id:
@@ -374,6 +382,7 @@ class DeviceBasemodelListHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_list, "企业节点,节点信息 -> 设备列表 -> 基础模型配置 -> 模型列表")
     def post(self):
         device_id = self.get_int_argument("device_id")
         if not device_id:
@@ -395,9 +404,6 @@ class DeviceBasemodelListHandler(APIHandler):
             busi_model_id = item["busi_model_id"]
             busi_model_name = item["name"]
             base_model_list = json.loads(item["base_models"])
-            logging.info("##############################################################")
-            logging.info(base_model_list)
-            logging.info("##############################################################")
             base_models = []
             for base_model in base_model_list:
                 base_model_id = base_model["id"]
@@ -448,6 +454,8 @@ class DeviceBaseModelCustomConfigHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_add_str,
+                   "企业节点,节点信息 -> 设备列表 -> 基础模型配置 -> 基础模型参数配置")
     def post(self):
         device_id = self.get_int_argument("device_id")
         node_id = self.get_int_argument("node_id")
@@ -533,6 +541,7 @@ class StatusListHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "设备状态", consts.op_type_list_str,"设备状态列表")
     def post(self):
         entity_id = self.get_int_argument("entity_id")
         group = self.get_int_argument("group")
@@ -599,6 +608,7 @@ class StatusInfoHandler(APIHandler):
     """ """
 
     @authenticated
+    @operation_log("企业管理", "设备状态", consts.op_type_list_str, "设备信息")
     def post(self):
         device_id = self.get_int_argument("id")
         if not device_id:
diff --git a/website/handlers/enterprise_entity/handler.py b/website/handlers/enterprise_entity/handler.py
index 3f626d1..f171c77 100644
--- a/website/handlers/enterprise_entity/handler.py
+++ b/website/handlers/enterprise_entity/handler.py
@@ -12,7 +12,7 @@ from website import settings
 from website.db.alg_model.alg_model import ModelRepositry
 from website.db.enterprise import enterprise
 from website.db.enterprise_device.enterprise_device import EnterpriseDeviceRepository
-from website.handler import APIHandler, authenticated
+from website.handler import APIHandler, authenticated, operation_log
 from website.util import shortuuid, aes
 
 
@@ -24,6 +24,7 @@ class EntityIndexHandler(APIHandler):
     """首页"""
 
     @authenticated
+    @operation_log("首页", "企业列表", consts.op_type_list_str, "企业列表")
     async def post(self):
         pageNo = self.get_int_argument("pageNo", 1)
         pageSize = self.get_int_argument("pageSize", 10)
@@ -119,6 +120,7 @@ class EntityIndexBasecountHandler(APIHandler):
     """首页基础统计书记"""
 
     @authenticated
+    @operation_log("首页", "企业列表", consts.op_type_list_str, "基础统计数据")
     def post(self):
         entity_count = enterprise.get_enterprise_entity_count(self.app_mysql)
         model_repository = ModelRepositry()
@@ -133,6 +135,7 @@ class EntityAddHandler(APIHandler):
     """添加企业"""
 
     @authenticated
+    @operation_log("首页", "企业列表", consts.op_type_add_str, "添加企业项目")
     def post(self):
         name = self.tostr(self.get_escaped_argument("name", ""))
         province = self.get_escaped_argument("province", "")
@@ -203,6 +206,7 @@ class EntityEditHandler(APIHandler):
     """编辑企业"""
 
     @authenticated
+    @operation_log("首页", "企业列表", consts.op_type_edit_str, "编辑企业项目")
     def post(self):
         eid = self.get_int_argument("id")
         name = self.tostr(self.get_escaped_argument("name", ""))
@@ -267,6 +271,7 @@ class EntityInfoHandler(APIHandler):
     """企业信息"""
 
     @authenticated
+    @operation_log("企业管理", "企业信息", consts.op_type_list_str, "企业信息")
     def post(self):
         eid = self.get_int_argument("id")
 
@@ -310,6 +315,7 @@ class ModelsHandler(APIHandler):
     """企业模型"""
 
     @authenticated
+    @operation_log("企业管理", "企业模型", consts.op_type_list_str, "企业模型")
     def post(self):
         eid = self.get_int_argument("id")
 
@@ -354,6 +360,7 @@ class EntityDeleteHandler(APIHandler):
     """删除企业"""
 
     @authenticated
+    @operation_log("首页", "企业列表", consts.op_type_delete_str, "删除企业")
     def post(self):
         eid = self.get_int_argument("id")
 
@@ -369,6 +376,7 @@ class EntityPwdcheckHandler(APIHandler):
     """查看企业密码"""
 
     @authenticated
+    @operation_log("企业管理", "企业信息", consts.op_type_list_str, "查看企业密码")
     def post(self):
         eid = self.get_int_argument("id")
 
diff --git a/website/handlers/enterprise_node/handler.py b/website/handlers/enterprise_node/handler.py
index b260194..069e42c 100644
--- a/website/handlers/enterprise_node/handler.py
+++ b/website/handlers/enterprise_node/handler.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 import json
 
-from website import errors
+from website import errors, consts
 from website.db.enterprise_busi_model import enterprise_busi_model as DB_BusiModel
 from website.db.enterprise_busi_model import (
     enterprise_busi_model_node_device as DB_BusiModelNodeDevice,
@@ -10,7 +10,7 @@ from website.db.enterprise_device import enterprise_device as DB_Device
 from website.db.enterprise_entity import enterprise_entity as DB_Entity
 from website.db.enterprise_node import enterprise_node as DB_Node
 from website.db.enterprise_node import enterprise_node_alert as DB_NodeAlert
-from website.handler import APIHandler, authenticated
+from website.handler import APIHandler, authenticated, operation_log
 from website.util import shortuuid
 
 
@@ -30,7 +30,8 @@ class AddHandler(APIHandler):
     - 返回值:无
     """
 
-    # @authenticated
+    @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_add_str, "添加企业节点")
     def post(self):
         entity_id = self.get_int_argument("entity_id")
         entity_suid = self.get_escaped_argument("entity_suid", "")
@@ -83,7 +84,8 @@ class EditHandler(APIHandler):
     - 返回值:无
     """
 
-    # @authenticated
+    @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_edit_str, "更新企业节点")
     def post(self):
         node_id = self.get_int_argument("node_id", 0)
         name = self.get_escaped_argument("name", "")
@@ -151,6 +153,7 @@ class TreeHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_list_str, "企业节点树")
     def post(self):
         entity_id = self.get_escaped_argument("entity_id", "")
         name = self.get_escaped_argument("name", "")
@@ -183,6 +186,7 @@ class InfoHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_list_str, "企业节点信息")
     def post(self):
         node_id = self.get_int_argument("node_id")
 
@@ -198,6 +202,7 @@ class InfoHandler(APIHandler):
 class DeleteHandler(APIHandler):
 
     @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_list_str, "删除节点")
     def post(self):
         node_id = self.get_int_argument("node_id")
         if not node_id:
@@ -233,6 +238,7 @@ class BusimodelHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_list_str, "业务模型部署列表")
     def post(self):
         node_id = self.get_int_argument("node_id")
         pageNo = self.get_int_argument("pageNo", 1)
@@ -284,6 +290,7 @@ class   BusimodelInfoHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_list_str, "业务模型部署 -> 业务模型信息")
     def post(self):
         node_id = self.get_int_argument("node_id")
         busi_model_id = self.get_int_argument("busi_model_id")
@@ -332,6 +339,7 @@ class BusimodelDeployHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_add_str, "业务模型部署 -> 业务模型配置")
     def post(self):
         node_id = self.get_int_argument("node_id")
         busi_model_id = self.get_int_argument("busi_model_id")
@@ -403,6 +411,7 @@ class AlertHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_list_str, "节点信息 -> 设备列表 -> 告警设置信息")
     def post(self):
         node_id = self.get_int_argument("node_id")
         if not node_id:
@@ -452,6 +461,7 @@ class AlertConfigHandler(APIHandler):
     """
 
     @authenticated
+    @operation_log("企业管理", "节点设置", consts.op_type_edit_str, "节点信息 -> 设备列表 -> 告警设置,更新配置")
     def post(self):
         node_id = self.get_int_argument("node_id")
         is_sms = self.get_int_argument("is_sms", 0)
diff --git a/website/handlers/file/handler.py b/website/handlers/file/handler.py
index d6600c5..4aed6fe 100644
--- a/website/handlers/file/handler.py
+++ b/website/handlers/file/handler.py
@@ -30,7 +30,7 @@ class UploadHandler(APIHandler):
         logging.info("file_size: %s", file_size)
 
         if file_size > 300 * 1024 * 1024:
-            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, 'Exceed 300M size limit')
+            raise errors.HTTPAPIError(errors.ERROR_BAD_REQUEST, '超出300M限定大小')
 
         filetype = filename.split(".") and filename.split(".")[-1] or ""
 
diff --git a/website/handlers/system/handler.py b/website/handlers/system/handler.py
index 2228766..bdb527c 100644
--- a/website/handlers/system/handler.py
+++ b/website/handlers/system/handler.py
@@ -118,11 +118,11 @@ class ActivateInfoHandler(APIHandler):
             date_remain = delta if delta > 0 else 0
 
         data = {
-            "system": settings.system_info[settings.system_type]["name"],
-            "license": license_str,
-            "activate_at": activate_at,
-            "expire_at": expire_at,
-            "date_remain": date_remain
+            # "system": settings.system_info[settings.system_type]["name"],
+            # "license": license_str,
+            # "activate_at": activate_at,
+            # "expire_at": expire_at,
+            # "date_remain": date_remain
         }
 
         self.finish(data)
@@ -142,15 +142,15 @@ class LogHandler(APIHandler):
         pageNo = self.get_int_argument("pageNo", 1)
         pageSize = self.get_int_argument("pageSize", 20)
 
-        users = user.split(",")
+        user_list = user.split(",") if user else []
         with self.app_mysql.connect() as conn:
-            sql = "select user, ip, content, op_type, content from sys_log where 1=1"
+            sql = "select user, ip, content, op_type, content, create_time from sys_log where 1=1"
             sql_count = "select count(*) from sys_log where 1=1"
             p = {}
-            if users:
+            if user_list:
                 sql += " and user in :users"
                 sql_count += " and user in :users"
-                p["users"] = users
+                p["users"] = user_list
             if start:
                 sql += " and date_format(create_time, '%Y-%m-%d') >= :start"
                 sql_count += " and date_format(create_time, '%Y-%m-%d') >= :start"
@@ -167,5 +167,7 @@ class LogHandler(APIHandler):
             p["pageSize"] = pageSize
             res = conn.execute(text(sql), p)
             data = to_json_list(res)
+            for item in data:
+                item["create_time"] = str(item["create_time"])
 
             self.finish({"count": count, "data": data})