From faae3ff8b2ddc30f1556e36b59e77490ff358c3f Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Tue, 25 Mar 2025 10:13:18 +0800 Subject: [PATCH] 'commit' --- AI/WxMini/Sql/t_chat_log.sql | 32 ++++++++++- AI/WxMini/Start.py | 26 ++++++++- AI/WxMini/Utils/MySQLUtil.py | 53 +++++++++++++++++- .../__pycache__/MySQLUtil.cpython-310.pyc | Bin 1708 -> 3109 bytes AI/WxMini/__pycache__/Start.cpython-310.pyc | Bin 5108 -> 5901 bytes 5 files changed, 105 insertions(+), 6 deletions(-) diff --git a/AI/WxMini/Sql/t_chat_log.sql b/AI/WxMini/Sql/t_chat_log.sql index 200da8fe..cbb24698 100644 --- a/AI/WxMini/Sql/t_chat_log.sql +++ b/AI/WxMini/Sql/t_chat_log.sql @@ -1,11 +1,37 @@ +/* + Navicat Premium Dump SQL + + Source Server : 10.10.14.210 + Source Server Type : MySQL + Source Server Version : 50742 (5.7.42-log) + Source Host : 10.10.14.210:22066 + Source Schema : ai_db + + Target Server Type : MySQL + Target Server Version : 50742 (5.7.42-log) + File Encoding : 65001 + + Date: 25/03/2025 10:03:37 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for t_chat_log +-- ---------------------------- DROP TABLE IF EXISTS `t_chat_log`; CREATE TABLE `t_chat_log` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `session_id` char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户人员编号', `user_input` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户提出的问题', `model_response` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '大模型的反馈', + `audio_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成的语音文件路径', + `duration` double NULL DEFAULT 0 COMMENT '音频时长,单位:秒', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_session_id` (`session_id`) USING BTREE, - INDEX `idx_create_time` (`create_time`) USING BTREE -) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; \ No newline at end of file + INDEX `idx_session_id`(`session_id`) USING BTREE, + INDEX `idx_create_time`(`create_time`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/AI/WxMini/Start.py b/AI/WxMini/Start.py index cb78bc81..e88b1292 100644 --- a/AI/WxMini/Start.py +++ b/AI/WxMini/Start.py @@ -4,7 +4,7 @@ import time import uuid from contextlib import asynccontextmanager -from fastapi import FastAPI, Form, HTTPException +from fastapi import FastAPI, Form, HTTPException, Query from openai import AsyncOpenAI from WxMini.Milvus.Config.MulvusConfig import * @@ -12,7 +12,7 @@ from WxMini.Milvus.Utils.MilvusCollectionManager import MilvusCollectionManager from WxMini.Milvus.Utils.MilvusConnectionPool import * from WxMini.Utils.OssUtil import upload_mp3_to_oss_from_memory from WxMini.Utils.TtsUtil import TTS -from WxMini.Utils.MySQLUtil import init_mysql_pool, save_chat_to_mysql +from WxMini.Utils.MySQLUtil import init_mysql_pool, save_chat_to_mysql, get_chat_log_by_session from WxMini.Utils.EmbeddingUtil import text_to_embedding # 配置日志 @@ -178,6 +178,28 @@ async def reply(session_id: str = Form(...), prompt: str = Form(...)): # 释放连接 milvus_pool.release_connection(connection) + +# 获取聊天记录 +@app.get("/get_chat_log") +async def get_chat_log( + session_id: str, + page: int = Query(default=1, ge=1, description="当前页码"), + page_size: int = Query(default=10, ge=1, le=100, description="每页记录数") +): + """ + 根据 session_id 查询聊天记录,并按 id 降序分页 + :param session_id: 用户会话 ID + :param page: 当前页码 + :param page_size: 每页记录数 + :return: 分页数据 + """ + try: + result = await get_chat_log_by_session(app.state.mysql_pool,session_id, page, page_size) + return result + except Exception as e: + logger.error(f"查询聊天记录失败: {str(e)}") + raise HTTPException(status_code=500, detail=f"查询聊天记录失败: {str(e)}") + # 运行 FastAPI 应用 if __name__ == "__main__": import uvicorn diff --git a/AI/WxMini/Utils/MySQLUtil.py b/AI/WxMini/Utils/MySQLUtil.py index a8b0028b..8cb2c96d 100644 --- a/AI/WxMini/Utils/MySQLUtil.py +++ b/AI/WxMini/Utils/MySQLUtil.py @@ -41,4 +41,55 @@ async def truncate_chat_log(mysql_pool): async with conn.cursor() as cur: await cur.execute("TRUNCATE TABLE t_chat_log") await conn.commit() - logger.info("表 t_chat_log 已清空。") \ No newline at end of file + logger.info("表 t_chat_log 已清空。") + +# 分页查询聊天记录 +async def get_chat_log_by_session(mysql_pool,session_id, page=1, page_size=10): + """ + 根据 session_id 查询聊天记录,并按 id 降序分页 + :param session_id: 用户会话 ID + :param page: 当前页码 + :param page_size: 每页记录数 + :return: 分页数据 + """ + if not mysql_pool: + raise ValueError("MySQL 连接池未初始化") + + offset = (page - 1) * page_size + async with mysql_pool.acquire() as conn: + async with conn.cursor() as cur: + # 查询总记录数 + await cur.execute( + "SELECT COUNT(*) FROM t_chat_log WHERE session_id = %s", + (session_id,) + ) + total = (await cur.fetchone())[0] + + # 查询分页数据 + await cur.execute( + "SELECT id, session_id, user_input, model_response, audio_url, duration, create_time " + "FROM t_chat_log WHERE session_id = %s ORDER BY id DESC LIMIT %s OFFSET %s", + (session_id, page_size, offset) + ) + records = await cur.fetchall() + + # 将查询结果转换为字典列表 + result = [ + { + "id": record[0], + "session_id": record[1], + "user_input": record[2], + "model_response": record[3], + "audio_url": record[4], + "duration": record[5], + "create_time": record[6].strftime("%Y-%m-%d %H:%M:%S") + } + for record in records + ] + + return { + "data": result, + "total": total, + "page": page, + "page_size": page_size + } \ No newline at end of file diff --git a/AI/WxMini/Utils/__pycache__/MySQLUtil.cpython-310.pyc b/AI/WxMini/Utils/__pycache__/MySQLUtil.cpython-310.pyc index 98649a68a8938539718fd4ffe0a56bda89044ce7..8731b166748eead131cdbe259042f3637d08bbc3 100644 GIT binary patch delta 1469 zcma)6U2Gdg5Z>KepU+NW(!`VmTG&zyn5N;cNXQCBYT_uC;#$O^QIL?ide4a^+h_L9 zf?8*pkP1>rs3KD&N>Xe@#E($Z3IQr=)dyaA;*EQ(@HKuyydaQ(uzOB~DIl?{{WLf8 z&CJf++6b%4N z3W5r@Kpi%~5fB4ZngHkLD;~>JM;)42MYiO+M6m@kuz}h<2)GV6K(+lyJ%ga)b!oB% zEy=2Fj|V<$mHpUr&9^^xmcIJo z>iMnBbrKuvq!raUEkc^tYRxk%Ji^WT!mZYnku7tIvw4==+c$8|U23zKW|mkXQYG#D zT+eUsno4)^lH#Y5&rFi7>ld82Hk`|KXYJGG(t7iwH=E1vFqzwrm!C*RC!?d&WHj;Y z@#zO23X}1vM4XtZ^t@`Oa{3&ZnTSqBJBlGsk&waoEP?X+j&GKtAyWGeJy0cTiDvaw ziRFd}Eiu*PJscuwrm3cuGP8N@|Ai-ssj=u3IW{XAJQhuklF3*+Hq8^0#Q1nJDx|cy z!tO#`=mMY$l3Xy3ahL-Zcz%BcT9AT4z!AELT$EhIF7lD(R(TNA0rfT@Ro1+#=tab* z!sk}$_NgTjv?KxI`)YXvhz6GTgk}$i@`po|geD@@P&^V!hP^h*Qg$ad+y0WFu~fED zESYv7uTw3TVwzFZ3tYXQ6WHB?)z#6VFtioJWEs(|FtX9`Beu-6w9Y6C2nQE>-Pj|! ztYN10eDP?UKO1{_{XhoDFaILL-Q5lGukv>J(46+yJ58NDmD(Bb;gOu4R&&NtF6;&i zV;fV|RBex`n`+L+Vnl79Kz9_wvh6>i=1N+WF`cn~ajT$!+j)LqD;dp9&+7$kM^baS zu%8VIf@leQT)+{*l=V!;&`j3;j|uf-LhWsrYp{JnbxYBA{6`@VbFPtik|TNrD+=sJ zeXtK=gdm3gKl(715LA%=_kc&1c!z#Q0R+XyzXfmX-5!9$+bqJJ!^nN#?4Xc?wf8*N byAE)XiT^8$)LxM9hxgT9mk(m4E1>)d@r0F6 delta 92 zcmZ1~v4)o~pO=@50SMOeJxV{sI+0I?F>j)F9xG!ogC_sR6;{lQQIj7tCow8)c4HA? rWRnA`ERvs`z-rH?2xMvsPv+&`&!zwpRh)dCTa8g^@;`26CLV48_ktA9 diff --git a/AI/WxMini/__pycache__/Start.cpython-310.pyc b/AI/WxMini/__pycache__/Start.cpython-310.pyc index fbbaaf2eb2f5e19243ed37e623f812c9c0eb9221..197a0985f151e6cc7e0c19d5b0ac20b05bdd678a 100644 GIT binary patch delta 1608 zcmZWoU2GIp6rM9PyF2avwcG7>TlzC?X<=w7KavouA|zm}$UlP4%ewBpty^Yy>z!G# zb?Z_}j2I?ht|S^_Yz>(71u*y%jJ&Avf#{o0^QhU{KJlQBf}T6AP1U=(-=6cGpSkDU zbN|@n4h@u|(RvA&*7(cVXpbcQDwOq0LuD^+`^tL*`>KU{vmPWO5!DJ8B4)&w16K5; z;DT1H5I5tiT!YVrtj0pZO!%B;H5HO((wFP3=0eI$67pq-@ujLd$(zJRsU+(~ziKSnl@ z&BVayEv||c!wG*I1H1yApz>?b8S(d(mIvJ}pmU(3| zV^iDCmx_0G%ijY;_@BzK){Hl_ATgcqQIBhQjgkSZ=gtS}6CqgUKZg&&!kwN-ovf$P z#99S(Ab2r9b*WgSIR`VcI6oLOAjQiu7j|=i3p1$ zEZ(||F-tdZ*X~_iyn5SE*_+6+3W6tFluZjkoycOAYMuDY*!d}%Q;_~=1yB%4zr$^d z#4|7zcO(bK<#DAVRiGlzsv~%-&q~uuML8{;&e5M0P?I9MEgh zNAf&?y!#b|Txx0(*O?`C)GI^peetcu;)+b9d z@7As_tQ7a)n@hF3UoKv{sH1uLL$~(z<=Q)MW9|HRZC4cw8`jsi(9b(Ok!9I}zE<|I z{-1WOcrogfSrOy?eAq=ijBhzyZo?z~|17oZpDlfUV_0X8qnSM|Nma?HV=-k)X6+MNOi|ab13lG0d+LMJ6DO+@pcv1E#1WnSQSpy9skd`B$iH&julKiKp eu1=|nni2!`p$zh0vMfK6mB>RasX72oR$8rAu<0-Q8<}Wa&$3Rn9X}0FpoYEnN%XeM#X%BZILk!X$C{Jg}coS*KzPh*K!>arf<{&==7^PfD5!0S%n~dA4wadd_v*C zKSahkr0CB`%0J2J6b)*VP@-jR8LrV?t**^;JNplE^o#ZhdbFg^oc{sLF8GMXccTo3 zfk!Uc#-vj?N3MI?c3UmWX^{$VS*MTnQgG;Zcd+xoB7XW#Z-7iyV=2RrHPmnK)-1;= z-|AX+r`+gvI3Ypm7#V+vzd)hSjXZ?uTcZRCdTh-1z3j2tT61xwTCFTLmRIV{`a-Qj zlDuE%kmta|4#TyTrAoEAaC5nNqjHzjxhL(ooi4e@dwN_4dJnA)mpDTo={f)9_HKav t@4`^N(sohL##dSToY0wPo-D|~9|d$#0ht%$3TX6mA}7mz84{xO=P!!Mychrg