| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823148241482514826148271482814829148301483114832148331483414835148361483714838148391484014841148421484314844148451484614847148481484914850148511485214853148541485514856148571485814859148601486114862148631486414865148661486714868148691487014871148721487314874148751487614877148781487914880148811488214883148841488514886148871488814889148901489114892148931489414895148961489714898148991490014901149021490314904149051490614907149081490914910149111491214913149141491514916149171491814919149201492114922149231492414925149261492714928149291493014931149321493314934149351493614937149381493914940149411494214943149441494514946149471494814949149501495114952149531495414955149561495714958149591496014961149621496314964149651496614967149681496914970149711497214973149741497514976149771497814979149801498114982149831498414985149861498714988149891499014991149921499314994149951499614997149981499915000150011500215003150041500515006150071500815009150101501115012150131501415015150161501715018150191502015021150221502315024150251502615027150281502915030150311503215033150341503515036150371503815039150401504115042150431504415045150461504715048150491505015051150521505315054150551505615057150581505915060150611506215063150641506515066150671506815069150701507115072150731507415075150761507715078150791508015081150821508315084150851508615087150881508915090150911509215093150941509515096150971509815099151001510115102151031510415105151061510715108151091511015111151121511315114151151511615117151181511915120151211512215123151241512515126151271512815129151301513115132151331513415135151361513715138151391514015141151421514315144151451514615147151481514915150151511515215153151541515515156151571515815159151601516115162151631516415165151661516715168151691517015171151721517315174151751517615177151781517915180151811518215183151841518515186151871518815189151901519115192151931519415195151961519715198151991520015201152021520315204152051520615207152081520915210152111521215213152141521515216152171521815219152201522115222152231522415225152261522715228152291523015231152321523315234152351523615237152381523915240152411524215243152441524515246152471524815249152501525115252152531525415255152561525715258152591526015261152621526315264152651526615267152681526915270152711527215273152741527515276152771527815279152801528115282152831528415285152861528715288152891529015291152921529315294152951529615297152981529915300153011530215303153041530515306153071530815309153101531115312153131531415315153161531715318153191532015321153221532315324153251532615327153281532915330153311533215333153341533515336153371533815339153401534115342153431534415345153461534715348153491535015351153521535315354153551535615357153581535915360153611536215363153641536515366153671536815369153701537115372153731537415375153761537715378153791538015381153821538315384153851538615387153881538915390153911539215393153941539515396153971539815399154001540115402154031540415405154061540715408154091541015411154121541315414154151541615417154181541915420154211542215423154241542515426154271542815429154301543115432154331543415435154361543715438154391544015441154421544315444154451544615447154481544915450154511545215453154541545515456154571545815459154601546115462154631546415465154661546715468154691547015471154721547315474154751547615477154781547915480154811548215483154841548515486154871548815489154901549115492154931549415495154961549715498154991550015501155021550315504155051550615507155081550915510155111551215513155141551515516155171551815519155201552115522155231552415525155261552715528155291553015531155321553315534155351553615537155381553915540155411554215543155441554515546155471554815549155501555115552155531555415555155561555715558155591556015561155621556315564155651556615567155681556915570155711557215573155741557515576155771557815579155801558115582155831558415585155861558715588155891559015591155921559315594155951559615597155981559915600156011560215603156041560515606156071560815609156101561115612156131561415615156161561715618156191562015621156221562315624156251562615627156281562915630156311563215633156341563515636156371563815639156401564115642156431564415645156461564715648156491565015651156521565315654156551565615657156581565915660156611566215663156641566515666156671566815669156701567115672156731567415675156761567715678156791568015681156821568315684156851568615687156881568915690156911569215693156941569515696156971569815699157001570115702157031570415705157061570715708157091571015711157121571315714157151571615717157181571915720157211572215723157241572515726157271572815729157301573115732157331573415735157361573715738157391574015741157421574315744157451574615747157481574915750157511575215753157541575515756157571575815759157601576115762157631576415765157661576715768157691577015771157721577315774157751577615777157781577915780157811578215783157841578515786157871578815789157901579115792157931579415795157961579715798157991580015801158021580315804158051580615807158081580915810158111581215813158141581515816158171581815819158201582115822158231582415825158261582715828158291583015831158321583315834158351583615837158381583915840158411584215843158441584515846158471584815849158501585115852158531585415855158561585715858158591586015861158621586315864158651586615867158681586915870158711587215873158741587515876158771587815879158801588115882158831588415885158861588715888158891589015891158921589315894158951589615897158981589915900159011590215903159041590515906159071590815909159101591115912159131591415915159161591715918159191592015921159221592315924159251592615927159281592915930159311593215933159341593515936159371593815939159401594115942159431594415945159461594715948159491595015951159521595315954159551595615957159581595915960159611596215963159641596515966159671596815969159701597115972159731597415975159761597715978159791598015981159821598315984159851598615987159881598915990159911599215993159941599515996159971599815999160001600116002160031600416005160061600716008160091601016011160121601316014160151601616017160181601916020160211602216023160241602516026160271602816029160301603116032160331603416035160361603716038160391604016041160421604316044160451604616047160481604916050160511605216053160541605516056160571605816059160601606116062160631606416065160661606716068160691607016071160721607316074160751607616077160781607916080160811608216083160841608516086160871608816089160901609116092160931609416095160961609716098160991610016101161021610316104161051610616107161081610916110161111611216113161141611516116161171611816119161201612116122161231612416125161261612716128161291613016131161321613316134161351613616137161381613916140161411614216143161441614516146161471614816149161501615116152161531615416155161561615716158161591616016161161621616316164161651616616167161681616916170161711617216173161741617516176161771617816179161801618116182161831618416185161861618716188161891619016191161921619316194161951619616197161981619916200162011620216203162041620516206162071620816209162101621116212162131621416215162161621716218162191622016221162221622316224162251622616227162281622916230162311623216233162341623516236162371623816239162401624116242162431624416245162461624716248162491625016251162521625316254162551625616257162581625916260162611626216263162641626516266162671626816269162701627116272162731627416275162761627716278162791628016281162821628316284162851628616287162881628916290162911629216293162941629516296162971629816299163001630116302163031630416305163061630716308163091631016311163121631316314163151631616317163181631916320163211632216323163241632516326163271632816329163301633116332163331633416335163361633716338163391634016341163421634316344163451634616347163481634916350163511635216353163541635516356163571635816359163601636116362163631636416365163661636716368163691637016371163721637316374163751637616377163781637916380163811638216383163841638516386163871638816389163901639116392163931639416395163961639716398163991640016401164021640316404164051640616407164081640916410164111641216413164141641516416164171641816419164201642116422164231642416425164261642716428164291643016431164321643316434164351643616437164381643916440164411644216443164441644516446164471644816449164501645116452164531645416455164561645716458164591646016461164621646316464164651646616467164681646916470164711647216473164741647516476164771647816479164801648116482164831648416485164861648716488164891649016491164921649316494164951649616497164981649916500165011650216503165041650516506165071650816509165101651116512165131651416515165161651716518165191652016521165221652316524165251652616527165281652916530165311653216533165341653516536165371653816539165401654116542165431654416545165461654716548165491655016551165521655316554165551655616557165581655916560165611656216563165641656516566165671656816569165701657116572165731657416575165761657716578165791658016581165821658316584165851658616587165881658916590165911659216593165941659516596165971659816599166001660116602166031660416605166061660716608166091661016611166121661316614166151661616617166181661916620166211662216623166241662516626166271662816629166301663116632166331663416635166361663716638166391664016641166421664316644166451664616647166481664916650166511665216653166541665516656166571665816659166601666116662166631666416665166661666716668166691667016671166721667316674166751667616677166781667916680166811668216683166841668516686166871668816689166901669116692166931669416695166961669716698166991670016701167021670316704167051670616707167081670916710167111671216713167141671516716167171671816719167201672116722167231672416725167261672716728167291673016731167321673316734167351673616737167381673916740167411674216743167441674516746167471674816749167501675116752167531675416755167561675716758167591676016761167621676316764167651676616767167681676916770167711677216773167741677516776167771677816779167801678116782167831678416785167861678716788167891679016791167921679316794167951679616797167981679916800168011680216803168041680516806168071680816809168101681116812168131681416815168161681716818168191682016821168221682316824168251682616827168281682916830168311683216833168341683516836168371683816839168401684116842168431684416845168461684716848168491685016851168521685316854168551685616857168581685916860168611686216863168641686516866168671686816869168701687116872168731687416875168761687716878168791688016881168821688316884168851688616887168881688916890168911689216893168941689516896168971689816899169001690116902169031690416905169061690716908169091691016911169121691316914169151691616917169181691916920169211692216923169241692516926169271692816929169301693116932169331693416935169361693716938169391694016941169421694316944169451694616947169481694916950169511695216953169541695516956169571695816959169601696116962169631696416965169661696716968169691697016971169721697316974169751697616977169781697916980169811698216983169841698516986169871698816989169901699116992169931699416995169961699716998169991700017001170021700317004170051700617007170081700917010170111701217013170141701517016170171701817019170201702117022170231702417025170261702717028170291703017031170321703317034170351703617037170381703917040170411704217043170441704517046170471704817049170501705117052170531705417055170561705717058170591706017061170621706317064170651706617067170681706917070170711707217073170741707517076170771707817079170801708117082170831708417085170861708717088170891709017091170921709317094170951709617097170981709917100171011710217103171041710517106171071710817109171101711117112171131711417115171161711717118171191712017121171221712317124171251712617127171281712917130171311713217133171341713517136171371713817139171401714117142171431714417145171461714717148171491715017151171521715317154171551715617157171581715917160171611716217163171641716517166171671716817169171701717117172171731717417175171761717717178171791718017181171821718317184171851718617187171881718917190171911719217193171941719517196171971719817199172001720117202172031720417205172061720717208172091721017211172121721317214172151721617217172181721917220172211722217223172241722517226172271722817229172301723117232172331723417235172361723717238172391724017241172421724317244172451724617247172481724917250172511725217253172541725517256172571725817259172601726117262172631726417265172661726717268172691727017271172721727317274172751727617277172781727917280172811728217283172841728517286172871728817289172901729117292172931729417295172961729717298172991730017301173021730317304173051730617307173081730917310173111731217313173141731517316173171731817319173201732117322173231732417325173261732717328173291733017331173321733317334173351733617337173381733917340173411734217343173441734517346173471734817349173501735117352173531735417355173561735717358173591736017361173621736317364173651736617367173681736917370173711737217373173741737517376173771737817379173801738117382173831738417385173861738717388173891739017391173921739317394173951739617397173981739917400174011740217403174041740517406174071740817409174101741117412174131741417415174161741717418174191742017421174221742317424174251742617427174281742917430174311743217433174341743517436174371743817439174401744117442174431744417445174461744717448174491745017451174521745317454174551745617457174581745917460174611746217463174641746517466174671746817469174701747117472174731747417475174761747717478174791748017481174821748317484174851748617487174881748917490174911749217493174941749517496174971749817499175001750117502175031750417505175061750717508175091751017511175121751317514175151751617517175181751917520175211752217523175241752517526175271752817529175301753117532175331753417535175361753717538175391754017541175421754317544175451754617547175481754917550175511755217553175541755517556175571755817559175601756117562175631756417565175661756717568175691757017571175721757317574175751757617577175781757917580175811758217583175841758517586175871758817589175901759117592175931759417595175961759717598175991760017601176021760317604176051760617607176081760917610176111761217613176141761517616176171761817619176201762117622176231762417625176261762717628176291763017631176321763317634176351763617637176381763917640176411764217643176441764517646176471764817649176501765117652176531765417655176561765717658176591766017661176621766317664176651766617667176681766917670176711767217673176741767517676176771767817679176801768117682176831768417685176861768717688176891769017691176921769317694176951769617697176981769917700177011770217703177041770517706177071770817709177101771117712177131771417715177161771717718177191772017721177221772317724177251772617727177281772917730177311773217733177341773517736177371773817739177401774117742177431774417745177461774717748177491775017751177521775317754177551775617757177581775917760177611776217763177641776517766177671776817769177701777117772177731777417775177761777717778177791778017781177821778317784177851778617787177881778917790177911779217793177941779517796177971779817799178001780117802178031780417805178061780717808178091781017811178121781317814178151781617817178181781917820178211782217823178241782517826178271782817829178301783117832178331783417835178361783717838178391784017841178421784317844178451784617847178481784917850178511785217853178541785517856178571785817859178601786117862178631786417865178661786717868178691787017871178721787317874178751787617877178781787917880178811788217883178841788517886178871788817889178901789117892178931789417895178961789717898178991790017901179021790317904179051790617907179081790917910179111791217913179141791517916179171791817919179201792117922179231792417925179261792717928179291793017931179321793317934179351793617937179381793917940179411794217943179441794517946179471794817949179501795117952179531795417955179561795717958179591796017961179621796317964179651796617967179681796917970179711797217973179741797517976179771797817979179801798117982179831798417985179861798717988179891799017991179921799317994179951799617997179981799918000180011800218003180041800518006180071800818009180101801118012180131801418015180161801718018180191802018021180221802318024180251802618027180281802918030180311803218033180341803518036180371803818039180401804118042180431804418045180461804718048180491805018051180521805318054180551805618057180581805918060180611806218063180641806518066180671806818069180701807118072180731807418075180761807718078180791808018081180821808318084180851808618087180881808918090180911809218093180941809518096180971809818099181001810118102181031810418105181061810718108181091811018111181121811318114181151811618117181181811918120181211812218123181241812518126181271812818129181301813118132181331813418135181361813718138181391814018141181421814318144181451814618147181481814918150181511815218153181541815518156181571815818159181601816118162181631816418165181661816718168181691817018171181721817318174181751817618177181781817918180181811818218183181841818518186181871818818189181901819118192181931819418195181961819718198181991820018201182021820318204182051820618207182081820918210182111821218213182141821518216182171821818219182201822118222182231822418225182261822718228182291823018231182321823318234182351823618237182381823918240182411824218243182441824518246182471824818249182501825118252182531825418255182561825718258182591826018261182621826318264182651826618267182681826918270182711827218273182741827518276182771827818279182801828118282182831828418285182861828718288182891829018291182921829318294182951829618297182981829918300183011830218303183041830518306183071830818309183101831118312183131831418315183161831718318183191832018321183221832318324183251832618327183281832918330183311833218333183341833518336183371833818339183401834118342183431834418345183461834718348183491835018351183521835318354183551835618357183581835918360183611836218363183641836518366183671836818369183701837118372183731837418375183761837718378183791838018381183821838318384183851838618387183881838918390183911839218393183941839518396183971839818399184001840118402184031840418405184061840718408184091841018411184121841318414184151841618417184181841918420184211842218423184241842518426184271842818429184301843118432184331843418435184361843718438184391844018441184421844318444184451844618447184481844918450184511845218453184541845518456184571845818459184601846118462184631846418465184661846718468184691847018471184721847318474184751847618477184781847918480184811848218483184841848518486184871848818489184901849118492184931849418495184961849718498184991850018501185021850318504185051850618507185081850918510185111851218513185141851518516185171851818519185201852118522185231852418525185261852718528185291853018531185321853318534185351853618537185381853918540185411854218543185441854518546185471854818549185501855118552185531855418555185561855718558185591856018561185621856318564185651856618567185681856918570185711857218573185741857518576185771857818579185801858118582185831858418585185861858718588185891859018591185921859318594185951859618597185981859918600186011860218603186041860518606186071860818609186101861118612186131861418615186161861718618186191862018621186221862318624186251862618627186281862918630186311863218633186341863518636186371863818639186401864118642186431864418645186461864718648186491865018651186521865318654186551865618657186581865918660186611866218663186641866518666186671866818669186701867118672186731867418675186761867718678186791868018681186821868318684186851868618687186881868918690186911869218693186941869518696186971869818699187001870118702187031870418705187061870718708187091871018711187121871318714187151871618717187181871918720187211872218723187241872518726187271872818729187301873118732187331873418735187361873718738187391874018741187421874318744187451874618747187481874918750187511875218753187541875518756187571875818759187601876118762187631876418765187661876718768187691877018771187721877318774187751877618777187781877918780187811878218783187841878518786187871878818789187901879118792187931879418795187961879718798187991880018801188021880318804188051880618807188081880918810188111881218813188141881518816188171881818819188201882118822188231882418825188261882718828188291883018831188321883318834188351883618837188381883918840188411884218843188441884518846188471884818849188501885118852188531885418855188561885718858188591886018861188621886318864188651886618867188681886918870188711887218873188741887518876188771887818879188801888118882188831888418885188861888718888188891889018891188921889318894188951889618897188981889918900189011890218903189041890518906189071890818909189101891118912189131891418915189161891718918189191892018921189221892318924189251892618927189281892918930189311893218933189341893518936189371893818939189401894118942189431894418945189461894718948189491895018951189521895318954189551895618957189581895918960189611896218963189641896518966189671896818969189701897118972189731897418975189761897718978189791898018981189821898318984189851898618987189881898918990189911899218993189941899518996189971899818999190001900119002190031900419005190061900719008190091901019011190121901319014190151901619017190181901919020190211902219023190241902519026190271902819029190301903119032190331903419035190361903719038190391904019041190421904319044190451904619047190481904919050190511905219053190541905519056190571905819059190601906119062190631906419065190661906719068190691907019071190721907319074190751907619077190781907919080190811908219083190841908519086190871908819089190901909119092190931909419095190961909719098190991910019101191021910319104191051910619107191081910919110191111911219113191141911519116191171911819119191201912119122191231912419125191261912719128191291913019131191321913319134191351913619137191381913919140191411914219143191441914519146191471914819149191501915119152191531915419155191561915719158191591916019161191621916319164191651916619167191681916919170191711917219173191741917519176191771917819179191801918119182191831918419185191861918719188191891919019191191921919319194191951919619197191981919919200192011920219203192041920519206192071920819209192101921119212192131921419215192161921719218192191922019221192221922319224192251922619227192281922919230192311923219233192341923519236192371923819239192401924119242192431924419245192461924719248192491925019251192521925319254192551925619257192581925919260192611926219263192641926519266192671926819269192701927119272192731927419275192761927719278192791928019281192821928319284192851928619287192881928919290192911929219293192941929519296192971929819299193001930119302193031930419305193061930719308193091931019311193121931319314193151931619317193181931919320193211932219323193241932519326193271932819329193301933119332193331933419335193361933719338193391934019341193421934319344193451934619347193481934919350193511935219353193541935519356193571935819359193601936119362193631936419365193661936719368193691937019371193721937319374193751937619377193781937919380193811938219383193841938519386193871938819389193901939119392193931939419395193961939719398193991940019401194021940319404194051940619407194081940919410194111941219413194141941519416194171941819419194201942119422194231942419425194261942719428194291943019431194321943319434194351943619437194381943919440194411944219443194441944519446194471944819449194501945119452194531945419455194561945719458194591946019461194621946319464194651946619467194681946919470194711947219473194741947519476194771947819479194801948119482194831948419485194861948719488194891949019491194921949319494194951949619497194981949919500195011950219503195041950519506195071950819509195101951119512195131951419515195161951719518195191952019521195221952319524195251952619527195281952919530195311953219533195341953519536195371953819539195401954119542195431954419545195461954719548195491955019551195521955319554195551955619557195581955919560195611956219563195641956519566195671956819569195701957119572195731957419575195761957719578195791958019581195821958319584195851958619587195881958919590195911959219593195941959519596195971959819599196001960119602196031960419605196061960719608196091961019611196121961319614196151961619617196181961919620196211962219623196241962519626196271962819629196301963119632196331963419635196361963719638196391964019641196421964319644196451964619647196481964919650196511965219653196541965519656196571965819659196601966119662196631966419665196661966719668196691967019671196721967319674196751967619677196781967919680196811968219683196841968519686196871968819689196901969119692196931969419695196961969719698196991970019701197021970319704197051970619707197081970919710197111971219713197141971519716197171971819719197201972119722197231972419725197261972719728197291973019731197321973319734197351973619737197381973919740197411974219743197441974519746197471974819749197501975119752197531975419755197561975719758197591976019761197621976319764197651976619767197681976919770197711977219773197741977519776197771977819779197801978119782197831978419785197861978719788197891979019791197921979319794197951979619797197981979919800198011980219803198041980519806198071980819809198101981119812198131981419815198161981719818198191982019821198221982319824198251982619827198281982919830198311983219833198341983519836198371983819839198401984119842198431984419845198461984719848198491985019851198521985319854198551985619857198581985919860198611986219863198641986519866198671986819869198701987119872198731987419875198761987719878198791988019881198821988319884198851988619887198881988919890198911989219893198941989519896198971989819899199001990119902199031990419905199061990719908199091991019911199121991319914199151991619917199181991919920199211992219923199241992519926199271992819929199301993119932199331993419935199361993719938199391994019941199421994319944199451994619947199481994919950199511995219953199541995519956199571995819959199601996119962199631996419965199661996719968199691997019971199721997319974199751997619977199781997919980199811998219983199841998519986199871998819989199901999119992199931999419995199961999719998199992000020001200022000320004200052000620007200082000920010200112001220013200142001520016200172001820019200202002120022200232002420025200262002720028200292003020031200322003320034200352003620037200382003920040200412004220043200442004520046200472004820049200502005120052200532005420055200562005720058200592006020061200622006320064200652006620067200682006920070200712007220073200742007520076200772007820079200802008120082200832008420085200862008720088200892009020091200922009320094200952009620097200982009920100201012010220103201042010520106201072010820109201102011120112201132011420115201162011720118201192012020121201222012320124201252012620127201282012920130201312013220133201342013520136201372013820139201402014120142201432014420145201462014720148201492015020151201522015320154201552015620157201582015920160201612016220163201642016520166201672016820169201702017120172201732017420175201762017720178201792018020181201822018320184201852018620187201882018920190201912019220193201942019520196201972019820199202002020120202202032020420205202062020720208202092021020211202122021320214202152021620217202182021920220202212022220223202242022520226202272022820229202302023120232202332023420235202362023720238202392024020241202422024320244202452024620247202482024920250202512025220253202542025520256202572025820259202602026120262202632026420265202662026720268202692027020271202722027320274202752027620277202782027920280202812028220283202842028520286202872028820289202902029120292202932029420295202962029720298202992030020301203022030320304203052030620307203082030920310203112031220313203142031520316203172031820319203202032120322203232032420325203262032720328203292033020331203322033320334203352033620337203382033920340203412034220343203442034520346203472034820349203502035120352203532035420355203562035720358203592036020361203622036320364203652036620367203682036920370203712037220373203742037520376203772037820379203802038120382203832038420385203862038720388203892039020391203922039320394203952039620397203982039920400204012040220403204042040520406204072040820409204102041120412204132041420415204162041720418204192042020421204222042320424204252042620427204282042920430204312043220433204342043520436204372043820439204402044120442204432044420445204462044720448204492045020451204522045320454204552045620457204582045920460204612046220463204642046520466204672046820469204702047120472204732047420475204762047720478204792048020481204822048320484204852048620487204882048920490204912049220493204942049520496204972049820499205002050120502205032050420505205062050720508205092051020511205122051320514205152051620517205182051920520205212052220523205242052520526205272052820529205302053120532205332053420535205362053720538205392054020541205422054320544205452054620547205482054920550205512055220553205542055520556205572055820559205602056120562205632056420565205662056720568205692057020571205722057320574205752057620577205782057920580205812058220583205842058520586205872058820589205902059120592205932059420595205962059720598205992060020601206022060320604206052060620607206082060920610206112061220613206142061520616206172061820619206202062120622206232062420625206262062720628206292063020631206322063320634206352063620637206382063920640206412064220643206442064520646206472064820649206502065120652206532065420655206562065720658206592066020661206622066320664206652066620667206682066920670206712067220673206742067520676206772067820679206802068120682206832068420685206862068720688206892069020691206922069320694206952069620697206982069920700207012070220703207042070520706207072070820709207102071120712207132071420715207162071720718207192072020721207222072320724207252072620727207282072920730207312073220733207342073520736207372073820739207402074120742207432074420745207462074720748207492075020751207522075320754207552075620757207582075920760207612076220763207642076520766207672076820769207702077120772207732077420775207762077720778207792078020781207822078320784207852078620787207882078920790207912079220793207942079520796207972079820799208002080120802208032080420805208062080720808208092081020811208122081320814208152081620817208182081920820208212082220823208242082520826208272082820829208302083120832208332083420835208362083720838208392084020841208422084320844208452084620847208482084920850208512085220853208542085520856208572085820859208602086120862208632086420865208662086720868208692087020871208722087320874208752087620877208782087920880208812088220883208842088520886208872088820889208902089120892208932089420895208962089720898208992090020901209022090320904209052090620907209082090920910209112091220913209142091520916209172091820919209202092120922209232092420925209262092720928209292093020931209322093320934209352093620937209382093920940209412094220943209442094520946209472094820949209502095120952209532095420955209562095720958209592096020961209622096320964209652096620967209682096920970209712097220973209742097520976209772097820979209802098120982209832098420985209862098720988209892099020991209922099320994209952099620997209982099921000210012100221003210042100521006210072100821009210102101121012210132101421015210162101721018210192102021021210222102321024210252102621027210282102921030210312103221033210342103521036210372103821039210402104121042210432104421045210462104721048210492105021051210522105321054210552105621057210582105921060210612106221063210642106521066210672106821069210702107121072210732107421075210762107721078210792108021081210822108321084210852108621087210882108921090210912109221093210942109521096210972109821099211002110121102211032110421105211062110721108211092111021111211122111321114211152111621117211182111921120211212112221123211242112521126211272112821129211302113121132211332113421135211362113721138211392114021141211422114321144211452114621147211482114921150211512115221153211542115521156211572115821159211602116121162211632116421165211662116721168211692117021171211722117321174211752117621177211782117921180211812118221183211842118521186211872118821189211902119121192211932119421195211962119721198211992120021201212022120321204212052120621207212082120921210212112121221213212142121521216212172121821219212202122121222212232122421225212262122721228212292123021231212322123321234212352123621237212382123921240212412124221243212442124521246212472124821249212502125121252212532125421255212562125721258212592126021261212622126321264212652126621267212682126921270212712127221273212742127521276212772127821279212802128121282212832128421285212862128721288212892129021291212922129321294212952129621297212982129921300213012130221303213042130521306213072130821309213102131121312213132131421315213162131721318213192132021321213222132321324213252132621327213282132921330213312133221333213342133521336213372133821339213402134121342213432134421345213462134721348213492135021351213522135321354213552135621357213582135921360213612136221363213642136521366213672136821369213702137121372213732137421375213762137721378213792138021381213822138321384213852138621387213882138921390213912139221393213942139521396213972139821399214002140121402214032140421405214062140721408214092141021411214122141321414214152141621417214182141921420214212142221423214242142521426214272142821429214302143121432214332143421435214362143721438214392144021441214422144321444214452144621447214482144921450214512145221453214542145521456214572145821459214602146121462214632146421465214662146721468214692147021471214722147321474214752147621477214782147921480214812148221483214842148521486214872148821489214902149121492214932149421495214962149721498214992150021501215022150321504215052150621507215082150921510215112151221513215142151521516215172151821519215202152121522215232152421525215262152721528215292153021531215322153321534215352153621537215382153921540215412154221543215442154521546215472154821549215502155121552215532155421555215562155721558215592156021561215622156321564215652156621567215682156921570215712157221573215742157521576215772157821579215802158121582215832158421585215862158721588215892159021591215922159321594215952159621597215982159921600216012160221603216042160521606216072160821609216102161121612216132161421615216162161721618216192162021621216222162321624216252162621627216282162921630216312163221633216342163521636216372163821639216402164121642216432164421645216462164721648216492165021651216522165321654216552165621657216582165921660216612166221663216642166521666216672166821669216702167121672216732167421675216762167721678216792168021681216822168321684216852168621687216882168921690216912169221693216942169521696216972169821699217002170121702217032170421705217062170721708217092171021711217122171321714217152171621717217182171921720217212172221723217242172521726217272172821729217302173121732217332173421735217362173721738217392174021741217422174321744217452174621747217482174921750217512175221753217542175521756217572175821759217602176121762217632176421765217662176721768217692177021771217722177321774217752177621777217782177921780217812178221783217842178521786217872178821789217902179121792217932179421795217962179721798217992180021801218022180321804218052180621807218082180921810218112181221813218142181521816218172181821819218202182121822218232182421825218262182721828218292183021831218322183321834218352183621837218382183921840218412184221843218442184521846218472184821849218502185121852218532185421855218562185721858218592186021861218622186321864218652186621867218682186921870218712187221873218742187521876218772187821879218802188121882218832188421885218862188721888218892189021891218922189321894218952189621897218982189921900219012190221903219042190521906219072190821909219102191121912219132191421915219162191721918219192192021921219222192321924219252192621927219282192921930219312193221933219342193521936219372193821939219402194121942219432194421945219462194721948219492195021951219522195321954219552195621957219582195921960219612196221963219642196521966219672196821969219702197121972219732197421975219762197721978219792198021981219822198321984219852198621987219882198921990219912199221993219942199521996219972199821999220002200122002220032200422005220062200722008220092201022011220122201322014220152201622017220182201922020220212202222023220242202522026220272202822029220302203122032220332203422035220362203722038220392204022041220422204322044220452204622047220482204922050220512205222053220542205522056220572205822059220602206122062220632206422065220662206722068220692207022071220722207322074220752207622077220782207922080220812208222083220842208522086220872208822089220902209122092220932209422095220962209722098220992210022101221022210322104221052210622107221082210922110221112211222113221142211522116221172211822119221202212122122221232212422125221262212722128221292213022131221322213322134221352213622137221382213922140221412214222143221442214522146221472214822149221502215122152221532215422155221562215722158221592216022161221622216322164221652216622167221682216922170221712217222173221742217522176221772217822179221802218122182221832218422185221862218722188221892219022191221922219322194221952219622197221982219922200222012220222203222042220522206222072220822209222102221122212222132221422215222162221722218222192222022221222222222322224222252222622227222282222922230222312223222233222342223522236222372223822239222402224122242222432224422245222462224722248222492225022251222522225322254222552225622257222582225922260222612226222263222642226522266222672226822269222702227122272222732227422275222762227722278222792228022281222822228322284222852228622287222882228922290222912229222293222942229522296222972229822299223002230122302223032230422305223062230722308223092231022311223122231322314223152231622317223182231922320223212232222323223242232522326223272232822329223302233122332223332233422335223362233722338223392234022341223422234322344223452234622347223482234922350223512235222353223542235522356223572235822359223602236122362223632236422365223662236722368223692237022371223722237322374223752237622377223782237922380223812238222383223842238522386223872238822389223902239122392223932239422395223962239722398223992240022401224022240322404224052240622407224082240922410224112241222413224142241522416224172241822419224202242122422224232242422425224262242722428224292243022431224322243322434224352243622437224382243922440224412244222443224442244522446224472244822449224502245122452224532245422455224562245722458224592246022461224622246322464224652246622467224682246922470224712247222473224742247522476224772247822479224802248122482224832248422485224862248722488224892249022491224922249322494224952249622497224982249922500225012250222503225042250522506225072250822509225102251122512225132251422515225162251722518225192252022521225222252322524225252252622527225282252922530225312253222533225342253522536225372253822539225402254122542225432254422545225462254722548225492255022551225522255322554225552255622557225582255922560225612256222563225642256522566225672256822569225702257122572225732257422575225762257722578225792258022581225822258322584225852258622587225882258922590225912259222593225942259522596225972259822599226002260122602226032260422605226062260722608226092261022611226122261322614226152261622617226182261922620226212262222623226242262522626226272262822629226302263122632226332263422635226362263722638226392264022641226422264322644226452264622647226482264922650226512265222653226542265522656226572265822659226602266122662226632266422665226662266722668226692267022671226722267322674226752267622677226782267922680226812268222683226842268522686226872268822689226902269122692226932269422695226962269722698226992270022701227022270322704227052270622707227082270922710227112271222713227142271522716227172271822719227202272122722227232272422725227262272722728227292273022731227322273322734227352273622737227382273922740227412274222743227442274522746227472274822749227502275122752227532275422755227562275722758227592276022761227622276322764227652276622767227682276922770227712277222773227742277522776227772277822779227802278122782227832278422785227862278722788227892279022791227922279322794227952279622797227982279922800228012280222803228042280522806228072280822809228102281122812228132281422815228162281722818228192282022821228222282322824228252282622827228282282922830228312283222833228342283522836228372283822839228402284122842228432284422845228462284722848228492285022851228522285322854228552285622857228582285922860228612286222863228642286522866228672286822869228702287122872228732287422875228762287722878228792288022881228822288322884228852288622887228882288922890228912289222893228942289522896228972289822899229002290122902229032290422905229062290722908229092291022911229122291322914229152291622917229182291922920229212292222923229242292522926229272292822929229302293122932229332293422935229362293722938229392294022941229422294322944229452294622947229482294922950229512295222953229542295522956229572295822959229602296122962229632296422965229662296722968229692297022971229722297322974229752297622977229782297922980229812298222983229842298522986229872298822989229902299122992229932299422995229962299722998229992300023001230022300323004230052300623007230082300923010230112301223013230142301523016230172301823019230202302123022230232302423025230262302723028230292303023031230322303323034230352303623037230382303923040230412304223043230442304523046230472304823049230502305123052230532305423055230562305723058230592306023061230622306323064230652306623067230682306923070230712307223073230742307523076230772307823079230802308123082230832308423085230862308723088230892309023091230922309323094230952309623097230982309923100231012310223103231042310523106231072310823109231102311123112231132311423115231162311723118231192312023121231222312323124231252312623127231282312923130231312313223133231342313523136231372313823139231402314123142231432314423145231462314723148231492315023151231522315323154231552315623157231582315923160231612316223163231642316523166231672316823169231702317123172231732317423175231762317723178231792318023181231822318323184231852318623187231882318923190231912319223193231942319523196231972319823199232002320123202232032320423205232062320723208232092321023211232122321323214232152321623217232182321923220232212322223223232242322523226232272322823229232302323123232232332323423235232362323723238232392324023241232422324323244232452324623247232482324923250232512325223253232542325523256232572325823259232602326123262232632326423265232662326723268232692327023271232722327323274232752327623277232782327923280232812328223283232842328523286232872328823289232902329123292232932329423295232962329723298232992330023301233022330323304233052330623307233082330923310233112331223313233142331523316233172331823319233202332123322233232332423325233262332723328233292333023331233322333323334233352333623337233382333923340233412334223343233442334523346233472334823349233502335123352233532335423355233562335723358233592336023361233622336323364233652336623367233682336923370233712337223373233742337523376233772337823379233802338123382233832338423385233862338723388233892339023391233922339323394233952339623397233982339923400234012340223403234042340523406234072340823409234102341123412234132341423415234162341723418234192342023421234222342323424234252342623427234282342923430234312343223433234342343523436234372343823439234402344123442234432344423445234462344723448234492345023451234522345323454234552345623457234582345923460234612346223463234642346523466234672346823469234702347123472234732347423475234762347723478234792348023481234822348323484234852348623487234882348923490234912349223493234942349523496234972349823499235002350123502235032350423505235062350723508235092351023511235122351323514235152351623517235182351923520235212352223523235242352523526235272352823529235302353123532235332353423535235362353723538235392354023541235422354323544235452354623547235482354923550235512355223553235542355523556235572355823559235602356123562235632356423565235662356723568235692357023571235722357323574235752357623577235782357923580235812358223583235842358523586235872358823589235902359123592235932359423595235962359723598235992360023601236022360323604236052360623607236082360923610236112361223613236142361523616236172361823619236202362123622236232362423625236262362723628236292363023631236322363323634236352363623637236382363923640236412364223643236442364523646236472364823649236502365123652236532365423655236562365723658236592366023661236622366323664236652366623667236682366923670236712367223673236742367523676236772367823679236802368123682236832368423685236862368723688236892369023691236922369323694236952369623697236982369923700237012370223703237042370523706237072370823709237102371123712237132371423715237162371723718237192372023721237222372323724237252372623727237282372923730237312373223733237342373523736237372373823739237402374123742237432374423745237462374723748237492375023751237522375323754237552375623757237582375923760237612376223763237642376523766237672376823769237702377123772237732377423775237762377723778237792378023781237822378323784237852378623787237882378923790237912379223793237942379523796237972379823799238002380123802238032380423805238062380723808238092381023811238122381323814238152381623817238182381923820238212382223823238242382523826238272382823829238302383123832238332383423835238362383723838238392384023841 |
- [INFO] Scanning for projects...
- [WARNING]
- [WARNING] Some problems were encountered while building the effective model for com.xuekairui:zhijiayun-user:jar:1.0.0
- [WARNING] 'dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: com.xuekairui:zhijiayun-common:jar -> duplicate declaration of version (?) @ line 96, column 21
- [WARNING]
- [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
- [WARNING]
- [WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
- [WARNING]
- [INFO] ------------------------------------------------------------------------
- [INFO] Reactor Build Order:
- [INFO]
- [INFO] zhijiayun-pharmacy [pom]
- [INFO] zhijiayun-common [jar]
- [INFO] zhijiayun-user [jar]
- [INFO] zhijiayun-payment [jar]
- [INFO] zhijiayun-invite [jar]
- [INFO] zhijiayun-gateway [jar]
- [INFO]
- [INFO] ------------------< com.xuekairui:zhijiayun-pharmacy >------------------
- [INFO] Building zhijiayun-pharmacy 1.0-SNAPSHOT [1/6]
- [INFO] from pom.xml
- [INFO] --------------------------------[ pom ]---------------------------------
- [INFO]
- [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-pharmacy ---
- [INFO]
- [INFO] -------------------< com.xuekairui:zhijiayun-common >-------------------
- [INFO] Building zhijiayun-common 1.0.0 [2/6]
- [INFO] from zhijiayun-common\pom.xml
- [INFO] --------------------------------[ jar ]---------------------------------
- [INFO]
- [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-common ---
- [INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-common\target
- [INFO]
- [INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-common ---
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-common\src\main\resources
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-common\src\main\resources
- [INFO]
- [INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-common ---
- [INFO] Recompiling the module because of changed source code.
- [INFO] Compiling 7 source files with javac [debug parameters release 17] to target\classes
- [INFO]
- [INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-common ---
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-common\src\test\resources
- [INFO]
- [INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-common ---
- [INFO] No sources to compile
- [INFO]
- [INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-common ---
- [INFO] No tests to run.
- [INFO]
- [INFO] --------------------< com.xuekairui:zhijiayun-user >--------------------
- [INFO] Building zhijiayun-user 1.0.0 [3/6]
- [INFO] from zhijiayun-user\pom.xml
- [INFO] --------------------------------[ jar ]---------------------------------
- [INFO]
- [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-user ---
- [INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-user\target
- [INFO]
- [INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-user ---
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-user\src\main\resources
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-user\src\main\resources
- [INFO]
- [INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-user ---
- [INFO] Recompiling the module because of changed dependency.
- [INFO] Compiling 120 source files with javac [debug parameters release 17] to target\classes
- [INFO]
- [INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-user ---
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-user\src\test\resources
- [INFO]
- [INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-user ---
- [INFO] Recompiling the module because of changed dependency.
- [INFO]
- [INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-user ---
- [INFO]
- [INFO] ------------------< com.xuekairui:zhijiayun-payment >-------------------
- [INFO] Building zhijiayun-payment 1.0.0 [4/6]
- [INFO] from zhijiayun-payment\pom.xml
- [INFO] --------------------------------[ jar ]---------------------------------
- [INFO]
- [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-payment ---
- [INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-payment\target
- [INFO]
- [INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-payment ---
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\main\resources
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\main\resources
- [INFO]
- [INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-payment ---
- [INFO] Recompiling the module because of changed dependency.
- [INFO] Compiling 47 source files with javac [debug parameters release 17] to target\classes
- [INFO] /D:/project/zhijiayun-pharmacy/zhijiayun-payment/src/main/java/com/xuekairui/payment/service/AlipayAnxinPayService.java: D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\main\java\com\xuekairui\payment\service\AlipayAnxinPayService.java使用了未经检查或不安全的操作。
- [INFO] /D:/project/zhijiayun-pharmacy/zhijiayun-payment/src/main/java/com/xuekairui/payment/service/AlipayAnxinPayService.java: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
- [INFO]
- [INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-payment ---
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-payment\src\test\resources
- [INFO]
- [INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-payment ---
- [INFO] No sources to compile
- [INFO]
- [INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-payment ---
- [INFO] No tests to run.
- [INFO]
- [INFO] -------------------< com.xuekairui:zhijiayun-invite >-------------------
- [INFO] Building zhijiayun-invite 1.0.0 [5/6]
- [INFO] from zhijiayun-invite\pom.xml
- [INFO] --------------------------------[ jar ]---------------------------------
- [INFO]
- [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-invite ---
- [INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-invite\target
- [INFO]
- [INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-invite ---
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-invite\src\main\resources
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-invite\src\main\resources
- [INFO]
- [INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-invite ---
- [INFO] Recompiling the module because of changed dependency.
- [INFO] Compiling 20 source files with javac [debug parameters release 17] to target\classes
- [INFO]
- [INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-invite ---
- [INFO] skip non existing resourceDirectory D:\project\zhijiayun-pharmacy\zhijiayun-invite\src\test\resources
- [INFO]
- [INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-invite ---
- [INFO] No sources to compile
- [INFO]
- [INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-invite ---
- [INFO] No tests to run.
- [INFO]
- [INFO] ------------------< com.xuekairui:zhijiayun-gateway >-------------------
- [INFO] Building zhijiayun-gateway 1.0.0 [6/6]
- [INFO] from zhijiayun-gateway\pom.xml
- [INFO] --------------------------------[ jar ]---------------------------------
- [INFO]
- [INFO] --- clean:3.4.1:clean (default-clean) @ zhijiayun-gateway ---
- [INFO] Deleting D:\project\zhijiayun-pharmacy\zhijiayun-gateway\target
- [INFO]
- [INFO] --- resources:3.3.1:resources (default-resources) @ zhijiayun-gateway ---
- [INFO] Copying 3 resources from src\main\resources to target\classes
- [INFO] Copying 29 resources from src\main\resources to target\classes
- [INFO]
- [INFO] --- compiler:3.14.1:compile (default-compile) @ zhijiayun-gateway ---
- [INFO] Recompiling the module because of changed dependency.
- [INFO] Compiling 6 source files with javac [debug parameters release 17] to target\classes
- [INFO]
- [INFO] --- resources:3.3.1:testResources (default-testResources) @ zhijiayun-gateway ---
- [INFO] Copying 2 resources from src\test\resources to target\test-classes
- [INFO]
- [INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ zhijiayun-gateway ---
- [INFO] Recompiling the module because of changed dependency.
- [INFO] Compiling 24 source files with javac [debug parameters release 17] to target\test-classes
- [INFO]
- [INFO] --- surefire:3.5.5:test (default-test) @ zhijiayun-gateway ---
- [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
- [INFO]
- [INFO] -------------------------------------------------------
- [INFO] T E S T S
- [INFO] -------------------------------------------------------
- [INFO] Running 运营管理接口测试
- 15:17:02.339 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [com.xuekairui.gateway.AdminControllerTest]: AdminControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:02.546 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.AdminControllerTest
- . ____ _ __ _ _
- /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
- ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
- \\/ ___)| |_)| | | | | || (_| | ) ) ) )
- ' |____| .__|_| |_|_| |_\__, | / / / /
- =========|_|==============|___/=/_/_/_/
- :: Spring Boot :: (v3.5.14)
- 15:17:03.189 INFO [] [] [ main] c.x.g.AdminControllerTest : Starting AdminControllerTest using Java 17.0.17 with PID 37656 (started by geloger in D:\project\zhijiayun-pharmacy\zhijiayun-gateway)
- 15:17:03.190 DEBUG [] [] [ main] c.x.g.AdminControllerTest : Running with Spring Boot v3.5.14, Spring v6.2.18
- 15:17:03.190 INFO [] [] [ main] c.x.g.AdminControllerTest : The following 1 profile is active: "test"
- 15:17:04.700 INFO [] [] [ main] epositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
- 15:17:04.704 INFO [] [] [ main] epositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
- 15:17:04.767 INFO [] [] [ main] epositoryConfigurationDelegate : Finished Spring Data repository scanning in 29 ms. Found 0 Redis repository interfaces.
- _ _ |_ _ _|_. ___ _ | _
- | | |\/|_)(_| | |_\ |_)||_|_\
- / |
- 3.5.16
- 15:17:07.002 INFO [] [] [ main] c.x.u.service.AliyunSmsClient : 阿里云短信客户端初始化成功,端点: dysmsapi.aliyuncs.com
- 15:17:07.698 INFO [] [] [ main] c.z.hikari.HikariDataSource : HikariPool-1 - Starting...
- 15:17:08.030 INFO [] [] [ main] c.z.hikari.pool.HikariPool : HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@6075a4ea
- 15:17:08.032 INFO [] [] [ main] c.z.hikari.HikariDataSource : HikariPool-1 - Start completed.
- [DB-INIT] Test database initialized successfully
- 15:17:09.800 INFO [] [] [ main] .b.a.e.w.EndpointLinksResolver : Exposing 1 endpoint beneath base path '/actuator'
- 15:17:09.848 WARN [] [] [ main] etailsServiceAutoConfiguration :
- Using generated security password: 696adf54-5590-4d2d-a255-2a0669d6228b
- This generated password is for development use only. Your security configuration must be updated before running your application in production.
- 15:17:09.867 INFO [] [] [ main] zeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
- 15:17:10.441 INFO [] [] [ main] tisPlusApplicationContextAware : Register ApplicationContext instances org.springframework.web.context.support.GenericWebApplicationContext@1c26273d
- 15:17:10.769 DEBUG [] [] [ main] c.x.g.f.RequestLoggingFilter : Filter 'requestLoggingFilter' configured for use
- 15:17:10.769 DEBUG [] [] [ main] c.x.g.filter.RateLimitFilter : Filter 'rateLimitFilter' configured for use
- 15:17:10.769 DEBUG [] [] [ main] .x.u.s.JwtAuthenticationFilter : Filter 'jwtAuthenticationFilter' configured for use
- 15:17:10.770 INFO [] [] [ main] w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet ''
- 15:17:10.770 INFO [] [] [ main] .s.t.w.s.TestDispatcherServlet : Initializing Servlet ''
- 15:17:10.771 INFO [] [] [ main] .s.t.w.s.TestDispatcherServlet : Completed initialization in 1 ms
- 15:17:10.922 INFO [] [] [ main] c.x.g.AdminControllerTest : Started AdminControllerTest in 8.242 seconds (process running for 9.669)
- 15:17:10.989 DEBUG [HxLyDBsZ] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Preparing: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
- 15:17:11.030 DEBUG [HxLyDBsZ] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Parameters: 2026-07-02T15:17:10.946416500(LocalDateTime)
- 15:17:11.059 DEBUG [HxLyDBsZ] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : <== Total: 0
- 15:17:11.100 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (role = ?) LIMIT 1
- 15:17:11.102 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: SUPER_ADMIN(String)
- 15:17:11.106 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
- 15:17:11.108 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (nickname = ?)
- 15:17:11.109 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: admin(String)
- 15:17:11.111 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
- 15:17:11.183 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : ==> Preparing: INSERT INTO t_user ( id, nickname, password, status, role, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:11.184 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : ==> Parameters: 2072580326515744769(Long), admin(String), $2a$10$RyC8dyJdNKjVVRbXeWqdk.hqyuld8W5xqkAcIRKTLR9ui6GKQlYk2(String), 1(Integer), SUPER_ADMIN(String), 0(Long), 2026-07-02T15:17:11.179740300(LocalDateTime), 2026-07-02T15:17:11.179740300(LocalDateTime)
- 15:17:11.192 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : <== Updates: 1
- 15:17:11.192 INFO [] [] [ main] c.x.u.c.SuperAdminInitializer : 已创建默认超级管理员,用户名:admin,默认密码:admin@123,请尽快修改默认密码
- mvn : Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap cl
- asspath has been appended
- 所在位置 行:1 字符: 165
- + ... eep -Seconds 3; mvn clean test -pl zhijiayun-gateway -am 2>&1 | Out-F ...
- + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- + CategoryInfo : NotSpecified: (Java HotSpot(TM...s been appended:String) [], RemoteException
- + FullyQualifiedErrorId : NativeCommandError
-
- 15:17:15.291 DEBUG [jPPgGtHL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config | IP: 127.0.0.1
- 15:17:15.370 DEBUG [jPPgGtHL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:15.370 DEBUG [jPPgGtHL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:15.377 DEBUG [jPPgGtHL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:15.407 DEBUG [jPPgGtHL] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:15.407 DEBUG [jPPgGtHL] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:15.414 DEBUG [jPPgGtHL] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:15.452 DEBUG [jPPgGtHL] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config 200 162ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/config
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getInviteConfig()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"jPPgGtHL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":0,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"邀请你加入智价云(药店版)","landingDesc":"登录智价云(药店版),邀请好友各得好礼","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635416}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:15.521 DEBUG [KedrtyDL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config | IP: 127.0.0.1
- 15:17:15.529 WARN [KedrtyDL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config 401 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/config
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"KedrtyDL", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976635526}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:15.541 DEBUG [AbpCJb6T] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config | IP: 127.0.0.1
- 15:17:15.544 DEBUG [AbpCJb6T] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:15.545 DEBUG [AbpCJb6T] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:15.547 DEBUG [AbpCJb6T] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:15.550 DEBUG [AbpCJb6T] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:15.551 DEBUG [AbpCJb6T] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:15.554 DEBUG [AbpCJb6T] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:15.557 DEBUG [AbpCJb6T] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config 200 16ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/config
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getInviteConfig()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"AbpCJb6T", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":0,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"邀请你加入智价云(药店版)","landingDesc":"登录智价云(药店版),邀请好友各得好礼","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635555}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:15.574 DEBUG [bc3sPgK8] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config | IP: 127.0.0.1
- 15:17:15.578 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:15.579 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:15.582 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:15.710 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:15.711 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:15.713 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:15.723 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.updateById : ==> Preparing: UPDATE t_invite_config SET reward_crawler_count=?, reward_type=?, reward_months=?, max_daily_reward=?, invite_code_expire_days=?, max_invite_per_day=?, max_total_invites=?, landing_title=?, landing_desc=?, app_name=?, status=?, share_title_template=?, copy_text_template=?, reward_description=?, summary_text_template=?, instruction_windows=?, instruction_app=?, instruction_miniapp=?, instruction_wechat=?, instruction_dingtalk=?, instruction_feishu=?, instruction_default=?, create_time=?, update_time=? WHERE id=?
- 15:17:15.725 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.updateById : ==> Parameters: 5(Integer), MEMBERSHIP(String), 1(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), 测试标题(String), 登录智价云(药店版),邀请好友各得好礼(String), 智价云(药店版)(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!(String), 邀请人每成功邀请1家药店注册,赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 点击按钮打开小程序,邀请码已自动填入(String), 关注公众号后,在菜单中输入邀请码:{code} 完成注册(String), 打开钉钉应用,搜索"{appName}"并输入邀请码:{code}(String), 打开飞书应用,搜索"{appName}"并输入邀请码:{code}(String), 下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励(String), 2026-07-02T15:17:14(LocalDateTime), 2026-07-02T15:17:14(LocalDateTime), 1(Long)
- 15:17:15.732 DEBUG [bc3sPgK8] [1] [ main] c.x.i.m.I.updateById : <== Updates: 1
- 15:17:15.732 INFO [bc3sPgK8] [1] [ main] c.x.i.s.InviteConfigService : 邀请配置已更新: rewardType=MEMBERSHIP, rewardMonths=1, appDownloadUrl=null, miniappPath=null
- 15:17:15.738 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:15.739 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580345629188098(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:15.735046500(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 1(Long), INVITE_CONFIG(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:15.737854200(LocalDateTime)
- 15:17:15.747 DEBUG [bc3sPgK8] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:15.747 WARN [bc3sPgK8] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG, 结果: SUCCESS
- 15:17:15.747 DEBUG [bc3sPgK8] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
- 15:17:15.749 DEBUG [bc3sPgK8] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config 200 175ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/invite/config
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g", Content-Length:"196"]
- Body = {
- "rewardCrawlerCount": 5,
- "maxDailyReward": 50,
- "inviteCodeExpireDays": 30,
- "maxInvitePerDay": 10,
- "landingTitle": "测试标题",
- "appName": "智价云(药店版)"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#updateInviteConfig(InviteConfigRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"bc3sPgK8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"测试标题","landingDesc":"登录智价云(药店版),邀请好友各得好礼","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635747}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:15.762 DEBUG [rtsu3PJe] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config | IP: 127.0.0.1
- 15:17:15.765 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:15.766 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:15.770 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:15.773 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:15.773 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:15.777 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:15.779 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.updateById : ==> Preparing: UPDATE t_invite_config SET reward_crawler_count=?, reward_type=?, reward_months=?, max_daily_reward=?, invite_code_expire_days=?, max_invite_per_day=?, max_total_invites=?, app_download_url=?, miniapp_path=?, miniapp_app_id=?, wechat_redirect_url=?, dingtalk_app_id=?, feishu_app_id=?, landing_title=?, landing_desc=?, app_name=?, status=?, share_title_template=?, copy_text_template=?, reward_description=?, summary_text_template=?, instruction_windows=?, instruction_app=?, instruction_miniapp=?, instruction_wechat=?, instruction_dingtalk=?, instruction_feishu=?, instruction_default=?, create_time=?, update_time=? WHERE id=?
- 15:17:15.781 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.updateById : ==> Parameters: 5(Integer), MEMBERSHIP(String), 1(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), https://download.example.com/app.exe(String), /pages/download/index(String), wx1234567890(String), https://mp.weixin.qq.com/xxx(String), dingxxx(String), feishuxxx(String), 邀请你加入(String), 高效数据采集(String), 智价云(药店版)(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!(String), 邀请人每成功邀请1家药店注册,赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 点击按钮打开小程序,邀请码已自动填入(String), 关注公众号后,在菜单中输入邀请码:{code} 完成注册(String), 打开钉钉应用,搜索"{appName}"并输入邀请码:{code}(String), 打开飞书应用,搜索"{appName}"并输入邀请码:{code}(String), 下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励(String), 2026-07-02T15:17:14(LocalDateTime), 2026-07-02T15:17:14(LocalDateTime), 1(Long)
- 15:17:15.788 DEBUG [rtsu3PJe] [1] [ main] c.x.i.m.I.updateById : <== Updates: 1
- 15:17:15.789 INFO [rtsu3PJe] [1] [ main] c.x.i.s.InviteConfigService : 邀请配置已更新: rewardType=MEMBERSHIP, rewardMonths=1, appDownloadUrl=https://download.example.com/app.exe, miniappPath=/pages/download/index
- 15:17:15.790 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:15.791 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580345817931777(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:15.789480700(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 1(Long), INVITE_CONFIG(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:15.790528200(LocalDateTime)
- 15:17:15.797 DEBUG [rtsu3PJe] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:15.798 WARN [rtsu3PJe] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG, 结果: SUCCESS
- 15:17:15.798 DEBUG [rtsu3PJe] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
- 15:17:15.800 DEBUG [rtsu3PJe] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config 200 38ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/invite/config
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g", Content-Length:"503"]
- Body = {
- "rewardCrawlerCount": 5,
- "maxDailyReward": 50,
- "inviteCodeExpireDays": 30,
- "maxInvitePerDay": 10,
- "appDownloadUrl": "https://download.example.com/app.exe",
- "miniappPath": "/pages/download/index",
- "miniappAppId": "wx1234567890",
- "wechatRedirectUrl": "https://mp.weixin.qq.com/xxx",
- "dingtalkAppId": "dingxxx",
- "feishuAppId": "feishuxxx",
- "landingTitle": "邀请你加入",
- "landingDesc": "高效数据采集",
- "appName": "智价云(药店版)"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#updateInviteConfig(InviteConfigRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"rtsu3PJe", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"邀请你加入","landingDesc":"高效数据采集","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635798}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:15.808 DEBUG [jsZ82rt7] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config | IP: 127.0.0.1
- 15:17:15.812 WARN [jsZ82rt7] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config 401 4ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/invite/config
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"jsZ82rt7", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976635810}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:15.822 DEBUG [XF5QAxNm] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/configs | IP: 127.0.0.1
- 15:17:15.824 DEBUG [XF5QAxNm] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:15.825 DEBUG [XF5QAxNm] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:15.828 DEBUG [XF5QAxNm] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:15.902 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_invite_config
- 15:17:15.903 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList_mpCount : ==> Parameters:
- 15:17:15.906 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList_mpCount : <== Total: 1
- 15:17:15.909 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config ORDER BY create_time DESC LIMIT ?
- 15:17:15.910 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 20(Long)
- 15:17:15.912 DEBUG [XF5QAxNm] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:15.917 DEBUG [XF5QAxNm] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/configs 200 95ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/configs
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#listInviteConfigs(Integer, Integer)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"XF5QAxNm", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"邀请你加入","landingDesc":"高效数据采集","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"}],"total":1,"size":20,"current":1,"pages":1},"timestamp":1782976635913}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:15.926 DEBUG [WDtEh5vm] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/1 | IP: 127.0.0.1
- 15:17:15.929 DEBUG [WDtEh5vm] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:15.929 DEBUG [WDtEh5vm] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:15.932 DEBUG [WDtEh5vm] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:15.934 DEBUG [WDtEh5vm] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
- 15:17:15.935 DEBUG [WDtEh5vm] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 1(Long)
- 15:17:15.938 DEBUG [WDtEh5vm] [1] [ main] c.x.i.m.I.selectById : <== Total: 1
- 15:17:15.940 DEBUG [WDtEh5vm] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/1 200 14ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/config/1
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getInviteConfigById(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"WDtEh5vm", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"邀请你加入","landingDesc":"高效数据采集","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976635938}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:15.948 DEBUG [fNkx8ULs] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/99999 | IP: 127.0.0.1
- 15:17:15.950 DEBUG [fNkx8ULs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:15.950 DEBUG [fNkx8ULs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:15.953 DEBUG [fNkx8ULs] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:15.955 DEBUG [fNkx8ULs] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
- 15:17:15.955 DEBUG [fNkx8ULs] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 99999(Long)
- 15:17:15.956 DEBUG [fNkx8ULs] [1] [ main] c.x.i.m.I.selectById : <== Total: 0
- 15:17:15.960 WARN [fNkx8ULs] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=邀请配置不存在
- 15:17:15.961 DEBUG [fNkx8ULs] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/99999 200 13ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/config/99999
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getInviteConfigById(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"fNkx8ULs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":404,"message":"邀请配置不存在","data":null,"timestamp":1782976635960}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:15.969 DEBUG [cDv3xdzq] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant | IP: 127.0.0.1
- 15:17:15.972 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:15.972 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:15.974 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:15.985 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:15.986 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:15.987 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:15.990 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_quota_grant ( id, user_id, grant_type, quota_count, used_count, remark, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:15.991 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580346656792577(Long), 1(Long), ADMIN(String), 50(Integer), 0(Integer), 测试发放(String), 1(Integer), 2026-07-02T15:17:15.989513300(LocalDateTime), 2026-07-02T15:17:15.989513300(LocalDateTime)
- 15:17:15.993 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:15.994 INFO [cDv3xdzq] [1] [ main] x.u.s.CrawlerQuotaGrantService : 爬虫配额发放: 用户=1, 类型=ADMIN, 次数=50, 过期=null, 备注=测试发放
- 15:17:16.000 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:16.001 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580346723901441(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:15.999762200(LocalDateTime), CRAWLER(String), QUOTA_GRANT(String), 手动发放爬虫配额(String), CRAWLER_QUOTA(String), 1(Long), CRAWLER_QUOTA:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.000289900(LocalDateTime)
- 15:17:16.005 DEBUG [cDv3xdzq] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:16.006 WARN [cDv3xdzq] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】手动发放爬虫配额 - 操作人: 管理员(1), 目标: CRAWLER_QUOTA:1, 结果: SUCCESS
- 15:17:16.006 DEBUG [cDv3xdzq] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 手动发放爬虫配额
- 15:17:16.009 DEBUG [cDv3xdzq] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant 200 40ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/crawler/grant
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzUsImV4cCI6MTc4MzA2MzAzNX0.ZlNsye7qNS-D7eF320F0C9OxJJ31DlihUdhDw-AbuJCbRENeny7DUKGCBeS3YGlKXNyMftI1fk71N6WT8_1i6g", Content-Length:"94"]
- Body = {
- "userId": 1,
- "quotaCount": 50,
- "expireDays": 30,
- "remark": "测试发放"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#grantCrawlerQuota(QuotaGrantRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"cDv3xdzq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:15","updateTime":"2026-07-02 15:17:15"},"timestamp":1782976636006}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.018 DEBUG [YuJMuqg4] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/invite/config | IP: 127.0.0.1
- 15:17:16.020 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.020 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.023 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.029 DEBUG [YuJMuqg4] [1] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_config ( reward_crawler_count, reward_type, reward_months, max_daily_reward, invite_code_expire_days, max_invite_per_day, max_total_invites, landing_title, landing_desc, app_name, status, share_title_template, copy_text_template, reward_description, summary_text_template, instruction_windows, instruction_app, instruction_miniapp, instruction_wechat, instruction_dingtalk, instruction_feishu, instruction_default, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:16.030 DEBUG [YuJMuqg4] [1] [ main] c.x.i.m.I.insert : ==> Parameters: 3(Integer), MEMBERSHIP(String), 2(Integer), 30(Integer), 15(Integer), 5(Integer), 20(Integer), 新配置标题(String), 登录智价云(药店版),聚合比价查低价(String), 智价云(药店版)(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!(String), 邀请人每成功邀请1家药店注册,赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 点击按钮打开小程序,邀请码已自动填入(String), 关注公众号后,在菜单中输入邀请码:{code} 完成注册(String), 打开钉钉应用,搜索"{appName}"并输入邀请码:{code}(String), 打开飞书应用,搜索"{appName}"并输入邀请码:{code}(String), 下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励(String), 2026-07-02T15:17:16.028702200(LocalDateTime), 2026-07-02T15:17:16.028702200(LocalDateTime)
- 15:17:16.035 DEBUG [YuJMuqg4] [1] [ main] c.x.i.m.I.insert : <== Updates: 1
- 15:17:16.037 INFO [YuJMuqg4] [1] [ main] c.x.i.s.InviteConfigService : 创建邀请配置: id=2, rewardType=MEMBERSHIP, rewardMonths=2
- 15:17:16.038 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:16.039 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580346849730562(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.037481200(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 2(Long), INVITE_CONFIG_CREATE(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.037998700(LocalDateTime)
- 15:17:16.043 DEBUG [YuJMuqg4] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:16.044 WARN [YuJMuqg4] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_CREATE, 结果: SUCCESS
- 15:17:16.044 DEBUG [YuJMuqg4] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
- 15:17:16.046 DEBUG [YuJMuqg4] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/invite/config 200 28ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/invite/config
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"280"]
- Body = {
- "rewardCrawlerCount": 3,
- "rewardType": "MEMBERSHIP",
- "rewardMonths": 2,
- "maxDailyReward": 30,
- "inviteCodeExpireDays": 15,
- "maxInvitePerDay": 5,
- "maxTotalInvites": 20,
- "landingTitle": "新配置标题",
- "appName": "智价云(药店版)"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#createInviteConfig(InviteConfigRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"YuJMuqg4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":2,"rewardCrawlerCount":3,"rewardType":"MEMBERSHIP","rewardMonths":2,"maxDailyReward":30,"inviteCodeExpireDays":15,"maxInvitePerDay":5,"maxTotalInvites":20,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"新配置标题","landingDesc":"登录智价云(药店版),聚合比价查低价","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"},"timestamp":1782976636044}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.051 DEBUG [2v65QrTh] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant | IP: 127.0.0.1
- 15:17:16.053 WARN [2v65QrTh] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant 401 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/crawler/grant
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
- Body = {"userId":1,"quotaCount":50}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"2v65QrTh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976636052}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.060 DEBUG [NazCSJkw] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config/1 | IP: 127.0.0.1
- 15:17:16.062 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.063 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.065 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.068 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
- 15:17:16.068 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 1(Long)
- 15:17:16.070 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.selectById : <== Total: 1
- 15:17:16.071 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.updateById : ==> Preparing: UPDATE t_invite_config SET reward_crawler_count=?, reward_type=?, reward_months=?, max_daily_reward=?, invite_code_expire_days=?, max_invite_per_day=?, max_total_invites=?, app_download_url=?, miniapp_path=?, miniapp_app_id=?, wechat_redirect_url=?, dingtalk_app_id=?, feishu_app_id=?, landing_title=?, landing_desc=?, app_name=?, status=?, share_title_template=?, copy_text_template=?, reward_description=?, summary_text_template=?, instruction_windows=?, instruction_app=?, instruction_miniapp=?, instruction_wechat=?, instruction_dingtalk=?, instruction_feishu=?, instruction_default=?, create_time=?, update_time=? WHERE id=?
- 15:17:16.076 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.updateById : ==> Parameters: 5(Integer), MEMBERSHIP(String), 3(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), https://download.example.com/app.exe(String), /pages/download/index(String), wx1234567890(String), https://mp.weixin.qq.com/xxx(String), dingxxx(String), feishuxxx(String), 更新后的标题(String), 高效数据采集(String), 智价云(药店版)(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!(String), 邀请人每成功邀请1家药店注册,赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 点击按钮打开小程序,邀请码已自动填入(String), 关注公众号后,在菜单中输入邀请码:{code} 完成注册(String), 打开钉钉应用,搜索"{appName}"并输入邀请码:{code}(String), 打开飞书应用,搜索"{appName}"并输入邀请码:{code}(String), 下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励(String), 2026-07-02T15:17:14(LocalDateTime), 2026-07-02T15:17:14(LocalDateTime), 1(Long)
- 15:17:16.081 DEBUG [NazCSJkw] [1] [ main] c.x.i.m.I.updateById : <== Updates: 1
- 15:17:16.081 INFO [NazCSJkw] [1] [ main] c.x.i.s.InviteConfigService : 更新邀请配置: id=1, rewardType=MEMBERSHIP, rewardMonths=3
- 15:17:16.082 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:16.082 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580347042668545(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.081872300(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 1(Long), INVITE_CONFIG_UPDATE:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.082419400(LocalDateTime)
- 15:17:16.087 DEBUG [NazCSJkw] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:16.087 WARN [NazCSJkw] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_UPDATE:1, 结果: SUCCESS
- 15:17:16.087 DEBUG [NazCSJkw] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
- 15:17:16.089 DEBUG [NazCSJkw] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config/1 200 29ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/invite/config/1
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"68"]
- Body = {
- "rewardMonths": 3,
- "landingTitle": "更新后的标题"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#updateInviteConfigById(Long, InviteConfigRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"NazCSJkw", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"rewardCrawlerCount":5,"rewardType":"MEMBERSHIP","rewardMonths":3,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":"https://download.example.com/app.exe","miniappPath":"/pages/download/index","miniappAppId":"wx1234567890","wechatRedirectUrl":"https://mp.weixin.qq.com/xxx","dingtalkAppId":"dingxxx","feishuAppId":"feishuxxx","landingTitle":"更新后的标题","landingDesc":"高效数据采集","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:14","updateTime":"2026-07-02 15:17:14"},"timestamp":1782976636087}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.098 DEBUG [mAPZYCA9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants | IP: 127.0.0.1
- 15:17:16.100 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.100 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.102 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.105 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant ORDER BY create_time DESC
- 15:17:16.105 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.C.selectList : ==> Parameters:
- 15:17:16.107 DEBUG [mAPZYCA9] [1] [ main] c.x.u.m.C.selectList : <== Total: 1
- 15:17:16.108 DEBUG [mAPZYCA9] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/crawler/grants
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"mAPZYCA9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"}],"timestamp":1782976636107}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.115 DEBUG [UvEFs9Cr] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config/99999 | IP: 127.0.0.1
- 15:17:16.116 DEBUG [UvEFs9Cr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.117 DEBUG [UvEFs9Cr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.119 DEBUG [UvEFs9Cr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.121 DEBUG [UvEFs9Cr] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
- 15:17:16.121 DEBUG [UvEFs9Cr] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 99999(Long)
- 15:17:16.122 DEBUG [UvEFs9Cr] [1] [ main] c.x.i.m.I.selectById : <== Total: 0
- 15:17:16.123 WARN [UvEFs9Cr] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=邀请配置不存在
- 15:17:16.124 DEBUG [UvEFs9Cr] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config/99999 200 10ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/invite/config/99999
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"19"]
- Body = {"rewardMonths": 3}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#updateInviteConfigById(Long, InviteConfigRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"UvEFs9Cr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":404,"message":"邀请配置不存在","data":null,"timestamp":1782976636123}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.130 DEBUG [dvg2GNxZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/invite/config | IP: 127.0.0.1
- 15:17:16.132 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.133 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.134 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.136 DEBUG [dvg2GNxZ] [1] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_config ( reward_crawler_count, reward_type, reward_months, max_daily_reward, invite_code_expire_days, max_invite_per_day, max_total_invites, landing_title, landing_desc, app_name, status, share_title_template, copy_text_template, reward_description, summary_text_template, instruction_windows, instruction_app, instruction_miniapp, instruction_wechat, instruction_dingtalk, instruction_feishu, instruction_default, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:16.137 DEBUG [dvg2GNxZ] [1] [ main] c.x.i.m.I.insert : ==> Parameters: 0(Integer), MEMBERSHIP(String), 1(Integer), 50(Integer), 30(Integer), 10(Integer), 30(Integer), 待删除配置(String), 登录智价云(药店版),聚合比价查低价(String), 智价云(药店版)(String), 1(Integer), {inviter} 邀请你加入{appName}(String), 我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!(String), 邀请人每成功邀请1家药店注册,赠送1个月高级会员时长(String), 已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员(String), 下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入(String), 点击按钮打开小程序,邀请码已自动填入(String), 关注公众号后,在菜单中输入邀请码:{code} 完成注册(String), 打开钉钉应用,搜索"{appName}"并输入邀请码:{code}(String), 打开飞书应用,搜索"{appName}"并输入邀请码:{code}(String), 下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励(String), 2026-07-02T15:17:16.136861100(LocalDateTime), 2026-07-02T15:17:16.136861100(LocalDateTime)
- 15:17:16.142 DEBUG [dvg2GNxZ] [1] [ main] c.x.i.m.I.insert : <== Updates: 1
- 15:17:16.142 INFO [dvg2GNxZ] [1] [ main] c.x.i.s.InviteConfigService : 创建邀请配置: id=3, rewardType=MEMBERSHIP, rewardMonths=1
- 15:17:16.144 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:16.144 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580347298521089(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.143202700(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 3(Long), INVITE_CONFIG_CREATE(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.144267500(LocalDateTime)
- 15:17:16.148 DEBUG [dvg2GNxZ] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:16.148 WARN [dvg2GNxZ] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_CREATE, 结果: SUCCESS
- 15:17:16.149 DEBUG [dvg2GNxZ] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
- 15:17:16.150 DEBUG [dvg2GNxZ] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/invite/config 200 20ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/invite/config
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ", Content-Length:"65"]
- Body = {
- "rewardMonths": 1,
- "landingTitle": "待删除配置"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#createInviteConfig(InviteConfigRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"dvg2GNxZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":3,"rewardCrawlerCount":0,"rewardType":"MEMBERSHIP","rewardMonths":1,"maxDailyReward":50,"inviteCodeExpireDays":30,"maxInvitePerDay":10,"maxTotalInvites":30,"appDownloadUrl":null,"miniappPath":null,"miniappAppId":null,"wechatRedirectUrl":null,"dingtalkAppId":null,"feishuAppId":null,"landingTitle":"待删除配置","landingDesc":"登录智价云(药店版),聚合比价查低价","appName":"智价云(药店版)","status":1,"shareTitleTemplate":"{inviter} 邀请你加入{appName}","copyTextTemplate":"我是{inviter},在这里发现了一个药店采购神器——{appName}!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接{inviteLink}填我的邀请码 {code} 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","summaryTextTemplate":"已邀请{totalInvited}家药店,{registeredCount}家注册,累计获得{totalReward}个月高级会员","instructionWindows":"下载安装Windows客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionApp":"下载安装客户端后,在注册页面输入邀请码:{code} 或点击链接自动填入","instructionMiniapp":"点击按钮打开小程序,邀请码已自动填入","instructionWechat":"关注公众号后,在菜单中输入邀请码:{code} 完成注册","instructionDingtalk":"打开钉钉应用,搜索\"{appName}\"并输入邀请码:{code}","instructionFeishu":"打开飞书应用,搜索\"{appName}\"并输入邀请码:{code}","instructionDefault":"下载客户端后,在注册页面输入邀请码:{code} 即可享受奖励","remark":null,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"},"timestamp":1782976636149}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.156 DEBUG [wU6NaWCQ] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/invite/config/3 | IP: 127.0.0.1
- 15:17:16.160 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
- 15:17:16.160 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 3(Long)
- 15:17:16.162 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.selectById : <== Total: 1
- 15:17:16.164 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.deleteById : ==> Preparing: DELETE FROM t_invite_config WHERE id=?
- 15:17:16.164 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.deleteById : ==> Parameters: 3(Long)
- 15:17:16.168 DEBUG [wU6NaWCQ] [1] [ main] c.x.i.m.I.deleteById : <== Updates: 1
- 15:17:16.169 INFO [wU6NaWCQ] [1] [ main] c.x.i.s.InviteConfigService : 删除邀请配置: id=3
- 15:17:16.169 DEBUG [wU6NaWCQ] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:16.170 DEBUG [wU6NaWCQ] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580347428544513(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:16.169215(LocalDateTime), INVITE(String), CONFIG_UPDATE(String), 配置邀请规则(String), INVITE(String), 3(Long), INVITE_CONFIG_DELETE:3(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:16.169753900(LocalDateTime)
- 15:17:16.175 DEBUG [wU6NaWCQ] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:16.175 WARN [wU6NaWCQ] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】配置邀请规则 - 操作人: 管理员(1), 目标: INVITE_CONFIG_DELETE:3, 结果: SUCCESS
- 15:17:16.175 DEBUG [wU6NaWCQ] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 配置邀请规则
- 15:17:16.176 DEBUG [wU6NaWCQ] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/invite/config/3 200 20ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/admin/invite/config/3
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#deleteInviteConfig(Long, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"wU6NaWCQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976636175}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.179 DEBUG [fawATnUx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/3 | IP: 127.0.0.1
- 15:17:16.182 DEBUG [fawATnUx] [1] [ main] c.x.i.m.I.selectById : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config WHERE id=?
- 15:17:16.183 DEBUG [fawATnUx] [1] [ main] c.x.i.m.I.selectById : ==> Parameters: 3(Long)
- 15:17:16.184 DEBUG [fawATnUx] [1] [ main] c.x.i.m.I.selectById : <== Total: 0
- 15:17:16.185 WARN [fawATnUx] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=邀请配置不存在
- 15:17:16.186 DEBUG [fawATnUx] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config/3 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/config/3
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getInviteConfigById(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"fawATnUx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":404,"message":"邀请配置不存在","data":null,"timestamp":1782976636185}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.198 DEBUG [sRsK3Bvh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?userId=1 | IP: 127.0.0.1
- 15:17:16.200 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.200 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.202 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.205 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (user_id = ?) ORDER BY create_time DESC
- 15:17:16.205 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long)
- 15:17:16.207 DEBUG [sRsK3Bvh] [1] [ main] c.x.u.m.C.selectList : <== Total: 1
- 15:17:16.208 DEBUG [sRsK3Bvh] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?userId=1 200 11ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/crawler/grants
- Parameters = {userId=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"sRsK3Bvh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"}],"timestamp":1782976636207}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.217 DEBUG [8Zm5EJRs] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=ADMIN | IP: 127.0.0.1
- 15:17:16.220 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.220 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.222 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.228 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (grant_type = ?) ORDER BY create_time DESC
- 15:17:16.229 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: ADMIN(String)
- 15:17:16.231 DEBUG [8Zm5EJRs] [1] [ main] c.x.u.m.C.selectList : <== Total: 1
- 15:17:16.232 DEBUG [8Zm5EJRs] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=ADMIN 200 15ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/crawler/grants
- Parameters = {grantType=[ADMIN]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"8Zm5EJRs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":2072580346656792577,"userId":1,"grantType":"ADMIN","quotaCount":50,"usedCount":0,"expireTime":null,"sourceUserId":null,"remark":"测试发放","status":1,"createTime":"2026-07-02 15:17:16","updateTime":"2026-07-02 15:17:16"}],"timestamp":1782976636231}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.241 DEBUG [6KGQUg83] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=INVITE | IP: 127.0.0.1
- 15:17:16.242 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.244 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.246 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.248 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (grant_type = ?) ORDER BY create_time DESC
- 15:17:16.248 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: INVITE(String)
- 15:17:16.250 DEBUG [6KGQUg83] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:16.251 DEBUG [6KGQUg83] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=INVITE 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/crawler/grants
- Parameters = {grantType=[INVITE]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"6KGQUg83", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636250}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.259 DEBUG [bnHwSmgV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=PURCHASE | IP: 127.0.0.1
- 15:17:16.262 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.262 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.268 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.270 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,grant_type,quota_count,used_count,expire_time,source_user_id,remark,status,create_time,update_time FROM t_crawler_quota_grant WHERE (grant_type = ?) ORDER BY create_time DESC
- 15:17:16.270 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: PURCHASE(String)
- 15:17:16.272 DEBUG [bnHwSmgV] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:16.274 DEBUG [bnHwSmgV] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants?grantType=PURCHASE 200 15ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/crawler/grants
- Parameters = {grantType=[PURCHASE]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#listGrants(Long, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"bnHwSmgV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636273}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.286 DEBUG [9F5pxKKv] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards?userId=1 | IP: 127.0.0.1
- 15:17:16.288 DEBUG [9F5pxKKv] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.288 DEBUG [9F5pxKKv] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.292 DEBUG [9F5pxKKv] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.294 DEBUG [9F5pxKKv] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?) ORDER BY create_time DESC
- 15:17:16.295 DEBUG [9F5pxKKv] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
- 15:17:16.297 DEBUG [9F5pxKKv] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:17:16.299 DEBUG [9F5pxKKv] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards?userId=1 200 13ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/rewards
- Parameters = {userId=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#listInviteRewards(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"9F5pxKKv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636298}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.307 DEBUG [hngD3H9Z] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards | IP: 127.0.0.1
- 15:17:16.310 DEBUG [hngD3H9Z] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.310 DEBUG [hngD3H9Z] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.312 DEBUG [hngD3H9Z] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.316 DEBUG [hngD3H9Z] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/rewards
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#listInviteRewards(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"hngD3H9Z", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976636313}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.321 DEBUG [LdgkvbTT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards | IP: 127.0.0.1
- 15:17:16.325 WARN [LdgkvbTT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards 401 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/rewards
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"LdgkvbTT", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976636323}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.332 DEBUG [bc33J4JU] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
- 15:17:16.334 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.334 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.336 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.338 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.338 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.340 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.340 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:16.340 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:16.343 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:16.343 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:16.343 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:16.345 DEBUG [bc33J4JU] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:16.346 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as today_usage FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE() GROUP BY platform
- 15:17:16.346 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Parameters: 1(Long)
- 15:17:16.348 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTodayUsageByPlatform : <== Total: 0
- 15:17:16.349 DEBUG [bc33J4JU] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as monthly_usage FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE()) GROUP BY platform
- 15:17:16.349 DEBUG [bc33J4JU] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Parameters: 1(Long)
- 15:17:16.351 DEBUG [bc33J4JU] [1] [ main] .m.C.sumMonthlyUsageByPlatform : <== Total: 0
- 15:17:16.352 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as total_usage FROM t_crawler_usage_log WHERE user_id = ? GROUP BY platform
- 15:17:16.352 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Parameters: 1(Long)
- 15:17:16.354 DEBUG [bc33J4JU] [1] [ main] .u.m.C.sumTotalUsageByPlatform : <== Total: 0
- 15:17:16.357 DEBUG [bc33J4JU] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 200 25ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/crawler/user-detail
- Parameters = {userId=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"bc33J4JU", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"nickname":"测试用户","phone":"138****8000","todayTotalUsage":0,"monthlyTotalUsage":0,"platformStats":[]},"timestamp":1782976636355}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.365 DEBUG [B6Zfqyac] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
- 15:17:16.367 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.368 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.369 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.371 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.371 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.373 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.374 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:16.374 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:16.375 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:16.376 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:16.376 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:16.377 DEBUG [B6Zfqyac] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:16.378 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as today_usage FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE() GROUP BY platform
- 15:17:16.378 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Parameters: 1(Long)
- 15:17:16.379 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTodayUsageByPlatform : <== Total: 0
- 15:17:16.380 DEBUG [B6Zfqyac] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as monthly_usage FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE()) GROUP BY platform
- 15:17:16.381 DEBUG [B6Zfqyac] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Parameters: 1(Long)
- 15:17:16.382 DEBUG [B6Zfqyac] [1] [ main] .m.C.sumMonthlyUsageByPlatform : <== Total: 0
- 15:17:16.383 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as total_usage FROM t_crawler_usage_log WHERE user_id = ? GROUP BY platform
- 15:17:16.383 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Parameters: 1(Long)
- 15:17:16.384 DEBUG [B6Zfqyac] [1] [ main] .u.m.C.sumTotalUsageByPlatform : <== Total: 0
- 15:17:16.386 DEBUG [B6Zfqyac] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 200 21ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/crawler/user-detail
- Parameters = {userId=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"B6Zfqyac", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"nickname":"测试用户","phone":"138****8000","todayTotalUsage":0,"monthlyTotalUsage":0,"platformStats":[]},"timestamp":1782976636385}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.394 DEBUG [8LyLGwu9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
- 15:17:16.396 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.396 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.398 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.399 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.400 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.401 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.402 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:16.402 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:16.403 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:16.403 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:16.403 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:16.404 DEBUG [8LyLGwu9] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:16.405 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as today_usage FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE() GROUP BY platform
- 15:17:16.405 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTodayUsageByPlatform : ==> Parameters: 1(Long)
- 15:17:16.406 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTodayUsageByPlatform : <== Total: 0
- 15:17:16.406 DEBUG [8LyLGwu9] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as monthly_usage FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE()) GROUP BY platform
- 15:17:16.407 DEBUG [8LyLGwu9] [1] [ main] .m.C.sumMonthlyUsageByPlatform : ==> Parameters: 1(Long)
- 15:17:16.407 DEBUG [8LyLGwu9] [1] [ main] .m.C.sumMonthlyUsageByPlatform : <== Total: 0
- 15:17:16.407 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Preparing: SELECT platform, COALESCE(SUM(usage_count), 0) as total_usage FROM t_crawler_usage_log WHERE user_id = ? GROUP BY platform
- 15:17:16.408 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTotalUsageByPlatform : ==> Parameters: 1(Long)
- 15:17:16.409 DEBUG [8LyLGwu9] [1] [ main] .u.m.C.sumTotalUsageByPlatform : <== Total: 0
- 15:17:16.410 DEBUG [8LyLGwu9] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 200 16ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/crawler/user-detail
- Parameters = {userId=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"8LyLGwu9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"nickname":"测试用户","phone":"138****8000","todayTotalUsage":0,"monthlyTotalUsage":0,"platformStats":[]},"timestamp":1782976636409}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.414 DEBUG [2MWUw8mC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 | IP: 127.0.0.1
- 15:17:16.417 WARN [2MWUw8mC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=1 401 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/crawler/user-detail
- Parameters = {userId=[1]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"2MWUw8mC", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976636415}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.424 DEBUG [YmJkmgxx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=999 | IP: 127.0.0.1
- 15:17:16.426 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.427 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.429 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.430 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.431 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 999(Long)
- 15:17:16.433 DEBUG [YmJkmgxx] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 0
- 15:17:16.434 WARN [YmJkmgxx] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1001, message=用户不存在
- 15:17:16.435 DEBUG [YmJkmgxx] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/user-detail?userId=999 200 11ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/crawler/user-detail
- Parameters = {userId=[999]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getCrawlerUserDetail(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"YmJkmgxx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":1001,"message":"用户不存在","data":null,"timestamp":1782976636434}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.442 DEBUG [GhzxNaDh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
- 15:17:16.444 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.444 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.446 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.450 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:17:16.450 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:16.449071500(LocalDateTime)
- 15:17:16.452 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:17:16.453 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:16.453 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:16.455 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : <== Total: 2
- 15:17:16.457 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
- 15:17:16.457 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: ZXHS9WYB(String)
- 15:17:16.459 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:17:16.460 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:16.460 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.insert : ==> Parameters: 1(Long), ZXHS9WYB(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:17:16.455971100(LocalDateTime), 1(Integer), 2026-07-02T15:17:16.460059700(LocalDateTime), 2026-07-02T15:17:16.460059700(LocalDateTime)
- 15:17:16.464 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.insert : <== Updates: 1
- 15:17:16.465 INFO [GhzxNaDh] [1] [ main] c.x.i.service.InviteService : 用户 1 创建邀请码: ZXHS9WYB
- 15:17:16.465 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:16.465 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:16.467 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : <== Total: 2
- 15:17:16.467 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.467 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.470 DEBUG [GhzxNaDh] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.477 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND code = ?)
- 15:17:16.478 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), ZXHS9WYB(String)
- 15:17:16.479 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:16.480 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
- 15:17:16.480 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
- 15:17:16.481 DEBUG [GhzxNaDh] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:17:16.487 DEBUG [GhzxNaDh] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 200 45ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/conversion-stats
- Parameters = {userId=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getInviteConversionStats(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"GhzxNaDh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"inviteCode":"ZXHS9WYB","clickedCount":0,"totalInvited":0,"registeredCount":0,"pendingCount":0,"conversionRate":0.0,"totalReward":0},"timestamp":1782976636483}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.496 DEBUG [8wtcvYkL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
- 15:17:16.498 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.498 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.499 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.502 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:17:16.502 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:16.501339600(LocalDateTime)
- 15:17:16.504 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:16.505 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:16.505 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:16.508 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : <== Total: 2
- 15:17:16.508 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.508 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.511 DEBUG [8wtcvYkL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.512 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND code = ?)
- 15:17:16.512 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), ZXHS9WYB(String)
- 15:17:16.513 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:16.515 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
- 15:17:16.515 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
- 15:17:16.516 DEBUG [8wtcvYkL] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:17:16.518 DEBUG [8wtcvYkL] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 200 22ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/conversion-stats
- Parameters = {userId=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getInviteConversionStats(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"8wtcvYkL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"inviteCode":"ZXHS9WYB","clickedCount":0,"totalInvited":0,"registeredCount":0,"pendingCount":0,"conversionRate":0.0,"totalReward":0},"timestamp":1782976636517}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.527 DEBUG [zt4ALaK7] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
- 15:17:16.529 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.529 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.531 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.533 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:17:16.533 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:16.532948600(LocalDateTime)
- 15:17:16.535 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:16.536 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:16.536 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:16.539 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : <== Total: 2
- 15:17:16.540 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:16.540 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:16.542 DEBUG [zt4ALaK7] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:16.543 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND code = ?)
- 15:17:16.543 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), ZXHS9WYB(String)
- 15:17:16.545 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:16.545 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
- 15:17:16.545 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
- 15:17:16.547 DEBUG [zt4ALaK7] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:17:16.548 DEBUG [zt4ALaK7] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 200 21ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/conversion-stats
- Parameters = {userId=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzYsImV4cCI6MTc4MzA2MzAzNn0.PyLRkjMfqC7zCGGXa5L7runHXgj33pgXuiIu9u6v1zj3d6MMdbAfSWv3d6w1b_SwFrjxWaXIanXWUlEyoMUywQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.AdminController
- Method = com.xuekairui.invite.controller.AdminController#getInviteConversionStats(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"zt4ALaK7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"inviteCode":"ZXHS9WYB","clickedCount":0,"totalInvited":0,"registeredCount":0,"pendingCount":0,"conversionRate":0.0,"totalReward":0},"timestamp":1782976636547}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:16.553 DEBUG [gedevtrF] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 | IP: 127.0.0.1
- 15:17:16.554 WARN [gedevtrF] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/conversion-stats?userId=1 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/conversion-stats
- Parameters = {userId=[1]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"gedevtrF", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976636554}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 32, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 14.50 s -- in 运营管理接口测试
- [INFO] Running 营业执照审核管理接口测试
- 15:17:16.564 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.AdminLicenseTest]: AdminLicenseTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:16.566 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.AdminLicenseTest
- 15:17:19.688 DEBUG [W3QF8V8z] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
- 15:17:19.689 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.690 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.692 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.697 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
- 15:17:19.697 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
- 15:17:19.700 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 0
- 15:17:19.702 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.insert : ==> Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:19.703 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.insert : ==> Parameters: 1(Long), https://oss.example.com/license/review-test.jpg(String), 91110000MA12345678(String), 审核测试大药房(String), 李四(String), PENDING(String), false(Boolean), 2026-07-02T15:17:19.702277400(LocalDateTime), 2026-07-02T15:17:19.702277400(LocalDateTime)
- 15:17:19.708 DEBUG [W3QF8V8z] [1] [ main] c.x.u.m.B.insert : <== Updates: 1
- 15:17:19.709 DEBUG [W3QF8V8z] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 200 21ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/business-license/upload
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"191"]
- Body = {
- "licenseImageUrl": "https://oss.example.com/license/review-test.jpg",
- "creditCode": "91110000MA12345678",
- "pharmacyName": "审核测试大药房",
- "legalPerson": "李四"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.BusinessLicenseController
- Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"W3QF8V8z", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639708}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.716 DEBUG [eteEALJE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review | IP: 127.0.0.1
- 15:17:19.717 DEBUG [eteEALJE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.717 DEBUG [eteEALJE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.720 DEBUG [eteEALJE] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.722 DEBUG [eteEALJE] [1] [ main] c.x.u.m.B.selectList : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
- 15:17:19.722 DEBUG [eteEALJE] [1] [ main] c.x.u.m.B.selectList : ==> Parameters: PENDING(String)
- 15:17:19.724 DEBUG [eteEALJE] [1] [ main] c.x.u.m.B.selectList : <== Total: 1
- 15:17:19.727 DEBUG [eteEALJE] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review 200 11ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminLicenseController
- Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"eteEALJE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/review-test.jpg","creditCode":"91110000MA12345678","pharmacyName":"审核测试大药房","legalPerson":"李四","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:20","updateTime":"2026-07-02 15:17:20"}],"timestamp":1782976639725}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.732 DEBUG [Cd5cRJYk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=PENDING | IP: 127.0.0.1
- 15:17:19.735 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.735 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.737 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.738 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.B.selectList : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
- 15:17:19.738 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.B.selectList : ==> Parameters: PENDING(String)
- 15:17:19.740 DEBUG [Cd5cRJYk] [1] [ main] c.x.u.m.B.selectList : <== Total: 1
- 15:17:19.741 DEBUG [Cd5cRJYk] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=PENDING 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/license/review
- Parameters = {reviewStatus=[PENDING]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminLicenseController
- Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Cd5cRJYk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/review-test.jpg","creditCode":"91110000MA12345678","pharmacyName":"审核测试大药房","legalPerson":"李四","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:20","updateTime":"2026-07-02 15:17:20"}],"timestamp":1782976639740}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.749 DEBUG [UDpvyY8r] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=APPROVED | IP: 127.0.0.1
- 15:17:19.750 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.750 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.752 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.754 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.B.selectList : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
- 15:17:19.754 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.B.selectList : ==> Parameters: APPROVED(String)
- 15:17:19.757 DEBUG [UDpvyY8r] [1] [ main] c.x.u.m.B.selectList : <== Total: 0
- 15:17:19.758 DEBUG [UDpvyY8r] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=APPROVED 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/license/review
- Parameters = {reviewStatus=[APPROVED]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminLicenseController
- Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"UDpvyY8r", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976639757}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.765 DEBUG [A8rHA8Lp] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=REJECTED | IP: 127.0.0.1
- 15:17:19.767 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.767 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.769 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.771 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.B.selectList : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE (review_status = ?) ORDER BY create_time DESC
- 15:17:19.771 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.B.selectList : ==> Parameters: REJECTED(String)
- 15:17:19.773 DEBUG [A8rHA8Lp] [1] [ main] c.x.u.m.B.selectList : <== Total: 0
- 15:17:19.774 DEBUG [A8rHA8Lp] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=REJECTED 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/license/review
- Parameters = {reviewStatus=[REJECTED]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminLicenseController
- Method = com.xuekairui.user.controller.AdminLicenseController#listPendingReviews(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"A8rHA8Lp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976639773}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.778 DEBUG [hRGUqmGh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review | IP: 127.0.0.1
- 15:17:19.780 WARN [hRGUqmGh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"hRGUqmGh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976639779}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.787 DEBUG [zntcy4CM] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
- 15:17:19.789 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.790 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.792 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.796 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectById : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
- 15:17:19.797 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectById : ==> Parameters: 1(Long)
- 15:17:19.799 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectById : <== Total: 1
- 15:17:19.801 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_business_license WHERE (user_id = ? AND review_status = ? AND id <> ?)
- 15:17:19.801 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectCount : ==> Parameters: 1(Long), APPROVED(String), 1(Long)
- 15:17:19.803 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.selectCount : <== Total: 1
- 15:17:19.805 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.805 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.808 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.809 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:19.809 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:19.811 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:19.812 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
- 15:17:19.812 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
- 15:17:19.815 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:19.816 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:19.816 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580362733559809(Long), 1(Long), PRO(String), LICENSE(String), 2026-07-02T15:17:19.815124(LocalDateTime), 2026-08-01T15:17:19.815124(LocalDateTime), 1(Integer), 营业执照审核通过赠送30天高级会员(String), 2026-07-02T15:17:19.816202700(LocalDateTime), 2026-07-02T15:17:19.816202700(LocalDateTime)
- 15:17:19.819 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.U.insert : <== Updates: 1
- 15:17:19.822 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:17:19.822 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:19.815124(LocalDateTime), 0(Long), 2026-07-02T15:17:19(LocalDateTime), 2026-07-02T15:17:19(LocalDateTime), 1(Long)
- 15:17:19.825 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:17:19.830 INFO [zntcy4CM] [1] [ main] c.x.u.c.AdminLicenseController : 营业执照审核通过,赠送用户1 30天高级会员
- 15:17:19.831 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.updateById : ==> Preparing: UPDATE t_business_license SET user_id=?, license_image_url=?, credit_code=?, pharmacy_name=?, legal_person=?, review_status=?, reviewer_id=?, review_time=?, show_verified_badge=?, create_time=?, update_time=? WHERE id=?
- 15:17:19.831 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.updateById : ==> Parameters: 1(Long), https://oss.example.com/license/review-test.jpg(String), 91110000MA12345678(String), 审核测试大药房(String), 李四(String), APPROVED(String), 1(Long), 2026-07-02T15:17:19.830129500(LocalDateTime), true(Boolean), 2026-07-02T15:17:20(LocalDateTime), 2026-07-02T15:17:20(LocalDateTime), 1(Long)
- 15:17:19.837 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.B.updateById : <== Updates: 1
- 15:17:19.837 INFO [zntcy4CM] [1] [ main] c.x.u.c.AdminLicenseController : 营业执照审核完成: licenseId=1, action=APPROVED, reviewerId=1
- 15:17:19.839 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:19.840 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580362800668673(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:19.837659700(LocalDateTime), LICENSE(String), APPROVE(String), 审核营业执照(通过)(String), LICENSE(String), 1(Long), LICENSE:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:19.839290300(LocalDateTime)
- 15:17:19.845 DEBUG [zntcy4CM] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:19.845 WARN [zntcy4CM] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】审核营业执照(通过) - 操作人: 管理员(1), 目标: LICENSE:1, 结果: SUCCESS
- 15:17:19.845 DEBUG [zntcy4CM] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 审核营业执照(通过)
- 15:17:19.847 DEBUG [zntcy4CM] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 200 60ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"49"]
- Body = {
- "licenseId": 1,
- "action": "APPROVED"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminLicenseController
- Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"zntcy4CM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639846}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.853 DEBUG [HP6CLQJy] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
- 15:17:19.853 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.855 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.857 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.859 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.B.selectById : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
- 15:17:19.859 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.B.selectById : ==> Parameters: 1(Long)
- 15:17:19.861 DEBUG [HP6CLQJy] [1] [ main] c.x.u.m.B.selectById : <== Total: 1
- 15:17:19.862 DEBUG [HP6CLQJy] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 200 9ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"49"]
- Body = {
- "licenseId": 1,
- "action": "APPROVED"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminLicenseController
- Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"HP6CLQJy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"该营业执照已审核,无法重复操作","data":null,"timestamp":1782976639861}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.869 DEBUG [a9cBADze] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
- 15:17:19.870 DEBUG [a9cBADze] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.870 DEBUG [a9cBADze] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.872 DEBUG [a9cBADze] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.874 DEBUG [a9cBADze] [1] [ main] c.x.u.m.B.selectById : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
- 15:17:19.874 DEBUG [a9cBADze] [1] [ main] c.x.u.m.B.selectById : ==> Parameters: 9999(Long)
- 15:17:19.876 DEBUG [a9cBADze] [1] [ main] c.x.u.m.B.selectById : <== Total: 0
- 15:17:19.877 DEBUG [a9cBADze] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 200 8ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"52"]
- Body = {
- "licenseId": 9999,
- "action": "APPROVED"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminLicenseController
- Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"a9cBADze", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":404,"message":"营业执照记录不存在","data":null,"timestamp":1782976639876}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.884 DEBUG [zaeSjGPj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
- 15:17:19.885 DEBUG [zaeSjGPj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.885 DEBUG [zaeSjGPj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.888 DEBUG [zaeSjGPj] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.894 WARN [zaeSjGPj] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 审核动作不能为空
- 15:17:19.898 WARN [zaeSjGPj] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 400 14ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"23"]
- Body = {
- "licenseId": 1
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminLicenseController
- Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"zaeSjGPj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"审核动作不能为空","data":null,"timestamp":1782976639894}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.906 DEBUG [AehShErK] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
- 15:17:19.908 DEBUG [AehShErK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.909 DEBUG [AehShErK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.910 DEBUG [AehShErK] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.912 WARN [AehShErK] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 营业执照ID不能为空
- 15:17:19.913 WARN [AehShErK] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 400 7ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"29"]
- Body = {
- "action": "APPROVED"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminLicenseController
- Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"AehShErK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"营业执照ID不能为空","data":null,"timestamp":1782976639912}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.920 DEBUG [JZz75DCC] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
- 15:17:19.921 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.921 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.924 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.926 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.B.selectById : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
- 15:17:19.926 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.B.selectById : ==> Parameters: 1(Long)
- 15:17:19.928 DEBUG [JZz75DCC] [1] [ main] c.x.u.m.B.selectById : <== Total: 1
- 15:17:19.929 DEBUG [JZz75DCC] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 200 9ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"55"]
- Body = {
- "licenseId": 1,
- "action": "INVALID_ACTION"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminLicenseController
- Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"JZz75DCC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"该营业执照已审核,无法重复操作","data":null,"timestamp":1782976639928}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.936 DEBUG [xgZwQxRs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
- 15:17:19.938 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.938 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:19.941 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.942 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
- 15:17:19.942 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 2(Long)
- 15:17:19.944 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.selectByUserId : <== Total: 0
- 15:17:19.945 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.insert : ==> Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:19.945 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.insert : ==> Parameters: 2(Long), https://oss.example.com/license/reject-test.jpg(String), 91110000MA87654321(String), 拒绝测试药房(String), 王五(String), PENDING(String), false(Boolean), 2026-07-02T15:17:19.945305500(LocalDateTime), 2026-07-02T15:17:19.945305500(LocalDateTime)
- 15:17:19.950 DEBUG [xgZwQxRs] [2] [ main] c.x.u.m.B.insert : <== Updates: 1
- 15:17:19.952 DEBUG [xgZwQxRs] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 200 16ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/business-license/upload
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.wASNXjbYJawq1JLMKuHV07q7BI5ujDRaggX0qeCVnhjkotwlk8pR4Jhf-HIc1V7rE9fJiGUewBiqMb9qCj-80w", Content-Length:"188"]
- Body = {
- "licenseImageUrl": "https://oss.example.com/license/reject-test.jpg",
- "creditCode": "91110000MA87654321",
- "pharmacyName": "拒绝测试药房",
- "legalPerson": "王五"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.BusinessLicenseController
- Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"xgZwQxRs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639951}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.955 DEBUG [VP8B3MU8] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
- 15:17:19.956 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:19.957 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:19.958 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:19.960 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.selectById : ==> Preparing: SELECT id,user_id,license_image_url,credit_code,pharmacy_name,legal_person,registered_address,business_scope,valid_from,valid_to,review_status,reviewer_id,review_time,reject_reason,show_verified_badge,remark,create_time,update_time FROM t_business_license WHERE id=?
- 15:17:19.960 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.selectById : ==> Parameters: 2(Long)
- 15:17:19.962 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.selectById : <== Total: 1
- 15:17:19.963 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.updateById : ==> Preparing: UPDATE t_business_license SET user_id=?, license_image_url=?, credit_code=?, pharmacy_name=?, legal_person=?, review_status=?, reviewer_id=?, review_time=?, reject_reason=?, show_verified_badge=?, create_time=?, update_time=? WHERE id=?
- 15:17:19.963 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.updateById : ==> Parameters: 2(Long), https://oss.example.com/license/reject-test.jpg(String), 91110000MA87654321(String), 拒绝测试药房(String), 王五(String), REJECTED(String), 1(Long), 2026-07-02T15:17:19.962838300(LocalDateTime), 营业执照图片不清晰,请重新上传(String), false(Boolean), 2026-07-02T15:17:20(LocalDateTime), 2026-07-02T15:17:20(LocalDateTime), 2(Long)
- 15:17:19.969 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.B.updateById : <== Updates: 1
- 15:17:19.969 INFO [VP8B3MU8] [1] [ main] c.x.u.c.AdminLicenseController : 营业执照审核完成: licenseId=2, action=REJECTED, reviewerId=1
- 15:17:19.969 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:19.970 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580363375288321(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:17:19.969695100(LocalDateTime), LICENSE(String), REJECT(String), 审核营业执照(驳回)(String), LICENSE(String), 2(Long), LICENSE:2(String), SUCCESS(String), true(Boolean), 2026-07-02T15:17:19.969695100(LocalDateTime)
- 15:17:19.975 DEBUG [VP8B3MU8] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:19.975 WARN [VP8B3MU8] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】审核营业执照(驳回) - 操作人: 管理员(1), 目标: LICENSE:2, 结果: SUCCESS
- 15:17:19.975 DEBUG [VP8B3MU8] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 审核营业执照(驳回)
- 15:17:19.976 DEBUG [VP8B3MU8] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 200 21ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2MzksImV4cCI6MTc4MzA2MzAzOX0.zWxGVbkw0NzIiqacIvylto6iHi8slv3xmWSguGKV_57aLjc6WrqCykLa4WTwfR-1GJbmsgGtZXdIqT9Xyc8OBQ", Content-Length:"118"]
- Body = {
- "licenseId": 2,
- "action": "REJECTED",
- "rejectReason": "营业执照图片不清晰,请重新上传"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminLicenseController
- Method = com.xuekairui.user.controller.AdminLicenseController#reviewLicense(ReviewRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"VP8B3MU8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976639975}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:19.980 DEBUG [k4AmgMGh] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
- 15:17:19.984 WARN [k4AmgMGh] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 401 4ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"35"]
- Body = {"licenseId":1,"action":"APPROVED"}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"k4AmgMGh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976639981}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.423 s -- in 营业执照审核管理接口测试
- [INFO] Running 认证接口测试
- 15:17:19.988 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.AuthControllerTest]: AuthControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:19.991 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.AuthControllerTest
- 15:17:23.183 DEBUG [pGPbQ8bg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:17:23.200 WARN [pGPbQ8bg] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号格式不正确
- 15:17:23.202 WARN [pGPbQ8bg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 19ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"31"]
- Body = {"phone":"123","scene":"login"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"pGPbQ8bg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"手机号格式不正确","data":null,"timestamp":1782976643200}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:23.207 DEBUG [Vxj6UchZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:17:23.212 WARN [Vxj6UchZ] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 场景参数不正确
- 15:17:23.215 WARN [Vxj6UchZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 8ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"41"]
- Body = {"phone":"13800138000","scene":"invalid"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"Vxj6UchZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"场景参数不正确","data":null,"timestamp":1782976643212}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:23.227 DEBUG [kg6SHZMx] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:17:23.231 WARN [kg6SHZMx] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号不能为空, 场景不能为空
- 15:17:23.233 WARN [kg6SHZMx] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 6ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"kg6SHZMx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"手机号不能为空, 场景不能为空","data":null,"timestamp":1782976643231}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:23.242 DEBUG [3kRA9yWY] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:17:23.245 WARN [3kRA9yWY] [] [ main] c.x.h.GlobalExceptionHandler : 请求体解析失败: JSON parse error: Unexpected character ('i' (code 105)): was expecting double-quote to start field name
- 15:17:23.246 WARN [3kRA9yWY] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 4ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"14"]
- Body = {invalid json}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.http.converter.HttpMessageNotReadableException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"3kRA9yWY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"请求体格式错误","data":null,"timestamp":1782976643245}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:23.252 DEBUG [zbZL4Mhm] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:17:23.254 WARN [zbZL4Mhm] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号不能为空, 手机号格式不正确
- 15:17:23.255 WARN [zbZL4Mhm] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 3ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
- Body = {"phone":"","scene":"login"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"zbZL4Mhm", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"手机号不能为空, 手机号格式不正确","data":null,"timestamp":1782976643254}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:23.261 DEBUG [9cuUq8xa] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:17:23.262 INFO [9cuUq8xa] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
- 15:17:24.390 INFO [9cuUq8xa] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
- 15:17:24.392 WARN [9cuUq8xa] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 200 1131ms SLOW
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","scene":"login"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"9cuUq8xa", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976644390}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.403 DEBUG [Jb2pUWbJ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:17:24.414 WARN [Jb2pUWbJ] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 验证码必须为6位数字
- 15:17:24.417 WARN [Jb2pUWbJ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 400 14ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/smsc/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"36"]
- Body = {"phone":"13800138000","code":"123"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"Jb2pUWbJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"验证码必须为6位数字","data":null,"timestamp":1782976644415}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.428 DEBUG [RKzNsXPz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:17:24.490 WARN [RKzNsXPz] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1102, message=验证码错误或已过期
- 15:17:24.492 DEBUG [RKzNsXPz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 64ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"000000"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"RKzNsXPz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":1102,"message":"验证码错误或已过期","data":null,"timestamp":1782976644490}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.500 DEBUG [nHJNesYZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:17:24.503 WARN [nHJNesYZ] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号不能为空, 验证码不能为空
- 15:17:24.504 WARN [nHJNesYZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 400 4ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"nHJNesYZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"手机号不能为空, 验证码不能为空","data":null,"timestamp":1782976644503}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.509 DEBUG [tbeAphLL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:17:24.512 WARN [tbeAphLL] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号格式不正确
- 15:17:24.513 WARN [tbeAphLL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 400 4ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"31"]
- Body = {"phone":"123","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"tbeAphLL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"手机号格式不正确","data":null,"timestamp":1782976644512}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.520 DEBUG [cT4g62cq] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:17:24.534 WARN [cT4g62cq] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1102, message=验证码错误或已过期
- 15:17:24.535 DEBUG [cT4g62cq] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 15ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"61"]
- Body = {"phone":"13800138000","code":"000000","inviteCode":"ABC123"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"cT4g62cq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":1102,"message":"验证码错误或已过期","data":null,"timestamp":1782976644534}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.543 DEBUG [GZv2XxD5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url | IP: 127.0.0.1
- 15:17:24.546 DEBUG [GZv2XxD5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url 200 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/wechat/url
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"GZv2XxD5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=login#wechat_redirect","timestamp":1782976644545}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.556 DEBUG [SqPJdmV7] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url?state=custom_state | IP: 127.0.0.1
- 15:17:24.560 DEBUG [SqPJdmV7] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url?state=custom_state 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/wechat/url
- Parameters = {state=[custom_state]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"SqPJdmV7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=custom_state#wechat_redirect","timestamp":1782976644559}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.569 DEBUG [WHJCCZEV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/callback | IP: 127.0.0.1
- 15:17:24.574 DEBUG [WHJCCZEV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/callback 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/wechat/callback
- Parameters = {code=[test_code], state=[login]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#wechatCallback(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"WHJCCZEV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":"https://your-domain.com/wechat-login?code=test_code","timestamp":1782976644572}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.581 DEBUG [wRWSAc4N] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/wechat/login | IP: 127.0.0.1
- 15:17:24.588 WARN [wRWSAc4N] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 授权码不能为空
- 15:17:24.589 WARN [wRWSAc4N] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/wechat/login 400 9ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/wechat/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#wechatLogin(WechatLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"wRWSAc4N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"授权码不能为空","data":null,"timestamp":1782976644588}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.595 DEBUG [PKPEjKFs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/wechat/bind | IP: 127.0.0.1
- 15:17:24.603 WARN [PKPEjKFs] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 验证码不能为空, 手机号不能为空, 临时令牌不能为空
- 15:17:24.605 WARN [PKPEjKFs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/wechat/bind 400 10ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/wechat/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#wechatBind(WechatBindRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"PKPEjKFs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"验证码不能为空, 手机号不能为空, 临时令牌不能为空","data":null,"timestamp":1782976644603}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.619 DEBUG [Z3awMk9N] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
- 15:17:24.620 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:24.620 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:24.624 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:24.626 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:24.626 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:24.629 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:24.631 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:24.631 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:24.635 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:24.636 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:24.636 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:24.640 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:24.644 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:24.645 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:24.649 DEBUG [Z3awMk9N] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:24.658 DEBUG [Z3awMk9N] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 200 39ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDQsImV4cCI6MTc4MzA2MzA0NH0.wiVzmckqvuV9e3DWmdEK5mofBpDHjYbGyFsFAdByiL3_WYqvIBowpWsFKCifPj63_hI0oNkO-qNhKSXmaLTIuQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Z3awMk9N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:22","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"timestamp":1782976644651}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.664 DEBUG [88xsVdaF] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
- 15:17:24.667 WARN [88xsVdaF] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"88xsVdaF", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976644665}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.674 DEBUG [kK7ZX6Bz] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
- 15:17:24.698 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:24.699 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:24.710 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:24.711 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:24.712 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:24.714 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:24.714 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:24.715 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:24.717 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:24.718 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:24.718 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:24.720 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:24.721 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:24.721 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:24.724 DEBUG [kK7ZX6Bz] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:24.726 DEBUG [kK7ZX6Bz] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 200 52ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJwaG9uZSI6IjEzODAwMTM4MDAwIiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4MjgwMzg0NCwiZXhwIjoxNzgyODkwMjQ0fQ.VTKAD6i2z7RYXEF7pNHYnoE_U1fmxYRtBRgI3KZi4oyL3KERN9Z1uCNsc_jbLrtyJNguyQAp302P8DNEi1MlWQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"kK7ZX6Bz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:22","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"timestamp":1782976644725}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJwaG9uZSI6IjEzODAwMTM4MDAwIiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4MjgwMzg0NCwiZXhwIjoxNzgyODkwMjQ0fQ.VTKAD6i2z7RYXEF7pNHYnoE_U1fmxYRtBRgI3KZi4oyL3KERN9Z1uCNsc_jbLrtyJNguyQAp302P8DNEi1MlWQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"kK7ZX6Bz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:22","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"timestamp":1782976644725}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.746 DEBUG [JVvGBn4s] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
- 15:17:24.749 WARN [JVvGBn4s] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 3
- 15:17:24.750 WARN [JVvGBn4s] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 3
- 15:17:24.750 WARN [JVvGBn4s] [] [ main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
- 15:17:24.753 WARN [JVvGBn4s] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = [Authorization:"Bearer not.a.valid.jwt"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"JVvGBn4s", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976644751}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.763 DEBUG [4MxmwV4S] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
- 15:17:24.766 WARN [4MxmwV4S] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = [Authorization:"Bearer "]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"4MxmwV4S", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976644764}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.782 DEBUG [Wq4gpETA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
- 15:17:24.785 WARN [Wq4gpETA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = [Authorization:"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDQsImV4cCI6MTc4MzA2MzA0NH0.wiVzmckqvuV9e3DWmdEK5mofBpDHjYbGyFsFAdByiL3_WYqvIBowpWsFKCifPj63_hI0oNkO-qNhKSXmaLTIuQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"Wq4gpETA", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976644783}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:24.792 DEBUG [c9t3xmwH] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh | IP: 127.0.0.1
- 15:17:24.801 WARN [c9t3xmwH] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析Token失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 0
- 15:17:24.807 WARN [c9t3xmwH] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1302, message=Token无效
- 15:17:24.809 DEBUG [c9t3xmwH] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh 200 17ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/refresh
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"40"]
- Body = {"refreshToken":"invalid_refresh_token"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"c9t3xmwH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":1302,"message":"Token无效","data":null,"timestamp":1782976644807}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [ERROR] Tests run: 23, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 4.833 s <<< FAILURE! -- in 认证接口测试
- [ERROR] com.xuekairui.gateway.AuthControllerTest.getUserInfo_withExpiredToken_shouldReturn401 -- Time elapsed: 0.064 s <<< FAILURE!
- java.lang.AssertionError: Status expected:<401> but was:<200>
- at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:61)
- at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:128)
- at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:640)
- at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)
- at com.xuekairui.gateway.AuthControllerTest.getUserInfo_withExpiredToken_shouldReturn401(AuthControllerTest.java:222)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- [INFO] Running 营业执照和优惠券模块测试
- 15:17:24.828 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.BusinessLicenseAndCouponTest]: BusinessLicenseAndCouponTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:24.835 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.BusinessLicenseAndCouponTest
- 15:17:29.848 DEBUG [sTjhRXRH] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
- 15:17:29.850 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:29.850 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:29.852 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:29.853 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
- 15:17:29.853 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
- 15:17:29.856 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 0
- 15:17:29.857 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.insert : ==> Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:29.858 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.insert : ==> Parameters: 1(Long), https://oss.example.com/license/test.jpg(String), 91110000XXXXXXXXXX(String), 测试大药房(String), 张三(String), PENDING(String), false(Boolean), 2026-07-02T15:17:29.857501800(LocalDateTime), 2026-07-02T15:17:29.857501800(LocalDateTime)
- 15:17:29.863 DEBUG [sTjhRXRH] [1] [ main] c.x.u.m.B.insert : <== Updates: 1
- 15:17:29.864 DEBUG [sTjhRXRH] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 200 16ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/business-license/upload
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw", Content-Length:"178"]
- Body = {
- "licenseImageUrl": "https://oss.example.com/license/test.jpg",
- "creditCode": "91110000XXXXXXXXXX",
- "pharmacyName": "测试大药房",
- "legalPerson": "张三"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.BusinessLicenseController
- Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"sTjhRXRH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976649863}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:29.872 DEBUG [ZRAFWTWL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
- 15:17:29.874 DEBUG [ZRAFWTWL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:29.874 DEBUG [ZRAFWTWL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:29.876 DEBUG [ZRAFWTWL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:29.879 WARN [ZRAFWTWL] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 统一社会信用代码不能为空, 执照图片URL不能为空
- 15:17:29.880 WARN [ZRAFWTWL] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 400 8ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/business-license/upload
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw", Content-Length:"42"]
- Body = {
- "pharmacyName": "测试大药房"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.BusinessLicenseController
- Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"ZRAFWTWL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"统一社会信用代码不能为空, 执照图片URL不能为空","data":null,"timestamp":1782976649879}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:29.884 DEBUG [Q6mj4CqU] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
- 15:17:29.889 WARN [Q6mj4CqU] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 401 5ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/business-license/upload
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"Q6mj4CqU", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976649887}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:29.905 DEBUG [KEapBTD4] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info | IP: 127.0.0.1
- 15:17:29.907 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:29.908 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:29.912 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:29.915 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
- 15:17:29.915 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
- 15:17:29.920 DEBUG [KEapBTD4] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 1
- 15:17:29.922 DEBUG [KEapBTD4] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info 200 18ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/business-license/info
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.BusinessLicenseController
- Method = com.xuekairui.user.controller.BusinessLicenseController#getInfo(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"KEapBTD4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:30","updateTime":"2026-07-02 15:17:30"},"timestamp":1782976649920}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:29.930 DEBUG [FMDxc9tZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info | IP: 127.0.0.1
- 15:17:29.932 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:29.932 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:29.935 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:29.937 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
- 15:17:29.937 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
- 15:17:29.940 DEBUG [FMDxc9tZ] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 1
- 15:17:29.942 DEBUG [FMDxc9tZ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info 200 12ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/business-license/info
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.BusinessLicenseController
- Method = com.xuekairui.user.controller.BusinessLicenseController#getInfo(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"FMDxc9tZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:30","updateTime":"2026-07-02 15:17:30"},"timestamp":1782976649940}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:29.950 DEBUG [4JkgHQJZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info | IP: 127.0.0.1
- 15:17:29.952 WARN [4JkgHQJZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/business-license/info
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"4JkgHQJZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976649951}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:29.960 DEBUG [9XuL78Cn] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my | IP: 127.0.0.1
- 15:17:29.962 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:29.962 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:29.965 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:29.969 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ?) ORDER BY create_time DESC
- 15:17:29.969 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long)
- 15:17:29.975 DEBUG [9XuL78Cn] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:29.977 DEBUG [9XuL78Cn] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my 200 17ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"9XuL78Cn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976649976}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:29.989 DEBUG [uuyG22fU] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=0 | IP: 127.0.0.1
- 15:17:29.990 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:29.991 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:29.993 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:29.996 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
- 15:17:29.997 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 0(Integer)
- 15:17:29.999 DEBUG [uuyG22fU] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:30.001 DEBUG [uuyG22fU] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=0 200 12ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my
- Parameters = {status=[0]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NDksImV4cCI6MTc4MzA2MzA0OX0.iPifypSIQ9Uekw1TeX6xMcIrXm2bqef0CepcIJTLTOatQaUQKvSHToTcp1ttsI_ZZaBQpyc0zxR0RQcow-wbcw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"uuyG22fU", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650000}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.009 DEBUG [XR48RxdZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=1 | IP: 127.0.0.1
- 15:17:30.011 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:30.011 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:30.014 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:30.016 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
- 15:17:30.016 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
- 15:17:30.018 DEBUG [XR48RxdZ] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:30.019 DEBUG [XR48RxdZ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=1 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my
- Parameters = {status=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"XR48RxdZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650018}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.027 DEBUG [nLChwG2E] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=2 | IP: 127.0.0.1
- 15:17:30.029 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:30.029 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:30.031 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:30.033 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
- 15:17:30.033 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 2(Integer)
- 15:17:30.035 DEBUG [nLChwG2E] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:30.036 DEBUG [nLChwG2E] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=2 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my
- Parameters = {status=[2]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"nLChwG2E", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650035}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.040 DEBUG [5ktJWwfJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my | IP: 127.0.0.1
- 15:17:30.042 WARN [5ktJWwfJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"5ktJWwfJ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976650041}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.049 DEBUG [5NkH2D5s] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available?type=CRAWLER | IP: 127.0.0.1
- 15:17:30.051 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:30.051 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:30.053 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:30.056 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:30.056 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:30.059 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:30.060 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ? AND expire_time > ?) ORDER BY expire_time ASC
- 15:17:30.060 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 0(Integer), 2026-07-02T15:17:30.054906100(LocalDateTime)
- 15:17:30.063 DEBUG [5NkH2D5s] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:30.064 DEBUG [5NkH2D5s] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available?type=CRAWLER 200 15ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my/available
- Parameters = {type=[CRAWLER]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#listAvailableCoupons(HttpServletRequest, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"5NkH2D5s", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976650063}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.069 DEBUG [ZnFSE87G] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available | IP: 127.0.0.1
- 15:17:30.071 WARN [ZnFSE87G] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my/available
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"ZnFSE87G", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976650070}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.077 DEBUG [ehbje4jx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:30.080 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:30.080 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:30.084 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:30.085 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:30.085 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:30.088 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:30.091 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:30.091 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:30.096 DEBUG [ehbje4jx] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:30.101 DEBUG [ehbje4jx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 24ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ehbje4jx", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976650096}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.108 DEBUG [HRCvFUyR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:30.110 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:30.110 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:30.113 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:30.114 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:30.115 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:30.118 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:30.119 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:30.119 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:30.122 DEBUG [HRCvFUyR] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:30.124 DEBUG [HRCvFUyR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 16ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"HRCvFUyR", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976650122}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.133 DEBUG [PwWdrc6S] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/1 | IP: 127.0.0.1
- 15:17:30.135 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:30.135 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:30.138 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:30.141 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:30.141 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:30.144 DEBUG [PwWdrc6S] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:30.145 DEBUG [PwWdrc6S] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/1 200 12ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels/1
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getLevel(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"PwWdrc6S", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},"timestamp":1782976650144}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.155 DEBUG [PjSb93SM] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/999 | IP: 127.0.0.1
- 15:17:30.157 DEBUG [PjSb93SM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:30.158 DEBUG [PjSb93SM] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:30.160 DEBUG [PjSb93SM] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:30.163 WARN [PjSb93SM] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4001, message=用户等级不存在
- 15:17:30.164 DEBUG [PjSb93SM] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/999 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels/999
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getLevel(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"PjSb93SM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":4001,"message":"用户等级不存在","data":null,"timestamp":1782976650163}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.173 DEBUG [NPB2szSe] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:17:30.175 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:30.175 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:30.178 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:30.179 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:30.180 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:30.183 DEBUG [NPB2szSe] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:30.186 DEBUG [NPB2szSe] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 13ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"NPB2szSe", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":1,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976650183}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.190 DEBUG [n8kMYTBt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:17:30.195 WARN [n8kMYTBt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 401 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"n8kMYTBt", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976650193}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.204 DEBUG [z6SD5Ga9] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh | IP: 127.0.0.1
- 15:17:30.206 DEBUG [z6SD5Ga9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:30.206 DEBUG [z6SD5Ga9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:30.208 DEBUG [z6SD5Ga9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:30.211 WARN [z6SD5Ga9] [1] [ main] c.xuekairui.user.util.JwtUtil : JWT解析Token失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 0
- 15:17:30.214 WARN [z6SD5Ga9] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1302, message=Token无效
- 15:17:30.215 DEBUG [z6SD5Ga9] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh 200 11ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/refresh
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTAsImV4cCI6MTc4MzA2MzA1MH0.h1QhIDKSywxpPM3oaHU0CjbgDAHmSXb80uleLWuk_PhBspAe2tPJdK56q9SzauHfcd8WiTcvEvQPpRs8IkVnGw", Content-Length:"37"]
- Body = {"refreshToken":"test_refresh_token"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"z6SD5Ga9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":1302,"message":"Token无效","data":null,"timestamp":1782976650214}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:30.220 DEBUG [xdkrmsmL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh | IP: 127.0.0.1
- 15:17:30.221 WARN [xdkrmsmL] [] [ main] c.x.h.GlobalExceptionHandler : 请求体解析失败: Required request body is missing: public com.xuekairui.common.Result<com.xuekairui.user.dto.LoginResponse> com.xuekairui.user.controller.AuthController.refreshToken(com.xuekairui.user.dto.RefreshTokenRequest)
- 15:17:30.222 WARN [xdkrmsmL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh 400 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/refresh
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8"]
- Body =
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.http.converter.HttpMessageNotReadableException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"xdkrmsmL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"请求体格式错误","data":null,"timestamp":1782976650221}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 21, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.401 s -- in 营业执照和优惠券模块测试
- [INFO] Running 优惠券接口测试
- 15:17:30.228 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.CouponControllerTest]: CouponControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:30.232 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.CouponControllerTest
- 15:17:33.472 DEBUG [6f4j6tKy] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue | IP: 127.0.0.1
- 15:17:33.473 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:33.473 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:33.474 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:33.479 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.C.selectById : ==> Preparing: SELECT id,name,type,value,total_count,issued_count,valid_type,valid_days,valid_start,valid_end,min_level_code,status,description,create_time,update_time FROM t_coupon WHERE id=?
- 15:17:33.480 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.C.selectById : ==> Parameters: 999(Long)
- 15:17:33.481 DEBUG [6f4j6tKy] [1] [ main] c.x.u.m.C.selectById : <== Total: 0
- 15:17:33.484 WARN [6f4j6tKy] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4101, message=优惠券不存在
- 15:17:33.485 DEBUG [6f4j6tKy] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue 200 14ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/coupon/issue
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA", Content-Length:"44"]
- Body = {
- "couponId": 999,
- "userIds": [1]
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#issueCoupon(CouponIssueRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"6f4j6tKy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":4101,"message":"优惠券不存在","data":null,"timestamp":1782976653484}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:33.488 DEBUG [BKfgqGye] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue | IP: 127.0.0.1
- 15:17:33.490 WARN [BKfgqGye] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue 401 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/coupon/issue
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
- Body = {"couponId":1,"userIds":[1]}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"BKfgqGye", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976653489}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:33.495 DEBUG [DqqVmsEU] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my | IP: 127.0.0.1
- 15:17:33.496 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:33.496 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:33.499 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:33.500 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ?) ORDER BY create_time DESC
- 15:17:33.500 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long)
- 15:17:33.502 DEBUG [DqqVmsEU] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:33.503 DEBUG [DqqVmsEU] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"DqqVmsEU", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653502}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:33.509 DEBUG [eBYp2AcF] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=0 | IP: 127.0.0.1
- 15:17:33.510 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:33.510 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:33.512 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:33.513 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
- 15:17:33.513 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 0(Integer)
- 15:17:33.515 DEBUG [eBYp2AcF] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:33.517 DEBUG [eBYp2AcF] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=0 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my
- Parameters = {status=[0]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"eBYp2AcF", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653516}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:33.524 DEBUG [sZPhJCxp] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=1 | IP: 127.0.0.1
- 15:17:33.525 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:33.525 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:33.527 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:33.528 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
- 15:17:33.528 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
- 15:17:33.530 DEBUG [sZPhJCxp] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:33.531 DEBUG [sZPhJCxp] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=1 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my
- Parameters = {status=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"sZPhJCxp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653530}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:33.539 DEBUG [ewhLF74V] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=2 | IP: 127.0.0.1
- 15:17:33.540 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:33.540 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:33.542 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:33.543 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
- 15:17:33.544 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 2(Integer)
- 15:17:33.545 DEBUG [ewhLF74V] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:33.547 DEBUG [ewhLF74V] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my?status=2 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my
- Parameters = {status=[2]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#listMyCoupons(HttpServletRequest, Integer)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ewhLF74V", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653545}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:33.552 DEBUG [eW83GppW] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my | IP: 127.0.0.1
- 15:17:33.554 WARN [eW83GppW] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"eW83GppW", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976653553}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:33.560 DEBUG [v5KvzYpy] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available | IP: 127.0.0.1
- 15:17:33.561 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:33.561 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:33.563 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:33.565 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ? AND expire_time > ?) ORDER BY expire_time ASC
- 15:17:33.565 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 0(Integer), 2026-07-02T15:17:33.564736800(LocalDateTime)
- 15:17:33.567 DEBUG [v5KvzYpy] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:33.568 DEBUG [v5KvzYpy] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my/available
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#listAvailableCoupons(HttpServletRequest, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"v5KvzYpy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653567}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:33.574 DEBUG [VUWXXu3N] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available?type=CRAWLER | IP: 127.0.0.1
- 15:17:33.575 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:33.575 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:33.577 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:33.578 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:33.578 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:33.580 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:33.581 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,coupon_id,status,used_time,expire_time,source,create_time,update_time FROM t_user_coupon WHERE (user_id = ? AND status = ? AND expire_time > ?) ORDER BY expire_time ASC
- 15:17:33.581 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 0(Integer), 2026-07-02T15:17:33.578151100(LocalDateTime)
- 15:17:33.583 DEBUG [VUWXXu3N] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:33.584 DEBUG [VUWXXu3N] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available?type=CRAWLER 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my/available
- Parameters = {type=[CRAWLER]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTMsImV4cCI6MTc4MzA2MzA1M30.5m8yqzZUkuC7c7D7GDLNXNifbNw4VDpKncd0Tnqi9lgjV9TiE8HTyYqppmlsTpq8c_olcCPAwTEXBb_n0Un4VA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CouponController
- Method = com.xuekairui.user.controller.CouponController#listAvailableCoupons(HttpServletRequest, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"VUWXXu3N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976653583}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:33.587 DEBUG [yMRXYfgu] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available | IP: 127.0.0.1
- 15:17:33.589 WARN [yMRXYfgu] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my/available
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"yMRXYfgu", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976653588}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.366 s -- in 优惠券接口测试
- [INFO] Running 爬虫配额接口测试
- 15:17:33.594 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.CrawlerControllerTest]: CrawlerControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:33.596 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.CrawlerControllerTest
- 15:17:37.278 DEBUG [pbyf9MYW] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:37.279 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.279 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.282 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.283 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.283 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.285 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.285 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.285 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:37.288 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.289 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.289 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.291 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.291 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.291 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:37.293 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.293 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.293 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:37.295 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.295 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.295 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:37.297 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.298 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:37.298 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:37.300 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:37.301 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.301 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:37.304 DEBUG [pbyf9MYW] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.305 DEBUG [pbyf9MYW] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:37.305 DEBUG [pbyf9MYW] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:37.307 DEBUG [pbyf9MYW] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:37.311 DEBUG [pbyf9MYW] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 33ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"pbyf9MYW", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657309}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.319 DEBUG [fy5QaPJW] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:37.321 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.321 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.323 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.324 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.324 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.326 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.326 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.326 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:37.328 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.329 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.329 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.330 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.331 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.331 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:37.332 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.333 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.333 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:37.334 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.334 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.334 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:37.336 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.337 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:37.337 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:37.339 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:37.339 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.340 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:37.341 DEBUG [fy5QaPJW] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.342 DEBUG [fy5QaPJW] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:37.342 DEBUG [fy5QaPJW] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:37.344 DEBUG [fy5QaPJW] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:37.345 DEBUG [fy5QaPJW] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 26ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"fy5QaPJW", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657345}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.354 DEBUG [9NtTg9pC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:37.355 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.355 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.357 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.359 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.359 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.361 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.361 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.361 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:37.363 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.364 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.365 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.367 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.368 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.368 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:37.369 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.370 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.370 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:37.372 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.372 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.372 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:37.374 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.376 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:37.376 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:37.377 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:37.378 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.378 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:37.379 DEBUG [9NtTg9pC] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.379 DEBUG [9NtTg9pC] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:37.380 DEBUG [9NtTg9pC] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:37.381 DEBUG [9NtTg9pC] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:37.382 DEBUG [9NtTg9pC] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 28ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"9NtTg9pC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657381}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.391 DEBUG [rJNHGESL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:37.392 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.392 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.395 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.397 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.397 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.398 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.398 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.399 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:37.401 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.401 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.402 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.404 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.404 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.404 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:37.407 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.407 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.407 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:37.409 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.409 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.409 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:37.411 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.412 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:37.412 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:37.414 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:37.414 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.415 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:37.416 DEBUG [rJNHGESL] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.417 DEBUG [rJNHGESL] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:37.417 DEBUG [rJNHGESL] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:37.418 DEBUG [rJNHGESL] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:37.419 DEBUG [rJNHGESL] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 28ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"rJNHGESL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657418}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.426 DEBUG [GB9mtVWR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:37.427 WARN [GB9mtVWR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"GB9mtVWR", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976657427}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.435 DEBUG [BPJBcVxV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:37.436 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.437 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.439 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.440 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.441 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.443 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.443 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.443 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:37.445 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.446 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.446 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.449 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.449 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.449 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:37.451 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.451 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.451 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:37.454 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.454 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.454 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:37.455 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.456 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:37.456 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:37.458 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:37.458 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.458 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:37.460 DEBUG [BPJBcVxV] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.460 DEBUG [BPJBcVxV] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:37.460 DEBUG [BPJBcVxV] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:37.462 DEBUG [BPJBcVxV] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:37.463 DEBUG [BPJBcVxV] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 28ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"BPJBcVxV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976657463}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.473 DEBUG [AMuzzZpH] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.475 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.475 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.477 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.483 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.484 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.486 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.486 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.487 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:37.488 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.489 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.490 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.493 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.493 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.493 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:37.495 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.496 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.496 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:37.498 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.499 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.499 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:37.501 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.501 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.501 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:37.504 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.504 DEBUG [AMuzzZpH] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:37.504 DEBUG [AMuzzZpH] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
- 15:17:37.507 DEBUG [AMuzzZpH] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:37.507 DEBUG [AMuzzZpH] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:37.508 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:37.509 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580436893048834(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:37.508689200(LocalDateTime)
- 15:17:37.513 DEBUG [AMuzzZpH] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:37.519 DEBUG [AMuzzZpH] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 46ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"34"]
- Body = {"count":1,"useCouponFirst":false}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"AMuzzZpH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657518}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.531 DEBUG [PhuWA6H2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.532 DEBUG [PhuWA6H2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.532 DEBUG [PhuWA6H2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.535 DEBUG [PhuWA6H2] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.537 WARN [PhuWA6H2] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 消耗次数至少为1
- 15:17:37.538 WARN [PhuWA6H2] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 400 7ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"11"]
- Body = {"count":0}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"PhuWA6H2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976657537}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.546 DEBUG [us6NqvZa] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.547 DEBUG [us6NqvZa] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.547 DEBUG [us6NqvZa] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.549 DEBUG [us6NqvZa] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.550 WARN [us6NqvZa] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 消耗次数至少为1
- 15:17:37.552 WARN [us6NqvZa] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 400 6ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"12"]
- Body = {"count":-1}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"us6NqvZa", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976657550}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.557 DEBUG [NDzsean2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.563 WARN [NDzsean2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 401 6ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"11"]
- Body = {"count":1}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"NDzsean2", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976657562}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.571 DEBUG [Ne3wWgjd] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.572 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.572 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.574 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.576 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.577 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.579 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.579 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.579 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:37.581 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.582 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.582 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.583 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.584 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.584 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:37.585 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.586 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.586 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:37.587 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.587 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.587 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:37.588 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.588 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.588 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:37.589 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.589 DEBUG [Ne3wWgjd] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:37.590 DEBUG [Ne3wWgjd] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
- 15:17:37.591 DEBUG [Ne3wWgjd] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:37.591 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:37.591 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:37.592 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580437270536194(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:37.591815(LocalDateTime)
- 15:17:37.593 DEBUG [Ne3wWgjd] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:37.598 DEBUG [Ne3wWgjd] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 27ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Ne3wWgjd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657597}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.608 DEBUG [MZTyaA9e] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.609 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.609 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.612 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.614 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.614 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.616 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.616 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.616 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:37.618 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.619 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.619 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.621 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.621 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.621 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:37.622 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.623 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.623 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:37.624 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.625 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.625 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:37.627 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.627 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.627 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:37.628 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.629 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ? AND status = ?)
- 15:17:37.630 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String), 1(Integer)
- 15:17:37.631 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:37.633 DEBUG [MZTyaA9e] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:37.633 DEBUG [MZTyaA9e] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
- 15:17:37.634 DEBUG [MZTyaA9e] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:37.634 DEBUG [MZTyaA9e] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:37.635 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:37.635 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580437463474178(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:37.634586500(LocalDateTime)
- 15:17:37.637 DEBUG [MZTyaA9e] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:37.642 DEBUG [MZTyaA9e] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 34ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"33"]
- Body = {"count":1,"useCouponFirst":true}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"MZTyaA9e", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657641}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.651 DEBUG [ptNcnr3X] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.652 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.652 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.655 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.657 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.657 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:37.658 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.659 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.659 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:37.661 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.662 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.662 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.665 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.665 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.665 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:37.667 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.668 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.668 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:37.670 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.670 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.670 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:37.672 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.673 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.673 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:37.675 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.676 DEBUG [ptNcnr3X] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:37.677 DEBUG [ptNcnr3X] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
- 15:17:37.680 DEBUG [ptNcnr3X] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:37.680 DEBUG [ptNcnr3X] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:37.681 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:37.682 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580437656412161(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), taobao(String), QUOTA(String), 2026-07-02T15:17:37.680703800(LocalDateTime)
- 15:17:37.686 DEBUG [ptNcnr3X] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:37.692 DEBUG [ptNcnr3X] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 41ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.dYR4r6ZiSok4_KHwNoyd7fZEZK7adqkkG9Zo1xBlO7fD-FDpLj4U72y_4GGmjuTnC4rutc9Czf0HXm4trvwnPg", Content-Length:"31"]
- Body = {"count":1,"platform":"taobao"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ptNcnr3X", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657691}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.705 DEBUG [UrHsWQcj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.707 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.708 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:37.711 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.715 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.715 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:37.717 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.717 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.718 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:37.720 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.721 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.721 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.723 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.724 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.724 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:37.727 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.727 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.727 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:37.729 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.730 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.730 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:37.732 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.732 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.732 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:37.735 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.735 DEBUG [UrHsWQcj] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:37.736 DEBUG [UrHsWQcj] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:37.738 DEBUG [UrHsWQcj] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:37.738 DEBUG [UrHsWQcj] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:37.739 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:37.739 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580437912264705(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), jd(String), QUOTA(String), 2026-07-02T15:17:37.739087600(LocalDateTime)
- 15:17:37.743 DEBUG [UrHsWQcj] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:37.751 DEBUG [UrHsWQcj] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 46ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"27"]
- Body = {"count":1,"platform":"jd"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"UrHsWQcj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657750}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.753 DEBUG [qDYxGqKY] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.758 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.758 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:37.761 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.761 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.761 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:37.764 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.765 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.766 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.768 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.769 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.769 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:37.772 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.772 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.772 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:37.774 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.775 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.775 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:37.778 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.778 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.778 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:37.781 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.782 DEBUG [qDYxGqKY] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:37.782 DEBUG [qDYxGqKY] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:37.785 DEBUG [qDYxGqKY] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:37.785 DEBUG [qDYxGqKY] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:37.787 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:37.787 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580438105202690(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), pdd(String), QUOTA(String), 2026-07-02T15:17:37.787346800(LocalDateTime)
- 15:17:37.792 DEBUG [qDYxGqKY] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:37.799 DEBUG [qDYxGqKY] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 46ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"28"]
- Body = {"count":1,"platform":"pdd"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"qDYxGqKY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657799}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.800 DEBUG [BqTC8wBs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.806 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.806 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:37.809 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.809 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.810 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:37.812 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.813 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.813 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.816 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.816 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.816 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:37.818 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.818 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.819 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:37.821 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.821 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.821 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:37.823 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.824 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.824 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:37.826 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.827 DEBUG [BqTC8wBs] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:37.827 DEBUG [BqTC8wBs] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:37.829 DEBUG [BqTC8wBs] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:37.829 DEBUG [BqTC8wBs] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:37.830 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:37.830 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580438298140673(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), douyin(String), QUOTA(String), 2026-07-02T15:17:37.830262700(LocalDateTime)
- 15:17:37.834 DEBUG [BqTC8wBs] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:37.842 DEBUG [BqTC8wBs] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 42ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"31"]
- Body = {"count":1,"platform":"douyin"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"BqTC8wBs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657841}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.843 DEBUG [uYEhnXpk] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.850 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.850 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:37.852 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.853 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.853 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:37.857 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.858 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.858 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.862 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.862 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.862 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:37.865 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.865 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.865 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:37.868 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.868 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.868 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:37.871 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.871 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.871 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:37.874 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.875 DEBUG [uYEhnXpk] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:37.875 DEBUG [uYEhnXpk] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:37.877 DEBUG [uYEhnXpk] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:37.877 DEBUG [uYEhnXpk] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:37.879 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:37.879 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580438491078658(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), kuaishou(String), QUOTA(String), 2026-07-02T15:17:37.879254500(LocalDateTime)
- 15:17:37.884 DEBUG [uYEhnXpk] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:37.892 DEBUG [uYEhnXpk] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 49ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"33"]
- Body = {"count":1,"platform":"kuaishou"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"uYEhnXpk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657891}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.893 DEBUG [GM4JKDZK] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.898 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.898 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:37.901 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.901 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.901 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:37.903 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.904 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.904 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.906 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.907 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.907 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:37.909 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.909 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.910 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:37.911 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.912 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.912 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:37.913 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.913 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.914 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:37.915 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.916 DEBUG [GM4JKDZK] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:37.916 DEBUG [GM4JKDZK] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:37.918 DEBUG [GM4JKDZK] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:37.918 DEBUG [GM4JKDZK] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:37.919 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:37.919 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580438621102081(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), xiaohongshu(String), QUOTA(String), 2026-07-02T15:17:37.919152800(LocalDateTime)
- 15:17:37.923 DEBUG [GM4JKDZK] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:37.930 DEBUG [GM4JKDZK] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 37ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"36"]
- Body = {"count":1,"platform":"xiaohongshu"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"GM4JKDZK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657929}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.931 DEBUG [LDKCYCS2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.936 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.936 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:37.940 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.940 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.940 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:37.944 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.945 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.946 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.949 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.950 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.950 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:37.952 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.952 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.953 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:37.956 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.957 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.957 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:37.960 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:37.960 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:37.960 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:37.962 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:37.963 DEBUG [LDKCYCS2] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:37.963 DEBUG [LDKCYCS2] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:37.965 DEBUG [LDKCYCS2] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:37.966 DEBUG [LDKCYCS2] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:37.966 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:37.967 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580438814040065(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), vipshop(String), QUOTA(String), 2026-07-02T15:17:37.966757900(LocalDateTime)
- 15:17:37.972 DEBUG [LDKCYCS2] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:37.979 DEBUG [LDKCYCS2] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 48ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"32"]
- Body = {"count":1,"platform":"vipshop"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"LDKCYCS2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976657978}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:37.980 DEBUG [ckc3HMJk] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:37.984 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:37.984 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:37.986 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:37.987 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:37.987 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:37.990 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:37.991 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:37.991 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:37.994 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:37.995 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:37.995 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:37.997 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:37.997 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:37.997 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:37.998 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:37.999 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:37.999 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:38.000 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:38.000 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:38.000 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:38.003 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:38.004 DEBUG [ckc3HMJk] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:38.004 DEBUG [ckc3HMJk] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:38.006 DEBUG [ckc3HMJk] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:38.007 DEBUG [ckc3HMJk] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:38.007 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:38.007 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580439006978050(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), other(String), QUOTA(String), 2026-07-02T15:17:38.007018400(LocalDateTime)
- 15:17:38.010 DEBUG [ckc3HMJk] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:38.016 DEBUG [ckc3HMJk] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 36ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NTcsImV4cCI6MTc4MzA2MzA1N30.tnHExhdIv1UOuY_r-_oql26GxKZdHvkymP7O0dToEeTIMqKDzmiS__f_azeAorpn8WqKWwKzY_vyIPsfDG_XCQ", Content-Length:"30"]
- Body = {"count":1,"platform":"other"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ckc3HMJk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658016}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.025 DEBUG [bZx3SFPK] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:38.026 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.026 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:38.028 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.032 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.032 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:38.034 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.034 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:38.034 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:38.035 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:38.036 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:38.036 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:38.038 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:38.039 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:38.039 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:38.040 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:38.040 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:38.040 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:38.042 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:38.042 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:38.042 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:38.043 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:38.043 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:38.043 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:38.045 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:38.045 DEBUG [bZx3SFPK] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:38.046 DEBUG [bZx3SFPK] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
- 15:17:38.047 DEBUG [bZx3SFPK] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:38.047 DEBUG [bZx3SFPK] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:38.048 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:38.048 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580439204110337(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:38.048246300(LocalDateTime)
- 15:17:38.050 DEBUG [bZx3SFPK] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:38.055 DEBUG [bZx3SFPK] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 30ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg", Content-Length:"11"]
- Body = {"count":1}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"bZx3SFPK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658054}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.065 DEBUG [Y4CBSrDX] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs | IP: 127.0.0.1
- 15:17:38.067 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.067 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:38.068 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.070 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
- 15:17:38.071 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
- 15:17:38.072 DEBUG [Y4CBSrDX] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:38.074 DEBUG [Y4CBSrDX] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/logs
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Y4CBSrDX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976658072}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.081 DEBUG [hJkB9JbB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=30 | IP: 127.0.0.1
- 15:17:38.082 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.082 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:38.084 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.085 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
- 15:17:38.085 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-02(LocalDate)
- 15:17:38.087 DEBUG [hJkB9JbB] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:38.088 DEBUG [hJkB9JbB] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=30 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/logs
- Parameters = {days=[30]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"hJkB9JbB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976658087}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.094 DEBUG [jYTHp9My] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs | IP: 127.0.0.1
- 15:17:38.096 WARN [jYTHp9My] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/logs
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"jYTHp9My", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976658095}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.103 DEBUG [5TTJHDrj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:38.104 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.104 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:38.106 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.110 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.110 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:38.112 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.112 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:38.112 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:38.114 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:38.115 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:38.115 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:38.117 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:38.117 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:38.117 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:38.119 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:38.119 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:38.119 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:38.121 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:38.121 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:38.121 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:38.122 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:38.123 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:38.123 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:38.124 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:38.125 DEBUG [5TTJHDrj] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:38.125 DEBUG [5TTJHDrj] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
- 15:17:38.127 DEBUG [5TTJHDrj] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:38.127 DEBUG [5TTJHDrj] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:38.127 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:38.127 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580439522877441(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), taobao(String), QUOTA(String), 2026-07-02T15:17:38.127626300(LocalDateTime)
- 15:17:38.129 DEBUG [5TTJHDrj] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:38.135 DEBUG [5TTJHDrj] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 32ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg", Content-Length:"31"]
- Body = {"count":1,"platform":"taobao"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"5TTJHDrj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658134}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.136 DEBUG [pKRrx5sp] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 | IP: 127.0.0.1
- 15:17:38.138 DEBUG [pKRrx5sp] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
- 15:17:38.138 DEBUG [pKRrx5sp] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
- 15:17:38.140 DEBUG [pKRrx5sp] [1] [ main] c.x.u.m.C.selectList : <== Total: 1
- 15:17:38.141 DEBUG [pKRrx5sp] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/logs
- Parameters = {days=[7]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.jLJIVaGoMIAh3uvqMmL6lgC8gmzM5V1r2yp8HWM30HfXfOD9qf1b4HXa3Angk637ted8Ig8kkTSqaBOHFVPpRg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"pKRrx5sp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":2072580439522877441,"userId":1,"usageDate":"2026-07-02","usageCount":1,"platform":"taobao","source":"QUOTA","remark":null,"createTime":"2026-07-02 15:17:38"}],"timestamp":1782976658140}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.155 DEBUG [PvaXdNKZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:38.157 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.157 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9001(Long)
- 15:17:38.158 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.161 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.161 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9001(Long)
- 15:17:38.162 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.162 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:38.162 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9001(Long)
- 15:17:38.164 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:38.164 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:38.164 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:38.165 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:38.166 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:38.166 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9001(Long)
- 15:17:38.167 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:38.167 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:38.167 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9001(Long)
- 15:17:38.168 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:38.169 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:38.169 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9001(Long)
- 15:17:38.170 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:38.171 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:38.171 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9001(Long)
- 15:17:38.172 DEBUG [PvaXdNKZ] [9001] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:38.174 WARN [PvaXdNKZ] [9001] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4201, message=今日爬虫次数已用完
- 15:17:38.174 DEBUG [PvaXdNKZ] [9001] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 19ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkwMDEsInN1YiI6IjkwMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.RB29YiTzsukc7u3p6K3KYrpeGSLaBGCCE2OS3_cCF4mynL4v6lJwxuL3WIzICLX_AwKUMOpSjuhhAA64jLAbRw", Content-Length:"12"]
- Body = {"count":15}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"PvaXdNKZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":4201,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976658174}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.187 DEBUG [K6qaJBu7] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:38.188 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.188 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9002(Long)
- 15:17:38.190 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.193 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.194 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9002(Long)
- 15:17:38.196 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.196 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:38.197 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9002(Long)
- 15:17:38.199 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:38.199 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:38.200 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:38.201 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:38.202 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:38.202 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9002(Long)
- 15:17:38.203 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:38.203 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:38.203 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9002(Long)
- 15:17:38.205 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:38.205 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:38.205 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9002(Long)
- 15:17:38.207 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:38.207 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:38.207 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9002(Long)
- 15:17:38.208 DEBUG [K6qaJBu7] [9002] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:38.211 WARN [K6qaJBu7] [9002] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4201, message=今日爬虫次数已用完
- 15:17:38.212 DEBUG [K6qaJBu7] [9002] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 25ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkwMDIsInN1YiI6IjkwMDIiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.MZfgkeqY-NHNa_-Dm17oQV_5h1WWWvaV6Odh5V_s7tkrkDOF5HgAW2PfOocl_cyTGaqZxpCN0j8D4weLT6HnVg", Content-Length:"12"]
- Body = {"count":11}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"K6qaJBu7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":4201,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976658211}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.225 DEBUG [E3WwyApV] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:38.226 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.226 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9003(Long)
- 15:17:38.228 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.232 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.232 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9003(Long)
- 15:17:38.234 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.235 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:38.235 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9003(Long)
- 15:17:38.237 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:38.238 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:38.238 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:38.240 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:38.240 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:38.240 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9003(Long)
- 15:17:38.242 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:38.242 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:38.242 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9003(Long)
- 15:17:38.244 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:38.244 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:38.244 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9003(Long)
- 15:17:38.247 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:38.247 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:38.248 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9003(Long)
- 15:17:38.249 DEBUG [E3WwyApV] [9003] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:38.252 WARN [E3WwyApV] [9003] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4202, message=本月爬虫次数已用完
- 15:17:38.253 DEBUG [E3WwyApV] [9003] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 28ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkwMDMsInN1YiI6IjkwMDMiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.BLBcyOEglg0g6wIx3VBOs5DUTTjUYiVj2-Bp_QYWfzxgwOwMql8YQmYGocjAXmqj5p-7mO1hSDprXBQzzGWqqw", Content-Length:"13"]
- Body = {"count":999}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"E3WwyApV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":4202,"message":"本月爬虫次数已用完","data":null,"timestamp":1782976658252}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.267 DEBUG [uK4Q4k9w] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:38.268 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.268 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9101(Long)
- 15:17:38.269 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.270 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.270 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9101(Long)
- 15:17:38.272 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.272 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:38.272 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9101(Long)
- 15:17:38.275 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:38.276 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:38.276 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:38.278 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:38.279 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:38.279 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9101(Long)
- 15:17:38.280 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:38.280 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:38.281 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9101(Long)
- 15:17:38.282 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:38.283 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:38.283 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9101(Long)
- 15:17:38.285 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:38.285 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:38.286 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:38.287 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:38.287 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:38.287 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9101(Long)
- 15:17:38.289 DEBUG [uK4Q4k9w] [9101] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:38.289 DEBUG [uK4Q4k9w] [9101] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:38.290 DEBUG [uK4Q4k9w] [9101] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 9101(Long)
- 15:17:38.292 DEBUG [uK4Q4k9w] [9101] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:38.294 DEBUG [uK4Q4k9w] [9101] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 27ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDEsInN1YiI6IjkxMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.CkNHAC302tbQ7C23v5zHRHQqVmdTPQd6pP-1ewgVvHKYlba8s602M2dL-DjDFme2sK-fe_Og0yJxQFdX289ZoA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"uK4Q4k9w", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976658292}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.295 DEBUG [5Ne4KJvk] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:38.297 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.297 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9101(Long)
- 15:17:38.299 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.299 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:38.300 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9101(Long)
- 15:17:38.301 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:38.302 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:38.302 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:38.303 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:38.304 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:38.304 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9101(Long)
- 15:17:38.306 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:38.306 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:38.306 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9101(Long)
- 15:17:38.308 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:38.308 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:38.308 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9101(Long)
- 15:17:38.309 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:38.310 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:38.310 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9101(Long)
- 15:17:38.311 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:38.312 DEBUG [5Ne4KJvk] [9101] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:38.312 DEBUG [5Ne4KJvk] [9101] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9101(Long)
- 15:17:38.313 DEBUG [5Ne4KJvk] [9101] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:38.313 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.service.CrawlerService : 用户9101消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:38.314 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:38.314 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580440294629377(Long), 9101(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:38.314155200(LocalDateTime)
- 15:17:38.317 DEBUG [5Ne4KJvk] [9101] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:38.323 DEBUG [5Ne4KJvk] [9101] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 28ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDEsInN1YiI6IjkxMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.CkNHAC302tbQ7C23v5zHRHQqVmdTPQd6pP-1ewgVvHKYlba8s602M2dL-DjDFme2sK-fe_Og0yJxQFdX289ZoA", Content-Length:"11"]
- Body = {"count":1}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"5Ne4KJvk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976658322}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:38.323 DEBUG [SbV9ngzA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:38.324 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:38.324 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9101(Long)
- 15:17:38.327 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:38.327 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:38.327 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9101(Long)
- 15:17:38.329 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:38.330 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:38.330 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:38.332 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:38.332 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:38.332 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9101(Long)
- 15:17:38.334 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:38.334 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:38.334 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9101(Long)
- 15:17:38.336 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:38.336 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:38.337 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9101(Long)
- 15:17:38.338 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:38.339 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:38.339 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:38.340 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:38.341 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:38.341 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9101(Long)
- 15:17:38.342 DEBUG [SbV9ngzA] [9101] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:38.343 DEBUG [SbV9ngzA] [9101] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:38.343 DEBUG [SbV9ngzA] [9101] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 9101(Long)
- 15:17:38.344 DEBUG [SbV9ngzA] [9101] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:38.345 DEBUG [SbV9ngzA] [9101] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 22ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDEsInN1YiI6IjkxMDEiLCJpYXQiOjE3ODI5NzY2NTgsImV4cCI6MTc4MzA2MzA1OH0.CkNHAC302tbQ7C23v5zHRHQqVmdTPQd6pP-1ewgVvHKYlba8s602M2dL-DjDFme2sK-fe_Og0yJxQFdX289ZoA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"SbV9ngzA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":1,"todayQuota":10,"todayRemaining":9,"monthUsed":1,"monthQuota":300,"monthRemaining":299,"yearUsed":1,"yearQuota":3650,"yearRemaining":3649,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976658344}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 23, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.754 s -- in 爬虫配额接口测试
- [INFO] Running 爬虫配额和平台账号绑定测试
- 15:17:38.350 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.CrawlerQuotaAndPlatformTest]: CrawlerQuotaAndPlatformTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:38.352 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.CrawlerQuotaAndPlatformTest
- 15:17:41.570 DEBUG [xWGWjQ4R] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:41.571 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.571 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.572 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.573 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.573 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.574 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.574 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:41.575 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:41.576 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:41.577 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:41.577 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:41.578 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:41.578 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:41.578 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:41.580 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:41.580 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:41.580 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:41.581 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:41.581 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:41.581 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:41.582 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:41.583 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:41.583 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:41.585 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:41.585 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:41.585 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:41.587 DEBUG [xWGWjQ4R] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:41.587 DEBUG [xWGWjQ4R] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:41.587 DEBUG [xWGWjQ4R] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:41.588 DEBUG [xWGWjQ4R] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:41.589 DEBUG [xWGWjQ4R] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 19ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"xWGWjQ4R", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976661588}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.596 DEBUG [kMjKA3cY] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:41.597 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.597 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.599 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.599 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.599 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.601 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.601 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:41.601 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:41.602 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:41.603 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:41.603 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:41.604 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:41.605 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:41.605 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:41.605 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:41.605 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:41.606 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:41.608 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:41.608 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:41.608 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:41.609 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:41.610 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:41.610 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:41.611 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:41.611 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:41.611 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:41.612 DEBUG [kMjKA3cY] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:41.612 DEBUG [kMjKA3cY] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:41.612 DEBUG [kMjKA3cY] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:41.614 DEBUG [kMjKA3cY] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:41.615 DEBUG [kMjKA3cY] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 19ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"kMjKA3cY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976661615}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.622 DEBUG [v4mAdBGD] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:41.623 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.624 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.625 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.626 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.626 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.628 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.628 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:41.628 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:41.629 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:41.630 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:41.630 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:41.633 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:41.633 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:41.633 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:41.634 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:41.634 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:41.634 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:41.635 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:41.636 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:41.636 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:41.637 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:41.637 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:41.637 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:41.639 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:41.639 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:41.639 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:41.641 DEBUG [v4mAdBGD] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:41.641 DEBUG [v4mAdBGD] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:41.641 DEBUG [v4mAdBGD] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:41.642 DEBUG [v4mAdBGD] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:41.643 DEBUG [v4mAdBGD] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 21ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"v4mAdBGD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976661642}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.649 DEBUG [ApJVwb7L] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:41.650 WARN [ApJVwb7L] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"ApJVwb7L", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976661650}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.657 DEBUG [CXeT6Cg7] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:41.658 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.658 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.660 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.663 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.664 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.665 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.665 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:41.665 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:41.666 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:41.667 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:41.667 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:41.669 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:41.670 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:41.670 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:41.671 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:41.671 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:41.671 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:41.672 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:41.672 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:41.672 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:41.674 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:41.674 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:41.674 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:41.676 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:41.676 DEBUG [CXeT6Cg7] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:41.676 DEBUG [CXeT6Cg7] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
- 15:17:41.678 DEBUG [CXeT6Cg7] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:41.678 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:41.678 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:41.679 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580454421045249(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:41.678146700(LocalDateTime)
- 15:17:41.682 DEBUG [CXeT6Cg7] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:41.687 DEBUG [CXeT6Cg7] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 30ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"78"]
- Body = {
- "count": 1,
- "useCouponFirst": false,
- "platform": "yaoshibang"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"CXeT6Cg7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661686}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.698 DEBUG [wJVGpdFN] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:41.699 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.699 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.701 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.703 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.704 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.705 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.705 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:41.705 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:41.706 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:41.707 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:41.707 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:41.709 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:41.709 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:41.709 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:41.710 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:41.711 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:41.711 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:41.711 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:41.712 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:41.712 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:41.712 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:41.712 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:41.712 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:41.713 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:41.714 DEBUG [wJVGpdFN] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:41.714 DEBUG [wJVGpdFN] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
- 15:17:41.715 DEBUG [wJVGpdFN] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:41.715 DEBUG [wJVGpdFN] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:41.715 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:41.715 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580454551068674(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:41.715406400(LocalDateTime)
- 15:17:41.718 DEBUG [wJVGpdFN] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:41.722 DEBUG [wJVGpdFN] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 24ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"49"]
- Body = {
- "count": 1,
- "platform": "yaoshibang"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"wJVGpdFN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661721}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.731 DEBUG [7VHsx84F] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:41.732 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.732 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.734 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.737 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.737 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.738 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.738 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:41.738 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:41.739 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:41.740 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:41.740 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:41.742 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:41.742 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:41.742 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:41.743 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:41.743 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:41.743 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:41.744 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:41.744 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:41.744 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:41.745 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:41.746 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:41.746 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:41.746 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:41.746 DEBUG [7VHsx84F] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:41.747 DEBUG [7VHsx84F] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
- 15:17:41.748 DEBUG [7VHsx84F] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:41.748 DEBUG [7VHsx84F] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:41.748 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:41.748 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580454676897793(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaobangmang(String), QUOTA(String), 2026-07-02T15:17:41.748111500(LocalDateTime)
- 15:17:41.750 DEBUG [7VHsx84F] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:41.755 DEBUG [7VHsx84F] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 24ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"50"]
- Body = {
- "count": 1,
- "platform": "yaobangmang"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"7VHsx84F", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661754}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.765 DEBUG [jzsaRJdf] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:41.765 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.766 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.767 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.770 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.770 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.771 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.771 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:41.772 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:41.773 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:41.774 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:41.774 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:41.776 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:41.776 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:41.776 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:41.777 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:41.778 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:41.778 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:41.779 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:41.779 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:41.779 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:41.780 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:41.780 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:41.780 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:41.782 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:41.782 DEBUG [jzsaRJdf] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:41.782 DEBUG [jzsaRJdf] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
- 15:17:41.784 DEBUG [jzsaRJdf] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:41.784 DEBUG [jzsaRJdf] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:41.784 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:41.784 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580454869835778(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yiyaocheng(String), QUOTA(String), 2026-07-02T15:17:41.784680700(LocalDateTime)
- 15:17:41.786 DEBUG [jzsaRJdf] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:41.792 DEBUG [jzsaRJdf] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 27ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"49"]
- Body = {
- "count": 1,
- "platform": "yiyaocheng"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"jzsaRJdf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976661792}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.802 DEBUG [mJxZWtZK] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:41.803 DEBUG [mJxZWtZK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.803 DEBUG [mJxZWtZK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.805 DEBUG [mJxZWtZK] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.806 WARN [mJxZWtZK] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 消耗次数至少为1
- 15:17:41.807 WARN [mJxZWtZK] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 400 5ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"49"]
- Body = {
- "count": 0,
- "platform": "yaoshibang"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"mJxZWtZK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976661806}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.812 DEBUG [hza3PFrM] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:41.814 WARN [hza3PFrM] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 401 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"11"]
- Body = {"count":1}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"hza3PFrM", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976661813}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.820 DEBUG [whCeG6Y9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 | IP: 127.0.0.1
- 15:17:41.821 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.821 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.824 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.825 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
- 15:17:41.825 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
- 15:17:41.826 DEBUG [whCeG6Y9] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:41.827 DEBUG [whCeG6Y9] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/logs
- Parameters = {days=[7]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"whCeG6Y9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661826}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.835 DEBUG [C38pVPxy] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 | IP: 127.0.0.1
- 15:17:41.836 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.836 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.837 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.838 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
- 15:17:41.839 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
- 15:17:41.840 DEBUG [C38pVPxy] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:41.841 DEBUG [C38pVPxy] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=7 200 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/logs
- Parameters = {days=[7]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"C38pVPxy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661840}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.848 DEBUG [B7DC5Mkn] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs | IP: 127.0.0.1
- 15:17:41.849 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.849 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.851 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.852 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
- 15:17:41.852 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-25(LocalDate)
- 15:17:41.853 DEBUG [B7DC5Mkn] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:41.854 DEBUG [B7DC5Mkn] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs 200 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/logs
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"B7DC5Mkn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661853}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.862 DEBUG [XSNwMZff] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=30 | IP: 127.0.0.1
- 15:17:41.863 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.863 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.865 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.866 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id,user_id,usage_date,usage_count,platform,source,remark,create_time FROM t_crawler_usage_log WHERE (user_id = ? AND usage_date >= ?) ORDER BY usage_date DESC
- 15:17:41.866 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: 1(Long), 2026-06-02(LocalDate)
- 15:17:41.867 DEBUG [XSNwMZff] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:41.869 DEBUG [XSNwMZff] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs?days=30 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/logs
- Parameters = {days=[30]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getUsageLogs(HttpServletRequest, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"XSNwMZff", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976661868}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.873 DEBUG [Ns5BHsSr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs | IP: 127.0.0.1
- 15:17:41.874 WARN [Ns5BHsSr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/logs
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"Ns5BHsSr", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976661873}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.881 DEBUG [rkYdLfpA] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
- 15:17:41.881 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.882 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.883 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.889 DEBUG [rkYdLfpA] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:17:41.889 DEBUG [rkYdLfpA] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
- 15:17:41.891 DEBUG [rkYdLfpA] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
- 15:17:41.898 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:41.898 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580455318626305(Long), 1(Long), yaoshibang(String), 药师帮(String), EJZkX5AAmfJJtaiasI9Xv37Ern3lgf3gQVUNDuAmMZnQG4vgkkRb(String), R4BZSz47fOdiaJRZN2XUXBa1k0o+46tq25xashcvpGQkWUykatD8U0I=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:41.898965900(LocalDateTime), 2026-07-02T15:17:41.898965900(LocalDateTime)
- 15:17:41.901 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
- 15:17:41.901 INFO [rkYdLfpA] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaoshibang
- 15:17:41.906 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:41.907 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580455385735170(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:41.906193800(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:41.906779600(LocalDateTime)
- 15:17:41.912 DEBUG [rkYdLfpA] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:41.912 DEBUG [rkYdLfpA] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
- 15:17:41.912 DEBUG [rkYdLfpA] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 31ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"133"]
- Body = {
- "platformCode": "yaoshibang",
- "platformName": "药师帮",
- "account": "13800138000",
- "password": "test_password"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"rkYdLfpA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976661912}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.922 DEBUG [SBbx2jjJ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
- 15:17:41.923 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.923 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.924 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.926 DEBUG [SBbx2jjJ] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:17:41.926 DEBUG [SBbx2jjJ] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
- 15:17:41.927 DEBUG [SBbx2jjJ] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
- 15:17:41.928 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:41.928 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580455452844034(Long), 1(Long), yaobangmang(String), 药帮忙(String), OppMs95lNQP1PdbDk2Bet78/Sz4z2Wt2aUksPH69OSz3zE9bY0e9(String), IJcnI6uHez4/wQZck0aFOzAXvWyrQEi/D3Oxu72pmYZn6SRw7sunGMc=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:41.928397100(LocalDateTime), 2026-07-02T15:17:41.928397100(LocalDateTime)
- 15:17:41.930 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
- 15:17:41.930 INFO [SBbx2jjJ] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaobangmang
- 15:17:41.934 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:41.935 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580455515758594(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:41.934846100(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:41.934846100(LocalDateTime)
- 15:17:41.939 DEBUG [SBbx2jjJ] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:41.940 DEBUG [SBbx2jjJ] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
- 15:17:41.940 DEBUG [SBbx2jjJ] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 18ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"134"]
- Body = {
- "platformCode": "yaobangmang",
- "platformName": "药帮忙",
- "account": "13800138000",
- "password": "test_password"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"SBbx2jjJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976661940}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.946 DEBUG [5w4LzHqz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
- 15:17:41.947 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.947 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.948 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.950 DEBUG [5w4LzHqz] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:17:41.950 DEBUG [5w4LzHqz] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yiyaocheng(String)
- 15:17:41.951 DEBUG [5w4LzHqz] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
- 15:17:41.952 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:41.952 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580455582867458(Long), 1(Long), yiyaocheng(String), 1药城(String), Y+gICIjM+z0cx6ZX7Bc5Fn9x7vC/2uzTw1eZen5na870bMi8TDGk(String), XM/Ncnrta96k/RDRE+qZXI+gmkLp0+dNSMAoa5AGTJ27MpGZzP9BWbE=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:41.951875300(LocalDateTime), 2026-07-02T15:17:41.951875300(LocalDateTime)
- 15:17:41.954 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
- 15:17:41.954 INFO [5w4LzHqz] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yiyaocheng
- 15:17:41.958 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:41.958 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580455582867459(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:41.958341500(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yiyaocheng(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:41.958341500(LocalDateTime)
- 15:17:41.963 DEBUG [5w4LzHqz] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:41.963 DEBUG [5w4LzHqz] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
- 15:17:41.964 DEBUG [5w4LzHqz] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 18ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"131"]
- Body = {
- "platformCode": "yiyaocheng",
- "platformName": "1药城",
- "account": "13800138000",
- "password": "test_password"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"5w4LzHqz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976661963}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.970 DEBUG [3mqMcSZX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
- 15:17:41.971 DEBUG [3mqMcSZX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.971 DEBUG [3mqMcSZX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.972 DEBUG [3mqMcSZX] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.974 WARN [3mqMcSZX] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 平台名称不能为空, 密码不能为空, 账号不能为空
- 15:17:41.975 WARN [3mqMcSZX] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 400 5ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw", Content-Length:"37"]
- Body = {
- "platformCode": "yaoshibang"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"3mqMcSZX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"平台名称不能为空, 密码不能为空, 账号不能为空","data":null,"timestamp":1782976661974}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.979 DEBUG [4y2QdqYg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
- 15:17:41.980 WARN [4y2QdqYg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 401 1ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"4y2QdqYg", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976661980}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:41.987 DEBUG [wsq7CMVA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
- 15:17:41.987 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:41.988 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:41.989 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:41.989 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
- 15:17:41.989 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
- 15:17:41.991 DEBUG [wsq7CMVA] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 3
- 15:17:41.995 DEBUG [wsq7CMVA] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-account/list
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjEsImV4cCI6MTc4MzA2MzA2MX0.eL6MvX9GYY0L6NfWjJPYo1j748n8WGp6q9Y0DMlfQijf4ENgGm0cS8rOvKrjGm-ic8ihzGLoBkyblXGFGBghjw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"wsq7CMVA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":2072580455452844034,"platformCode":"yaobangmang","platformName":"药帮忙","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455318626305,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455582867458,"platformCode":"yiyaocheng","platformName":"1药城","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"}],"timestamp":1782976661993}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:42.002 DEBUG [AUyfXxAk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
- 15:17:42.002 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:42.003 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:42.005 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:42.006 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
- 15:17:42.006 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
- 15:17:42.007 DEBUG [AUyfXxAk] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 3
- 15:17:42.008 DEBUG [AUyfXxAk] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-account/list
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjIsImV4cCI6MTc4MzA2MzA2Mn0.Bw72fwU6bE7o2rZUH0ZCDv_R1_y2a0wJ0wTRQHb6VKJFzQbrGEw2rOErRmkzxd9XSw-mrzb1kIe5946qJWNBlg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"AUyfXxAk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":2072580455452844034,"platformCode":"yaobangmang","platformName":"药帮忙","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455318626305,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"},{"id":2072580455582867458,"platformCode":"yiyaocheng","platformName":"1药城","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:42"}],"timestamp":1782976662008}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:42.014 DEBUG [bxpq79Wr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
- 15:17:42.015 WARN [bxpq79Wr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-account/list
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"bxpq79Wr", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976662014}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:42.022 DEBUG [4mTKVmfX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang | IP: 127.0.0.1
- 15:17:42.023 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:42.023 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:42.024 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:42.027 DEBUG [4mTKVmfX] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:17:42.027 DEBUG [4mTKVmfX] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
- 15:17:42.028 DEBUG [4mTKVmfX] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 1
- 15:17:42.029 INFO [4mTKVmfX] [1] [ main] c.x.u.s.PlatformAccountService : 模拟验证平台账号: platform=yaoshibang, account=13800138000
- 15:17:42.030 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.P.updateById : ==> Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
- 15:17:42.031 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.P.updateById : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), EJZkX5AAmfJJtaiasI9Xv37Ern3lgf3gQVUNDuAmMZnQG4vgkkRb(String), R4BZSz47fOdiaJRZN2XUXBa1k0o+46tq25xashcvpGQkWUykatD8U0I=(String), true(Boolean), 2026-07-02T15:17:42.029864400(LocalDateTime), SUCCESS(String), 2026-07-02T15:17:42(LocalDateTime), 2026-07-02T15:17:42.029864400(LocalDateTime), 2072580455318626305(Long)
- 15:17:42.033 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.P.updateById : <== Updates: 1
- 15:17:42.038 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:42.038 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580455905828866(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:42.037741300(LocalDateTime), ACCOUNT(String), VERIFY(String), 验证B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:42.037741300(LocalDateTime)
- 15:17:42.042 DEBUG [4mTKVmfX] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:42.042 DEBUG [4mTKVmfX] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 验证B2B平台账号
- 15:17:42.043 DEBUG [4mTKVmfX] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang 200 21ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/verify/yaoshibang
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjIsImV4cCI6MTc4MzA2MzA2Mn0.Bw72fwU6bE7o2rZUH0ZCDv_R1_y2a0wJ0wTRQHb6VKJFzQbrGEw2rOErRmkzxd9XSw-mrzb1kIe5946qJWNBlg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#verifyAccount(String, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"4mTKVmfX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976662042}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:42.048 DEBUG [HJAtsU3Q] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang | IP: 127.0.0.1
- 15:17:42.049 WARN [HJAtsU3Q] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang 401 1ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/verify/yaoshibang
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"HJAtsU3Q", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976662049}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:42.055 DEBUG [pRRQcsRB] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaoshibang | IP: 127.0.0.1
- 15:17:42.056 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:42.056 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:42.058 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:42.059 DEBUG [pRRQcsRB] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:17:42.059 DEBUG [pRRQcsRB] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
- 15:17:42.061 DEBUG [pRRQcsRB] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 1
- 15:17:42.061 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.P.updateById : ==> Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
- 15:17:42.062 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.P.updateById : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), EJZkX5AAmfJJtaiasI9Xv37Ern3lgf3gQVUNDuAmMZnQG4vgkkRb(String), R4BZSz47fOdiaJRZN2XUXBa1k0o+46tq25xashcvpGQkWUykatD8U0I=(String), false(Boolean), 2026-07-02T15:17:42(LocalDateTime), SUCCESS(String), 2026-07-02T15:17:42(LocalDateTime), 2026-07-02T15:17:42.061782300(LocalDateTime), 2072580455318626305(Long)
- 15:17:42.063 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.P.updateById : <== Updates: 1
- 15:17:42.063 INFO [pRRQcsRB] [1] [ main] c.x.u.s.PlatformAccountService : 解绑平台账号: userId=1, platform=yaoshibang
- 15:17:42.068 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:42.068 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580456035852289(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:42.068074100(LocalDateTime), ACCOUNT(String), UNBIND(String), 解绑B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:42.068074100(LocalDateTime)
- 15:17:42.072 DEBUG [pRRQcsRB] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:42.072 DEBUG [pRRQcsRB] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 解绑B2B平台账号
- 15:17:42.073 DEBUG [pRRQcsRB] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaoshibang 200 18ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/platform-account/unbind/yaoshibang
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjIsImV4cCI6MTc4MzA2MzA2Mn0.Bw72fwU6bE7o2rZUH0ZCDv_R1_y2a0wJ0wTRQHb6VKJFzQbrGEw2rOErRmkzxd9XSw-mrzb1kIe5946qJWNBlg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#unbindAccount(String, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"pRRQcsRB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976662072}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:42.077 DEBUG [z5CuEmpG] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaoshibang | IP: 127.0.0.1
- 15:17:42.079 WARN [z5CuEmpG] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaoshibang 401 2ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/platform-account/unbind/yaoshibang
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"z5CuEmpG", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976662078}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:42.083 DEBUG [UryBceVa] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled | IP: 127.0.0.1
- 15:17:42.084 DEBUG [UryBceVa] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Preparing: SELECT * FROM t_platform_config WHERE enabled = true ORDER BY priority ASC
- 15:17:42.084 DEBUG [UryBceVa] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Parameters:
- 15:17:42.085 DEBUG [UryBceVa] [] [ main] x.u.m.P.selectEnabledPlatforms : <== Total: 3
- 15:17:42.087 DEBUG [UryBceVa] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-config/enabled
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
- Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getEnabledPlatforms()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"UryBceVa", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":2,"platformCode":"yaobangmang","platformName":"药帮忙","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":2,"underMaintenance":false,"maintenanceNotice":null,"description":"专业医药B2B采购平台","officialUrl":"https://www.yaobangmang.com","bindingInstructions":"请输入您在药帮忙的手机号和密码","sortOrder":2,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":3,"platformCode":"yiyaocheng","platformName":"1药城","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":3,"underMaintenance":false,"maintenanceNotice":null,"description":"1药网旗下B2B医药平台","officialUrl":"https://www.1yaocheng.com","bindingInstructions":"请输入您在1药城的手机号和密码","sortOrder":3,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null}],"timestamp":1782976662086}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:42.092 DEBUG [XJ5fy9Cq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled | IP: 127.0.0.1
- 15:17:42.093 DEBUG [XJ5fy9Cq] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Preparing: SELECT * FROM t_platform_config WHERE enabled = true ORDER BY priority ASC
- 15:17:42.093 DEBUG [XJ5fy9Cq] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Parameters:
- 15:17:42.094 DEBUG [XJ5fy9Cq] [] [ main] x.u.m.P.selectEnabledPlatforms : <== Total: 3
- 15:17:42.095 DEBUG [XJ5fy9Cq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled 200 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-config/enabled
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
- Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getEnabledPlatforms()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"XJ5fy9Cq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":2,"platformCode":"yaobangmang","platformName":"药帮忙","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":2,"underMaintenance":false,"maintenanceNotice":null,"description":"专业医药B2B采购平台","officialUrl":"https://www.yaobangmang.com","bindingInstructions":"请输入您在药帮忙的手机号和密码","sortOrder":2,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},{"id":3,"platformCode":"yiyaocheng","platformName":"1药城","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":3,"underMaintenance":false,"maintenanceNotice":null,"description":"1药网旗下B2B医药平台","officialUrl":"https://www.1yaocheng.com","bindingInstructions":"请输入您在1药城的手机号和密码","sortOrder":3,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null}],"timestamp":1782976662094}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:42.100 DEBUG [GhMadpW3] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/yaoshibang | IP: 127.0.0.1
- 15:17:42.101 DEBUG [GhMadpW3] [] [ main] c.x.u.m.P.selectByPlatformCode : ==> Preparing: SELECT * FROM t_platform_config WHERE platform_code = ? LIMIT 1
- 15:17:42.101 DEBUG [GhMadpW3] [] [ main] c.x.u.m.P.selectByPlatformCode : ==> Parameters: yaoshibang(String)
- 15:17:42.102 DEBUG [GhMadpW3] [] [ main] c.x.u.m.P.selectByPlatformCode : <== Total: 1
- 15:17:42.103 DEBUG [GhMadpW3] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/yaoshibang 200 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-config/yaoshibang
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
- Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getPlatformConfig(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"GhMadpW3", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:17:41","updateTime":"2026-07-02 15:17:41","createdBy":null,"updatedBy":null},"timestamp":1782976662102}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:42.108 DEBUG [nt9xTLes] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/nonexistent | IP: 127.0.0.1
- 15:17:42.109 DEBUG [nt9xTLes] [] [ main] c.x.u.m.P.selectByPlatformCode : ==> Preparing: SELECT * FROM t_platform_config WHERE platform_code = ? LIMIT 1
- 15:17:42.109 DEBUG [nt9xTLes] [] [ main] c.x.u.m.P.selectByPlatformCode : ==> Parameters: nonexistent(String)
- 15:17:42.110 DEBUG [nt9xTLes] [] [ main] c.x.u.m.P.selectByPlatformCode : <== Total: 0
- 15:17:42.111 WARN [nt9xTLes] [] [ main] c.x.h.GlobalExceptionHandler : 响应状态异常: status=404 NOT_FOUND, reason=平台配置不存在
- 15:17:42.114 WARN [nt9xTLes] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/nonexistent 404 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-config/nonexistent
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
- Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getPlatformConfig(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.server.ResponseStatusException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 404
- Error message = null
- Headers = [X-Request-Id:"nt9xTLes", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":404,"message":"平台配置不存在","data":null,"timestamp":1782976662111}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 31, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.767 s -- in 爬虫配额和平台账号绑定测试
- [INFO] Running 药品搜索接口测试
- 15:17:42.118 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.DrugSearchControllerTest]: DrugSearchControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:42.119 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.DrugSearchControllerTest
- 15:17:45.075 DEBUG [vvawT3PN] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.076 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.077 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:45.078 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.083 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.083 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:45.084 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.085 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.085 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:45.087 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.087 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.087 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.089 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.090 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.090 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:45.091 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.091 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.091 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:45.092 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.092 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.092 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:45.093 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.093 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.093 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:45.094 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.094 DEBUG [vvawT3PN] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.095 DEBUG [vvawT3PN] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:45.096 DEBUG [vvawT3PN] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.096 DEBUG [vvawT3PN] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.096 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.096 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580468736204801(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.096876700(LocalDateTime)
- 15:17:45.098 DEBUG [vvawT3PN] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.101 INFO [vvawT3PN] [2] [ main] c.x.u.s.DrugSearchService : 用户 2 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
- 15:17:45.108 DEBUG [vvawT3PN] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 33ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"vvawT3PN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665106}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.122 DEBUG [n6LcGSCf] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.122 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.122 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:45.124 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.126 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.126 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:45.127 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.127 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.127 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:45.128 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.129 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.129 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.130 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.130 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.131 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:45.132 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.133 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.133 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:45.134 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.134 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.134 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:45.135 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.136 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.136 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:45.136 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.137 DEBUG [n6LcGSCf] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.137 DEBUG [n6LcGSCf] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:45.138 DEBUG [n6LcGSCf] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.138 DEBUG [n6LcGSCf] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.138 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.138 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580468929142785(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.138859800(LocalDateTime)
- 15:17:45.140 DEBUG [n6LcGSCf] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.140 INFO [n6LcGSCf] [2] [ main] c.x.u.s.DrugSearchService : 用户 2 搜索药物: 奥美拉唑肠溶胶囊, 平台: null, 找到 3 条结果
- 15:17:45.144 DEBUG [n6LcGSCf] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 22ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"38"]
- Body = {"keyword":"奥美拉唑肠溶胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"n6LcGSCf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"奥美拉唑肠溶胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":8.90,"spec":"20mg*14粒/盒","manufacturer":"山东罗欣","expiry":"2027-06","moq":20,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=奥美拉唑肠溶胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":9.50,"spec":"20mg*14粒/盒","manufacturer":"山东罗欣","expiry":"2027-04","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaobangmang.com/search?q=奥美拉唑肠溶胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":8.50,"spec":"20mg*14粒/盒","manufacturer":"悦康药业","expiry":"2027-11","moq":1,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.1yaocheng.com/search?q=奥美拉唑肠溶胶囊&ref=zhijiayun"}],"lowestPrice":8.50,"lowestPricePlatform":"1药城","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665143}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.153 DEBUG [pFwvrnR9] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.154 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.154 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:45.155 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.158 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.158 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:45.159 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.159 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.159 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:45.161 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.162 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.162 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.163 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.163 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.163 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:45.165 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.165 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.165 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:45.166 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.167 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.167 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:45.168 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.169 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.169 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:45.170 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.170 DEBUG [pFwvrnR9] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.170 DEBUG [pFwvrnR9] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:45.171 DEBUG [pFwvrnR9] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.171 DEBUG [pFwvrnR9] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.171 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.171 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469059166209(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.171767800(LocalDateTime)
- 15:17:45.174 DEBUG [pFwvrnR9] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.174 INFO [pFwvrnR9] [2] [ main] c.x.u.s.DrugSearchService : 用户 2 搜索药物: 不存在的药品名称XYZ, 平台: null, 找到 0 条结果
- 15:17:45.178 DEBUG [pFwvrnR9] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 25ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"41"]
- Body = {"keyword":"不存在的药品名称XYZ"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"pFwvrnR9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"不存在的药品名称XYZ","prices":[],"lowestPrice":null,"lowestPricePlatform":null,"totalCount":0,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665177}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.188 DEBUG [9UXRAf95] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.188 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.189 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:45.190 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.193 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.193 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:45.195 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.195 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.196 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:45.197 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.198 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.198 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.199 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.200 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.200 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:45.202 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.202 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.202 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:45.203 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.203 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.203 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:45.204 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.204 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.204 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:45.205 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.206 DEBUG [9UXRAf95] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.206 DEBUG [9UXRAf95] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:45.207 DEBUG [9UXRAf95] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.207 DEBUG [9UXRAf95] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.207 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:45.207 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469184995329(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:45.207897800(LocalDateTime)
- 15:17:45.210 DEBUG [9UXRAf95] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.210 INFO [9UXRAf95] [2] [ main] c.x.u.s.DrugSearchService : 用户 2 搜索药物: 阿莫西林胶囊, 平台: yaoshibang, 找到 1 条结果
- 15:17:45.216 DEBUG [9UXRAf95] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 28ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"59"]
- Body = {"keyword":"阿莫西林胶囊","platforms":["yaoshibang"]}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"9UXRAf95", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":12.50,"lowestPricePlatform":"药师帮","totalCount":1,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665214}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.224 DEBUG [MqkWmeSz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.225 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.225 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:45.228 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.230 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.230 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:17:45.233 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.233 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.233 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:17:45.235 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.235 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.235 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.237 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.237 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.237 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 2(Long)
- 15:17:45.240 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.240 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.240 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 2(Long)
- 15:17:45.241 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.241 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.242 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 2(Long)
- 15:17:45.243 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.243 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.243 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 2(Long)
- 15:17:45.244 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.244 DEBUG [MqkWmeSz] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.244 DEBUG [MqkWmeSz] [2] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 2(Long)
- 15:17:45.246 DEBUG [MqkWmeSz] [2] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.246 DEBUG [MqkWmeSz] [2] [ main] c.x.u.service.CrawlerService : 用户2消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.247 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.247 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469382127618(Long), 2(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.247131100(LocalDateTime)
- 15:17:45.249 DEBUG [MqkWmeSz] [2] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.250 INFO [MqkWmeSz] [2] [ main] c.x.u.s.DrugSearchService : 用户 2 搜索药物: 布洛芬, 平台: null, 找到 3 条结果
- 15:17:45.255 DEBUG [MqkWmeSz] [2] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 31ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.jHGRWwg0j7BCOlimrcsNhyTwJtGKbixZL7nkAiB6KH5lOzLiSoYQxE4h3lXSfgyJNRZzM7bO4aHh1YEA3cEqWQ", Content-Length:"23"]
- Body = {"keyword":"布洛芬"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"MqkWmeSz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"布洛芬","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":15.80,"spec":"0.3g*20粒/盒","manufacturer":"中美史克","expiry":"2027-12","moq":10,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaoshibang.com/search?q=布洛芬&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":14.90,"spec":"0.3g*20粒/盒","manufacturer":"中美史克","expiry":"2027-09","moq":5,"stockStatus":"LOW_STOCK","isLowest":false,"purchaseUrl":"https://www.yaobangmang.com/search?q=布洛芬&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":16.50,"spec":"0.3g*24粒/盒","manufacturer":"珠海联邦","expiry":"2028-01","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=布洛芬&ref=zhijiayun"}],"lowestPrice":15.80,"lowestPricePlatform":"药师帮","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665255}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.266 DEBUG [uw79CavX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.267 DEBUG [uw79CavX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.267 DEBUG [uw79CavX] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:45.269 DEBUG [uw79CavX] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.271 WARN [uw79CavX] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 搜索关键词不能为空
- 15:17:45.271 WARN [uw79CavX] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 400 5ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0._Wg12DzhpkFmfAxTGa53YEih7j38oPv_6swi3FiQIZDquhsG-7bjWojOwifCuKLBZPuBFXsmqxAma60LRp16sg", Content-Length:"14"]
- Body = {"keyword":""}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"uw79CavX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"搜索关键词不能为空","data":null,"timestamp":1782976665271}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.276 DEBUG [gzLLXdSd] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.278 WARN [gzLLXdSd] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 401 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"26"]
- Body = {"keyword":"阿莫西林"}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"gzLLXdSd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976665277}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.289 DEBUG [epBWSsGR] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.290 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.290 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.291 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.294 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.294 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.296 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.296 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.296 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.297 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.298 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.298 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.300 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.300 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.300 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.301 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.302 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.302 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.303 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.303 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.303 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.305 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.305 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.305 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.306 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.306 DEBUG [epBWSsGR] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.307 DEBUG [epBWSsGR] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
- 15:17:45.308 DEBUG [epBWSsGR] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.308 DEBUG [epBWSsGR] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.308 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.309 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469633785858(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.308771500(LocalDateTime)
- 15:17:45.311 DEBUG [epBWSsGR] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.311 INFO [epBWSsGR] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
- 15:17:45.317 DEBUG [epBWSsGR] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 28ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"epBWSsGR", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665316}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.317 DEBUG [rFt44e4w] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.321 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.321 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.323 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.323 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.323 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.325 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.325 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.325 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.327 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.327 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.327 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.329 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.330 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.330 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.331 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.332 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.332 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.334 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.334 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.334 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.335 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.335 DEBUG [rFt44e4w] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.335 DEBUG [rFt44e4w] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
- 15:17:45.337 DEBUG [rFt44e4w] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.337 DEBUG [rFt44e4w] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.337 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.337 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469763809282(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.337849800(LocalDateTime)
- 15:17:45.340 DEBUG [rFt44e4w] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.340 INFO [rFt44e4w] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
- 15:17:45.345 DEBUG [rFt44e4w] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 28ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"rFt44e4w", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665344}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.346 DEBUG [qVeLnKha] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.349 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.349 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.351 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.351 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.351 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.352 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.352 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.353 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.354 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.354 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.354 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.356 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.356 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.356 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.357 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.357 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.357 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.359 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.359 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.359 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.361 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.361 DEBUG [qVeLnKha] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.361 DEBUG [qVeLnKha] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
- 15:17:45.362 DEBUG [qVeLnKha] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.363 DEBUG [qVeLnKha] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.363 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.363 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469893832705(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.363398700(LocalDateTime)
- 15:17:45.366 DEBUG [qVeLnKha] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.366 INFO [qVeLnKha] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
- 15:17:45.371 DEBUG [qVeLnKha] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 25ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"qVeLnKha", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665370}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.372 DEBUG [PzwXp9eN] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.375 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.375 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.376 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.376 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.376 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.378 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.379 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.379 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.381 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.381 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.381 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.383 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.383 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.383 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.385 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.385 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.385 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.386 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.386 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.386 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.388 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.388 DEBUG [PzwXp9eN] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.388 DEBUG [PzwXp9eN] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
- 15:17:45.389 DEBUG [PzwXp9eN] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.389 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.390 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.390 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580469956747265(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.390467400(LocalDateTime)
- 15:17:45.393 DEBUG [PzwXp9eN] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.393 INFO [PzwXp9eN] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
- 15:17:45.399 DEBUG [PzwXp9eN] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 27ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"PzwXp9eN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665398}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.399 DEBUG [uCg7cGwb] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.402 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.402 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.403 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.403 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.404 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.405 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.406 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.406 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.408 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.408 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.408 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.409 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.409 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.409 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.411 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.412 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.412 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.413 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.414 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.414 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.415 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.415 DEBUG [uCg7cGwb] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.416 DEBUG [uCg7cGwb] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
- 15:17:45.417 DEBUG [uCg7cGwb] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.417 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.418 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.418 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470082576385(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.418509300(LocalDateTime)
- 15:17:45.421 DEBUG [uCg7cGwb] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.421 INFO [uCg7cGwb] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
- 15:17:45.427 DEBUG [uCg7cGwb] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 28ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"uCg7cGwb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665425}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.427 DEBUG [H6CFAPV2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.430 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.430 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.432 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.432 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.432 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.434 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.434 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.434 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.436 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.436 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.436 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.438 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.438 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.438 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.440 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.440 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.440 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.442 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.442 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.442 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.443 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.443 DEBUG [H6CFAPV2] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.443 DEBUG [H6CFAPV2] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
- 15:17:45.444 DEBUG [H6CFAPV2] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.445 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.445 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.445 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470212599809(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.445349800(LocalDateTime)
- 15:17:45.447 DEBUG [H6CFAPV2] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.448 INFO [H6CFAPV2] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
- 15:17:45.453 DEBUG [H6CFAPV2] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 26ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"H6CFAPV2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665452}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.454 DEBUG [jNBZbHYt] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.457 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.457 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.458 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.459 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.459 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.460 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.460 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.461 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.463 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.463 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.463 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.464 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.464 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.465 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.466 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.466 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.466 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.469 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.469 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.469 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.470 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.471 DEBUG [jNBZbHYt] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.471 DEBUG [jNBZbHYt] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
- 15:17:45.472 DEBUG [jNBZbHYt] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.472 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.473 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.473 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470338428929(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.473396(LocalDateTime)
- 15:17:45.475 DEBUG [jNBZbHYt] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.475 INFO [jNBZbHYt] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
- 15:17:45.480 DEBUG [jNBZbHYt] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 26ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"jNBZbHYt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665480}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.481 DEBUG [aHyj6eUJ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.484 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.484 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.485 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.485 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.485 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.487 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.488 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.488 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.489 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.489 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.490 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.491 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.491 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.491 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.492 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.492 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.492 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.493 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.493 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.493 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.495 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.495 DEBUG [aHyj6eUJ] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.495 DEBUG [aHyj6eUJ] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
- 15:17:45.496 DEBUG [aHyj6eUJ] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.497 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.497 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.497 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470401343490(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.497017300(LocalDateTime)
- 15:17:45.499 DEBUG [aHyj6eUJ] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.499 INFO [aHyj6eUJ] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
- 15:17:45.557 DEBUG [aHyj6eUJ] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 76ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"aHyj6eUJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665556}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.557 DEBUG [5vHXSnzD] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.560 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.560 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.562 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.562 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.562 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.563 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.564 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.564 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.567 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.568 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.568 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.569 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.569 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.569 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.570 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.570 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.570 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.571 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.571 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.571 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.572 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.572 DEBUG [5vHXSnzD] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.572 DEBUG [5vHXSnzD] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
- 15:17:45.573 DEBUG [5vHXSnzD] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.573 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.573 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.573 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470724304898(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.573959500(LocalDateTime)
- 15:17:45.576 DEBUG [5vHXSnzD] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.576 INFO [5vHXSnzD] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
- 15:17:45.594 DEBUG [5vHXSnzD] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 37ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"5vHXSnzD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665593}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.595 DEBUG [Nfhe3Jz7] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.599 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.599 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.600 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.601 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.601 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.602 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.602 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.602 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.604 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.604 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.604 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.605 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.605 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.605 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.606 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.606 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.606 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.608 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.608 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.608 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.609 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.610 DEBUG [Nfhe3Jz7] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:45.610 DEBUG [Nfhe3Jz7] [9100] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 9100(Long)
- 15:17:45.611 DEBUG [Nfhe3Jz7] [9100] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:45.611 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.service.CrawlerService : 用户9100消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:45.611 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ? )
- 15:17:45.612 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580470917242881(Long), 9100(Long), 2026-07-02(LocalDate), 1(Integer), QUOTA(String), 2026-07-02T15:17:45.611953300(LocalDateTime)
- 15:17:45.614 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:45.614 INFO [Nfhe3Jz7] [9100] [ main] c.x.u.s.DrugSearchService : 用户 9100 搜索药物: 阿莫西林胶囊, 平台: null, 找到 3 条结果
- 15:17:45.619 DEBUG [Nfhe3Jz7] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 24ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Nfhe3Jz7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"keyword":"阿莫西林胶囊","prices":[{"platformCode":"yaoshibang","platformName":"药师帮","price":12.50,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-06","moq":10,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.yaoshibang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yaobangmang","platformName":"药帮忙","price":11.80,"spec":"0.5g*24粒/盒","manufacturer":"华北制药","expiry":"2027-03","moq":5,"stockStatus":"IN_STOCK","isLowest":true,"purchaseUrl":"https://www.yaobangmang.com/search?q=阿莫西林胶囊&ref=zhijiayun"},{"platformCode":"yiyaocheng","platformName":"1药城","price":13.20,"spec":"0.5g*24粒/盒","manufacturer":"石药集团","expiry":"2027-08","moq":1,"stockStatus":"IN_STOCK","isLowest":false,"purchaseUrl":"https://www.1yaocheng.com/search?q=阿莫西林胶囊&ref=zhijiayun"}],"lowestPrice":11.80,"lowestPricePlatform":"药帮忙","totalCount":3,"searchTime":"2026-07-02 15:17:45"},"timestamp":1782976665619}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.620 DEBUG [72SD6BXE] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.624 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.624 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.626 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.626 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.626 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.627 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.628 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.628 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.630 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.630 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.630 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.631 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.632 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.632 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.633 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.633 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.633 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.634 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.634 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.634 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.635 DEBUG [72SD6BXE] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.639 WARN [72SD6BXE] [9100] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4301, message=今日爬虫次数已用完
- 15:17:45.640 DEBUG [72SD6BXE] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 20ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"32"]
- Body = {"keyword":"阿莫西林胶囊"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"72SD6BXE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":4301,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976665639}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.640 DEBUG [BkAuupGX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query | IP: 127.0.0.1
- 15:17:45.644 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:45.644 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 9100(Long)
- 15:17:45.645 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:45.646 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:45.646 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 9100(Long)
- 15:17:45.647 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:45.648 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:45.648 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:45.649 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:45.650 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:45.650 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 9100(Long)
- 15:17:45.652 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:45.652 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:45.652 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 9100(Long)
- 15:17:45.653 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:45.654 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:45.654 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.655 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:45.655 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:45.655 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 9100(Long)
- 15:17:45.657 DEBUG [BkAuupGX] [9100] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:45.659 WARN [BkAuupGX] [9100] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4301, message=今日爬虫次数已用完
- 15:17:45.660 DEBUG [BkAuupGX] [9100] [ main] c.x.g.f.RequestLoggingFilter : POST /api/search/query 200 20ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/search/query
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjkxMDAsInN1YiI6IjkxMDAiLCJpYXQiOjE3ODI5NzY2NjUsImV4cCI6MTc4MzA2MzA2NX0.9ShCiFauyNqLCw0InU8bQQRlQno8MfZXqYCwhZ8jDZSrnbhOYGX_Lx80ApMiZGxApVPt6AYmGJdpYzzatS7FLQ", Content-Length:"29"]
- Body = {"keyword":"氯雷他定片"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#search(HttpServletRequest, SearchQueryRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"BkAuupGX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":4301,"message":"今日爬虫次数已用完","data":null,"timestamp":1782976665659}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.665 DEBUG [j8gMvGAj] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/search/suggestions | IP: 127.0.0.1
- 15:17:45.666 DEBUG [j8gMvGAj] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/search/suggestions 200 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/search/suggestions
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#suggestions()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"j8gMvGAj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":["阿莫西林胶囊","布洛芬缓释胶囊","头孢克肟分散片","奥美拉唑肠溶胶囊","硝苯地平控释片","氯雷他定片"],"timestamp":1782976665665}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:45.672 DEBUG [nXxHwhn5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/search/suggestions | IP: 127.0.0.1
- 15:17:45.673 DEBUG [nXxHwhn5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/search/suggestions 200 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/search/suggestions
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.DrugSearchController
- Method = com.xuekairui.user.controller.DrugSearchController#suggestions()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"nXxHwhn5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":["阿莫西林胶囊","布洛芬缓释胶囊","头孢克肟分散片","奥美拉唑肠溶胶囊","硝苯地平控释片","氯雷他定片"],"timestamp":1782976665673}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.559 s -- in 药品搜索接口测试
- [INFO] Running com.xuekairui.gateway.EndToEndBusinessFlowTest
- 15:17:45.677 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.EndToEndBusinessFlowTest]: EndToEndBusinessFlowTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:45.679 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.EndToEndBusinessFlowTest
- 15:17:48.786 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ========== 阶段1:用户注册 ==========
- 15:17:48.786 DEBUG [bYWTYe3a] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:17:48.787 INFO [bYWTYe3a] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
- 15:17:48.789 INFO [bYWTYe3a] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
- 15:17:48.790 DEBUG [bYWTYe3a] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 200 4ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","scene":"login"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"bYWTYe3a", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668789}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:48.790 DEBUG [MYCSc49d] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:17:48.793 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:17:48.793 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:17:48.795 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:17:48.795 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:17:48.795 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.795064300(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
- 15:17:48.798 DEBUG [MYCSc49d] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:17:48.799 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:17:48.799 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.795064300(LocalDateTime), 127.0.0.1(String), 1(Long), 19beddef6938c65c1fa71b46d57abe1883267e015858bb17ed6308cab0d6e509(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
- 15:17:48.801 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:17:48.802 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:48.802 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:48.803 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:48.804 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:48.804 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:48.805 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:48.806 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:48.806 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:48.807 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:48.808 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.808 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580484313849857(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:17:48.808331200(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.808331200(LocalDateTime)
- 15:17:48.811 DEBUG [MYCSc49d] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:48.811 DEBUG [MYCSc49d] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:17:48.817 DEBUG [MYCSc49d] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 27ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"MYCSc49d", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzNTgxNDY4fQ.5WCYP1AZKEyWvlW4jL3wCvVGi5HC61a6O641K4oloZqc_sPg8wQLzYF5aYtJ6Wvp5yK66Rwrt-0MluAWzgBuSw","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976668815}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:48.817 DEBUG [u9GUgWAV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:48.818 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:48.818 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:48.820 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:48.820 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:48.820 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:48.821 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:48.822 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:48.822 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:48.823 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:48.823 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:48.823 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:48.825 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:48.825 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:48.825 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:48.826 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:48.826 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:48.826 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:48.827 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:48.827 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:48.827 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:48.829 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:48.829 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:48.829 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:48.832 DEBUG [u9GUgWAV] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:48.832 DEBUG [u9GUgWAV] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:48.832 DEBUG [u9GUgWAV] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:48.833 DEBUG [u9GUgWAV] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:48.834 DEBUG [u9GUgWAV] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 17ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"u9GUgWAV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976668833}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:48.834 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段1完成: userId=1, 初始配额: 5次/天, 100次/月
- 15:17:48.837 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ========== 阶段2:绑定B2B平台账号 ==========
- 15:17:48.838 DEBUG [RPB5kbYL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
- 15:17:48.839 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:48.839 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:48.841 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:48.842 DEBUG [RPB5kbYL] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:17:48.842 DEBUG [RPB5kbYL] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
- 15:17:48.844 DEBUG [RPB5kbYL] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
- 15:17:48.845 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.846 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580484443873282(Long), 1(Long), yaoshibang(String), 药师帮(String), IHR5Wl+d81ZzGqPk8Ntlhg3uawhA4AWpmId6DWBTdQjQ0Z+qae1Y(String), 31h/gnEkKkkpdetkt3lyVljZ3O3STNKF5xuBwt9d5SgatZl9dxzMFBs=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:48.845656400(LocalDateTime), 2026-07-02T15:17:48.845656400(LocalDateTime)
- 15:17:48.849 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
- 15:17:48.849 INFO [RPB5kbYL] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaoshibang
- 15:17:48.855 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.855 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580484506787842(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:48.854874800(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.854874800(LocalDateTime)
- 15:17:48.860 DEBUG [RPB5kbYL] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:48.860 DEBUG [RPB5kbYL] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
- 15:17:48.860 DEBUG [RPB5kbYL] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 22ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"107"]
- Body = {"account":"13800138000","platformName":"药师帮","platformCode":"yaoshibang","password":"test_password"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"RPB5kbYL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668860}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:48.861 DEBUG [mE4g2z6A] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
- 15:17:48.867 DEBUG [mE4g2z6A] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:17:48.867 DEBUG [mE4g2z6A] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
- 15:17:48.868 DEBUG [mE4g2z6A] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
- 15:17:48.869 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.869 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580484582285314(Long), 1(Long), yaobangmang(String), 药帮忙(String), CNuPOegNewrwpdskE1blVOThy6ai2nx7jqTRTgYaSS6o43YbPCpD(String), A025jUlQHfHIV+ZkbYffaq20wOMLyzglCEqgtkq9B/eRMEzDuzkjS9Q=(String), true(Boolean), PENDING(String), 2026-07-02T15:17:48.869503700(LocalDateTime), 2026-07-02T15:17:48.869503700(LocalDateTime)
- 15:17:48.871 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
- 15:17:48.871 INFO [mE4g2z6A] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaobangmang
- 15:17:48.874 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.875 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580484582285315(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:17:48.874944200(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.874944200(LocalDateTime)
- 15:17:48.879 DEBUG [mE4g2z6A] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:48.879 DEBUG [mE4g2z6A] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
- 15:17:48.880 DEBUG [mE4g2z6A] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 19ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"108"]
- Body = {"account":"13900139000","platformName":"药帮忙","platformCode":"yaobangmang","password":"test_password"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"mE4g2z6A", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668879}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:48.881 DEBUG [ArUB5EsA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
- 15:17:48.882 DEBUG [ArUB5EsA] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
- 15:17:48.882 DEBUG [ArUB5EsA] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
- 15:17:48.884 DEBUG [ArUB5EsA] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 2
- 15:17:48.884 DEBUG [ArUB5EsA] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-account/list
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ArUB5EsA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":2072580484582285314,"platformCode":"yaobangmang","platformName":"药帮忙","account":"139****9000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:49"},{"id":2072580484443873282,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:17:49"}],"timestamp":1782976668884}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:48.885 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段2完成: 已绑定2个B2B平台
- 15:17:48.887 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ========== 阶段3:上传营业执照 ==========
- 15:17:48.888 DEBUG [ATNYRvQf] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload | IP: 127.0.0.1
- 15:17:48.889 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:48.889 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:48.891 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:48.892 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
- 15:17:48.892 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
- 15:17:48.893 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 0
- 15:17:48.894 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.insert : ==> Preparing: INSERT INTO t_business_license ( user_id, license_image_url, credit_code, pharmacy_name, legal_person, review_status, show_verified_badge, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.894 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.insert : ==> Parameters: 1(Long), https://oss.example.com/license/test.jpg(String), 91110000XXXXXXXXXX(String), 测试大药房(String), 张三(String), PENDING(String), false(Boolean), 2026-07-02T15:17:48.894812800(LocalDateTime), 2026-07-02T15:17:48.894812800(LocalDateTime)
- 15:17:48.899 DEBUG [ATNYRvQf] [1] [ main] c.x.u.m.B.insert : <== Updates: 1
- 15:17:48.900 DEBUG [ATNYRvQf] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/business-license/upload 200 12ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/business-license/upload
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"152"]
- Body = {"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.BusinessLicenseController
- Method = com.xuekairui.user.controller.BusinessLicenseController#upload(UploadRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ATNYRvQf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976668899}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:48.900 DEBUG [uqEFraqA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info | IP: 127.0.0.1
- 15:17:48.902 DEBUG [uqEFraqA] [1] [ main] c.x.u.m.B.selectByUserId : ==> Preparing: SELECT * FROM t_business_license WHERE user_id = ? LIMIT 1
- 15:17:48.902 DEBUG [uqEFraqA] [1] [ main] c.x.u.m.B.selectByUserId : ==> Parameters: 1(Long)
- 15:17:48.903 DEBUG [uqEFraqA] [1] [ main] c.x.u.m.B.selectByUserId : <== Total: 1
- 15:17:48.904 DEBUG [uqEFraqA] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/business-license/info 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/business-license/info
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.BusinessLicenseController
- Method = com.xuekairui.user.controller.BusinessLicenseController#getInfo(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"uqEFraqA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"userId":1,"licenseImageUrl":"https://oss.example.com/license/test.jpg","creditCode":"91110000XXXXXXXXXX","pharmacyName":"测试大药房","legalPerson":"张三","registeredAddress":null,"businessScope":null,"validFrom":null,"validTo":null,"reviewStatus":"PENDING","reviewerId":null,"reviewTime":null,"rejectReason":null,"showVerifiedBadge":false,"remark":null,"createTime":"2026-07-02 15:17:49","updateTime":"2026-07-02 15:17:49"},"timestamp":1782976668903}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:48.904 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段3完成: 营业执照已提交,待审核
- 15:17:48.906 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ========== 阶段4:邀请裂变 ==========
- 15:17:48.907 DEBUG [228tmmP4] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
- 15:17:48.907 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:48.907 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:48.909 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:48.911 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:17:48.911 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:48.910675900(LocalDateTime)
- 15:17:48.913 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:17:48.913 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:48.913 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:48.914 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:48.915 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
- 15:17:48.915 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 5YZ8LMEM(String)
- 15:17:48.916 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:17:48.916 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.916 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.insert : ==> Parameters: 1(Long), 5YZ8LMEM(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:17:48.914933900(LocalDateTime), 1(Integer), 2026-07-02T15:17:48.916531800(LocalDateTime), 2026-07-02T15:17:48.916531800(LocalDateTime)
- 15:17:48.920 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.insert : <== Updates: 1
- 15:17:48.920 INFO [228tmmP4] [1] [ main] c.x.i.service.InviteService : 用户 1 创建邀请码: 5YZ8LMEM
- 15:17:48.920 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:48.920 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:48.921 DEBUG [228tmmP4] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:48.922 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:48.922 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:48.923 DEBUG [228tmmP4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:48.925 DEBUG [228tmmP4] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 18ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/code
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"228tmmP4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"code":"5YZ8LMEM","inviteLink":"https://app.zhijiayun.com/api/invite/5YZ8LMEM","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:17:48","status":1,"createTime":"2026-07-02 15:17:48","shareTitle":"测试用户 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是测试用户,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/5YZ8LMEM填我的邀请码 5YZ8LMEM 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/5YZ8LMEM"},"timestamp":1782976668923}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:48.925 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 邀请码: 5YZ8LMEM
- 15:17:48.925 DEBUG [BycXFeCy] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:17:48.929 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:17:48.929 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13912345678(String)
- 15:17:48.930 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
- 15:17:48.931 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.insert : ==> Preparing: INSERT INTO t_user ( id, phone, nickname, login_source, status, role, membership_level, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.931 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.insert : ==> Parameters: 2072580484829749249(Long), 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:17:48.931019600(LocalDateTime), 2026-07-02T15:17:48.931019600(LocalDateTime)
- 15:17:48.933 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.insert : <== Updates: 1
- 15:17:48.933 INFO [BycXFeCy] [] [ main] c.x.i.l.UserRegisteredListener : 收到用户注册事件: userId=2072580484829749249, inviteCode=5YZ8LMEM
- 15:17:48.934 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:17:48.934 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : ==> Parameters: 5YZ8LMEM(String)
- 15:17:48.935 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:48.936 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:48.936 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580484829749249(Long)
- 15:17:48.936 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:48.937 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (invitee_id = ?)
- 15:17:48.937 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : ==> Parameters: 2072580484829749249(Long)
- 15:17:48.938 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:17:48.939 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:48.939 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:48.941 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:48.942 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND registered = ?)
- 15:17:48.942 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : ==> Parameters: 1(Long), 1(Integer)
- 15:17:48.944 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:17:48.944 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_relation ( inviter_id, invitee_id, invite_code_id, registered, reward_granted, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.945 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.insert : ==> Parameters: 1(Long), 2072580484829749249(Long), 1(Long), 1(Integer), 1(Integer), 1(Integer), 2026-07-02T15:17:48.944892300(LocalDateTime), 2026-07-02T15:17:48.944892300(LocalDateTime)
- 15:17:48.947 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.insert : <== Updates: 1
- 15:17:48.948 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.updateById : ==> Preparing: UPDATE t_invite_code SET user_id=?, code=?, max_uses=?, used_count=?, click_count=?, expire_time=?, status=?, create_time=?, update_time=? WHERE id=?
- 15:17:48.948 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.updateById : ==> Parameters: 1(Long), 5YZ8LMEM(String), -1(Integer), 1(Integer), 0(Integer), 2026-08-01T15:17:49(LocalDateTime), 1(Integer), 2026-07-02T15:17:49(LocalDateTime), 2026-07-02T15:17:49(LocalDateTime), 1(Long)
- 15:17:48.951 DEBUG [BycXFeCy] [] [ main] c.x.i.m.I.updateById : <== Updates: 1
- 15:17:48.951 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:48.951 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:48.952 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:48.952 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:48.952 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:48.954 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:48.954 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
- 15:17:48.954 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
- 15:17:48.955 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:17:48.956 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.956 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580484963966977(Long), 1(Long), PRO(String), INVITE(String), 2026-07-02T15:17:48.956245100(LocalDateTime), 2026-08-01T15:17:48.956245100(LocalDateTime), 1(Integer), 邀请奖励:邀请用户2072580484829749249注册(String), 2026-07-02T15:17:48.956245100(LocalDateTime), 2026-07-02T15:17:48.956245100(LocalDateTime)
- 15:17:48.958 DEBUG [BycXFeCy] [] [ main] c.x.u.m.U.insert : <== Updates: 1
- 15:17:48.958 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:17:48.959 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:48.956245100(LocalDateTime), 2026-07-02T15:17:49(LocalDateTime), 127.0.0.1(String), 1(Long), 19beddef6938c65c1fa71b46d57abe1883267e015858bb17ed6308cab0d6e509(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
- 15:17:48.961 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:17:48.961 INFO [BycXFeCy] [] [ main] c.x.u.s.MembershipService : 邀请奖励:用户1获得30天高级会员(PRO)
- 15:17:48.961 INFO [BycXFeCy] [] [ main] c.x.i.service.InviteService : 邀请奖励已发放: inviter=1, invitee=2072580484829749249, 会员=PRO/30天, 配额=0次
- 15:17:48.961 INFO [BycXFeCy] [] [ main] c.x.i.service.InviteService : 邀请成功: inviter=1, invitee=2072580484829749249
- 15:17:48.961 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, inviter_id=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:17:48.962 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 1(Long), 0(Long), 2026-07-02T15:17:49(LocalDateTime), 2026-07-02T15:17:49(LocalDateTime), 2072580484829749249(Long)
- 15:17:48.964 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:17:48.964 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:17:48.965 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.964233700(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:17:48.931019600(LocalDateTime), 2026-07-02T15:17:48.931019600(LocalDateTime), 2072580484829749249(Long)
- 15:17:48.966 DEBUG [BycXFeCy] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:17:48.968 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:17:48.968 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13912345678(String), 用户5678(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:17:48.964233700(LocalDateTime), 127.0.0.1(String), 1(Long), cb8ac91cda3091b1af1b5b555c3919acc9881bae250ffe19884beb95407c7fb9(String), ACTIVE(String), 2026-07-02T15:17:48.931019600(LocalDateTime), 2026-07-02T15:17:48.931019600(LocalDateTime), 2072580484829749249(Long)
- 15:17:48.970 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:17:48.970 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:48.970 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580484829749249(Long)
- 15:17:48.971 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:48.972 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:48.972 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580484829749249(Long)
- 15:17:48.973 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:17:48.974 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:48.974 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:48.975 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:48.975 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.975 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580485026881537(Long), 2072580484829749249(Long), 用户5678(String), USER(String), 2026-07-02T15:17:48.975628300(LocalDateTime), USER(String), REGISTER(String), 用户注册(String), USER(String), 2072580484829749249(Long), USER:2072580484829749249(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.975628300(LocalDateTime)
- 15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户注册
- 15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:48.977 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580485026881538(Long), 2072580484829749249(Long), 用户5678(String), USER(String), 2026-07-02T15:17:48.977733500(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 2072580484829749249(Long), USER:2072580484829749249(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:48.977733500(LocalDateTime)
- 15:17:48.979 DEBUG [BycXFeCy] [2072580484829749249] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:48.979 DEBUG [BycXFeCy] [2072580484829749249] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:17:48.984 DEBUG [BycXFeCy] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 59ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"63"]
- Body = {"phone":"13912345678","inviteCode":"5YZ8LMEM","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"BycXFeCy", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":2072580484829749249,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDQ4NDgyOTc0OTI0OSwic3ViIjoiMjA3MjU4MDQ4NDgyOTc0OTI0OSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.0f0sa1_nYWram4ZHRBZ0qgAyXBjstiRbbDkc2F590wa667GEuNZ3R0BE43X5oBTwWrUQZTICawZV2jax73zGKw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDQ4NDgyOTc0OTI0OSwic3ViIjoiMjA3MjU4MDQ4NDgyOTc0OTI0OSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzNTgxNDY4fQ.Vp24hmMW7FKuKnZJIeZKt44kxXsFu2Q-tKHfKxVp62If5nKwUx-J1EP7WVxZy8U00DIgdkQGr_nxqM7JYFuJ5g","expiresIn":86400,"userInfo":{"id":2072580484829749249,"phone":"139****5678","nickname":"用户5678","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:17:48","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580484829749249,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":true,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976668984}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:48.985 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段4完成: 成功邀请1位新用户
- 15:17:48.987 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ========== 阶段5:查看邀请奖励 ==========
- 15:17:48.987 DEBUG [ggDcXz9g] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
- 15:17:48.988 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:48.988 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:48.991 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:48.991 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:48.991 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:48.993 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:48.993 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:17:48.993 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:17:48.993167400(LocalDateTime)
- 15:17:48.995 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:48.995 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:17:48.995 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:17:48.996 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:48.996 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:48.996 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:48.998 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:48.999 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
- 15:17:48.999 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
- 15:17:49.000 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:17:49.001 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
- 15:17:49.001 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
- 15:17:49.003 DEBUG [ggDcXz9g] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:17:49.003 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:49.004 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:49.005 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:49.006 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:49.006 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:49.007 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
- 15:17:49.007 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:49.007 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:49.009 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:49.009 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:49.009 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:49.010 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:49.010 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:49.010 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:49.012 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:49.012 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:49.012 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:49.012 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:49.013 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:49.013 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:49.015 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:49.015 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:49.015 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:49.016 DEBUG [ggDcXz9g] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:49.016 DEBUG [ggDcXz9g] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:49.016 DEBUG [ggDcXz9g] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:49.017 DEBUG [ggDcXz9g] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:49.020 DEBUG [ggDcXz9g] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 200 33ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/stats
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ggDcXz9g", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"5YZ8LMEM","inviteLink":"https://app.zhijiayun.com/api/invite/5YZ8LMEM","clickedCount":0,"totalInvited":1,"registeredCount":1,"totalReward":1,"summaryText":"已邀请1家药店,1家注册,累计获得1个月高级会员","todayInvited":1,"todayRemaining":9,"rewardPerInvite":1,"crawlerTodayRemaining":999,"crawlerQuotaFromInvites":0},"timestamp":1782976669019}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:49.021 DEBUG [YDC3CuEG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:49.022 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:49.023 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:49.025 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:49.025 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:49.025 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:49.026 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
- 15:17:49.027 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:49.027 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:49.029 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:49.029 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:49.030 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:49.031 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:49.031 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:49.031 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:49.032 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:49.032 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:49.032 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:49.034 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:49.034 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:49.034 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:49.036 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:49.037 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:49.037 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:49.038 DEBUG [YDC3CuEG] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:49.038 DEBUG [YDC3CuEG] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:49.038 DEBUG [YDC3CuEG] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:49.039 DEBUG [YDC3CuEG] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:49.040 DEBUG [YDC3CuEG] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 19ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"YDC3CuEG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"高级会员","levelCode":"PRO","todayUsed":0,"todayQuota":999,"todayRemaining":999,"monthUsed":0,"monthQuota":29970,"monthRemaining":29970,"yearUsed":0,"yearQuota":364635,"yearRemaining":364635,"baseDailyQuota":999,"baseMonthlyQuota":29970,"baseYearlyQuota":364635,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":5,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976669039}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:49.040 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段5完成: 已获得邀请奖励
- 15:17:49.043 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ========== 阶段6:消耗配额比价 ==========
- 15:17:49.043 DEBUG [Bgz9XUNz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:17:49.043 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:49.043 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:49.046 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:49.049 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:49.049 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:49.051 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:49.051 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:49.051 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:49.053 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
- 15:17:49.053 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:49.054 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:49.055 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:49.055 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:49.055 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:49.056 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:49.056 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:49.056 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:49.057 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:49.057 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:49.057 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:49.058 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:49.059 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:49.059 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:49.059 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:49.059 DEBUG [Bgz9XUNz] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Preparing: SELECT id, quota_count, used_count, (quota_count - used_count) AS remaining FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (quota_count - used_count) > 0 AND (expire_time IS NULL OR expire_time > NOW()) ORDER BY COALESCE(expire_time, TIMESTAMP '9999-12-31 00:00:00') ASC LIMIT 1
- 15:17:49.059 DEBUG [Bgz9XUNz] [1] [ main] .m.C.findEarliestExpiringGrant : ==> Parameters: 1(Long)
- 15:17:49.060 DEBUG [Bgz9XUNz] [1] [ main] .m.C.findEarliestExpiringGrant : <== Total: 0
- 15:17:49.060 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.service.CrawlerService : 用户1消耗配额1次: 额外配额扣减0次,等级配额扣减1次
- 15:17:49.060 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.insert : ==> Preparing: INSERT INTO t_crawler_usage_log ( id, user_id, usage_date, usage_count, platform, source, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
- 15:17:49.061 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.insert : ==> Parameters: 2072580485354037249(Long), 1(Long), 2026-07-02(LocalDate), 1(Integer), yaoshibang(String), QUOTA(String), 2026-07-02T15:17:49.060619(LocalDateTime)
- 15:17:49.062 DEBUG [Bgz9XUNz] [1] [ main] c.x.u.m.C.insert : <== Updates: 1
- 15:17:49.067 DEBUG [Bgz9XUNz] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 200 24ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA", Content-Length:"35"]
- Body = {"count":1,"platform":"yaoshibang"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Bgz9XUNz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":true,"timestamp":1782976669067}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:49.068 DEBUG [33A9hQ7S] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:49.069 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:49.069 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:49.070 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:49.070 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:49.071 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:49.072 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
- 15:17:49.072 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:49.072 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:49.073 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:49.074 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:17:49.074 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:17:49.074 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:17:49.074 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:17:49.074 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:17:49.076 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:17:49.076 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:17:49.076 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:17:49.077 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:17:49.077 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:17:49.078 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:17:49.079 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:17:49.080 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:17:49.080 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:17:49.081 DEBUG [33A9hQ7S] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:17:49.081 DEBUG [33A9hQ7S] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:17:49.081 DEBUG [33A9hQ7S] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:17:49.083 DEBUG [33A9hQ7S] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:17:49.083 DEBUG [33A9hQ7S] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 15ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OCwiZXhwIjoxNzgzMDYzMDY4fQ.M0B8qN_40C0Tp-sMrG_MkEY7-ba9w_dTrUsm1QA2C3EKG2PqCKDCOHg8NYq088rG8uO4HBf1gFP4392X9uJ7IA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"33A9hQ7S", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"高级会员","levelCode":"PRO","todayUsed":1,"todayQuota":999,"todayRemaining":998,"monthUsed":1,"monthQuota":29970,"monthRemaining":29969,"yearUsed":1,"yearQuota":364635,"yearRemaining":364634,"baseDailyQuota":999,"baseMonthlyQuota":29970,"baseYearlyQuota":364635,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":5,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976669083}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:49.084 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段6完成: 消耗1次配额,剩余4次/天
- 15:17:49.087 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ========== 阶段7:管理员审核 ==========
- 15:17:49.091 DEBUG [ZHwx5Kbr] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:17:49.095 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:17:49.095 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:17:49.097 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:17:49.098 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:17:49.098 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:49(LocalDateTime), 2026-07-02T15:17:49.098235800(LocalDateTime), 127.0.0.1(String), 0(Long), 19beddef6938c65c1fa71b46d57abe1883267e015858bb17ed6308cab0d6e509(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
- 15:17:49.101 DEBUG [ZHwx5Kbr] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:17:49.102 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:17:49.102 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:17:49(LocalDateTime), 2026-07-02T15:17:49.098235800(LocalDateTime), 127.0.0.1(String), 1(Long), d6468a01aae3df5116c23a4e214bb21f443355a228f6afae09510f159cafa733(String), ACTIVE(String), 2026-07-02T15:17:48(LocalDateTime), 2026-07-02T15:17:48(LocalDateTime), 1(Long)
- 15:17:49.105 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:17:49.105 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:49.105 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:49.107 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:49.107 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:49.107 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:49.108 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
- 15:17:49.109 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:49.109 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:49.111 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:49.112 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:49.112 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580485605695490(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:17:49.111596200(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:17:49.111596200(LocalDateTime)
- 15:17:49.114 DEBUG [ZHwx5Kbr] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:17:49.114 DEBUG [ZHwx5Kbr] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:17:49.119 DEBUG [ZHwx5Kbr] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 28ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ZHwx5Kbr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzMDYzMDY5fQ.r4HvNsmZlUwmpdoEVnxz7eyEViBEEx4IroiXbt09H9Eu76mg7MS7V7RGfgghurTFmNNtSpB8V0MR_PdIZ_JwCA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzNTgxNDY5fQ.h6GF9oDhsKICOcF7zKbfEdJa0tzNSvQoBvKtZXnRvYBwDvZsj7-8sRgMg8p8MDJqX4Sj0Ksb1Y2kS58huBt7pA","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":"2026-08-01 15:17:49","membershipDaysRemaining":29,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PRO","membershipLevelName":"高级会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PRO","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976669118}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:49.119 DEBUG [4jwdDJSZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=PENDING | IP: 127.0.0.1
- 15:17:49.120 INFO [4jwdDJSZ] [1] [ main] .x.u.s.JwtAuthenticationFilter : 用户 1 的Token版本号不匹配(已在其他设备登录),拒绝访问
- 15:17:49.121 WARN [4jwdDJSZ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review?reviewStatus=PENDING 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/license/review
- Parameters = {reviewStatus=[PENDING]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"4jwdDJSZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":1304,"message":"您的账号已在其他设备登录,当前会话已失效,请重新登录","data":null,"timestamp":1782976669120}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ZHwx5Kbr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzMDYzMDY5fQ.r4HvNsmZlUwmpdoEVnxz7eyEViBEEx4IroiXbt09H9Eu76mg7MS7V7RGfgghurTFmNNtSpB8V0MR_PdIZ_JwCA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzNTgxNDY5fQ.h6GF9oDhsKICOcF7zKbfEdJa0tzNSvQoBvKtZXnRvYBwDvZsj7-8sRgMg8p8MDJqX4Sj0Ksb1Y2kS58huBt7pA","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":"2026-08-01 15:17:49","membershipDaysRemaining":29,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PRO","membershipLevelName":"高级会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PRO","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976669118}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/license/review
- Parameters = {reviewStatus=[PENDING]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"4jwdDJSZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":1304,"message":"您的账号已在其他设备登录,当前会话已失效,请重新登录","data":null,"timestamp":1782976669120}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:49.124 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ========== 阶段8:查看操作审计日志 ==========
- 15:17:49.125 DEBUG [TjEHfpJQ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
- 15:17:49.126 DEBUG [TjEHfpJQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:49.126 DEBUG [TjEHfpJQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:49.128 DEBUG [TjEHfpJQ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:49.128 INFO [TjEHfpJQ] [1] [ main] .x.u.s.JwtAuthenticationFilter : 用户 1 的Token版本号不匹配(已在其他设备登录),拒绝访问
- 15:17:49.129 WARN [TjEHfpJQ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 401 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/user/1
- Parameters = {limit=[50]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"TjEHfpJQ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":1304,"message":"您的账号已在其他设备登录,当前会话已失效,请重新登录","data":null,"timestamp":1782976669128}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/user/1
- Parameters = {limit=[50]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NjksImV4cCI6MTc4MzA2MzA2OX0.Qp3W55oPpHZXEFEZtKduqKHCEZNLPIX_-FFhYec3LD9z3G9XIOnXitFV1LL2F2FSrybOQ0ssx9Ye96V2IRERmw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"TjEHfpJQ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":1304,"message":"您的账号已在其他设备登录,当前会话已失效,请重新登录","data":null,"timestamp":1782976669128}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:49.133 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ========== 阶段9:查看完整用户信息 ==========
- 15:17:49.133 DEBUG [AttSvmWJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
- 15:17:49.133 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:49.133 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:49.135 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:49.137 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:49.137 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:49.138 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:49.139 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:49.139 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:49.140 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:49.141 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:17:49.141 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:17:49.143 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
- 15:17:49.143 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:49.143 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:49.145 DEBUG [AttSvmWJ] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:49.145 DEBUG [AttSvmWJ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 200 12ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY2OSwiZXhwIjoxNzgzMDYzMDY5fQ.r4HvNsmZlUwmpdoEVnxz7eyEViBEEx4IroiXbt09H9Eu76mg7MS7V7RGfgghurTFmNNtSpB8V0MR_PdIZ_JwCA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"AttSvmWJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":"2026-08-01 15:17:49","membershipDaysRemaining":29,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},"createTime":"2026-07-02 15:17:48","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PRO","membershipLevelName":"高级会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PRO","version":null},"timestamp":1782976669145}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:49.146 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段9完成: 用户信息完整
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ========== ? 端到端业务流程测试完成 ==========
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段1: 用户注册 - 完成
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段2: 绑定B2B平台账号 - 完成
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段3: 上传营业执照 - 完成
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段4: 邀请裂变 - 完成
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段5: 获得邀请奖励 - 完成
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段6: 消耗配额比价 - 完成
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段7: 管理员审核 - 完成
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段8: 操作审计日志 - 完成
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : ? 阶段9: 用户完整信息 - 完成
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ? 测试覆盖:
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 用户认证流程 ?
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - B2B平台账号绑定 ?
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 营业执照上传 ?
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 邀请裂变系统 ?
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 配额管理 ?
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 操作审计日志 ?
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest : - 多端支持字段 ?
- 15:17:49.149 INFO [] [] [ main] c.x.g.EndToEndBusinessFlowTest :
- ? 全流程测试通过!
- [ERROR] Tests run: 10, Failures: 2, Errors: 0, Skipped: 0, Time elapsed: 3.475 s <<< FAILURE! -- in com.xuekairui.gateway.EndToEndBusinessFlowTest
- [ERROR] com.xuekairui.gateway.EndToEndBusinessFlowTest.stage7_AdminReviewLicense -- Time elapsed: 0.037 s <<< FAILURE!
- java.lang.AssertionError: Status expected:<200> but was:<401>
- at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:61)
- at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:128)
- at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:640)
- at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)
- at com.xuekairui.gateway.EndToEndBusinessFlowTest.stage7_AdminReviewLicense(EndToEndBusinessFlowTest.java:264)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- [ERROR] com.xuekairui.gateway.EndToEndBusinessFlowTest.stage8_CheckAuditLogs -- Time elapsed: 0.008 s <<< FAILURE!
- java.lang.AssertionError: Status expected:<200> but was:<401>
- at org.springframework.test.util.AssertionErrors.fail(AssertionErrors.java:61)
- at org.springframework.test.util.AssertionErrors.assertEquals(AssertionErrors.java:128)
- at org.springframework.test.web.servlet.result.StatusResultMatchers.lambda$matcher$9(StatusResultMatchers.java:640)
- at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:214)
- at com.xuekairui.gateway.EndToEndBusinessFlowTest.stage8_CheckAuditLogs(EndToEndBusinessFlowTest.java:295)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- [INFO] Running 文件上传接口测试
- 15:17:49.153 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.FileUploadControllerTest]: FileUploadControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:49.156 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.FileUploadControllerTest
- . ____ _ __ _ _
- /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
- ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
- \\/ ___)| |_)| | | | | || (_| | ) ) ) )
- ' |____| .__|_| |_|_| |_\__, | / / / /
- =========|_|==============|___/=/_/_/_/
- :: Spring Boot :: (v3.5.14)
- 15:17:49.185 INFO [] [] [ main] c.x.g.FileUploadControllerTest : Starting FileUploadControllerTest using Java 17.0.17 with PID 37656 (started by geloger in D:\project\zhijiayun-pharmacy\zhijiayun-gateway)
- 15:17:49.185 DEBUG [] [] [ main] c.x.g.FileUploadControllerTest : Running with Spring Boot v3.5.14, Spring v6.2.18
- 15:17:49.186 INFO [] [] [ main] c.x.g.FileUploadControllerTest : The following 1 profile is active: "test"
- 15:17:49.553 INFO [] [] [ main] epositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode
- 15:17:49.553 INFO [] [] [ main] epositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
- 15:17:49.567 INFO [] [] [ main] epositoryConfigurationDelegate : Finished Spring Data repository scanning in 12 ms. Found 0 Redis repository interfaces.
- _ _ |_ _ _|_. ___ _ | _
- | | |\/|_)(_| | |_\ |_)||_|_\
- / |
- 3.5.16
- 15:17:49.957 INFO [] [] [ main] c.x.u.service.AliyunSmsClient : 阿里云短信客户端初始化成功,端点: dysmsapi.aliyuncs.com
- 15:17:50.211 INFO [] [] [ main] c.z.hikari.HikariDataSource : HikariPool-2 - Starting...
- 15:17:50.226 INFO [] [] [ main] c.z.hikari.pool.HikariPool : HikariPool-2 - Added connection com.mysql.cj.jdbc.ConnectionImpl@31e8949d
- 15:17:50.226 INFO [] [] [ main] c.z.hikari.HikariDataSource : HikariPool-2 - Start completed.
- [DB-INIT] Test database initialized successfully
- 15:17:51.475 INFO [] [] [ main] .b.a.e.w.EndpointLinksResolver : Exposing 1 endpoint beneath base path '/actuator'
- 15:17:51.484 WARN [] [] [ main] etailsServiceAutoConfiguration :
- Using generated security password: c6536c9b-8164-4a99-b1f7-1b03cfb2ee55
- This generated password is for development use only. Your security configuration must be updated before running your application in production.
- 15:17:51.485 INFO [] [] [ main] zeUserDetailsManagerConfigurer : Global AuthenticationManager configured with UserDetailsService bean with name inMemoryUserDetailsManager
- 15:17:51.535 INFO [] [] [ main] tisPlusApplicationContextAware : Register ApplicationContext instances org.springframework.web.context.support.GenericWebApplicationContext@6288199
- 15:17:51.577 DEBUG [] [] [ main] c.x.g.f.RequestLoggingFilter : Filter 'requestLoggingFilter' configured for use
- 15:17:51.577 DEBUG [] [] [ main] c.x.g.filter.RateLimitFilter : Filter 'rateLimitFilter' configured for use
- 15:17:51.577 DEBUG [] [] [ main] .x.u.s.JwtAuthenticationFilter : Filter 'jwtAuthenticationFilter' configured for use
- 15:17:51.577 INFO [] [] [ main] w.SpringBootMockServletContext : Initializing Spring TestDispatcherServlet ''
- 15:17:51.577 INFO [] [] [ main] .s.t.w.s.TestDispatcherServlet : Initializing Servlet ''
- 15:17:51.577 INFO [] [] [ main] .s.t.w.s.TestDispatcherServlet : Completed initialization in 0 ms
- 15:17:51.626 INFO [] [] [ main] c.x.g.FileUploadControllerTest : Started FileUploadControllerTest in 2.465 seconds (process running for 50.372)
- 15:17:51.629 DEBUG [C4jWrYkF] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Preparing: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
- 15:17:51.630 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (role = ?) LIMIT 1
- 15:17:51.630 DEBUG [C4jWrYkF] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Parameters: 2026-07-02T15:17:51.629687600(LocalDateTime)
- 15:17:51.630 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: SUPER_ADMIN(String)
- 15:17:51.632 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
- 15:17:51.633 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (nickname = ?)
- 15:17:51.633 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: admin(String)
- 15:17:51.633 DEBUG [C4jWrYkF] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : <== Total: 0
- 15:17:51.635 DEBUG [] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
- 15:17:51.687 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : ==> Preparing: INSERT INTO t_user ( id, nickname, password, status, role, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
- 15:17:51.687 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : ==> Parameters: 2072580496406028290(Long), admin(String), $2a$10$yPk9rdR/zrI0I/ud9iBbfOLnunqAfNgSnWyVrXbFo.GgkrKLdyALC(String), 1(Integer), SUPER_ADMIN(String), 0(Long), 2026-07-02T15:17:51.687287300(LocalDateTime), 2026-07-02T15:17:51.687287300(LocalDateTime)
- 15:17:51.693 DEBUG [] [] [ main] c.x.u.m.UserMapper.insert : <== Updates: 1
- 15:17:51.693 INFO [] [] [ main] c.x.u.c.SuperAdminInitializer : 已创建默认超级管理员,用户名:admin,默认密码:admin@123,请尽快修改默认密码
- 15:17:54.790 DEBUG [ZvAcFqUS] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload | IP: 127.0.0.1
- 15:17:54.791 DEBUG [ZvAcFqUS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:54.792 DEBUG [ZvAcFqUS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:54.794 DEBUG [ZvAcFqUS] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:54.799 INFO [ZvAcFqUS] [1] [ main] c.x.u.c.FileUploadController : 文件上传成功: C:\Users\gelog\AppData\Local\Temp\zhijiayun-test-uploads\dbe0fd8be26e428c98f39b5fa9d58ae3.jpg
- 15:17:54.801 DEBUG [ZvAcFqUS] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload 200 11ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/upload
- Parameters = {}
- Headers = [Content-Type:"multipart/form-data;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NzQsImV4cCI6MTc4MzA2MzA3NH0.M47hd8jsKV1dCZu8a-JVsyxR6hEjf0G_MP2vFaV4rd0FiUcNy7dd_znWpY_0PSWwstW8FKnDi60VpJnebrCg9g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.FileUploadController
- Method = com.xuekairui.user.controller.FileUploadController#upload(MultipartFile)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ZvAcFqUS", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":"/opt/uploads/dbe0fd8be26e428c98f39b5fa9d58ae3.jpg","timestamp":1782976674799}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:54.807 DEBUG [thjgHf26] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload | IP: 127.0.0.1
- 15:17:54.810 DEBUG [thjgHf26] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:54.811 DEBUG [thjgHf26] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:54.812 DEBUG [thjgHf26] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:54.813 DEBUG [thjgHf26] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload 200 6ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/upload
- Parameters = {}
- Headers = [Content-Type:"multipart/form-data;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NzQsImV4cCI6MTc4MzA2MzA3NH0.M47hd8jsKV1dCZu8a-JVsyxR6hEjf0G_MP2vFaV4rd0FiUcNy7dd_znWpY_0PSWwstW8FKnDi60VpJnebrCg9g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.FileUploadController
- Method = com.xuekairui.user.controller.FileUploadController#upload(MultipartFile)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"thjgHf26", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"文件不能为空","data":null,"timestamp":1782976674813}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:54.818 DEBUG [ZYAMBxnT] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload | IP: 127.0.0.1
- 15:17:54.819 WARN [ZYAMBxnT] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload 401 1ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/upload
- Parameters = {}
- Headers = [Content-Type:"multipart/form-data;charset=UTF-8"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"ZYAMBxnT", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976674819}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:54.825 DEBUG [rUC79meH] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload | IP: 127.0.0.1
- 15:17:54.826 DEBUG [rUC79meH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:17:54.826 DEBUG [rUC79meH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:17:54.828 DEBUG [rUC79meH] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:17:54.830 INFO [rUC79meH] [1] [ main] c.x.u.c.FileUploadController : 文件上传成功: C:\Users\gelog\AppData\Local\Temp\zhijiayun-test-uploads\98c2777f9e064f098b1a718ac14a8a46.png
- 15:17:54.830 DEBUG [rUC79meH] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/upload 200 5ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/upload
- Parameters = {}
- Headers = [Content-Type:"multipart/form-data;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2NzQsImV4cCI6MTc4MzA2MzA3NH0.M47hd8jsKV1dCZu8a-JVsyxR6hEjf0G_MP2vFaV4rd0FiUcNy7dd_znWpY_0PSWwstW8FKnDi60VpJnebrCg9g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.FileUploadController
- Method = com.xuekairui.user.controller.FileUploadController#upload(MultipartFile)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"rUC79meH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":"/opt/uploads/98c2777f9e064f098b1a718ac14a8a46.png","timestamp":1782976674830}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.682 s -- in 文件上传接口测试
- [INFO] Running 网关过滤器测试
- 15:17:54.835 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest]: GatewayFilterTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:54.837 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest
- [INFO] Running 客户端IP提取
- 15:17:57.984 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$ClientIpTests]: ClientIpTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:57.986 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$ClientIpTests
- 15:17:57.994 DEBUG [7a3xWaS9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 192.168.1.1
- 15:17:57.996 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:57.996 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:57.998 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:57.999 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:57.999 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.001 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.002 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.002 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.003 DEBUG [7a3xWaS9] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.005 DEBUG [7a3xWaS9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 11ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = [X-Forwarded-For:"192.168.1.1, 10.0.0.1, 172.16.0.1"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"7a3xWaS9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678003}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.011 DEBUG [2DnDVeMg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 10.0.0.1
- 15:17:58.013 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.013 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.015 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.016 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.016 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.018 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.018 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.018 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.021 DEBUG [2DnDVeMg] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.023 DEBUG [2DnDVeMg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 12ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = [X-Real-IP:"10.0.0.1"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"2DnDVeMg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678021}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.029 DEBUG [Bgk8sF7K] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 192.168.1.100
- 15:17:58.030 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.030 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.032 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.033 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.033 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.035 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.035 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.036 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.037 DEBUG [Bgk8sF7K] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.038 DEBUG [Bgk8sF7K] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = [X-Forwarded-For:"192.168.1.100"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Bgk8sF7K", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678037}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.059 s -- in 客户端IP提取
- [INFO] Running 统一响应格式
- 15:17:58.043 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$ResponseFormatTests]: ResponseFormatTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:58.046 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$ResponseFormatTests
- 15:17:58.053 DEBUG [xa3kUkhJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.054 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.055 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.056 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.057 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.058 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.059 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.060 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.060 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.061 DEBUG [xa3kUkhJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.062 DEBUG [xa3kUkhJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"xa3kUkhJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678061}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.068 DEBUG [hdN9Z4K6] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:58.069 WARN [hdN9Z4K6] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"hdN9Z4K6", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976678068}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.075 DEBUG [7RYf83cy] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/nonexistent | IP: 127.0.0.1
- 15:17:58.077 WARN [7RYf83cy] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/nonexistent 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/nonexistent
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"7RYf83cy", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976678077}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.038 s -- in 统一响应格式
- [INFO] Running 限流过滤器
- 15:17:58.081 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$RateLimitTests]: RateLimitTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:58.084 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$RateLimitTests
- 15:17:58.091 DEBUG [Uv2EkXtw] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:58.092 WARN [Uv2EkXtw] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"Uv2EkXtw", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976678092}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.099 DEBUG [p3ygLaJb] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.100 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.100 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.102 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.102 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.103 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.105 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.106 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.106 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.108 DEBUG [p3ygLaJb] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.108 DEBUG [p3ygLaJb] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"p3ygLaJb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678108}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.110 DEBUG [zW4VLH36] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.111 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.111 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.113 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.114 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.114 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.115 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.116 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.116 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.118 DEBUG [zW4VLH36] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.119 DEBUG [zW4VLH36] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"zW4VLH36", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678118}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.120 DEBUG [yruUE7xc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.121 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.121 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.123 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.124 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.124 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.125 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.126 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.126 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.128 DEBUG [yruUE7xc] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.129 DEBUG [yruUE7xc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"yruUE7xc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678128}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.129 DEBUG [Pscp8ufJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.130 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.130 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.132 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.133 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.133 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.135 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.136 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.136 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.137 DEBUG [Pscp8ufJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.138 DEBUG [Pscp8ufJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Pscp8ufJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678138}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.139 DEBUG [BBSJP5qq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.140 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.140 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.142 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.143 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.143 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.145 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.145 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.145 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.148 DEBUG [BBSJP5qq] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.149 DEBUG [BBSJP5qq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"BBSJP5qq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678148}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.149 DEBUG [JdF4V9mk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.150 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.150 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.152 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.153 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.153 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.155 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.156 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.156 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.158 DEBUG [JdF4V9mk] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.158 DEBUG [JdF4V9mk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"JdF4V9mk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678158}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.159 DEBUG [pJsDHaRC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.160 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.160 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.162 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.163 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.163 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.165 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.166 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.166 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.168 DEBUG [pJsDHaRC] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.169 DEBUG [pJsDHaRC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"pJsDHaRC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678168}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.170 DEBUG [3hLe6hnB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.171 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.171 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.173 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.174 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.174 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.176 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.177 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.177 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.179 DEBUG [3hLe6hnB] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.180 DEBUG [3hLe6hnB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"3hLe6hnB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678179}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.180 DEBUG [ffkk5bQG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.181 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.181 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.183 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.184 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.184 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.185 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.186 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.186 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.188 DEBUG [ffkk5bQG] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.189 DEBUG [ffkk5bQG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ffkk5bQG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678188}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.189 DEBUG [MYWZMV3q] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.192 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.192 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.193 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.194 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.194 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.196 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.196 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.196 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.199 DEBUG [MYWZMV3q] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.199 DEBUG [MYWZMV3q] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"MYWZMV3q", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678199}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.206 DEBUG [nhTNb26q] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.208 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.208 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.209 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.211 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.211 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.213 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.213 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.214 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.215 DEBUG [nhTNb26q] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.216 DEBUG [nhTNb26q] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"nhTNb26q", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678215}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.223 DEBUG [jZUeVZ8b] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.224 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.224 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.226 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.227 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.227 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.229 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.229 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.229 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.231 DEBUG [jZUeVZ8b] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.232 DEBUG [jZUeVZ8b] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"jZUeVZ8b", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678231}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.239 DEBUG [JabjFpFd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.241 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.241 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.244 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.244 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.244 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.247 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.248 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.248 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.250 DEBUG [JabjFpFd] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.251 DEBUG [JabjFpFd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 12ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"JabjFpFd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678250}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.262 DEBUG [3N8ff9CB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.264 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.265 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.267 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.268 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.268 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.270 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.271 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.271 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.274 DEBUG [3N8ff9CB] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.275 DEBUG [3N8ff9CB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 13ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"3N8ff9CB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678274}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.198 s -- in 限流过滤器
- [INFO] Running 请求日志过滤器
- 15:17:58.280 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GatewayFilterTest$RequestLoggingTests]: RequestLoggingTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:58.283 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GatewayFilterTest$RequestLoggingTests
- 15:17:58.293 DEBUG [fxBgz3Kt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.296 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.296 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.299 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.300 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.300 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.302 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.303 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.303 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.306 DEBUG [fxBgz3Kt] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.306 DEBUG [fxBgz3Kt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 13ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"fxBgz3Kt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678306}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.316 DEBUG [UR33DKbL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:17:58.317 INFO [UR33DKbL] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
- 15:17:58.320 INFO [UR33DKbL] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
- 15:17:58.321 DEBUG [UR33DKbL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 200 5ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","scene":"login"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"UR33DKbL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976678320}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.328 DEBUG [vASvXfKM] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.329 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.331 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.334 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.335 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.336 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.338 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.338 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.338 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.341 DEBUG [vASvXfKM] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.342 DEBUG [vASvXfKM] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 14ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"vASvXfKM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678341}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.343 DEBUG [zbu5FgQG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.345 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.345 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.348 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.349 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.349 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.352 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.353 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.353 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.356 DEBUG [zbu5FgQG] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.357 DEBUG [zbu5FgQG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 14ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"zbu5FgQG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678356}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.377 DEBUG [my-custom-id-123] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:17:58.379 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.379 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:17:58.381 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:17:58.382 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.382 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:17:58.384 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.385 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:17:58.385 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:17:58.387 DEBUG [my-custom-id-123] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:17:58.388 DEBUG [my-custom-id-123] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 11ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = [X-Request-Id:"my-custom-id-123"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"my-custom-id-123", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976678387}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:17:58.395 DEBUG [aZsjEREt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:17:58.396 WARN [aZsjEREt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"aZsjEREt", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976678395}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.121 s -- in 请求日志过滤器
- [INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.565 s -- in 网关过滤器测试
- [INFO] Running 全局异常处理测试
- 15:17:58.403 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest]: GlobalExceptionHandlerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:17:58.410 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest
- [INFO] Running 边界场景
- 15:18:01.631 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$EdgeCases]: EdgeCases does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:01.633 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$EdgeCases
- 15:18:01.636 DEBUG [82LJjFHK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:18:01.637 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.637 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:01.639 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:01.640 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.640 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:18:01.641 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.642 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.642 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:18:01.643 DEBUG [82LJjFHK] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.643 DEBUG [82LJjFHK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"82LJjFHK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681643}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.644 DEBUG [a7ZFHHPP] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:18:01.644 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.644 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:01.646 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:01.647 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.647 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:18:01.648 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.649 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.649 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:18:01.650 DEBUG [a7ZFHHPP] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.652 DEBUG [a7ZFHHPP] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"a7ZFHHPP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681651}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.652 DEBUG [eBQZCayY] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:18:01.652 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.653 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:01.655 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:01.655 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.655 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:18:01.657 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.657 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.657 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:18:01.659 DEBUG [eBQZCayY] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.660 DEBUG [eBQZCayY] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"eBQZCayY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681659}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.660 DEBUG [GLPKjQMh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:18:01.661 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.661 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:01.663 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:01.663 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.663 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:18:01.665 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.666 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.666 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:18:01.668 DEBUG [GLPKjQMh] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.668 DEBUG [GLPKjQMh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"GLPKjQMh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681668}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.669 DEBUG [Z7q9PwEe] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:18:01.670 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.670 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:01.672 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:01.672 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.673 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:18:01.674 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.675 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.675 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:18:01.677 DEBUG [Z7q9PwEe] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.677 DEBUG [Z7q9PwEe] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Z7q9PwEe", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681677}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.680 DEBUG [s8aKUJf7] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TEST%2520CODE | IP: 127.0.0.1
- 15:18:01.682 WARN [s8aKUJf7] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TEST%2520CODE 400 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/page/TEST%2520CODE
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"s8aKUJf7"]
- Content type = null
- Body =
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.686 DEBUG [UWStuhxT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | IP: 127.0.0.1
- 15:18:01.688 DEBUG [UWStuhxT] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:01.688 DEBUG [UWStuhxT] [] [ main] c.x.i.m.I.selectList : ==> Parameters: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA(String)
- 15:18:01.691 DEBUG [UWStuhxT] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:01.692 WARN [UWStuhxT] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
- 15:18:01.692 DEBUG [UWStuhxT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 200 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/page/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"UWStuhxT", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976681692}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.064 s -- in 边界场景
- [INFO] Running 统一响应格式
- 15:18:01.696 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$ResponseFormat]: ResponseFormat does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:01.698 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$ResponseFormat
- 15:18:01.702 DEBUG [gB2Dcbsq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:18:01.702 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.703 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:01.705 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:01.706 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.706 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:18:01.708 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.709 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.709 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:18:01.711 DEBUG [gB2Dcbsq] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.712 DEBUG [gB2Dcbsq] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"gB2Dcbsq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681711}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.717 DEBUG [Q7mNc7h5] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:18:01.718 WARN [Q7mNc7h5] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号格式不正确, 场景不能为空
- 15:18:01.719 WARN [Q7mNc7h5] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"13"]
- Body = {"phone":"1"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"Q7mNc7h5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"手机号格式不正确, 场景不能为空","data":null,"timestamp":1782976681718}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.723 DEBUG [K3bgRYWJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:18:01.725 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.725 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:01.726 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:01.728 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.728 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:18:01.729 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.730 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.730 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:18:01.732 DEBUG [K3bgRYWJ] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.733 DEBUG [K3bgRYWJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"K3bgRYWJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681732}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.738 DEBUG [vu3EJJLj] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:18:01.740 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.740 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:01.741 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:01.743 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.743 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:18:01.745 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.745 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:01.746 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:18:01.748 DEBUG [vu3EJJLj] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:01.749 DEBUG [vu3EJJLj] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 11ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"vu3EJJLj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976681748}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.056 s -- in 统一响应格式
- [INFO] Running 认证异常 (401)
- 15:18:01.754 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$AuthenticationExceptions]: AuthenticationExceptions does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:01.756 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$AuthenticationExceptions
- 15:18:01.760 DEBUG [jQ7YSutZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:18:01.761 WARN [jQ7YSutZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"jQ7YSutZ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976681761}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.767 DEBUG [jGEGfMWX] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:18:01.768 WARN [jGEGfMWX] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Malformed protected header JSON: Unable to deserialize: Unrecognized token 'i': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
- at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
- 15:18:01.768 WARN [jGEGfMWX] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析Token失败, 原因: Malformed protected header JSON: Unable to deserialize: Unrecognized token 'i': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
- at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
- 15:18:01.768 WARN [jGEGfMWX] [] [ main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
- 15:18:01.769 WARN [jGEGfMWX] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer abc.def.ghi"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"jGEGfMWX", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976681769}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.775 DEBUG [BxNrnwCr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:18:01.777 WARN [BxNrnwCr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"BxNrnwCr", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976681776}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.781 DEBUG [DJRDjV5m] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:18:01.783 WARN [DJRDjV5m] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Basic dXNlcjpwYXNz"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"DJRDjV5m", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976681782}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.033 s -- in 认证异常 (401)
- [INFO] Running 参数校验异常 (400)
- 15:18:01.787 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.GlobalExceptionHandlerTest$ValidationExceptions]: ValidationExceptions does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:01.790 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.GlobalExceptionHandlerTest$ValidationExceptions
- 15:18:01.797 DEBUG [xa6UhSuN] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:18:01.798 DEBUG [xa6UhSuN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:01.798 DEBUG [xa6UhSuN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:01.800 DEBUG [xa6UhSuN] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:01.801 WARN [xa6UhSuN] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 消耗次数至少为1
- 15:18:01.803 WARN [xa6UhSuN] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 400 6ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODEsImV4cCI6MTc4MzA2MzA4MX0.p0KvkGgRxGVtNrnhB_xgvB9NCZFBiuPuWl_POrChFlndlMFMbZLYrs_Zvqcm4pRQrnKd2ZJ0FvE7fJTv1VMlMA", Content-Length:"12"]
- Body = {"count":-5}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"xa6UhSuN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976681802}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.807 DEBUG [4CsxYX99] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:18:01.810 WARN [4CsxYX99] [] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 手机号格式不正确, 场景不能为空
- 15:18:01.811 WARN [4CsxYX99] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 4ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"15"]
- Body = {"phone":"123"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"4CsxYX99", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"手机号格式不正确, 场景不能为空","data":null,"timestamp":1782976681810}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.818 DEBUG [RrFDkwJ5] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:18:01.819 DEBUG [RrFDkwJ5] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:01.819 DEBUG [RrFDkwJ5] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:01.822 DEBUG [RrFDkwJ5] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:01.824 ERROR [RrFDkwJ5] [1] [ main] c.x.h.GlobalExceptionHandler : 系统异常
- org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'text/plain;charset=UTF-8' is not supported
- at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:236)
- at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:176)
- at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:150)
- at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)
- at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:227)
- at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:181)
- at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
- at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)
- at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)
- at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
- at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
- at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
- at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
- at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914)
- at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
- at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
- at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
- at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
- at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
- at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
- at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
- at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
- at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
- at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
- at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
- at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
- at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
- at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
- at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
- at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
- at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
- at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
- at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
- at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
- at com.xuekairui.gateway.GlobalExceptionHandlerTest$ValidationExceptions.wrongContentType_shouldReturnError(GlobalExceptionHandlerTest.java:70)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
- at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
- at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
- at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
- at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
- at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
- at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
- at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
- at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
- at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
- at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
- at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
- at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
- at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
- at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
- at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
- at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
- at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
- at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
- at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
- at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
- at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
- 15:18:01.829 WARN [RrFDkwJ5] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 500 11ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"text/plain;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODEsImV4cCI6MTc4MzA2MzA4MX0.p0KvkGgRxGVtNrnhB_xgvB9NCZFBiuPuWl_POrChFlndlMFMbZLYrs_Zvqcm4pRQrnKd2ZJ0FvE7fJTv1VMlMA", Content-Length:"8"]
- Body = not json
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.HttpMediaTypeNotSupportedException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 500
- Error message = null
- Headers = [X-Request-Id:"RrFDkwJ5", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":500,"message":"系统繁忙,请稍后重试","data":null,"timestamp":1782976681827}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.836 DEBUG [qMHSGzTE] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:18:01.837 DEBUG [qMHSGzTE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:01.837 DEBUG [qMHSGzTE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:01.839 DEBUG [qMHSGzTE] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:01.841 WARN [qMHSGzTE] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 消耗次数至少为1
- 15:18:01.841 WARN [qMHSGzTE] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 400 5ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODEsImV4cCI6MTc4MzA2MzA4MX0.p0KvkGgRxGVtNrnhB_xgvB9NCZFBiuPuWl_POrChFlndlMFMbZLYrs_Zvqcm4pRQrnKd2ZJ0FvE7fJTv1VMlMA", Content-Length:"11"]
- Body = {"count":0}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#consumeQuota(HttpServletRequest, CrawlerConsumeRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"qMHSGzTE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"消耗次数至少为1","data":null,"timestamp":1782976681841}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:01.845 DEBUG [6zhpy9Xw] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:18:01.847 WARN [6zhpy9Xw] [] [ main] c.x.h.GlobalExceptionHandler : 请求体解析失败: JSON parse error: Unexpected character ('n' (code 110)): was expecting double-quote to start field name
- 15:18:01.847 WARN [6zhpy9Xw] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 400 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"16"]
- Body = {not valid json}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.http.converter.HttpMessageNotReadableException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"6zhpy9Xw", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"请求体格式错误","data":null,"timestamp":1782976681847}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.064 s -- in 参数校验异常 (400)
- [INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.450 s -- in 全局异常处理测试
- [INFO] Running 邀请系统接口测试
- 15:18:01.853 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.InviteControllerTest]: InviteControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:01.855 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.InviteControllerTest
- 15:18:04.878 DEBUG [t8jxGE82] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
- 15:18:04.879 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:04.879 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:04.881 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:04.882 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:18:04.882 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.882059(LocalDateTime)
- 15:18:04.884 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:04.884 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:04.884 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:04.886 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.886 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
- 15:18:04.886 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 4FQ2CNX5(String)
- 15:18:04.888 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:18:04.888 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:04.888 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.insert : ==> Parameters: 1(Long), 4FQ2CNX5(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:18:04.886075800(LocalDateTime), 1(Integer), 2026-07-02T15:18:04.888180200(LocalDateTime), 2026-07-02T15:18:04.888180200(LocalDateTime)
- 15:18:04.892 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.insert : <== Updates: 1
- 15:18:04.892 INFO [t8jxGE82] [1] [ main] c.x.i.service.InviteService : 用户 1 创建邀请码: 4FQ2CNX5
- 15:18:04.892 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:04.892 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:04.894 DEBUG [t8jxGE82] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.895 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:04.895 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:04.896 DEBUG [t8jxGE82] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:04.897 DEBUG [t8jxGE82] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 19ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/code
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"t8jxGE82", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:04","status":1,"createTime":"2026-07-02 15:18:04","shareTitle":"测试用户 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是测试用户,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976684896}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:04.900 DEBUG [DXtQgWnK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
- 15:18:04.902 WARN [DXtQgWnK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/code
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"DXtQgWnK", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976684901}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:04.907 DEBUG [ms7qEhtr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
- 15:18:04.908 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:04.908 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:04.910 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:04.911 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:18:04.911 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.910778700(LocalDateTime)
- 15:18:04.913 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.913 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:04.913 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:04.915 DEBUG [ms7qEhtr] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.915 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:04.915 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:04.917 DEBUG [ms7qEhtr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:04.917 DEBUG [ms7qEhtr] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/code
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ms7qEhtr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:05","status":1,"createTime":"2026-07-02 15:18:05","shareTitle":"测试用户 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是测试用户,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976684917}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:04.918 DEBUG [vFjG7xL6] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
- 15:18:04.919 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:18:04.919 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.919419900(LocalDateTime)
- 15:18:04.922 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.922 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:04.922 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:04.923 DEBUG [vFjG7xL6] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.923 DEBUG [vFjG7xL6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:04.923 DEBUG [vFjG7xL6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:04.924 DEBUG [vFjG7xL6] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:04.925 DEBUG [vFjG7xL6] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/code
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"vFjG7xL6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:05","status":1,"createTime":"2026-07-02 15:18:05","shareTitle":"测试用户 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是测试用户,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976684925}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:04.932 DEBUG [aHfVySED] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
- 15:18:04.933 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:04.933 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:04.935 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:04.935 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:04.935 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:04.937 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.937 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:18:04.938 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.937288900(LocalDateTime)
- 15:18:04.939 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.939 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:04.940 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:04.941 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.941 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:04.941 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:04.943 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:04.943 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
- 15:18:04.943 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
- 15:18:04.945 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:04.946 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
- 15:18:04.946 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
- 15:18:04.948 DEBUG [aHfVySED] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:18:04.948 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:04.948 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:04.950 DEBUG [aHfVySED] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:04.950 DEBUG [aHfVySED] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:04.950 DEBUG [aHfVySED] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:04.952 DEBUG [aHfVySED] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:04.953 DEBUG [aHfVySED] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:04.953 DEBUG [aHfVySED] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:04.954 DEBUG [aHfVySED] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:04.955 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:18:04.955 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:18:04.957 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:18:04.957 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:18:04.958 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:18:04.959 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:18:04.960 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:18:04.960 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:18:04.961 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:18:04.961 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:18:04.961 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:18:04.963 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:18:04.964 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:18:04.964 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:18:04.965 DEBUG [aHfVySED] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:18:04.965 DEBUG [aHfVySED] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:18:04.966 DEBUG [aHfVySED] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:18:04.966 DEBUG [aHfVySED] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:18:04.967 DEBUG [aHfVySED] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 200 35ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/stats
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"aHfVySED", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","clickedCount":0,"totalInvited":0,"registeredCount":0,"totalReward":0,"summaryText":"已邀请0家药店,0家注册,累计获得0个月高级会员","todayInvited":0,"todayRemaining":10,"rewardPerInvite":1,"crawlerTodayRemaining":10,"crawlerQuotaFromInvites":0},"timestamp":1782976684967}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:04.973 DEBUG [aSqdxCzJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
- 15:18:04.974 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:04.974 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:04.977 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:04.978 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:04.978 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:04.979 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.980 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:18:04.981 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:04.980207700(LocalDateTime)
- 15:18:04.982 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.982 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:04.983 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:04.984 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:04.985 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:04.985 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:04.986 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:04.986 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
- 15:18:04.987 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
- 15:18:04.988 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:04.988 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
- 15:18:04.988 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
- 15:18:04.992 DEBUG [aSqdxCzJ] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:18:04.992 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:04.992 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:04.994 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:04.994 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:04.994 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:04.996 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:04.996 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:04.997 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:04.998 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:04.998 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:18:04.998 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:18:04.999 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:18:04.999 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:18:04.999 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:18:05.001 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:18:05.001 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:18:05.001 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:18:05.002 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:18:05.003 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:18:05.003 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:18:05.004 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:18:05.004 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:18:05.004 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:18:05.006 DEBUG [aSqdxCzJ] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:18:05.006 DEBUG [aSqdxCzJ] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:18:05.006 DEBUG [aSqdxCzJ] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:18:05.007 DEBUG [aSqdxCzJ] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:18:05.008 DEBUG [aSqdxCzJ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 200 35ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/stats
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODQsImV4cCI6MTc4MzA2MzA4NH0.UoNUJvmECX360VZbzQZHGXAHLlb1grDL6PCdNkNIWP9nO3l633zQFfKu1da7wRsQtH4U5Hw9plJaUCKb_iCStw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"aSqdxCzJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","clickedCount":0,"totalInvited":0,"registeredCount":0,"totalReward":0,"summaryText":"已邀请0家药店,0家注册,累计获得0个月高级会员","todayInvited":0,"todayRemaining":10,"rewardPerInvite":1,"crawlerTodayRemaining":10,"crawlerQuotaFromInvites":0},"timestamp":1782976685007}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.012 DEBUG [wuvWHYfQ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
- 15:18:05.013 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:05.013 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:05.015 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:05.015 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:05.015 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:05.016 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:05.017 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:18:05.017 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:05.016598900(LocalDateTime)
- 15:18:05.018 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:05.018 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:05.018 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:05.019 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:05.020 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:05.020 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:05.021 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:05.022 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?)
- 15:18:05.022 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
- 15:18:05.024 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.024 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND create_time >= ?)
- 15:18:05.024 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectCount : ==> Parameters: 1(Long), 2026-07-02T00:00(LocalDateTime)
- 15:18:05.025 DEBUG [wuvWHYfQ] [1] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:18:05.026 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:05.026 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:05.027 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:05.027 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:05.027 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:05.028 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:05.029 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:05.029 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:05.031 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:05.031 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:18:05.031 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:18:05.032 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:18:05.032 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:18:05.033 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:18:05.034 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:18:05.034 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:18:05.034 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:18:05.035 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:18:05.035 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:18:05.035 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:18:05.037 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:18:05.037 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:18:05.037 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:18:05.039 DEBUG [wuvWHYfQ] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:18:05.039 DEBUG [wuvWHYfQ] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:18:05.039 DEBUG [wuvWHYfQ] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:18:05.040 DEBUG [wuvWHYfQ] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:18:05.041 DEBUG [wuvWHYfQ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 200 29ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/stats
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInviteStats(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"wuvWHYfQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"myInviteCode":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","clickedCount":0,"totalInvited":0,"registeredCount":0,"totalReward":0,"summaryText":"已邀请0家药店,0家注册,累计获得0个月高级会员","todayInvited":0,"todayRemaining":10,"rewardPerInvite":1,"crawlerTodayRemaining":10,"crawlerQuotaFromInvites":0},"timestamp":1782976685040}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.043 DEBUG [cFhkQmtd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
- 15:18:05.044 WARN [cFhkQmtd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/stats
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"cFhkQmtd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976685044}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.049 DEBUG [UTU9jLeP] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards | IP: 127.0.0.1
- 15:18:05.050 DEBUG [UTU9jLeP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:05.051 DEBUG [UTU9jLeP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:05.052 DEBUG [UTU9jLeP] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:05.053 DEBUG [UTU9jLeP] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,inviter_id,invitee_id,invite_code_id,registered,reward_granted,status,create_time,update_time FROM t_invite_relation WHERE (inviter_id = ?) ORDER BY create_time DESC
- 15:18:05.053 DEBUG [UTU9jLeP] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long)
- 15:18:05.055 DEBUG [UTU9jLeP] [1] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.055 DEBUG [UTU9jLeP] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards 200 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/rewards
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInviteRewards(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"UTU9jLeP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976685055}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.058 DEBUG [qzX5myJd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards | IP: 127.0.0.1
- 15:18:05.060 WARN [qzX5myJd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/rewards
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"qzX5myJd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976685059}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.064 DEBUG [3fdgvuUH] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota | IP: 127.0.0.1
- 15:18:05.065 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:05.065 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:05.067 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:05.068 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:18:05.068 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:18:05.069 DEBUG [3fdgvuUH] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:18:05.070 DEBUG [3fdgvuUH] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota 200 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/extra-quota
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getExtraQuota(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"3fdgvuUH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":0,"timestamp":1782976685070}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.073 DEBUG [MpSvnntL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota | IP: 127.0.0.1
- 15:18:05.075 WARN [MpSvnntL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/extra-quota
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"MpSvnntL", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976685074}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.079 DEBUG [ejHN52Wp] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
- 15:18:05.080 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:05.080 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:05.082 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:05.085 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:18:05.085 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : ==> Parameters: 1(Long), 1(Integer), 2026-07-02T15:18:05.084993800(LocalDateTime)
- 15:18:05.087 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:05.088 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:05.088 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:05.089 DEBUG [ejHN52Wp] [1] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:05.089 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:05.089 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:05.090 DEBUG [ejHN52Wp] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:05.091 DEBUG [ejHN52Wp] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 12ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/code
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODUsImV4cCI6MTc4MzA2MzA4NX0.va-tmc4WznWR0giUOlMDNexJUk-jhFTINP8WjhcxmF-yLFHRlfb59JKqyK2FBhZKG-rUiJupSUv-ohohqc9Ptg"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ejHN52Wp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"code":"4FQ2CNX5","inviteLink":"https://app.zhijiayun.com/api/invite/4FQ2CNX5","inviterNickname":"测试用户","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:05","status":1,"createTime":"2026-07-02 15:18:05","shareTitle":"测试用户 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是测试用户,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/4FQ2CNX5填我的邀请码 4FQ2CNX5 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/4FQ2CNX5"},"timestamp":1782976685090}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.091 DEBUG [X38wc5Ah] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE | IP: 127.0.0.1
- 15:18:05.092 DEBUG [X38wc5Ah] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:05.092 DEBUG [X38wc5Ah] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
- 15:18:05.093 DEBUG [X38wc5Ah] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.094 WARN [X38wc5Ah] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
- 15:18:05.095 DEBUG [X38wc5Ah] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/page/TESTCODE
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"X38wc5Ah", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685094}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.097 DEBUG [VnCUn4vv] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=app | IP: 127.0.0.1
- 15:18:05.099 DEBUG [VnCUn4vv] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:05.099 DEBUG [VnCUn4vv] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
- 15:18:05.100 DEBUG [VnCUn4vv] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.100 WARN [VnCUn4vv] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
- 15:18:05.101 DEBUG [VnCUn4vv] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=app 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/page/TESTCODE
- Parameters = {channel=[app]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"VnCUn4vv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685101}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.104 DEBUG [Zj8B6GkN] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=wechat | IP: 127.0.0.1
- 15:18:05.105 DEBUG [Zj8B6GkN] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:05.105 DEBUG [Zj8B6GkN] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
- 15:18:05.107 DEBUG [Zj8B6GkN] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.107 WARN [Zj8B6GkN] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
- 15:18:05.108 DEBUG [Zj8B6GkN] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=wechat 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/page/TESTCODE
- Parameters = {channel=[wechat]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Zj8B6GkN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685107}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.110 DEBUG [Jgf2XDuZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=miniapp | IP: 127.0.0.1
- 15:18:05.112 DEBUG [Jgf2XDuZ] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:05.112 DEBUG [Jgf2XDuZ] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
- 15:18:05.114 DEBUG [Jgf2XDuZ] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.114 WARN [Jgf2XDuZ] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
- 15:18:05.115 DEBUG [Jgf2XDuZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=miniapp 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/page/TESTCODE
- Parameters = {channel=[miniapp]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Jgf2XDuZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685114}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.121 DEBUG [jJ9MwVUX] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=dingtalk | IP: 127.0.0.1
- 15:18:05.122 DEBUG [jJ9MwVUX] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:05.122 DEBUG [jJ9MwVUX] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
- 15:18:05.124 DEBUG [jJ9MwVUX] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.124 WARN [jJ9MwVUX] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
- 15:18:05.125 DEBUG [jJ9MwVUX] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=dingtalk 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/page/TESTCODE
- Parameters = {channel=[dingtalk]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"jJ9MwVUX", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685124}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.128 DEBUG [pCDDxfVA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=feishu | IP: 127.0.0.1
- 15:18:05.129 DEBUG [pCDDxfVA] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:05.130 DEBUG [pCDDxfVA] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
- 15:18:05.132 DEBUG [pCDDxfVA] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.132 WARN [pCDDxfVA] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
- 15:18:05.133 DEBUG [pCDDxfVA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=feishu 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/page/TESTCODE
- Parameters = {channel=[feishu]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"pCDDxfVA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685132}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.135 DEBUG [P5czgMbB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/ANYCODE | IP: 127.0.0.1
- 15:18:05.137 DEBUG [P5czgMbB] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:05.137 DEBUG [P5czgMbB] [] [ main] c.x.i.m.I.selectList : ==> Parameters: ANYCODE(String)
- 15:18:05.138 DEBUG [P5czgMbB] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.139 WARN [P5czgMbB] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
- 15:18:05.139 DEBUG [P5czgMbB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/ANYCODE 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/page/ANYCODE
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"P5czgMbB", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976685139}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.142 DEBUG [R7aMMLsM] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE | IP: 127.0.0.1
- 15:18:05.143 DEBUG [R7aMMLsM] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:05.143 DEBUG [R7aMMLsM] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
- 15:18:05.146 DEBUG [R7aMMLsM] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.146 DEBUG [R7aMMLsM] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE 200 4ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/invite/click/TESTCODE
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#trackClick(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"R7aMMLsM", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976685146}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.149 DEBUG [2Mq9VEEj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE | IP: 127.0.0.1
- 15:18:05.151 DEBUG [2Mq9VEEj] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:05.151 DEBUG [2Mq9VEEj] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
- 15:18:05.153 DEBUG [2Mq9VEEj] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.153 DEBUG [2Mq9VEEj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE 200 4ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/invite/click/TESTCODE
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#trackClick(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"2Mq9VEEj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976685153}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:05.156 DEBUG [vWY9MBWL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/NONEXISTENT | IP: 127.0.0.1
- 15:18:05.157 DEBUG [vWY9MBWL] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:05.157 DEBUG [vWY9MBWL] [] [ main] c.x.i.m.I.selectList : ==> Parameters: NONEXISTENT(String)
- 15:18:05.159 DEBUG [vWY9MBWL] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:05.160 DEBUG [vWY9MBWL] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/NONEXISTENT 200 4ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/invite/click/NONEXISTENT
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#trackClick(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"vWY9MBWL", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976685159}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 21, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.310 s -- in 邀请系统接口测试
- [INFO] Running 会员体系接口测试
- 15:18:05.164 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.MembershipControllerTest]: MembershipControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:05.166 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.MembershipControllerTest
- 15:18:08.360 DEBUG [5UU8Mxdb] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant | IP: 127.0.0.1
- 15:18:08.361 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.361 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.363 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.368 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.369 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.370 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.371 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
- 15:18:08.371 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
- 15:18:08.374 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:18:08.374 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:08.374 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580566367019009(Long), 1(Long), PLUS(String), ADMIN_GRANT(String), 2026-07-02T15:18:08.374546(LocalDateTime), 1(Integer), 测试初始化(String), 2026-07-02T15:18:08.374546(LocalDateTime), 2026-07-02T15:18:08.374546(LocalDateTime)
- 15:18:08.377 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.U.insert : <== Updates: 1
- 15:18:08.377 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:18:08.378 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:18:08(LocalDateTime), 2026-07-02T15:18:08(LocalDateTime), 1(Long)
- 15:18:08.380 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:08.381 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:08.381 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580566429933570(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:08.381052(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), MEMBERSHIP:1->PLUS(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:08.381052(LocalDateTime)
- 15:18:08.384 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:08.385 DEBUG [5UU8Mxdb] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
- 15:18:08.385 INFO [5UU8Mxdb] [1] [ main] c.x.u.s.MembershipService : 运营人员1为用户1发放会员等级PLUS
- 15:18:08.385 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.385 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.386 DEBUG [5UU8Mxdb] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.391 DEBUG [5UU8Mxdb] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant 200 31ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/membership/grant
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ", Content-Length:"77"]
- Body = {"userId":1,"level":"PLUS","source":"ADMIN_GRANT","remark":"测试初始化"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminMembershipController
- Method = com.xuekairui.user.controller.AdminMembershipController#grantMembership(GrantMembershipRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"5UU8Mxdb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},"timestamp":1782976688391}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.397 DEBUG [85Q8WsTS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:18:08.398 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.398 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.399 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.400 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:08.400 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:08.401 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
- 15:18:08.401 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.402 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.403 DEBUG [85Q8WsTS] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.404 DEBUG [85Q8WsTS] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"85Q8WsTS", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},"timestamp":1782976688403}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.410 DEBUG [feh9NG37] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=PLUS | IP: 127.0.0.1
- 15:18:08.411 DEBUG [feh9NG37] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.411 DEBUG [feh9NG37] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.412 DEBUG [feh9NG37] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.413 DEBUG [feh9NG37] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:08.414 DEBUG [feh9NG37] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:08.416 DEBUG [feh9NG37] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:08.418 DEBUG [feh9NG37] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=PLUS 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/benefits
- Parameters = {level=[PLUS]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"feh9NG37", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":10,"description":"普通会员:每日有效查询10次"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":300,"description":"普通会员:每月查询300次"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":3650,"description":"普通会员:每年查询3650次(10*365)"}],"timestamp":1782976688417}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.421 DEBUG [LahQpFLm] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:18:08.423 WARN [LahQpFLm] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"LahQpFLm", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976688422}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.429 DEBUG [6m7WyS8W] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits | IP: 127.0.0.1
- 15:18:08.429 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.429 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.431 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.432 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:08.432 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:08.434 DEBUG [6m7WyS8W] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:08.435 DEBUG [6m7WyS8W] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits 200 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/benefits
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"6m7WyS8W", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":10,"description":"普通会员:每日有效查询10次"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":300,"description":"普通会员:每月查询300次"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":3650,"description":"普通会员:每年查询3650次(10*365)"}],"timestamp":1782976688434}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.441 DEBUG [FVuPXp7b] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=PRO | IP: 127.0.0.1
- 15:18:08.441 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.441 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.444 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.445 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:08.445 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:18:08.446 DEBUG [FVuPXp7b] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:08.447 DEBUG [FVuPXp7b] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=PRO 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/benefits
- Parameters = {level=[PRO]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"FVuPXp7b", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":999,"description":"高级会员:每日不限量"},{"benefitType":"MAX_CONCURRENT","benefitTypeName":"最大并发加成","benefitValue":5,"description":"高级会员最大并发数"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":29970,"description":"高级会员:每月查询29970次(999*30)"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":364635,"description":"高级会员:每年查询364635次(999*365)"}],"timestamp":1782976688446}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.453 DEBUG [t2pUyrX4] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=ULTRA | IP: 127.0.0.1
- 15:18:08.454 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.454 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.456 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.458 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:08.458 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:18:08.460 DEBUG [t2pUyrX4] [1] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:08.461 DEBUG [t2pUyrX4] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/benefits?level=ULTRA 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/benefits
- Parameters = {level=[ULTRA]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getBenefits(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"t2pUyrX4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"benefitType":"DAILY_QUOTA","benefitTypeName":"每日查询配额","benefitValue":999,"description":"超级会员:每日不限量"},{"benefitType":"MAX_CONCURRENT","benefitTypeName":"最大并发加成","benefitValue":10,"description":"超级会员最大并发数"},{"benefitType":"MONTHLY_QUOTA","benefitTypeName":"每月爬虫加成","benefitValue":29970,"description":"超级会员:每月查询29970次(999*30)"},{"benefitType":"YEARLY_QUOTA","benefitTypeName":"YEARLY_QUOTA","benefitValue":364635,"description":"超级会员:每年查询364635次(999*365)"}],"timestamp":1782976688460}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.467 DEBUG [Eveha6v8] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant | IP: 127.0.0.1
- 15:18:08.468 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.468 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.470 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.472 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.473 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.475 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.475 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
- 15:18:08.475 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
- 15:18:08.476 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.selectList : <== Total: 1
- 15:18:08.478 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.updateById : ==> Preparing: UPDATE t_user_membership SET user_id=?, level=?, source=?, effective_from=?, status=?, remark=?, create_time=?, update_time=? WHERE id=?
- 15:18:08.478 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.updateById : ==> Parameters: 1(Long), PLUS(String), ADMIN_GRANT(String), 2026-07-02T15:18:08(LocalDateTime), 0(Integer), 测试初始化(String), 2026-07-02T15:18:08(LocalDateTime), 2026-07-02T15:18:08(LocalDateTime), 2072580566367019009(Long)
- 15:18:08.480 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.updateById : <== Updates: 1
- 15:18:08.481 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:08.481 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580566815809538(Long), 1(Long), PRO(String), ADMIN_GRANT(String), 2026-07-02T15:18:08.480846500(LocalDateTime), 1(Integer), 测试发放(String), 2026-07-02T15:18:08.480846500(LocalDateTime), 2026-07-02T15:18:08.480846500(LocalDateTime)
- 15:18:08.484 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.U.insert : <== Updates: 1
- 15:18:08.484 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:18:08.484 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 0(Long), 2026-07-02T15:18:08(LocalDateTime), 2026-07-02T15:18:08(LocalDateTime), 1(Long)
- 15:18:08.487 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:08.488 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:08.488 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580566878724097(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:08.487671(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), MEMBERSHIP:1->PRO(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:08.488175700(LocalDateTime)
- 15:18:08.491 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:08.491 DEBUG [Eveha6v8] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
- 15:18:08.491 INFO [Eveha6v8] [1] [ main] c.x.u.s.MembershipService : 运营人员1为用户1发放会员等级PRO
- 15:18:08.491 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.491 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.492 DEBUG [Eveha6v8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.497 DEBUG [Eveha6v8] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant 200 30ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/membership/grant
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ", Content-Length:"73"]
- Body = {"userId":1,"level":"PRO","source":"ADMIN_GRANT","remark":"测试发放"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminMembershipController
- Method = com.xuekairui.user.controller.AdminMembershipController#grantMembership(GrantMembershipRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Eveha6v8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":2072580566815809538,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PRO","levelName":"高级会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试发放","createTime":"2026-07-02 15:18:08"},"timestamp":1782976688496}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.503 DEBUG [d8GMgdat] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant | IP: 127.0.0.1
- 15:18:08.504 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.504 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.506 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.508 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.508 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.509 DEBUG [d8GMgdat] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.511 WARN [d8GMgdat] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=400, message=会员等级无效
- 15:18:08.512 DEBUG [d8GMgdat] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant 200 9ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/membership/grant
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ", Content-Length:"53"]
- Body = {"userId":1,"level":"INVALID","source":"ADMIN_GRANT"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminMembershipController
- Method = com.xuekairui.user.controller.AdminMembershipController#grantMembership(GrantMembershipRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"d8GMgdat", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"会员等级无效","data":null,"timestamp":1782976688511}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.515 DEBUG [v8fmDGQP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant | IP: 127.0.0.1
- 15:18:08.516 WARN [v8fmDGQP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant 401 1ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/membership/grant
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"49"]
- Body = {"userId":1,"level":"PRO","source":"ADMIN_GRANT"}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"v8fmDGQP", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976688515}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.521 DEBUG [VE4WP664] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10 | IP: 127.0.0.1
- 15:18:08.521 DEBUG [VE4WP664] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.521 DEBUG [VE4WP664] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.523 DEBUG [VE4WP664] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.528 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_user_membership
- 15:18:08.528 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Parameters:
- 15:18:08.530 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList_mpCount : <== Total: 1
- 15:18:08.530 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership ORDER BY create_time DESC LIMIT ?
- 15:18:08.531 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 10(Long)
- 15:18:08.532 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectList : <== Total: 2
- 15:18:08.534 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectByIds : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id IN ( ? )
- 15:18:08.534 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectByIds : ==> Parameters: 1(Long)
- 15:18:08.536 DEBUG [VE4WP664] [1] [ main] c.x.u.m.U.selectByIds : <== Total: 1
- 15:18:08.537 DEBUG [VE4WP664] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10 200 16ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/membership/memberships
- Parameters = {page=[1], size=[10]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminMembershipController
- Method = com.xuekairui.user.controller.AdminMembershipController#listMemberships(Integer, Integer, Long, String, String, String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"VE4WP664", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":0,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},{"id":2072580566815809538,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PRO","levelName":"高级会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试发放","createTime":"2026-07-02 15:18:08"}],"total":2,"size":10,"current":1,"pages":1},"timestamp":1782976688537}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.542 DEBUG [JH62Em77] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10&userId=1 | IP: 127.0.0.1
- 15:18:08.543 DEBUG [JH62Em77] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.543 DEBUG [JH62Em77] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.544 DEBUG [JH62Em77] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.554 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_user_membership WHERE (user_id = ?)
- 15:18:08.554 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Parameters: 1(Long)
- 15:18:08.556 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList_mpCount : <== Total: 1
- 15:18:08.556 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ?) ORDER BY create_time DESC LIMIT ?
- 15:18:08.556 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 10(Long)
- 15:18:08.558 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectList : <== Total: 2
- 15:18:08.558 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectByIds : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id IN ( ? )
- 15:18:08.559 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectByIds : ==> Parameters: 1(Long)
- 15:18:08.560 DEBUG [JH62Em77] [1] [ main] c.x.u.m.U.selectByIds : <== Total: 1
- 15:18:08.561 DEBUG [JH62Em77] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10&userId=1 200 19ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/membership/memberships
- Parameters = {page=[1], size=[10], userId=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminMembershipController
- Method = com.xuekairui.user.controller.AdminMembershipController#listMemberships(Integer, Integer, Long, String, String, String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"JH62Em77", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":0,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"},{"id":2072580566815809538,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PRO","levelName":"高级会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"测试发放","createTime":"2026-07-02 15:18:08"}],"total":2,"size":10,"current":1,"pages":1},"timestamp":1782976688560}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.567 DEBUG [9bkfqEx2] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10&level=PLUS | IP: 127.0.0.1
- 15:18:08.568 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:08.568 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:08.570 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:08.573 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_user_membership WHERE (level = ?)
- 15:18:08.573 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList_mpCount : ==> Parameters: PLUS(String)
- 15:18:08.576 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList_mpCount : <== Total: 1
- 15:18:08.576 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (level = ?) ORDER BY create_time DESC LIMIT ?
- 15:18:08.576 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: PLUS(String), 10(Long)
- 15:18:08.578 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectList : <== Total: 1
- 15:18:08.578 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectByIds : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id IN ( ? )
- 15:18:08.578 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectByIds : ==> Parameters: 1(Long)
- 15:18:08.580 DEBUG [9bkfqEx2] [1] [ main] c.x.u.m.U.selectByIds : <== Total: 1
- 15:18:08.581 DEBUG [9bkfqEx2] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10&level=PLUS 200 14ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/membership/memberships
- Parameters = {page=[1], size=[10], level=[PLUS]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2ODgsImV4cCI6MTc4MzA2MzA4OH0.-A9Qpg6q50cIS8KptBpX7_8m-FBBEMhD2kgwt_r30uvc2oMbcEBei0f-DZCNeYUqLIS9_ONTsjh6uc04jLg7iQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminMembershipController
- Method = com.xuekairui.user.controller.AdminMembershipController#listMemberships(Integer, Integer, Long, String, String, String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"9bkfqEx2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[{"id":2072580566367019009,"userId":1,"phone":"13800138000","nickname":"测试用户","level":"PLUS","levelName":"普通会员","source":"ADMIN_GRANT","effectiveFrom":"2026-07-02 15:18:08","effectiveTo":null,"membershipExpireAt":null,"status":0,"remark":"测试初始化","createTime":"2026-07-02 15:18:08"}],"total":1,"size":10,"current":1,"pages":1},"timestamp":1782976688580}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:08.585 DEBUG [t5QkNrDG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10 | IP: 127.0.0.1
- 15:18:08.587 WARN [t5QkNrDG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/membership/memberships?page=1&size=10 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/membership/memberships
- Parameters = {page=[1], size=[10]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"t5QkNrDG", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976688586}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.425 s -- in 会员体系接口测试
- [INFO] Running 操作审计日志接口测试
- 15:18:08.591 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.OperationAuditLogTest]: OperationAuditLogTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:08.593 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.OperationAuditLogTest
- 15:18:10.931 DEBUG [8QgaBN5M] [] [scheduling-2] c.x.p.m.P.selectDueForDeduct : ==> Preparing: SELECT * FROM t_payment_agreement WHERE status = 'SIGNED' AND next_deduct_time IS NOT NULL AND next_deduct_time <= ? ORDER BY next_deduct_time ASC
- 15:18:10.931 DEBUG [8QgaBN5M] [] [scheduling-2] c.x.p.m.P.selectDueForDeduct : ==> Parameters: 2026-07-02T15:18:10.929491200(LocalDateTime)
- 15:18:10.932 DEBUG [8QgaBN5M] [] [scheduling-2] c.x.p.m.P.selectDueForDeduct : <== Total: 0
- 15:18:11.084 DEBUG [gSCLu3Gv] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Preparing: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
- 15:18:11.085 DEBUG [gSCLu3Gv] [] [scheduling-1] c.x.p.m.P.selectExpiredPending : ==> Parameters: 2026-07-02T15:18:11.084515200(LocalDateTime)
- 15:18:11.226 ERROR [gSCLu3Gv] [] [scheduling-1] c.x.user.config.AsyncConfig : 定时任务执行异常
- org.springframework.jdbc.BadSqlGrammarException:
- ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Table 'zhijiayun_pharmacy.t_payment_order' doesn't exist
- ### The error may exist in com/xuekairui/payment/mapper/PaymentOrderMapper.java (best guess)
- ### The error may involve com.xuekairui.payment.mapper.PaymentOrderMapper.selectExpiredPending-Inline
- ### The error occurred while setting parameters
- ### SQL: SELECT * FROM t_payment_order WHERE status = 'PENDING' AND expire_time < ?
- ### Cause: java.sql.SQLSyntaxErrorException: Table 'zhijiayun_pharmacy.t_payment_order' doesn't exist
- ; bad SQL grammar []
- at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:246)
- at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)
- at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:95)
- at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:347)
- at jdk.proxy2/jdk.proxy2.$Proxy127.selectList(Unknown Source)
- at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:194)
- at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164)
- at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77)
- at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:156)
- at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:93)
- at jdk.proxy2/jdk.proxy2.$Proxy160.selectExpiredPending(Unknown Source)
- at com.xuekairui.payment.service.PaymentOrderService.cleanupExpiredOrders(PaymentOrderService.java:373)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
- at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:360)
- at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
- at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
- at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380)
- at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
- at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
- at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728)
- at com.xuekairui.payment.service.PaymentOrderService$$SpringCGLIB$$0.cleanupExpiredOrders(<generated>)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
- at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130)
- at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124)
- at io.micrometer.observation.Observation.observe(Observation.java:498)
- at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124)
- at org.springframework.scheduling.config.Task$OutcomeTrackingRunnable.run(Task.java:87)
- at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
- at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
- at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:305)
- at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
- at com.xuekairui.user.config.AsyncConfig$MdcTraceIdTaskDecorator.lambda$decorate$0(AsyncConfig.java:84)
- at org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler$DelegatingRunnableScheduledFuture.run(ThreadPoolTaskScheduler.java:508)
- at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
- at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
- at java.base/java.lang.Thread.run(Thread.java:842)
- Caused by: java.sql.SQLSyntaxErrorException: Table 'zhijiayun_pharmacy.t_payment_order' doesn't exist
- at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:112)
- at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:114)
- at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:990)
- at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:384)
- at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44)
- at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java)
- at jdk.internal.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
- at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)
- at jdk.proxy3/jdk.proxy3.$Proxy182.execute(Unknown Source)
- at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)
- at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:80)
- at jdk.internal.reflect.GeneratedMethodAccessor33.invoke(Unknown Source)
- at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
- at jdk.proxy2/jdk.proxy2.$Proxy180.query(Unknown Source)
- at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:65)
- at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336)
- at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158)
- at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110)
- at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81)
- at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59)
- at jdk.proxy2/jdk.proxy2.$Proxy179.query(Unknown Source)
- at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
- at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
- at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
- at jdk.internal.reflect.GeneratedMethodAccessor103.invoke(Unknown Source)
- at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:333)
- ... 38 common frames omitted
- 15:18:11.574 DEBUG [ENh4NUTh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log | IP: 127.0.0.1
- 15:18:11.574 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.575 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.576 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.580 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log
- 15:18:11.580 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters:
- 15:18:11.584 DEBUG [ENh4NUTh] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
- 15:18:11.585 DEBUG [ENh4NUTh] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log 200 11ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ENh4NUTh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691584}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.591 DEBUG [ccHp7WWP] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?page=1&size=10 | IP: 127.0.0.1
- 15:18:11.592 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.592 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.593 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.597 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log
- 15:18:11.597 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters:
- 15:18:11.599 DEBUG [ccHp7WWP] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
- 15:18:11.600 DEBUG [ccHp7WWP] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?page=1&size=10 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log
- Parameters = {page=[1], size=[10]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ccHp7WWP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":10,"current":1,"pages":0},"timestamp":1782976691599}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.606 DEBUG [3vygFTkd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?module=USER | IP: 127.0.0.1
- 15:18:11.606 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.607 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.608 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.613 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (module = ?)
- 15:18:11.613 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: USER(String)
- 15:18:11.615 DEBUG [3vygFTkd] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
- 15:18:11.615 DEBUG [3vygFTkd] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?module=USER 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log
- Parameters = {module=[USER]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"3vygFTkd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691615}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.620 DEBUG [gQnthUv2] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?operationType=USER_LOGIN | IP: 127.0.0.1
- 15:18:11.621 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.621 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.622 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.627 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (operation_type = ?)
- 15:18:11.627 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: USER_LOGIN(String)
- 15:18:11.629 DEBUG [gQnthUv2] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
- 15:18:11.629 DEBUG [gQnthUv2] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?operationType=USER_LOGIN 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log
- Parameters = {operationType=[USER_LOGIN]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"gQnthUv2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691629}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.636 DEBUG [SrDX528q] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?operatorId=1 | IP: 127.0.0.1
- 15:18:11.637 DEBUG [SrDX528q] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.637 DEBUG [SrDX528q] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.638 DEBUG [SrDX528q] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.643 DEBUG [SrDX528q] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (operator_id = ?)
- 15:18:11.643 DEBUG [SrDX528q] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: 1(Long)
- 15:18:11.644 DEBUG [SrDX528q] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
- 15:18:11.645 DEBUG [SrDX528q] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?operatorId=1 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log
- Parameters = {operatorId=[1]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"SrDX528q", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691645}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.650 DEBUG [KTAGdS8E] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?isSensitive=true | IP: 127.0.0.1
- 15:18:11.650 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.650 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.652 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.656 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (is_sensitive = ?)
- 15:18:11.656 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: true(Boolean)
- 15:18:11.659 DEBUG [KTAGdS8E] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
- 15:18:11.659 DEBUG [KTAGdS8E] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?isSensitive=true 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log
- Parameters = {isSensitive=[true]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"KTAGdS8E", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691659}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.665 DEBUG [KhH6urLQ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?isSensitive=false | IP: 127.0.0.1
- 15:18:11.666 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.666 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.667 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.670 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (is_sensitive = ?)
- 15:18:11.670 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: false(Boolean)
- 15:18:11.673 DEBUG [KhH6urLQ] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
- 15:18:11.674 DEBUG [KhH6urLQ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log?isSensitive=false 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log
- Parameters = {isSensitive=[false]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"KhH6urLQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691673}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.680 DEBUG [w7fWqg8P] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log | IP: 127.0.0.1
- 15:18:11.681 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.681 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.683 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.692 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (operation_time >= ? AND operation_time <= ?)
- 15:18:11.693 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: 2024-01-01T00:00(LocalDateTime), 2030-12-31T23:59:59(LocalDateTime)
- 15:18:11.694 DEBUG [w7fWqg8P] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
- 15:18:11.695 DEBUG [w7fWqg8P] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log 200 15ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log
- Parameters = {startTime=[2024-01-01T00:00:00], endTime=[2030-12-31T23:59:59]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"w7fWqg8P", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":20,"current":1,"pages":0},"timestamp":1782976691695}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.701 DEBUG [A6uLPnwG] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log | IP: 127.0.0.1
- 15:18:11.701 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.701 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.703 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.707 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Preparing: SELECT COUNT(*) AS total FROM t_operation_audit_log WHERE (module = ? AND operator_id = ?)
- 15:18:11.707 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.O.selectList_mpCount : ==> Parameters: USER(String), 1(Long)
- 15:18:11.708 DEBUG [A6uLPnwG] [1] [ main] c.x.u.m.O.selectList_mpCount : <== Total: 1
- 15:18:11.709 DEBUG [A6uLPnwG] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log
- Parameters = {module=[USER], operatorId=[1], page=[1], size=[5]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#queryLogs(String, String, Long, LocalDateTime, LocalDateTime, Boolean, int, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"A6uLPnwG", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"records":[],"total":0,"size":5,"current":1,"pages":0},"timestamp":1782976691708}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.713 DEBUG [GV5KFCU5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log | IP: 127.0.0.1
- 15:18:11.714 WARN [GV5KFCU5] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"GV5KFCU5", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976691714}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.721 DEBUG [UvuYtdUN] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
- 15:18:11.722 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.722 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.724 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.725 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.O.selectSensitiveLogs : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE is_sensitive = true AND operation_time >= ? ORDER BY operation_time DESC
- 15:18:11.725 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.O.selectSensitiveLogs : ==> Parameters: null
- 15:18:11.728 DEBUG [UvuYtdUN] [1] [ main] c.x.u.m.O.selectSensitiveLogs : <== Total: 0
- 15:18:11.728 DEBUG [UvuYtdUN] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/sensitive
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getSensitiveLogs(LocalDateTime)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"UvuYtdUN", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691728}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.735 DEBUG [FL6aeUZc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
- 15:18:11.736 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.736 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.738 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.739 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.O.selectSensitiveLogs : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE is_sensitive = true AND operation_time >= ? ORDER BY operation_time DESC
- 15:18:11.739 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.O.selectSensitiveLogs : ==> Parameters: 2024-01-01T00:00(LocalDateTime)
- 15:18:11.741 DEBUG [FL6aeUZc] [1] [ main] c.x.u.m.O.selectSensitiveLogs : <== Total: 0
- 15:18:11.742 DEBUG [FL6aeUZc] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/sensitive
- Parameters = {startTime=[2024-01-01T00:00:00]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getSensitiveLogs(LocalDateTime)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"FL6aeUZc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691741}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.745 DEBUG [9sPcUeRS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
- 15:18:11.746 WARN [9sPcUeRS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/sensitive
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"9sPcUeRS", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976691745}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.754 DEBUG [PB7crpdZ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
- 15:18:11.756 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.756 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.758 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.759 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE operator_id = ? ORDER BY operation_time DESC LIMIT ?
- 15:18:11.760 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Parameters: 1(Long), 50(Integer)
- 15:18:11.761 DEBUG [PB7crpdZ] [1] [ main] c.x.u.m.O.selectByOperatorId : <== Total: 0
- 15:18:11.762 DEBUG [PB7crpdZ] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/user/1
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getUserLogs(Long, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"PB7crpdZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691761}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.769 DEBUG [zcvV3WWv] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1?limit=10 | IP: 127.0.0.1
- 15:18:11.769 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.770 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.771 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.772 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE operator_id = ? ORDER BY operation_time DESC LIMIT ?
- 15:18:11.773 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Parameters: 1(Long), 10(Integer)
- 15:18:11.775 DEBUG [zcvV3WWv] [1] [ main] c.x.u.m.O.selectByOperatorId : <== Total: 0
- 15:18:11.776 DEBUG [zcvV3WWv] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1?limit=10 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/user/1
- Parameters = {limit=[10]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getUserLogs(Long, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"zcvV3WWv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691775}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.783 DEBUG [P6m5Zsx8] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/99999 | IP: 127.0.0.1
- 15:18:11.789 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.789 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.791 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.793 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE operator_id = ? ORDER BY operation_time DESC LIMIT ?
- 15:18:11.793 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.O.selectByOperatorId : ==> Parameters: 99999(Long), 50(Integer)
- 15:18:11.795 DEBUG [P6m5Zsx8] [1] [ main] c.x.u.m.O.selectByOperatorId : <== Total: 0
- 15:18:11.796 DEBUG [P6m5Zsx8] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/99999 200 13ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/user/99999
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getUserLogs(Long, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"P6m5Zsx8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691795}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.800 DEBUG [YZgJ6zUE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
- 15:18:11.802 WARN [YZgJ6zUE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/user/1
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"YZgJ6zUE", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976691801}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.808 DEBUG [XvY6LZJt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
- 15:18:11.809 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.809 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.811 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.812 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
- 15:18:11.812 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: USER(String), 1(Long), 50(Integer)
- 15:18:11.815 DEBUG [XvY6LZJt] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
- 15:18:11.816 DEBUG [XvY6LZJt] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/target/USER/1
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"XvY6LZJt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691815}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.822 DEBUG [6sysmkbw] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LEVEL_CONFIG/1?limit=20 | IP: 127.0.0.1
- 15:18:11.823 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.823 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.826 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.827 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
- 15:18:11.827 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: LEVEL_CONFIG(String), 1(Long), 20(Integer)
- 15:18:11.828 DEBUG [6sysmkbw] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
- 15:18:11.829 DEBUG [6sysmkbw] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LEVEL_CONFIG/1?limit=20 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/target/LEVEL_CONFIG/1
- Parameters = {limit=[20]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"6sysmkbw", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691828}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.835 DEBUG [tae52s5m] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
- 15:18:11.836 DEBUG [tae52s5m] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.836 DEBUG [tae52s5m] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.839 DEBUG [tae52s5m] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.840 DEBUG [tae52s5m] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
- 15:18:11.840 DEBUG [tae52s5m] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: USER(String), 1(Long), 50(Integer)
- 15:18:11.842 DEBUG [tae52s5m] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
- 15:18:11.843 DEBUG [tae52s5m] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 200 8ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/target/USER/1
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"tae52s5m", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691842}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.846 DEBUG [hUzGWdDc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LEVEL_CONFIG/1 | IP: 127.0.0.1
- 15:18:11.847 DEBUG [hUzGWdDc] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
- 15:18:11.848 DEBUG [hUzGWdDc] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: LEVEL_CONFIG(String), 1(Long), 50(Integer)
- 15:18:11.849 DEBUG [hUzGWdDc] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
- 15:18:11.850 DEBUG [hUzGWdDc] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LEVEL_CONFIG/1 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/target/LEVEL_CONFIG/1
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"hUzGWdDc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691849}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.853 DEBUG [CTYCZSJb] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/PLATFORM/1 | IP: 127.0.0.1
- 15:18:11.854 DEBUG [CTYCZSJb] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
- 15:18:11.854 DEBUG [CTYCZSJb] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: PLATFORM(String), 1(Long), 50(Integer)
- 15:18:11.856 DEBUG [CTYCZSJb] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
- 15:18:11.858 DEBUG [CTYCZSJb] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/PLATFORM/1 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/target/PLATFORM/1
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"CTYCZSJb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691857}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.861 DEBUG [gVKCzyT3] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LICENSE/1 | IP: 127.0.0.1
- 15:18:11.863 DEBUG [gVKCzyT3] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
- 15:18:11.864 DEBUG [gVKCzyT3] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: LICENSE(String), 1(Long), 50(Integer)
- 15:18:11.865 DEBUG [gVKCzyT3] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
- 15:18:11.866 DEBUG [gVKCzyT3] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/LICENSE/1 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/target/LICENSE/1
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"gVKCzyT3", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691865}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.869 DEBUG [EusDZXU9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/INVITE/1 | IP: 127.0.0.1
- 15:18:11.870 DEBUG [EusDZXU9] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
- 15:18:11.870 DEBUG [EusDZXU9] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: INVITE(String), 1(Long), 50(Integer)
- 15:18:11.872 DEBUG [EusDZXU9] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
- 15:18:11.873 DEBUG [EusDZXU9] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/INVITE/1 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/target/INVITE/1
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"EusDZXU9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691872}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.876 DEBUG [y2pEKWMS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/COUPON/1 | IP: 127.0.0.1
- 15:18:11.877 DEBUG [y2pEKWMS] [1] [ main] c.x.u.m.O.selectByTarget : ==> Preparing: SELECT * FROM t_operation_audit_log WHERE target_type = ? AND target_id = ? ORDER BY operation_time DESC LIMIT ?
- 15:18:11.878 DEBUG [y2pEKWMS] [1] [ main] c.x.u.m.O.selectByTarget : ==> Parameters: COUPON(String), 1(Long), 50(Integer)
- 15:18:11.879 DEBUG [y2pEKWMS] [1] [ main] c.x.u.m.O.selectByTarget : <== Total: 0
- 15:18:11.880 DEBUG [y2pEKWMS] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/COUPON/1 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/target/COUPON/1
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getTargetHistory(String, Long, int)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"y2pEKWMS", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976691879}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.884 DEBUG [KFgx2Chc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
- 15:18:11.885 WARN [KFgx2Chc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/target/USER/1
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"KFgx2Chc", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976691884}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.891 DEBUG [sQ8Sv4yp] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER | IP: 127.0.0.1
- 15:18:11.892 DEBUG [sQ8Sv4yp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.892 DEBUG [sQ8Sv4yp] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.894 DEBUG [sQ8Sv4yp] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.895 DEBUG [sQ8Sv4yp] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Preparing: SELECT COUNT(*) FROM t_operation_audit_log WHERE module = ? AND operation_time >= ? AND operation_time <= ?
- 15:18:11.895 DEBUG [sQ8Sv4yp] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Parameters: USER(String), null, null
- 15:18:11.896 DEBUG [sQ8Sv4yp] [1] [ main] .m.O.countByModuleAndTimeRange : <== Total: 1
- 15:18:11.898 DEBUG [sQ8Sv4yp] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER 200 7ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/stats
- Parameters = {module=[USER]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"sQ8Sv4yp", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"count":0},"timestamp":1782976691896}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.903 DEBUG [FdxkNSGd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=LEVEL | IP: 127.0.0.1
- 15:18:11.904 DEBUG [FdxkNSGd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.904 DEBUG [FdxkNSGd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.906 DEBUG [FdxkNSGd] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.907 DEBUG [FdxkNSGd] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Preparing: SELECT COUNT(*) FROM t_operation_audit_log WHERE module = ? AND operation_time >= ? AND operation_time <= ?
- 15:18:11.907 DEBUG [FdxkNSGd] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Parameters: LEVEL(String), null, null
- 15:18:11.908 DEBUG [FdxkNSGd] [1] [ main] .m.O.countByModuleAndTimeRange : <== Total: 1
- 15:18:11.909 DEBUG [FdxkNSGd] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=LEVEL 200 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/stats
- Parameters = {module=[LEVEL]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"FdxkNSGd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"count":0},"timestamp":1782976691909}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.914 DEBUG [ZvRyZ59a] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats | IP: 127.0.0.1
- 15:18:11.915 DEBUG [ZvRyZ59a] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.915 DEBUG [ZvRyZ59a] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.916 DEBUG [ZvRyZ59a] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.917 DEBUG [ZvRyZ59a] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Preparing: SELECT COUNT(*) FROM t_operation_audit_log WHERE module = ? AND operation_time >= ? AND operation_time <= ?
- 15:18:11.917 DEBUG [ZvRyZ59a] [1] [ main] .m.O.countByModuleAndTimeRange : ==> Parameters: USER(String), 2024-01-01T00:00(LocalDateTime), 2030-12-31T23:59:59(LocalDateTime)
- 15:18:11.919 DEBUG [ZvRyZ59a] [1] [ main] .m.O.countByModuleAndTimeRange : <== Total: 1
- 15:18:11.920 DEBUG [ZvRyZ59a] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats 200 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/stats
- Parameters = {module=[USER], startTime=[2024-01-01T00:00:00], endTime=[2030-12-31T23:59:59]}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ZvRyZ59a", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"count":0},"timestamp":1782976691919}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.925 DEBUG [cC3T6zhb] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats | IP: 127.0.0.1
- 15:18:11.926 DEBUG [cC3T6zhb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:11.926 DEBUG [cC3T6zhb] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:11.928 DEBUG [cC3T6zhb] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:11.929 ERROR [cC3T6zhb] [1] [ main] c.x.h.GlobalExceptionHandler : 系统异常
- org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'module' for method parameter type String is not present
- at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValueInternal(RequestParamMethodArgumentResolver.java:220)
- at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:196)
- at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:125)
- at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122)
- at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:227)
- at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:181)
- at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)
- at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:991)
- at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:896)
- at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
- at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)
- at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
- at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
- at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
- at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
- at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
- at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
- at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
- at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
- at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
- at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
- at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
- at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
- at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
- at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
- at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
- at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
- at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
- at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
- at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
- at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
- at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
- at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
- at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
- at com.xuekairui.gateway.OperationAuditLogTest.getStats_missingModule_shouldReturnError(OperationAuditLogTest.java:302)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
- at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
- at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
- at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
- at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
- at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
- at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
- at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
- at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
- at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
- at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
- at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
- at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
- at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
- at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
- at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
- at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
- at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
- at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
- at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
- at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
- at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
- 15:18:11.930 WARN [cC3T6zhb] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats 500 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/stats
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTEsImV4cCI6MTc4MzA2MzA5MX0.bf7171pSV7wCkSksf1RpAf_EmVDUgewXnh0do8VUnB5DJtvTX6M4LNIZQatkLLbEw8n0ipLqZwAp2KGFA_sxuw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.OperationAuditLogController
- Method = com.xuekairui.user.controller.OperationAuditLogController#getStats(String, LocalDateTime, LocalDateTime)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MissingServletRequestParameterException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 500
- Error message = null
- Headers = [X-Request-Id:"cC3T6zhb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":500,"message":"系统繁忙,请稍后重试","data":null,"timestamp":1782976691929}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:11.933 DEBUG [LHTz3ACk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER | IP: 127.0.0.1
- 15:18:11.934 WARN [LHTz3ACk] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/stats
- Parameters = {module=[USER]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"LHTz3ACk", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976691933}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.346 s -- in 操作审计日志接口测试
- [INFO] Running 支付模块接口测试
- 15:18:11.938 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.PaymentControllerTest]: PaymentControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:11.940 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.PaymentControllerTest
- 15:18:14.899 DEBUG [KbgqtCF9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/plans | IP: 127.0.0.1
- 15:18:14.900 DEBUG [KbgqtCF9] [] [ main] c.x.p.m.P.selectList : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE (status = ?) ORDER BY sort_order ASC
- 15:18:14.900 DEBUG [KbgqtCF9] [] [ main] c.x.p.m.P.selectList : ==> Parameters: 1(Integer)
- 15:18:14.902 DEBUG [KbgqtCF9] [] [ main] c.x.p.m.P.selectList : <== Total: 2
- 15:18:14.904 DEBUG [KbgqtCF9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/plans 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/payment/plans
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#getPlans()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"KbgqtCF9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"planName":"高级会员·月卡","planCode":"MONTHLY_PRO","membershipLevel":"PRO","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9(原价59.9)","tag":"省50%","sortOrder":3},{"id":2,"planName":"高级会员·年卡","planCode":"YEARLY_PRO","membershipLevel":"PRO","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9(原价599.9)","tag":"省50%","sortOrder":4}],"timestamp":1782976694903}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:14.908 DEBUG [fP8HbJrH] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/plans | IP: 127.0.0.1
- 15:18:14.909 DEBUG [fP8HbJrH] [] [ main] c.x.p.m.P.selectList : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE (status = ?) ORDER BY sort_order ASC
- 15:18:14.909 DEBUG [fP8HbJrH] [] [ main] c.x.p.m.P.selectList : ==> Parameters: 1(Integer)
- 15:18:14.911 DEBUG [fP8HbJrH] [] [ main] c.x.p.m.P.selectList : <== Total: 2
- 15:18:14.912 DEBUG [fP8HbJrH] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/plans 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/payment/plans
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#getPlans()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"fP8HbJrH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"planName":"高级会员·月卡","planCode":"MONTHLY_PRO","membershipLevel":"PRO","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9(原价59.9)","tag":"省50%","sortOrder":3},{"id":2,"planName":"高级会员·年卡","planCode":"YEARLY_PRO","membershipLevel":"PRO","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9(原价599.9)","tag":"省50%","sortOrder":4}],"timestamp":1782976694911}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:14.917 DEBUG [AJ6tRG7H] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
- 15:18:14.918 DEBUG [AJ6tRG7H] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:14.918 DEBUG [AJ6tRG7H] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:14.920 DEBUG [AJ6tRG7H] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:14.924 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:14.924 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:14.926 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.045 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:15.046 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580594351415297(Long), OP2072580594017112064(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580594017112064(String), NORMAL(String), 2026-07-02T15:33:14.956912600(LocalDateTime), 2026-07-02T15:18:15.045086100(LocalDateTime), 2026-07-02T15:18:15.045086100(LocalDateTime)
- 15:18:15.049 DEBUG [AJ6tRG7H] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
- 15:18:15.049 INFO [AJ6tRG7H] [1] [ main] c.x.p.s.PaymentOrderService : 创建支付订单: OP2072580594017112064 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
- 15:18:15.056 DEBUG [AJ6tRG7H] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 139ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/order/create
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTQsImV4cCI6MTc4MzA2MzA5NH0.8ocGE4QXgZC1q8xB1bNNQV3Mq3FdMzYvvR0t60rEXFHLCxVvbFuNB8XUjJUR0ZlhbsbEsh8eGHlNYFC-EfFHeQ", Content-Length:"31"]
- Body = {"planId":1,"channel":"WECHAT"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"AJ6tRG7H", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594017112064","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARrklEQVR4Xu3SQW7kShIE0X//S2v2L5wYRzBZJaFpy4aZR5aa//28vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNl01caXDlYRNqjQ655P4mgtq76v4moRNV01c6XAlYZMqjc75JL7mgtr7Kr4mYdNVE1c6XEnYpEqjcz6Jr7mg9r6Kr0nYdNXElQ5XEjap0uicT+JrLqi9r+JrEjZdNXGlw5WETao0OueT+JoLau+r+JqETVdNXOlwJWGTKo3O+SS+5oLaG2icw0vbW650OzZP4u10XaNzTuGl+lbtDTTO4aXtLVe6HZsn8Xa6rtE5p/BSfav2Bhrn8NL2livdjs2TeDtd1+icU3ipvlV7A41zeGl7y5Vux+ZJvJ2ua3TOKbxU36q9gcY5vLS95Uq3Y/Mk3k7XNTrnFF6qb9XeQOMcXtrecqXbsXkSb6frGp1zCi/Vt2pvoJGcBlfSjkZyJjap0jjnNLjS7dikSqPDlbSjcUHtDTSS0+BK2tFIzsQmVRrnnAZXuh2bVGl0uJJ2NC6ovYFGchpcSTsayZnYpErjnNPgSrdjkyqNDlfSjsYFtTfQSE6DK2lHIzkTm1RpnHMaXOl2bFKl0eFK2tG4oPYGGslpcCXtaCRnYpMqjXNOgyvdjk2qNDpcSTsaF9TeQCM5Da6kHY3kTGxSpXHOaXCl27FJlUaHK2lH44LaG2gkp8GVtKORnAZX0o5GciY2CZtUaZxzGlxJOxoX1N5AIzkNrqQdjeQ0uJJ2NJIzsUnYpErjnNPgStrRuKD2BhrJaXAl7Wgkp8GVtKORnIlNwiZVGuecBlfSjsYFtTfQSE6DK2lHIzkNrqQdjeRMbBI2qdI45zS4knY0Lqi9gUZyGlxJOxrJaXAl7WgkZ2KTsEmVxjmnwZW0o3FB7Q00ktPgStrRSE6DK2lHIzkTm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoHEOL6VbGk86O9zd4m5a1jiHl+pbtTfQOIeX0i2NJ50d7m5xNy1rnMNL9a3aG2icw0vplsaTzg53t7ibljXO4aX6Vu0NNM7hpXRL40lnh7tb3E3LGufwUn2r9gYa5/BSuqXxpLPD3S3upmWNc3ipvlV7A41zeCnd0njS2eHuFnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+234c7sfbHOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj/BX/0l/od0/yU25yqN5ExsuupP8Fd/if8h3X+JzblKIzkTm676E/zVX+J/SPdfYnOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj9B+0v8A6Q/gcY5vJSwSZVGcna4m5Y1zjmn8NIN2i2fkB6hcQ4vJWxSpZGcHe6mZY1zzim8dIN2yyekR2icw0sJm1RpJGeHu2lZ45xzCi/doN3yCekRGufwUsImVRrJ2eFuWtY455zCSzdot3xCeoTGObyUsEmVRnJ2uJuWNc45p/DSDdotn5AeoXEOLyVsUqWRnB3upmWNc84pvHSDo1sDjS3upmWNc06DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf/sNyPh3QSE6DKwmbhM22eg5vd9dttlWDK/VO7Q00OqfBlYRNwmZbPYe3u+s226rBlXqn9gYandPgSsImYbOtnsPb3XWbbdXgSr1TewONzmlwJWGTsNlWz+Ht7rrNtmpwpd6pvYFG5zS4krBJ2Gyr5/B2d91mWzW4Uu/U3kCjcxpcSdgkbLbVc3i7u26zrRpcqXdab+LBhM22anAl7Wh0uJJ2NDpc6XZsOlxJ2HRV5EZZYLOtGlxJOxodrqQdjQ5Xuh2bDlcSNl0VuVEW2GyrBlfSjkaHK2lHo8OVbsemw5WETVdFbpQFNtuqwZW0o9HhStrR6HCl27HpcCVh01WRG2WBzbZqcCXtaHS4knY0Olzpdmw6XEnYdFXkRllgs60aXEk7Gh2upB2NDle6HZsOVxI2XRW5URbYpEojOQ2upB2NrTOxSZVGhytpR6NzJjY32G/5qIRNqjSS0+BK2tHYOhObVGl0uJJ2NDpnYnOD/ZaPStikSiM5Da6kHY2tM7FJlUaHK2lHo3MmNjfYb/mohE2qNJLT4Era0dg6E5tUaXS4knY0Omdic4P9lo9K2KRKIzkNrqQdja0zsUmVRocraUejcyY2N9hv+aiETao0ktPgStrR2DoTm1RpdLiSdjQ6Z2Jzg5NbEx+esHkSbydsEjYJmy3udriSdjSO8vB6gc2TeDthk7BJ2Gxxt8OVtKNxlIfXC2yexNsJm4RNwmaLux2upB2Nozy8XmDzJN5O2CRsEjZb3O1wJe1oHOXh9QKbJ/F2wiZhk7DZ4m6HK2lH4ygPrxfYPIm3EzYJm4TNFnc7XEk7Gkdp133UFncTNqnSSNh8Fl+TsNlWE5uumrhS79TeIdxN2KRKI2HzWXxNwmZbTWy6auJKvVN7h3A3YZMqjYTNZ/E1CZttNbHpqokr9U7tHcLdhE2qNBI2n8XXJGy21cSmqyau1Du1dwh3Ezap0kjYfBZfk7DZVhObrpq4Uu/U3iHcTdikSiNh81l8TcJmW01sumriSr3Teg0+oX7E/8XdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjX7cuKjbjwL3E3LGp0zsUmVRudMbLZVgyvdjk3Nvpz4qBvPAnfTskbnTGxSpdE5E5tt1eBKt2NTsy8nPurGs8DdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjVt6cGETao0kjOx+Zv4q7rfZdNVE1cSNjdot3xCwiZVGsmZ2PxN/FXd77LpqokrCZsbtFs+IWGTKo3kTGz+Jv6q7nfZdNXElYTNDdotn5CwSZVGciY2fxN/Vfe7bLpq4krC5gbtlk9I2KRKIzkTm7+Jv6r7XTZdNXElYXODdssnJGxSpZGcic3fxF/V/S6brpq4krC5QbvlE7pH2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BIzsQmYZOwSdgkbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5/2wbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5+yHNbHpqh1e6m7ZJGxSpdHhSrdjkyqNDldu0G75hO4RNl21w0vdLZuETao0OlzpdmxSpdHhyg3aLZ/QPcKmq3Z4qbtlk7BJlUaHK92OTao0Oly5QbvlE7pH2HTVDi91t2wSNqnS6HCl27FJlUaHKzdot3xC9wibrtrhpe6WTcImVRodrnQ7NqnS6HDlBu2WT+geYdNVO7zU3bJJ2KRKo8OVbscmVRodrtyg3fIJ6REaCZuETao0zuGl7pZNwiZVGt/G99W0pQfTSY2ETcImVRrn8FJ3yyZhkyqNb+P7atrSg+mkRsImYZMqjXN4qbtlk7BJlca38X01benBdFIjYZOwSZXGObzU3bJJ2KRK49v4vpq29GA6qZGwSdikSuMcXupu2SRsUqXxbXxfTVt6MJ3USNgkbFKlcQ4vdbdsEjap0vg2vq9mX34X/wDdn8CmqyauJGwSNgmbDlcSNqnSqNmX38U/QPcnsOmqiSsJm4RNwqbDlYRNqjRq9uV38Q/Q/QlsumriSsImYZOw6XAlYZMqjZp9+V38A3R/ApuumriSsEnYJGw6XEnYpEqjZl9+F/8A3Z/ApqsmriRsEjYJmw5XEjap0qjZl9/FP0D3J7DpqokrCZuETcKmw5WETao0atrSg5/F13wb37fF3bSssXUmNkdp133UZ/E138b3bXE3LWtsnYnNUdp1H/VZfM238X1b3E3LGltnYnOUdt1HfRZf82183xZ307LG1pnYHKVd91Gfxdd8G9+3xd20rLF1JjZHadd91GfxNd/G921xNy1rbJ2JzVHadR/15LO8lG5pJGdi82TV4G7CpsOVbscmYXNB7Q00zuGldEsjORObJ6sGdxM2Ha50OzYJmwtqb6BxDi+lWxrJmdg8WTW4m7DpcKXbsUnYXFB7A41zeCnd0kjOxObJqsHdhE2HK92OTcLmgtobaJzDS+mWRnImNk9WDe4mbDpc6XZsEjYX1N5A4xxeSrc0kjOxebJqcDdh0+FKt2OTsLmg9gYayWlwJe1obJ0GVxI2qdJI2HTVDi8lbBI2F9TeQCM5Da6kHY2t0+BKwiZVGgmbrtrhpYRNwuaC2htoJKfBlbSjsXUaXEnYpEojYdNVO7yUsEnYXFB7A43kNLiSdjS2ToMrCZtUaSRsumqHlxI2CZsLam+gkZwGV9KOxtZpcCVhkyqNhE1X7fBSwiZhc0HtDTSS0+BK2tHYOg2uJGxSpZGw6aodXkrYJGwuqL2BRnIaXEk7GslpcCVhk7BJlUZyGlxJ2HS4cpR23UelZ2l0uJJ2NJLT4ErCJmGTKo3kNLiSsOlw5Sjtuo9Kz9LocCXtaCSnwZWETcImVRrJaXAlYdPhylHadR+VnqXR4Ura0UhOgysJm4RNqjSS0+BKwqbDlaO06z4qPUujw5W0o5GcBlcSNgmbVGkkp8GVhE2HK0dp131UepZGhytpRyM5Da4kbBI2qdJIToMrCZsOV47Srvuo9CyNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UHb5z8v3jps7caXDmHlxI226rBlXqn9gYa5/DSZ281uHIOLyVstlWDK/VO7Q00zuGlz95qcOUcXkrYbKsGV+qd2htonMNLn73V4Mo5vJSw2VYNrtQ7tTfQOIeXPnurwZVzeClhs60aXKl3am+gcQ4vffZWgyvn8FLCZls1uFLv1N5X8TXde2xSpZGwSdgkbLpq4soWd4/Srvuoz+JruvfYpEojYZOwSdh01cSVLe4epV33UZ/F13TvsUmVRsImYZOw6aqJK1vcPUq77qM+i6/p3mOTKo2ETcImYdNVE1e2uHuUdt1HfRZf073HJlUaCZuETcKmqyaubHH3KO26j/osvqZ7j02qNBI2CZuETVdNXNni7lGeXX/5Z3k/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR/gfYWtF3xw1oioAAAAASUVORK5CYII=","payUrl":null,"expireTime":"2026-07-02 15:33:14","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695055}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.065 DEBUG [E4EdmcY4] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
- 15:18:15.066 DEBUG [E4EdmcY4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.066 DEBUG [E4EdmcY4] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.068 DEBUG [E4EdmcY4] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.070 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.071 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.073 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.094 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:15.094 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580594540158977(Long), OP2072580594507845632(String), 1(Long), 1(Long), 29.90(BigDecimal), ALIPAY(String), PENDING(String), MOCK_PAY:OP2072580594507845632(String), NORMAL(String), 2026-07-02T15:33:15.073106500(LocalDateTime), 2026-07-02T15:18:15.093688800(LocalDateTime), 2026-07-02T15:18:15.093688800(LocalDateTime)
- 15:18:15.098 DEBUG [E4EdmcY4] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
- 15:18:15.098 INFO [E4EdmcY4] [1] [ main] c.x.p.s.PaymentOrderService : 创建支付订单: OP2072580594507845632 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=支付宝
- 15:18:15.104 DEBUG [E4EdmcY4] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 39ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/order/create
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
- Body = {"planId":1,"channel":"ALIPAY"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"E4EdmcY4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594507845632","planName":"高级会员·月卡","amount":29.90,"channel":"ALIPAY","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAR1klEQVR4Xu3SwY7jypIE0fv/P63Zn3C+cYSSVDeatiyYeWQJ/O/z8nID//mHl5cTvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbQf1n8/xdek92gk5z68nbBJlUbnPImvuaD2foqvSe/RSM59eDthkyqNznkSX3NB7f0UX5Peo5Gc+/B2wiZVGp3zJL7mgtr7Kb4mvUcjOffh7YRNqjQ650l8zQW191N8TXqPRnLuw9sJm1RpdM6T+JoLau+n+Jr0Ho3k3Ie3Ezap0uicJ/E1F9TeQOMcXkq3NBI2XTVxJWHTVTu89Efeqr2Bxjm8lG5pJGy6auJKwqardnjpj7xVewONc3gp3dJI2HTVxJWETVft8NIfeav2Bhrn8FK6pZGw6aqJKwmbrtrhpT/yVu0NNM7hpXRLI2HTVRNXEjZdtcNLf+St2htonMNL6ZZGwqarJq4kbLpqh5f+yFu1N9BIToMraUcjYdPhyhZ307JGchpcSTsaHa6kHY0Lam+gkZwGV9KORsKmw5Ut7qZljeQ0uJJ2NDpcSTsaF9TeQCM5Da6kHY2ETYcrW9xNyxrJaXAl7Wh0uJJ2NC6ovYFGchpcSTsaCZsOV7a4m5Y1ktPgStrR6HAl7WhcUHsDjeQ0uJJ2NBI2Ha5scTctaySnwZW0o9HhStrRuKD2BhrJaXAl7WgkbDpc2eJuWtZIToMraUejw5W0o3FB7Q00ktPgStrR6JyJzbaa2GxxNy1rdE6DK2lH44LaG2gkp8GVtKPRORObbTWx2eJuWtbonAZX0o7GBbU30EhOgytpR6NzJjbbamKzxd20rNE5Da6kHY0Lam+gkZwGV9KORudMbLbVxGaLu2lZo3MaXEk7GhfU3kAjOQ2upB2NzpnYbKuJzRZ307JG5zS4knY0Lqi9gUZyGlxJOxqdM7HZVhObLe6mZY3OaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXs/xdek92j8S86T+JoLau+n+Jr0Ho1/yXkSX3NB7f0UX5Peo/EvOU/iay6ovZ/ia9J7NP4l50l8zQW191N8TXqPxr/kPImvuaD2foqvSe/R+JecJ/E1F7Ten4b/bvqHNRI2Ha7cibf/Ev7adw80kjOx6XDlTrz9l/DXvnugkZyJTYcrd+Ltv4S/9t0DjeRMbDpcuRNv/yX8te8eaCRnYtPhyp14+y/hr333QCM5E5sOV+7E238J7bv9d9M/rJGw6aqJKwmbVGkkbFKl0eFKwiZVGgmbVGkkbC6ovYFGciY2XTVxJWGTKo2ETao0OlxJ2KRKI2GTKo2EzQW1N9BIzsSmqyauJGxSpZGwSZVGhysJm1RpJGxSpZGwuaD2BhrJmdh01cSVhE2qNBI2qdLocCVhkyqNhE2qNBI2F9TeQCM5E5uumriSsEmVRsImVRodriRsUqWRsEmVRsLmgtobaCRnYtNVE1cSNqnSSNikSqPDlYRNqjQSNqnSSNhc0HoTD25xN2HT4Ura0UhOgysJm1RpJGwSNgmbhE1Xfd4PSyM5Da4kbFKlkbBJ2CRsEjZd9Xk/LI3kNLiSsEmVRsImYZOwSdh01ef9sDSS0+BKwiZVGgmbhE3CJmHTVZ/3w9JIToMrCZtUaSRsEjYJm4RNV33eD0sjOQ2uJGxSpZGwSdgkbBI2XfX55sNq8FHds2wSNufwUnfLpqt+iy/ucOWC1tvho7pn2SRszuGl7pZNV/0WX9zhygWtt8NHdc+ySdicw0vdLZuu+i2+uMOVC1pvh4/qnmWTsDmHl7pbNl31W3xxhysXtN4OH9U9yyZhcw4vdbdsuuq3+OIOVy5ovR0+qnuWTcLmHF7qbtl01W/xxR2uXNB6Ew+mkxodrqQdjS3ubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurTf1jOpwMaHa6kHY1zToMrCZtUaXS4knY0Omdi8wXtlk9Ij9DocCXtaJxzGlxJ2KRKo8OVtKPRORObL2i3fEJ6hEaHK2lH45zT4ErCJlUaHa6kHY3Omdh8QbvlE9IjNDpcSTsa55wGVxI2qdLocCXtaHTOxOYL2i2fkB6h0eFK2tE45zS4krBJlUaHK2lHo3MmNl/QbvmE9AiNDlfSjsY5p8GVhE2qNDpcSTsanTOx+YL9lo/qcGWLu2lZI2GTsEmVRocraUdj6+xwt+aLcoUrW9xNyxoJm4RNqjQ6XEk7Gltnh7s1X5QrXNniblrWSNgkbFKl0eFK2tHYOjvcrfmiXOHKFnfTskbCJmGTKo0OV9KOxtbZ4W7NF+UKV7a4m5Y1EjYJm1RpdLiSdjS2zg53a74oV7iyxd20rJGwSdikSqPDlbSjsXV2uFvzRVlg0+FKwiZhk7BJlUZyGlzpdmxSpZGwSZVGckq+KAtsOlxJ2CRsEjap0khOgyvdjk2qNBI2qdJITskXZYFNhysJm4RNwiZVGslpcKXbsUmVRsImVRrJKfmiLLDpcCVhk7BJ2KRKIzkNrnQ7NqnSSNikSiM5JV+UBTYdriRsEjYJm1RpJKfBlW7HJlUaCZtUaSSn5IuywKbDlYRNwiZhkyqN5DS40u3YpEojYZMqjeSUtKUHu5M2Ha5scbfDlbSjkZyJTao0EjYdrnQ7NjVt6cHupE2HK1vc7XAl7WgkZ2KTKo2ETYcr3Y5NTVt6sDtp0+HKFnc7XEk7GsmZ2KRKI2HT4Uq3Y1PTlh7sTtp0uLLF3Q5X0o5GciY2qdJI2HS40u3Y1LSlB7uTNh2ubHG3w5W0o5GciU2qNBI2Ha50OzY1benB7qRNhytb3O1wJe1oJGdikyqNhE2HK92OTc2+nPio7bNcSdgkbFKl0TkTm1RpJGy2VYMraUejZl9OfNT2Wa4kbBI2qdLonIlNqjQSNtuqwZW0o1GzLyc+avssVxI2CZtUaXTOxCZVGgmbbdXgStrRqNmXEx+1fZYrCZuETao0OmdikyqNhM22anAl7WjU7MuJj9o+y5WETcImVRqdM7FJlUbCZls1uJJ2NGr25cRHbZ/lSsImYZMqjc6Z2KRKI2GzrRpcSTsaNV+UBTbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK/t7Pjxhc67S6HCl27FJlUZyJjbnKo3k3Mr+ng9P2JyrNDpc6XZsUqWRnInNuUojObeyv+fDEzbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK+09n3nuoe5ucTdhcw4v/fqWRudMbLrq835Yp/DSr29pdM7Epqs+74d1Ci/9+pZG50xsuurzflin8NKvb2l0zsSmqz7vh3UKL/36lkbnTGy66vN+WKfw0q9vaXTOxKarPv2H1eATukfYbKsGV87tTGyexdek92h0Tsm+nPio7lk226rBlXM7E5tn8TXpPRqdU7IvJz6qe5bNtmpw5dzOxOZZfE16j0bnlOzLiY/qnmWzrRpcObczsXkWX5Peo9E5Jfty4qO6Z9lsqwZXzu1MbJ7F16T3aHROyb6c+KjuWTbbqsGVczsTm2fxNek9Gp1T8kU50Ng6E5s78XbCJlUayXkSX5Peo9E5kdabeDCd1Oicic2deDthkyqN5DyJr0nv0eicSOtNPJhOanTOxOZOvJ2wSZVGcp7E16T3aHROpPUmHkwnNTpnYnMn3k7YpEojOU/ia9J7NDon0noTD6aTGp0zsbkTbydsUqWRnCfxNek9Gp0Tab2JB9NJjc6Z2NyJtxM2qdJIzpP4mvQejc6JtN6fhv9u9w/bJGzO4aUOVzpcSdikSqNmX/4Wf4DuJ7BJ2JzDSx2udLiSsEmVRs2+/C3+AN1PYJOwOYeXOlzpcCVhkyqNmn35W/wBup/AJmFzDi91uNLhSsImVRo1+/K3+AN0P4FNwuYcXupwpcOVhE2qNGr25W/xB+h+ApuEzTm81OFKhysJm1Rp1LSlB5/F15x7j7sJm1RpJKfBlbSj0Tk73K1pSw8+i6859x53Ezap0khOgytpR6Nzdrhb05YefBZfc+497iZsUqWRnAZX0o5G5+xwt6YtPfgsvubce9xN2KRKIzkNrqQdjc7Z4W5NW3rwWXzNufe4m7BJlUZyGlxJOxqds8Pdmrb04LP4mnPvcTdhkyqN5DS4knY0OmeHuzVt6cEvTv6/eCnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPufJaX0i2N5ExsUqWxxd20rNE5Da4kbI7SrvuoO5/lpXRLIzkTm1RpbHE3LWt0ToMrCZujtOs+6s5neSnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPSszQ6XEk7Gh2upB2N5ExsEjYdrpzDSwmbhM0FtTfQSE6DK2lHo8OVtKORnIlNwqbDlXN4KWGTsLmg9gYayWlwJe1odLiSdjSSM7FJ2HS4cg4vJWwSNhfU3kAjOQ2upB2NDlfSjkZyJjYJmw5XzuGlhE3C5oLaG2gkp8GVtKPR4Ura0UjOxCZh0+HKObyUsEnYXFB7A43kNLiSdjQ6XEk7GsmZ2CRsOlw5h5cSNgmbC2pvoJGcBlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1obJ2JTYcraUejw5W0o9HhSocrNW3pwXRSo8OVtKOxdSY2Ha6kHY0OV9KORocrHa7UtKUH00mNDlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1oJOc+vN3hStrR2DoTm4RNwqarPu+H1eDtDlfSjsbWmdgkbBI2XfV5P6wGb3e4knY0ts7EJmGTsOmqz/thNXi7w5W0o7F1JjYJm4RNV33eD6vB2x2upB2NrTOxSdgkbLrq835YDd7ucCXtaGydiU3CJmHTVZ+zH9YpvNTdsulwJe1o3Im3EzbbqsGVeqf2Bhrn8FJ3y6bDlbSjcSfeTthsqwZX6p3aG2icw0vdLZsOV9KOxp14O2GzrRpcqXdqb6BxDi91t2w6XEk7Gnfi7YTNtmpwpd6pvYHGObzU3bLpcCXtaNyJtxM226rBlXqn9gYa5/BSd8umw5W0o3En3k7YbKsGV+qd2vspvia9R6NzJjZd1eBuWtbocCVh0+FKTVt68Fl8TXqPRudMbLqqwd20rNHhSsKmw5WatvTgs/ia9B6NzpnYdFWDu2lZo8OVhE2HKzVt6cFn8TXpPRqdM7HpqgZ307JGhysJmw5XatrSg8/ia9J7NDpnYtNVDe6mZY0OVxI2Ha7UtKUHn8XXpPdodM7Epqsa3E3LGh2uJGw6XKnZly8v/4P3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX/Ay6DIKLn9Mh8AAAAAElFTkSuQmCC","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695103}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.113 DEBUG [YQwLFMWk] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
- 15:18:15.114 DEBUG [YQwLFMWk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.115 DEBUG [YQwLFMWk] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.116 DEBUG [YQwLFMWk] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.123 WARN [YQwLFMWk] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=2004, message=支持的渠道:WECHAT, ALIPAY
- 15:18:15.123 DEBUG [YQwLFMWk] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 10ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/order/create
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"32"]
- Body = {"planId":1,"channel":"INVALID"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"YQwLFMWk", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":2004,"message":"支持的渠道:WECHAT, ALIPAY","data":null,"timestamp":1782976695123}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.129 DEBUG [dqU5Gxsx] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
- 15:18:15.132 WARN [dqU5Gxsx] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 401 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/order/create
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"31"]
- Body = {"planId":1,"channel":"WECHAT"}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"dqU5Gxsx", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976695131}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.138 DEBUG [KvTpWPUD] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
- 15:18:15.138 DEBUG [KvTpWPUD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.138 DEBUG [KvTpWPUD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.141 DEBUG [KvTpWPUD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.143 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.143 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.145 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.155 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:15.155 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580594796011522(Long), OP2072580594814029824(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580594814029824(String), NORMAL(String), 2026-07-02T15:33:15.146155900(LocalDateTime), 2026-07-02T15:18:15.155197400(LocalDateTime), 2026-07-02T15:18:15.155197400(LocalDateTime)
- 15:18:15.159 DEBUG [KvTpWPUD] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
- 15:18:15.159 INFO [KvTpWPUD] [1] [ main] c.x.p.s.PaymentOrderService : 创建支付订单: OP2072580594814029824 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
- 15:18:15.165 DEBUG [KvTpWPUD] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 27ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/order/create
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
- Body = {"planId":1,"channel":"WECHAT"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"KvTpWPUD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594814029824","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARVUlEQVR4Xu3SQZLjSnAE0X//S7f2LwOmsESBFDXw5Zh7ZHEa//29vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7GltnYpOwSdgkbFKlcc5pcCXtaFxQewON5DS4knY0ts7EJmGTsEnYpErjnNPgStrRuKD2BhrJaXAl7WhsnYlNwiZhk7BJlcY5p8GVtKNxQe0NNJLT4Era0dg6E5uETcImYZMqjXNOgytpR+OC2htoJKfBlbSjsXUmNgmbhE3CJlUa55wGV9KOxgW1N9BIToMraUdj60xsEjYJm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkZyTuGlhE3CJlUaHa6kHY0OV9KOxgW1N9BIToMraUcjOafwUsImYZMqjQ5X0o5GhytpR+OC2htoJKfBlbSjkZxTeClhk7BJlUaHK2lHo8OVtKNxQe0NNJLT4Era0UjOKbyUsEnYpEqjw5W0o9HhStrRuKD2BhrJaXAl7Wgk5xReStgkbFKl0eFK2tHocCXtaFxQewON5DS4knY0knMKLyVsEjap0uhwJe1odLiSdjQuqL2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+7+GP7f+wQu8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT/Br/4S/yBP/km8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT9B+0v8D0j/BRrn8FLCJmFzDi+lWxrnnFN46Qbtlk9Ij9A4h5cSNgmbc3gp3dI455zCSzdot3xCeoTGObyUsEnYnMNL6ZbGOecUXrpBu+UT0iM0zuGlhE3C5hxeSrc0zjmn8NIN2i2fkB6hcQ4vJWwSNufwUrqlcc45hZdu0G75hPQIjXN4KWGTsDmHl9ItjXPOKbx0g3bLJ6RHaHS4krBJ2CRszuGlLe4mbBI2CZuETVf9vR/WKby0xd2ETcImYZOw6aq/98M6hZe2uJuwSdgkbBI2XfX3flin8NIWdxM2CZuETcKmq/7eD+sUXtribsImYZOwSdh01d/7YZ3CS1vcTdgkbBI2CZuu+rvzYU1sUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLDyZsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLD6aTGk/i7YRNV01cSdicw0vplkbnTGxu0G75hPQIjSfxdsKmqyauJGzO4aV0S6NzJjY3aLd8QnqExpN4O2HTVRNXEjbn8FK6pdE5E5sbtFs+IT1C40m8nbDpqokrCZtzeCnd0uicic0N2i2fkB6h8STeTth01cSVhM05vJRuaXTOxOYG7ZZPSI/QeBJvJ2y6auJKwuYcXkq3NDpnYnODdssnpEdoJGeHuwmbVGlscTdhkyqNhE2HK2lH4yjtuo9Kz9JIzg53Ezap0tjibsImVRoJmw5X0o7GUdp1H5WepZGcHe4mbFKlscXdhE2qNBI2Ha6kHY2jtOs+Kj1LIzk73E3YpEpji7sJm1RpJGw6XEk7Gkdp131UepZGcna4m7BJlcYWdxM2qdJI2HS4knY0jtKu+6j0LI3k7HA3YZMqjS3uJmxSpZGw6XAl7WgcZb/uM9NDNba4m5Y1zjk73E3YbKuJTVdNXKl3Wm/iwXRSY4u7aVnjnLPD3YTNtprYdNXElXqn9SYeTCc1tribljXOOTvcTdhsq4lNV01cqXdab+LBdFJji7tpWeOcs8PdhM22mth01cSVeqf1Jh5MJzW2uJuWNc45O9xN2GyriU1XTVypd1pv4sF0UmOLu2lZ45yzw92Ezbaa2HTVxJV6p/UmHqxPLvBSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKAca5/BSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKP9f4K96Em931226auJKwuYG+y0f9Zv4q57E2911m66auJKwucF+y0f9Jv6qJ/F2d92mqyauJGxusN/yUb+Jv+pJvN1dt+mqiSsJmxvst3zUb+KvehJvd9dtumriSsLmBvstH/Wb+KuexNvddZuumriSsLlBu+UTto9wJWHzJN7e4m7C5slq4kra0UjYXFB7A40OVxI2T+LtLe4mbJ6sJq6kHY2EzQW1N9DocCVh8yTe3uJuwubJauJK2tFI2FxQewONDlcSNk/i7S3uJmyerCaupB2NhM0FtTfQ6HAlYfMk3t7ibsLmyWriStrRSNhcUHsDjQ5XEjZP4u0t7iZsnqwmrqQdjYTNBbU30EhOgyvbnQYvJWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV39kPq8GVbsemqxrcTdikSqPDlW7HJlUaHa7coN3yCdtHuNLt2HRVg7sJm1RpdLjS7dikSqPDlRu0Wz5h+whXuh2brmpwN2GTKo0OV7odm1RpdLhyg3bLJ2wf4Uq3Y9NVDe4mbFKl0eFKt2OTKo0OV27QbvmE7SNc6XZsuqrB3YRNqjQ6XOl2bFKl0eHKDdotn7B9hCvdjk1XNbibsEmVRocr3Y5NqjQ6XLlBu+UT0iM0kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9Xsy+/i/8BCZttNbFJ2HTVxJUOVxI2qdKo2Zffxf+AhM22mtgkbLpq4kqHKwmbVGnU7Mvv4n9AwmZbTWwSNl01caXDlYRNqjRq9uV38T8gYbOtJjYJm66auNLhSsImVRo1+/K7+B+QsNlWE5uETVdNXOlwJWGTKo2affld/A9I2GyriU3CpqsmrnS4krBJlUZNW3rws/iahE3CZou7W9xNyxpbZ2JzlHbdR30WX5OwSdhscXeLu2lZY+tMbI7Srvuoz+JrEjYJmy3ubnE3LWtsnYnNUdp1H/VZfE3CJmGzxd0t7qZlja0zsTlKu+6jPouvSdgkbLa4u8XdtKyxdSY2R2nXfdRn8TUJm4TNFne3uJuWNbbOxOYo7bqPevJZXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00zuGldEsjOQ2upB2N5ExsUqWRsOlwpduxSdhcUHsDjXN4Kd3SSE6DK2lHIzkTm1RpJGw6XOl2bBI2F9TeQOMcXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00ktPgStrR6JyJTcImYXOu0jiHlxI2CZsLam+gkZwGV9KORudMbBI2CZtzlcY5vJSwSdhcUHsDjeQ0uJJ2NDpnYpOwSdicqzTO4aWETcLmgtobaCSnwZW0o9E5E5uETcLmXKVxDi8lbBI2F9TeQCM5Da6kHY3OmdgkbBI25yqNc3gpYZOwuaD2BhrJaXAl7Wh0zsQmYZOwOVdpnMNLCZuEzQW1N9BIToMraUfjSafBlS3uJmwSNh2uHKVd91HpWRodrqQdjSedBle2uJuwSdh0uHKUdt1HpWdpdLiSdjSedBpc2eJuwiZh0+HKUdp1H5WepdHhStrReNJpcGWLuwmbhE2HK0dp131UepZGhytpR+NJp8GVLe4mbBI2Ha4cpV33UelZGh2upB2NJ50GV7a4m7BJ2HS4cpR23UelZ2l0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT144+T/ipeevDXx9va6K92OTcJmWzW4Uu/U3kDjHF568tbE29vrrnQ7NgmbbdXgSr1TewONc3jpyVsTb2+vu9Lt2CRstlWDK/VO7Q00zuGlJ29NvL297kq3Y5Ow2VYNrtQ7tTfQOIeXnrw18fb2uivdjk3CZls1uFLv1N5A4xxeevLWxNvb6650OzYJm23V4Eq9U3tfxdd8+z0T35ew6aqJK1vcPUq77qM+i6/59nsmvi9h01UTV7a4e5R23Ud9Fl/z7fdMfF/Cpqsmrmxx9yjtuo/6LL7m2++Z+L6ETVdNXNni7lHadR/1WXzNt98z8X0Jm66auLLF3aO06z7qs/iab79n4vsSNl01cWWLu0d5dv3ln+X9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuF/ANQkBqB7RoIFAAAAAElFTkSuQmCC","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695164}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.166 DEBUG [FprJMeHK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/order/OP2072580594814029824 | IP: 127.0.0.1
- 15:18:15.168 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
- 15:18:15.168 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Parameters: OP2072580594814029824(String)
- 15:18:15.170 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectByOrderNo : <== Total: 1
- 15:18:15.171 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.171 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.172 DEBUG [FprJMeHK] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.180 DEBUG [FprJMeHK] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/order/OP2072580594814029824 200 14ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/payment/order/OP2072580594814029824
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#queryOrder(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"FprJMeHK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580594814029824","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARVUlEQVR4Xu3SQZLjSnAE0X//S7f2LwOmsESBFDXw5Zh7ZHEa//29vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7GltnYpOwSdgkbFKlcc5pcCXtaFxQewON5DS4knY0ts7EJmGTsEnYpErjnNPgStrRuKD2BhrJaXAl7WhsnYlNwiZhk7BJlcY5p8GVtKNxQe0NNJLT4Era0dg6E5uETcImYZMqjXNOgytpR+OC2htoJKfBlbSjsXUmNgmbhE3CJlUa55wGV9KOxgW1N9BIToMraUdj60xsEjYJm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkZyTuGlhE3CJlUaHa6kHY0OV9KOxgW1N9BIToMraUcjOafwUsImYZMqjQ5X0o5GhytpR+OC2htoJKfBlbSjkZxTeClhk7BJlUaHK2lHo8OVtKNxQe0NNJLT4Era0UjOKbyUsEnYpEqjw5W0o9HhStrRuKD2BhrJaXAl7Wgk5xReStgkbFKl0eFK2tHocCXtaFxQewON5DS4knY0knMKLyVsEjap0uhwJe1odLiSdjQuqL2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+7+GP7f+wQu8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT/Br/4S/yBP/km8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT9B+0v8D0j/BRrn8FLCJmFzDi+lWxrnnFN46Qbtlk9Ij9A4h5cSNgmbc3gp3dI455zCSzdot3xCeoTGObyUsEnYnMNL6ZbGOecUXrpBu+UT0iM0zuGlhE3C5hxeSrc0zjmn8NIN2i2fkB6hcQ4vJWwSNufwUrqlcc45hZdu0G75hPQIjXN4KWGTsDmHl9ItjXPOKbx0g3bLJ6RHaHS4krBJ2CRszuGlLe4mbBI2CZuETVf9vR/WKby0xd2ETcImYZOw6aq/98M6hZe2uJuwSdgkbBI2XfX3flin8NIWdxM2CZuETcKmq/7eD+sUXtribsImYZOwSdh01d/7YZ3CS1vcTdgkbBI2CZuu+rvzYU1sUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLDyZsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLD6aTGk/i7YRNV01cSdicw0vplkbnTGxu0G75hPQIjSfxdsKmqyauJGzO4aV0S6NzJjY3aLd8QnqExpN4O2HTVRNXEjbn8FK6pdE5E5sbtFs+IT1C40m8nbDpqokrCZtzeCnd0uicic0N2i2fkB6h8STeTth01cSVhM05vJRuaXTOxOYG7ZZPSI/QeBJvJ2y6auJKwuYcXkq3NDpnYnODdssnpEdoJGeHuwmbVGlscTdhkyqNhE2HK2lH4yjtuo9Kz9JIzg53Ezap0tjibsImVRoJmw5X0o7GUdp1H5WepZGcHe4mbFKlscXdhE2qNBI2Ha6kHY2jtOs+Kj1LIzk73E3YpEpji7sJm1RpJGw6XEk7Gkdp131UepZGcna4m7BJlcYWdxM2qdJI2HS4knY0jtKu+6j0LI3k7HA3YZMqjS3uJmxSpZGw6XAl7WgcZb/uM9NDNba4m5Y1zjk73E3YbKuJTVdNXKl3Wm/iwXRSY4u7aVnjnLPD3YTNtprYdNXElXqn9SYeTCc1tribljXOOTvcTdhsq4lNV01cqXdab+LBdFJji7tpWeOcs8PdhM22mth01cSVeqf1Jh5MJzW2uJuWNc45O9xN2GyriU1XTVypd1pv4sF0UmOLu2lZ45yzw92Ezbaa2HTVxJV6p/UmHqxPLvBSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKAca5/BSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKP9f4K96Em931226auJKwuYG+y0f9Zv4q57E2911m66auJKwucF+y0f9Jv6qJ/F2d92mqyauJGxusN/yUb+Jv+pJvN1dt+mqiSsJmxvst3zUb+KvehJvd9dtumriSsLmBvstH/Wb+KuexNvddZuumriSsLlBu+UTto9wJWHzJN7e4m7C5slq4kra0UjYXFB7A40OVxI2T+LtLe4mbJ6sJq6kHY2EzQW1N9DocCVh8yTe3uJuwubJauJK2tFI2FxQewONDlcSNk/i7S3uJmyerCaupB2NhM0FtTfQ6HAlYfMk3t7ibsLmyWriStrRSNhcUHsDjQ5XEjZP4u0t7iZsnqwmrqQdjYTNBbU30EhOgyvbnQYvJWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV39kPq8GVbsemqxrcTdikSqPDlW7HJlUaHa7coN3yCdtHuNLt2HRVg7sJm1RpdLjS7dikSqPDlRu0Wz5h+whXuh2brmpwN2GTKo0OV7odm1RpdLhyg3bLJ2wf4Uq3Y9NVDe4mbFKl0eFKt2OTKo0OV27QbvmE7SNc6XZsuqrB3YRNqjQ6XOl2bFKl0eHKDdotn7B9hCvdjk1XNbibsEmVRocr3Y5NqjQ6XLlBu+UT0iM0kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9Xsy+/i/8BCZttNbFJ2HTVxJUOVxI2qdKo2Zffxf+AhM22mtgkbLpq4kqHKwmbVGnU7Mvv4n9AwmZbTWwSNl01caXDlYRNqjRq9uV38T8gYbOtJjYJm66auNLhSsImVRo1+/K7+B+QsNlWE5uETVdNXOlwJWGTKo2affld/A9I2GyriU3CpqsmrnS4krBJlUZNW3rws/iahE3CZou7W9xNyxpbZ2JzlHbdR30WX5OwSdhscXeLu2lZY+tMbI7Srvuoz+JrEjYJmy3ubnE3LWtsnYnNUdp1H/VZfE3CJmGzxd0t7qZlja0zsTlKu+6jPouvSdgkbLa4u8XdtKyxdSY2R2nXfdRn8TUJm4TNFne3uJuWNbbOxOYo7bqPevJZXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00zuGldEsjOQ2upB2N5ExsUqWRsOlwpduxSdhcUHsDjXN4Kd3SSE6DK2lHIzkTm1RpJGw6XOl2bBI2F9TeQOMcXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00ktPgStrR6JyJTcImYXOu0jiHlxI2CZsLam+gkZwGV9KORudMbBI2CZtzlcY5vJSwSdhcUHsDjeQ0uJJ2NDpnYpOwSdicqzTO4aWETcLmgtobaCSnwZW0o9E5E5uETcLmXKVxDi8lbBI2F9TeQCM5Da6kHY3OmdgkbBI25yqNc3gpYZOwuaD2BhrJaXAl7Wh0zsQmYZOwOVdpnMNLCZuEzQW1N9BIToMraUfjSafBlS3uJmwSNh2uHKVd91HpWRodrqQdjSedBle2uJuwSdh0uHKUdt1HpWdpdLiSdjSedBpc2eJuwiZh0+HKUdp1H5WepdHhStrReNJpcGWLuwmbhE2HK0dp131UepZGhytpR+NJp8GVLe4mbBI2Ha4cpV33UelZGh2upB2NJ50GV7a4m7BJ2HS4cpR23UelZ2l0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT144+T/ipeevDXx9va6K92OTcJmWzW4Uu/U3kDjHF568tbE29vrrnQ7NgmbbdXgSr1TewONc3jpyVsTb2+vu9Lt2CRstlWDK/VO7Q00zuGlJ29NvL297kq3Y5Ow2VYNrtQ7tTfQOIeXnrw18fb2uivdjk3CZls1uFLv1N5A4xxeevLWxNvb6650OzYJm23V4Eq9U3tfxdd8+z0T35ew6aqJK1vcPUq77qM+i6/59nsmvi9h01UTV7a4e5R23Ud9Fl/z7fdMfF/Cpqsmrmxx9yjtuo/6LL7m2++Z+L6ETVdNXNni7lHadR/1WXzNt98z8X0Jm66auLLF3aO06z7qs/iab79n4vsSNl01cWWLu0d5dv3ln+X9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuF/ANQkBqB7RoIFAAAAAElFTkSuQmCC","payUrl":"MOCK_PAY:OP2072580594814029824","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695180}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.188 DEBUG [hN5y3NGr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/order/OP_NOTEXIST | IP: 127.0.0.1
- 15:18:15.189 DEBUG [hN5y3NGr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.189 DEBUG [hN5y3NGr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.192 DEBUG [hN5y3NGr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.193 DEBUG [hN5y3NGr] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
- 15:18:15.193 DEBUG [hN5y3NGr] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Parameters: OP_NOTEXIST(String)
- 15:18:15.195 DEBUG [hN5y3NGr] [1] [ main] c.x.p.m.P.selectByOrderNo : <== Total: 0
- 15:18:15.196 WARN [hN5y3NGr] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=2001, message=支付订单不存在
- 15:18:15.197 DEBUG [hN5y3NGr] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/order/OP_NOTEXIST 200 9ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/payment/order/OP_NOTEXIST
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#queryOrder(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"hN5y3NGr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":2001,"message":"支付订单不存在","data":null,"timestamp":1782976695196}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.205 DEBUG [P6xhCMXY] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
- 15:18:15.205 DEBUG [P6xhCMXY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.206 DEBUG [P6xhCMXY] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.208 DEBUG [P6xhCMXY] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.211 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.211 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.213 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.221 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:15.221 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580595118972929(Long), OP2072580595095048192(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580595095048192(String), NORMAL(String), 2026-07-02T15:33:15.213451100(LocalDateTime), 2026-07-02T15:18:15.220602200(LocalDateTime), 2026-07-02T15:18:15.220602200(LocalDateTime)
- 15:18:15.224 DEBUG [P6xhCMXY] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
- 15:18:15.224 INFO [P6xhCMXY] [1] [ main] c.x.p.s.PaymentOrderService : 创建支付订单: OP2072580595095048192 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
- 15:18:15.229 DEBUG [P6xhCMXY] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 24ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/order/create
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
- Body = {"planId":1,"channel":"WECHAT"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"P6xhCMXY", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595095048192","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAR2klEQVR4Xu3SQW4kSxID0X//S2v2z5kAxxWhEtRpy4YZPUqd/329vFzgP//h5eUE74f1coX3w3q5wvthvVzh/bBervB+WC9XeD+slyu8H9bLFd4P6+UK74f1coX3w3q5wvthvVyh/bD++yi+psOVbsfmZrXDSz+Lr3mg9j6Kr+lwpduxuVnt8NLP4mseqL2P4ms6XOl2bG5WO7z0s/iaB2rvo/iaDle6HZub1Q4v/Sy+5oHa+yi+psOVbsfmZrXDSz+Lr3mg9j6Kr+lwpduxuVnt8NLP4mseqL2Bxjm8lG5pnMNL21uuJGwSNqnSOIeX6lu1N9A4h5fSLY1zeGl7y5WETcImVRrn8FJ9q/YGGufwUrqlcQ4vbW+5krBJ2KRK4xxeqm/V3kDjHF5KtzTO4aXtLVcSNgmbVGmcw0v1rdobaJzDS+mWxjm8tL3lSsImYZMqjXN4qb5VewONc3gp3dI4h5e2t1xJ2CRsUqVxDi/Vt2pvoJGcBlfSjkbCJmGTsEnYpEojYZOwSZVGchpcSTsaD9TeQCM5Da6kHY2ETcImYZOwSZVGwiZhkyqN5DS4knY0Hqi9gUZyGlxJOxoJm4RNwiZhkyqNhE3CJlUayWlwJe1oPFB7A43kNLiSdjQSNgmbhE3CJlUaCZuETao0ktPgStrReKD2BhrJaXAl7WgkbBI2CZuETao0EjYJm1RpJKfBlbSj8UDtDTSS0+BK2tFI2CRsEjYJm1RpJGwSNqnSSE6DK2lH44HaG2gkp8GVtKORsEnYJGw6XEk7GsmZ2KRKIzkNrqQdjQdqb6CRnAZX0o5GwiZhk7DpcCXtaCRnYpMqjeQ0uJJ2NB6ovYFGchpcSTsaCZuETcKmw5W0o5GciU2qNJLT4Era0Xig9gYayWlwJe1oJGwSNgmbDlfSjkZyJjap0khOgytpR+OB2htoJKfBlbSjkbBJ2CRsOlxJOxrJmdikSiM5Da6kHY0Ham+gkZwGV9KORsImYZOw6XAl7WgkZ2KTKo3kNLiSdjQeqL2BRnIaXEk7GlunwZW0o9HhStrROOc0uJJ2NB6ovYFGchpcSTsaW6fBlbSj0eFK2tE45zS4knY0Hqi9gUZyGlxJOxpbp8GVtKPR4Ura0TjnNLiSdjQeqL2BRnIaXEk7GlunwZW0o9HhStrROOc0uJJ2NB6ovYFGchpcSTsaW6fBlbSj0eFK2tE45zS4knY0Hqi9gUZyGlxJOxpbp8GVtKPR4Ura0TjnNLiSdjQeqL2Bxjm81N2y6aqJK9udHd5O1zWScwov1bdqb6BxDi91t2y6auLKdmeHt9N1jeScwkv1rdobaJzDS90tm66auLLd2eHtdF0jOafwUn2r9gYa5/BSd8umqyaubHd2eDtd10jOKbxU36q9gcY5vNTdsumqiSvbnR3eTtc1knMKL9W3am+gcQ4vdbdsumriynZnh7fTdY3knMJL9a3a+yi+Jr1H419yfhJf80DtfRRfk96j8S85P4mveaD2PoqvSe/R+Jecn8TXPFB7H8XXpPdo/EvOT+JrHqi9j+Jr0ns0/iXnJ/E1D9TeR/E16T0a/5Lzk/iaB1rv38E/ZMImVRqd82f4y79th//5CZtUaXTOn+Ev/7Yd/ucnbFKl0Tl/hr/823b4n5+wSZVG5/wZ/vJv2+F/fsImVRqd82f4y79th//5CZtUaXTOn6H9bf5J0h9F46YzsUmVRsJmW01sumqHl7pbNl0VaUsPppMaN52JTao0EjbbamLTVTu81N2y6apIW3owndS46UxsUqWRsNlWE5uu2uGl7pZNV0Xa0oPppMZNZ2KTKo2Ezbaa2HTVDi91t2y6KtKWHkwnNW46E5tUaSRsttXEpqt2eKm7ZdNVkbb0YDqpcdOZ2KRKI2GzrSY2XbXDS90tm66K7MuJj+pwpcOV7U6DlxI2XbXDS+mWxhZ36+XWa/AJHa50uLLdafBSwqardngp3dLY4m693HoNPqHDlQ5XtjsNXkrYdNUOL6VbGlvcrZdbr8EndLjS4cp2p8FLCZuu2uGldEtji7v1cus1+IQOVzpc2e40eClh01U7vJRuaWxxt15uvQaf0OFKhyvbnQYvJWy6aoeX0i2NLe7Wy7U30EjYpEqjw5VuxyZh01UTVxI2Ha50uNLt2NS0pQe7kzap0uhwpduxSdh01cSVhE2HKx2udDs2NW3pwe6kTao0OlzpdmwSNl01cSVh0+FKhyvdjk1NW3qwO2mTKo0OV7odm4RNV01cSdh0uNLhSrdjU9OWHuxO2qRKo8OVbscmYdNVE1cSNh2udLjS7djUtKUHu5M2qdLocKXbsUnYdNXElYRNhysdrnQ7NjVt6cF0UmPr7HC3W7Y5V2kkbDpc6XZsUqWRnJK29GA6qbF1drjbLducqzQSNh2udDs2qdJITklbejCd1Ng6O9ztlm3OVRoJmw5Xuh2bVGkkp6QtPZhOamydHe52yzbnKo2ETYcr3Y5NqjSSU9KWHkwnNbbODne7ZZtzlUbCpsOVbscmVRrJKWlLD6aTGltnh7vdss25SiNh0+FKt2OTKo3klLSlB7uTNqnSSNgkbLrqFN7eXncl7WgkbFKlkZyJzQO1N9BI2KRKI2GTsOmqU3h7e92VtKORsEmVRnImNg/U3kAjYZMqjYRNwqarTuHt7XVX0o5GwiZVGsmZ2DxQewONhE2qNBI2CZuuOoW3t9ddSTsaCZtUaSRnYvNA7Q00Ejap0kjYJGy66hTe3l53Je1oJGxSpZGcic0DtTfQSNikSiNhk7DpqlN4e3vdlbSjkbBJlUZyJjYP1F6BTcImYZOw2VYNrmx3GrzU3bJJlcZl2ns+M2GTsEnYJGy2VYMr250GL3W3bFKlcZn2ns9M2CRsEjYJm23V4Mp2p8FL3S2bVGlcpr3nMxM2CZuETcJmWzW4st1p8FJ3yyZVGpdp7/nMhE3CJmGTsNlWDa5sdxq81N2ySZXGZdp7PjNhk7BJ2CRstlWDK9udBi91t2xSpXGZ/T0f/rP4mi3upmWNc3ipw5W0o9E5E5uab5QfxddscTcta5zDSx2upB2NzpnY1Hyj/Ci+Zou7aVnjHF7qcCXtaHTOxKbmG+VH8TVb3E3LGufwUocraUejcyY2Nd8oP4qv2eJuWtY4h5c6XEk7Gp0zsan5RvlRfM0Wd9Oyxjm81OFK2tHonIlNTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKTVt6sMOVtKNxE2+n6xoJm66auNLhSrdj0+FKzb7c4cPT0zU6XEnYbKsGV9KOxjlnYpMqjYTNA613Cp+ZHqrR4UrCZls1uJJ2NM45E5tUaSRsHmi9U/jM9FCNDlcSNtuqwZW0o3HOmdikSiNh80DrncJnpodqdLiSsNlWDa6kHY1zzsQmVRoJmwda7xQ+Mz1Uo8OVhM22anAl7WiccyY2qdJI2DzQeqfwmemhGh2uJGy2VYMraUfjnDOxSZVGwuaB1pt4MGGTsDlXaZxzJjap0rjpTGwSNgmbB1pv4sGETcLmXKVxzpnYpErjpjOxSdgkbB5ovYkHEzYJm3OVxjlnYpMqjZvOxCZhk7B5oPUmHkzYJGzOVRrnnIlNqjRuOhObhE3C5oHWm3gwYZOwOVdpnHMmNqnSuOlMbBI2CZsHWm/iwYRNwuZcpXHOmdikSuOmM7FJ2CRsHqi9gUaHK+fwUocrCZuEzRZ3EzYJm66auFLTlh7cnnTlHF7qcCVhk7DZ4m7CJmHTVRNXatrSg9uTrpzDSx2uJGwSNlvcTdgkbLpq4kpNW3pwe9KVc3ipw5WETcJmi7sJm4RNV01cqWlLD25PunIOL3W4krBJ2GxxN2GTsOmqiSs1benB7UlXzuGlDlcSNgmbLe4mbBI2XTVxpeYb5UAjYZOwSZXGFne7ZZtUaSRsOlxJ2CRsuqpkv+WjumfZJGxSpbHF3W7ZJlUaCZsOVxI2CZuuKtlv+ajuWTYJm1RpbHG3W7ZJlUbCpsOVhE3CpqtK9ls+qnuWTcImVRpb3O2WbVKlkbDpcCVhk7DpqpL9lo/qnmWTsEmVxhZ3u2WbVGkkbDpcSdgkbLqqZL/lo7pn2SRsUqWxxd1u2SZVGgmbDlcSNgmbrippt3xCeoTGObyUbml0uPL7du7h7YRNV329H5Yrv2/nHt5O2HTV1/thufL7du7h7YRNV329H5Yrv2/nHt5O2HTV1/thufL7du7h7YRNV329H5Yrv2/nHt5O2HTVV/9h/Tb8uekHayRsUqXR4Uq3Y9NVE1e6HZuuiuzLz+IfIP0JNBI2qdLocKXbsemqiSvdjk1XRfblZ/EPkP4EGgmbVGl0uNLt2HTVxJVux6arIvvys/gHSH8CjYRNqjQ6XOl2bLpq4kq3Y9NVkX35WfwDpD+BRsImVRodrnQ7Nl01caXbsemqyL78LP4B0p9AI2GTKo0OV7odm66auNLt2HRVpC09+LP4moTNFnfTskbCJmGTKo2tcwovPVB7H8XXJGy2uJuWNRI2CZtUaWydU3jpgdr7KL4mYbPF3bSskbBJ2KRKY+ucwksP1N5H8TUJmy3upmWNhE3CJlUaW+cUXnqg9j6Kr0nYbHE3LWskbBI2qdLYOqfw0gO191F8TcJmi7tpWSNhk7BJlcbWOYWXHqi9gcY5vHTulrtb3O1wJe1oJKfBlYTNtorU3kDjHF46d8vdLe52uJJ2NJLT4ErCZltFam+gcQ4vnbvl7hZ3O1xJOxrJaXAlYbOtIrU30DiHl87dcneLux2upB2N5DS4krDZVpHaG2icw0vnbrm7xd0OV9KORnIaXEnYbKtI7Q00zuGlc7fc3eJuhytpRyM5Da4kbLZVpPYGGslpcCXtaJxzGly5uaNxDi+lWxrfoN3yCekRGh2upB2Nc06DKzd3NM7hpXRL4xu0Wz4hPUKjw5W0o3HOaXDl5o7GObyUbml8g3bLJ6RHaHS4knY0zjkNrtzc0TiHl9ItjW/QbvmE9AiNDlfSjsY5p8GVmzsa5/BSuqXxDdotn5AeodHhStrROOc0uHJzR+McXkq3NL5Bu+UT0iM0OlxJOxodrqQdjS3upmWNhE1X/ULad/tz0w/W6HAl7Wh0uJJ2NLa4m5Y1EjZd9Qtp3+3PTT9Yo8OVtKPR4Ura0djiblrWSNh01S+kfbc/N/1gjQ5X0o5GhytpR2OLu2lZI2HTVb+Q9t3+3PSDNTpcSTsaHa6kHY0t7qZljYRNV/1C2nf7c9MP1uhwJe1odLiSdjS2uJuWNRI2XfULad/tz00/WKPDlbSjsXUmNh2upB2NhM222uFuWtZITqT2BhrJaXAl7WhsnYlNhytpRyNhs612uJuWNZITqb2BRnIaXEk7GltnYtPhStrRSNhsqx3upmWN5ERqb6CRnAZX0o7G1pnYdLiSdjQSNttqh7tpWSM5kdobaCSnwZW0o7F1JjYdrqQdjYTNttrhblrWSE6k9gYayWlwJe1obJ2JTYcraUcjYbOtdribljWSE6m9gcY5vHTulrsJm1RpJGzO4aUOV7odm676ej+siU2qNBI25/BShyvdjk1Xfb0f1sQmVRoJm3N4qcOVbsemq77eD2tikyqNhM05vNThSrdj01Vf74c1sUmVRsLmHF7qcKXbsemqr/fDmtikSiNhcw4vdbjS7dh01dd3PqyfxNek92h0uJJ2NJLT4Era0UjYdNUpvP1A7X0UX5Peo9HhStrRSE6DK2lHI2HTVafw9gO191F8TXqPRocraUcjOQ2upB2NhE1XncLbD9TeR/E16T0aHa6kHY3kNLiSdjQSNl11Cm8/UHsfxdek92h0uJJ2NJLT4Era0UjYdNUpvP1A7X0UX5Peo9HhStrRSE6DK2lHI2HTVafw9gOt9/Lyf/F+WC9XeD+slyu8H9bLFd4P6+UK74f1coX3w3q5wvthvVzh/bBervB+WC9XeD+slyu8H9bLFd4P6+UK/wOCyto8mCaaOQAAAABJRU5ErkJggg==","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695228}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.230 DEBUG [P2VP9H3y] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595095048192/pay | IP: 127.0.0.1
- 15:18:15.233 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
- 15:18:15.233 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Parameters: OP2072580595095048192(String)
- 15:18:15.235 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectByOrderNo : <== Total: 1
- 15:18:15.240 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.241 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.242 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.247 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, create_time=?, update_time=? WHERE id=?
- 15:18:15.247 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: OP2072580595095048192(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595095048192(String), NORMAL(String), WECHAT(String), MOCK_E8A327CE02CA485F(String), 2026-07-02T15:18:15.242857500(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595118972929(Long)
- 15:18:15.251 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
- 15:18:15.251 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.251 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.253 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.253 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:15.254 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:15.256 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:15.256 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
- 15:18:15.257 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectList : ==> Parameters: 1(Long), 1(Integer)
- 15:18:15.258 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:18:15.261 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:15.261 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580595244802050(Long), 1(Long), PRO(String), RECHARGE(String), 2026-07-02T15:18:15.258573500(LocalDateTime), 2026-08-01T15:18:15.258573500(LocalDateTime), 1(Integer), 支付购买: OP2072580595095048192(String), 2026-07-02T15:18:15.261241300(LocalDateTime), 2026-07-02T15:18:15.261241300(LocalDateTime)
- 15:18:15.265 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.insert : <== Updates: 1
- 15:18:15.266 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:18:15.266 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:18:15.258573500(LocalDateTime), 0(Long), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
- 15:18:15.269 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:15.270 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:15.270 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580595307716610(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:15.270168800(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), PAY:OP2072580595095048192->PRO(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:15.270702300(LocalDateTime)
- 15:18:15.275 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:15.275 DEBUG [P2VP9H3y] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
- 15:18:15.275 INFO [P2VP9H3y] [1] [ main] c.x.u.s.MembershipService : 用户1通过支付OP2072580595095048192激活会员等级PRO, 有效期30天
- 15:18:15.275 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:15.276 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:15.278 DEBUG [P2VP9H3y] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
- 15:18:15.279 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, membership_record_id=?, create_time=?, update_time=? WHERE id=?
- 15:18:15.281 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: OP2072580595095048192(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595095048192(String), NORMAL(String), WECHAT(String), MOCK_E8A327CE02CA485F(String), 2026-07-02T15:18:15.242857500(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2072580595244802050(Long), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595118972929(Long)
- 15:18:15.284 DEBUG [P2VP9H3y] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
- 15:18:15.285 INFO [P2VP9H3y] [1] [ main] c.x.p.s.PaymentOrderService : 支付成功: OP2072580595095048192 用户=1 方案=高级会员·月卡 金额=29.90元 会员=PRO 交易号=MOCK_E8A327CE02CA485F 类型=NORMAL
- 15:18:15.294 DEBUG [P2VP9H3y] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595095048192/pay 200 64ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/order/OP2072580595095048192/pay
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#confirmPay(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"P2VP9H3y", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595095048192","status":"PAID","amount":29.90,"planName":"高级会员·月卡","membershipLevel":"PRO","paidTime":"2026-07-02 15:18:15","membershipStartDate":null,"membershipEndDate":null},"timestamp":1782976695293}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.302 DEBUG [4ZjyY3B8] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create | IP: 127.0.0.1
- 15:18:15.303 DEBUG [4ZjyY3B8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.303 DEBUG [4ZjyY3B8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.304 DEBUG [4ZjyY3B8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.307 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.308 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.309 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.316 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_order ( id, order_no, user_id, plan_id, amount, channel, status, qr_code_url, order_type, expire_time, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:15.316 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580595500654594(Long), OP2072580595497701376(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PENDING(String), MOCK_PAY:OP2072580595497701376(String), NORMAL(String), 2026-07-02T15:33:15.309724100(LocalDateTime), 2026-07-02T15:18:15.316785600(LocalDateTime), 2026-07-02T15:18:15.316785600(LocalDateTime)
- 15:18:15.319 DEBUG [4ZjyY3B8] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
- 15:18:15.320 INFO [4ZjyY3B8] [1] [ main] c.x.p.s.PaymentOrderService : 创建支付订单: OP2072580595497701376 用户=1 方案=高级会员·月卡 金额=29.90元 渠道=微信支付
- 15:18:15.325 DEBUG [4ZjyY3B8] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/create 200 23ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/order/create
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"31"]
- Body = {"planId":1,"channel":"WECHAT"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#createOrder(CreateOrderRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"4ZjyY3B8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595497701376","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARfUlEQVR4Xu3SQY7jShIE0X//S2v2L5zTjlBSaqFpy4KZR5bA/14PDzfwn394eDjB82E93MLzYT3cwvNhPdzC82E93MLzYT3cwvNhPdzC82E93MLzYT3cwvNhPdzC82E93MLzYT3cQvth/fdVfM233zPxfVvcTcsan8XXXFB7X8XXfPs9E9+3xd20rPFZfM0FtfdVfM233zPxfVvcTcsan8XXXFB7X8XXfPs9E9+3xd20rPFZfM0FtfdVfM233zPxfVvcTcsan8XXXFB7X8XXfPs9E9+3xd20rPFZfM0FtTfQOIeX0i2Nc87EJmHTVTu89Ffeqr2Bxjm8lG5pnHMmNgmbrtrhpb/yVu0NNM7hpXRL45wzsUnYdNUOL/2Vt2pvoHEOL6VbGueciU3Cpqt2eOmvvFV7A41zeCnd0jjnTGwSNl21w0t/5a3aG2icw0vplsY5Z2KTsOmqHV76K2/V3kAjOQ2upB2NhM2d1cSVtKORnAZX0o5GhytpR+OC2htoJKfBlbSjkbC5s5q4knY0ktPgStrR6HAl7WhcUHsDjeQ0uJJ2NBI2d1YTV9KORnIaXEk7Gh2upB2NC2pvoJGcBlfSjkbC5s5q4kra0UhOgytpR6PDlbSjcUHtDTSS0+BK2tFI2NxZTVxJOxrJaXAl7Wh0uJJ2NC6ovYFGchpcSTsaCZs7q4kraUcjOQ2upB2NDlfSjsYFtTfQSE6DK2lHo3MmNttqYrPF3bSs0TkNrqQdjQtqb6CRnAZX0o5G50xsttXEZou7aVmjcxpcSTsaF9TeQCM5Da6kHY3Omdhsq4nNFnfTskbnNLiSdjQuqL2BRnIaXEk7Gp0zsdlWE5st7qZljc5pcCXtaFxQewON5DS4knY0Omdis60mNlvcTcsandPgStrRuKD2BhrJaXAl7Wh0zsRmW01stribljU6p8GVtKNxQe0NNJLT4Era0UjYJGxSpbF1JjYJm1RpdE6DK2lH44LaG2gkp8GVtKORsEnYpEpj60xsEjap0uicBlfSjsYFtTfQSE6DK2lHI2GTsEmVxtaZ2CRsUqXROQ2upB2NC2pvoJGcBlfSjkbCJmGTKo2tM7FJ2KRKo3MaXEk7GhfU3kAjOQ2upB2NhE3CJlUaW2dik7BJlUbnNLiSdjQuqL2BRnIaXEk7GgmbhE2qNLbOxCZhkyqNzmlwJe1oXFB7A41zeGl7y5Ut7m6XXUnYpEojOafwUn2r9gYa5/DS9pYrW9zdLruSsEmVRnJO4aX6Vu0NNM7hpe0tV7a4u112JWGTKo3knMJL9a3aG2icw0vbW65scXe77ErCJlUayTmFl+pbtTfQOIeXtrdc2eLudtmVhE2qNJJzCi/Vt2pvoHEOL21vubLF3e2yKwmbVGkk5xReqm/V3lfxNek9Gv+S80l8zQW191V8TXqPxr/kfBJfc0HtfRVfk96j8S85n8TXXFB7X8XXpPdo/EvOJ/E1F9TeV/E16T0a/5LzSXzNBbX3VXxNeo/Gv+R8El9zQev9bfjvdv+wTcImYZOw6aqJKz/Cz757oJGwSdgkbBI2XTVx5Uf42XcPNBI2CZuETcKmqyau/Ag/++6BRsImYZOwSdh01cSVH+Fn3z3QSNgkbBI2CZuumrjyI/zsuwcaCZuETcImYdNVE1d+hPbd/rvpH9ZI2HTVxJVux+ZcpdHhSsImVRoJm1RpJGwuqL2BRnImNl01caXbsTlXaXS4krBJlUbCJlUaCZsLam+gkZyJTVdNXOl2bM5VGh2uJGxSpZGwSZVGwuaC2htoJGdi01UTV7odm3OVRocrCZtUaSRsUqWRsLmg9gYayZnYdNXElW7H5lyl0eFKwiZVGgmbVGkkbC6ovYFGciY2XTVxpduxOVdpdLiSsEmVRsImVRoJmwtq7xDupmWNDlfSjkbnNLiyxd2ETcImYZOw6arX82FpJKfBlS3uJmwSNgmbhE1XvZ4PSyM5Da5scTdhk7BJ2CRsuur1fFgayWlwZYu7CZuETcImYdNVr+fD0khOgytb3E3YJGwSNgmbrno9H5ZGchpc2eJuwiZhk7BJ2HTVq/+wJh7sTtqcw0sJmw5XEjZd9V18cYcrF7TexIPdSZtzeClh0+FKwqarvosv7nDlgtabeLA7aXMOLyVsOlxJ2HTVd/HFHa5c0HoTD3Ynbc7hpYRNhysJm676Lr64w5ULWm/iwe6kzTm8lLDpcCVh01XfxRd3uHJB60082J20OYeXEjYdriRsuuq7+OIOVy6ovRWuJGxSpdHhyp14O13XSM7EJlUaW2di01Wv58M6hbfTdY3kTGxSpbF1JjZd9Xo+rFN4O13XSM7EJlUaW2di01Wv58M6hbfTdY3kTGxSpbF1JjZd9Xo+rFN4O13XSM7EJlUaW2di01Wv58M6hbfTdY3kTGxSpbF1JjZd9Xrnw9LYOjvc3eJuWtZI2KRKo8OVtKPRORObN2i3fEJ6hEbn7HB3i7tpWSNhkyqNDlfSjkbnTGzeoN3yCekRGp2zw90t7qZljYRNqjQ6XEk7Gp0zsXmDdssnpEdodM4Od7e4m5Y1Ejap0uhwJe1odM7E5g3aLZ+QHqHROTvc3eJuWtZI2KRKo8OVtKPRORObN2i3fEJ6hEbn7HB3i7tpWSNhkyqNDlfSjkbnTGze4OjWQCNhkyqNzpnYpEpj6zS4knY0ts4Od2v25cRHdc+ySZVG50xsUqWxdRpcSTsaW2eHuzX7cuKjumfZpEqjcyY2qdLYOg2upB2NrbPD3Zp9OfFR3bNsUqXRORObVGlsnQZX0o7G1tnhbs2+nPio7lk2qdLonIlNqjS2ToMraUdj6+xwt2ZfTnxU9yybVGl0zsQmVRpbp8GVtKOxdXa4W/NGWWDT4Ura0UjYdNXElc/u2KRKI2GTKo3klLxRFth0uJJ2NBI2XTVx5bM7NqnSSNikSiM5JW+UBTYdrqQdjYRNV01c+eyOTao0Ejap0khOyRtlgU2HK2lHI2HTVRNXPrtjkyqNhE2qNJJT8kZZYNPhStrRSNh01cSVz+7YpEojYZMqjeSUvFEW2HS4knY0EjZdNXHlszs2qdJI2KRKIzklb5QDjYRNwiZh01U7vJRuaSRnYrOtGlzpdmxq3igHGgmbhE3Cpqt2eCnd0kjOxGZbNbjS7djUvFEONBI2CZuETVft8FK6pZGcic22anCl27GpeaMcaCRsEjYJm67a4aV0SyM5E5tt1eBKt2NT80Y50EjYJGwSNl21w0vplkZyJjbbqsGVbsem5o1yoJGwSdgkbLpqh5fSLY3kTGy2VYMr3Y5NTVt6MJ3U6HBluzNxt1u22VYTm1RpJGdi0+FK2tGoaUsPppMaHa5sdybudss222pikyqN5ExsOlxJOxo1benBdFKjw5XtzsTdbtlmW01sUqWRnIlNhytpR6OmLT2YTmp0uLLdmbjbLdtsq4lNqjSSM7HpcCXtaNS0pQfTSY0OV7Y7E3e7ZZttNbFJlUZyJjYdrqQdjZq29GA6qdHhynZn4m63bLOtJjap0kjOxKbDlbSjUfNGeRte6m7ZdNXElbSjsXUmNgmbVGkk51b293z4ObzU3bLpqokraUdj60xsEjap0kjOrezv+fBzeKm7ZdNVE1fSjsbWmdgkbFKlkZxb2d/z4efwUnfLpqsmrqQdja0zsUnYpEojObeyv+fDz+Gl7pZNV01cSTsaW2dik7BJlUZybmV/z4efw0vdLZuumriSdjS2zsQmYZMqjeTcSnvPZ975UC9tcbfDlQ5XtjsNXkq3NDpnYtNVr+fDmrjS4cp2p8FL6ZZG50xsuur1fFgTVzpc2e40eCnd0uiciU1XvZ4Pa+JKhyvbnQYvpVsanTOx6arX82FNXOlwZbvT4KV0S6NzJjZd9Xo+rIkrHa5sdxq8lG5pdM7Epqte/YfV4BMSNh2unNvZ4W7C5rP4mvQejc4p2ZcTH5Ww6XDl3M4OdxM2n8XXpPdodE7Jvpz4qIRNhyvndna4m7D5LL4mvUejc0r25cRHJWw6XDm3s8PdhM1n8TXpPRqdU7IvJz4qYdPhyrmdHe4mbD6Lr0nv0eickn058VEJmw5Xzu3scDdh81l8TXqPRueUvFEONLa4m7BJlUaHKwmbVGkkbO7E2+m6RudEWm/iwfrkH3E3YZMqjQ5XEjap0kjY3Im303WNzom03sSD9ck/4m7CJlUaHa4kbFKlkbC5E2+n6xqdE2m9iQfrk3/E3YRNqjQ6XEnYpEojYXMn3k7XNTon0noTD9Yn/4i7CZtUaXS4krBJlUbC5k68na5rdE6k9SYerE/+EXcTNqnS6HAlYZMqjYTNnXg7XdfonEjr/W3476Z/WCNhs8XdtKzR4UqHKwmbVGnU7Mvv4g+QfgKNhM0Wd9OyRocrHa4kbFKlUbMvv4s/QPoJNBI2W9xNyxodrnS4krBJlUbNvvwu/gDpJ9BI2GxxNy1rdLjS4UrCJlUaNfvyu/gDpJ9AI2Gzxd20rNHhSocrCZtUadTsy+/iD5B+Ao2EzRZ307JGhysdriRsUqVR05Ye/Cy+Jr1HI2FzrtJIToMraUejc3a4W9OWHvwsvia9RyNhc67SSE6DK2lHo3N2uFvTlh78LL4mvUcjYXOu0khOgytpR6Nzdrhb05Ye/Cy+Jr1HI2FzrtJIToMraUejc3a4W9OWHvwsvia9RyNhc67SSE6DK2lHo3N2uFvTlh78LL4mvUcjYXOu0khOgytpR6Nzdrhb05YefOPkH/FSuqVxzjmFl9Itjc5pcCVhc5R23Ufd+SwvpVsa55xTeCnd0uicBlcSNkdp133Unc/yUrqlcc45hZfSLY3OaXAlYXOUdt1H3fksL6VbGuecU3gp3dLonAZXEjZHadd91J3P8lK6pXHOOYWX0i2NzmlwJWFzlHbdR935LC+lWxrnnFN4Kd3S6JwGVxI2R2nXfVR6lkaHK2lHI2Gzxd2ETcImVRrJOYWXEjYJmwtqb6CRnAZX0o5GwmaLuwmbhE2qNJJzCi8lbBI2F9TeQCM5Da6kHY2EzRZ3EzYJm1RpJOcUXkrYJGwuqL2BRnIaXEk7GgmbLe4mbBI2qdJIzim8lLBJ2FxQewON5DS4knY0EjZb3E3YJGxSpZGcU3gpYZOwuaD2BhrJaXAl7WgkbLa4m7BJ2KRKIzmn8FLCJmFzQe0NNJLT4Era0eicBle6HZtzeCnd0uhwpcOVmrb0YDqp0eFK2tHonAZXuh2bc3gp3dLocKXDlZq29GA6qdHhStrR6JwGV7odm3N4Kd3S6HClw5WatvRgOqnR4Ura0eicBle6HZtzeCnd0uhwpcOVmrb0YDqp0eFK2tHonAZXuh2bc3gp3dLocKXDlZq29GA6qdHhStrR6JwGV7odm3N4Kd3S6HClw5WatvRgOqnR4Ura0eiciU1X7fBSuqWxdSY2CZuETVe9ng9L4xxeSrc0ts7EJmGTsOmq1/NhaZzDS+mWxtaZ2CRsEjZd9Xo+LI1zeCnd0tg6E5uETcKmq17Ph6VxDi+lWxpbZ2KTsEnYdNXr+bA0zuGldEtj60xsEjYJm656nf2wTuGlc7fc3eLuObyUsNlWDa7UO7U30DiHl87dcneLu+fwUsJmWzW4Uu/U3kDjHF46d8vdLe6ew0sJm23V4Eq9U3sDjXN46dwtd7e4ew4vJWy2VYMr9U7tDTTO4aVzt9zd4u45vJSw2VYNrtQ7tTfQOIeXzt1yd4u75/BSwmZbNbhS79TeV/E1v/AejQ5XOlxJ2HS4UtOWHvwsvuYX3qPR4UqHKwmbDldq2tKDn8XX/MJ7NDpc6XAlYdPhSk1bevCz+JpfeI9GhysdriRsOlypaUsPfhZf8wvv0ehwpcOVhE2HKzVt6cHP4mt+4T0aHa50uJKw6XClZl8+PPwfng/r4RaeD+vhFp4P6+EWng/r4RaeD+vhFp4P6+EWng/r4RaeD+vhFp4P6+EWng/r4RaeD+vhFp4P6+EW/gdcjMPGakRCwgAAAABJRU5ErkJggg==","payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},"timestamp":1782976695325}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.326 DEBUG [sWqB8HvJ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595497701376/pay | IP: 127.0.0.1
- 15:18:15.330 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
- 15:18:15.330 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Parameters: OP2072580595497701376(String)
- 15:18:15.332 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectByOrderNo : <== Total: 1
- 15:18:15.332 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.332 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.335 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.335 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, create_time=?, update_time=? WHERE id=?
- 15:18:15.336 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: OP2072580595497701376(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595497701376(String), NORMAL(String), WECHAT(String), MOCK_654D6629F4EB48AE(String), 2026-07-02T15:18:15.335093600(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595500654594(Long)
- 15:18:15.339 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
- 15:18:15.339 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.339 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.342 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.342 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:15.342 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:15.344 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
- 15:18:15.345 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.updateById : ==> Preparing: UPDATE t_user_membership SET user_id=?, level=?, source=?, effective_from=?, effective_to=?, status=?, remark=?, create_time=?, update_time=? WHERE id=?
- 15:18:15.345 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.updateById : ==> Parameters: 1(Long), PRO(String), RECHARGE(String), 2026-07-02T15:18:15(LocalDateTime), 2026-08-31T15:18:15(LocalDateTime), 1(Integer), 支付购买: OP2072580595095048192(String), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595244802050(Long)
- 15:18:15.348 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.updateById : <== Updates: 1
- 15:18:15.349 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, membership_expire_at=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:18:15.349 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PRO(String), 2026-08-31T15:18:15(LocalDateTime), 0(Long), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
- 15:18:15.352 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:15.353 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:15.354 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580595630678017(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:15.353500400(LocalDateTime), USER(String), UPDATE(String), 修改用户信息(String), USER(String), 1(Long), PAY:OP2072580595497701376->PRO(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:15.353500400(LocalDateTime)
- 15:18:15.357 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:15.357 DEBUG [sWqB8HvJ] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 修改用户信息
- 15:18:15.357 INFO [sWqB8HvJ] [1] [ main] c.x.u.s.MembershipService : 用户1通过支付OP2072580595497701376激活会员等级PRO, 有效期30天
- 15:18:15.357 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:15.357 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:15.361 DEBUG [sWqB8HvJ] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 1
- 15:18:15.361 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_order SET order_no=?, user_id=?, plan_id=?, amount=?, channel=?, status=?, qr_code_url=?, order_type=?, paid_channel=?, trade_no=?, paid_time=?, expire_time=?, membership_record_id=?, create_time=?, update_time=? WHERE id=?
- 15:18:15.362 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: OP2072580595497701376(String), 1(Long), 1(Long), 29.90(BigDecimal), WECHAT(String), PAID(String), MOCK_PAY:OP2072580595497701376(String), NORMAL(String), WECHAT(String), MOCK_654D6629F4EB48AE(String), 2026-07-02T15:18:15.335093600(LocalDateTime), 2026-07-02T15:33:15(LocalDateTime), 2072580595244802050(Long), 2026-07-02T15:18:15(LocalDateTime), 2026-07-02T15:18:15(LocalDateTime), 2072580595500654594(Long)
- 15:18:15.365 DEBUG [sWqB8HvJ] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
- 15:18:15.365 INFO [sWqB8HvJ] [1] [ main] c.x.p.s.PaymentOrderService : 支付成功: OP2072580595497701376 用户=1 方案=高级会员·月卡 金额=29.90元 会员=PRO 交易号=MOCK_654D6629F4EB48AE 类型=NORMAL
- 15:18:15.371 DEBUG [sWqB8HvJ] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595497701376/pay 200 45ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/order/OP2072580595497701376/pay
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#confirmPay(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"sWqB8HvJ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"orderNo":"OP2072580595497701376","status":"PAID","amount":29.90,"planName":"高级会员·月卡","membershipLevel":"PRO","paidTime":"2026-07-02 15:18:15","membershipStartDate":null,"membershipEndDate":null},"timestamp":1782976695370}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.371 DEBUG [7mbqKcG6] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595497701376/pay | IP: 127.0.0.1
- 15:18:15.374 DEBUG [7mbqKcG6] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Preparing: SELECT * FROM t_payment_order WHERE order_no = ? LIMIT 1
- 15:18:15.374 DEBUG [7mbqKcG6] [1] [ main] c.x.p.m.P.selectByOrderNo : ==> Parameters: OP2072580595497701376(String)
- 15:18:15.376 DEBUG [7mbqKcG6] [1] [ main] c.x.p.m.P.selectByOrderNo : <== Total: 1
- 15:18:15.379 WARN [7mbqKcG6] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=2005, message=该订单已支付
- 15:18:15.380 DEBUG [7mbqKcG6] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/order/OP2072580595497701376/pay 200 9ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/order/OP2072580595497701376/pay
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#confirmPay(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"7mbqKcG6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":2005,"message":"该订单已支付","data":null,"timestamp":1782976695379}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.385 DEBUG [CxU6AMZ8] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/orders | IP: 127.0.0.1
- 15:18:15.386 DEBUG [CxU6AMZ8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.386 DEBUG [CxU6AMZ8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.389 DEBUG [CxU6AMZ8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.390 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_payment_order WHERE user_id = ? ORDER BY create_time DESC
- 15:18:15.390 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectByUserId : ==> Parameters: 1(Long)
- 15:18:15.392 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectByUserId : <== Total: 5
- 15:18:15.393 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.393 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.394 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.402 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.402 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.404 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.408 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.408 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.410 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.416 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.416 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.421 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.421 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.421 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.423 DEBUG [CxU6AMZ8] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.424 DEBUG [CxU6AMZ8] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/payment/orders 200 39ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/payment/orders
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentController
- Method = com.xuekairui.payment.controller.PaymentController#listMyOrders(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"CxU6AMZ8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"orderNo":"OP2072580594017112064","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARrklEQVR4Xu3SQW7kShIE0X//S2v2L5wYRzBZJaFpy4aZR5aa//28vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNl01caXDlYRNqjQ655P4mgtq76v4moRNV01c6XAlYZMqjc75JL7mgtr7Kr4mYdNVE1c6XEnYpEqjcz6Jr7mg9r6Kr0nYdNXElQ5XEjap0uicT+JrLqi9r+JrEjZdNXGlw5WETao0OueT+JoLau+r+JqETVdNXOlwJWGTKo3O+SS+5oLaG2icw0vbW650OzZP4u10XaNzTuGl+lbtDTTO4aXtLVe6HZsn8Xa6rtE5p/BSfav2Bhrn8NL2livdjs2TeDtd1+icU3ipvlV7A41zeGl7y5Vux+ZJvJ2ua3TOKbxU36q9gcY5vLS95Uq3Y/Mk3k7XNTrnFF6qb9XeQOMcXtrecqXbsXkSb6frGp1zCi/Vt2pvoJGcBlfSjkZyJjap0jjnNLjS7dikSqPDlbSjcUHtDTSS0+BK2tFIzsQmVRrnnAZXuh2bVGl0uJJ2NC6ovYFGchpcSTsayZnYpErjnNPgSrdjkyqNDlfSjsYFtTfQSE6DK2lHIzkTm1RpnHMaXOl2bFKl0eFK2tG4oPYGGslpcCXtaCRnYpMqjXNOgyvdjk2qNDpcSTsaF9TeQCM5Da6kHY3kTGxSpXHOaXCl27FJlUaHK2lH44LaG2gkp8GVtKORnAZX0o5GciY2CZtUaZxzGlxJOxoX1N5AIzkNrqQdjeQ0uJJ2NJIzsUnYpErjnNPgStrRuKD2BhrJaXAl7Wgkp8GVtKORnIlNwiZVGuecBlfSjsYFtTfQSE6DK2lHIzkNrqQdjeRMbBI2qdI45zS4knY0Lqi9gUZyGlxJOxrJaXAl7WgkZ2KTsEmVxjmnwZW0o3FB7Q00ktPgStrRSE6DK2lHIzkTm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoJGcBlfSjkbnTGwSNgmbhE2qNDpcSTsaHa6kHY0Lam+gkZwGV9KORudMbBI2CZuETao0OlxJOxodrqQdjQtqb6CRnAZX0o5G50xsEjYJm4RNqjQ6XEk7Gh2upB2NC2pvoHEOL6VbGk86O9zd4m5a1jiHl+pbtTfQOIeX0i2NJ50d7m5xNy1rnMNL9a3aG2icw0vplsaTzg53t7ibljXO4aX6Vu0NNM7hpXRL40lnh7tb3E3LGufwUn2r9gYa5/BSuqXxpLPD3S3upmWNc3ipvlV7A41zeCnd0njS2eHuFnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+234c7sfbHOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj/BX/0l/od0/yU25yqN5ExsuupP8Fd/if8h3X+JzblKIzkTm676E/zVX+J/SPdfYnOu0kjOxKar/gR/9Zf4H9L9l9icqzSSM7Hpqj9B+0v8A6Q/gcY5vJSwSZVGcna4m5Y1zjmn8NIN2i2fkB6hcQ4vJWxSpZGcHe6mZY1zzim8dIN2yyekR2icw0sJm1RpJGeHu2lZ45xzCi/doN3yCekRGufwUsImVRrJ2eFuWtY455zCSzdot3xCeoTGObyUsEmVRnJ2uJuWNc45p/DSDdotn5AeoXEOLyVsUqWRnB3upmWNc84pvHSDo1sDjS3upmWNc06DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf98PSSE6DK1vcTdgkbBI2CZuu+nk/LI3kNLiyxd2ETcImYZOw6aqf/sNyPh3QSE6DKwmbhM22eg5vd9dttlWDK/VO7Q00OqfBlYRNwmZbPYe3u+s226rBlXqn9gYandPgSsImYbOtnsPb3XWbbdXgSr1TewONzmlwJWGTsNlWz+Ht7rrNtmpwpd6pvYFG5zS4krBJ2Gyr5/B2d91mWzW4Uu/U3kCjcxpcSdgkbLbVc3i7u26zrRpcqXdab+LBhM22anAl7Wh0uJJ2NDpc6XZsOlxJ2HRV5EZZYLOtGlxJOxodrqQdjQ5Xuh2bDlcSNl0VuVEW2GyrBlfSjkaHK2lHo8OVbsemw5WETVdFbpQFNtuqwZW0o9HhStrR6HCl27HpcCVh01WRG2WBzbZqcCXtaHS4knY0Olzpdmw6XEnYdFXkRllgs60aXEk7Gh2upB2NDle6HZsOVxI2XRW5URbYpEojOQ2upB2NrTOxSZVGhytpR6NzJjY32G/5qIRNqjSS0+BK2tHYOhObVGl0uJJ2NDpnYnOD/ZaPStikSiM5Da6kHY2tM7FJlUaHK2lHo3MmNjfYb/mohE2qNJLT4Era0dg6E5tUaXS4knY0Omdic4P9lo9K2KRKIzkNrqQdja0zsUmVRocraUejcyY2N9hv+aiETao0ktPgStrR2DoTm1RpdLiSdjQ6Z2Jzg5NbEx+esHkSbydsEjYJmy3udriSdjSO8vB6gc2TeDthk7BJ2Gxxt8OVtKNxlIfXC2yexNsJm4RNwmaLux2upB2Nozy8XmDzJN5O2CRsEjZb3O1wJe1oHOXh9QKbJ/F2wiZhk7DZ4m6HK2lH4ygPrxfYPIm3EzYJm4TNFnc7XEk7Gkdp133UFncTNqnSSNh8Fl+TsNlWE5uumrhS79TeIdxN2KRKI2HzWXxNwmZbTWy6auJKvVN7h3A3YZMqjYTNZ/E1CZttNbHpqokr9U7tHcLdhE2qNBI2n8XXJGy21cSmqyau1Du1dwh3Ezap0kjYfBZfk7DZVhObrpq4Uu/U3iHcTdikSiNh81l8TcJmW01sumriSr3Teg0+oX7E/8XdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjX7cuKjbjwL3E3LGp0zsUmVRudMbLZVgyvdjk3Nvpz4qBvPAnfTskbnTGxSpdE5E5tt1eBKt2NTsy8nPurGs8DdtKzRORObVGl0zsRmWzW40u3Y1OzLiY+68SxwNy1rdM7EJlUanTOx2VYNrnQ7NjVt6cGETao0kjOx+Zv4q7rfZdNVE1cSNjdot3xCwiZVGsmZ2PxN/FXd77LpqokrCZsbtFs+IWGTKo3kTGz+Jv6q7nfZdNXElYTNDdotn5CwSZVGciY2fxN/Vfe7bLpq4krC5gbtlk9I2KRKIzkTm7+Jv6r7XTZdNXElYXODdssnJGxSpZGcic3fxF/V/S6brpq4krC5QbvlE7pH2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BI2KRK4/c5Da6cw0vbW66kHY2EzQW1N9BIzsQmYZOwSdgkbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5/2wbLpq4sp2p8FL6ZZG50xsuurn/bBsumriynanwUvplkbnTGy66uf9sGy6auLKdqfBS+mWRudMbLrq5+yHNbHpqh1e6m7ZJGxSpdHhSrdjkyqNDldu0G75hO4RNl21w0vdLZuETao0OlzpdmxSpdHhyg3aLZ/QPcKmq3Z4qbtlk7BJlUaHK92OTao0Oly5QbvlE7pH2HTVDi91t2wSNqnS6HCl27FJlUaHKzdot3xC9wibrtrhpe6WTcImVRodrnQ7NqnS6HDlBu2WT+geYdNVO7zU3bJJ2KRKo8OVbscmVRodrtyg3fIJ6REaCZuETao0zuGl7pZNwiZVGt/G99W0pQfTSY2ETcImVRrn8FJ3yyZhkyqNb+P7atrSg+mkRsImYZMqjXN4qbtlk7BJlca38X01benBdFIjYZOwSZXGObzU3bJJ2KRK49v4vpq29GA6qZGwSdikSuMcXupu2SRsUqXxbXxfTVt6MJ3USNgkbFKlcQ4vdbdsEjap0vg2vq9mX34X/wDdn8CmqyauJGwSNgmbDlcSNqnSqNmX38U/QPcnsOmqiSsJm4RNwqbDlYRNqjRq9uV38Q/Q/QlsumriSsImYZOw6XAlYZMqjZp9+V38A3R/ApuumriSsEnYJGw6XEnYpEqjZl9+F/8A3Z/ApqsmriRsEjYJmw5XEjap0qjZl9/FP0D3J7DpqokrCZuETcKmw5WETao0atrSg5/F13wb37fF3bSssXUmNkdp133UZ/E138b3bXE3LWtsnYnNUdp1H/VZfM238X1b3E3LGltnYnOUdt1HfRZf82183xZ307LG1pnYHKVd91Gfxdd8G9+3xd20rLF1JjZHadd91GfxNd/G921xNy1rbJ2JzVHadR/15LO8lG5pJGdi82TV4G7CpsOVbscmYXNB7Q00zuGldEsjORObJ6sGdxM2Ha50OzYJmwtqb6BxDi+lWxrJmdg8WTW4m7DpcKXbsUnYXFB7A41zeCnd0kjOxObJqsHdhE2HK92OTcLmgtobaJzDS+mWRnImNk9WDe4mbDpc6XZsEjYX1N5A4xxeSrc0kjOxebJqcDdh0+FKt2OTsLmg9gYayWlwJe1obJ0GVxI2qdJI2HTVDi8lbBI2F9TeQCM5Da6kHY2t0+BKwiZVGgmbrtrhpYRNwuaC2htoJKfBlbSjsXUaXEnYpEojYdNVO7yUsEnYXFB7A43kNLiSdjS2ToMrCZtUaSRsumqHlxI2CZsLam+gkZwGV9KOxtZpcCVhkyqNhE1X7fBSwiZhc0HtDTSS0+BK2tHYOg2uJGxSpZGw6aodXkrYJGwuqL2BRnIaXEk7GslpcCVhk7BJlUZyGlxJ2HS4cpR23UelZ2l0uJJ2NJLT4ErCJmGTKo3kNLiSsOlw5Sjtuo9Kz9LocCXtaCSnwZWETcImVRrJaXAlYdPhylHadR+VnqXR4Ura0UhOgysJm4RNqjSS0+BKwqbDlaO06z4qPUujw5W0o5GcBlcSNgmbVGkkp8GVhE2HK0dp131UepZGhytpRyM5Da4kbBI2qdJIToMrCZsOV47Srvuo9CyNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UH00mNDlfSjsY5Z2LzJN7ucGW7M3H3xnJbejCd1OhwJe1onHMmNk/i7Q5XtjsTd28st6UHb5z8v3jps7caXDmHlxI226rBlXqn9gYa5/DSZ281uHIOLyVstlWDK/VO7Q00zuGlz95qcOUcXkrYbKsGV+qd2htonMNLn73V4Mo5vJSw2VYNrtQ7tTfQOIeXPnurwZVzeClhs60aXKl3am+gcQ4vffZWgyvn8FLCZls1uFLv1N5X8TXde2xSpZGwSdgkbLpq4soWd4/Srvuoz+JruvfYpEojYZOwSdh01cSVLe4epV33UZ/F13TvsUmVRsImYZOw6aqJK1vcPUq77qM+i6/p3mOTKo2ETcImYdNVE1e2uHuUdt1HfRZf073HJlUaCZuETcKmqyaubHH3KO26j/osvqZ7j02qNBI2CZuETVdNXNni7lGeXX/5Z3k/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR3g/rJdHeD+sl0d4P6yXR/gfYWtF3xw1oioAAAAASUVORK5CYII=","payUrl":"MOCK_PAY:OP2072580594017112064","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580594507845632","planName":"高级会员·月卡","amount":29.90,"channel":"ALIPAY","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAAR1klEQVR4Xu3SwY7jypIE0fv/P63Zn3C+cYSSVDeatiyYeWQJ/O/z8nID//mHl5cTvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbwf1sstvB/Wyy28H9bLLbQf1n8/xdek92gk5z68nbBJlUbnPImvuaD2foqvSe/RSM59eDthkyqNznkSX3NB7f0UX5Peo5Gc+/B2wiZVGp3zJL7mgtr7Kb4mvUcjOffh7YRNqjQ650l8zQW191N8TXqPRnLuw9sJm1RpdM6T+JoLau+n+Jr0Ho3k3Ie3Ezap0uicJ/E1F9TeQOMcXkq3NBI2XTVxJWHTVTu89Efeqr2Bxjm8lG5pJGy6auJKwqardnjpj7xVewONc3gp3dJI2HTVxJWETVft8NIfeav2Bhrn8FK6pZGw6aqJKwmbrtrhpT/yVu0NNM7hpXRLI2HTVRNXEjZdtcNLf+St2htonMNL6ZZGwqarJq4kbLpqh5f+yFu1N9BIToMraUcjYdPhyhZ307JGchpcSTsaHa6kHY0Lam+gkZwGV9KORsKmw5Ut7qZljeQ0uJJ2NDpcSTsaF9TeQCM5Da6kHY2ETYcrW9xNyxrJaXAl7Wh0uJJ2NC6ovYFGchpcSTsaCZsOV7a4m5Y1ktPgStrR6HAl7WhcUHsDjeQ0uJJ2NBI2Ha5scTctaySnwZW0o9HhStrRuKD2BhrJaXAl7WgkbDpc2eJuWtZIToMraUejw5W0o3FB7Q00ktPgStrR6JyJzbaa2GxxNy1rdE6DK2lH44LaG2gkp8GVtKPRORObbTWx2eJuWtbonAZX0o7GBbU30EhOgytpR6NzJjbbamKzxd20rNE5Da6kHY0Lam+gkZwGV9KORudMbLbVxGaLu2lZo3MaXEk7GhfU3kAjOQ2upB2NzpnYbKuJzRZ307JG5zS4knY0Lqi9gUZyGlxJOxqdM7HZVhObLe6mZY3OaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjeQ0uJJ2NDpcSTsa55wGV9KOxtZpcCXtaFxQewON5DS4knY0OlxJOxrnnAZX0o7G1mlwJe1oXFB7A43kNLiSdjQ6XEk7GuecBlfSjsbWaXAl7WhcUHsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXsDjXN4qbtlkyqNDlfO7UxsUqWRnFN4qb5VewONc3ipu2WTKo0OV87tTGxSpZGcU3ipvlV7A41zeKm7ZZMqjQ5Xzu1MbFKlkZxTeKm+VXs/xdek92j8S86T+JoLau+n+Jr0Ho1/yXkSX3NB7f0UX5Peo/EvOU/iay6ovZ/ia9J7NP4l50l8zQW191N8TXqPxr/kPImvuaD2foqvSe/R+JecJ/E1F7Ten4b/bvqHNRI2Ha7cibf/Ev7adw80kjOx6XDlTrz9l/DXvnugkZyJTYcrd+Ltv4S/9t0DjeRMbDpcuRNv/yX8te8eaCRnYtPhyp14+y/hr333QCM5E5sOV+7E238J7bv9d9M/rJGw6aqJKwmbVGkkbFKl0eFKwiZVGgmbVGkkbC6ovYFGciY2XTVxJWGTKo2ETao0OlxJ2KRKI2GTKo2EzQW1N9BIzsSmqyauJGxSpZGwSZVGhysJm1RpJGxSpZGwuaD2BhrJmdh01cSVhE2qNBI2qdLocCVhkyqNhE2qNBI2F9TeQCM5E5uumriSsEmVRsImVRodriRsUqWRsEmVRsLmgtobaCRnYtNVE1cSNqnSSNikSqPDlYRNqjQSNqnSSNhc0HoTD25xN2HT4Ura0UhOgysJm1RpJGwSNgmbhE1Xfd4PSyM5Da4kbFKlkbBJ2CRsEjZd9Xk/LI3kNLiSsEmVRsImYZOwSdh01ef9sDSS0+BKwiZVGgmbhE3CJmHTVZ/3w9JIToMrCZtUaSRsEjYJm4RNV33eD0sjOQ2uJGxSpZGwSdgkbBI2XfX55sNq8FHds2wSNufwUnfLpqt+iy/ucOWC1tvho7pn2SRszuGl7pZNV/0WX9zhygWtt8NHdc+ySdicw0vdLZuu+i2+uMOVC1pvh4/qnmWTsDmHl7pbNl31W3xxhysXtN4OH9U9yyZhcw4vdbdsuuq3+OIOVy5ovR0+qnuWTcLmHF7qbtl01W/xxR2uXNB6Ew+mkxodrqQdjS3ubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurzfljubpddSTsayZnYpEpj60xsuurTf1jOpwMaHa6kHY1zToMrCZtUaXS4knY0Omdi8wXtlk9Ij9DocCXtaJxzGlxJ2KRKo8OVtKPRORObL2i3fEJ6hEaHK2lH45zT4ErCJlUaHa6kHY3Omdh8QbvlE9IjNDpcSTsa55wGVxI2qdLocCXtaHTOxOYL2i2fkB6h0eFK2tE45zS4krBJlUaHK2lHo3MmNl/QbvmE9AiNDlfSjsY5p8GVhE2qNDpcSTsanTOx+YL9lo/qcGWLu2lZI2GTsEmVRocraUdj6+xwt+aLcoUrW9xNyxoJm4RNqjQ6XEk7Gltnh7s1X5QrXNniblrWSNgkbFKl0eFK2tHYOjvcrfmiXOHKFnfTskbCJmGTKo0OV9KOxtbZ4W7NF+UKV7a4m5Y1EjYJm1RpdLiSdjS2zg53a74oV7iyxd20rJGwSdikSqPDlbSjsXV2uFvzRVlg0+FKwiZhk7BJlUZyGlzpdmxSpZGwSZVGckq+KAtsOlxJ2CRsEjap0khOgyvdjk2qNBI2qdJITskXZYFNhysJm4RNwiZVGslpcKXbsUmVRsImVRrJKfmiLLDpcCVhk7BJ2KRKIzkNrnQ7NqnSSNikSiM5JV+UBTYdriRsEjYJm1RpJKfBlW7HJlUaCZtUaSSn5IuywKbDlYRNwiZhkyqN5DS40u3YpEojYZMqjeSUtKUHu5M2Ha5scbfDlbSjkZyJTao0EjYdrnQ7NjVt6cHupE2HK1vc7XAl7WgkZ2KTKo2ETYcr3Y5NTVt6sDtp0+HKFnc7XEk7GsmZ2KRKI2HT4Uq3Y1PTlh7sTtp0uLLF3Q5X0o5GciY2qdJI2HS40u3Y1LSlB7uTNh2ubHG3w5W0o5GciU2qNBI2Ha50OzY1benB7qRNhytb3O1wJe1oJGdikyqNhE2HK92OTc2+nPio7bNcSdgkbFKl0TkTm1RpJGy2VYMraUejZl9OfNT2Wa4kbBI2qdLonIlNqjQSNtuqwZW0o1GzLyc+avssVxI2CZtUaXTOxCZVGgmbbdXgStrRqNmXEx+1fZYrCZuETao0OmdikyqNhM22anAl7WjU7MuJj9o+y5WETcImVRqdM7FJlUbCZls1uJJ2NGr25cRHbZ/lSsImYZMqjc6Z2KRKI2GzrRpcSTsaNV+UBTbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK/t7Pjxhc67S6HCl27FJlUZyJjbnKo3k3Mr+ng9P2JyrNDpc6XZsUqWRnInNuUojObeyv+fDEzbnKo0OV7odm1RpJGdic67SSM6t7O/58ITNuUqjw5VuxyZVGsmZ2JyrNJJzK+09n3nuoe5ucTdhcw4v/fqWRudMbLrq835Yp/DSr29pdM7Epqs+74d1Ci/9+pZG50xsuurzflin8NKvb2l0zsSmqz7vh3UKL/36lkbnTGy66vN+WKfw0q9vaXTOxKarPv2H1eATukfYbKsGV87tTGyexdek92h0Tsm+nPio7lk226rBlXM7E5tn8TXpPRqdU7IvJz6qe5bNtmpw5dzOxOZZfE16j0bnlOzLiY/qnmWzrRpcObczsXkWX5Peo9E5Jfty4qO6Z9lsqwZXzu1MbJ7F16T3aHROyb6c+KjuWTbbqsGVczsTm2fxNek9Gp1T8kU50Ng6E5s78XbCJlUayXkSX5Peo9E5kdabeDCd1Oicic2deDthkyqN5DyJr0nv0eicSOtNPJhOanTOxOZOvJ2wSZVGcp7E16T3aHROpPUmHkwnNTpnYnMn3k7YpEojOU/ia9J7NDon0noTD6aTGp0zsbkTbydsUqWRnCfxNek9Gp0Tab2JB9NJjc6Z2NyJtxM2qdJIzpP4mvQejc6JtN6fhv9u9w/bJGzO4aUOVzpcSdikSqNmX/4Wf4DuJ7BJ2JzDSx2udLiSsEmVRs2+/C3+AN1PYJOwOYeXOlzpcCVhkyqNmn35W/wBup/AJmFzDi91uNLhSsImVRo1+/K3+AN0P4FNwuYcXupwpcOVhE2qNGr25W/xB+h+ApuEzTm81OFKhysJm1Rp1LSlB5/F15x7j7sJm1RpJKfBlbSj0Tk73K1pSw8+i6859x53Ezap0khOgytpR6Nzdrhb05YefBZfc+497iZsUqWRnAZX0o5G5+xwt6YtPfgsvubce9xN2KRKIzkNrqQdjc7Z4W5NW3rwWXzNufe4m7BJlUZyGlxJOxqds8Pdmrb04LP4mnPvcTdhkyqN5DS4knY0OmeHuzVt6cEvTv6/eCnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPufJaX0i2N5ExsUqWxxd20rNE5Da4kbI7SrvuoO5/lpXRLIzkTm1RpbHE3LWt0ToMrCZujtOs+6s5neSnd0kjOxCZVGlvcTcsandPgSsLmKO26j7rzWV5KtzSSM7FJlcYWd9OyRuc0uJKwOUq77qPSszQ6XEk7Gh2upB2N5ExsEjYdrpzDSwmbhM0FtTfQSE6DK2lHo8OVtKORnIlNwqbDlXN4KWGTsLmg9gYayWlwJe1odLiSdjSSM7FJ2HS4cg4vJWwSNhfU3kAjOQ2upB2NDlfSjkZyJjYJmw5XzuGlhE3C5oLaG2gkp8GVtKPR4Ura0UjOxCZh0+HKObyUsEnYXFB7A43kNLiSdjQ6XEk7GsmZ2CRsOlw5h5cSNgmbC2pvoJGcBlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1obJ2JTYcraUejw5W0o9HhSocrNW3pwXRSo8OVtKOxdSY2Ha6kHY0OV9KORocrHa7UtKUH00mNDlfSjsbWmdh0uJJ2NDpcSTsaHa50uFLTlh5MJzU6XEk7GltnYtPhStrR6HAl7Wh0uNLhSk1bejCd1OhwJe1oJOc+vN3hStrR2DoTm4RNwqarPu+H1eDtDlfSjsbWmdgkbBI2XfV5P6wGb3e4knY0ts7EJmGTsOmqz/thNXi7w5W0o7F1JjYJm4RNV33eD6vB2x2upB2NrTOxSdgkbLrq835YDd7ucCXtaGydiU3CJmHTVZ+zH9YpvNTdsulwJe1o3Im3EzbbqsGVeqf2Bhrn8FJ3y6bDlbSjcSfeTthsqwZX6p3aG2icw0vdLZsOV9KOxp14O2GzrRpcqXdqb6BxDi91t2w6XEk7Gnfi7YTNtmpwpd6pvYHGObzU3bLpcCXtaNyJtxM226rBlXqn9gYa5/BSd8umw5W0o3En3k7YbKsGV+qd2vspvia9R6NzJjZd1eBuWtbocCVh0+FKTVt68Fl8TXqPRudMbLqqwd20rNHhSsKmw5WatvTgs/ia9B6NzpnYdFWDu2lZo8OVhE2HKzVt6cFn8TXpPRqdM7HpqgZ307JGhysJmw5XatrSg8/ia9J7NDpnYtNVDe6mZY0OVxI2Ha7UtKUHn8XXpPdodM7Epqsa3E3LGh2uJGw6XKnZly8v/4P3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX3w3q5hffDermF98N6uYX/Ay6DIKLn9Mh8AAAAAElFTkSuQmCC","payUrl":"MOCK_PAY:OP2072580594507845632","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580594814029824","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PENDING","qrCodeBase64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAIAAAAiOjnJAAARVUlEQVR4Xu3SQZLjSnAE0X//S7f2LwOmsESBFDXw5Zh7ZHEa//29vDzAf/7Dy8sJ3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEd4P6+UR3g/r5RHeD+vlEdoP67+v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2v4msSNqnS6JwGVxI2qdLonE/iay6ova/iaxI2qdLonAZXEjap0uicT+JrLqi9r+JrEjap0uicBlcSNqnS6JxP4msuqL2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2Bxjm8dO6Wu9/G96UXanTOKbxU36q9gcY5vHTulrvfxvelF2p0zim8VN+qvYHGObx07pa738b3pRdqdM4pvFTfqr2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7Gltnh7tpWeOcM7FJlUaHK2lH44LaG2gkp8GVtKOxdXa4m5Y1zjkTm1RpdLiSdjQuqL2BRnIaXEk7GltnYpOwSdgkbFKlcc5pcCXtaFxQewON5DS4knY0ts7EJmGTsEnYpErjnNPgStrRuKD2BhrJaXAl7WhsnYlNwiZhk7BJlcY5p8GVtKNxQe0NNJLT4Era0dg6E5uETcImYZMqjXNOgytpR+OC2htoJKfBlbSjsXUmNgmbhE3CJlUa55wGV9KOxgW1N9BIToMraUdj60xsEjYJm4RNqjTOOQ2upB2NC2pvoJGcBlfSjkZyTuGlhE3CJlUaHa6kHY0OV9KOxgW1N9BIToMraUcjOafwUsImYZMqjQ5X0o5GhytpR+OC2htoJKfBlbSjkZxTeClhk7BJlUaHK2lHo8OVtKNxQe0NNJLT4Era0UjOKbyUsEnYpEqjw5W0o9HhStrRuKD2BhrJaXAl7Wgk5xReStgkbFKl0eFK2tHocCXtaFxQewON5DS4knY0knMKLyVsEjap0uhwJe1odLiSdjQuqL2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2Bxjm8lG5pbJ3n8PYWd9Oyxjm8VN+qvYHGObyUbmlsnefw9hZ307LGObxU36q9gcY5vJRuaWyd5/D2FnfTssY5vFTfqr2v4mvSezT+JeeT+JoLau+r+Jr0Ho1/yfkkvuaC2vsqvia9R+Nfcj6Jr7mg9r6Kr0nv0fiXnE/iay6ova/ia9J7NP4l55P4mgtq76v4mvQejX/J+SS+5oLW+7+GP7f+wQu8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT/Br/4S/yBP/km8lG5pJGdi01U/wa/+Ev8gT/5JvJRuaSRnYtNVP8Gv/hL/IE/+SbyUbmkkZ2LTVT9B+0v8D0j/BRrn8FLCJmFzDi+lWxrnnFN46Qbtlk9Ij9A4h5cSNgmbc3gp3dI455zCSzdot3xCeoTGObyUsEnYnMNL6ZbGOecUXrpBu+UT0iM0zuGlhE3C5hxeSrc0zjmn8NIN2i2fkB6hcQ4vJWwSNufwUrqlcc45hZdu0G75hPQIjXN4KWGTsDmHl9ItjXPOKbx0g3bLJ6RHaHS4krBJ2CRszuGlLe4mbBI2CZuETVf9vR/WKby0xd2ETcImYZOw6aq/98M6hZe2uJuwSdgkbBI2XfX3flin8NIWdxM2CZuETcKmq/7eD+sUXtribsImYZOwSdh01d/7YZ3CS1vcTdgkbBI2CZuu+rvzYU1sUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsUqWRsEnYbHH3s/ia7j0226rBlXqn9gpsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLDyZsttUOdxM25yqNDle6HZsOVxI2XRVpSw8mbLbVDncTNucqjQ5Xuh2bDlcSNl0VaUsPJmy21Q53EzbnKo0OV7odmw5XEjZdFWlLD6aTGk/i7YRNV01cSdicw0vplkbnTGxu0G75hPQIjSfxdsKmqyauJGzO4aV0S6NzJjY3aLd8QnqExpN4O2HTVRNXEjbn8FK6pdE5E5sbtFs+IT1C40m8nbDpqokrCZtzeCnd0uicic0N2i2fkB6h8STeTth01cSVhM05vJRuaXTOxOYG7ZZPSI/QeBJvJ2y6auJKwuYcXkq3NDpnYnODdssnpEdoJGeHuwmbVGlscTdhkyqNhE2HK2lH4yjtuo9Kz9JIzg53Ezap0tjibsImVRoJmw5X0o7GUdp1H5WepZGcHe4mbFKlscXdhE2qNBI2Ha6kHY2jtOs+Kj1LIzk73E3YpEpji7sJm1RpJGw6XEk7Gkdp131UepZGcna4m7BJlcYWdxM2qdJI2HS4knY0jtKu+6j0LI3k7HA3YZMqjS3uJmxSpZGw6XAl7WgcZb/uM9NDNba4m5Y1zjk73E3YbKuJTVdNXKl3Wm/iwXRSY4u7aVnjnLPD3YTNtprYdNXElXqn9SYeTCc1tribljXOOTvcTdhsq4lNV01cqXdab+LBdFJji7tpWeOcs8PdhM22mth01cSVeqf1Jh5MJzW2uJuWNc45O9xN2GyriU1XTVypd1pv4sF0UmOLu2lZ45yzw92Ezbaa2HTVxJV6p/UmHqxPLvBSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKAca5/BSuqXRORObVGl0zsRmWzW40u3Y1NwoBxrn8FK6pdE5E5tUaXTOxGZbNbjS7djU3CgHGufwUrql0TkTm1RpdM7EZls1uNLt2NTcKP9f4K96Em931226auJKwuYG+y0f9Zv4q57E2911m66auJKwucF+y0f9Jv6qJ/F2d92mqyauJGxusN/yUb+Jv+pJvN1dt+mqiSsJmxvst3zUb+KvehJvd9dtumriSsLmBvstH/Wb+KuexNvddZuumriSsLlBu+UTto9wJWHzJN7e4m7C5slq4kra0UjYXFB7A40OVxI2T+LtLe4mbJ6sJq6kHY2EzQW1N9DocCVh8yTe3uJuwubJauJK2tFI2FxQewONDlcSNk/i7S3uJmyerCaupB2NhM0FtTfQ6HAlYfMk3t7ibsLmyWriStrRSNhcUHsDjQ5XEjZP4u0t7iZsnqwmrqQdjYTNBbU30EhOgyvbnQYvJWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV3/thTWw6XNnuNHgp3dLonIlNV/29H9bEpsOV7U6Dl9Itjc6Z2HTV39kPq8GVbsemqxrcTdikSqPDlW7HJlUaHa7coN3yCdtHuNLt2HRVg7sJm1RpdLjS7dikSqPDlRu0Wz5h+whXuh2brmpwN2GTKo0OV7odm1RpdLhyg3bLJ2wf4Uq3Y9NVDe4mbFKl0eFKt2OTKo0OV27QbvmE7SNc6XZsuqrB3YRNqjQ6XOl2bFKl0eHKDdotn7B9hCvdjk1XNbibsEmVRocr3Y5NqjQ6XLlBu+UT0iM0kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9X05YeTCc1kjOx2eJut2yTsEnYPFl9Et9Xsy+/i/8BCZttNbFJ2HTVxJUOVxI2qdKo2Zffxf+AhM22mtgkbLpq4kqHKwmbVGnU7Mvv4n9AwmZbTWwSNl01caXDlYRNqjRq9uV38T8gYbOtJjYJm66auNLhSsImVRo1+/K7+B+QsNlWE5uETVdNXOlwJWGTKo2affld/A9I2GyriU3CpqsmrnS4krBJlUZNW3rws/iahE3CZou7W9xNyxpbZ2JzlHbdR30WX5OwSdhscXeLu2lZY+tMbI7Srvuoz+JrEjYJmy3ubnE3LWtsnYnNUdp1H/VZfE3CJmGzxd0t7qZlja0zsTlKu+6jPouvSdgkbLa4u8XdtKyxdSY2R2nXfdRn8TUJm4TNFne3uJuWNbbOxOYo7bqPevJZXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00zuGldEsjOQ2upB2N5ExsUqWRsOlwpduxSdhcUHsDjXN4Kd3SSE6DK2lHIzkTm1RpJGw6XOl2bBI2F9TeQOMcXkq3NJLT4Era0UjOxCZVGgmbDle6HZuEzQW1N9A4h5fSLY3kNLiSdjSSM7FJlUbCpsOVbscmYXNB7Q00ktPgStrR6JyJTcImYXOu0jiHlxI2CZsLam+gkZwGV9KORudMbBI2CZtzlcY5vJSwSdhcUHsDjeQ0uJJ2NDpnYpOwSdicqzTO4aWETcLmgtobaCSnwZW0o9E5E5uETcLmXKVxDi8lbBI2F9TeQCM5Da6kHY3OmdgkbBI25yqNc3gpYZOwuaD2BhrJaXAl7Wh0zsQmYZOwOVdpnMNLCZuEzQW1N9BIToMraUfjSafBlS3uJmwSNh2uHKVd91HpWRodrqQdjSedBle2uJuwSdh0uHKUdt1HpWdpdLiSdjSedBpc2eJuwiZh0+HKUdp1H5WepdHhStrReNJpcGWLuwmbhE2HK0dp131UepZGhytpR+NJp8GVLe4mbBI2Ha4cpV33UelZGh2upB2NJ50GV7a4m7BJ2HS4cpR23UelZ2l0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT2YTmp0uJJ2NDpnYvNtfF+HK9udibs3ltvSg+mkRocraUejcyY238b3dbiy3Zm4e2O5LT144+T/ipeevDXx9va6K92OTcJmWzW4Uu/U3kDjHF568tbE29vrrnQ7NgmbbdXgSr1TewONc3jpyVsTb2+vu9Lt2CRstlWDK/VO7Q00zuGlJ29NvL297kq3Y5Ow2VYNrtQ7tTfQOIeXnrw18fb2uivdjk3CZls1uFLv1N5A4xxeevLWxNvb6650OzYJm23V4Eq9U3tfxdd8+z0T35ew6aqJK1vcPUq77qM+i6/59nsmvi9h01UTV7a4e5R23Ud9Fl/z7fdMfF/Cpqsmrmxx9yjtuo/6LL7m2++Z+L6ETVdNXNni7lHadR/1WXzNt98z8X0Jm66auLLF3aO06z7qs/iab79n4vsSNl01cWWLu0d5dv3ln+X9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuH9sF4e4f2wXh7h/bBeHuF/ANQkBqB7RoIFAAAAAElFTkSuQmCC","payUrl":"MOCK_PAY:OP2072580594814029824","expireTime":"2026-07-02 15:33:15","expireHint":"请在15分钟内完成付款,超时订单将自动过期","createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580595095048192","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PAID","qrCodeBase64":null,"payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":null,"createTime":"2026-07-02 15:18:15"},{"orderNo":"OP2072580595497701376","planName":"高级会员·月卡","amount":29.90,"channel":"WECHAT","status":"PAID","qrCodeBase64":null,"payUrl":null,"expireTime":"2026-07-02 15:33:15","expireHint":null,"createTime":"2026-07-02 15:18:15"}],"timestamp":1782976695423}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.432 DEBUG [stKnnthP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/payment/plans | IP: 127.0.0.1
- 15:18:15.432 DEBUG [stKnnthP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.432 DEBUG [stKnnthP] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.435 DEBUG [stKnnthP] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.443 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_payment_plan WHERE (plan_code = ?)
- 15:18:15.443 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.selectCount : ==> Parameters: BIENNIAL(String)
- 15:18:15.444 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.selectCount : <== Total: 1
- 15:18:15.445 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.insert : ==> Preparing: INSERT INTO t_payment_plan ( id, plan_name, plan_code, membership_level, price, original_price, duration_days, sort_order, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:15.445 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.insert : ==> Parameters: 2072580596041719810(Long), 两年卡(String), BIENNIAL(String), PRO(String), 1599(BigDecimal), 1798(BigDecimal), 730(Integer), 0(Integer), 1(Integer), 2026-07-02T15:18:15.445902800(LocalDateTime), 2026-07-02T15:18:15.445902800(LocalDateTime)
- 15:18:15.449 DEBUG [stKnnthP] [1] [ main] c.x.p.m.P.insert : <== Updates: 1
- 15:18:15.449 INFO [stKnnthP] [1] [ main] c.x.p.s.PaymentPlanService : 创建支付方案: 两年卡 (BIENNIAL)
- 15:18:15.454 DEBUG [stKnnthP] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/payment/plans 200 22ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/payment/plans
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"138"]
- Body = {"planCode":"BIENNIAL","planName":"两年卡","price":1599,"originalPrice":1798,"durationDays":730,"membershipLevel":"PRO","tag":"省11%"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.AdminPaymentController
- Method = com.xuekairui.payment.controller.AdminPaymentController#createPlan(AdminPlanUpsertRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"stKnnthP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":2072580596041719810,"planName":"两年卡","planCode":"BIENNIAL","membershipLevel":"PRO","price":1599,"originalPrice":1798,"durationDays":730,"description":null,"tag":"省11%","sortOrder":0},"timestamp":1782976695453}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.459 DEBUG [kR6hYVzh] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1 | IP: 127.0.0.1
- 15:18:15.460 DEBUG [kR6hYVzh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.460 DEBUG [kR6hYVzh] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.461 DEBUG [kR6hYVzh] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.464 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.464 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.466 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.467 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_payment_plan WHERE (plan_code = ?)
- 15:18:15.467 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectCount : ==> Parameters: MONTHLY(String)
- 15:18:15.469 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.selectCount : <== Total: 1
- 15:18:15.470 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_plan SET plan_name=?, plan_code=?, membership_level=?, price=?, original_price=?, duration_days=?, sort_order=?, status=?, create_time=?, update_time=? WHERE id=?
- 15:18:15.470 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: 月卡(更新)(String), MONTHLY(String), PRO(String), 109(BigDecimal), 109(BigDecimal), 30(Integer), 3(Integer), 1(Integer), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
- 15:18:15.473 DEBUG [kR6hYVzh] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
- 15:18:15.473 INFO [kR6hYVzh] [1] [ main] c.x.p.s.PaymentPlanService : 更新支付方案: 月卡(更新) (MONTHLY)
- 15:18:15.478 DEBUG [kR6hYVzh] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1 200 19ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/payment/plans/1
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"124"]
- Body = {"planCode":"MONTHLY","planName":"月卡(更新)","price":109,"originalPrice":109,"durationDays":30,"membershipLevel":"PRO"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.AdminPaymentController
- Method = com.xuekairui.payment.controller.AdminPaymentController#updatePlan(Long, AdminPlanUpsertRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"kR6hYVzh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"planName":"月卡(更新)","planCode":"MONTHLY","membershipLevel":"PRO","price":109,"originalPrice":109,"durationDays":30,"description":null,"tag":null,"sortOrder":3},"timestamp":1782976695477}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.486 DEBUG [CBzU7AQs] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1/status | IP: 127.0.0.1
- 15:18:15.487 DEBUG [CBzU7AQs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.487 DEBUG [CBzU7AQs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.489 DEBUG [CBzU7AQs] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.492 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.selectById : ==> Preparing: SELECT id,plan_name,plan_code,membership_level,price,original_price,duration_days,sort_order,status,description,create_time,update_time FROM t_payment_plan WHERE id=?
- 15:18:15.493 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.selectById : ==> Parameters: 1(Long)
- 15:18:15.494 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.selectById : <== Total: 1
- 15:18:15.494 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.updateById : ==> Preparing: UPDATE t_payment_plan SET plan_name=?, plan_code=?, membership_level=?, price=?, original_price=?, duration_days=?, sort_order=?, status=?, description=?, create_time=?, update_time=? WHERE id=?
- 15:18:15.494 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.updateById : ==> Parameters: 月卡(更新)(String), MONTHLY(String), PRO(String), 109.00(BigDecimal), 109.00(BigDecimal), 30(Integer), 3(Integer), 0(Integer), 每天不限量· 1个月29.9(原价59.9)(String), 2026-07-02T15:18:14(LocalDateTime), 2026-07-02T15:18:14(LocalDateTime), 1(Long)
- 15:18:15.497 DEBUG [CBzU7AQs] [1] [ main] c.x.p.m.P.updateById : <== Updates: 1
- 15:18:15.497 INFO [CBzU7AQs] [1] [ main] c.x.p.s.PaymentPlanService : 切换支付方案状态: 月卡(更新) -> status=0
- 15:18:15.503 DEBUG [CBzU7AQs] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1/status 200 17ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/payment/plans/1/status
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTUsImV4cCI6MTc4MzA2MzA5NX0.UKksd2KBHCQNgn-HOtGW4hjYSw1vU10Ccfy7Y602H4RfX4-h5zqx_t1TRv2PNTXO8TB59CMFEbMsXaABf5tK0g", Content-Length:"12"]
- Body = {"status":0}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.AdminPaymentController
- Method = com.xuekairui.payment.controller.AdminPaymentController#toggleStatus(Long, Map)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"CBzU7AQs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976695502}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.505 DEBUG [3wwVZC9c] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/payment/plans | IP: 127.0.0.1
- 15:18:15.507 WARN [3wwVZC9c] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/payment/plans 401 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/payment/plans
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"90"]
- Body = {"planCode":"TEST","planName":"测试","price":1,"durationDays":1,"membershipLevel":"PRO"}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"3wwVZC9c", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976695506}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.513 DEBUG [44xjfQz2] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1 | IP: 127.0.0.1
- 15:18:15.514 DEBUG [44xjfQz2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:15.514 DEBUG [44xjfQz2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:15.515 DEBUG [44xjfQz2] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:15.516 WARN [44xjfQz2] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/payment/plans/1 403 3ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/payment/plans/1
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5NSwiZXhwIjoxNzgzMDYzMDk1fQ.bsBXxeXrKAqT7fbQ4WRdyGzEh4xF7Bb1DuU_S8wy8VR-qiCvIT0REc_hL4CUmDI-PO2lkj2c44gNKjWWi5Rs9A", Content-Length:"95"]
- Body = {"planCode":"MONTHLY","planName":"月卡","price":99,"durationDays":30,"membershipLevel":"PRO"}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 403
- Error message = null
- Headers = [X-Request-Id:"44xjfQz2", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":403,"message":"无权限访问","data":null,"timestamp":1782976695516}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.520 DEBUG [ncVj6cc8] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/callback/wechat | IP: 127.0.0.1
- 15:18:15.521 INFO [ncVj6cc8] [] [ main] .p.c.PaymentCallbackController : 【模拟】收到微信支付回调: orderNo=null tradeNo=null
- 15:18:15.521 WARN [ncVj6cc8] [] [ main] .p.c.PaymentCallbackController : 微信回调缺少订单号
- 15:18:15.522 DEBUG [ncVj6cc8] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/callback/wechat 200 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/callback/wechat
- Parameters = {}
- Headers = [Content-Type:"application/x-www-form-urlencoded;charset=UTF-8"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentCallbackController
- Method = com.xuekairui.payment.controller.PaymentCallbackController#wechatCallback(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ncVj6cc8", Content-Type:"text/plain;charset=UTF-8", Content-Length:"4", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = text/plain;charset=UTF-8
- Body = FAIL
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:15.526 DEBUG [PTf8nGBr] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/callback/alipay | IP: 127.0.0.1
- 15:18:15.527 INFO [PTf8nGBr] [] [ main] .p.c.PaymentCallbackController : 【模拟】收到支付宝回调: orderNo=null tradeNo=null
- 15:18:15.527 WARN [PTf8nGBr] [] [ main] .p.c.PaymentCallbackController : 支付宝回调缺少订单号
- 15:18:15.528 DEBUG [PTf8nGBr] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/payment/callback/alipay 200 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/payment/callback/alipay
- Parameters = {}
- Headers = [Content-Type:"application/x-www-form-urlencoded;charset=UTF-8"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.payment.controller.PaymentCallbackController
- Method = com.xuekairui.payment.controller.PaymentCallbackController#alipayCallback(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"PTf8nGBr", Content-Type:"text/plain;charset=UTF-8", Content-Length:"4", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = text/plain;charset=UTF-8
- Body = fail
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 18, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.593 s -- in 支付模块接口测试
- [INFO] Running com.xuekairui.gateway.PlatformAccountBindingTest
- 15:18:15.532 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.PlatformAccountBindingTest]: PlatformAccountBindingTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:15.534 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.PlatformAccountBindingTest
- 15:18:18.633 DEBUG [CzkhgEqt] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:18.635 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:18.636 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:18.637 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:18.637 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.637 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.637467900(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.641 DEBUG [CzkhgEqt] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.642 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.642 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.637467900(LocalDateTime), 127.0.0.1(String), 1(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.644 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.645 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:18.645 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:18.647 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:18.647 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:18.647 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:18.650 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:18.650 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:18.650 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:18.653 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:18.653 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.653 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580609518018562(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.653023800(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.653550300(LocalDateTime)
- 15:18:18.657 DEBUG [CzkhgEqt] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.657 DEBUG [CzkhgEqt] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:18.663 DEBUG [CzkhgEqt] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 30ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"CzkhgEqt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.DwLxUCP1WIogZR390EgMTUPXzDT6wQ4GxS04PI4ogkCShZyeG3QIHg4TjSz2Ic6_sWcMz7USNVwKgaI1zIGofw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976698662}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.663 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
- 15:18:18.665 DEBUG [wgE6Rqh7] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
- 15:18:18.669 DEBUG [wgE6Rqh7] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:18:18.669 DEBUG [wgE6Rqh7] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
- 15:18:18.671 DEBUG [wgE6Rqh7] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
- 15:18:18.673 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.674 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580609580933121(Long), 1(Long), yaoshibang(String), 药师帮(String), J2sm/7ZSTEqpVLqnb0gvOFtbl0szwzM7HQcFw5LUobJDO5xznMr1(String), 8OvI7mta/feZVi3l9erAmiyoGmhnhKliclHj5m4lXHhKKwRWC8KBbVCN3GuA(String), true(Boolean), PENDING(String), 2026-07-02T15:18:18.673502100(LocalDateTime), 2026-07-02T15:18:18.673502100(LocalDateTime)
- 15:18:18.677 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
- 15:18:18.677 INFO [wgE6Rqh7] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaoshibang
- 15:18:18.683 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.683 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580609648041985(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.683314500(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.683853400(LocalDateTime)
- 15:18:18.689 DEBUG [wgE6Rqh7] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.689 DEBUG [wgE6Rqh7] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
- 15:18:18.690 DEBUG [wgE6Rqh7] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 25ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.DwLxUCP1WIogZR390EgMTUPXzDT6wQ4GxS04PI4ogkCShZyeG3QIHg4TjSz2Ic6_sWcMz7USNVwKgaI1zIGofw", Content-Length:"111"]
- Body = {"platformCode":"yaoshibang","platformName":"药师帮","account":"13800138000","password":"test_password_123"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"wgE6Rqh7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698689}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.690 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 绑定药师帮账号成功
- 15:18:18.693 DEBUG [dZ7XuQBs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:18.696 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:18.697 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:18.698 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:18.699 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.699 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.699420400(LocalDateTime), 127.0.0.1(String), 1(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.702 DEBUG [dZ7XuQBs] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.703 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.703 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.699420400(LocalDateTime), 127.0.0.1(String), 2(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.705 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.705 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:18.706 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:18.707 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:18.707 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:18.707 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:18.708 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:18.709 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:18.709 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:18.711 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:18.711 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.712 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580609710956546(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.711581200(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.711581200(LocalDateTime)
- 15:18:18.714 DEBUG [dZ7XuQBs] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.714 DEBUG [dZ7XuQBs] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:18.719 DEBUG [dZ7XuQBs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 26ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"dZ7XuQBs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.bNN1LMyocxH1F2r3e0hEq-8lkXhPTNRnNk7HGKZZUZBO1x1FWZlOn4kFi4HomYvuv6mBmG0yXxX7G4gHM-CPeg","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698718}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.719 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
- 15:18:18.720 DEBUG [eKKTWZtb] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
- 15:18:18.723 DEBUG [eKKTWZtb] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:18:18.723 DEBUG [eKKTWZtb] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
- 15:18:18.724 DEBUG [eKKTWZtb] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
- 15:18:18.725 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.726 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580609778065409(Long), 1(Long), yaobangmang(String), 药帮忙(String), W5i1KGnIoNTqUu/icmspS7Xo45EnvfLSUzIDw/LlTYpOKLQ5HN/G(String), qfShZ0DvC/AhrMANC03BDbOqZ32FbTCRVQTBjX7ajT85NU+Ef98yhkf0QsUv(String), true(Boolean), PENDING(String), 2026-07-02T15:18:18.725526900(LocalDateTime), 2026-07-02T15:18:18.725526900(LocalDateTime)
- 15:18:18.728 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
- 15:18:18.728 INFO [eKKTWZtb] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=yaobangmang
- 15:18:18.733 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.733 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580609840979970(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.732543100(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.733067200(LocalDateTime)
- 15:18:18.737 DEBUG [eKKTWZtb] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.737 DEBUG [eKKTWZtb] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
- 15:18:18.737 DEBUG [eKKTWZtb] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 17ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.bNN1LMyocxH1F2r3e0hEq-8lkXhPTNRnNk7HGKZZUZBO1x1FWZlOn4kFi4HomYvuv6mBmG0yXxX7G4gHM-CPeg", Content-Length:"112"]
- Body = {"platformCode":"yaobangmang","platformName":"药帮忙","account":"13900139000","password":"test_password_456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"eKKTWZtb", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698737}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.738 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 绑定药帮忙账号成功
- 15:18:18.741 DEBUG [UJrtVWxg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:18.743 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:18.743 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:18.744 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:18.745 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.745 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.744899400(LocalDateTime), 127.0.0.1(String), 2(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.747 DEBUG [UJrtVWxg] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.748 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.748 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.744899400(LocalDateTime), 127.0.0.1(String), 3(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.751 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.751 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:18.751 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:18.752 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:18.752 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:18.752 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:18.753 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:18.753 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:18.753 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:18.754 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:18.755 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.755 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580609908088833(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.754949300(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.755516900(LocalDateTime)
- 15:18:18.757 DEBUG [UJrtVWxg] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.757 DEBUG [UJrtVWxg] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:18.761 DEBUG [UJrtVWxg] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 20ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"UJrtVWxg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KXxF-QJWZK9ODQu0tjI80EEwYBFdSxVaW6a1GRMZxheEP__hOeJIHArTx5NVsvg_YpNwfkckhuaWl06Lu7lvdw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698761}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.762 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
- 15:18:18.762 DEBUG [ybGBKDTr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
- 15:18:18.763 DEBUG [ybGBKDTr] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
- 15:18:18.763 DEBUG [ybGBKDTr] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
- 15:18:18.765 DEBUG [ybGBKDTr] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 2
- 15:18:18.766 DEBUG [ybGBKDTr] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-account/list
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KXxF-QJWZK9ODQu0tjI80EEwYBFdSxVaW6a1GRMZxheEP__hOeJIHArTx5NVsvg_YpNwfkckhuaWl06Lu7lvdw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ybGBKDTr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":2072580609778065409,"platformCode":"yaobangmang","platformName":"药帮忙","account":"139****9000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:18:19"},{"id":2072580609580933121,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:18:19"}],"timestamp":1782976698766}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.767 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 查询已绑定平台列表成功
- 15:18:18.770 DEBUG [9UX3t5ML] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:18.773 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:18.773 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:18.774 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:18.775 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.775 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.775316100(LocalDateTime), 127.0.0.1(String), 3(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.778 DEBUG [9UX3t5ML] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.779 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.779 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.775316100(LocalDateTime), 127.0.0.1(String), 4(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.782 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.782 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:18.782 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:18.784 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:18.784 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:18.784 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:18.786 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:18.787 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:18.787 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:18.788 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:18.789 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.789 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610033917953(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.788622300(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.789196100(LocalDateTime)
- 15:18:18.791 DEBUG [9UX3t5ML] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.791 DEBUG [9UX3t5ML] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:18.796 DEBUG [9UX3t5ML] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 26ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"9UX3t5ML", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.xM1I0C2HL9PhlFQcD0wBJEvrghajoFjIdQUqIJLb-05YiF9zavw4Eq4nXHM3QR3F3lmRMj5aiwGeNea_B0--gQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698795}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.796 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
- 15:18:18.797 DEBUG [YqNEnEZs] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang | IP: 127.0.0.1
- 15:18:18.799 DEBUG [YqNEnEZs] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:18:18.799 DEBUG [YqNEnEZs] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
- 15:18:18.800 DEBUG [YqNEnEZs] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 1
- 15:18:18.801 INFO [YqNEnEZs] [1] [ main] c.x.u.s.PlatformAccountService : 模拟验证平台账号: platform=yaoshibang, account=13800138000
- 15:18:18.801 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.P.updateById : ==> Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.801 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.P.updateById : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), J2sm/7ZSTEqpVLqnb0gvOFtbl0szwzM7HQcFw5LUobJDO5xznMr1(String), 8OvI7mta/feZVi3l9erAmiyoGmhnhKliclHj5m4lXHhKKwRWC8KBbVCN3GuA(String), true(Boolean), 2026-07-02T15:18:18.801520200(LocalDateTime), SUCCESS(String), 2026-07-02T15:18:19(LocalDateTime), 2026-07-02T15:18:18.801520200(LocalDateTime), 2072580609580933121(Long)
- 15:18:18.802 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.P.updateById : <== Updates: 1
- 15:18:18.808 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.808 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610168135681(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.807318500(LocalDateTime), ACCOUNT(String), VERIFY(String), 验证B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.807863800(LocalDateTime)
- 15:18:18.813 DEBUG [YqNEnEZs] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.813 DEBUG [YqNEnEZs] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 验证B2B平台账号
- 15:18:18.813 DEBUG [YqNEnEZs] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yaoshibang 200 16ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/verify/yaoshibang
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.xM1I0C2HL9PhlFQcD0wBJEvrghajoFjIdQUqIJLb-05YiF9zavw4Eq4nXHM3QR3F3lmRMj5aiwGeNea_B0--gQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#verifyAccount(String, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"YqNEnEZs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698813}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.814 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 验证药师帮账号成功
- 15:18:18.816 DEBUG [eT8bfwNn] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:18.818 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:18.818 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:18.820 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:18.821 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.821 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.820569300(LocalDateTime), 127.0.0.1(String), 4(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.822 DEBUG [eT8bfwNn] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.823 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.823 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.820569300(LocalDateTime), 127.0.0.1(String), 5(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.825 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.825 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:18.825 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:18.826 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:18.826 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:18.826 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:18.827 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:18.827 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:18.827 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:18.829 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:18.829 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.829 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610231050242(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.829042500(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.829569300(LocalDateTime)
- 15:18:18.831 DEBUG [eT8bfwNn] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.831 DEBUG [eT8bfwNn] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:18.836 DEBUG [eT8bfwNn] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 20ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"eT8bfwNn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.UE-x2-S3wlUv2swkDidbQ-u0YL1uNEOR7tjmBMnGqKNbGguY9tf93v5b1-yWhDAqi8PG3lWFLnzNbx97H7ZXOg","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698835}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.836 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
- 15:18:18.838 DEBUG [Jdt4Yhu7] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
- 15:18:18.840 DEBUG [Jdt4Yhu7] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:18:18.840 DEBUG [Jdt4Yhu7] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaoshibang(String)
- 15:18:18.841 DEBUG [Jdt4Yhu7] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 1
- 15:18:18.842 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.P.updateById : ==> Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, last_verify_time=?, verify_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.842 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.P.updateById : ==> Parameters: 1(Long), yaoshibang(String), 药师帮(String), eTLZ7BtpQL4iRytYjd1isaCnWC0AgU+gBaIPOM+fTQru3S3O4dxV(String), O4+Vpgl6MXtWHXdN3NMWfe3SXk+l3irnsh/4A9yhfW20tAAQUKapMsvtK/k=(String), true(Boolean), 2026-07-02T15:18:19(LocalDateTime), PENDING(String), 2026-07-02T15:18:19(LocalDateTime), 2026-07-02T15:18:18.842388900(LocalDateTime), 2072580609580933121(Long)
- 15:18:18.844 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.P.updateById : <== Updates: 1
- 15:18:18.844 INFO [Jdt4Yhu7] [1] [ main] c.x.u.s.PlatformAccountService : 更新平台账号绑定: userId=1, platform=yaoshibang
- 15:18:18.849 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.849 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610293964802(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.849125400(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaoshibang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.849125400(LocalDateTime)
- 15:18:18.853 DEBUG [Jdt4Yhu7] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.853 DEBUG [Jdt4Yhu7] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
- 15:18:18.854 DEBUG [Jdt4Yhu7] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 16ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.UE-x2-S3wlUv2swkDidbQ-u0YL1uNEOR7tjmBMnGqKNbGguY9tf93v5b1-yWhDAqi8PG3lWFLnzNbx97H7ZXOg", Content-Length:"110"]
- Body = {"platformCode":"yaoshibang","platformName":"药师帮","account":"13800138000","password":"new_password_789"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Jdt4Yhu7", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698853}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.854 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 更新药师帮账号成功
- 15:18:18.856 DEBUG [u8JLQDX9] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:18.859 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:18.859 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:18.861 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:18.861 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.861 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.861310300(LocalDateTime), 127.0.0.1(String), 5(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.863 DEBUG [u8JLQDX9] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.864 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.864 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.861310300(LocalDateTime), 127.0.0.1(String), 6(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.867 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.867 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:18.867 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:18.868 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:18.868 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:18.868 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:18.869 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:18.870 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:18.870 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:18.871 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:18.871 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.872 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610423988226(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.871940900(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.871940900(LocalDateTime)
- 15:18:18.874 DEBUG [u8JLQDX9] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.874 DEBUG [u8JLQDX9] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:18.879 DEBUG [u8JLQDX9] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 23ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"u8JLQDX9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KmK1NZ58AepoGq6DaQpIjI9ok983TgnnOtGRFz04U3UATRT4fyggqaAK4Q_7f_uja1_l1Xd-Uso0aoihxp9AXw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698878}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.879 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
- 15:18:18.880 DEBUG [r5Kmvttv] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaobangmang | IP: 127.0.0.1
- 15:18:18.882 DEBUG [r5Kmvttv] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:18:18.882 DEBUG [r5Kmvttv] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yaobangmang(String)
- 15:18:18.884 DEBUG [r5Kmvttv] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 1
- 15:18:18.884 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.P.updateById : ==> Preparing: UPDATE t_platform_account SET user_id=?, platform_code=?, platform_name=?, account_encrypted=?, password_encrypted=?, enabled=?, verify_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.884 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.P.updateById : ==> Parameters: 1(Long), yaobangmang(String), 药帮忙(String), W5i1KGnIoNTqUu/icmspS7Xo45EnvfLSUzIDw/LlTYpOKLQ5HN/G(String), qfShZ0DvC/AhrMANC03BDbOqZ32FbTCRVQTBjX7ajT85NU+Ef98yhkf0QsUv(String), false(Boolean), PENDING(String), 2026-07-02T15:18:19(LocalDateTime), 2026-07-02T15:18:18.884322700(LocalDateTime), 2072580609778065409(Long)
- 15:18:18.886 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.P.updateById : <== Updates: 1
- 15:18:18.886 INFO [r5Kmvttv] [1] [ main] c.x.u.s.PlatformAccountService : 解绑平台账号: userId=1, platform=yaobangmang
- 15:18:18.891 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.891 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610491097089(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.891117800(LocalDateTime), ACCOUNT(String), UNBIND(String), 解绑B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:yaobangmang(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.891117800(LocalDateTime)
- 15:18:18.896 DEBUG [r5Kmvttv] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.896 DEBUG [r5Kmvttv] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 解绑B2B平台账号
- 15:18:18.897 DEBUG [r5Kmvttv] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yaobangmang 200 17ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/platform-account/unbind/yaobangmang
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KmK1NZ58AepoGq6DaQpIjI9ok983TgnnOtGRFz04U3UATRT4fyggqaAK4Q_7f_uja1_l1Xd-Uso0aoihxp9AXw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#unbindAccount(String, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"r5Kmvttv", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698896}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.897 DEBUG [kY3LaxFj] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
- 15:18:18.898 DEBUG [kY3LaxFj] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
- 15:18:18.898 DEBUG [kY3LaxFj] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
- 15:18:18.901 DEBUG [kY3LaxFj] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 1
- 15:18:18.901 DEBUG [kY3LaxFj] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-account/list
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NiwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.KmK1NZ58AepoGq6DaQpIjI9ok983TgnnOtGRFz04U3UATRT4fyggqaAK4Q_7f_uja1_l1Xd-Uso0aoihxp9AXw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"kY3LaxFj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":2072580609580933121,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":"2026-07-02 15:18:19","failReason":null,"createTime":"2026-07-02 15:18:19"}],"timestamp":1782976698901}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.901 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 解绑药帮忙账号成功
- 15:18:18.904 DEBUG [jHXHRgYF] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:18.908 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:18.908 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:18.909 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:18.909 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.909 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.909646800(LocalDateTime), 127.0.0.1(String), 6(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.912 DEBUG [jHXHRgYF] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.913 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.913 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.909646800(LocalDateTime), 127.0.0.1(String), 7(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.915 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.916 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:18.916 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:18.917 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:18.917 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:18.917 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:18.918 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:18.919 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:18.919 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:18.920 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:18.920 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.921 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610616926209(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.920808800(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.920808800(LocalDateTime)
- 15:18:18.923 DEBUG [jHXHRgYF] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.923 DEBUG [jHXHRgYF] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:18.928 DEBUG [jHXHRgYF] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 24ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"jHXHRgYF", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.istz5LEYsFTQufiGJvqqDC0G5Z3nO9S-JcT_h4he_J8gH3UYV0qPG1T_zzrYcqgt9BJRHKJvuNMW7UEt5XiubQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698927}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.928 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
- 15:18:18.929 DEBUG [hzYm5FUP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind | IP: 127.0.0.1
- 15:18:18.932 DEBUG [hzYm5FUP] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:18:18.932 DEBUG [hzYm5FUP] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), unsupported_platform(String)
- 15:18:18.933 DEBUG [hzYm5FUP] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
- 15:18:18.934 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.P.insert : ==> Preparing: INSERT INTO t_platform_account ( id, user_id, platform_code, platform_name, account_encrypted, password_encrypted, enabled, verify_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.934 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.P.insert : ==> Parameters: 2072580610679840769(Long), 1(Long), unsupported_platform(String), 不支持的平台(String), YJpj1qk8KnJ3j/yvfvf1bgxlC8HLutOnlPKUNl39MEMaySZq6YsN(String), 2TqsoAnOasdeXWnh9SFdlxPP7bcRZ4X8K61edFBGmE93OjJP(String), true(Boolean), PENDING(String), 2026-07-02T15:18:18.934097600(LocalDateTime), 2026-07-02T15:18:18.934097600(LocalDateTime)
- 15:18:18.936 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.P.insert : <== Updates: 1
- 15:18:18.936 INFO [hzYm5FUP] [1] [ main] c.x.u.s.PlatformAccountService : 新增平台账号绑定: userId=1, platform=unsupported_platform
- 15:18:18.941 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.941 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610679840770(Long), 1(Long), 用户(String), USER(String), 2026-07-02T15:18:18.940934600(LocalDateTime), ACCOUNT(String), BIND(String), 绑定B2B平台账号(String), ACCOUNT(String), 1(Long), ACCOUNT:unsupported_platform(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.941462800(LocalDateTime)
- 15:18:18.946 DEBUG [hzYm5FUP] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.946 DEBUG [hzYm5FUP] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 绑定B2B平台账号
- 15:18:18.946 DEBUG [hzYm5FUP] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/bind 200 17ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/bind
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6NywidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.istz5LEYsFTQufiGJvqqDC0G5Z3nO9S-JcT_h4he_J8gH3UYV0qPG1T_zzrYcqgt9BJRHKJvuNMW7UEt5XiubQ", Content-Length:"121"]
- Body = {"platformCode":"unsupported_platform","platformName":"不支持的平台","account":"13800138000","password":"password"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#bindAccount(BindAccountRequest, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"hzYm5FUP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976698946}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.947 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 不支持的平台拦截正确
- 15:18:18.949 DEBUG [5Nvu4Vkj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:18.953 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:18.953 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:18.955 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:18.955 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.955 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.955185600(LocalDateTime), 127.0.0.1(String), 7(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.958 DEBUG [5Nvu4Vkj] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.958 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.959 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.955185600(LocalDateTime), 127.0.0.1(String), 8(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.962 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.962 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:18.962 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:18.963 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:18.963 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:18.963 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:18.965 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:18.966 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:18.966 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:18.967 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:18.967 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:18.967 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610805669890(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:18.967578700(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:18.967578700(LocalDateTime)
- 15:18:18.969 DEBUG [5Nvu4Vkj] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:18.969 DEBUG [5Nvu4Vkj] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:18.973 DEBUG [5Nvu4Vkj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 24ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"5Nvu4Vkj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.QJv_fCsES6RTbK5dhapWrF51cctfE_YkJM6suH99PoD0TKzyrby1B7X3I7DmfMaGG8RC9Lag1ZpHFyHQAn68QQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976698973}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.974 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
- 15:18:18.974 DEBUG [ryyFs8WZ] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yiyaocheng | IP: 127.0.0.1
- 15:18:18.977 DEBUG [ryyFs8WZ] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:18:18.977 DEBUG [ryyFs8WZ] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yiyaocheng(String)
- 15:18:18.978 DEBUG [ryyFs8WZ] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
- 15:18:18.982 WARN [ryyFs8WZ] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=400, message=未找到该平台的绑定记录
- 15:18:18.982 DEBUG [ryyFs8WZ] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/platform-account/verify/yiyaocheng 200 8ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/platform-account/verify/yiyaocheng
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OCwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.QJv_fCsES6RTbK5dhapWrF51cctfE_YkJM6suH99PoD0TKzyrby1B7X3I7DmfMaGG8RC9Lag1ZpHFyHQAn68QQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#verifyAccount(String, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ryyFs8WZ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"未找到该平台的绑定记录","data":null,"timestamp":1782976698982}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:18.983 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 未绑定平台验证返回业务错误
- 15:18:18.985 DEBUG [UFmngGya] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:18.989 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:18.989 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:18.990 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:18.991 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.991 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.990807100(LocalDateTime), 127.0.0.1(String), 8(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.993 DEBUG [UFmngGya] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.994 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:18.994 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:18.990807100(LocalDateTime), 127.0.0.1(String), 9(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:18.996 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:18.996 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:18.996 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:18.998 DEBUG [UFmngGya] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:18.998 DEBUG [UFmngGya] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:18.998 DEBUG [UFmngGya] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:18.999 DEBUG [UFmngGya] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:18.999 DEBUG [UFmngGya] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:18.999 DEBUG [UFmngGya] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:19.001 DEBUG [UFmngGya] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:19.001 DEBUG [UFmngGya] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:19.001 DEBUG [UFmngGya] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580610935693314(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:19.001294700(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:19.001827200(LocalDateTime)
- 15:18:19.003 DEBUG [UFmngGya] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:19.003 DEBUG [UFmngGya] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:19.008 DEBUG [UFmngGya] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 23ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"UFmngGya", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.HuvvCZX3pAUCTJnN8puEB46Sg6mHFayJKTOx6LdrZwT4DZkgksmGn3tTKTFZQgw4hvY94AqZq7qhxisI3kSmnA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzNTgxNDk4fQ.l9o_JDV8oJwnQdjhCGBuzTUUy2Xazkr8EOQrYxGfc1rlDY1h4hK0jfgcDieWCPl1QwlP7jf9vyjhVrRVu6C5Gg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976699008}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:19.009 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
- 15:18:19.009 DEBUG [ysMB3RMd] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yiyaocheng | IP: 127.0.0.1
- 15:18:19.011 DEBUG [ysMB3RMd] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND platform_code = ? LIMIT 1
- 15:18:19.011 DEBUG [ysMB3RMd] [1] [ main] .u.m.P.selectByUserAndPlatform : ==> Parameters: 1(Long), yiyaocheng(String)
- 15:18:19.012 DEBUG [ysMB3RMd] [1] [ main] .u.m.P.selectByUserAndPlatform : <== Total: 0
- 15:18:19.014 WARN [ysMB3RMd] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=400, message=未找到该平台的绑定记录
- 15:18:19.015 DEBUG [ysMB3RMd] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/platform-account/unbind/yiyaocheng 200 6ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/platform-account/unbind/yiyaocheng
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6OSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OCwiZXhwIjoxNzgzMDYzMDk4fQ.HuvvCZX3pAUCTJnN8puEB46Sg6mHFayJKTOx6LdrZwT4DZkgksmGn3tTKTFZQgw4hvY94AqZq7qhxisI3kSmnA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#unbindAccount(String, Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ysMB3RMd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"未找到该平台的绑定记录","data":null,"timestamp":1782976699014}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:19.015 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 未绑定平台解绑拦截正确
- 15:18:19.017 DEBUG [QTRb8JHd] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:19.021 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:19.021 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:19.022 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:19.022 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:19.023 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:19.022822700(LocalDateTime), 127.0.0.1(String), 9(Long), 42f17257eedd8676d9f7ef0b76cc37094c8ac2363c11937a1545a6f27ce15fb2(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:19.024 DEBUG [QTRb8JHd] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:19.025 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:19.026 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:19.022822700(LocalDateTime), 127.0.0.1(String), 10(Long), cd2f71e5af2806c30293121700ab911b13562980e6f8fafd637d0966100aed76(String), ACTIVE(String), 2026-07-02T15:18:18(LocalDateTime), 2026-07-02T15:18:18(LocalDateTime), 1(Long)
- 15:18:19.027 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:19.028 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:19.028 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:19.029 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:19.029 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:19.029 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:19.030 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:19.030 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:19.031 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:19.031 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:19.032 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:19.032 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580611065716737(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:19.031979900(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:19.032775(LocalDateTime)
- 15:18:19.034 DEBUG [QTRb8JHd] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:19.034 DEBUG [QTRb8JHd] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:19.041 DEBUG [QTRb8JHd] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 24ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"QTRb8JHd", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MTAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTksImV4cCI6MTc4MzA2MzA5OX0.SiUJWJbdfidNKaVg1_0CyTMJFA1bRjZbVovLNGF4Qd_JTTLf-K1OCeL-dwfmTuL_Xs4lOKHiIuJe4vVw5H5U9w","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjY5OSwiZXhwIjoxNzgzNTgxNDk5fQ.D1knOvZlE1Rat8TI9bg9v9K7__kxnb4CHVR0gdAS5YQ192dDEO2Dtj7iiLi02rMkXBSD4CKpNI_-5RRMlEC7yg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:18","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":true,"kickedDeviceInfo":null},"timestamp":1782976699038}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:19.041 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 登录成功: userId=1
- 15:18:19.041 DEBUG [AZepQ8sh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list | IP: 127.0.0.1
- 15:18:19.042 DEBUG [AZepQ8sh] [1] [ main] c.x.u.m.P.selectByUserId : ==> Preparing: SELECT * FROM t_platform_account WHERE user_id = ? AND enabled = true ORDER BY create_time DESC
- 15:18:19.042 DEBUG [AZepQ8sh] [1] [ main] c.x.u.m.P.selectByUserId : ==> Parameters: 1(Long)
- 15:18:19.044 DEBUG [AZepQ8sh] [1] [ main] c.x.u.m.P.selectByUserId : <== Total: 2
- 15:18:19.044 DEBUG [AZepQ8sh] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-account/list 200 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-account/list
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MTAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY2OTksImV4cCI6MTc4MzA2MzA5OX0.SiUJWJbdfidNKaVg1_0CyTMJFA1bRjZbVovLNGF4Qd_JTTLf-K1OCeL-dwfmTuL_Xs4lOKHiIuJe4vVw5H5U9w"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.PlatformAccountController
- Method = com.xuekairui.user.controller.PlatformAccountController#getBoundAccounts(Authentication)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"AZepQ8sh", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":2072580610679840769,"platformCode":"unsupported_platform","platformName":"不支持的平台","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":null,"failReason":null,"createTime":"2026-07-02 15:18:19"},{"id":2072580609580933121,"platformCode":"yaoshibang","platformName":"药师帮","account":"138****8000","enabled":true,"verifyStatus":"PENDING","lastVerifyTime":"2026-07-02 15:18:19","failReason":null,"createTime":"2026-07-02 15:18:19"}],"timestamp":1782976699044}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:19.046 INFO [] [] [ main] x.g.PlatformAccountBindingTest : ? 账号脱敏验证通过: 138****8000
- [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.517 s -- in com.xuekairui.gateway.PlatformAccountBindingTest
- [INFO] Running 安全访问控制测试
- 15:18:19.049 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest]: SecurityAccessTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:19.050 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest
- [INFO] Running HTTP 方法验证
- 15:18:22.009 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation]: HttpMethodValidation does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:22.010 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation
- 15:18:22.013 DEBUG [MEMwM3fn] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/membership/levels | IP: 127.0.0.1
- 15:18:22.015 ERROR [MEMwM3fn] [] [ main] c.x.h.GlobalExceptionHandler : 系统异常
- org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'DELETE' is not supported
- at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:267)
- at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441)
- at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382)
- at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:127)
- at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68)
- at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:509)
- at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1284)
- at org.springframework.test.web.servlet.TestDispatcherServlet.getHandler(TestDispatcherServlet.java:123)
- at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1065)
- at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
- at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
- at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:936)
- at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:596)
- at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
- at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
- at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
- at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
- at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
- at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
- at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
- at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
- at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
- at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
- at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
- at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
- at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
- at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
- at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
- at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
- at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
- at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
- at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
- at com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation.levelList_deleteMethodShouldReturn405(SecurityAccessTest.java:406)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
- at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
- at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
- at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
- at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
- at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
- at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
- at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
- at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
- at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
- at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
- at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
- at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
- at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
- at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
- at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
- at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
- at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
- at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
- at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
- at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
- at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
- 15:18:22.016 WARN [MEMwM3fn] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/membership/levels 500 3ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.HttpRequestMethodNotSupportedException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 500
- Error message = null
- Headers = [X-Request-Id:"MEMwM3fn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":500,"message":"系统繁忙,请稍后重试","data":null,"timestamp":1782976702016}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.019 DEBUG [wTc7EqMQ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/sms/send | IP: 127.0.0.1
- 15:18:22.020 ERROR [wTc7EqMQ] [] [ main] c.x.h.GlobalExceptionHandler : 系统异常
- org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' is not supported
- at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:267)
- at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:441)
- at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:382)
- at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:127)
- at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.getHandlerInternal(RequestMappingInfoHandlerMapping.java:68)
- at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:509)
- at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1284)
- at org.springframework.test.web.servlet.TestDispatcherServlet.getHandler(TestDispatcherServlet.java:123)
- at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1065)
- at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)
- at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
- at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)
- at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
- at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885)
- at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:72)
- at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
- at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:165)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:110)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:108)
- at org.springframework.security.web.FilterChainProxy.lambda$doFilterInternal$3(FilterChainProxy.java:231)
- at org.springframework.security.web.ObservationFilterChainDecorator$FilterObservation$SimpleFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:490)
- at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$1(ObservationFilterChainDecorator.java:351)
- at org.springframework.security.web.ObservationFilterChainDecorator.lambda$wrapSecured$0(ObservationFilterChainDecorator.java:83)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:129)
- at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:101)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:125)
- at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:119)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:131)
- at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at com.xuekairui.user.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:143)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107)
- at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90)
- at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82)
- at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:228)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:241)
- at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:334)
- at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:225)
- at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:138)
- at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233)
- at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.ServletRequestPathFilter.doFilter(ServletRequestPathFilter.java:52)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
- at org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebSecurityConfiguration.java:319)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.servlet.handler.HandlerMappingIntrospector.lambda$createCacheFilter$4(HandlerMappingIntrospector.java:267)
- at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:113)
- at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:74)
- at org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy.doFilter(WebMvcSecurityConfiguration.java:240)
- at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:362)
- at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:278)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at com.xuekairui.gateway.filter.RateLimitFilter.doFilterInternal(RateLimitFilter.java:56)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.ServerHttpObservationFilter.doFilterInternal(ServerHttpObservationFilter.java:110)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at com.xuekairui.gateway.filter.RequestLoggingFilter.doFilterInternal(RequestLoggingFilter.java:79)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
- at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116)
- at org.springframework.test.web.servlet.setup.MockMvcFilterDecorator.doFilter(MockMvcFilterDecorator.java:162)
- at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:132)
- at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:201)
- at com.xuekairui.gateway.SecurityAccessTest$HttpMethodValidation.sendCode_getMethodShouldFail(SecurityAccessTest.java:399)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
- at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.base/java.lang.reflect.Method.invoke(Method.java:568)
- at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:775)
- at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:479)
- at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
- at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)
- at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)
- at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
- at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)
- at org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:216)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:212)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:137)
- at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:156)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:160)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:146)
- at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:144)
- at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:143)
- at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:100)
- at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)
- at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
- at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:201)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:170)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:94)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:59)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:142)
- at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:58)
- at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:103)
- at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:85)
- at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
- at org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)
- at org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)
- at org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)
- at org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)
- at org.apache.maven.surefire.junitplatform.LauncherAdapter.executeWithoutCancellationToken(LauncherAdapter.java:60)
- at org.apache.maven.surefire.junitplatform.LauncherAdapter.execute(LauncherAdapter.java:52)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.execute(JUnitPlatformProvider.java:203)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:168)
- at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:136)
- at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:385)
- at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:162)
- at org.apache.maven.surefire.booter.ForkedBooter.run(ForkedBooter.java:507)
- at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:495)
- 15:18:22.021 WARN [wTc7EqMQ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/sms/send 500 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.HttpRequestMethodNotSupportedException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 500
- Error message = null
- Headers = [X-Request-Id:"wTc7EqMQ", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":500,"message":"系统繁忙,请稍后重试","data":null,"timestamp":1782976702021}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.014 s -- in HTTP 方法验证
- [INFO] Running Token 有效性验证
- 15:18:22.023 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$TokenValidation]: TokenValidation does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:22.024 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$TokenValidation
- 15:18:22.027 DEBUG [u75R6Apc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:18:22.028 WARN [u75R6Apc] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Malformed protected header JSON: Unable to deserialize: Unexpected character ('?' (code 65533 / 0xfffd)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
- at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
- 15:18:22.028 WARN [u75R6Apc] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析Token失败, 原因: Malformed protected header JSON: Unable to deserialize: Unexpected character ('?' (code 65533 / 0xfffd)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
- at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]
- 15:18:22.028 WARN [u75R6Apc] [] [ main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
- 15:18:22.030 WARN [u75R6Apc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 401 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = [Authorization:"Bearer invalid.token.here"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"u75R6Apc", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702028}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.036 DEBUG [GCx37bzE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:18:22.036 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:22.036 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:22.038 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:22.039 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:22.039 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:22.041 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:22.041 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:22.041 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:22.043 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:22.043 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:22.044 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:22.045 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:22.045 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND usage_date = CURDATE()
- 15:18:22.046 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumTodayUsage : ==> Parameters: 1(Long)
- 15:18:22.048 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumTodayUsage : <== Total: 1
- 15:18:22.048 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE()) AND MONTH(usage_date) = MONTH(CURDATE())
- 15:18:22.048 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumMonthlyUsage : ==> Parameters: 1(Long)
- 15:18:22.049 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumMonthlyUsage : <== Total: 1
- 15:18:22.049 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Preparing: SELECT COALESCE(SUM(usage_count), 0) FROM t_crawler_usage_log WHERE user_id = ? AND YEAR(usage_date) = YEAR(CURDATE())
- 15:18:22.049 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumYearlyUsage : ==> Parameters: 1(Long)
- 15:18:22.050 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumYearlyUsage : <== Total: 1
- 15:18:22.051 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.selectList : ==> Preparing: SELECT id FROM t_coupon WHERE (type = ?)
- 15:18:22.051 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.selectList : ==> Parameters: CRAWLER(String)
- 15:18:22.053 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.selectList : <== Total: 0
- 15:18:22.053 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Preparing: SELECT COALESCE(SUM(quota_count - used_count), 0) FROM t_crawler_quota_grant WHERE user_id = ? AND status = 1 AND (expire_time IS NULL OR expire_time > NOW())
- 15:18:22.053 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumAvailableQuota : ==> Parameters: 1(Long)
- 15:18:22.055 DEBUG [GCx37bzE] [1] [ main] c.x.u.m.C.sumAvailableQuota : <== Total: 1
- 15:18:22.055 DEBUG [GCx37bzE] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Preparing: SELECT grant_type AS grantType, COALESCE(SUM(quota_count - used_count), 0) AS available, COALESCE(SUM(quota_count), 0) AS totalGranted, COALESCE(SUM(used_count), 0) AS totalUsed FROM t_crawler_quota_grant WHERE user_id = ? AND (expire_time IS NULL OR expire_time > NOW()) GROUP BY grant_type
- 15:18:22.055 DEBUG [GCx37bzE] [1] [ main] .u.m.C.sumAvailableQuotaByType : ==> Parameters: 1(Long)
- 15:18:22.057 DEBUG [GCx37bzE] [1] [ main] .u.m.C.sumAvailableQuotaByType : <== Total: 0
- 15:18:22.058 DEBUG [GCx37bzE] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 200 22ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.otEd4zTwmcm8W3ofGVOZCKCf-ptkWmG_Zu2VXf2ITC_iauEbeYvLuVAa1S_coRsmQi-JItBeYdrYEE5vpGjFhw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerController
- Method = com.xuekairui.user.controller.CrawlerController#getCrawlerStatus(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"GCx37bzE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"levelName":"普通会员","levelCode":"PLUS","todayUsed":0,"todayQuota":10,"todayRemaining":10,"monthUsed":0,"monthQuota":300,"monthRemaining":300,"yearUsed":0,"yearQuota":3650,"yearRemaining":3650,"baseDailyQuota":10,"baseMonthlyQuota":300,"baseYearlyQuota":3650,"extraQuota":0,"extraQuotaBreakdown":[{"sourceType":"PURCHASE","sourceName":"购买会员","available":0,"total":0,"used":0},{"sourceType":"ADMIN","sourceName":"运营发放","available":0,"total":0,"used":0},{"sourceType":"INVITE","sourceName":"邀请奖励","available":0,"total":0,"used":0}],"maxConcurrent":1,"hasCoupon":false,"availableCouponCount":0},"timestamp":1782976702057}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.061 DEBUG [sN2Tcj77] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:18:22.062 WARN [sN2Tcj77] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = [Authorization:"Bearer "]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"sN2Tcj77", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702061}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.068 DEBUG [9FXN98PV] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:18:22.068 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:22.068 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:22.070 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:22.071 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:22.071 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:22.073 DEBUG [9FXN98PV] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:22.073 DEBUG [9FXN98PV] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.otEd4zTwmcm8W3ofGVOZCKCf-ptkWmG_Zu2VXf2ITC_iauEbeYvLuVAa1S_coRsmQi-JItBeYdrYEE5vpGjFhw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"9FXN98PV", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":1,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976702073}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.080 DEBUG [Ksfvcegr] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:18:22.080 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:22.081 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:22.082 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:22.083 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:22.083 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:22.085 DEBUG [Ksfvcegr] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:22.085 DEBUG [Ksfvcegr] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.otEd4zTwmcm8W3ofGVOZCKCf-ptkWmG_Zu2VXf2ITC_iauEbeYvLuVAa1S_coRsmQi-JItBeYdrYEE5vpGjFhw"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Ksfvcegr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":1,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976702085}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.086 DEBUG [rqWqCjn4] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:18:22.086 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:22.086 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2(Long)
- 15:18:22.088 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:22.089 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:22.089 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2(Long)
- 15:18:22.091 DEBUG [rqWqCjn4] [2] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:22.091 DEBUG [rqWqCjn4] [2] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjIsInN1YiI6IjIiLCJpYXQiOjE3ODI5NzY3MDIsImV4cCI6MTc4MzA2MzEwMn0.PqJ0dJSGW5Ai-c-kR3wxbkt_xScrad6gi8mIkk3vMnAS9L669ed-JpFPKCRL4tEhZnmgykMxpD6qfSgjmmW6QQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"rqWqCjn4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":2,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976702091}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.071 s -- in Token 有效性验证
- [INFO] Running 受保护接口 - 管理级(需要 Token)
- 15:18:22.094 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$AdminEndpoints]: AdminEndpoints does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:22.095 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$AdminEndpoints
- 15:18:22.099 DEBUG [bAc8fbXh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 | IP: 127.0.0.1
- 15:18:22.100 WARN [bAc8fbXh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/target/USER/1 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/target/USER/1
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"bAc8fbXh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702099}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.103 DEBUG [sKhaVzeB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards | IP: 127.0.0.1
- 15:18:22.105 WARN [sKhaVzeB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/rewards 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/rewards
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"sKhaVzeB", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702103}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.109 DEBUG [AqLf4ed9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config | IP: 127.0.0.1
- 15:18:22.112 WARN [AqLf4ed9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/invite/config 401 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/invite/config
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"AqLf4ed9", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702111}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.116 DEBUG [tttxAy5f] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config | IP: 127.0.0.1
- 15:18:22.117 WARN [tttxAy5f] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config 401 1ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/trial-quota/config
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"tttxAy5f", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702116}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.120 DEBUG [bjZNAQuC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive | IP: 127.0.0.1
- 15:18:22.123 WARN [bjZNAQuC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/sensitive 401 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/sensitive
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"bjZNAQuC", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702122}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.127 DEBUG [WRFDHW7k] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 | IP: 127.0.0.1
- 15:18:22.128 WARN [WRFDHW7k] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 401 1ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/trial-quota/config/1
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"WRFDHW7k", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702128}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.133 DEBUG [vvFaU4En] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant | IP: 127.0.0.1
- 15:18:22.135 WARN [vvFaU4En] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/membership/grant 401 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/membership/grant
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"26"]
- Body = {"userId":1,"level":"PRO"}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"vvFaU4En", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702135}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.145 DEBUG [6XSb5Ysh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log | IP: 127.0.0.1
- 15:18:22.146 WARN [6XSb5Ysh] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"6XSb5Ysh", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702145}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.149 DEBUG [7bjWpegn] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/1 | IP: 127.0.0.1
- 15:18:22.150 WARN [7bjWpegn] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/1 401 1ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/admin/trial-quota/config/1
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"7bjWpegn", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702150}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.156 DEBUG [DLyfQv44] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER | IP: 127.0.0.1
- 15:18:22.158 WARN [DLyfQv44] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/stats?module=USER 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/stats
- Parameters = {module=[USER]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"DLyfQv44", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702156}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.162 DEBUG [FemZNLr8] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config | IP: 127.0.0.1
- 15:18:22.163 WARN [FemZNLr8] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/invite/config 401 1ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/invite/config
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"FemZNLr8", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702162}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.167 DEBUG [ZQADbf4z] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs | IP: 127.0.0.1
- 15:18:22.168 WARN [ZQADbf4z] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/trial-quota/configs
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"ZQADbf4z", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702168}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.173 DEBUG [URagQ4gu] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant | IP: 127.0.0.1
- 15:18:22.175 WARN [URagQ4gu] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/crawler/grant 401 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/crawler/grant
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"28"]
- Body = {"userId":1,"quotaCount":50}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"URagQ4gu", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702175}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.178 DEBUG [RKZLWJHx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review | IP: 127.0.0.1
- 15:18:22.179 WARN [RKZLWJHx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/license/review 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"RKZLWJHx", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702178}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.184 DEBUG [rs6KyMYP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review | IP: 127.0.0.1
- 15:18:22.184 WARN [rs6KyMYP] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/license/review 401 1ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/license/review
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"rs6KyMYP", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702184}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.188 DEBUG [FLf59b87] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants | IP: 127.0.0.1
- 15:18:22.191 WARN [FLf59b87] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/crawler/grants 401 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/crawler/grants
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"FLf59b87", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702190}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.194 DEBUG [YC9n6sUJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 | IP: 127.0.0.1
- 15:18:22.195 WARN [YC9n6sUJ] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/audit-log/user/1 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/audit-log/user/1
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"YC9n6sUJ", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702195}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 17, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.104 s -- in 受保护接口 - 管理级(需要 Token)
- [INFO] Running 受保护接口 - 用户级(需要 Token)
- 15:18:22.200 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$ProtectedEndpoints]: ProtectedEndpoints does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:22.201 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$ProtectedEndpoints
- 15:18:22.204 DEBUG [VcW5nc3e] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats | IP: 127.0.0.1
- 15:18:22.206 WARN [VcW5nc3e] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/stats 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/stats
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"VcW5nc3e", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702205}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.209 DEBUG [FuVNBWyS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my | IP: 127.0.0.1
- 15:18:22.210 WARN [FuVNBWyS] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"FuVNBWyS", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702210}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.214 DEBUG [pF7ZfcHR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available | IP: 127.0.0.1
- 15:18:22.214 WARN [pF7ZfcHR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/coupon/my/available 401 0ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/coupon/my/available
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"pF7ZfcHR", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702214}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.218 DEBUG [TuvY4VCX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue | IP: 127.0.0.1
- 15:18:22.219 WARN [TuvY4VCX] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/coupon/issue 401 1ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/coupon/issue
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"TuvY4VCX", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702219}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.223 DEBUG [2V9ZyeJd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards | IP: 127.0.0.1
- 15:18:22.225 WARN [2V9ZyeJd] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/rewards 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/rewards
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"2V9ZyeJd", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702224}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.227 DEBUG [6VGLgJAE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:18:22.229 WARN [6VGLgJAE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"6VGLgJAE", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702229}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.233 DEBUG [SCN6sphB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs | IP: 127.0.0.1
- 15:18:22.234 WARN [SCN6sphB] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/logs 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/logs
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"SCN6sphB", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702234}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.240 DEBUG [aKghyWCx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota | IP: 127.0.0.1
- 15:18:22.241 WARN [aKghyWCx] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/extra-quota 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/extra-quota
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"aKghyWCx", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702241}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.246 DEBUG [cyxkyjeT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status | IP: 127.0.0.1
- 15:18:22.247 WARN [cyxkyjeT] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/crawler/status 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/crawler/status
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"cyxkyjeT", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702247}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.252 DEBUG [5G7LW2ba] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
- 15:18:22.254 WARN [5G7LW2ba] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"5G7LW2ba", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702253}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.257 DEBUG [ZHqrNU5r] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume | IP: 127.0.0.1
- 15:18:22.258 WARN [ZHqrNU5r] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/crawler/consume 401 1ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/crawler/consume
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"11"]
- Body = {"count":1}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"ZHqrNU5r", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702258}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.261 DEBUG [pWLpbD2j] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
- 15:18:22.264 WARN [pWLpbD2j] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 401 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/code
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"pWLpbD2j", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976702263}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.069 s -- in 受保护接口 - 用户级(需要 Token)
- [INFO] Running 公开接口(无需 Token)
- 15:18:22.268 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.SecurityAccessTest$PublicEndpoints]: PublicEndpoints does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:22.269 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.SecurityAccessTest$PublicEndpoints
- 15:18:22.274 DEBUG [PvLYB9bg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels | IP: 127.0.0.1
- 15:18:22.275 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:22.275 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:22.279 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:22.280 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:22.280 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PRO(String), 1(Integer)
- 15:18:22.282 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:22.283 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:22.283 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : ==> Parameters: ULTRA(String), 1(Integer)
- 15:18:22.284 DEBUG [PvLYB9bg] [] [ main] c.x.u.m.M.selectList : <== Total: 4
- 15:18:22.285 DEBUG [PvLYB9bg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels 200 11ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#listLevels()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"PvLYB9bg", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},{"id":2,"levelName":"高级会员","levelCode":"PRO","levelWeight":2,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":5,"description":"高级会员:每日不限量","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"MONTHLY_PRO","planName":"高级会员·月卡","price":29.90,"originalPrice":59.90,"durationDays":30,"description":"每天不限量· 1个月29.9"},{"planCode":"YEARLY_PRO","planName":"高级会员·年卡","price":299.90,"originalPrice":599.90,"durationDays":365,"description":"每天不限量· 1年299.9"}]},{"id":3,"levelName":"超级会员","levelCode":"ULTRA","levelWeight":3,"crawlerQuota":999,"monthlyQuota":29970,"yearlyQuota":364635,"maxConcurrent":10,"description":"超级会员:连锁专用","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[{"planCode":"ULTRA","planName":"超级会员·连锁专享","price":0,"originalPrice":null,"durationDays":0,"description":"连锁专用,多店铺管理,敬请期待"}]}],"timestamp":1782976702284}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.288 DEBUG [K9PV6abE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled | IP: 127.0.0.1
- 15:18:22.289 DEBUG [K9PV6abE] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Preparing: SELECT * FROM t_platform_config WHERE enabled = true ORDER BY priority ASC
- 15:18:22.289 DEBUG [K9PV6abE] [] [ main] x.u.m.P.selectEnabledPlatforms : ==> Parameters:
- 15:18:22.291 DEBUG [K9PV6abE] [] [ main] x.u.m.P.selectEnabledPlatforms : <== Total: 3
- 15:18:22.291 DEBUG [K9PV6abE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/platform-config/enabled 200 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/platform-config/enabled
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.CrawlerPlatformConfigController
- Method = com.xuekairui.user.controller.CrawlerPlatformConfigController#getEnabledPlatforms()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"K9PV6abE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":1,"platformCode":"yaoshibang","platformName":"药师帮","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":1,"underMaintenance":false,"maintenanceNotice":null,"description":"国内最大B2B医药批发平台","officialUrl":"https://www.yaoshibang.com","bindingInstructions":"请输入您在药师帮的手机号和密码","sortOrder":1,"createTime":"2026-07-02 15:18:21","updateTime":"2026-07-02 15:18:21","createdBy":null,"updatedBy":null},{"id":2,"platformCode":"yaobangmang","platformName":"药帮忙","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":2,"underMaintenance":false,"maintenanceNotice":null,"description":"专业医药B2B采购平台","officialUrl":"https://www.yaobangmang.com","bindingInstructions":"请输入您在药帮忙的手机号和密码","sortOrder":2,"createTime":"2026-07-02 15:18:21","updateTime":"2026-07-02 15:18:21","createdBy":null,"updatedBy":null},{"id":3,"platformCode":"yiyaocheng","platformName":"1药城","enabled":true,"requiresRecharge":false,"queryCost":1,"priority":3,"underMaintenance":false,"maintenanceNotice":null,"description":"1药网旗下B2B医药平台","officialUrl":"https://www.1yaocheng.com","bindingInstructions":"请输入您在1药城的手机号和密码","sortOrder":3,"createTime":"2026-07-02 15:18:21","updateTime":"2026-07-02 15:18:21","createdBy":null,"updatedBy":null}],"timestamp":1782976702291}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.295 DEBUG [r3CEZq9Y] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/callback | IP: 127.0.0.1
- 15:18:22.296 DEBUG [r3CEZq9Y] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/callback 200 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/wechat/callback
- Parameters = {code=[test], state=[login]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#wechatCallback(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"r3CEZq9Y", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":"https://your-domain.com/wechat-login?code=test","timestamp":1782976702295}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.299 DEBUG [H7pYmavA] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:18:22.300 INFO [H7pYmavA] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
- 15:18:22.302 INFO [H7pYmavA] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
- 15:18:22.302 DEBUG [H7pYmavA] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 200 3ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","scene":"login"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"H7pYmavA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976702302}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.306 DEBUG [EMRz69yu] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=app | IP: 127.0.0.1
- 15:18:22.307 DEBUG [EMRz69yu] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:22.308 DEBUG [EMRz69yu] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
- 15:18:22.310 DEBUG [EMRz69yu] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:22.310 WARN [EMRz69yu] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
- 15:18:22.311 DEBUG [EMRz69yu] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE?channel=app 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/page/TESTCODE
- Parameters = {channel=[app]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"EMRz69yu", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976702310}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.314 DEBUG [mqqSGJAs] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/1 | IP: 127.0.0.1
- 15:18:22.316 DEBUG [mqqSGJAs] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:22.316 DEBUG [mqqSGJAs] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:22.317 DEBUG [mqqSGJAs] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:22.318 DEBUG [mqqSGJAs] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/levels/1 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/levels/1
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getLevel(Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"mqqSGJAs", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":null,"pricingPlans":[]},"timestamp":1782976702317}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.321 DEBUG [SQqvBCTz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE | IP: 127.0.0.1
- 15:18:22.322 DEBUG [SQqvBCTz] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:22.322 DEBUG [SQqvBCTz] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
- 15:18:22.324 DEBUG [SQqvBCTz] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:22.325 DEBUG [SQqvBCTz] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/invite/click/TESTCODE 200 4ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/invite/click/TESTCODE
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#trackClick(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"SQqvBCTz", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976702324}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.328 DEBUG [A4KPtyJt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url | IP: 127.0.0.1
- 15:18:22.329 DEBUG [A4KPtyJt] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url 200 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/wechat/url
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"A4KPtyJt", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=login#wechat_redirect","timestamp":1782976702329}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.332 DEBUG [yECnyMJ9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE | IP: 127.0.0.1
- 15:18:22.333 DEBUG [yECnyMJ9] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:22.333 DEBUG [yECnyMJ9] [] [ main] c.x.i.m.I.selectList : ==> Parameters: TESTCODE(String)
- 15:18:22.335 DEBUG [yECnyMJ9] [] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:22.336 WARN [yECnyMJ9] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=3001, message=邀请码无效
- 15:18:22.336 DEBUG [yECnyMJ9] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/page/TESTCODE 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/page/TESTCODE
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getInvitePage(String, String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"yECnyMJ9", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":3001,"message":"邀请码无效","data":null,"timestamp":1782976702336}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.340 DEBUG [dKzbx7V2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:22.343 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:22.343 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:22.345 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:22.345 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:18:22.345 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:22.345307300(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:21(LocalDateTime), 2026-07-02T15:18:21(LocalDateTime), 1(Long)
- 15:18:22.347 DEBUG [dKzbx7V2] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:22.348 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:22.348 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:22.345307300(LocalDateTime), 127.0.0.1(String), 1(Long), 584cdce62be1097a7c5569ad85c2e42658c81ae83065c98f423e03a30b5efcca(String), ACTIVE(String), 2026-07-02T15:18:21(LocalDateTime), 2026-07-02T15:18:21(LocalDateTime), 1(Long)
- 15:18:22.351 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:22.351 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:22.351 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:22.352 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:22.352 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:22.352 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:22.353 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:22.353 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:22.354 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:22.355 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:22.356 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:22.356 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580625049526274(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:22.356167800(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:22.356167800(LocalDateTime)
- 15:18:22.359 DEBUG [dKzbx7V2] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:22.359 DEBUG [dKzbx7V2] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:22.429 DEBUG [dKzbx7V2] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 89ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","code":"123456"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"dKzbx7V2", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwMiwiZXhwIjoxNzgzMDYzMTAyfQ.YPwWBl4z33iNxLMPtxdqqSIu-B1MjUmjFC4ycglbpWlZVLP8ccTAV7oP7DCaA6pGkGZIh5R2PavrAKhDGEdaZA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwMiwiZXhwIjoxNzgzNTgxNTAyfQ.EGhjQrMi4Xl2n_1yU1w6aQqkHvmTvTlgS6zX7GnQVA1GCp9Bbr06N8Gu7qbsywlD8R6-jKnsS9kyA43dcqNO7Q","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:21","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976702427}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:22.433 DEBUG [FCtDnWGc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active | IP: 127.0.0.1
- 15:18:22.434 DEBUG [FCtDnWGc] [] [ main] .m.T.selectActiveDefaultConfig : ==> Preparing: SELECT * FROM t_trial_quota_config WHERE config_type = 'DEFAULT' AND enabled = true AND (effective_from IS NULL OR effective_from <= ?) AND (effective_to IS NULL OR effective_to >= ?) ORDER BY create_time DESC LIMIT 1
- 15:18:22.434 DEBUG [FCtDnWGc] [] [ main] .m.T.selectActiveDefaultConfig : ==> Parameters: 2026-07-02T15:18:22.434347300(LocalDateTime), 2026-07-02T15:18:22.434347300(LocalDateTime)
- 15:18:22.437 DEBUG [FCtDnWGc] [] [ main] .m.T.selectActiveDefaultConfig : <== Total: 0
- 15:18:22.437 WARN [FCtDnWGc] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=无生效中的体验配额配置
- 15:18:22.438 DEBUG [FCtDnWGc] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/trial-quota/active
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.TrialQuotaConfigController
- Method = com.xuekairui.user.controller.TrialQuotaConfigController#getActiveConfig()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"FCtDnWGc", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":404,"message":"无生效中的体验配额配置","data":null,"timestamp":1782976702438}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.174 s -- in 公开接口(无需 Token)
- [INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.392 s -- in 安全访问控制测试
- [INFO] Running 体验配额配置接口测试
- 15:18:22.442 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.TrialQuotaConfigTest]: TrialQuotaConfigTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:22.443 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.TrialQuotaConfigTest
- 15:18:25.826 DEBUG [NH6vSrDf] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active | IP: 127.0.0.1
- 15:18:25.827 DEBUG [NH6vSrDf] [] [ main] .m.T.selectActiveDefaultConfig : ==> Preparing: SELECT * FROM t_trial_quota_config WHERE config_type = 'DEFAULT' AND enabled = true AND (effective_from IS NULL OR effective_from <= ?) AND (effective_to IS NULL OR effective_to >= ?) ORDER BY create_time DESC LIMIT 1
- 15:18:25.827 DEBUG [NH6vSrDf] [] [ main] .m.T.selectActiveDefaultConfig : ==> Parameters: 2026-07-02T15:18:25.827477100(LocalDateTime), 2026-07-02T15:18:25.827477100(LocalDateTime)
- 15:18:25.830 DEBUG [NH6vSrDf] [] [ main] .m.T.selectActiveDefaultConfig : <== Total: 0
- 15:18:25.830 WARN [NH6vSrDf] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=无生效中的体验配额配置
- 15:18:25.830 DEBUG [NH6vSrDf] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/trial-quota/active
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.TrialQuotaConfigController
- Method = com.xuekairui.user.controller.TrialQuotaConfigController#getActiveConfig()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"NH6vSrDf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":404,"message":"无生效中的体验配额配置","data":null,"timestamp":1782976705830}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.835 DEBUG [pVKhsG8F] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs | IP: 127.0.0.1
- 15:18:25.836 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:25.836 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:25.838 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:25.839 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.T.selectList : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config ORDER BY create_time DESC
- 15:18:25.839 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.T.selectList : ==> Parameters:
- 15:18:25.840 DEBUG [pVKhsG8F] [1] [ main] c.x.u.m.T.selectList : <== Total: 0
- 15:18:25.841 DEBUG [pVKhsG8F] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs 200 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/trial-quota/configs
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
- Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#listConfigs()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"pVKhsG8F", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976705841}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.843 DEBUG [c9kaQqFg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs | IP: 127.0.0.1
- 15:18:25.845 WARN [c9kaQqFg] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/admin/trial-quota/configs 401 2ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/admin/trial-quota/configs
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"c9kaQqFg", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976705844}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.849 DEBUG [nLYVV8M6] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config | IP: 127.0.0.1
- 15:18:25.850 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:25.850 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:25.851 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:25.855 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.T.insert : ==> Preparing: INSERT INTO t_trial_quota_config ( config_name, trial_days, daily_query_limit, monthly_watchlist_limit, enabled, config_type, applicable_user_type, current_users, priority, description, created_by, updated_by, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:25.855 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.T.insert : ==> Parameters: 测试体验配置(String), 15(Integer), 30(Integer), 200(Integer), true(Boolean), DEFAULT(String), NEW_USER(String), 0(Integer), 1(Integer), 自动化测试创建的配置(String), 1(Long), 1(Long), 2026-07-02T15:18:25.855010600(LocalDateTime), 2026-07-02T15:18:25.855010600(LocalDateTime)
- 15:18:25.859 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.T.insert : <== Updates: 1
- 15:18:25.859 INFO [nLYVV8M6] [1] [ main] .x.u.s.TrialQuotaConfigService : 创建体验配额配置: id=1, name=测试体验配置
- 15:18:25.860 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:25.860 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580639700230145(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.860387500(LocalDateTime), TRIAL(String), CONFIG_CREATE(String), 创建体验配额配置(String), TRIAL_CONFIG(String), 1(Long), TRIAL_CONFIG:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.860387500(LocalDateTime)
- 15:18:25.865 DEBUG [nLYVV8M6] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:25.865 WARN [nLYVV8M6] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】创建体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:1, 结果: SUCCESS
- 15:18:25.865 DEBUG [nLYVV8M6] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 创建体验配额配置
- 15:18:25.866 DEBUG [nLYVV8M6] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config 200 17ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/trial-quota/config
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"285"]
- Body = {
- "configName": "测试体验配置",
- "trialDays": 15,
- "dailyQueryLimit": 30,
- "monthlyWatchlistLimit": 200,
- "enabled": true,
- "configType": "DEFAULT",
- "applicableUserType": "NEW_USER",
- "priority": 1,
- "description": "自动化测试创建的配置"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
- Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#createConfig(TrialQuotaConfig, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"nLYVV8M6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"configName":"测试体验配置","trialDays":15,"dailyQueryLimit":30,"monthlyWatchlistLimit":200,"enabled":true,"configType":"DEFAULT","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":1,"description":"自动化测试创建的配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:25","updateTime":"2026-07-02 15:18:25"},"timestamp":1782976705865}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.872 DEBUG [AfZFST97] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config | IP: 127.0.0.1
- 15:18:25.872 DEBUG [AfZFST97] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:25.872 DEBUG [AfZFST97] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:25.874 DEBUG [AfZFST97] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:25.875 DEBUG [AfZFST97] [1] [ main] c.x.u.m.T.insert : ==> Preparing: INSERT INTO t_trial_quota_config ( config_name, trial_days, daily_query_limit, monthly_watchlist_limit, enabled, config_type, applicable_user_type, max_users, current_users, priority, description, created_by, updated_by, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:25.875 DEBUG [AfZFST97] [1] [ main] c.x.u.m.T.insert : ==> Parameters: 618活动体验配置(String), 30(Integer), 50(Integer), 500(Integer), true(Boolean), ACTIVITY(String), ALL(String), 1000(Integer), 0(Integer), 10(Integer), 618活动专属体验配置(String), 1(Long), 1(Long), 2026-07-02T15:18:25.875418800(LocalDateTime), 2026-07-02T15:18:25.875418800(LocalDateTime)
- 15:18:25.880 DEBUG [AfZFST97] [1] [ main] c.x.u.m.T.insert : <== Updates: 1
- 15:18:25.880 INFO [AfZFST97] [1] [ main] .x.u.s.TrialQuotaConfigService : 创建体验配额配置: id=2, name=618活动体验配置
- 15:18:25.881 DEBUG [AfZFST97] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:25.881 DEBUG [AfZFST97] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580639830253570(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.880758500(LocalDateTime), TRIAL(String), CONFIG_CREATE(String), 创建体验配额配置(String), TRIAL_CONFIG(String), 2(Long), TRIAL_CONFIG:2(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.881291700(LocalDateTime)
- 15:18:25.885 DEBUG [AfZFST97] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:25.885 WARN [AfZFST97] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】创建体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:2, 结果: SUCCESS
- 15:18:25.885 DEBUG [AfZFST97] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 创建体验配额配置
- 15:18:25.886 DEBUG [AfZFST97] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config 200 14ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/trial-quota/config
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"304"]
- Body = {
- "configName": "618活动体验配置",
- "trialDays": 30,
- "dailyQueryLimit": 50,
- "monthlyWatchlistLimit": 500,
- "enabled": true,
- "configType": "ACTIVITY",
- "applicableUserType": "ALL",
- "priority": 10,
- "maxUsers": 1000,
- "description": "618活动专属体验配置"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
- Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#createConfig(TrialQuotaConfig, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"AfZFST97", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":2,"configName":"618活动体验配置","trialDays":30,"dailyQueryLimit":50,"monthlyWatchlistLimit":500,"enabled":true,"configType":"ACTIVITY","applicableUserType":"ALL","effectiveFrom":null,"effectiveTo":null,"maxUsers":1000,"currentUsers":0,"priority":10,"description":"618活动专属体验配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:25","updateTime":"2026-07-02 15:18:25"},"timestamp":1782976705885}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.889 DEBUG [gVbCASGV] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config | IP: 127.0.0.1
- 15:18:25.891 WARN [gVbCASGV] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config 401 2ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/trial-quota/config
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"gVbCASGV", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976705890}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.896 DEBUG [wnRyUL9v] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 | IP: 127.0.0.1
- 15:18:25.897 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:25.897 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:25.898 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:25.900 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
- 15:18:25.900 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : ==> Parameters: 1(Long)
- 15:18:25.902 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : <== Total: 1
- 15:18:25.904 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.updateById : ==> Preparing: UPDATE t_trial_quota_config SET config_name=?, trial_days=?, daily_query_limit=?, monthly_watchlist_limit=?, enabled=?, config_type=?, applicable_user_type=?, priority=?, description=?, updated_by=?, update_time=? WHERE id=?
- 15:18:25.904 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.updateById : ==> Parameters: 测试体验配置(已更新)(String), 20(Integer), 40(Integer), 300(Integer), true(Boolean), DEFAULT(String), NEW_USER(String), 2(Integer), 更新后的配置(String), 1(Long), 2026-07-02T15:18:25.904166600(LocalDateTime), 1(Long)
- 15:18:25.908 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.updateById : <== Updates: 1
- 15:18:25.908 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
- 15:18:25.908 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : ==> Parameters: 1(Long)
- 15:18:25.910 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.T.selectById : <== Total: 1
- 15:18:25.911 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:25.911 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580639960276993(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.911296700(LocalDateTime), TRIAL(String), CONFIG_UPDATE(String), 更新体验配额配置(String), TRIAL_CONFIG(String), 1(Long), TRIAL_CONFIG:1(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.911296700(LocalDateTime)
- 15:18:25.916 DEBUG [wnRyUL9v] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:25.916 WARN [wnRyUL9v] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】更新体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:1, 结果: SUCCESS
- 15:18:25.916 DEBUG [wnRyUL9v] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 更新体验配额配置
- 15:18:25.916 DEBUG [wnRyUL9v] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 200 20ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/trial-quota/config/1
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"288"]
- Body = {
- "configName": "测试体验配置(已更新)",
- "trialDays": 20,
- "dailyQueryLimit": 40,
- "monthlyWatchlistLimit": 300,
- "enabled": true,
- "configType": "DEFAULT",
- "applicableUserType": "NEW_USER",
- "priority": 2,
- "description": "更新后的配置"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
- Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#updateConfig(Long, TrialQuotaConfig, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"wnRyUL9v", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"configName":"测试体验配置(已更新)","trialDays":20,"dailyQueryLimit":40,"monthlyWatchlistLimit":300,"enabled":true,"configType":"DEFAULT","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":2,"description":"更新后的配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:26","updateTime":"2026-07-02 15:18:26"},"timestamp":1782976705916}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.922 DEBUG [CtA77fKC] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/9999 | IP: 127.0.0.1
- 15:18:25.922 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:25.923 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:25.924 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:25.925 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.T.selectById : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
- 15:18:25.925 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.T.selectById : ==> Parameters: 9999(Long)
- 15:18:25.927 DEBUG [CtA77fKC] [1] [ main] c.x.u.m.T.selectById : <== Total: 0
- 15:18:25.928 WARN [CtA77fKC] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=体验配额配置不存在
- 15:18:25.928 DEBUG [CtA77fKC] [1] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/9999 200 6ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/trial-quota/config/9999
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"213"]
- Body = {
- "configName": "不存在的配置",
- "trialDays": 15,
- "dailyQueryLimit": 20,
- "monthlyWatchlistLimit": 100,
- "enabled": true,
- "configType": "DEFAULT",
- "applicableUserType": "NEW_USER"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
- Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#updateConfig(Long, TrialQuotaConfig, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"CtA77fKC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":404,"message":"体验配额配置不存在","data":null,"timestamp":1782976705928}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.931 DEBUG [JPUPEeF4] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 | IP: 127.0.0.1
- 15:18:25.933 WARN [JPUPEeF4] [] [ main] c.x.g.f.RequestLoggingFilter : PUT /api/admin/trial-quota/config/1 401 2ms
- MockHttpServletRequest:
- HTTP Method = PUT
- Request URI = /api/admin/trial-quota/config/1
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"2"]
- Body = {}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"JPUPEeF4", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976705933}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.938 DEBUG [S2Qx5MXr] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config | IP: 127.0.0.1
- 15:18:25.938 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:25.938 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:25.941 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:25.942 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.T.insert : ==> Preparing: INSERT INTO t_trial_quota_config ( config_name, trial_days, daily_query_limit, monthly_watchlist_limit, enabled, config_type, applicable_user_type, current_users, priority, description, created_by, updated_by, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:25.942 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.T.insert : ==> Parameters: 待删除配置(String), 7(Integer), 10(Integer), 50(Integer), true(Boolean), COUPON(String), NEW_USER(String), 0(Integer), 99(Integer), 此配置将被删除(String), 1(Long), 1(Long), 2026-07-02T15:18:25.942390800(LocalDateTime), 2026-07-02T15:18:25.942390800(LocalDateTime)
- 15:18:25.948 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.T.insert : <== Updates: 1
- 15:18:25.948 INFO [S2Qx5MXr] [1] [ main] .x.u.s.TrialQuotaConfigService : 创建体验配额配置: id=3, name=待删除配置
- 15:18:25.948 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:25.949 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580640090300417(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.948758600(LocalDateTime), TRIAL(String), CONFIG_CREATE(String), 创建体验配额配置(String), TRIAL_CONFIG(String), 3(Long), TRIAL_CONFIG:3(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.948758600(LocalDateTime)
- 15:18:25.954 DEBUG [S2Qx5MXr] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:25.954 WARN [S2Qx5MXr] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】创建体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:3, 结果: SUCCESS
- 15:18:25.954 DEBUG [S2Qx5MXr] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 创建体验配额配置
- 15:18:25.955 DEBUG [S2Qx5MXr] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/admin/trial-quota/config 200 17ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/admin/trial-quota/config
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA", Content-Length:"271"]
- Body = {
- "configName": "待删除配置",
- "trialDays": 7,
- "dailyQueryLimit": 10,
- "monthlyWatchlistLimit": 50,
- "enabled": true,
- "configType": "COUPON",
- "applicableUserType": "NEW_USER",
- "priority": 99,
- "description": "此配置将被删除"
- }
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
- Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#createConfig(TrialQuotaConfig, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"S2Qx5MXr", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":3,"configName":"待删除配置","trialDays":7,"dailyQueryLimit":10,"monthlyWatchlistLimit":50,"enabled":true,"configType":"COUPON","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":99,"description":"此配置将被删除","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:25","updateTime":"2026-07-02 15:18:25"},"timestamp":1782976705954}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.958 DEBUG [24mTnQRn] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/3 | IP: 127.0.0.1
- 15:18:25.959 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.selectById : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
- 15:18:25.959 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.selectById : ==> Parameters: 3(Long)
- 15:18:25.960 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.selectById : <== Total: 1
- 15:18:25.961 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.deleteById : ==> Preparing: DELETE FROM t_trial_quota_config WHERE id=?
- 15:18:25.961 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.deleteById : ==> Parameters: 3(Long)
- 15:18:25.966 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.T.deleteById : <== Updates: 1
- 15:18:25.966 INFO [24mTnQRn] [1] [ main] .x.u.s.TrialQuotaConfigService : 删除体验配额配置: id=3
- 15:18:25.967 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:25.967 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580640153214977(Long), 1(Long), 管理员(String), ADMIN(String), 2026-07-02T15:18:25.966552800(LocalDateTime), TRIAL(String), CONFIG_DELETE(String), 删除体验配额配置(String), TRIAL_CONFIG(String), 3(Long), TRIAL_CONFIG:3(String), SUCCESS(String), true(Boolean), 2026-07-02T15:18:25.967078100(LocalDateTime)
- 15:18:25.972 DEBUG [24mTnQRn] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:25.972 WARN [24mTnQRn] [1] [ main] x.u.s.OperationAuditLogService : 【敏感操作】删除体验配额配置 - 操作人: 管理员(1), 目标: TRIAL_CONFIG:3, 结果: SUCCESS
- 15:18:25.972 DEBUG [24mTnQRn] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 删除体验配额配置
- 15:18:25.973 DEBUG [24mTnQRn] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/3 200 15ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/admin/trial-quota/config/3
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
- Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#deleteConfig(Long, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"24mTnQRn", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976705972}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.978 DEBUG [Hf8fM7W8] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/9999 | IP: 127.0.0.1
- 15:18:25.979 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:25.979 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:25.981 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:25.982 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.T.selectById : ==> Preparing: SELECT id,config_name,trial_days,daily_query_limit,monthly_watchlist_limit,enabled,config_type,applicable_user_type,effective_from,effective_to,max_users,current_users,priority,description,remark,created_by,updated_by,create_time,update_time FROM t_trial_quota_config WHERE id=?
- 15:18:25.982 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.T.selectById : ==> Parameters: 9999(Long)
- 15:18:25.984 DEBUG [Hf8fM7W8] [1] [ main] c.x.u.m.T.selectById : <== Total: 0
- 15:18:25.984 WARN [Hf8fM7W8] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=404, message=体验配额配置不存在
- 15:18:25.985 DEBUG [Hf8fM7W8] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/9999 200 7ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/admin/trial-quota/config/9999
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MDUsImV4cCI6MTc4MzA2MzEwNX0.zY50BSLz5XoY_5lW9_CoZWUePT5su3JgG0Jz2YxugTOX2pH3vSAQuXHWXY74FO9EbOtTtsfA-5tmaIKzXcOewA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AdminTrialQuotaConfigController
- Method = com.xuekairui.user.controller.AdminTrialQuotaConfigController#deleteConfig(Long, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Hf8fM7W8", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":404,"message":"体验配额配置不存在","data":null,"timestamp":1782976705984}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.989 DEBUG [SXHR5LJV] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/1 | IP: 127.0.0.1
- 15:18:25.991 WARN [SXHR5LJV] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/admin/trial-quota/config/1 401 2ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/admin/trial-quota/config/1
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"SXHR5LJV", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976705990}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:25.995 DEBUG [Yg7eMtMC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active | IP: 127.0.0.1
- 15:18:25.996 DEBUG [Yg7eMtMC] [] [ main] .m.T.selectActiveDefaultConfig : ==> Preparing: SELECT * FROM t_trial_quota_config WHERE config_type = 'DEFAULT' AND enabled = true AND (effective_from IS NULL OR effective_from <= ?) AND (effective_to IS NULL OR effective_to >= ?) ORDER BY create_time DESC LIMIT 1
- 15:18:25.996 DEBUG [Yg7eMtMC] [] [ main] .m.T.selectActiveDefaultConfig : ==> Parameters: 2026-07-02T15:18:25.996190900(LocalDateTime), 2026-07-02T15:18:25.996190900(LocalDateTime)
- 15:18:25.998 DEBUG [Yg7eMtMC] [] [ main] .m.T.selectActiveDefaultConfig : <== Total: 1
- 15:18:26.000 DEBUG [Yg7eMtMC] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/trial-quota/active 200 5ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/trial-quota/active
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.TrialQuotaConfigController
- Method = com.xuekairui.user.controller.TrialQuotaConfigController#getActiveConfig()
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Yg7eMtMC", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":1,"configName":"测试体验配置(已更新)","trialDays":20,"dailyQueryLimit":40,"monthlyWatchlistLimit":300,"enabled":true,"configType":"DEFAULT","applicableUserType":"NEW_USER","effectiveFrom":null,"effectiveTo":null,"maxUsers":null,"currentUsers":0,"priority":2,"description":"更新后的配置","remark":null,"createdBy":1,"updatedBy":1,"createTime":"2026-07-02 15:18:26","updateTime":"2026-07-02 15:18:26"},"timestamp":1782976705998}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 13, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.561 s -- in 体验配额配置接口测试
- [INFO] Running com.xuekairui.gateway.UserAuthFlowTest
- 15:18:26.003 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.UserAuthFlowTest]: UserAuthFlowTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:26.005 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.UserAuthFlowTest
- 15:18:28.973 DEBUG [r2cseZzj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send | IP: 127.0.0.1
- 15:18:28.974 INFO [r2cseZzj] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】是否启用 true
- 15:18:28.976 INFO [r2cseZzj] [] [ main] .x.u.s.VerificationCodeService : 【验证码-测试模式】手机号: 138****8000, 验证码: 123456 (固定), 场景: login, 有效期: 5分钟
- 15:18:28.976 DEBUG [r2cseZzj] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/send 200 3ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/send
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"39"]
- Body = {"phone":"13800138000","scene":"login"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#sendCode(SendCodeRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"r2cseZzj", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976708976}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:28.976 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 短信验证码发送成功: 13800138000
- 15:18:28.980 DEBUG [EQY2kT3x] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:28.983 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:28.983 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13811111111(String)
- 15:18:28.984 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
- 15:18:28.985 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.insert : ==> Preparing: INSERT INTO t_user ( id, phone, nickname, login_source, status, role, membership_level, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:28.985 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.insert : ==> Parameters: 2072580652799041537(Long), 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:18:28.985081800(LocalDateTime), 2026-07-02T15:18:28.985081800(LocalDateTime)
- 15:18:28.987 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.insert : <== Updates: 1
- 15:18:28.987 INFO [EQY2kT3x] [] [ main] c.x.i.l.UserRegisteredListener : 收到用户注册事件: userId=2072580652799041537, inviteCode=null
- 15:18:28.987 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:18:28.988 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:28.987821900(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:28.985081800(LocalDateTime), 2026-07-02T15:18:28.985081800(LocalDateTime), 2072580652799041537(Long)
- 15:18:28.990 DEBUG [EQY2kT3x] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:28.991 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:28.991 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:28.987821900(LocalDateTime), 127.0.0.1(String), 1(Long), 0a6a111dbda23505146f843c81df8090eac8c472d0aa37e46affbb8ba2e2db26(String), ACTIVE(String), 2026-07-02T15:18:28.985081800(LocalDateTime), 2026-07-02T15:18:28.985081800(LocalDateTime), 2072580652799041537(Long)
- 15:18:28.994 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:28.994 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:28.994 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
- 15:18:28.995 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:28.995 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:28.995 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
- 15:18:28.997 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:28.998 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:28.998 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:28.999 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:29.000 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:29.000 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580652866150401(Long), 2072580652799041537(Long), 用户1111(String), USER(String), 2026-07-02T15:18:28.999856900(LocalDateTime), USER(String), REGISTER(String), 用户注册(String), USER(String), 2072580652799041537(Long), USER:2072580652799041537(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:28.999856900(LocalDateTime)
- 15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户注册
- 15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:29.003 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580652929064961(Long), 2072580652799041537(Long), 用户1111(String), USER(String), 2026-07-02T15:18:29.003118900(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 2072580652799041537(Long), USER:2072580652799041537(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.003652(LocalDateTime)
- 15:18:29.006 DEBUG [EQY2kT3x] [2072580652799041537] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:29.006 DEBUG [EQY2kT3x] [2072580652799041537] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:29.011 DEBUG [EQY2kT3x] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 31ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"57"]
- Body = {"phone":"13811111111","code":"123456","inviteCode":null}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"EQY2kT3x", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":2072580652799041537,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzMDYzMTA4fQ.v7Rdq2D359acFHjosRrPudpfg8gdG3dQra_WCRKA0yLNwAg4Qqj4IOKsFRuWcPhj2SJZDGKuciAaGrh96jh_9w","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzNTgxNTA4fQ.h9vxbDHAcQtyODFhcmnDTsxfrr1uoeFUnkklPBNpyOypFiEtSd2xQluwbpRkl-X0gQ8NAqC6C3wocVFkuL6Diw","expiresIn":86400,"userInfo":{"id":2072580652799041537,"phone":"138****1111","nickname":"用户1111","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:28","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580652799041537,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":true,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976709009}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.011 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 新用户注册成功: userId=2072580652799041537, accessToken=eyJhbGciOiJIUzUxMiJ9...
- 15:18:29.022 DEBUG [7wrskVtR] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:18:29.023 DEBUG [7wrskVtR] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:29.024 DEBUG [7wrskVtR] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.025 DEBUG [7wrskVtR] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:29.026 DEBUG [7wrskVtR] [2072580652799041537] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoidG1wMjA3MjU4MDY1Mjc5OTA0MTUzNyIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.dy3Ji-99C8mDamSJHXUzr5PekyLkUZHpot47BkmTvPmJKjE9BN3KUPWjnmdkq5Ca5c73-ZBxeYTKPCIDDf2MnQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"7wrskVtR", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":2072580652799041537,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976709025}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.027 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 用户2072580652799041537为普通会员(PLUS),无过期时间,跳过校验
- 15:18:29.030 DEBUG [v3wjy6TE] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
- 15:18:29.031 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:29.031 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.033 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:29.034 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:29.034 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.036 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:29.037 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:29.037 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.038 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:29.038 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:29.038 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.040 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:29.041 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:29.041 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:29.042 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:29.043 DEBUG [v3wjy6TE] [2072580652799041537] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 200 13ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzMDYzMTA4fQ.v7Rdq2D359acFHjosRrPudpfg8gdG3dQra_WCRKA0yLNwAg4Qqj4IOKsFRuWcPhj2SJZDGKuciAaGrh96jh_9w"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#getUserInfo(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"v3wjy6TE", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":2072580652799041537,"phone":"138****1111","nickname":"用户1111","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:29","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580652799041537,"levelCode":"PLUS","version":null},"timestamp":1782976709042}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.043 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 获取用户信息成功
- 15:18:29.046 DEBUG [4PmQaxXq] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh | IP: 127.0.0.1
- 15:18:29.051 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,role,token_version,refresh_token_hash,refresh_token_status,status FROM t_user WHERE (id = ?)
- 15:18:29.051 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.053 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:29.054 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, status=?, role=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, update_time=? WHERE id=?
- 15:18:29.054 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13811111111(String), 1(Integer), USER(String), 1(Long), d17e2310b4458a0c4deca61b2ca4fba8ef855839d61947a962ec620c9acf2105(String), ACTIVE(String), 2026-07-02T15:18:29.054302500(LocalDateTime), 2072580652799041537(Long)
- 15:18:29.055 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:29.055 DEBUG [4PmQaxXq] [] [ main] c.x.user.service.AuthService : 用户 2072580652799041537 Refresh Token 旋转成功
- 15:18:29.057 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:29.057 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.058 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:29.058 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:29.058 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.060 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:29.060 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:29.060 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:29.061 DEBUG [4PmQaxXq] [] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:29.069 DEBUG [4PmQaxXq] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/refresh 200 23ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/refresh
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"273"]
- Body = {"refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzNTgxNTA4fQ.h9vxbDHAcQtyODFhcmnDTsxfrr1uoeFUnkklPBNpyOypFiEtSd2xQluwbpRkl-X0gQ8NAqC6C3wocVFkuL6Diw"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#refreshToken(RefreshTokenRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"4PmQaxXq", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":2072580652799041537,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.4RSruN_bqqKyuW_qQESH0VjgSxBiNipmzPGvCj9pSTVOSPPLdsdFyhj6PdyHGzH6Bq_oCnRlAH0XDKbCvd8RTQ","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzNTgxNTA5fQ.JlsjCap1plTXrGu24CeJOwMtEgqCdkVoanPFiWp3Y8Ung3G9KngDHTb0E7Hc92585-iMiTcIayeK2_rZR67r4A","expiresIn":86400,"userInfo":{"id":2072580652799041537,"phone":"138****1111","nickname":null,"avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":null,"loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580652799041537,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":null,"kickedDeviceInfo":null},"timestamp":1782976709067}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.069 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? Token刷新成功: eyJhbGciOiJIUzUxMiJ9...
- 15:18:29.071 DEBUG [MjCQ8sML] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:29.075 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:29.075 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13800138000(String)
- 15:18:29.077 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 1
- 15:18:29.077 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:18:29.077 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.077377300(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:28(LocalDateTime), 2026-07-02T15:18:28(LocalDateTime), 1(Long)
- 15:18:29.080 DEBUG [MjCQ8sML] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:29.081 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:29.081 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13800138000(String), 测试用户(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.077377300(LocalDateTime), 127.0.0.1(String), 1(Long), 4505a47cd0b7d217f18677b6979a931878a44f585ed6f6f6e0f20b3d21beb495(String), ACTIVE(String), 2026-07-02T15:18:28(LocalDateTime), 2026-07-02T15:18:28(LocalDateTime), 1(Long)
- 15:18:29.084 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:29.084 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:29.084 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:29.086 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:29.086 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:29.086 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:29.087 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:29.088 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:29.088 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:29.089 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:29.091 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:29.091 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580653252026369(Long), 1(Long), 测试用户(String), USER(String), 2026-07-02T15:18:29.090535(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 1(Long), USER:1(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.090535(LocalDateTime)
- 15:18:29.093 DEBUG [MjCQ8sML] [1] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:29.093 DEBUG [MjCQ8sML] [1] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:29.099 DEBUG [MjCQ8sML] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 28ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"57"]
- Body = {"phone":"13800138000","code":"123456","inviteCode":null}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"MjCQ8sML", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":1,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.9UWg603Q7O5F3vLqR5JD5aXPuZHi1GQz-R2BQ_4PldfA8i996hqzvHfqaPOt1ngiWynzRLuw-gehDY85JNzjWA","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MSwic3ViIjoiMSIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzNTgxNTA5fQ.LdHuIl8s135KBuw--e0Pclq9uVxiN4vmJnagvtpky-miHQ1H9KBF6vD7D1lgz0oxKTNroFdkUrVlHDsFtzniYg","expiresIn":86400,"userInfo":{"id":1,"phone":"138****8000","nickname":"测试用户","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:28","loginSource":"UNKNOWN","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":1,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":false,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976709098}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.099 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 老用户登录成功
- 15:18:29.102 DEBUG [SFy6sNEH] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code | IP: 127.0.0.1
- 15:18:29.103 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:29.103 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.105 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:29.106 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (user_id = ? AND status = ? AND (expire_time IS NULL OR expire_time > ?)) ORDER BY create_time DESC LIMIT 1
- 15:18:29.106 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Parameters: 2072580652799041537(Long), 1(Integer), 2026-07-02T15:18:29.106154400(LocalDateTime)
- 15:18:29.109 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : <== Total: 0
- 15:18:29.109 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:29.109 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:29.111 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:29.112 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_code WHERE (code = ?)
- 15:18:29.112 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectCount : ==> Parameters: VE6YLXWM(String)
- 15:18:29.113 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:18:29.114 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_code ( user_id, code, max_uses, used_count, click_count, expire_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:29.114 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.insert : ==> Parameters: 2072580652799041537(Long), VE6YLXWM(String), -1(Integer), 0(Integer), 0(Integer), 2026-08-01T15:18:29.111509200(LocalDateTime), 1(Integer), 2026-07-02T15:18:29.114170500(LocalDateTime), 2026-07-02T15:18:29.114170500(LocalDateTime)
- 15:18:29.119 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.insert : <== Updates: 1
- 15:18:29.120 INFO [SFy6sNEH] [2072580652799041537] [ main] c.x.i.service.InviteService : 用户 2072580652799041537 创建邀请码: VE6YLXWM
- 15:18:29.120 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:29.120 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:29.122 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:29.122 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:29.122 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.125 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:29.125 DEBUG [SFy6sNEH] [2072580652799041537] [ main] c.x.g.f.RequestLoggingFilter : GET /api/invite/code 200 23ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/invite/code
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1Mjc5OTA0MTUzNywic3ViIjoiMjA3MjU4MDY1Mjc5OTA0MTUzNyIsImlhdCI6MTc4Mjk3NjcwOCwiZXhwIjoxNzgzMDYzMTA4fQ.v7Rdq2D359acFHjosRrPudpfg8gdG3dQra_WCRKA0yLNwAg4Qqj4IOKsFRuWcPhj2SJZDGKuciAaGrh96jh_9w"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.invite.controller.InviteController
- Method = com.xuekairui.invite.controller.InviteController#getMyInviteCode(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"SFy6sNEH", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"code":"VE6YLXWM","inviteLink":"https://app.zhijiayun.com/api/invite/VE6YLXWM","inviterNickname":"用户1111","usedCount":0,"clickCount":0,"maxUses":-1,"expireTime":"2026-08-01 15:18:29","status":1,"createTime":"2026-07-02 15:18:29","shareTitle":"用户1111 邀请你加入智价云(药店版)","shareDescription":"登录智价云(药店版),邀请好友各得好礼","copyText":"我是用户1111,在这里发现了一个药店采购神器——智价云(药店版)!它聚合比价功能特别方便,能快速查到最低价,帮你节省采购成本。下载链接https://app.zhijiayun.com/api/invite/VE6YLXWM填我的邀请码 VE6YLXWM 完成注册,你也会获得会员权益!","rewardDescription":"邀请人每成功邀请1家药店注册,赠送1个月高级会员时长","downloadUrl":"https://app.zhijiayun.com/api/invite/VE6YLXWM"},"timestamp":1782976709125}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.125 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 获取邀请码: VE6YLXWM
- 15:18:29.125 DEBUG [sBkXgBU4] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:29.129 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectList : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE (phone = ?)
- 15:18:29.129 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectList : ==> Parameters: 13911111111(String)
- 15:18:29.130 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectList : <== Total: 0
- 15:18:29.130 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.insert : ==> Preparing: INSERT INTO t_user ( id, phone, nickname, login_source, status, role, membership_level, token_version, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:29.131 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.insert : ==> Parameters: 2072580653440770050(Long), 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 0(Long), 2026-07-02T15:18:29.130807300(LocalDateTime), 2026-07-02T15:18:29.130807300(LocalDateTime)
- 15:18:29.133 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.insert : <== Updates: 1
- 15:18:29.133 INFO [sBkXgBU4] [] [ main] c.x.i.l.UserRegisteredListener : 收到用户注册事件: userId=2072580653440770050, inviteCode=VE6YLXWM
- 15:18:29.134 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,user_id,code,max_uses,used_count,click_count,expire_time,status,create_time,update_time FROM t_invite_code WHERE (code = ?)
- 15:18:29.134 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : ==> Parameters: VE6YLXWM(String)
- 15:18:29.136 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:29.136 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:29.136 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580653440770050(Long)
- 15:18:29.137 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:29.138 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (invitee_id = ?)
- 15:18:29.138 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : ==> Parameters: 2072580653440770050(Long)
- 15:18:29.141 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:18:29.141 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : ==> Preparing: SELECT id,reward_crawler_count,reward_type,reward_months,max_daily_reward,invite_code_expire_days,max_invite_per_day,max_total_invites,app_download_url,miniapp_path,miniapp_app_id,wechat_redirect_url,dingtalk_app_id,feishu_app_id,landing_title,landing_desc,app_name,status,share_title_template,copy_text_template,reward_description,summary_text_template,instruction_windows,instruction_app,instruction_miniapp,instruction_wechat,instruction_dingtalk,instruction_feishu,instruction_default,remark,create_time,update_time FROM t_invite_config
- 15:18:29.141 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : ==> Parameters:
- 15:18:29.143 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectList : <== Total: 1
- 15:18:29.143 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : ==> Preparing: SELECT COUNT( * ) AS total FROM t_invite_relation WHERE (inviter_id = ? AND registered = ?)
- 15:18:29.143 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : ==> Parameters: 2072580652799041537(Long), 1(Integer)
- 15:18:29.145 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.selectCount : <== Total: 1
- 15:18:29.145 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.insert : ==> Preparing: INSERT INTO t_invite_relation ( inviter_id, invitee_id, invite_code_id, registered, reward_granted, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:29.145 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.insert : ==> Parameters: 2072580652799041537(Long), 2072580653440770050(Long), 1(Long), 1(Integer), 1(Integer), 1(Integer), 2026-07-02T15:18:29.145939900(LocalDateTime), 2026-07-02T15:18:29.145939900(LocalDateTime)
- 15:18:29.148 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.insert : <== Updates: 1
- 15:18:29.149 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.updateById : ==> Preparing: UPDATE t_invite_code SET user_id=?, code=?, max_uses=?, used_count=?, click_count=?, expire_time=?, status=?, create_time=?, update_time=? WHERE id=?
- 15:18:29.150 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.updateById : ==> Parameters: 2072580652799041537(Long), VE6YLXWM(String), -1(Integer), 1(Integer), 0(Integer), 2026-08-01T15:18:29(LocalDateTime), 1(Integer), 2026-07-02T15:18:29(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 1(Long)
- 15:18:29.152 DEBUG [sBkXgBU4] [] [ main] c.x.i.m.I.updateById : <== Updates: 1
- 15:18:29.153 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:29.153 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.155 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:29.155 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:29.155 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580652799041537(Long)
- 15:18:29.157 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:29.157 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectList : ==> Preparing: SELECT id,user_id,level,source,effective_from,effective_to,status,remark,create_time,update_time FROM t_user_membership WHERE (user_id = ? AND status = ?)
- 15:18:29.157 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectList : ==> Parameters: 2072580652799041537(Long), 1(Integer)
- 15:18:29.160 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.selectList : <== Total: 0
- 15:18:29.160 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.insert : ==> Preparing: INSERT INTO t_user_membership ( id, user_id, level, source, effective_from, effective_to, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:29.160 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.insert : ==> Parameters: 2072580653570793474(Long), 2072580652799041537(Long), PRO(String), INVITE(String), 2026-07-02T15:18:29.160374(LocalDateTime), 2026-08-01T15:18:29.160374(LocalDateTime), 1(Integer), 邀请奖励:邀请用户2072580653440770050注册(String), 2026-07-02T15:18:29.160374(LocalDateTime), 2026-07-02T15:18:29.160374(LocalDateTime)
- 15:18:29.163 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.U.insert : <== Updates: 1
- 15:18:29.163 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, membership_expire_at=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:29.163 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13811111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PRO(String), 2026-08-01T15:18:29.160374(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 127.0.0.1(String), 1(Long), d17e2310b4458a0c4deca61b2ca4fba8ef855839d61947a962ec620c9acf2105(String), ACTIVE(String), 2026-07-02T15:18:29(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 2072580652799041537(Long)
- 15:18:29.166 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:29.166 INFO [sBkXgBU4] [] [ main] c.x.u.s.MembershipService : 邀请奖励:用户2072580652799041537获得30天高级会员(PRO)
- 15:18:29.166 INFO [sBkXgBU4] [] [ main] c.x.i.service.InviteService : 邀请奖励已发放: inviter=2072580652799041537, invitee=2072580653440770050, 会员=PRO/30天, 配额=0次
- 15:18:29.166 INFO [sBkXgBU4] [] [ main] c.x.i.service.InviteService : 邀请成功: inviter=2072580652799041537, invitee=2072580653440770050
- 15:18:29.167 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, inviter_id=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:18:29.167 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2072580652799041537(Long), 0(Long), 2026-07-02T15:18:29(LocalDateTime), 2026-07-02T15:18:29(LocalDateTime), 2072580653440770050(Long)
- 15:18:29.170 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:29.171 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, create_time=?, update_time=? WHERE id=?
- 15:18:29.171 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.170580900(LocalDateTime), 127.0.0.1(String), 0(Long), 2026-07-02T15:18:29.130807300(LocalDateTime), 2026-07-02T15:18:29.130807300(LocalDateTime), 2072580653440770050(Long)
- 15:18:29.174 DEBUG [sBkXgBU4] [] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:29.175 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.updateById : ==> Preparing: UPDATE t_user SET phone=?, nickname=?, login_source=?, status=?, role=?, membership_level=?, last_login_time=?, last_login_ip=?, token_version=?, refresh_token_hash=?, refresh_token_status=?, create_time=?, update_time=? WHERE id=?
- 15:18:29.175 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.updateById : ==> Parameters: 13911111111(String), 用户1111(String), SMS(String), 1(Integer), USER(String), PLUS(String), 2026-07-02T15:18:29.170580900(LocalDateTime), 127.0.0.1(String), 1(Long), 4b2ad3dd8251e2b79bae4d3903c7291a17989359d61ab6d3f32cee43c4349458(String), ACTIVE(String), 2026-07-02T15:18:29.130807300(LocalDateTime), 2026-07-02T15:18:29.130807300(LocalDateTime), 2072580653440770050(Long)
- 15:18:29.178 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.updateById : <== Updates: 1
- 15:18:29.178 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:29.178 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 2072580653440770050(Long)
- 15:18:29.179 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:29.179 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:29.179 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580653440770050(Long)
- 15:18:29.181 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:29.181 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:29.182 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:29.183 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:29.184 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:29.184 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580653633708033(Long), 2072580653440770050(Long), 用户1111(String), USER(String), 2026-07-02T15:18:29.183950400(LocalDateTime), USER(String), REGISTER(String), 用户注册(String), USER(String), 2072580653440770050(Long), USER:2072580653440770050(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.183950400(LocalDateTime)
- 15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户注册
- 15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : ==> Preparing: INSERT INTO t_operation_audit_log ( id, operator_id, operator_name, operator_role, operation_time, module, operation_type, description, target_type, target_id, target_identifier, result, is_sensitive, create_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:29.187 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : ==> Parameters: 2072580653696622594(Long), 2072580653440770050(Long), 用户1111(String), USER(String), 2026-07-02T15:18:29.187202(LocalDateTime), USER(String), LOGIN(String), 用户登录(String), USER(String), 2072580653440770050(Long), USER:2072580653440770050(String), SUCCESS(String), false(Boolean), 2026-07-02T15:18:29.187202(LocalDateTime)
- 15:18:29.190 DEBUG [sBkXgBU4] [2072580653440770050] [ main] c.x.u.m.O.insert : <== Updates: 1
- 15:18:29.190 DEBUG [sBkXgBU4] [2072580653440770050] [ main] x.u.s.OperationAuditLogService : 操作审计日志记录成功: 用户登录
- 15:18:29.194 DEBUG [sBkXgBU4] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 69ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"63"]
- Body = {"phone":"13911111111","code":"123456","inviteCode":"VE6YLXWM"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"sBkXgBU4", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"userId":2072580653440770050,"accessToken":"eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiVVNFUiIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1MzQ0MDc3MDA1MCwic3ViIjoiMjA3MjU4MDY1MzQ0MDc3MDA1MCIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.1U1wmM_7Z-Otb4-NXVT5VxCWB6uJv1wHVWveYkKDJ4YvICu-eEa73Asj9TK5C0I4sDBfqOksWA2MHnWJtmhBQw","refreshToken":"eyJhbGciOiJIUzUxMiJ9.eyJ0eXBlIjoicmVmcmVzaCIsInVzZXJJZCI6MjA3MjU4MDY1MzQ0MDc3MDA1MCwic3ViIjoiMjA3MjU4MDY1MzQ0MDc3MDA1MCIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzNTgxNTA5fQ.JwI0JCVikX9Wi3dy_ELGmONoJ5QP5VvOap8bjW0kIkWuvUXnZXqad4PfJtkTG7eJGWaXyUQrgf3xzih4VRBxaQ","expiresIn":86400,"userInfo":{"id":2072580653440770050,"phone":"139****1111","nickname":"用户1111","avatar":null,"wechatBound":false,"levelInfo":{"id":1,"levelName":"普通会员","levelCode":"PLUS","levelWeight":1,"crawlerQuota":10,"monthlyQuota":300,"yearlyQuota":3650,"maxConcurrent":1,"description":"普通会员:每日有效查询10次","version":null,"membershipExpireAt":null,"membershipDaysRemaining":-1,"pricingPlans":[]},"createTime":"2026-07-02 15:18:29","loginSource":"SMS","pharmacyName":null,"province":null,"city":null,"district":null,"role":"USER","membershipLevel":"PLUS","membershipLevelName":"普通会员","inviterId":null,"inviterNickname":null,"hasBoundInviteCode":false,"userId":2072580653440770050,"levelCode":"PLUS","version":null},"needBindPhone":false,"tempToken":null,"newUser":true,"role":"USER","kickedPreviousSession":false,"kickedDeviceInfo":null},"timestamp":1782976709194}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.195 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 带邀请码注册成功: inviteCode=VE6YLXWM
- 15:18:29.199 DEBUG [Ty3a5BKf] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my | IP: 127.0.0.1
- 15:18:29.199 DEBUG [Ty3a5BKf] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:29.200 DEBUG [Ty3a5BKf] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 2072580653440770050(Long)
- 15:18:29.201 DEBUG [Ty3a5BKf] [2072580653440770050] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:29.202 DEBUG [Ty3a5BKf] [2072580653440770050] [ main] c.x.g.f.RequestLoggingFilter : GET /api/membership/my 200 3ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/membership/my
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoidG1wMjA3MjU4MDY1MzQ0MDc3MDA1MCIsInRva2VuVmVyc2lvbiI6MSwidHlwZSI6ImFjY2VzcyIsInVzZXJJZCI6MjA3MjU4MDY1MzQ0MDc3MDA1MCwic3ViIjoiMjA3MjU4MDY1MzQ0MDc3MDA1MCIsImlhdCI6MTc4Mjk3NjcwOSwiZXhwIjoxNzgzMDYzMTA5fQ.TaBQMhFVXqgnb3m2An40CCs_krqNd2bir7AjYeOdqOw-M7o_VvKIrPav9tqNnY2kJhTUfwfC-KcE4C5ZOjt8qQ"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.MembershipController
- Method = com.xuekairui.user.controller.MembershipController#getMyMembership(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"Ty3a5BKf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":null,"userId":2072580653440770050,"phone":null,"nickname":null,"level":"PLUS","levelName":"普通会员","source":"SYSTEM","effectiveFrom":null,"effectiveTo":null,"membershipExpireAt":null,"status":1,"remark":"免费会员","createTime":null},"timestamp":1782976709201}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.202 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 用户2072580653440770050为普通会员(PLUS),无过期时间,跳过校验
- 15:18:29.205 DEBUG [ftMPk6pA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url | IP: 127.0.0.1
- 15:18:29.206 DEBUG [ftMPk6pA] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/wechat/url 200 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/wechat/url
- Parameters = {state=[login]}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#getWechatUrl(String)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"ftMPk6pA", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":"https://open.weixin.qq.com/connect/qrconnect?appid=test_app_id&redirect_uri=http://localhost/callback&response_type=code&scope=snsapi_login&state=login#wechat_redirect","timestamp":1782976709205}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.206 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 获取微信登录URL成功
- 15:18:29.208 DEBUG [7LT2PW8N] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login | IP: 127.0.0.1
- 15:18:29.215 WARN [7LT2PW8N] [] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=1102, message=验证码错误或已过期
- 15:18:29.216 DEBUG [7LT2PW8N] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/auth/sms/login 200 8ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/auth/sms/login
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"57"]
- Body = {"phone":"13800138000","code":"000000","inviteCode":null}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.AuthController
- Method = com.xuekairui.user.controller.AuthController#smsLogin(SmsLoginRequest, HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"7LT2PW8N", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":1102,"message":"验证码错误或已过期","data":null,"timestamp":1782976709215}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.216 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 错误验证码处理正确
- 15:18:29.218 DEBUG [jSDRqb9v] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
- 15:18:29.219 WARN [jSDRqb9v] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"jSDRqb9v", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976709219}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.219 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 未认证拦截正确
- 15:18:29.223 DEBUG [UYD8C5WD] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info | IP: 127.0.0.1
- 15:18:29.223 WARN [UYD8C5WD] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 0
- 15:18:29.223 WARN [UYD8C5WD] [] [ main] c.xuekairui.user.util.JwtUtil : JWT解析TokenLenient失败, 原因: Invalid compact JWT string: Compact JWSs must contain exactly 2 period characters, and compact JWEs must contain exactly 4. Found: 0
- 15:18:29.223 WARN [UYD8C5WD] [] [ main] .x.u.s.JwtAuthenticationFilter : JWT认证失败: Token无效
- 15:18:29.224 WARN [UYD8C5WD] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/auth/user/info 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/auth/user/info
- Parameters = {}
- Headers = [Authorization:"Bearer invalid_token_xyz"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"UYD8C5WD", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976709223}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:29.224 INFO [] [] [ main] c.x.gateway.UserAuthFlowTest : ? 无效Token拦截正确
- [INFO] Tests run: 10, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.223 s -- in com.xuekairui.gateway.UserAuthFlowTest
- [INFO] Running 关注/收藏接口测试
- 15:18:29.227 INFO [] [] [ main] tationConfigContextLoaderUtils : Could not detect default configuration classes for test class [com.xuekairui.gateway.WatchlistControllerTest]: WatchlistControllerTest does not declare any static, non-private, non-final, nested classes annotated with @Configuration.
- 15:18:29.229 INFO [] [] [ main] ingBootTestContextBootstrapper : Found @SpringBootConfiguration com.xuekairui.Application for test class com.xuekairui.gateway.WatchlistControllerTest
- 15:18:32.184 DEBUG [VKRCxL95] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist | IP: 127.0.0.1
- 15:18:32.184 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.185 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.186 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.187 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.W.selectList : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
- 15:18:32.187 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.W.selectList : ==> Parameters: 1(Long), 1(Integer)
- 15:18:32.189 DEBUG [VKRCxL95] [1] [ main] c.x.u.m.W.selectList : <== Total: 0
- 15:18:32.190 DEBUG [VKRCxL95] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist 200 6ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/watchlist
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.WatchlistController
- Method = com.xuekairui.user.controller.WatchlistController#list(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"VKRCxL95", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[],"timestamp":1782976712189}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:32.192 DEBUG [hW43SNQL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist | IP: 127.0.0.1
- 15:18:32.193 WARN [hW43SNQL] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/watchlist
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"hW43SNQL", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976712193}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:32.198 DEBUG [d7DeawZf] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist | IP: 127.0.0.1
- 15:18:32.198 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.198 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.199 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.203 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
- 15:18:32.203 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
- 15:18:32.204 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : <== Total: 1
- 15:18:32.204 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.204 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.206 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.206 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:32.206 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:32.208 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:32.208 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:32.208 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:32.210 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:32.211 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.selectList : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND drug_name = ? AND spec = ? AND status = ?)
- 15:18:32.211 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.selectList : ==> Parameters: 1(Long), 阿莫西林胶囊(String), 0.5g*24粒/盒(String), 1(Integer)
- 15:18:32.212 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.selectList : <== Total: 0
- 15:18:32.213 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.insert : ==> Preparing: INSERT INTO t_watchlist ( id, user_id, drug_name, spec, manufacturer, min_price, min_price_platform, last_price, price_change, last_check_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:32.214 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.insert : ==> Parameters: 2072580666346643457(Long), 1(Long), 阿莫西林胶囊(String), 0.5g*24粒/盒(String), 华北制药(String), 11.80(BigDecimal), yaobangmang(String), 11.80(BigDecimal), 0(BigDecimal), 2026-07-02T15:18:32.212956300(LocalDateTime), 1(Integer), 2026-07-02T15:18:32.213484400(LocalDateTime), 2026-07-02T15:18:32.213484400(LocalDateTime)
- 15:18:32.216 DEBUG [d7DeawZf] [1] [ main] c.x.u.m.W.insert : <== Updates: 1
- 15:18:32.221 DEBUG [d7DeawZf] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist 200 23ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/watchlist
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"137"]
- Body = {"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药","minPrice":11.80,"minPricePlatform":"yaobangmang"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.WatchlistController
- Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"d7DeawZf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":2072580666346643457,"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药","minPrice":11.80,"minPricePlatform":"yaobangmang","lastPrice":11.80,"priceChange":0,"lastCheckTime":"2026-07-02 15:18:32","createTime":"2026-07-02 15:18:32"},"timestamp":1782976712220}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:32.225 DEBUG [5R5TApsf] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist | IP: 127.0.0.1
- 15:18:32.226 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.226 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.227 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.229 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
- 15:18:32.229 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
- 15:18:32.230 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.countMonthlyByUserId : <== Total: 1
- 15:18:32.230 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.230 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.231 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.231 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:32.231 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:32.233 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:32.233 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:32.233 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:32.235 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:32.235 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.selectList : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND drug_name = ? AND spec = ? AND status = ?)
- 15:18:32.235 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.selectList : ==> Parameters: 1(Long), 阿莫西林胶囊(String), 0.5g*24粒/盒(String), 1(Integer)
- 15:18:32.237 DEBUG [5R5TApsf] [1] [ main] c.x.u.m.W.selectList : <== Total: 1
- 15:18:32.240 WARN [5R5TApsf] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4402, message=该药品已在关注列表中
- 15:18:32.240 DEBUG [5R5TApsf] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist 200 15ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/watchlist
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"87"]
- Body = {"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.WatchlistController
- Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"5R5TApsf", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":4402,"message":"该药品已在关注列表中","data":null,"timestamp":1782976712240}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:32.244 DEBUG [9UmQbxk6] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist | IP: 127.0.0.1
- 15:18:32.245 DEBUG [9UmQbxk6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.245 DEBUG [9UmQbxk6] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.248 DEBUG [9UmQbxk6] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.249 WARN [9UmQbxk6] [1] [ main] c.x.h.GlobalExceptionHandler : 参数校验失败: 药品名称不能为空
- 15:18:32.250 WARN [9UmQbxk6] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist 400 6ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/watchlist
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"29"]
- Body = {"drugName":"","spec":"test"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.WatchlistController
- Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = org.springframework.web.bind.MethodArgumentNotValidException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 400
- Error message = null
- Headers = [X-Request-Id:"9UmQbxk6", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":400,"message":"药品名称不能为空","data":null,"timestamp":1782976712249}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:32.252 DEBUG [B2wBRx6C] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist | IP: 127.0.0.1
- 15:18:32.252 WARN [B2wBRx6C] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist 401 0ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/watchlist
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Content-Length:"19"]
- Body = {"drugName":"test"}
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"B2wBRx6C", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976712252}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:32.258 DEBUG [KXegqxHK] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist | IP: 127.0.0.1
- 15:18:32.258 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.258 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.259 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.260 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.W.selectList : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND status = ?) ORDER BY create_time DESC
- 15:18:32.260 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.W.selectList : ==> Parameters: 1(Long), 1(Integer)
- 15:18:32.261 DEBUG [KXegqxHK] [1] [ main] c.x.u.m.W.selectList : <== Total: 1
- 15:18:32.262 DEBUG [KXegqxHK] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist 200 4ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/watchlist
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.WatchlistController
- Method = com.xuekairui.user.controller.WatchlistController#list(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"KXegqxHK", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":[{"id":2072580666346643457,"drugName":"阿莫西林胶囊","spec":"0.5g*24粒/盒","manufacturer":"华北制药","minPrice":11.80,"minPricePlatform":"yaobangmang","lastPrice":11.80,"priceChange":0.00,"lastCheckTime":"2026-07-02 15:18:32","createTime":"2026-07-02 15:18:32"}],"timestamp":1782976712261}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:32.266 DEBUG [gSJPewXD] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist/stats | IP: 127.0.0.1
- 15:18:32.267 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.267 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.268 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.269 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countByUserId : ==> Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1
- 15:18:32.269 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countByUserId : ==> Parameters: 1(Long)
- 15:18:32.270 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countByUserId : <== Total: 1
- 15:18:32.270 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
- 15:18:32.270 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
- 15:18:32.271 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : <== Total: 1
- 15:18:32.271 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.271 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.272 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.272 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:32.272 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:32.273 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:32.274 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:32.274 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:32.275 DEBUG [gSJPewXD] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:32.276 DEBUG [gSJPewXD] [1] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist/stats 200 10ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/watchlist/stats
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.WatchlistController
- Method = com.xuekairui.user.controller.WatchlistController#stats(HttpServletRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"gSJPewXD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"monthlyUsed":1,"total":1,"monthlyLimit":50},"timestamp":1782976712275}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:32.279 DEBUG [QqPaRy56] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist/stats | IP: 127.0.0.1
- 15:18:32.280 WARN [QqPaRy56] [] [ main] c.x.g.f.RequestLoggingFilter : GET /api/watchlist/stats 401 1ms
- MockHttpServletRequest:
- HTTP Method = GET
- Request URI = /api/watchlist/stats
- Parameters = {}
- Headers = []
- Body = null
- Session Attrs = {}
- Handler:
- Type = null
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 401
- Error message = null
- Headers = [X-Request-Id:"QqPaRy56", Content-Type:"application/json;charset=UTF-8", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json;charset=UTF-8
- Body = {"code":401,"message":"未授权,请先登录","data":null,"timestamp":1782976712279}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:32.284 DEBUG [nFAP7s3K] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/watchlist/999999 | IP: 127.0.0.1
- 15:18:32.285 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.285 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.286 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.287 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.W.selectById : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE id=?
- 15:18:32.287 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.W.selectById : ==> Parameters: 999999(Long)
- 15:18:32.288 DEBUG [nFAP7s3K] [1] [ main] c.x.u.m.W.selectById : <== Total: 0
- 15:18:32.290 WARN [nFAP7s3K] [1] [ main] c.x.h.GlobalExceptionHandler : 业务异常: code=4403, message=关注记录不存在
- 15:18:32.291 DEBUG [nFAP7s3K] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/watchlist/999999 200 7ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/watchlist/999999
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.WatchlistController
- Method = com.xuekairui.user.controller.WatchlistController#remove(HttpServletRequest, Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = com.xuekairui.common.BusinessException
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"nFAP7s3K", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":4403,"message":"关注记录不存在","data":null,"timestamp":1782976712290}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:32.295 DEBUG [d53S9AmD] [] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist | IP: 127.0.0.1
- 15:18:32.295 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.295 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.297 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.301 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Preparing: SELECT COUNT(*) FROM t_watchlist WHERE user_id = ? AND status = 1 AND YEAR(create_time) = YEAR(CURDATE()) AND MONTH(create_time) = MONTH(CURDATE())
- 15:18:32.301 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : ==> Parameters: 1(Long)
- 15:18:32.302 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.countMonthlyByUserId : <== Total: 1
- 15:18:32.302 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Preparing: SELECT id,phone,nickname,avatar,password,wechat_open_id,wechat_union_id,wechat_nickname,pharmacy_name,province,city,district,last_login_device,login_source,status,role,membership_level,membership_expire_at,inviter_id,last_login_time,last_login_ip,token_version,refresh_token_hash,refresh_token_status,create_time,update_time FROM t_user WHERE id=?
- 15:18:32.302 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : ==> Parameters: 1(Long)
- 15:18:32.304 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.UserMapper.selectById : <== Total: 1
- 15:18:32.304 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Preparing: SELECT * FROM t_user_membership WHERE user_id = ? AND status = 1 AND (effective_to IS NULL OR effective_to > NOW()) ORDER BY FIELD(level, 'ULTRA', 'PRO', 'PLUS') LIMIT 1
- 15:18:32.304 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.U.selectActiveByUserId : ==> Parameters: 1(Long)
- 15:18:32.305 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.U.selectActiveByUserId : <== Total: 0
- 15:18:32.305 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.M.selectList : ==> Preparing: SELECT id,level,benefit_type,benefit_value,description,status,create_time,update_time FROM t_membership_benefit WHERE (level = ? AND status = ?) ORDER BY benefit_type ASC
- 15:18:32.305 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.M.selectList : ==> Parameters: PLUS(String), 1(Integer)
- 15:18:32.306 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.M.selectList : <== Total: 3
- 15:18:32.307 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.selectList : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE (user_id = ? AND drug_name = ? AND spec = ? AND status = ?)
- 15:18:32.307 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.selectList : ==> Parameters: 1(Long), 布洛芬缓释胶囊(String), 0.3g*20粒/盒(String), 1(Integer)
- 15:18:32.308 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.selectList : <== Total: 0
- 15:18:32.308 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.insert : ==> Preparing: INSERT INTO t_watchlist ( id, user_id, drug_name, spec, manufacturer, price_change, last_check_time, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
- 15:18:32.308 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.insert : ==> Parameters: 2072580666791239681(Long), 1(Long), 布洛芬缓释胶囊(String), 0.3g*20粒/盒(String), 中美史克(String), 0(BigDecimal), 2026-07-02T15:18:32.308302400(LocalDateTime), 1(Integer), 2026-07-02T15:18:32.308827700(LocalDateTime), 2026-07-02T15:18:32.308827700(LocalDateTime)
- 15:18:32.310 DEBUG [d53S9AmD] [1] [ main] c.x.u.m.W.insert : <== Updates: 1
- 15:18:32.314 DEBUG [d53S9AmD] [1] [ main] c.x.g.f.RequestLoggingFilter : POST /api/watchlist 200 19ms
- MockHttpServletRequest:
- HTTP Method = POST
- Request URI = /api/watchlist
- Parameters = {}
- Headers = [Content-Type:"application/json;charset=UTF-8", Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA", Content-Length:"90"]
- Body = {"drugName":"布洛芬缓释胶囊","spec":"0.3g*20粒/盒","manufacturer":"中美史克"}
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.WatchlistController
- Method = com.xuekairui.user.controller.WatchlistController#add(HttpServletRequest, WatchlistAddRequest)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"d53S9AmD", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":{"id":2072580666791239681,"drugName":"布洛芬缓释胶囊","spec":"0.3g*20粒/盒","manufacturer":"中美史克","minPrice":null,"minPricePlatform":null,"lastPrice":null,"priceChange":0,"lastCheckTime":"2026-07-02 15:18:32","createTime":"2026-07-02 15:18:32"},"timestamp":1782976712314}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- 15:18:32.315 DEBUG [tGkcJwbP] [] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/watchlist/2072580666791239681 | IP: 127.0.0.1
- 15:18:32.317 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.selectById : ==> Preparing: SELECT id,user_id,drug_name,spec,manufacturer,min_price,min_price_platform,last_price,price_change,last_check_time,status,create_time,update_time FROM t_watchlist WHERE id=?
- 15:18:32.317 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.selectById : ==> Parameters: 2072580666791239681(Long)
- 15:18:32.318 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.selectById : <== Total: 1
- 15:18:32.319 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.updateById : ==> Preparing: UPDATE t_watchlist SET user_id=?, drug_name=?, spec=?, manufacturer=?, price_change=?, last_check_time=?, status=?, create_time=?, update_time=? WHERE id=?
- 15:18:32.319 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.updateById : ==> Parameters: 1(Long), 布洛芬缓释胶囊(String), 0.3g*20粒/盒(String), 中美史克(String), 0.00(BigDecimal), 2026-07-02T15:18:32(LocalDateTime), 0(Integer), 2026-07-02T15:18:32(LocalDateTime), 2026-07-02T15:18:32(LocalDateTime), 2072580666791239681(Long)
- 15:18:32.322 DEBUG [tGkcJwbP] [1] [ main] c.x.u.m.W.updateById : <== Updates: 1
- 15:18:32.326 DEBUG [tGkcJwbP] [1] [ main] c.x.g.f.RequestLoggingFilter : DELETE /api/watchlist/2072580666791239681 200 11ms
- MockHttpServletRequest:
- HTTP Method = DELETE
- Request URI = /api/watchlist/2072580666791239681
- Parameters = {}
- Headers = [Authorization:"Bearer eyJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiQURNSU4iLCJ0b2tlblZlcnNpb24iOjAsInR5cGUiOiJhY2Nlc3MiLCJ1c2VySWQiOjEsInN1YiI6IjEiLCJpYXQiOjE3ODI5NzY3MTIsImV4cCI6MTc4MzA2MzExMn0.1wzbWphapnyJbFL1SsumZoSHcqPEd6qP9yubv9k_eJ0brDOvKdS8OhL1nGuXv0nKn7UTK5GjhoPiduJbWCzjEA"]
- Body = null
- Session Attrs = {}
- Handler:
- Type = com.xuekairui.user.controller.WatchlistController
- Method = com.xuekairui.user.controller.WatchlistController#remove(HttpServletRequest, Long)
- Async:
- Async started = false
- Async result = null
- Resolved Exception:
- Type = null
- ModelAndView:
- View name = null
- View = null
- Model = null
- FlashMap:
- Attributes = null
- MockHttpServletResponse:
- Status = 200
- Error message = null
- Headers = [X-Request-Id:"tGkcJwbP", Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
- Content type = application/json
- Body = {"code":200,"message":"操作成功","data":null,"timestamp":1782976712325}
- Forwarded URL = null
- Redirected URL = null
- Cookies = []
- [INFO] Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.101 s -- in 关注/收藏接口测试
- [INFO]
- [INFO] Results:
- [INFO]
- [ERROR] Failures:
- [ERROR] AuthControllerTest.getUserInfo_withExpiredToken_shouldReturn401:222 Status expected:<401> but was:<200>
- [ERROR] EndToEndBusinessFlowTest.stage7_AdminReviewLicense:264 Status expected:<200> but was:<401>
- [ERROR] EndToEndBusinessFlowTest.stage8_CheckAuditLogs:295 Status expected:<200> but was:<401>
- [INFO]
- [ERROR] Tests run: 381, Failures: 3, Errors: 0, Skipped: 0
- [INFO]
- [INFO] ------------------------------------------------------------------------
- [INFO] Reactor Summary:
- [INFO]
- [INFO] zhijiayun-pharmacy 1.0-SNAPSHOT .................... SUCCESS [ 0.140 s]
- [INFO] zhijiayun-common 1.0.0 ............................. SUCCESS [ 2.195 s]
- [INFO] zhijiayun-user 1.0.0 ............................... SUCCESS [ 5.212 s]
- [INFO] zhijiayun-payment 1.0.0 ............................ SUCCESS [ 2.564 s]
- [INFO] zhijiayun-invite 1.0.0 ............................. SUCCESS [ 1.449 s]
- [INFO] zhijiayun-gateway 1.0.0 ............................ FAILURE [01:35 min]
- [INFO] ------------------------------------------------------------------------
- [INFO] BUILD FAILURE
- [INFO] ------------------------------------------------------------------------
- [INFO] Total time: 01:47 min
- [INFO] Finished at: 2026-07-02T15:18:32+08:00
- [INFO] ------------------------------------------------------------------------
- [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.5.5:test (default-test) on project zhijiayun-gateway: There are test failures.
- [ERROR]
- [ERROR] See D:\project\zhijiayun-pharmacy\zhijiayun-gateway\target\surefire-reports for the individual test results.
- [ERROR] See dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
- [ERROR] -> [Help 1]
- [ERROR]
- [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
- [ERROR] Re-run Maven using the -X switch to enable full debug logging.
- [ERROR]
- [ERROR] For more information about the errors and possible solutions, please read the following articles:
- [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
- [ERROR]
- [ERROR] After correcting the problems, you can resume the build with the command
- [ERROR] mvn <args> -rf :zhijiayun-gateway
|