优化注册功能

This commit is contained in:
赵杰 Jie Zhao (雄狮汽车科技)
2025-11-03 12:29:32 +08:00
parent f50d37259e
commit 7ab87e8f15
10 changed files with 829 additions and 83 deletions

View File

@@ -135,6 +135,50 @@ class DataManager:
)
''')
# 餐食记录表
cursor.execute('''
CREATE TABLE IF NOT EXISTS meal_records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT,
date TEXT,
meal_type TEXT,
foods TEXT,
quantities TEXT,
calories REAL,
satisfaction_score INTEGER,
food_items TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users (user_id)
)
''')
# 反馈记录表
cursor.execute('''
CREATE TABLE IF NOT EXISTS feedback_records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT,
date TEXT,
recommended_foods TEXT,
user_choice TEXT,
feedback_type TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users (user_id)
)
''')
# 问卷记录表
cursor.execute('''
CREATE TABLE IF NOT EXISTS questionnaire_records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT,
questionnaire_type TEXT,
answers TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users (user_id),
UNIQUE(user_id, questionnaire_type)
)
''')
# 分析结果表
cursor.execute('''
CREATE TABLE IF NOT EXISTS analysis_results (
@@ -195,66 +239,95 @@ class DataManager:
return None
# 解析用户基本信息
data_dict = json.loads(result[0])
try:
data_dict = json.loads(result[0])
except json.JSONDecodeError as e:
logger.error(f"解析用户数据JSON失败: user_id={user_id}, error={e}")
conn.close()
return None
# 获取餐食记录
cursor.execute('''
SELECT date, meal_type, foods, quantities, calories, satisfaction_score, food_items
FROM meal_records
WHERE user_id = ?
ORDER BY date DESC
''', (user_id,))
meal_rows = cursor.fetchall()
# 获取餐食记录(如果表存在)
meals = []
for row in meal_rows:
meal = {
'date': row[0],
'meal_type': row[1],
'foods': json.loads(row[2]) if row[2] else [],
'quantities': json.loads(row[3]) if row[3] else [],
'calories': row[4],
'satisfaction_score': row[5],
'food_items': json.loads(row[6]) if row[6] else []
}
meals.append(meal)
try:
cursor.execute('''
SELECT date, meal_type, foods, quantities, calories, satisfaction_score, food_items
FROM meal_records
WHERE user_id = ?
ORDER BY date DESC
''', (user_id,))
meal_rows = cursor.fetchall()
for row in meal_rows:
try:
meal = {
'date': row[0],
'meal_type': row[1],
'foods': json.loads(row[2]) if row[2] else [],
'quantities': json.loads(row[3]) if row[3] else [],
'calories': row[4],
'satisfaction_score': row[5],
'food_items': json.loads(row[6]) if row[6] else []
}
meals.append(meal)
except (json.JSONDecodeError, IndexError) as e:
logger.warning(f"解析餐食记录失败: {e}")
continue
except sqlite3.OperationalError as e:
# 表不存在,跳过
logger.warning(f"meal_records表不存在跳过: {e}")
# 获取反馈记录
cursor.execute('''
SELECT date, recommended_foods, user_choice, feedback_type
FROM feedback_records
WHERE user_id = ?
ORDER BY date DESC
''', (user_id,))
feedback_rows = cursor.fetchall()
# 获取反馈记录(如果表存在)
feedback = []
for row in feedback_rows:
fb = {
'date': row[0],
'recommended_foods': json.loads(row[1]) if row[1] else [],
'user_choice': row[2],
'feedback_type': row[3]
}
feedback.append(fb)
try:
cursor.execute('''
SELECT date, recommended_foods, user_choice, feedback_type
FROM feedback_records
WHERE user_id = ?
ORDER BY date DESC
''', (user_id,))
feedback_rows = cursor.fetchall()
for row in feedback_rows:
try:
fb = {
'date': row[0],
'recommended_foods': json.loads(row[1]) if row[1] else [],
'user_choice': row[2],
'feedback_type': row[3]
}
feedback.append(fb)
except (json.JSONDecodeError, IndexError) as e:
logger.warning(f"解析反馈记录失败: {e}")
continue
except sqlite3.OperationalError as e:
# 表不存在,跳过
logger.warning(f"feedback_records表不存在跳过: {e}")
# 获取问卷数据
cursor.execute('''
SELECT questionnaire_type, answers
FROM questionnaire_records
WHERE user_id = ?
''', (user_id,))
questionnaire_rows = cursor.fetchall()
# 获取问卷数据(如果表存在)
preferences = {}
for row in questionnaire_rows:
preferences[row[0]] = json.loads(row[1]) if row[1] else {}
try:
cursor.execute('''
SELECT questionnaire_type, answers
FROM questionnaire_records
WHERE user_id = ?
''', (user_id,))
questionnaire_rows = cursor.fetchall()
for row in questionnaire_rows:
try:
preferences[row[0]] = json.loads(row[1]) if row[1] else {}
except (json.JSONDecodeError, IndexError) as e:
logger.warning(f"解析问卷记录失败: {e}")
continue
except sqlite3.OperationalError as e:
# 表不存在,跳过
logger.warning(f"questionnaire_records表不存在跳过: {e}")
conn.close()
# 构建完整的用户数据
user_data = UserData(
user_id=data_dict['user_id'],
user_id=data_dict.get('user_id', user_id),
profile=data_dict.get('profile', {}),
meals=meals,
feedback=feedback,
@@ -266,7 +339,7 @@ class DataManager:
return user_data
except Exception as e:
logger.error(f"获取用户数据失败: {e}")
logger.error(f"获取用户数据失败: user_id={user_id}, error={e}", exc_info=True)
return None
def save_analysis_result(self, result: AnalysisResult) -> bool: