From 8a9d6a30f62c0a2f23950b8054fb7f03551794dc Mon Sep 17 00:00:00 2001 From: zstar <65890619+zstar1003@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:56:27 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=94=A8=E6=88=B7=E5=88=9B=E5=BB=BA=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E9=80=BB=E8=BE=91=E4=B8=BAUTC+8=20(#63)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将用户创建和密码重置的时间获取和格式化逻辑修改为使用UTC+8时区(Asia/Shanghai),以确保时间存储的一致性。此修改避免了不同时区用户时间显示不一致的问题。 --- .github/ISSUE_TEMPLATE/feature_request.yml | 57 ++++--------------- management/server/requirements.txt | 3 +- management/server/services/users/service.py | 63 ++++++++++++++------- requirements.txt | 1 - 4 files changed, 56 insertions(+), 68 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 6d06f86..2262b2c 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -3,50 +3,13 @@ description: Propose a feature request for RAGFlow-Plus. title: "[Feature Request]: " labels: ["💞 feature"] body: - - type: checkboxes - attributes: - label: Self Checks - description: "Please check the following in order to be responded in time :)" - options: - - label: I have searched for existing issues [search for existing issues](https://github.com/infiniflow/ragflow/issues), including closed ones. - required: true - - label: I confirm that I am using English to submit this report ([Language Policy](https://github.com/infiniflow/ragflow/issues/5910)). - required: true - - label: Non-english title submitions will be closed directly ( 非英文标题的提交将会被直接关闭 ) ([Language Policy](https://github.com/infiniflow/ragflow/issues/5910)). - required: true - - label: "Please do not modify this template :) and fill in all the required fields." - required: true - - type: textarea - attributes: - label: Is your feature request related to a problem? - description: | - A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - render: Markdown - validations: - required: false - - type: textarea - attributes: - label: Describe the feature you'd like - description: A clear and concise description of what you want to happen. - validations: - required: true - - type: textarea - attributes: - label: Describe implementation you've considered - description: A clear and concise description of implementation you've considered or investigated. - validations: - required: false - - type: textarea - attributes: - label: Documentation, adoption, use case - description: If you can, explain some scenarios how users might use this, situations it would be helpful in. Any API designs, mockups, or diagrams are also helpful. - render: Markdown - validations: - required: false - - type: textarea - attributes: - label: Additional information - description: | - Add any other context or screenshots about the feature request here. - validations: - required: false \ No newline at end of file +- type: markdown + attributes: + value: | + 请尽可能详细地描述你的需求。 +- type: textarea + attributes: + label: 描述你想要的新功能 + description: 尽可能结合业务场景,清晰地描述 + validations: + required: true \ No newline at end of file diff --git a/management/server/requirements.txt b/management/server/requirements.txt index 99f7de0..656750d 100644 --- a/management/server/requirements.txt +++ b/management/server/requirements.txt @@ -11,4 +11,5 @@ transformers==4.49.0 elasticsearch==8.12.0 minio==7.2.4 strenum==0.4.15 -peewee==3.17.1 \ No newline at end of file +peewee==3.17.1 +pytz==2020.5 \ No newline at end of file diff --git a/management/server/services/users/service.py b/management/server/services/users/service.py index e25e0b6..25ac468 100644 --- a/management/server/services/users/service.py +++ b/management/server/services/users/service.py @@ -1,4 +1,5 @@ import mysql.connector +import pytz from datetime import datetime from utils import generate_uuid, encrypt_password from database import DB_CONFIG @@ -97,7 +98,10 @@ def delete_user(user_id): return False def create_user(user_data): - """创建新用户,并加入最早用户的团队,并使用相同的模型配置""" + """ + 创建新用户,并加入最早用户的团队,并使用相同的模型配置。 + 时间将以 UTC+8 (Asia/Shanghai) 存储。 + """ try: conn = mysql.connector.connect(**DB_CONFIG) cursor = conn.cursor(dictionary=True) @@ -146,9 +150,18 @@ def create_user(user_data): # 加密密码 encrypted_password = encrypt_password(password) - current_datetime = datetime.now() - create_time = int(current_datetime.timestamp() * 1000) - current_date = current_datetime.strftime("%Y-%m-%d %H:%M:%S") + # --- 修改时间获取和格式化逻辑 --- + # 获取当前 UTC 时间 + utc_now = datetime.utcnow().replace(tzinfo=pytz.utc) + # 定义目标时区 (UTC+8) + target_tz = pytz.timezone('Asia/Shanghai') + # 将 UTC 时间转换为目标时区时间 + local_dt = utc_now.astimezone(target_tz) + + # 使用转换后的时间 + create_time = int(local_dt.timestamp() * 1000) # 使用本地化时间戳 + current_date = local_dt.strftime("%Y-%m-%d %H:%M:%S") # 使用本地化时间格式化 + # --- 时间逻辑修改结束 --- # 插入用户表 user_insert_query = """ @@ -165,9 +178,9 @@ def create_user(user_data): ) """ user_data_tuple = ( - user_id, create_time, current_date, create_time, current_date, None, + user_id, create_time, current_date, create_time, current_date, None, # 使用修改后的时间 username, encrypted_password, email, None, "Chinese", "Bright", "UTC+8 Asia/Shanghai", - current_date, 1, 1, 0, "password", + current_date, 1, 1, 0, "password", # last_login_time 也使用 UTC+8 时间 1, 0 ) cursor.execute(user_insert_query, user_data_tuple) @@ -188,16 +201,16 @@ def create_user(user_data): if user_count > 0: # 如果有现有用户,复制其模型配置 tenant_data = ( - user_id, create_time, current_date, create_time, current_date, username + "'s Kingdom", - None, str(earliest_tenant['llm_id']), str(earliest_tenant['embd_id']), - str(earliest_tenant['asr_id']), str(earliest_tenant['img2txt_id']), + user_id, create_time, current_date, create_time, current_date, username + "'s Kingdom", # 使用修改后的时间 + None, str(earliest_tenant['llm_id']), str(earliest_tenant['embd_id']), + str(earliest_tenant['asr_id']), str(earliest_tenant['img2txt_id']), str(earliest_tenant['rerank_id']), str(earliest_tenant['tts_id']), str(earliest_tenant['parser_ids']), str(earliest_tenant['credit']), 1 ) else: # 如果是第一个用户,模型ID使用空字符串 tenant_data = ( - user_id, create_time, current_date, create_time, current_date, username + "'s Kingdom", + user_id, create_time, current_date, create_time, current_date, username + "'s Kingdom", # 使用修改后的时间 None, '', '', '', '', '', '', '', "1000", 1 ) @@ -214,11 +227,11 @@ def create_user(user_data): ) """ user_tenant_data_owner = ( - generate_uuid(), create_time, current_date, create_time, current_date, user_id, + generate_uuid(), create_time, current_date, create_time, current_date, user_id, # 使用修改后的时间 user_id, "owner", user_id, 1 ) cursor.execute(user_tenant_insert_owner_query, user_tenant_data_owner) - + # 只有在存在其他用户时,才加入最早用户的团队 if user_count > 0: # 插入用户租户关系表(normal角色) @@ -232,7 +245,7 @@ def create_user(user_data): ) """ user_tenant_data_normal = ( - generate_uuid(), create_time, current_date, create_time, current_date, user_id, + generate_uuid(), create_time, current_date, create_time, current_date, user_id, # 使用修改后的时间 earliest_tenant['id'], "normal", earliest_tenant['id'], 1 ) cursor.execute(user_tenant_insert_normal_query, user_tenant_data_normal) @@ -247,11 +260,11 @@ def create_user(user_data): %s, %s, %s, %s, %s, %s, %s ) """ - + # 遍历最早用户的所有tenant_llm配置并复制给新用户 for tenant_llm in earliest_user_tenant_llms: tenant_llm_data = ( - create_time, current_date, create_time, current_date, user_id, + create_time, current_date, create_time, current_date, user_id, # 使用修改后的时间 str(tenant_llm['llm_factory']), str(tenant_llm['model_type']), str(tenant_llm['llm_name']), str(tenant_llm['api_key']), str(tenant_llm['api_base']), str(tenant_llm['max_tokens']), 0 ) @@ -260,7 +273,7 @@ def create_user(user_data): conn.commit() cursor.close() conn.close() - + return True except mysql.connector.Error as err: print(f"创建用户错误: {err}") @@ -291,7 +304,8 @@ def update_user(user_id, user_data): def reset_user_password(user_id, new_password): """ - 重置指定用户的密码 + 重置指定用户的密码。 + 时间将以 UTC+8 (Asia/Shanghai) 存储。 Args: user_id (str): 用户ID new_password (str): 新的明文密码 @@ -304,8 +318,19 @@ def reset_user_password(user_id, new_password): # 加密新密码 encrypted_password = encrypt_password(new_password) # 使用与创建用户时相同的加密方法 - update_time = int(datetime.now().timestamp() * 1000) - update_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + + # --- 修改时间获取和格式化逻辑 --- + # 获取当前 UTC 时间 + utc_now = datetime.utcnow().replace(tzinfo=pytz.utc) + # 定义目标时区 (UTC+8) + target_tz = pytz.timezone('Asia/Shanghai') + # 将 UTC 时间转换为目标时区时间 + local_dt = utc_now.astimezone(target_tz) + + # 使用转换后的时间 + update_time = int(local_dt.timestamp() * 1000) # 使用本地化时间戳 + update_date = local_dt.strftime("%Y-%m-%d %H:%M:%S") # 使用本地化时间格式化 + # --- 时间逻辑修改结束 --- # 更新用户密码 update_query = """ diff --git a/requirements.txt b/requirements.txt index 8067b51..1909c9c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -109,7 +109,6 @@ graspologic>=3.4.1,<4.0.0 pymysql>=1.1.1,<2.0.0 mini-racer>=0.12.4,<0.13.0 pyodbc>=5.2.0,<6.0.0 -pyicu>=2.13.1,<3.0.0 flasgger>=0.9.7.1,<0.10.0 xxhash>=3.5.0,<4.0.0 trio>=0.29.0 \ No newline at end of file