From 2fc8b1e7ed9f7e8a71261fcef3a702a0259ac69e Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Mon, 17 Mar 2025 13:09:35 +0800 Subject: [PATCH] 'commit' --- .../Model/__pycache__/biModel.cpython-310.pyc | Bin 3336 -> 3958 bytes AI/Text2Sql/Model/biModel.py | 48 ++++++++++---- AI/Text2Sql/__pycache__/app.cpython-310.pyc | Bin 8175 -> 8622 bytes AI/Text2Sql/app.py | 59 +++++++++++++++--- .../655fa01e-58a7-45c9-8602-56e5b5d1cdcf.xlsx | Bin 0 -> 6192 bytes .../a288b53d-f4af-4ba3-bc51-eb15ae4ec62d.xlsx | Bin 0 -> 6195 bytes 6 files changed, 87 insertions(+), 20 deletions(-) create mode 100644 AI/Text2Sql/static/xlsx/655fa01e-58a7-45c9-8602-56e5b5d1cdcf.xlsx create mode 100644 AI/Text2Sql/static/xlsx/a288b53d-f4af-4ba3-bc51-eb15ae4ec62d.xlsx diff --git a/AI/Text2Sql/Model/__pycache__/biModel.cpython-310.pyc b/AI/Text2Sql/Model/__pycache__/biModel.cpython-310.pyc index 4c4601c52d0279b899834966d4f99d05f083b665..89f959b3a3e5ad69448e9cd857b8fa710a17a296 100644 GIT binary patch delta 1031 zcmaKr&ubGw6vuZqo6YVf+2*h|o7lt=i)qr@+Q#}T6pU?(!Pr0(1%ps!XVa#njZU^o zLqr7+Ud#LgdJ%IF1fl;H4Me0_dT_NLwua>CZgsI8S{5+vqJspKW1Eo`E)NJ1nGv9B8+syj)>Anza4 zMMxB4y;tYA#j-?B5e&Hzf(k>^(T4=hOViUb_Wd$PK5CBqKX>4k^Hwu|tX0eD9{RDfc8Koy1Hnnl3zE@E*s0b51&&@2D zw)@eJO?TN_Ejd}2At64OkRj1|a4iI;KlnB-ROd}b*@6~~b(wGW5pj=sF@JldIFX3= z^Bg_>7kU?}g-S}Fs&ietDN>YW$DEp zZDw%Bkg8nG`G3InKJq2lPcL&bq##~r2WlwTRj>*Le-w1l6#F1YSj)SQ9CqIqlGB_b zz@GVL;xXQf|0bQgPA9p?FGol9&dbmg57X?6?`)J`aYZmBQ!!Ly)KE;fshfJhV|oIr Gsr&}o(#oX( delta 431 zcmew+*CEB1&&$ij00f#n*V7O2OyrYcy1_6}XN5@`Q;KMcSPM%OR|-=qLlz^DFP2icYtATjJ)rr? z%phB!fE7rCY&{IbMOr{Ylhv=vXYzbjt;x?gwb-;l!n%_`@`y~<;*#gq2XPI6L^9*# zgY4oepQV88M#dDzTE-fN1q?Ne3mH8bQW!iKYME-7fbL-OtFoP}#I7Sz9A8{nT#}lr zV5?xrr2qs)${?fECo}R0Pd4RN7WvEp7v$1hPQ}*?|m_ERIjk z&&f$mF2OMABaa?;9LP{(5MeU;0h{b(7QSta>63T!NwQgiOyQk;i%(x(10)X$2(VAU sb`_a`xF9t}Y+xsO@$*TE0l6FuA}kUdBAg;(A{-K|5_|%D0-O?@09|rc<^TWy diff --git a/AI/Text2Sql/Model/biModel.py b/AI/Text2Sql/Model/biModel.py index 2fc3e79b..e9d615b5 100644 --- a/AI/Text2Sql/Model/biModel.py +++ b/AI/Text2Sql/Model/biModel.py @@ -48,11 +48,13 @@ async def get_question_by_id(db: asyncpg.Connection, question_id: str): _data = await db.fetch(select_sql, question_id) return _data + # 根据 SQL 查询数据 async def get_data_by_sql(db: asyncpg.Connection, sql: str): _data = await db.fetch(sql) return _data + # 保存系统推荐 async def set_system_recommend_questions(db: asyncpg.Connection, question_id: str, flag: str): sql = """ @@ -82,21 +84,45 @@ async def set_user_collect_questions(db: asyncpg.Connection, question_id: str, f # 查询系统推荐问题 -async def get_system_recommend_questions(db: asyncpg.Connection): - sql = """ - SELECT * FROM t_bi_question WHERE is_system = 1 +async def get_system_recommend_questions(db: asyncpg.Connection, offset: int, limit: int): + query = """ + SELECT * + FROM t_bi_question where is_system=1 ORDER BY id DESC LIMIT $1 OFFSET $2; """ - _data = await db.fetch(sql) - return _data + return await db.fetch(query, limit, offset) -# 查询用户收藏问题 -async def get_user_collect_questions(db: asyncpg.Connection): - sql = """ - SELECT * FROM t_bi_question WHERE is_collect = 1 +async def get_system_recommend_questions_count(db: asyncpg.Connection): + query = """ + SELECT COUNT(*) + FROM t_bi_question where is_system=1; """ - _data = await db.fetch(sql) - return _data + return await db.fetchval(query) + + +async def get_user_publish_questions(db: asyncpg.Connection, type_id: int, offset: int, limit: int): + # 基础查询 + query = """ + SELECT * + FROM t_bi_question + """ + + # 根据 type_id 动态添加 WHERE 条件 + if type_id == 1: + query += " WHERE is_collect = 1" + + # 添加排序和分页 + query += " ORDER BY id DESC LIMIT $1 OFFSET $2;" + + # 执行查询 + return await db.fetch(query, limit, offset) + + +async def get_user_publish_questions_count(db: asyncpg.Connection): + query = """ + SELECT COUNT(*) FROM t_bi_question; + """ + return await db.fetchval(query) # 获取数据集的字段名称 diff --git a/AI/Text2Sql/__pycache__/app.cpython-310.pyc b/AI/Text2Sql/__pycache__/app.cpython-310.pyc index 8e51a99350f99a129449121aee697188f3814c0f..7ea2669cadea6a97b1f50a7a3a5949ec90910b97 100644 GIT binary patch delta 1406 zcma)4T}&KR6rOYM%|rO=9CwNfdG@{uN?vP?lG;xyi&6#t~ zcYfxa8@020J*nJWRl=v~gC9G}b`E|Y;_uzZ z9=F{)(Y=W^pnDyhubQJN%$?W3K@wF{M7zBr&N`(nE|e zg~?+CV;w!z1d|4&9@!w{)RZTnM=@mPG?hLAlA#EuDfiJ;E=Z=5-i3VED&KIRA0t=2 z>4tkePMfJP99!jAoh8m3(|JK+ZtisjLb;i>gv`V4GhNI(MzQVne2=So%O>3Ji7qW| zbf%K+oow;aM~fehE{;vz_9wKkORmFE>g&*q_BF!cZsb_x z#iZr#(2|-SH?;QjiDQ;>T<=U8oTy)hw_pKs$}Owlr7FnaQdE5Vs7$k#x)yD$$4dwm^+z01bMErvgPV$lnMQ=lm`V!vZ+}Dp1_3*Pz}NMp*oUFZO4a zCqBM5ej4XqUKqVT``)jgd{$7tEUv#Rim-HX5CfLZ%`IhSm(L9TGiCThd5sI9+tG5hao567CKdS5Ra8D>A z+eKrc!ki*3s!xa%le{(bsy9aLN%iw~LcNav5^B4DHwL9$Xd$P9iWgMSr?SoAG{7|f zW@8(kQGR4=&a_A}BjA1B8mWXvJ`i~T=J{Nt7OJy1BlQ6Fd`GkqUgl;rR@N^f&k7h4 zz!5BpztW<3=lZy?O$wM2FwZYXD~KDolHUT``1ASCl{$!ujmRr9kU#M!{XwXE#TEW{ JEB`dV@-Kuvjbi`+ delta 1049 zcmZ`$O=whC6n^L4_hw$+O-++DF*g1zA}F&7Y0guk!PqxX zF!F|IMg@PynjE#zq$E+hNCJg2bRoJZlr9Qgxe>A`6tt8UabX3QJ@<_nq~L|~@!jwI z-gCe2ec4qyQBq=Qd{*b4p4ikfQ~DwF{LnliI*$X!?WU87;{rQy*CitZ$?bOi;x^p9 z1h#26WZ<2MJ=p0-?C>K#nUx!-_F|VWeazBk{FIZ55O51NWrfeW3#_NWdVQ8JZeYyb zf}gSVvGud%$FXo94)~RK+O4?%l(+@Xf^D2^!_RRL58y#Ol+{7A5Qa2miNm=S`MZR_ z>1wcc3XQb%z>^Uzt-G)&Jbek$hAT1P85seZt9!!JGGf1m+JMG)L)|?+Bi9wrNbN*{ zLDc8Pkmd&1&zX5|s{0*J(9bl`#GR;Eq2*b8{3-#8y`VsW<6 z3QMrmGqG%5@-xb5+U&?ZH%EYyRShKt~8`~i?(SQ-#KK%rK>EDs%77ET8Tt?4-8 zjwFCOYvM%-;j}6(O4}n*dR((wUMYg^WLm1l66Vm`j2(Zq5CTPfr9VopSm`vr-s-^uuA>0E@;nP ziS+<<)35adkfCrqk+`NJuPc~QaGPOG^4R_goCT%bQ?N>7@mBGdMvL(wXr_PT$IK|0 LK{k`lZEX7wnBfhZ diff --git a/AI/Text2Sql/app.py b/AI/Text2Sql/app.py index 4bad420a..ec60ef91 100644 --- a/AI/Text2Sql/app.py +++ b/AI/Text2Sql/app.py @@ -59,12 +59,14 @@ async def get_db(): async with app.state.pool.acquire() as connection: yield connection + # 初始化 OpenAI 客户端 client = AsyncOpenAI( api_key=MODEL_API_KEY, base_url=MODEL_API_URL, ) + @app.post("/questions/get_excel") async def get_excel(question_id: str = Form(...), question_str: str = Form(...), db: asyncpg.Connection = Depends(get_db)): @@ -261,19 +263,58 @@ async def set_user_collect( @app.get("/questions/get_system_recommend") -async def get_system_recommend(db: asyncpg.Connection = Depends(get_db)): # 添加 db 参数 - # 查询所有系统推荐问题 - system_recommend_questions = await get_system_recommend_questions(db) +async def get_system_recommend( + db: asyncpg.Connection = Depends(get_db), # 数据库连接 + page: int = Query(1, description="当前页码,默认为 1"), # 页码参数 + page_size: int = Query(10, description="每页数据量,默认为 10") # 每页数据量参数 +): + # 计算 OFFSET + offset = (page - 1) * page_size + + # 查询分页后的系统推荐问题 + system_recommend_questions = await get_system_recommend_questions(db, offset, page_size) + + # 查询总数据量 + total = await get_system_recommend_questions_count(db) + # 返回查询结果 - return {"success": True, "data": system_recommend_questions} + return { + "success": True, + "data": system_recommend_questions, + "pagination": { + "page": page, + "page_size": page_size, + "total": total # 总数据量 + } + } + + +@app.get("/questions/get_user_questions") +async def get_user_questions( + db: asyncpg.Connection = Depends(get_db), # 数据库连接 + page: int = Query(1, description="当前页码,默认为 1"), # 页码参数 + page_size: int = Query(10, description="每页数据量,默认为 10"), # 每页数据量参数 + type_id: int = Query(1, description="1:用户收藏的问题,0:全部") +): + # 计算 OFFSET + offset = (page - 1) * page_size + + # 查询分页后的用户收藏问题 + user_questions = await get_user_publish_questions(db, type_id, offset, page_size) + # 查询总数据量 + total = await get_user_publish_questions_count(db) -@app.get("/questions/get_user_collect") -async def get_user_collect(db: asyncpg.Connection = Depends(get_db)): # 添加 db 参数 - # 查询所有用户收藏问题 - user_collect_questions = await get_user_collect_questions(db) # 返回查询结果 - return {"success": True, "data": user_collect_questions} + return { + "success": True, + "data": user_questions, + "pagination": { + "page": page, + "page_size": page_size, + "total": total # 总数据量 + } + } # 获取数据库字段名 diff --git a/AI/Text2Sql/static/xlsx/655fa01e-58a7-45c9-8602-56e5b5d1cdcf.xlsx b/AI/Text2Sql/static/xlsx/655fa01e-58a7-45c9-8602-56e5b5d1cdcf.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..ca577c51a2bdd526b4f21596a11237bd0e3a0599 GIT binary patch literal 6192 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 NvY7h4K>hpfe*gw$