From f754072e08f6dcbefdee0a51e4b4d23d40ddca85 Mon Sep 17 00:00:00 2001 From: root <13910913995@163.com> Date: Tue, 19 Aug 2025 18:18:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E6=89=BE=E5=9B=9E?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/main.py | 116 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 93 insertions(+), 23 deletions(-) diff --git a/backend/main.py b/backend/main.py index a62a49be..05050e67 100644 --- a/backend/main.py +++ b/backend/main.py @@ -435,23 +435,74 @@ class AppServer: @self.app.route('/api/auth/forgot-password', methods=['POST']) def forgot_password(): - """忘记密码""" + """忘记密码 - 根据用户名和手机号找回密码""" try: data = flask_request.get_json() username = data.get('username') + phone = data.get('phone') if not username: - return jsonify({'success': False, 'error': '用户名不能为空'}), 400 + return jsonify({ + 'success': False, + 'error': '请输入用户名' + }), 400 + + if not phone: + return jsonify({ + 'success': False, + 'error': '请输入手机号码' + }), 400 - # 这里应该发送重置密码邮件,简化处理 - return jsonify({ - 'success': True, - 'message': '密码重置邮件已发送,请查收邮箱' - }) + # 验证手机号格式 + import re + phone_pattern = r'^1[3-9]\d{9}$' + if not re.match(phone_pattern, phone): + return jsonify({ + 'success': False, + 'error': '手机号格式不正确' + }), 400 + # 查询用户信息 + conn = self.db_manager.get_connection() + cursor = conn.cursor() + + cursor.execute(''' + SELECT username, password, phone FROM users + WHERE username = ? AND phone = ? + ''', (username, phone)) + + user = cursor.fetchone() + + if user: + # 用户存在且手机号匹配,返回数据库中存储的实际密码 + actual_password = user['password'] + + self.logger.info(f'用户 {username} 密码查询成功') + + return jsonify({ + 'success': True, + 'password': actual_password, # 返回数据库中存储的实际密码 + 'message': '密码找回成功' + }) + else: + # 检查用户是否存在 + cursor.execute('SELECT username FROM users WHERE username = ?', (username,)) + user_exists = cursor.fetchone() + + if not user_exists: + return jsonify({ + 'success': False, + 'error': '用户不存在' + }), 400 + else: + return jsonify({ + 'success': False, + 'error': '手机号不匹配' + }), 400 + except Exception as e: self.logger.error(f'忘记密码处理失败: {e}') - return jsonify({'success': False, 'error': str(e)}), 500 + return jsonify({'success': False, 'error': '处理失败'}), 500 # ==================== 用户管理API ==================== @@ -732,22 +783,41 @@ class AppServer: result = self.config_manager.set_all_device_configs(data) - # 如果配置设置成功,重启设备数据推送 + # 如果配置设置成功,异步重启设备数据推送 if result['success']: - try: - self.logger.info("设备配置更新成功,重启设备数据推送...") - # 先停止当前的数据推送 - if self.is_pushing_data: - self.stop_device_push_data() - time.sleep(1) # 等待停止完成 - - # 重新启动设备数据推送 - self.start_device_push_data() - result['message'] = result.get('message', '') + ' 设备已重启数据推送。' - self.logger.info("设备配置更新并重启数据推送完成") - except Exception as restart_error: - self.logger.error(f"重启设备数据推送失败: {restart_error}") - result['message'] = result.get('message', '') + f' 但重启设备数据推送失败: {str(restart_error)}' + def restart_devices_async(): + """异步重启设备数据推送""" + try: + self.logger.info("设备配置更新成功,异步重启设备数据推送...") + # 先停止当前的数据推送 + if self.is_pushing_data: + self.stop_device_push_data() + time.sleep(1) # 等待停止完成 + + # 重新启动设备数据推送 + self.start_device_push_data() + self.logger.info("设备配置更新并重启数据推送完成") + + # 通过SocketIO通知前端重启完成 + self.socketio.emit('device_restart_complete', { + 'status': 'success', + 'message': '设备重启完成' + }, namespace='/devices') + + except Exception as restart_error: + self.logger.error(f"重启设备数据推送失败: {restart_error}") + # 通过SocketIO通知前端重启失败 + self.socketio.emit('device_restart_complete', { + 'status': 'error', + 'message': f'设备重启失败: {str(restart_error)}' + }, namespace='/devices') + + # 启动异步线程执行重启操作 + restart_thread = threading.Thread(target=restart_devices_async) + restart_thread.daemon = True + restart_thread.start() + + result['message'] = result.get('message', '') + ' 设备正在后台重启中,请稍候...' status_code = 200 if result['success'] else 400 return jsonify(result), status_code