# W2 t" S/ Z; C+ ]# 配置跨域问题% g, x4 L$ k. P$ p7 m6 l0 B) t
origins = [+ a( ^5 r8 Q2 j9 f! K5 \
"http://localhost:8000",; A2 F) g6 B+ C7 i- @8 N
"http://localhost:3000"3 d) y% y( a A+ }+ n- t" W
]. t- _5 c* }) r$ H* u# {: ?# p
4 i! P7 o% X& A" R# 全局主题模型训练对象" {. B6 }* k. }2 T, |
topic_model_training_tasks: Dict[str, TopicModelTrainingTask] = {} 3 I7 i9 Q; ^8 m& n4 Y6 I3 ~8 o, m" U2 J
app.add_middleware( , U' N! \: I: v6 m* v Y CORSMiddleware,) I% n3 z6 s& B6 A! w2 R
allow_origins=origins,& b* l, w6 u/ R# a' x9 `
allow_credentials=True,1 u# f+ ` e- M4 o" k* [
allow_methods=["*"],# V% G- @% R D" z: }
allow_headers=["*"], 1 C3 l# ~, e5 ]" S. K" g/ k) * b$ j5 E3 u6 M0 s: l# d y( a/ {# B ?+ O
5 M9 {5 i5 |- O ? |' h# 数据库连接依赖) p% D+ [" j* P
def get_db():. t" v3 V. `6 q; G* n" H
try:) ~: M# P. A1 I# L# p
db = SessionLocal() + A( i' X4 Q% z- D* J: N' H% }/ J yield db, }& i( S( r: @0 s' x. x% f
finally: 2 G V2 S7 M! i3 k* T0 G% e1 b db.close() 1 X ~+ ?$ ~- J U N7 ` + U4 r: \; R# d% n N) h) h W8 Z* Y
@app.get(6 B! |0 }& K A& Z5 ]$ I
"/bilibilivideos/", 2 H/ U1 n6 \% r3 r& o response_model=List[schemas.BilibiliVideo], + J4 i8 g4 N+ N! K+ N tags=['bilibili视频评论语料库数据接口']' n) F3 Z8 Z/ B7 P' a, q' k
) " _* A1 ]* v# ~4 l9 ?def get_bilibili_videos(db: Session = Depends(get_db)): 6 ]! N( u4 r' X$ u+ I! }9 p db_videos = crud.get_bilibili_videos(db); `" c+ W6 t2 x: I! v
return db_videos / P9 [5 J, [. n2 X; E! U7 Q2 y
: `. F4 F* b8 q d2 W- S* {
@app.get($ O) p4 x9 @' k$ J `9 U
"/bilibilivideos/{vid}/",* O. Z4 I% y* D3 |) E
response_model=schemas.BilibiliVideo,0 s, U8 a$ j9 z- _
tags=['bilibili视频评论语料库数据接口']. _$ y2 x2 C; \( ^9 ^9 W+ t( \6 Y4 T
) ( N9 u$ c- S% z( u. c; t0 Ddef get_bilibili_videos_by_vid(vid: int, db: Session = Depends(get_db)):8 l4 c% e# ^; c% I- w' o. d. ^
db_video = crud.get_bilibili_videos_by_vid(vid, db) 3 M, B9 h( r- M5 E) Q" |) W return db_video5 V; t# t) `; u2 [) r" ]3 q8 |
: y B* G/ U, B8 |% H# }8 N
$ Z3 g; v: d( c
@app.get(, c/ h3 `6 J( j$ o6 W2 X6 i: C* D
"/bilibilivideos/{vid}/comments/",+ P# x; h2 f" R4 m. D
response_model=List[schemas.BilibiliVideoComment], 1 R% a% `/ i8 W tags=['bilibili视频评论语料库数据接口']# R1 g+ _- Z- R7 C0 c3 M, b+ _
) 1 C8 H; y# X# p( A/ l" T/ gdef get_bilibili_video_comments_by_vid(vid: int, db: Session = Depends(get_db)): ; z: r0 K2 z4 C7 D' y! ?, L db_comments = crud.get_bilibili_video_comments_by_vid(vid, db): v7 O7 M1 H4 o E
return db_comments * O0 g* \- u% [9 ^ . y' k, Y0 F9 p8 r+ X' S % z7 T( S* L6 V9 R2 I) I@app.get(5 X4 P& T6 Z& g# d! V* V- L# n) e
"/onlineShoppingReviews/", : c- f9 }3 A9 Q* Y' l% H response_model=List[schemas.OnlineShoppingReview]," e8 w) q. l3 j
tags=['电商购物评价语料库数据接口'] ) S3 ^% B9 D" _2 I) 1 d( Q) K+ ^1 _def get_online_shopping_reviews(db: Session = Depends(get_db)): * c f( Q. ]2 n% O db_reviews = crud.get_online_shopping_reviews(db)$ s6 ~' l/ L3 O5 _6 Y/ |
return db_reviews ( _/ K# P3 v3 \ Q $ W/ ~" j! d8 \) w( f- {5 A) R) U. \, I( J! l) m4 W/ n
@app.get( : n) J+ ^- F* K* e# g( p* t "/takeawayReviews/", ! j& n2 T P& w$ [# \1 |( I response_model=List[schemas.TakeawayReview], c9 r- V: j* i" C& m4 h tags=['外卖评价语料库数据接口'] " P- V) [" _4 M \) |5 ?' r& J& `# ]; ]) [# e, E
def get_takeaway_reviews(db: Session = Depends(get_db)): ( x2 r& Q1 a2 L& ] db_reviews = crud.get_takeaway_reviews(db); P7 Y/ |$ |: ]3 v8 l7 ?5 Y
return db_reviews8 b4 P |2 J) t
* _: g+ k+ J- j2 z
$ w8 Q# D; ^. K6 @1 u@app.get( 7 k+ }# Y5 Q5 `) t+ o1 E. l+ Y$ \ "/chineseLyrics/", ' M, x% N- Z. x0 _* f: d response_model=List[schemas.ChineseLyrics]," B7 a$ V& m: m! o! U8 {
tags=['中文歌歌词语料库数据接口'] ! a, u* \5 P( k) : {; |! C9 Q: _/ hdef get_chinese_lyrics(db: Session = Depends(get_db)): ' S3 P1 u8 W* j0 N3 s db_reviews = crud.get_chinese_lyrics(db) 0 g9 g& H, y% a( `3 p' N) s t; ~9 k return db_reviews/ }. O- O/ G5 l' F) k9 R! w0 z; X" R
1 u$ a* }# u h6 P: S; \; i! m) o % U4 L: d! |2 C5 R8 P( F@app.get( * O# U% ?) L+ b5 H "/COVID19News/", & c# T5 o) W; ~% e" ~& P response_model=List[schemas.COVID19News], ! @8 c& O) C9 H$ P tags=['新冠病毒新闻语料库数据接口'] 7 g5 F+ y' a+ b( C8 I)1 W; F5 ^ Q# e* o& u
def get_COVID19_news(db: Session = Depends(get_db)): % `1 g+ J& y- R8 Q. a* I3 c6 ~2 e3 j db_reviews = crud.get_COVID19_news(db) * a' f! C4 a$ Y0 b2 T5 V { return db_reviews7 g% d0 R- K: ?7 j3 f4 X+ y
+ U$ `# o7 v) @4 p
/ T: a3 U; @6 L
# 为每个用户设置uuid标识符,并存入Cookie) c) O4 I# C+ {, P
def create_user_uuid_and_set_cookie(response: Response): & Y/ Z, [# h# G8 w: V0 U0 V user_uuid = str(uuid.uuid1()) : m; \1 Q7 I0 `- x0 @, c4 W' [3 n response.set_cookie(key="user_uuid", value=user_uuid)- Y# i2 a8 O" H0 l+ e
return user_uuid $ _* v) Q7 K- G; C0 J l5 [3 q, V: m- h+ a/ X
( K$ X; [- e( \- J( C$ o- O@app.post(& h, q6 X3 G3 P
"/calculate/preprocessing/",$ @1 W9 U3 W, p) L" `
tags=["计算模块数据接口"]! ^) J$ M2 W8 H" e/ \: ^
)% r& A6 K O) ?0 Z4 D
async def run_text_preprocessing_task(text_preprocessing_params: TextPreprocessingParams, 3 ^9 G8 k0 s( o( @7 K; l background_task: BackgroundTasks, 5 [9 V, y" M/ l response: Response, 7 r! U/ a1 ^( s$ C B user_uuid: str = Cookie(None)): : }6 k+ A! _3 k$ _ if not user_uuid: . p, v) i: J. l user_uuid = create_user_uuid_and_set_cookie(response) 8 ] q9 z7 M$ v$ D) x. s ; \$ G) A- _! } N) _! Q global topic_model_training_tasks0 S% u, Q* f3 M0 `5 q) D. m
task = TopicModelTrainingTask(text_preprocessing_params)! c: X) J; Z+ v: I
topic_model_training_tasks[user_uuid] = task: Z2 A1 N6 j9 t3 J! ~. @7 Z
4 ~, Y* b, F* P8 k background_task.add_task(task.preprocessing) $ D3 K& G; R; W! R. K# H return {"message": "已添加文本预处理后台任务"}! Q1 o, m' F1 D4 v
7 \/ d% W) p- b8 l% l( B- M
1 @2 Q* }! y5 p2 H* ^; Q8 Y$ I+ T
@app.post( & _# f3 Q5 s+ \: Q2 C$ S "/calculate/nmftraining/", 5 n: L( p1 E2 B1 ?9 s0 Q tags=["计算模块数据接口"]+ \: P) f$ n) H: ^% ?! w
)' q# \2 |. l0 ~7 `6 Q1 r
async def run_nmf_training_and_tsne_task(nmf_training_params: NMFTrainingParams,; l7 q% e4 ~# C+ ]
background_task: BackgroundTasks, % i( X1 I/ j1 d response: Response,3 F7 o& X" V6 w7 B
user_uuid: str = Cookie(None)):" S+ A# E" [5 n' T2 B
if not user_uuid: ' ]+ t J: t# T" n: @/ z$ j user_uuid = create_user_uuid_and_set_cookie(response)7 B6 y/ |5 L4 o6 e8 B+ m
' @- N' V' `3 n# g: R
global topic_model_training_tasks : G6 y u* o$ |8 O: A$ O" i# ^& {& U% d , ~' O- Q2 I( q1 m% l if user_uuid and user_uuid in topic_model_training_tasks: : J; G- m/ V# J1 R; R4 p task = topic_model_training_tasks[user_uuid] ) a1 ?; A0 @3 s' R if task.text_preprocessing_progress.status_code == 2: 9 {# z! G; m% R( G, ] background_task.add_task(task.nmf_training, nmf_training_params) ! z, R* Z9 G+ ?, V3 f return {"message": "已添加NMF主题模型训练后台任务"} $ u) b) u% I( | else:/ w9 q5 B1 s& O& S( t
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!")* k& C9 j* E, w! y
else:7 X6 e8 P Y, ]/ `+ K4 s, N9 p
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")- i! C8 D" \2 x0 Y# W
( l! H" i9 Y8 R+ h
2 ?( k( o9 l! e3 Q' q" Y6 i" g@app.get(% k" a7 W# X1 l r1 S- m
"/calculate/nmftraining/keywordsearch/", & k- r K! P- |$ r* {6 B response_model=KeywordSearchResult,. p2 ?& I2 P8 o0 e8 e
tags=["用户交互"]6 H( D( i n$ I& b* Y) W1 A
) 9 `5 [$ K! I& `' j3 I8 B, Tasync def search_keyword(search_text: str,! S" j3 ~# _8 ^
response: Response,2 s p, b. O' Z$ ?
user_uuid: str = Cookie(None)):4 G6 d2 W; d: S
if not user_uuid:1 ]6 {8 k$ l( C2 t
user_uuid = create_user_uuid_and_set_cookie(response) , F0 R8 G+ C( q. f; I# H1 l6 c! u$ m: E0 H. C
global topic_model_training_tasks * X; J* \& F7 `7 f, Y , v" b3 H* f9 M5 C if user_uuid and user_uuid in topic_model_training_tasks:% U( s$ {$ |. U: n% r
task = topic_model_training_tasks[user_uuid]- C- N: H" G3 ^( ?. R1 X
if task.text_preprocessing_progress.status_code == 2:: K, e$ @: F' ?3 H; g
search_text = search_text.lower()/ d. m& N' u$ n2 k% `3 M+ a/ N
bag_words = task.text_preprocessing.bagWords ( W, D" i0 @- Z F* Q( x* k keyword_search_result = KeywordSearchResult() 0 }: U( |. P# q6 o for wi, word in enumerate(bag_words):) ~% ~; z: T1 S9 X3 q6 W. t
if search_text in word:5 [3 f( Q2 T/ Y: L
keyword_search_result.word_id_list.append(wi)3 O; ?+ F+ M- N0 Y
keyword_search_result.word_list.append(word)6 [/ j+ n7 u7 M5 S1 }3 X9 t- [1 t' U: z
return keyword_search_result 2 W) f$ T# [9 z else:% O! ?9 D: i: y' F
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!")4 _- L; N' r3 U- k8 B) r# t
else:* `0 ], |" U! W, Y J, }9 a
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")/ K5 J8 D- v! l8 G; B
! y8 k" G- m J' F3 u; {0 d# m- Y3 M! ^ q. m2 S7 F
@app.post(! k0 E+ r' a6 W. l
"/calculate/nmftraining/topickeywordoptimization/", 6 s* j- @! _' b) j6 Z tags=["用户交互"]0 A; U% w# A+ Y7 x, o+ F: [2 O8 H
)8 V. [0 v0 `5 A; P+ K, {) {6 g8 q
async def run_topic_keyword_optimization_task(tko_params: TopicKeywordOptimizationParams,/ ^ \+ w" j) ^9 {: W
background_task: BackgroundTasks, 3 v7 @# [ Z ^) B5 W response: Response, U C6 m6 W2 n/ Z: A user_uuid: str = Cookie(None)):! f }- V' |, Y# X
if not user_uuid: % z( A% b, L0 O) O: ? user_uuid = create_user_uuid_and_set_cookie(response) ' v' n* t8 a2 x4 P$ N- J: A; Z* N. _3 e# \# N- h
global topic_model_training_tasks0 y/ H8 n. ]7 l. v7 ?
2 [$ _; X7 [+ f( @- w$ B( z if user_uuid and user_uuid in topic_model_training_tasks: , m5 j1 z6 A" e, q task = topic_model_training_tasks[user_uuid] ! z ]3 q' G1 D* W" ?6 U if task.nmf_training_progress.status_code == 2:' X. @6 c" k, w: [5 Z6 h
background_task.add_task(task.topic_keyword_optimization, tko_params)) K# |. n2 O1 M+ G+ ^
return {"message": "已添加主题关键词优化后台任务"}0 {1 A9 y( J% @# o- n' E7 l; b
else:+ b, j/ q4 {4 }8 j- t8 j
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") & H. k: N2 w L) M else:9 r* }" [3 } e' P' {. \6 a
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") ; Y) o$ V, Y7 i& r( O# I5 c + o' x0 B8 O. ~+ ? * U- b t7 |8 P) m@app.post( L3 T1 [5 G3 \* d8 K "/calculate/nmftraining/topicsplit/", 6 k% w3 w4 Q1 ]- l; G5 E0 ^+ B! y tags=["用户交互"] 7 c1 x& R6 P& A6 a6 ~9 `6 }0 W) 4 c% d V: ]% J0 y/ r: u, Basync def run_topic_split_task(ts_params: TopicSplitParams, 6 m! e+ l& `; h- ~5 K3 S$ { background_task: BackgroundTasks, 8 G/ z# M# Q l; J9 S response: Response, : ~* {6 t; n7 b( l- [- B8 M user_uuid: str = Cookie(None)): " X" C. K7 {( @+ {/ K. s* H; W if not user_uuid:8 T' ^" }9 R. @2 g/ Z
user_uuid = create_user_uuid_and_set_cookie(response) & q/ u" Z: z( o6 k' Q0 Y p$ v0 Y% N X$ B. N. } u/ x* K8 g
global topic_model_training_tasks. \# w v; Z5 _+ K8 G
3 o& M- U9 [6 u) k' A- D: C( d
if user_uuid and user_uuid in topic_model_training_tasks:3 B; ~; e3 W' @7 X8 P
task = topic_model_training_tasks[user_uuid]6 V7 ~/ P. l+ i$ s
if task.nmf_training_progress.status_code == 2:* J3 q( b0 h b/ P }; ]6 ~
background_task.add_task(task.topic_split, ts_params) : g7 P* ]: m X p" U; Z return {"message": "已添加主题拆分后台任务"} + N0 @) S1 {2 k9 \ else: ! u M/ r7 Y- ~2 ]% X0 n raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") B0 w" X6 b W* e: q K else: 1 g- `' `) n/ F/ p+ e1 e! ^/ } raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 3 C, K) U6 M5 G+ E 3 O( T: x# f: Q" }1 X" S) q* ?# U. @9 `7 n# H+ q9 t* {
@app.post( " y) f+ ]2 {- \, m: d# ] "/calculate/nmftraining/topicmerge/",) ?3 K4 }' @3 V" P: E4 @
tags=["用户交互"] J1 }% _1 C+ \* |)+ f! X3 c# h* C. X
async def run_topic_merge_task(tm_params: TopicMergeParams,8 q! P. K5 K3 [$ z8 l
background_task: BackgroundTasks,; f' U7 ~/ H* ~! d& L. U2 _
response: Response, $ g9 d$ n: w2 Y6 W$ D6 C2 i user_uuid: str = Cookie(None)):% h; ~& F% d/ f; w. Y6 @" e* K
if not user_uuid: : x) y O3 v2 e6 Z6 d6 s user_uuid = create_user_uuid_and_set_cookie(response) 1 [6 r/ t0 P! d0 g0 R% \: s% c L6 @ ; J1 A) ~+ Z/ J b# a' e! B$ F( N& I global topic_model_training_tasks ' y7 t8 K6 P) |2 b' R' t* R# X( o / k4 m, \8 W: r! z& B if user_uuid and user_uuid in topic_model_training_tasks: ; \# A' Z6 p6 _9 d task = topic_model_training_tasks[user_uuid] , x: p- g/ Y1 X8 h6 j+ T* ?7 Y if task.nmf_training_progress.status_code == 2:+ f$ V o! d, s
background_task.add_task(task.topic_merge, tm_params) . r6 c2 { N7 G" d: }: x return {"message": "已添加主题合并后台任务"}/ L. B0 c% w# y: g8 S, `1 ^1 u! h
else: & p y- [" z5 I( M2 J' C* _ raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") # O' s; g% Z7 G/ ]7 b {9 x- N8 ~ else:& a% x4 B E5 |: \5 D
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 3 c# o z2 P9 [1 Z' [3 n 4 ~1 `6 { G" \4 Q# | 2 W8 p8 G2 z; O- ~@app.post(" ?* W1 M3 B3 V) u
"/calculate/nmftraining/keywordinducedtopiccreate/", 9 E+ |: Q2 d' C tags=["用户交互"] ' z- x& {) ?3 y. x( H' @9 x% i)2 j- `4 @5 ~7 e+ `& c. Y* ]/ f
async def run_keyword_induced_topic_create_task(kitc_params: KeywordInducedTopicCreateParams, / k$ T7 o4 T( \# j9 H background_task: BackgroundTasks,( n) |/ _& m( t* S) i g
response: Response,) y/ t: |& J6 |+ F6 ` ]
user_uuid: str = Cookie(None)):3 ]) w- k# b9 S) }# h3 A0 L
if not user_uuid: " F3 e+ p5 s/ L user_uuid = create_user_uuid_and_set_cookie(response) 1 ~& k6 ~( B c1 \! O % E) M: e! N# h global topic_model_training_tasks ( h! g* a, s8 r( G0 H3 e / n- O9 {) Y6 u if user_uuid and user_uuid in topic_model_training_tasks: 6 ?8 F4 S% P Y# ]3 }$ i4 V% y7 e task = topic_model_training_tasks[user_uuid]$ I( o9 O" S: q6 H/ a/ m0 @' v8 Q
if task.nmf_training_progress.status_code == 2: + u: @. g7 e! f# n7 h% U! O5 v background_task.add_task(task.keyword_induced_topic_create, kitc_params) : s% }, t2 x F: y( n( W. Z. \ return {"message": "已添加关键词诱导主题创建后台任务"}1 Y; q/ F8 E: Y; Q3 J
else: . r" Z4 B+ H$ U1 M4 r. o raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ) c. A" a, ^) G, n3 D else: 7 L- k9 Y3 w6 `4 A- K/ |) | raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 6 Y G7 r6 x; J2 h1 E3 U# M* C7 ]( i6 m2 t
6 a( ^7 \- T+ C8 o% `: q$ X
@app.post( 2 {; D! S8 F# f' Z2 s "/calculate/nmftraining/documentinducedtopiccreate/"," ^' V& r! s/ o
tags=["用户交互"] % Q0 Z( {) a# b4 H! A) x9 _- c- ~) 4 w/ ?- b5 J, l* O& M, dasync def run_document_induced_topic_create_task(ditc_params: DocumentInducedTopicCreateParams, : e; f) |/ @+ I( C- H background_task: BackgroundTasks,$ [: x+ L8 [& u7 k, j
response: Response, 9 j# z$ U' ]) ?8 v8 _ user_uuid: str = Cookie(None)): , E J2 u1 k) m& |* w+ ~) \ if not user_uuid:# _; _5 S+ b% F) A6 v
user_uuid = create_user_uuid_and_set_cookie(response)( U, U' K3 V A) z& l
! M' T' z9 b+ \. r }. r
global topic_model_training_tasks ( s1 k4 ^! L: A/ T% C 8 n& |; B2 x1 ^: U if user_uuid and user_uuid in topic_model_training_tasks: 7 H2 C$ g$ `/ h5 G8 G1 d8 V9 \ task = topic_model_training_tasks[user_uuid] 7 C+ @& p1 ?- R6 w5 P4 } if task.nmf_training_progress.status_code == 2: 3 L9 r" b' p' K3 W4 H- [6 c. Y background_task.add_task(task.document_induced_topic_create, ditc_params): X9 R4 x5 M& i0 t0 F
return {"message": "已添加文档诱导主题创建后台任务"}! z/ B" V7 t* X4 G8 H( f7 Q
else: ( Z$ t( e. w0 y- H3 r! l2 @ raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 2 L0 {8 D! ^/ |: q; _ O else: " f# `0 O4 m# y! B9 y/ k( s3 m raise HTTPException(status_code=404, detail="未找到相应的训练对象!"). k; z; W$ {. u3 o$ ^+ S
9 X, ]6 c g _1 y) r2 `. d 0 Q$ d' M ]# K' ~6 _% ~" y@app.get() @+ ?( W6 L$ }: V
"/calculate/nmftraining/newdoctopicdistributionpredict/",7 S: t. V8 a. p
tags=["主题预测"] ! ^8 w* M- s$ R0 R)8 b" d% @& L, Q" T5 S
async def run_new_document_topic_distribution_predict_task(" p E0 S+ M: m8 \- o7 I2 D
new_doc_text: str,( G! P4 `. b8 a: F
background_task: BackgroundTasks,, C0 l1 N* u+ R! \- z% I
response: Response, 1 h" g& ], p2 f& Q6 K. Z* |" x user_uuid: str = Cookie(None)):; B: C& U6 }0 l0 n" P
if not user_uuid: 3 `' J# R" f( G: I user_uuid = create_user_uuid_and_set_cookie(response) $ f7 M3 W- Z9 u. [; b+ k' T+ W j* O1 B' }! p2 ~; | L
global topic_model_training_tasks3 v0 m m( [/ }( u3 F
; {3 E1 _% C. e4 R. X1 I. J if user_uuid and user_uuid in topic_model_training_tasks:3 C( _+ i" S# R0 q
task = topic_model_training_tasks[user_uuid] ! j2 L5 A+ p1 U# k+ U% M if task.nmf_training_progress.status_code == 2:# j3 y1 M" R9 Y! R5 |! s4 [- ?/ i
background_task.add_task(; x6 b/ U+ |2 E4 G5 b6 g
task.new_doc_topic_distribution_predict," u& l1 h5 ^' n' L" ~8 n% U+ e. Q& F
new_doc_text0 `2 b# w8 u; e7 g2 O! U
)9 P. _8 j% y1 L. F( ]
return {"message": "已添加新文档主题分布预测后台任务"}- B$ I( U! ^7 |1 ?2 V, e
else:" M, O, w$ X8 ~, h* u. d( R
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") : k! ]9 N7 p* [ else: 2 _6 ~6 W$ w5 M' J8 J. c* ? raise HTTPException(status_code=404, detail="未找到相应的训练对象!")9 t, A, q/ N3 V/ { [0 X! C# t
( C/ M5 ?( A# G, d+ P' z7 q" x$ e* ~/ P% @
@app.get(5 l& [7 B2 A G$ b( |3 G4 F
"/calculate/preprocessing/progress/", ) V4 w, ~) x( x' d$ H, d: p tags=["计算模块数据接口"],- w. U# n# H" L6 j; ^
response_model=TextPreprocessingProgress ( z3 E; h6 w* H8 K3 }7 b" k)8 E1 Q6 Y1 s) {+ o" u) P
def get_text_preprocessing_task_progress(user_uuid: str = Cookie(None)): 8 E* K2 e2 H/ p global topic_model_training_tasks 4 g3 M q. t$ j1 i# d( ^7 o2 u( y% `' \. h5 o( R) B
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):" f! w' Y9 i$ ?7 t* E2 t
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")$ L4 E% Y5 r7 q. e k2 |
return topic_model_training_tasks[user_uuid].text_preprocessing_progress* i$ z4 P2 W; c; H: B$ }$ n7 L% W
: H7 f3 G; R* ]. D! W' j* }
* Y. z `) _! z9 _1 d
@app.get( , @1 F6 i# ]$ `% {% r) w "/calculate/nmftraining/progress/",: a5 S" z+ H" c& z2 ]) z+ y4 p
tags=["计算模块数据接口"],% t, L' p+ y3 i4 \
response_model=NMFTrainingProgress; a/ b6 }5 f6 g a" G ?# h
)5 D+ s( V7 K5 E8 q
def get_nmf_training_task_progress(user_uuid: str = Cookie(None)): : v$ G; V6 V9 U% z3 T global topic_model_training_tasks ) r$ t2 w; d& h' V1 b2 Y' P+ ^) a$ ]0 Z! W2 u; c! C
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): % d1 Q' j( b. z9 {- e1 ? raise HTTPException(status_code=404, detail="未找到相应的训练对象!")5 w9 A ?& @. n. v
, N+ j+ P2 J' e+ J
task = topic_model_training_tasks[user_uuid] 7 U. t0 K+ Q& F$ ]! m+ i5 X, l if task.text_preprocessing_progress.status_code == 2: . R3 M# ?; B* i' h% ^2 i# [! q9 X return task.nmf_training_progress . j( T/ P8 f% Y* V; I0 L' L else:7 o3 r/ h$ h" M! L" ` ?0 l8 l
raise HTTPException(status_code=404, detail="请先进行文本预处理任务!")& j- y; }1 t3 z( ?
* h7 ?; M" O) c3 n! E% c3 G& {
+ t1 J* K0 x" J( W% \1 ?
@app.get(% G; l4 ]" s7 j7 U0 K. F9 i
"/calculate/umap/progress/", 0 G& [6 S: p# \) o2 I8 B tags=["计算模块数据接口"],8 m/ ?" O7 Z! @, X. o$ W4 k0 y0 p
response_model=UMAPProgress# y1 C3 ^5 p! {% H( u
) $ t9 B" y' @8 n |def get_umap_task_progress(user_uuid: str = Cookie(None)):) _1 x: S, E7 a# h0 `% t
global topic_model_training_tasks ! L7 M6 _/ X0 \# _& k, h- H' g9 c+ `% `
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): & _- L6 e0 |/ ~5 r- N! G$ A$ ~ raise HTTPException(status_code=404, detail="未找到相应的训练对象!")$ e+ f0 N0 O1 x0 P: u: E& R1 ?
% ~- Q& V- V4 Z5 C/ R' ~5 D3 q task = topic_model_training_tasks[user_uuid]& C- P3 i, L& ]8 k) O# b1 {- e$ T
if task.nmf_training_progress.status_code == 2:" C! [7 G# z* F0 ^" O4 ?2 l
return task.umap_progress- p2 a2 J1 A1 q
else: 5 S- W) z: d7 K8 ]8 v- }1 A raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")3 A) X, T$ G7 a) [
, j1 l9 r% E5 `' \ ! a* ?9 f+ p3 d/ h! ~& j@app.get( , B9 e) ~2 }* Z6 B7 D+ z J "/calculate/nmftraining/predict/progress/",; |6 o6 ^" p! v; ~
tags=["计算模块数据接口"], 8 V7 j! {3 R a# }7 m) n response_model=NewDocTopicDistributionPredictProgress + X( y/ N) o& s. Z& |$ e)5 @: ~7 D o0 s" Y9 s0 G
def get_new_doc_topic_distribution_predict_task_progress(user_uuid: str = Cookie(None)): . S, A' n/ q# G' b- z$ T8 n" e global topic_model_training_tasks % g* |, c* B8 b) b3 m+ w6 n6 o/ g) }1 m, F+ `+ R3 S
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): j5 q# p+ c! m8 j4 Q/ O! y
raise HTTPException(status_code=404, detail="未找到相应的训练对象!") / i# P! }5 @3 f" o- M% n! K; w0 u, F4 b' K$ k$ z! U5 N9 E* ^
task = topic_model_training_tasks[user_uuid]+ n* Z+ l# a l; L% C/ Z% i
if task.nmf_training_progress.status_code == 2:( Q" c/ C i$ j+ {% O1 m+ J
return task.topic_distribution_predict_progress6 u" v/ x8 S7 u
else: & ]0 m/ r" Z% w; m. G8 a2 Q4 E6 | raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")$ r/ s" H, i" |, l n6 U
6 | d) W: S4 A2 c! Z4 b" l+ Q- A! O, O9 p5 |" _, R* O! O) T
@app.get(6 U* r( A/ L+ | l
"/calculate/details/document/",: J9 V1 W' m$ c4 I$ A
tags=["计算模块数据接口"], 1 P7 a; P1 r$ R* ?, l5 Q/ \# q, Y response_model=DocumentDetails $ z B% d) W; X) x+ t) 3 n, y* \) A3 zdef get_document_details(doc_id: int, user_uuid: str = Cookie(None)): + s5 u4 |; Y. ^& K0 E6 U global topic_model_training_tasks 1 M4 V5 A$ }9 L* E. T$ D' [1 U3 W1 ]6 W$ [1 V# X6 z$ P
if (not user_uuid) or (user_uuid not in topic_model_training_tasks):) O0 v* [& _% K; H4 Y
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")% N* i: u( N+ ]* K, m# Z& r6 B, a# n
+ p6 b; u* M4 B4 C: b( ?
task = topic_model_training_tasks[user_uuid] 4 ^ _# u# u+ ^/ i if task.nmf_training_progress.status_code == 2: ' F( ^% A9 G5 o7 v0 K return task.get_document_details(doc_id) * E9 V7 j6 ?- L4 e0 s else: % i# n! x+ w- H# A4 r& \1 n5 H5 ~ raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") 2 M+ w$ q8 W0 j6 g2 n8 `6 S# Z! {2 F; b' V0 Y6 Z
1 E0 S7 g$ }; b# E
@app.get(" a6 J. o( m, ^- x+ ~+ Z( Y! H0 o% r0 G2 C& T
"/calculate/details/topic/", ( r; Q% l( \6 C/ N! T3 {; t. n tags=["计算模块数据接口"], " P. c- V c% s1 X response_model=TopicDetails 3 r1 U/ v; m; w3 o) % z9 f6 ?8 T0 E r; T" odef get_topic_details(topic_id: int, user_uuid: str = Cookie(None)): $ }, Z" @8 h* V8 |: x' Z ?5 U% D y global topic_model_training_tasks( D. X, [/ b5 Y% e/ F
& X2 i8 C: R" V" A5 P
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): 7 }4 o* a" D- g; {! X' B; Q raise HTTPException(status_code=404, detail="未找到相应的训练对象!") 3 X0 r y! C$ o: q& [" y, @- J1 H1 |9 a1 |; P6 H$ H
task = topic_model_training_tasks[user_uuid]- A7 x% m8 q. e' N. c) }
if task.nmf_training_progress.status_code == 2: 1 R7 G! h. r1 A return task.get_topic_details(topic_id) 5 e, N3 y, d2 A \) g5 D r else: * [) X6 N% E& G" y raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")# d ]7 L) J) X0 E/ O$ s3 B
/ q0 ?. {) u' g" }+ [
6 s5 u4 v: E: w& O@app.get( ( S( J/ H! u" [1 O "/calculate/userinteraction/info/keyword/", 1 ?& B: I5 O4 `) H tags=["计算模块数据接口"], C6 E% b% b. C& ~6 v3 o response_model=TopicKeywordInfo8 r. s% K `4 G/ ]( ~) E0 C6 l
)) w: k9 E7 W" s, Q0 w) L+ O' ]' {
def get_topic_keyword_info(topic_id: int, user_uuid: str = Cookie(None)):) O; u' O$ a" c; _( t# J
global topic_model_training_tasks$ V# P2 q' Q1 i
# M- N( y8 M- L1 G if (not user_uuid) or (user_uuid not in topic_model_training_tasks):' j0 W) a( x5 \! [5 z
raise HTTPException(status_code=404, detail="未找到相应的训练对象!")7 P9 u/ B0 d% v+ S! m: @
. g- I; Q% A6 E6 ]! I* U( y; ?9 M0 | task = topic_model_training_tasks[user_uuid] / w+ ~7 X4 A% W) b& A if task.nmf_training_progress.status_code == 2:& u4 L* s' x/ K- u& ^
return task.get_topic_keyword_info(topic_id)2 a+ l. c8 ^9 D+ X/ ]/ V# D
else:" @5 j3 D( a- Q* W) E1 ^- o' Z
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!")' l9 n3 K" H3 P \: H- {
, ]3 ]6 y# W I& i' J* C: Z( O" c& i$ b) U1 J3 q: O$ h" x2 V
@app.get(* S& Z/ I1 B( ^: z! M; p
"/calculate/userinteraction/info/topicmergekeyword/",* n8 \8 N0 E2 O9 Z+ b9 L
tags=["计算模块数据接口"], ( b. B6 W% R5 s" n& o5 H: T. V response_model=TopicMergeKeywordInfo 5 U4 `0 k- X" z" ~ V3 K2 z2 })' t0 |8 g0 z7 D5 c, ?# b
def get_topic_merge_keyword_info(topic1_id: int, topic2_id: int, user_uuid: str = Cookie(None)):" f& B+ C& \. R# X4 L0 R
global topic_model_training_tasks ' Q2 `1 G) [6 z8 A0 P8 Q0 A( ?; g" b0 e9 u& {; z
if (not user_uuid) or (user_uuid not in topic_model_training_tasks): 6 ~3 l. ?! w4 r0 | raise HTTPException(status_code=404, detail="未找到相应的训练对象!")7 M p# y3 `& r; H
# U9 w) S1 h4 V) I3 V task = topic_model_training_tasks[user_uuid]- i" L- {/ ~; a1 G/ r0 S
if task.nmf_training_progress.status_code == 2:: g( P+ g/ \6 H4 a
return task.get_topic_merge_keyword_info(topic1_id, topic2_id) 0 J9 B; f0 F9 T2 n. H* m( L else:. o* a) \0 Q2 @5 f! d8 u* S; q y
raise HTTPException(status_code=404, detail="请先等待NMF训练结束!") ' F6 O& J% o( U) _! R( P; R" O ' T9 o& a: z4 H3 W0 \: l/ z; H! Y) o& W4 ], p& _* f+ ^
1 / h: I% b5 {( B: b& w! H, Z( {2* L. k3 H7 H- k+ Q) f
3 / ?: X# Q1 G% n, k" g4 I4 % z1 w9 j- V) Q3 t; H9 l- y* o& K5 % x6 m, K! Z9 Z8 h0 c6" l0 ?5 b8 s: x- u1 x8 o# L# `+ l
7 ; J; C( z8 d: p* @8 ' |/ E3 g# X* d8 I( v9$ u! F1 @1 i" E l# D, b6 J8 {
10 ' o6 c+ n& T5 o* m11 9 @- ^3 a6 v! _) y% ~124 I2 {0 K( |# t: M, f8 d* s
13+ | s/ j0 }8 o1 q% \8 A
14 5 ^' s6 z2 _4 O& Q) v15+ ^9 k1 e4 V2 u, K: |
164 n# r; B# {$ m2 V! B
17 l3 N4 W2 M H' e6 ~) s3 z18% [( K" Z% u. l, U0 M
196 j1 O& O8 b+ l6 |8 l/ c
20 s/ I5 | m7 a5 l3 {& u. l6 ^ j21 0 ]- C8 a$ {/ L4 i" p% M. _22( s3 k3 Y# {, y- r: M
23 5 S, Z# w }3 [9 I24- v" I8 m: x7 ?
25 ) r% o5 j3 O, Q1 F8 {% W7 o" A26 ' d2 i: Q) b5 Q: ]27& t" I5 d e5 N, F' `" }8 `1 d5 n
28 1 O4 F9 H! j2 O( F- g29 ! [& [9 P& J8 a3 {% Z* K30! A& J" L' D3 o9 h; n
31 . E) \4 q; J* P& b1 W$ i7 L0 G* ?32 ' E1 z2 b0 ?. u& ~6 F& V( Q33 5 W! f! |( a+ k. M, e340 c/ J4 l9 Y( ?3 D' F. ^3 S
35! k' h8 t) ~5 V* C+ V2 V
36 / Z1 J# g, u+ x9 n5 S, d* s37 , w! |: U9 f: O0 j0 Y38( e; r/ f1 Q% _, s0 ]7 h8 N; _
39 9 @' j% l {" m; g402 z0 W. m$ a$ u1 d
41 & f5 @6 a% Z' ]8 d! x5 ]+ r& @42, v3 `' M \3 ]; l: v1 a6 x* O
43/ E$ h2 d$ `$ U' g) A
44 9 W5 V: C2 K1 Z7 k w+ B, s45 9 V/ v) ]+ V* ~' S$ U5 x1 r: Z465 v- U- d) b7 N# Z ~/ D0 A) J
476 y# w/ i1 Y, X; S: M- \/ Q2 a
48 ; g8 t7 Q9 V d) `' W, B1 b49 0 G6 E/ i N8 }3 t# u50& Q8 G v8 D. j2 c
51 : {" c' x" K6 F; L; G52 5 X+ m' C( \- }; }, ~% v% P3 o \530 C9 v7 \9 H- g
54 ' M1 {3 ^/ T7 A# v' \0 }* R55 s: ?' y h) p/ U4 O% w5 j561 |3 x! I+ v; j
57; W, e4 y& l' N: P
581 }+ y& b8 { ]5 l9 T% m n
597 q2 i5 U+ |# b6 ^* C' c
605 {/ s) c' J+ _4 x% T0 l
61 / a: [9 q1 M$ e, v4 d* M7 f62 - \! V6 J6 \; I( v5 Y! ^63 ! W- Z, S" G( L4 _6 K6 ]' b64; o6 a( c7 u; ~
65 - C9 E( [4 V! {+ a; U- d/ F- v669 Y: Y. a: g8 M
67 ! G& J a, _4 e( s' Q& |0 ?5 n68 1 ^1 A' D; n- X# e693 l+ e% C+ P8 T- C% q4 x3 ^1 c7 f- ?
70 8 Z! B" ^3 l" y; Q2 k711 Z, ^5 z7 p: J9 o8 r" u2 S0 b: S
728 O5 k: A2 t! B
73( P1 o8 d5 O, w, n; |
74. C+ s" d' ?% P% _' N6 m. U( l' d
75 , V( C Z3 m. \, ^76 x6 G" M: W) M1 n/ j# W/ i
77# f$ Z) ], X( ~- j, D$ W$ V7 ?
78 4 z$ S. `, t8 [7 Q+ C79- ?5 ~; Y, A/ H& [
80 7 O" o7 n+ n/ H1 y# j- g* d- \6 Q81 4 l6 O, m6 `& S3 K1 x6 v2 Y* @% o82, K9 Q$ x' S4 f
838 Y, B% c7 R: y2 e1 T1 d
84" J4 C0 e3 o8 U& P! h. \ t( I
858 O$ Z0 U7 M! _3 ]6 u5 j
86 9 _& J* Z g% [5 x4 s' ]# ~87 % T4 u' v5 C. }$ e88 $ o$ c7 L, W$ B9 k897 t0 T' v/ y( {3 z( H3 j
901 A5 E2 q/ u2 B4 K$ S$ G; U# J
91 7 l4 W* U3 Y1 O e7 }92 0 u# A5 V$ I! n93 $ x& ~/ ?0 p" ]) h94 ! o/ E) j4 B. h95" L O# c, M4 a# v. v+ \! {( ~
96 ( E* v! H$ X5 k. j0 I2 {) d0 _8 W# u# N. H97* O7 Y* B1 }0 N$ f4 O2 e* K4 u
98 # G* ?' y, l$ V7 K7 u( q99. D+ Q( O1 x0 l5 L
100 ! J4 v) \$ c9 u, s) z; Y101, G* Q8 r8 n5 \. C& a D) ^
102 & G5 D: y# w0 e& f+ J1 K103; J X/ K& e. k9 V$ z8 j( f! [
104 4 u7 @/ Y, @4 u- H105 ?, s, j. C; L& x& W+ s1062 P/ f2 U; C1 u8 r
107# A/ Z1 ?1 Q6 f" p" n* Q
108 0 q& s; e' @5 H) \$ K* L6 E4 I109 6 e7 L4 N) u; Y( d8 c: I: h110 * u/ H( I- p& n111 ) v+ K" _! B9 u$ \4 Z0 G. ?112 2 O$ \( F! N7 O2 V% j113' q1 C9 c; b s, @" U
114 $ [- e- q) h `/ h115 " B: {" G: s0 ?7 D116 ( i6 t* D$ `" _$ g1 h; |% T117: m6 f+ }, C0 U. X6 n0 U
118 & S% g# u" H6 e+ {119 : g! U4 {$ t) {1207 T1 s) P2 n# C, H
121 # H E4 F" E* M6 F. M3 i, C# P122 " @3 s I- H/ h4 }7 q( P9 Q* A0 g123/ N7 h' b, L r Z1 L: A1 X
124( H3 n2 z5 F5 s0 J- {6 |" r+ P+ s
125+ d, y% L v8 L, G1 W% H
126 f# j- ?/ T: R( }6 q1270 G2 a- A9 `. o
128 : J! M3 e) l2 @129 ; D1 J* \5 } \2 d130 5 d; T0 b) s; ~6 }5 Y131 ) V" @! j8 O" S/ e& I5 J2 B132( j* K6 U2 m- Y4 t" ]
133" I' e) z# ~# i! J# `6 O
134 ; f- f9 H- N* ^% a9 F, G1 y135 ) @! @' K! v* R: ~" s136- a# w( W% t6 p% K" [" \
1371 k2 f/ V& x/ S/ O+ D r. Z
138 5 m; i4 x) ~+ L& U3 C4 m139, P! C3 p+ S, \7 a
140 5 w& F+ n8 g' g, X0 d3 \141 9 ^! F# u7 Y' T& j3 G7 {3 K6 ~142/ v3 r2 l1 m- j% Y# [
143 7 X# @' l4 b" W144 $ q. y$ U6 z; w1 V6 T( N% d145* @& G! u' ]: e8 O
1462 I* B5 l y. Z, J! G
147$ C/ |: {8 n' t s( n6 C
148 / ^! w" I, }- D8 R% K, }) o f1496 b _8 Z/ F* r: M3 w
150* K# [+ l) j5 b0 l5 X: @, o
151- D# Q+ D& ?3 E% ?6 m* \
152+ V( G/ @. Y2 @
153( t5 X- _, t1 V6 @
154* D$ u' t/ W4 }2 B/ z2 N* V
155/ P) w( A) @5 J5 ~
156 1 R* Z& ]0 a! g% B: u7 P157$ J! g/ z2 |/ f6 b# ]- }
158 $ M8 _$ C8 R0 P! E159 $ V1 P' s a2 x2 L160- N8 {) m- {+ v! m2 m# \
161 8 t7 D; y" Z( v, E162# C2 g1 P. T9 R( V( q' r) a% \ H
163 : J! P( w* o3 J: Q+ z) k7 V164 . f4 ?2 `; J2 _* J# r& M. ]165: j9 x* o# P1 M% \' l4 G5 x! A
166 . B5 A% i. g% Z' m5 `167 $ [ m5 w- k+ l8 E' h- M168 0 c5 b9 Y% D8 K+ S& ^0 l; O169: g. [+ Y* F8 ~$ _5 z
170- B6 b* B* ~5 Z9 R& T
171 / o- n, S) [# h: a+ x172 ! f+ |7 Y0 J0 m3 f3 `( H" C- U173 ' y2 Z3 j0 L/ x8 Z$ ]6 C' i7 I1746 W' x9 |0 t- a+ n$ T
175) T C$ S* R" ?8 V. [% c$ ^1 j
176. n) l" _+ z* G% U
177 0 x: a* e$ a6 A9 V' S178 ) x* i/ a+ M- U ~. ?" s1792 r7 F. f7 O; {1 ]
180 # b1 i* [" d4 j181 & D% H2 J3 Y6 o8 R) t) f y* |- F' A182& p: ]/ F( h+ G2 P/ G4 P
183 ! F2 x3 X; D: Z0 J184- h4 E) K+ ]/ m4 A0 w) S
185 + M: M/ X7 g5 i2 {% y6 C186. \4 P& O# y1 q* j
187. b! g; ~1 f# P! E9 _' o1 ?! L
188 " w$ R$ [3 _8 b7 \3 Y7 k4 N' j" F9 R189 ' q* `1 l' O1 @190 4 e& h. k6 X1 H; k' `$ x+ t191/ i9 M' U# R5 [5 w! @
192- Y: S* ~+ J. j. O. f# b: B9 h
193* i2 K8 t |: \- g! _( f4 G/ x0 R
194 6 |3 c: h% e8 y% T) }195 ( |, y( {0 X8 k) P196) D% V2 n, H0 ?" t; v3 d0 s( y; R
197$ ^. v) d! D- s3 @# a% S& M
198 5 \6 K6 i- ^. {) E199/ z5 |6 a6 S0 p3 f) t
200 3 w K+ } k$ ?: d* A6 M201 ' y0 U; J; ^$ U( @( l/ h) j" ~ X202& [- H5 }6 Y* y* D1 p6 {
2034 l* e9 ^! ~9 m" S7 @
2045 m! \4 V3 B& h5 m% M3 ~* e% V
205 - `3 R! q: v, A1 r+ N2 c4 h206. c7 O: m2 _# y- r
207* g) ]% n1 G- E$ s& s5 x% n: K+ d" o0 ?% U
208' m( t+ e1 |' j1 O
2096 _0 S/ O! V7 `; n$ [2 J
210) E0 r. V( G' \6 {9 _' {' N; \. |. Y
211/ ]" T! N3 f7 @) u, m6 w$ H* c
212 ) v. g+ H- `% W( W/ G$ v2133 Q" T ]3 F* H" T; p- W$ l2 f
214( j5 b% U; d4 z3 y0 `1 B$ u k
215! ? t7 V- M0 L" L- F$ S( N) w1 `
216 9 |' ~8 k$ g. f- ~ s/ H217 3 p. M+ X) @4 Z218 . s, m0 g6 @' f6 |0 M219 / [9 M5 u" P4 O3 D ]220 9 f+ Z R! M7 y1 U* @# d' y221 ) ]: R3 z( V5 `# l, a: ?+ [- m2 u222 . f9 l) u# W! A; m1 z/ F2 T223 2 B) u# P; o X0 b2242 Q8 \, ], a" c, S# P
225 8 v% {7 \/ n2 Y( v2266 p6 c; b0 {$ W' q+ Y$ ~0 d
227 % h+ @2 ^$ j- U3 d/ V228 4 _# W$ B3 D, T" h& q229* M9 K& u5 B1 r" w& b
2308 z6 l5 p. Z5 t7 D1 H9 J8 V
231 3 P. q9 Z1 ^0 u- d* f# O) D; J- B232% K" C* a7 q2 D& a; q8 C
233) M" q9 M! P# C V% y
2344 h: {8 l9 B4 f+ _: C; a: V
235 $ W; w( s5 w' c+ q9 h u+ ~. t236 , K5 x9 c0 c5 V3 ]" A# E! M2373 C6 m7 \/ F7 [8 A8 v, y
238 - b0 ?; l ?0 R' O3 E( V7 `: s239# b8 ~" ]) p) z
240! n! h* J5 r9 m
241( I0 U; p' b: j: M
242$ l3 b& A, ]- n' R. C
2430 Y# _( K V3 ?0 v- p5 D& z4 v# H
244 2 Z+ x) W3 y+ A245* }9 ^6 d& G4 ?2 V/ L, f
246 # o$ l# b- j* J9 [8 j5 Y8 S [247: O! l. J. M4 Q- N& h, f
248) B/ b( J+ B6 l
249 # ^0 L* Q4 o4 C$ H& M! {250( f$ F# T2 }" g, i* k
251 6 Z, r) ?4 ?2 S1 r/ ?252 ) v" Y/ k2 V1 {$ Y( {: b% z4 v253& ^, p- K0 L, ?8 i9 E
254 7 C& |' e+ o2 @; Y( p9 s+ k4 z255 8 a, y/ B- P3 Q9 ?5 q/ P256* a4 q1 P/ o+ F% @4 c6 f9 \( k
257/ { H7 w# R# L" Q4 N
258 3 p& b5 ^) p/ G2 u) e$ k259/ F+ j" L, M4 P
260 5 k1 S, P) S& f$ t+ |: e( ?261 # w7 N& D% g- H5 Q2 Y2626 j, ~: G0 c2 _6 v0 w
263 8 L4 P% I' c) n0 z$ x$ X264 D$ J7 Q/ U$ S' g! X265 7 s. Q* u; X, a" I7 H# O5 `266 & P# B' b! v# [7 }267 z/ A# N! Z+ { d% |268 3 o6 Z: v" e+ ?! A2 ?1 q' z" V; J269& z6 _( h2 Q- e
270 K& O; Y, z. \! N* q271 7 N* b7 D6 S% _# T) y5 c/ i, |272 0 C# K- U9 Y, |4 c8 Y/ E, f4 I6 v273 3 V- T6 r1 Y6 K2 w274) X/ \# x1 u) ~2 @6 `
275" O- E; Y p8 z- n
276 ; D; ^0 x8 |3 F277 7 h! B+ ]8 K, K3 f$ j" `3 R* t278/ E/ k3 k1 m' F4 ]% M
2795 `9 }9 i w; j7 w5 u" v) v$ L
280 S4 u/ ?/ @9 f% @
281 V/ @' \! ?9 _. j
282 / q/ U' Q* E. z- d5 m+ c, N283 . G' X+ k* K. G) B% \8 t( f2 s284 4 f0 e, ]1 A G/ W285 . q- x& X9 u4 D* M2 Y286 5 t9 J; f& w7 [7 y2873 j% N$ f0 s' X9 Y5 U& g5 s5 O0 c+ _
288) k; E) U" L! ?2 s9 Z* ~. ^
289 0 V& x" Y4 \4 B) B* [7 X7 e290 & n+ K c6 z! c7 e3 z# C5 e291$ O! g& G$ F7 _! g
2923 a/ Y0 k U# V0 k, K8 K& s
293 2 g A' W' h2 F& }294 % ]9 e9 R1 w% X0 o: v3 h" L295 * P$ P% J' \ l4 M296$ d2 G0 M4 N7 t% _* w6 F) C
297# e' }6 e! ~9 h, R9 r' q) z
298 6 C! o+ h; @* Q9 A! f299 , ^# ]' V6 S3 V+ V& [. b n- N. j( K300 % ^# n) ^/ W) v! T9 K3011 A% O6 ?+ N( M. m; M i
302. n4 C- }4 q* b& W
303 4 y+ J) d* j/ k( ^: m" w304" J o" m P0 H* n8 U5 ?
305 - Y b! i: W) r306 9 j7 [- u- e% ^9 X3 n- o2 E307 ; {2 l2 z* x! F5 V% C8 ?308 : C1 {2 L# R- J; y# T309 . D' \- K7 R: c! [, y310 @" k$ C8 s1 ], _* i* |/ t
311# `6 f3 U; u! j6 _; d+ @
312, M+ n. K: @; ?- H
313 " B# f- y" e: Z314. G5 r5 Q4 H) J9 L
3156 P) C; \9 x* [9 @
316 . A s! ?. n7 |; j: J" c) D317. k$ m8 H5 t+ Z$ v7 g9 I6 l' F( j
318 6 V% V8 |) E8 i& y* I319' n1 }, ]& l' v! g- J
3207 R& z0 Z# k- y
321+ w% Q | {% F- N G
322# Z! F: ?; p) b; `% f/ J6 q$ s
3231 }/ k" @& R6 w4 o) f }
3243 p- k! O+ E: E# s- n
325 / T2 N* T$ c3 h4 R- A7 y326, U8 u4 A! H. c- I( S- o
327 & Y' _+ u$ |7 e$ }$ e# i3286 S) n1 h+ i9 X8 g
329 + G9 N L n$ E9 Y. @7 Y3303 U% Y r' S$ _
331+ {4 I0 }& q( g: M. R
332 + a6 l8 u& I& g2 J6 H' C( M# S' h333 / b7 m4 L* K" c6 w8 o4 b# N3346 ~0 t$ G2 H3 {) Z n3 v
335 + s' z% ?/ |% s336 * i& h. M& `' ^+ Z0 W4 g6 V7 h337 2 t9 b- S5 L: R" Q3382 y# }$ Q9 B# a2 u2 F
339 9 j: n% Y A [0 v# n& _340+ |" A" B m0 m4 H; `! ]/ T- q% ^
341 ; i8 ]) h& u( H- [342 7 X7 ^. T0 [* v1 L9 ]343 , b# y3 S, l( F9 w1 Y344 : C2 T' j ]8 |6 t8 c9 _345 - c/ ^* J9 H4 ~( N. W8 Y5 M% \346 ' { a( m; T! J. `, i& L347 % c( L0 P& q6 U$ t: k348 1 m2 L# H& M, S% k; n s$ [349$ X x. u2 s3 k& x& c
3505 e( a i8 c$ E4 g' n( G
351 1 J* s w) h5 \# M" P+ _/ Q352 Q& w# s6 ^2 x2 H- ]# S5 h
353 / Z! H M7 u; m: W354 + v) B8 T q! v" `( b355 8 `$ Y& ^; t7 P* |# @356 8 R8 V# }+ ]+ i! w! R9 r3577 q- ^' I# F7 F1 Q/ U* D) r
358 , `" l! ?0 X t4 n; `3 P359 7 G/ c9 f. j. }6 ?- a: O* w360+ q$ @) S3 @6 J6 V: G! f# i
361' \7 {( \ J0 f4 B+ y) I
362: ~5 p" i- A h* _
363 9 e2 K) X$ J- K! r1 V5 e B! I364 m$ R' S' _. B6 e% j$ p
3655 n0 t/ F. j4 c( a' u$ r% ~* n
3669 d6 Y* O, D: o7 M; W6 L3 N
367: h% b( q1 K& ^6 E, f- B
368( M: H5 \" O; T3 M& V
3698 R; C" a) b7 p. i' }' p( L# T
3702 g+ v/ p; Z7 X, A' M
3717 B+ F/ n1 U2 Q+ Q3 B( |) n1 z
372 9 o+ W7 i% R* ]! S, c, J8 z5 W# [373) h! u1 a9 S; c# {9 g
374 # l& X( H7 H& u1 m K$ D# a. V3753 p1 e3 x0 N5 v
376 . c, h/ r# A" z1 [3774 H6 ^! y, S" e' S
378, x" ^1 ^$ P" x' L
3793 S+ n, @; t7 i8 b; E
380$ E2 o0 m) c* T# t* E% O8 `
381 R4 |7 I) y' b* m/ ~
382$ ^& ?6 T* E/ b ?2 B6 T4 \
383/ Y ^' ^/ U- v
384 0 L {7 |8 f: S4 g$ S385 : o* t9 P+ J. v9 ?, d6 v386 / j1 O4 @! y7 E4 x {387$ Y& p% e ^& c1 _1 k- I* B& F
388 7 a; `, Q+ r+ G. D% _6 h7 x389 ' i5 v9 U/ J- L% T390) n# x9 w5 u; f& L
391 6 I" F7 q6 a+ X# v- N392 / J0 d+ a1 h- }2 l393 ) w7 Z# A8 U8 s$ L; K' C4 E2 D394 4 ~' x1 [8 R' x1 j n, Z0 F9 k+ |1 s395 7 }$ D# K4 x% F+ L5 L" M( \" D396. ~# l; B$ L/ J+ p2 }9 n: \
397 + j6 i) O2 l0 q398! N7 H( M' f) k# m$ ?4 B
3993 Q- s; m( r# N( g$ ^8 t% a, r! Z
400$ d# l u. d# _1 D! O. T0 W$ U
4015 R: ]. D7 r& @7 d: F |" r2 j
402 9 [) m" F4 [/ f8 j403. C% ?1 s: e. e% u. j* f
404 & f- |1 V: o) Z, j/ U% @405 $ R2 n+ y& o4 L7 H406; y1 j$ F, x& s9 }+ |! y8 F
407* c- J; W% b+ g* J. D+ d3 T) v% B
408 8 h5 F2 e8 Z6 l' X; u, h409 ' S/ Q f& h$ R( L% q! j410! ]5 ]1 c& G+ @1 ?, W7 C7 N! g
4116 S% ~; e2 N. L. n: x4 ^
4129 Y5 d6 }% O' d9 ~
413 & {! C6 U' S6 D6 r414 3 n Y/ j& S7 \) P" @1 I% I" A& X415 : N, p5 F' I. r* X2 \) n416% N! N" |/ U7 R+ n
417$ @7 a! X/ r& C$ ?
418 ; X6 \ P+ T2 M) L% `' d- u419; a# Y/ ~/ m$ Y
420 1 X; r- c$ f( | e6 r9 ]. T. K421 3 \' S0 V7 _$ m% \/ j- {% s422 , e H7 \6 c- B+ f2 i( a* h423 ! m# z5 U# Y! W- x& H424 % \! I1 K% ^! S. X: C425& Q G$ Y; q+ V( @1 h- U* E
4264 x. |6 A# W7 V3 i( w
4270 n) s7 G- }! w' B+ ?
428 5 k8 \+ ]9 Z0 `429 ' G, g i# t W! [( X6 f: R430* I K. a4 i( ?8 R5 m7 y
431, j5 v* B6 e) _3 ` l5 |
432 + g4 B. Y; ]3 ]- ?- i433; r0 q4 m+ D8 e$ c) m1 G
434 2 F w2 d# {9 A" U3 Z3 L9 y435' \& _) |" P5 j4 h* n
436 ! W' N) l J2 Y8 O3 q437 ( |, P$ d$ r7 o& d438 % `' h! @% P( y9 @. Z% F' U: @439 } \# p# T' R1 J" k
440/ ?/ {4 T; `, ?: _$ q: n6 t
441. L/ U3 x5 A' T) ~3 N4 r5 e0 x2 _. r
442 2 w) t$ u3 r/ M6 O" |+ Y5 z/ m8 v4436 N5 `1 w" u5 u$ t3 @3 J. a& H* u
444# x. p x/ M( D$ z3 ?7 I
445 ) e r2 S/ X7 Q2 f4 P446 5 `7 m0 f( o& ]4477 B$ a; Y2 }4 Q( k
4482 u$ u: V6 c4 O
449; r" ]& k$ z; O& i* P
450 0 o& P# Q9 j/ Q5 a$ F2 U, T451 7 j0 I! W7 L( R3 |' T; [" K) W452# F! {$ e" k) H% D. F+ v7 Q
453& ~6 Y; M2 j0 [
454 9 c2 [; \$ j* W/ t455 1 L8 R& ~& T8 ]: j7 N4 O" w456 4 }% D" w# d, Q; e457 / K6 z, V3 ^8 W: f3 a458 9 I5 m4 C" F; Z: A& x+ p8 L459% u% D* \8 E) B4 }! ?
460 4 P, S" [& `% w ^6 X461 2 N% \- J. {: z, a462 % j2 M4 W. ^# \) A9 c463+ B' n7 T" @6 A' C
464 8 B( Y. K) @5 i9 e+ x5 r. w465 + T/ J J y! [* k( d* U466 2 \0 K' d1 ?$ K$ l( I/ k0 f4 y) v467 ( {: a6 J- M+ w- P1 b468# M& ]2 u0 k/ b
4696 l* Y9 x9 K5 E( n& G& q; @9 B* ~
470 5 i, d3 E, q& b: `+ n471+ Z, |8 C4 Q! R0 J
472 2 r& \; C) f: j Z9 E473 $ l# U) O0 H9 ?2 N474 # x, r& A8 h0 `+ p& ~475 9 x# l: w3 j, D! p! u; Q$ L476 ! S9 _1 y8 y' E9 r- w% U3 O. [3 g" A2 H
3 A4 J( ?% K& V4 A : V, [; i0 s5 X" { - Y, g+ `# N- J/ N# b- b2 o! \' H2 J) o
# @6 F6 H: I0 a3 S. V3 P+ J! C6 V
/ @! |1 j( I+ G3 ~4 g: R* N. [! [* i+ q% r# L
8 z; v P: z; n/ s
- }4 n, R2 N; D0 }( O2 ? h8 g$ [- t5 s3 P8 P* Z! m: ~! X8 M6 C
& G, s9 `0 H$ y
0 I2 ]+ b" {4 H
* n0 I" j0 i3 Y- U+ N7 e5 j6 r3 f ' a1 S2 k) ^9 t3 v5 E! y8 k' j d3 R% ~) N3 ` h5 X/ W7 o5 I: ?
3 z, Q. Q% w- M9 k
% `/ W1 H& x7 w$ l! E1 a
- b, k' m0 b& N) M+ w, [3 O 6 |) y4 {& u+ |4 q, l$ P& J2 U " v3 d; H1 S$ p' Q- f" }/ P4 n# `$ s' S* g* p8 ^
2 z- d8 ^# l2 H1 E# m/ k
————————————————: `6 d: L" t7 ^: z: O
版权声明:本文为CSDN博主「biyezuopin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 ' g! R7 [+ J' R) W Q4 ^( m7 J原文链接:https://blog.csdn.net/sheziqiong/article/details/126814021% v7 @" S" G8 a2 u% _+ b) k