瀏覽代碼

fix 修复用户登录及数据过滤等一些问题

YueYunyun 1 月之前
父節點
當前提交
1f7ae5ff31

+ 4 - 3
SourceCode/DataMiddleware/app/data_process/pre_process.py

@@ -165,9 +165,10 @@ class PreProcess:
         return prompt
 
     def call_ai(self, project_id:int, excel_data):
-        api_key = utils.get_config_value("fastgpt.api_key_pre_process")
-        prompt = self.prompt_template(excel_data)
-        json_data = self._ai.call_ai(prompt, api_key)
+        # api_key = utils.get_config_value("fastgpt.api_key_pre_process")
+        # prompt = self.prompt_template(excel_data)
+        # json_data = self._ai.call_ai(prompt, api_key)
+        json_data = [{'n': 'D型梁使用', 'm': '每使用1季度跨度(m)12', 'u': '孔', 'c': 1082.0}, {'n': 'D型梁使用', 'm': '每使用1季度跨度(m)16', 'u': '孔', 'c': 1082.0}, {'n': 'D型梁使用', 'm': '每使用1季度跨度(m)20', 'u': '孔', 'c': 1082.0}, {'n': 'D型梁使用', 'm': '每使用1季度跨度(m)24', 'u': '孔', 'c': 1082.0}]
         data = self.format_data(project_id, json_data)
         return data
 

+ 23 - 7
SourceCode/DataMiddleware/app/init.sql

@@ -52,7 +52,13 @@ CREATE TABLE IF NOT EXISTS sub_project_item (
     send_status TINYINT DEFAULT 0,
     send_time DATETIME,
     remark TEXT,
-    updated_at DATETIME
+    is_del TINYINT DEFAULT 0 COMMENT '是否删除',
+    delete_by VARCHAR(255) COMMENT '删除人',
+    deleted_at DATETIME COMMENT '删除时间',
+    create_by VARCHAR(255) COMMENT '创建人',
+    created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    update_by VARCHAR(255) COMMENT '更新人',
+    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
 ) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
 
 CREATE TABLE IF NOT EXISTS user (
@@ -74,15 +80,15 @@ CREATE TABLE IF NOT EXISTS user (
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
 
 
-INSERT INTO `iwb_data_middleware_v1_1`.`user` (`id`, `username`, `name`, `email`, `phone`, `password`, `last_login`, `is_del`, `delete_by`, `deleted_at`, `create_by`, `created_at`, `update_by`, `updated_at`)
+INSERT INTO `user` (`id`, `username`, `name`, `email`, `phone`, `password`, `last_login`, `is_del`, `delete_by`, `deleted_at`, `create_by`, `created_at`, `update_by`, `updated_at`)
 VALUES (1, 'admin', 'Administrator', 'admin@example.com', '1234567890', '$2b$12$woIvmKHq.ndxT5NqzqChl.VF7TWKRbP1KbtAerXNKb/1pQgvRo/iG', NULL, 0, NULL, NULL, 'admin', '2025-03-10 13:56:57', 'admin', '2025-03-10 16:27:47');
-INSERT INTO `iwb_data_middleware_v1_1`.`user` (`id`, `username`, `name`, `email`, `phone`, `password`, `last_login`, `is_del`, `delete_by`, `deleted_at`, `create_by`, `created_at`, `update_by`, `updated_at`)
+INSERT INTO `user` (`id`, `username`, `name`, `email`, `phone`, `password`, `last_login`, `is_del`, `delete_by`, `deleted_at`, `create_by`, `created_at`, `update_by`, `updated_at`)
 VALUES (2, 'system', 'System', 'system@example.com', '13312345001', '$2b$12$woIvmKHq.ndxT5NqzqChl.VF7TWKRbP1KbtAerXNKb/1pQgvRo/iG', NULL, 0, NULL, NULL, 'admin', '2025-03-10 13:56:57', 'admin', '2025-03-10 16:27:47');
-INSERT INTO `iwb_data_middleware_v1_1`.`user` (`id`, `username`, `name`, `email`, `phone`, `password`, `last_login`, `is_del`, `delete_by`, `deleted_at`, `create_by`, `created_at`, `update_by`, `updated_at`)
+INSERT INTO `user` (`id`, `username`, `name`, `email`, `phone`, `password`, `last_login`, `is_del`, `delete_by`, `deleted_at`, `create_by`, `created_at`, `update_by`, `updated_at`)
 VALUES (3, 'demo01', 'Demo01', 'demo01@example.com', '13312345002', '$2b$12$woIvmKHq.ndxT5NqzqChl.VF7TWKRbP1KbtAerXNKb/1pQgvRo/iG', NULL, 0, NULL, NULL, 'admin', '2025-03-10 13:56:57', 'admin', '2025-03-10 16:27:47');
-INSERT INTO `iwb_data_middleware_v1_1`.`user` (`id`, `username`, `name`, `email`, `phone`, `password`, `last_login`, `is_del`, `delete_by`, `deleted_at`, `create_by`, `created_at`, `update_by`, `updated_at`)
+INSERT INTO `user` (`id`, `username`, `name`, `email`, `phone`, `password`, `last_login`, `is_del`, `delete_by`, `deleted_at`, `create_by`, `created_at`, `update_by`, `updated_at`)
 VALUES (4, 'demo02', 'Demo02', 'demo02@example.com', '13312345002', '$2b$12$woIvmKHq.ndxT5NqzqChl.VF7TWKRbP1KbtAerXNKb/1pQgvRo/iG', NULL, 0, NULL, NULL, 'admin', '2025-03-10 13:56:57', 'admin', '2025-03-10 16:27:47');
-INSERT INTO `iwb_data_middleware_v1_1`.`user` (`id`, `username`, `name`, `email`, `phone`, `password`, `last_login`, `is_del`, `delete_by`, `deleted_at`, `create_by`, `created_at`, `update_by`, `updated_at`)
+INSERT INTO `user` (`id`, `username`, `name`, `email`, `phone`, `password`, `last_login`, `is_del`, `delete_by`, `deleted_at`, `create_by`, `created_at`, `update_by`, `updated_at`)
 VALUES (5, 'demo03', 'Demo03', 'demo03@example.com', '13312345002', '$2b$12$woIvmKHq.ndxT5NqzqChl.VF7TWKRbP1KbtAerXNKb/1pQgvRo/iG', NULL, 0, NULL, NULL, 'admin', '2025-03-10 13:56:57', 'admin', '2025-03-10 16:27:47');
 
 
@@ -102,4 +108,14 @@ VALUES (5, 'demo03', 'Demo03', 'demo03@example.com', '13312345002', '$2b$12$woIv
 
 -- -- 修改 sub_project_item 表的时间字段名
 -- ALTER TABLE sub_project_item
--- CHANGE COLUMN update_time updated_at DATETIME;
+-- CHANGE COLUMN update_time updated_at DATETIME;
+
+ALTER TABLE sub_project_item
+DROP  updated_at,
+ADD COLUMN  is_del TINYINT DEFAULT 0,
+ADD COLUMN  deleted_by VARCHAR(255),
+ADD COLUMN  deleted_at DATETIME,
+ADD COLUMN  create_by VARCHAR(255),
+ADD COLUMN  created_at DATETIME,
+ADD COLUMN  update_by VARCHAR(255),
+ADD COLUMN  updated_at DATETIME;

+ 3 - 0
SourceCode/DataMiddleware/app/models/user_data.py

@@ -34,6 +34,9 @@ class UserModel:
     def set_password(self, password: str):
         self._password = password
 
+    def get_password(self) -> str:
+        return self._password
+
     @staticmethod
     def _hash_password(password: str) -> bytes:
         salt = bcrypt.gensalt()

+ 1 - 1
SourceCode/DataMiddleware/app/services/service_user.py

@@ -78,7 +78,7 @@ class UserService:
         user.set_password_hash(new_password)
 
         try:
-            self._user_store.update_user_password(user_id, user._password)
+            self._user_store.update_user_password(user_id, user.get_password())
             return True, "密码更新成功"
         except Exception as e:
             return False, f"密码更新失败:{str(e)}"

+ 21 - 12
SourceCode/DataMiddleware/app/stores/project_store.py

@@ -34,10 +34,11 @@ class ProjectStore:
             sql += " AND (project_name LIKE %s)"
             params_count += (f"%{keyword}%",)
             params += (f"%{keyword}%",)
+        sql_count, params_count = self.filter_data(sql_count, params_count)
+        sql, params = self.filter_data(sql, params)
         sql += " ORDER BY created_at DESC LIMIT %s OFFSET %s"
         params += (per_page, offset)
-        sql_count, params_count = self.filter_data(sql_count, params_count)
-        sql_count, params_count = self.filter_data(sql_count, params_count)
+
         with self._db_helper:
             result_count = self._db_helper.fetch_one(sql_count, params_count)
             count = result_count["count"] if result_count else 0
@@ -120,7 +121,7 @@ class ProjectStore:
         return new_id
 
     def update_sub_project(self, sub_project: SubProjectModel):
-        current_user = self._get_current_user()
+        current_user = sub_project.create_by or self._get_current_user()
         sql = "UPDATE sub_project SET sub_project_name = %s, work_catalog = %s, work_content = %s, standard_version = %s ,status = %s,updated_at = %s,update_by = %s WHERE id = %s"
         params = (
             sub_project.sub_project_name,
@@ -210,7 +211,7 @@ class ProjectStore:
         return data, count
 
     def query_sub_project(self, sub_project_id: int, with_items=False) -> SubProjectModel | None:
-        sql = "SELECT id,project_id,sub_project_name,work_catalog,work_content,standard_version,status,file_paths,created_at FROM sub_project WHERE is_del=0 AND id = %s"
+        sql = "SELECT id,project_id,sub_project_name,work_catalog,work_content,standard_version,status,file_paths,create_by,created_at FROM sub_project WHERE is_del=0 AND id = %s"
         params = (sub_project_id,)
         sql_items = "SELECT id,project_id,sub_project_id,device_name,device_model,standard_version,standard_no,process_status,process_time,send_status,send_time FROM sub_project_item WHERE sub_project_id = %s"
         with self._db_helper:
@@ -226,6 +227,7 @@ class ProjectStore:
                         status=result["status"],
                         file_paths=result["file_paths"],
                         sub_id=result["id"],
+                        create_by=result["create_by"],
                         created_at=result["created_at"])
             if not with_items:
                 return data
@@ -249,8 +251,8 @@ class ProjectStore:
             return data
     def query_sub_project_items_by_project_paginated(self, sub_project_id: int, page: int, per_page: int, keyword: str = None, process_status: int = None,send_status: int = None) -> (list[SubProjectItemModel], int):
         offset = (page - 1) * per_page
-        sql_count = "SELECT COUNT(*) as count FROM sub_project_item WHERE sub_project_id = %s"
-        sql = "SELECT id,project_id,sub_project_id,device_name,device_model,device_unit,device_count,standard_version,standard_no,process_status,process_time,send_status,send_time FROM sub_project_item WHERE sub_project_id = %s"
+        sql_count = "SELECT COUNT(*) as count FROM sub_project_item WHERE is_del=0 AND sub_project_id = %s"
+        sql = "SELECT id,project_id,sub_project_id,device_name,device_model,device_unit,device_count,standard_version,standard_no,process_status,process_time,send_status,send_time FROM sub_project_item WHERE is_del=0 AND sub_project_id = %s"
         params_count = (sub_project_id,)
         params = (sub_project_id,)
 
@@ -269,7 +271,8 @@ class ProjectStore:
             params_count += (send_status,)
             sql += " AND send_status=%s"
             params += (send_status,)
-
+        sql_count, params_count = self.filter_data(sql_count, params_count)
+        sql, params = self.filter_data(sql, params)
         sql += " ORDER BY device_name,device_model LIMIT %s OFFSET %s"
         params += (per_page, offset)
 
@@ -325,7 +328,7 @@ class ProjectStore:
     def insert_sub_project_item_list(self, sub_project):
         if len(sub_project.items) <= 0:
             return
-        sql = "INSERT INTO sub_project_item (project_id,sub_project_id,device_name,device_model,device_unit,device_count,standard_version,standard_no,updated_at) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)"
+        sql = "INSERT INTO sub_project_item (project_id,sub_project_id,device_name,device_model,device_unit,device_count,standard_version,standard_no,create_by,created_at) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
         params_items = []
         for item in sub_project.items:
             params_items.append((
@@ -337,6 +340,7 @@ class ProjectStore:
                 item.device_count,
                 sub_project.standard_version,
                 item.standard_no,
+                sub_project.create_by,
                 datetime.now(),
             ))
         with self._db_helper:
@@ -387,7 +391,8 @@ class ProjectStore:
             )
             return data
     def insert_sub_project_item(self, project_item: SubProjectItemModel):
-        sql = "INSERT INTO sub_project_item (project_id,sub_project_id,device_name,device_model,device_unit,device_count,standard_version,standard_no,process_status,send_status,updated_at) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
+        current_user = self._get_current_user()
+        sql = "INSERT INTO sub_project_item (project_id,sub_project_id,device_name,device_model,device_unit,device_count,standard_version,standard_no,process_status,send_status,create_by,created_at) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
         params = (
             project_item.project_id,
             project_item.sub_project_id,
@@ -399,18 +404,21 @@ class ProjectStore:
             project_item.standard_no,
             project_item.process_status,
             project_item.send_status,
+            current_user,
             datetime.now(),
         )
         with self._db_helper:
            return self._db_helper.execute_non_query(sql, params)
     def update_sub_project_item(self, project_item: SubProjectItemModel) -> bool:
-        sql = "UPDATE sub_project_item SET device_name= %s,device_model= %s,device_unit= %s,device_count= %s,standard_no = %s,updated_at = %s WHERE id = %s"
+        current_user = self._get_current_user()
+        sql = "UPDATE sub_project_item SET device_name= %s,device_model= %s,device_unit= %s,device_count= %s,standard_no = %s,update_by,updated_at = %s WHERE id = %s"
         params = (
             project_item.device_name,
             project_item.device_model,
             project_item.device_unit,
             project_item.device_count,
             project_item.standard_no,
+            current_user,
             datetime.now(),
             project_item.id
         )
@@ -418,8 +426,9 @@ class ProjectStore:
             self._db_helper.execute_non_query(sql, params)
             return True
     def delete_sub_project_item_by_id(self, item_id: int):
-        sql = "DELETE FROM sub_project_item WHERE id = %s"
-        params = (item_id, )
+        current_user = self._get_current_user()
+        sql = "Update sub_project_item SET is_del=1,delete_by=%s,deleted_at=%s WHERE id = %s"
+        params = (current_user, datetime.now(),item_id )
         with self._db_helper:
             self._db_helper.execute_non_query(sql, params)
             return True

+ 0 - 2
SourceCode/DataMiddleware/app/stores/user_store.py

@@ -70,8 +70,6 @@ class UserStore:
             user.set_password(result["password"])
             return user
     def query_user(self, keyword: str) -> UserModel | None:
-        from app.utils import StringHelper
-
         # 构建基础SQL
         base_sql = "SELECT id,username,password,email,phone,name,last_login,delete_by,deleted_at,create_by,created_at,update_by,updated_at FROM user WHERE is_del=0"
         

+ 128 - 102
SourceCode/DataMiddleware/app/ui/templates/auth/login.html

@@ -1,105 +1,131 @@
 <!DOCTYPE html>
 <html lang="zh">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>登录 - 数据中台</title>
-    <link href="{{ url_for('static', filename='bootstrap/bootstrap.css') }}" rel="stylesheet">
-    <style>
-        body {
-            background-color: #f8f9fa;
-            height: 100vh;
-            display: flex;
-            align-items: center;
-            justify-content: center;
-        }
-        .container {
-            width: 100%;
-            display: flex;
-            justify-content: center;
-        }
-        .login-container {
-            background-color: white;
-            padding: 2rem;
-            border-radius: 10px;
-            box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
-            width: 100%;
-            max-width: 400px;
-        }
-        .login-title {
-            text-align: center;
-            color: #333;
-            margin-bottom: 2rem;
-        }
-        .form-floating {
-            margin-bottom: 1rem;
-        }
-        .btn-login {
-            width: 100%;
-            padding: 0.8rem;
-            font-size: 1.1rem;
-            background-color: #0d6efd;
-            border: none;
-        }
-        .btn-login:hover {
-            background-color: #0b5ed7;
-        }
-        .alert {
-            margin-bottom: 1rem;
-        }
-    </style>
-</head>
-<body>
-    <div class="container">
-        <div class="login-container">
-            <h2 class="login-title">数据转换推送系统</h2>
-            {% with messages = get_flashed_messages(with_categories=true) %}
-                {% if messages %}
-                    {% for category, message in messages %}
-                        <div class="alert alert-{{ category if category != 'error' else 'danger' }} alert-dismissible fade show" role="alert">
-                            {{ message }}
-                            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
-                        </div>
-                    {% endfor %}
-                {% endif %}
-            {% endwith %}
-            <form method="POST" action="{{ url_for('auth.login') }}" class="needs-validation" novalidate>
-                <div class="form-floating">
-                    <input type="text" class="form-control" id="keyword" name="keyword" placeholder="用户名/邮箱/手机号" required>
-                    <label for="keyword">用户名/邮箱/手机号</label>
-                    <div class="invalid-feedback">
-                        请输入用户名、邮箱或手机号
-                    </div>
-                </div>
-                <div class="form-floating">
-                    <input type="password" class="form-control" id="password" name="password" placeholder="密码" required>
-                    <label for="password">密码</label>
-                    <div class="invalid-feedback">
-                        请输入密码
-                    </div>
-                </div>
-                <button type="submit" class="btn btn-primary btn-login mt-3">登录</button>
-            </form>
-        </div>
-    </div>
+	<head>
+		<meta charset="UTF-8" />
+		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+		<title>登录 - 数据中台</title>
+		<link href="{{ url_for('static', filename='bootstrap/bootstrap.css') }}" rel="stylesheet" />
+		<style>
+			body {
+				background-color: #f8f9fa;
+				height: 100vh;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+			}
+			.container {
+				width: 100%;
+				display: flex;
+				justify-content: center;
+			}
+			.login-container {
+				background-color: white;
+				padding: 2rem;
+				border-radius: 10px;
+				box-shadow: 0 0 20px rgba(0, 0, 0, 0.1);
+				width: 100%;
+				max-width: 400px;
+			}
+			.login-title {
+				text-align: center;
+				color: #333;
+				margin-bottom: 2rem;
+			}
+			.form-floating {
+				margin-bottom: 1rem;
+			}
+			.btn-login {
+				width: 100%;
+				padding: 0.8rem;
+				font-size: 1.1rem;
+				background-color: #0d6efd;
+				border: none;
+			}
+			.btn-login:hover {
+				background-color: #0b5ed7;
+			}
+			.alert {
+				margin-bottom: 1rem;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="container">
+			<div class="login-container">
+				<h2 class="login-title">数据转换推送系统</h2>
+				{% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} {% for category, message in messages %}
+				<div class="alert alert-{{ category if category != 'error' else 'danger' }} alert-dismissible fade show" role="alert">
+					{{ message }}
+					<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
+				</div>
+				{% endfor %} {% endif %} {% endwith %}
+				<form method="POST" action="{{ url_for('auth.login') }}" class="needs-validation" novalidate>
+					<div class="form-floating">
+						<input type="text" class="form-control" id="keyword" name="keyword" placeholder="用户名/邮箱/手机号" required />
+						<label for="keyword">用户名/邮箱/手机号</label>
+						<div class="invalid-feedback">请输入用户名、邮箱或手机号</div>
+					</div>
+					<div class="form-floating">
+						<input type="password" class="form-control" id="password" name="password" placeholder="密码" required />
+						<label for="password">密码</label>
+						<div class="invalid-feedback">请输入密码</div>
+					</div>
+					<button type="submit" class="btn btn-primary btn-login mt-3">登录</button>
+				</form>
+			</div>
+		</div>
+
+		<script src="{{ url_for('static', filename='jquery/jquery.js') }}"></script>
+		<script src="{{ url_for('static', filename='bootstrap/bootstrap.js') }}"></script>
+		<script>
+			// 表单验证和提交
+			;(function () {
+				'use strict'
+				const forms = document.querySelectorAll('.needs-validation')
+				Array.prototype.slice.call(forms).forEach(function (form) {
+					form.addEventListener('submit', async function (event) {
+						event.preventDefault()
+						if (!form.checkValidity()) {
+							event.stopPropagation()
+							form.classList.add('was-validated')
+							return
+						}
 
-    <script src="{{ url_for('static', filename='jquery/jquery.js') }}"></script>
-    <script src="{{ url_for('static', filename='bootstrap/bootstrap.js') }}"></script>
-    <script>
-        // 表单验证
-        (function () {
-            'use strict'
-            const forms = document.querySelectorAll('.needs-validation')
-            Array.prototype.slice.call(forms).forEach(function (form) {
-                form.addEventListener('submit', function (event) {
-                    if (!form.checkValidity()) {
-                        event.preventDefault()
-                        event.stopPropagation()
-                    }
-                    form.classList.add('was-validated')
-                }, false)
-            })
-        })()
-    </script>
-</body>
-</html>
+						const formData = new FormData(form)
+						try {
+							const response = await fetch(form.action, {
+								method: 'POST',
+								body: formData,
+							})
+							const data = await response.json()
+							if (data.success) {
+								const urlParams = new URLSearchParams(window.location.search)
+								const nextUrl = urlParams.get('next') || '/'
+								window.location.href = nextUrl
+							} else {
+								const alertDiv = document.createElement('div')
+								alertDiv.className = 'alert alert-danger alert-dismissible fade show'
+								alertDiv.setAttribute('role', 'alert')
+								alertDiv.innerHTML = `
+                                ${data.message || '登录失败,请检查用户名和密码'}
+                                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
+                            `
+								form.insertBefore(alertDiv, form.firstChild)
+							}
+						} catch (error) {
+							console.error('登录请求失败:', error)
+							const alertDiv = document.createElement('div')
+							alertDiv.className = 'alert alert-danger alert-dismissible fade show'
+							alertDiv.setAttribute('role', 'alert')
+							alertDiv.innerHTML = `
+                            网络错误,请稍后重试
+                            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
+                        `
+							form.insertBefore(alertDiv, form.firstChild)
+						}
+					})
+				})
+			})()
+		</script>
+	</body>
+</html>

+ 9 - 6
SourceCode/DataMiddleware/app/ui/views_auth.py

@@ -24,12 +24,15 @@ def login():
             # 登录成功,保存用户信息到session
             session['user_id'] = user.id
             session['username'] = user.username
-
-            # 获取next参数,如果存在则重定向到该页面
-            next_page = request.args.get('next')
-            if next_page:
-                return redirect(next_page)
-            return redirect(url_for('project.index'))
+            # next_page = request.args.get('next')
+            # if next_page:
+            #     return jsonify({'success': True,'redirect_url':next_page})
+            return jsonify({'success': True})
+
+            # # 获取next参数,如果存在则重定向到该页面
+            # if next_page:
+            #     return redirect(next_page)
+            # return redirect(url_for('project.index'))
         else:
             # 登录失败,显示错误信息
             return jsonify({'success': False,'error': message})