| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340 |
- # -*- coding: utf-8 -*-
- """
- CFC 小程序端「操作接口」冒烟脚本 — 由页面功能自动派生(共 1016 个接口用例)。
- 用法:
- # 公开接口冒烟(无需登录)
- python ops_interface_smoke.py --base http://<可达地址>
- # 带登录态接口测试
- export CFC_TOKEN="eyJ..."
- python ops_interface_smoke.py --base http://<可达地址> --authed
- # 路径参数占位符(默认 '1',可换成真实 ID)
- python ops_interface_smoke.py --base ... --param-val 真实ID
- 说明:
- * 仅做「连通性 + 返回结构」断言(HTTP 可达、JSON 可解析、含 code/data)。
- * 业务正确性(字段值、状态机)需结合真实数据人工/用例补充。
- * 鉴权流程(wechat-login 等)依赖微信 code,无法纯脚本自动化,见脚本底部 AUTH_NOTE。
- """
- import argparse, json, os, sys, time
- import urllib.request, urllib.error
- # 纯标准库实现,无需 pip install requests。
- # 自动生成的用例: (page, method, path, auth, param, fn)
- CASES = [
- ('App', 'POST', '/api/auth/auto-login', False, False, 'autoLogin'),
- ('App', 'POST', '/api/auth/sso-login', False, False, 'ssoLogin'),
- ('App', 'POST', '/api/auth/verify', False, False, 'verifyToken'),
- ('App', 'POST', '/api/family/invite/check-family', False, False, 'checkUserFamily'),
- ('__tests__/api/api.indicator.test', 'POST', '/api/indicator/change-ranking', True, False, 'getIndicatorChangeRanking'),
- ('__tests__/api/api.indicator.test', 'POST', '/api/indicator/correlation/list', True, False, 'getIndicatorCorrelationList'),
- ('__tests__/api/api.indicator.test', 'POST', '/api/indicator/quick-lookup', True, False, 'getIndicatorQuickLookup'),
- ('__tests__/api/api.indicator.test', 'POST', '/api/indicator/trend', True, False, 'getIndicatorTrend'),
- ('__tests__/api/api.test', 'POST', '/api/ai/chat/conversations', True, False, 'aiGetConversations'),
- ('__tests__/api/api.test', 'POST', '/api/ai/chat/send', True, False, 'aiSendMessage'),
- ('__tests__/api/api.test', 'POST', '/api/articles/categories', False, False, 'getArticleCategories'),
- ('__tests__/api/api.test', 'POST', '/api/articles/daily-tip', False, False, 'getDailyTip'),
- ('__tests__/api/api.test', 'POST', '/api/articles/detail', False, False, 'getArticleDetail'),
- ('__tests__/api/api.test', 'POST', '/api/articles/list', False, False, 'getArticleList'),
- ('__tests__/api/api.test', 'POST', '/api/articles/related', False, False, 'getRelatedArticles'),
- ('__tests__/api/api.test', 'POST', '/api/auth/auto-login', False, False, 'autoLogin'),
- ('__tests__/api/api.test', 'POST', '/api/auth/check-phone', False, False, 'checkPhone'),
- ('__tests__/api/api.test', 'POST', '/api/auth/direct-register', False, False, 'directRegister'),
- ('__tests__/api/api.test', 'POST', '/api/auth/phone-login', False, False, 'phoneLogin'),
- ('__tests__/api/api.test', 'POST', '/api/auth/send-code', False, False, 'sendCode'),
- ('__tests__/api/api.test', 'POST', '/api/auth/set-password', False, False, 'setPassword'),
- ('__tests__/api/api.test', 'POST', '/api/auth/silent-login', False, False, 'silentLogin'),
- ('__tests__/api/api.test', 'POST', '/api/auth/verify', False, False, 'verifyToken'),
- ('__tests__/api/api.test', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
- ('__tests__/api/api.test', 'POST', '/api/auth/wechat-login', False, False, 'wechatLogin'),
- ('__tests__/api/api.test', 'POST', '/api/auth/wechat-phone-login', False, False, 'wechatPhoneLogin'),
- ('__tests__/api/api.test', 'POST', '/api/badges/child/list', True, False, 'getChildBadges'),
- ('__tests__/api/api.test', 'POST', '/api/badges/favorite', True, False, 'toggleBadgeFavorite'),
- ('__tests__/api/api.test', 'POST', '/api/badges/list', True, False, 'getActiveBadges'),
- ('__tests__/api/api.test', 'POST', '/api/commission/summary', True, False, 'getCommissionSummary'),
- ('__tests__/api/api.test', 'POST', '/api/contact/create', True, False, 'createContact'),
- ('__tests__/api/api.test', 'POST', '/api/contact/delete', True, False, 'deleteContact'),
- ('__tests__/api/api.test', 'POST', '/api/contact/import-phone', True, False, 'importPhoneContact'),
- ('__tests__/api/api.test', 'POST', '/api/contact/list', True, False, 'getContactList'),
- ('__tests__/api/api.test', 'POST', '/api/dan-assessment/child-results', True, False, 'getChildAssessmentResults'),
- ('__tests__/api/api.test', 'POST', '/api/dan-assessment/my-results', True, False, 'getMyAssessmentResults'),
- ('__tests__/api/api.test', 'POST', '/api/dan-assessment/order/pay', True, False, 'payAssessmentOrder'),
- ('__tests__/api/api.test', 'POST', '/api/dan-assessment/result/record', False, False, 'recordAssessmentResult'),
- ('__tests__/api/api.test', 'POST', '/api/energy/logs', True, False, 'getEnergyLogs'),
- ('__tests__/api/api.test', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('__tests__/api/api.test', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('__tests__/api/api.test', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('__tests__/api/api.test', 'POST', '/api/family/user/children', True, False, 'createChild'),
- ('__tests__/api/api.test', 'POST', '/api/family/user/children/update', True, False, 'updateChild'),
- ('__tests__/api/api.test', 'POST', '/api/family/user/create-family', True, False, 'createFamily'),
- ('__tests__/api/api.test', 'POST', '/api/family/user/kick', True, False, 'kickFamilyMember'),
- ('__tests__/api/api.test', 'POST', '/api/family/user/members/update-visibility', True, False, 'updateMemberVisibility'),
- ('__tests__/api/api.test', 'POST', '/api/game/history', True, False, 'getGameHistory'),
- ('__tests__/api/api.test', 'POST', '/api/game/leaderboard', True, False, 'getGameLeaderboard'),
- ('__tests__/api/api.test', 'POST', '/api/growth/record/create', True, False, 'createGrowthRecord'),
- ('__tests__/api/api.test', 'POST', '/api/growth/record/create-with-order', True, False, 'createGrowthRecord'),
- ('__tests__/api/api.test', 'POST', '/api/growth/record/list', True, False, 'getGrowthRecordList'),
- ('__tests__/api/api.test', 'POST', '/api/guide/bind/invite', True, False, 'generateBindInvite'),
- ('__tests__/api/api.test', 'POST', '/api/guide/families', True, False, 'getBoundFamilies'),
- ('__tests__/api/api.test', 'POST', '/api/guide/messages/list', True, False, 'getGuideMessages'),
- ('__tests__/api/api.test', 'POST', '/api/guide/orders/list', True, False, 'getGuideOrders'),
- ('__tests__/api/api.test', 'POST', '/api/guide/packages/my', True, False, 'getGuidePackages'),
- ('__tests__/api/api.test', 'POST', '/api/guide/register', False, False, 'registerGuide'),
- ('__tests__/api/api.test', 'POST', '/api/guide/team/members', True, False, 'getTeamMembers'),
- ('__tests__/api/api.test', 'POST', '/api/health/checkin/list', True, False, 'healthCheckinList'),
- ('__tests__/api/api.test', 'POST', '/api/health/indicator/list', True, False, 'getHealthIndicatorList'),
- ('__tests__/api/api.test', 'POST', '/api/health/report/create', True, False, 'createHealthReport'),
- ('__tests__/api/api.test', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
- ('__tests__/api/api.test', 'POST', '/api/health/report/latest', True, False, 'getLatestHealthReport'),
- ('__tests__/api/api.test', 'POST', '/api/health/report/list', True, False, 'getReportList'),
- ('__tests__/api/api.test', 'POST', '/api/health/survey/create', True, False, 'createReportSurvey'),
- ('__tests__/api/api.test', 'POST', '/api/health/survey/submit', True, False, 'submitReportSurvey'),
- ('__tests__/api/api.test', 'POST', '/api/invite-card/generate', False, False, 'generateInviteCard'),
- ('__tests__/api/api.test', 'POST', '/api/invite-card/verify', False, False, 'verifyInviteCard'),
- ('__tests__/api/api.test', 'POST', '/api/invite/bind', True, False, 'bindReferral'),
- ('__tests__/api/api.test', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
- ('__tests__/api/api.test', 'POST', '/api/membership/levels', True, False, 'getMembershipLevels'),
- ('__tests__/api/api.test', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('__tests__/api/api.test', 'POST', '/api/membership/orders', True, False, 'createOrder'),
- ('__tests__/api/api.test', 'POST', '/api/mini-game//:var', True, True, 'getMiniGameByCode'),
- ('__tests__/api/api.test', 'POST', '/api/mini-game/complete', True, False, 'completeMiniGame'),
- ('__tests__/api/api.test', 'POST', '/api/mini-game/list', True, False, 'getMiniGameList'),
- ('__tests__/api/api.test', 'POST', '/api/packages//:var/publish', True, True, 'publishPackage'),
- ('__tests__/api/api.test', 'POST', '/api/points/balance', True, False, 'getPointsBalance'),
- ('__tests__/api/api.test', 'POST', '/api/points/logs', True, False, 'getPointsLogs'),
- ('__tests__/api/api.test', 'POST', '/api/product/create', False, False, 'productCreate'),
- ('__tests__/api/api.test', 'POST', '/api/product/detail', False, False, 'productDetail'),
- ('__tests__/api/api.test', 'POST', '/api/product/list', False, False, 'productList'),
- ('__tests__/api/api.test', 'POST', '/api/product/order/create', False, False, 'productOrderCreate'),
- ('__tests__/api/api.test', 'POST', '/api/rewards', True, False, 'createReward'),
- ('__tests__/api/api.test', 'POST', '/api/rewards//:var/exchange', True, True, 'exchangeReward'),
- ('__tests__/api/api.test', 'POST', '/api/rewards/wishlist', True, False, 'getWishlist'),
- ('__tests__/api/api.test', 'POST', '/api/stats/child-completion', True, False, 'getChildCompletionStats'),
- ('__tests__/api/api.test', 'POST', '/api/stats/child/overview', True, False, 'getChildOverview'),
- ('__tests__/api/api.test', 'POST', '/api/survey/status', True, False, 'getSurveyStatus'),
- ('__tests__/api/api.test', 'POST', '/api/tasks//:var', True, True, 'deleteTask'),
- ('__tests__/api/api.test', 'POST', '/api/tasks//:var/complete', True, True, 'completeTask'),
- ('__tests__/api/api.test', 'POST', '/api/tasks//:var/review', True, True, 'approveTask'),
- ('__tests__/api/api.test', 'POST', '/api/tasks//:var/review', True, True, 'rejectTask'),
- ('__tests__/api/api.test', 'POST', '/api/tasks//:var/review', True, True, 'reviewTask'),
- ('__tests__/api/api.test', 'POST', '/api/tasks/batch-complete', True, False, 'batchCompleteTasks'),
- ('__tests__/api/api.test', 'POST', '/api/tasks/create', True, False, 'createTask'),
- ('__tests__/api/api.test', 'POST', '/api/tasks/history', True, False, 'getTaskHistory'),
- ('__tests__/api/api.test', 'POST', '/api/tasks/pending-review', True, False, 'getPendingReviewTasks'),
- ('__tests__/api/api.test', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
- ('__tests__/api/api.test', 'POST', '/api/tasks/today', True, False, 'getTodayTasksByCategory'),
- ('__tests__/api/api.test', 'POST', '/api/tasks/today-parent', True, False, 'getTodayParentTasks'),
- ('__tests__/api/api.test', 'POST', '/api/user/info', True, False, 'getUserInfo'),
- ('__tests__/api/api.test', 'POST', '/api/user/join-family', True, False, 'joinFamily'),
- ('__tests__/api/api.test', 'POST', '/api/family/user/switch-back-to-parent', True, False, 'switchBackToParent'),
- ('__tests__/api/api.test', 'POST', '/api/family/user/switch-mode', True, False, 'switchMode'),
- ('__tests__/api/api.test', 'POST', '/api/family/user/switch-to-child', True, False, 'switchToChild'),
- ('__tests__/api/api.test', 'POST', '/api/user/update', True, False, 'updateUserInfo'),
- ('__tests__/api/api.test', 'POST', '/api/vendor/apply', True, False, 'vendorApply'),
- ('__tests__/api/api.test', 'POST', '/api/vendor/info', False, False, 'vendorInfo'),
- ('__tests__/api/api.test', 'POST', '/api/vendor/status', False, False, 'vendorStatus'),
- ('__tests__/api/api.test', 'POST', '/api/wealth/checkin/list', True, False, 'getCheckinList'),
- ('__tests__/api/api.test', 'POST', '/api/wealth/insurance/list', False, False, 'getInsuranceList'),
- ('__tests__/api/api.test', 'POST', '/api/wishes//:var/approve-exchange', True, True, 'approveWishExchange'),
- ('__tests__/api/api.test', 'POST', '/api/wishes//:var/price', True, True, 'setWishPrice'),
- ('__tests__/api/api.test', 'POST', '/api/wishes/create', True, False, 'createWish'),
- ('__tests__/api/api.test', 'POST', '/api/wishes/list', True, False, 'getWishes'),
- ('__tests__/api/api.test', 'POST', '/api/wishes/pending', True, False, 'getPendingWishes'),
- ('__tests__/api/api.test', 'POST', '/api/withdrawal/apply', True, False, 'applyWithdrawal'),
- ('__tests__/store/store.test', 'POST', '/api/auth/switch-role', True, False, 'switchRole'),
- ('components/DimensionActivities', 'POST', '/api/activity/list', False, False, 'getActivityList'),
- ('components/DimensionActivities', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('components/DimensionProducts', 'POST', '/api/recommend/dimension-products', True, False, 'getDimensionProducts'),
- ('components/DimensionTasks', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
- ('components/MemberSelector', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
- ('components/MemberSelector', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('components/MemberSelector', 'POST', '/api/family/relationship/pairwise', True, False, 'getPairwiseRelationships'),
- ('components/MemberSelector', 'POST', '/api/family/user/create-family', True, False, 'createFamily'),
- ('components/OnboardingGuide', 'POST', '/api/guide-config/current', True, False, 'getGuideConfig'),
- ('components/OnboardingProgressBar', 'POST', '/api/onboarding/progress', True, False, 'getOnboardingProgress'),
- ('components/RelatedContent', 'POST', '/api/content/related-items', True, False, 'getContentRelated'),
- ('components/daily-task-card', 'POST', '/api/daily-task/overview', True, False, 'getDailyTaskOverview'),
- ('components/login-sheet', 'POST', '/api/auth/wechat-phone-login', False, False, 'wechatPhoneLogin'),
- ('components/share-mixin', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
- ('pages/achievement/index', 'POST', '/api/badges/child/list', True, False, 'getChildBadges'),
- ('pages/action-detail/components/PearlDiagram', 'POST', '/api/pearl/interaction/add', True, False, 'addPearlInteraction'),
- ('pages/action-detail/components/PearlDiagram', 'POST', '/api/pearl/item/update-priority', True, False, 'updatePearlPriority'),
- ('pages/action-detail/contact-detail', 'POST', '/api/contact/delete', True, False, 'deleteContact'),
- ('pages/action-detail/contact-detail', 'POST', '/api/contact/detail', True, False, 'getContactDetail'),
- ('pages/action-detail/contact-detail', 'POST', '/api/contact/interaction', True, False, 'recordContactInteraction'),
- ('pages/action-detail/contact-detail', 'POST', '/api/contact/update', True, False, 'updateContact'),
- ('pages/action-detail/index', 'POST', '/api/ability/map', True, False, 'getAbilityMap'),
- ('pages/action-detail/index', 'POST', '/api/content-sections/visible', True, False, 'getVisibleSections'),
- ('pages/action-detail/index', 'POST', '/api/dimension/radar-data', True, False, 'getRadarData'),
- ('pages/action-detail/index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/action-detail/index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
- ('pages/action-detail/index', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/action-detail/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/action-detail/index', 'POST', '/api/octopus/analysis/summary', True, False, 'getOctopusAnalysisSummary'),
- ('pages/action-detail/index', 'POST', '/api/octopus/effect/key-persons', True, False, 'getOctopusEffectKeyPersons'),
- ('pages/action-detail/index', 'POST', '/api/octopus/effect/list', True, False, 'getOctopusEffects'),
- ('pages/action-detail/index', 'POST', '/api/pearl/item/delete', True, False, 'deletePearlResource'),
- ('pages/action-detail/index', 'POST', '/api/pearl/reminder/list', True, False, 'getPearlReminders'),
- ('pages/action-detail/index', 'POST', '/api/pearl/resources', True, False, 'getPearlResources'),
- ('pages/action-detail/interaction-log', 'POST', '/api/family/interaction/add', True, False, 'addInteraction'),
- ('pages/action-detail/interaction-log', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/action-detail/interaction-log', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/action-detail/member-action-detail', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/action-detail/member-action-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/action-detail/octopus-add-effect', 'POST', '/api/octopus/effect/add', True, False, 'addOctopusEffect'),
- ('pages/action-detail/octopus-add-effect', 'POST', '/api/octopus/key-person/bind-system-user', True, False, 'bindOctopusKeyPersonSystemUser'),
- ('pages/action-detail/octopus-add-effect', 'POST', '/api/octopus/key-person/list', True, False, 'getOctopusKeyPersons'),
- ('pages/action-detail/octopus-add-effect', 'POST', '/api/octopus/key-person/match-by-phone', True, False, 'matchOctopusKeyPersonByPhone'),
- ('pages/action-detail/octopus-add-key-person', 'POST', '/api/octopus/key-person/add', True, False, 'addOctopusKeyPerson'),
- ('pages/action-detail/octopus-add-key-person', 'POST', '/api/octopus/key-person/list', True, False, 'getOctopusKeyPersons'),
- ('pages/action-detail/octopus-effects-list', 'POST', '/api/octopus/effect/delete', True, False, 'deleteOctopusEffect'),
- ('pages/action-detail/octopus-effects-list', 'POST', '/api/octopus/effect/list', True, False, 'getOctopusEffects'),
- ('pages/action-detail/pearl-add-resource', 'POST', '/api/contact/list', True, False, 'getContactList'),
- ('pages/action-detail/pearl-add-resource', 'POST', '/api/pearl/connection-types', True, False, 'getConnectionTypes'),
- ('pages/action-detail/pearl-add-resource', 'POST', '/api/pearl/item/add', True, False, 'addPearlResource'),
- ('pages/action-detail/relationship-questionnaire', 'POST', '/api/family/questionnaire/generate', True, False, 'generateQuestionnaire'),
- ('pages/action-detail/relationship-questionnaire', 'POST', '/api/family/questionnaire/submit', True, False, 'submitQuestionnaire'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/cancel-registration', False, False, 'cancelActivityRegistration'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/checkin', False, False, 'activityCheckin'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/detail', False, False, 'getActivityDetail'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/feedback/my', False, False, 'getMyActivityFeedback'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/feedback/submit', False, False, 'submitActivityFeedback'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/order/create', False, False, 'createActivityOrder'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/registration-roster', False, False, 'getActivityRegistrationRoster'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/poster-template/list', True, False, 'getPosterTemplates'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/share/qrcode', True, False, 'getShareQrCode'),
- ('pages/activity/activity-detail/activity-detail', 'POST', '/api/user/profile/backfill', True, False, 'backfillProfile'),
- ('pages/activity/create', 'POST', '/api/activity/create', False, False, 'adminCreateActivity'),
- ('pages/activity/create', 'POST', '/api/activity/detail', False, False, 'getActivityDetail'),
- ('pages/activity/create', 'POST', '/api/activity/publish', False, False, 'adminPublishActivity'),
- ('pages/activity/create', 'POST', '/api/activity/submit-review', False, False, 'submitActivityForReview'),
- ('pages/activity/create', 'POST', '/api/activity/update', False, False, 'adminUpdateActivity'),
- ('pages/activity/create', 'POST', '/api/poster-template/list', True, False, 'getPosterTemplates'),
- ('pages/activity/index', 'POST', '/api/activity/cancel-registration', False, False, 'cancelActivityRegistration'),
- ('pages/activity/index', 'POST', '/api/activity/checkin', False, False, 'activityCheckin'),
- ('pages/activity/index', 'POST', '/api/activity/end', False, False, 'adminEndActivity'),
- ('pages/activity/index', 'POST', '/api/activity/list', False, False, 'getActivityList'),
- ('pages/activity/index', 'POST', '/api/activity/my-registrations', False, False, 'getMyActivityRegistrations'),
- ('pages/activity/index', 'POST', '/api/activity/publish', False, False, 'adminPublishActivity'),
- ('pages/activity/index', 'POST', '/api/activity/submit-review', False, False, 'submitActivityForReview'),
- ('pages/activity/index', 'POST', '/api/admin/activity/list', False, False, 'adminListMyActivities'),
- ('pages/activity/index', 'POST', '/api/admin/activity/withdraw', False, False, 'adminWithdrawActivity'),
- ('pages/activity/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/activity/index', 'POST', '/api/vendor/status', False, False, 'vendorStatus'),
- ('pages/activity/order-pay/order-pay', 'POST', '/api/activity/order/handlePaymentSuccess', False, False, 'handleActivityOrderSuccess'),
- ('pages/activity/order-pay/order-pay', 'POST', '/api/activity/order/pay', False, False, 'payActivityOrder'),
- ('pages/ai/chat', 'POST', '/api/ai/butler/send', False, False, 'aiSendHealthButlerMessage'),
- ('pages/ai/chat', 'POST', '/api/ai/chat/conversations', True, False, 'aiGetConversations'),
- ('pages/ai/chat', 'POST', '/api/ai/chat/messages', True, False, 'aiGetMessages'),
- ('pages/ai/chat', 'POST', '/api/ai/health-coach/send', True, False, 'aiSendHealthCoachMessage'),
- ('pages/ai/chat', 'POST', '/api/ai/nutrition/send', True, False, 'aiSendNutritionMessage'),
- ('pages/ai/chat', 'POST', '/api/ai/transcribe', True, False, 'sttTranscribe'),
- ('pages/ai/chat', 'POST', '/api/basic-quota/status/all', True, False, 'getAllQuotaStatus'),
- ('pages/ai/chat', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/ai/chat', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/article-center/article-detail', 'POST', '/api/articles/audio', False, False, 'getArticleAudio'),
- ('pages/article-center/article-detail', 'POST', '/api/articles/complete-read', False, False, 'completeArticleRead'),
- ('pages/article-center/article-detail', 'POST', '/api/articles/detail', False, False, 'getArticleDetail'),
- ('pages/article-center/article-detail', 'POST', '/api/articles/quiz/generate', False, False, 'generateQuiz'),
- ('pages/article-center/article-detail', 'POST', '/api/articles/quiz/submit', False, False, 'submitQuiz'),
- ('pages/article-center/article-detail', 'POST', '/api/articles/report-reading-time', False, False, 'reportReadingTime'),
- ('pages/article-center/article-detail', 'POST', '/api/share/qrcode', True, False, 'getShareQrCode'),
- ('pages/article-center/article-detail', 'POST', '/api/tasks//:var/complete', True, True, 'completeTask'),
- ('pages/article-center/article-edit', 'POST', '/api/articles/publish', False, False, 'publishArticle'),
- ('pages/article-center/index', 'POST', '/api/articles/featured', False, False, 'getFeaturedArticles'),
- ('pages/article-center/index', 'POST', '/api/articles/list', False, False, 'getArticleList'),
- ('pages/article-center/my-posts', 'POST', '/api/articles/my-posts', False, False, 'getMyPosts'),
- ('pages/assessment-plan/detail', 'POST', '/api/dan-assessment/result/plans/list', False, False, 'getMyAssessmentPlans'),
- ('pages/assessment-plan/list', 'POST', '/api/dan-assessment/result/plans/list', False, False, 'getMyAssessmentPlans'),
- ('pages/assessment/apply', 'POST', '/api/assessment/appointment/create', True, False, 'createAssessmentAppointmentWithQuota'),
- ('pages/assessment/apply', 'POST', '/api/assessment/quota/my-list', True, False, 'getAssessmentQuotas'),
- ('pages/assessment/apply', 'POST', '/api/guide/invite-code/validate', False, False, 'validateInviteCode'),
- ('pages/assessment/apply', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/assessment/apply', 'POST', '/api/package/available-guides', True, False, 'getAvailableGuides'),
- ('pages/assessment/purchase', 'POST', '/api/dan-assessment/order/create', True, False, 'createAssessmentOrder'),
- ('pages/assessment/purchase', 'POST', '/api/dan-assessment/order/detail', True, False, 'getAssessmentOrderDetail'),
- ('pages/assessment/purchase', 'POST', '/api/guide/invite-code/validate', False, False, 'validateInviteCode'),
- ('pages/assessment/purchase', 'POST', '/api/package/available-guides', True, False, 'getAvailableGuides'),
- ('pages/assessment/quota', 'POST', '/api/assessment/quota/my-list', True, False, 'getAssessmentQuotas'),
- ('pages/assessment/results', 'POST', '/api/dan-assessment/child-results', True, False, 'getChildAssessmentResults'),
- ('pages/assessment/results', 'POST', '/api/dan-assessment/my-results', True, False, 'getMyAssessmentResults'),
- ('pages/assessment/upload-report', 'POST', '/api/dan-assessment/result/upload', False, False, 'uploadAssessmentReport'),
- ('pages/body-detail/dimension-detail', 'POST', '/api/dimension/history', True, False, 'getDimensionHistory'),
- ('pages/body-detail/dimension-detail', 'POST', '/api/dimension/overview', True, False, 'getDimensionOverview'),
- ('pages/body-detail/dimension-questionnaire', 'POST', '/api/articles/submit-answers', False, False, 'submitAnswers'),
- ('pages/body-detail/dimension-questionnaire', 'POST', '/api/dimension/questionnaire', True, False, 'submitDimensionQuestionnaire'),
- ('pages/body-detail/health-dimensions', 'POST', '/api/dimension/overview', True, False, 'getDimensionOverview'),
- ('pages/body-detail/health-dimensions', 'POST', '/api/dimension/upload', True, False, 'uploadDimensionScore'),
- ('pages/body-detail/health-report', 'POST', '/api/health/nutrition/deficiency', True, False, 'getDeficiencyAnalysis'),
- ('pages/body-detail/index', 'POST', '/api/content-sections/visible', True, False, 'getVisibleSections'),
- ('pages/body-detail/index', 'POST', '/api/dimension/overview', True, False, 'getDimensionOverview'),
- ('pages/body-detail/index', 'POST', '/api/dimension/radar-data', True, False, 'getRadarData'),
- ('pages/body-detail/index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/body-detail/index', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/body-detail/index', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
- ('pages/body-detail/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/body-detail/index', 'POST', '/api/health/gut-flora', True, False, 'getGutFloraIndicators'),
- ('pages/body-detail/index', 'POST', '/api/health/indicators', True, False, 'getLatestIndicators'),
- ('pages/body-detail/index', 'POST', '/api/health/report/body-abnormal', True, False, 'getBodyAbnormalIndicators'),
- ('pages/body-detail/member-body-detail', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/body-detail/member-body-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/butler/apply', 'POST', '/api/butler/apply', False, False, 'butlerApply'),
- ('pages/butler/select', 'POST', '/api/butler/available-list', False, False, 'getAvailableButlers'),
- ('pages/butler/select', 'POST', '/api/butler/my-butler', False, False, 'getMyButler'),
- ('pages/butler/select', 'POST', '/api/butler/select', False, False, 'selectButler'),
- ('pages/child/rewards', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
- ('pages/child/rewards', 'POST', '/api/points/balance', True, False, 'getPointsBalance'),
- ('pages/child/rewards', 'POST', '/api/rewards/wishlist', True, False, 'getWishlist'),
- ('pages/child/rewards', 'POST', '/api/family/user/switch-back-to-parent', True, False, 'switchBackToParent'),
- ('pages/child/tasks', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
- ('pages/child/tasks', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
- ('pages/child/tasks', 'POST', '/api/family/user/switch-back-to-parent', True, False, 'switchBackToParent'),
- ('pages/cognitive-hall', 'POST', '/api/cognitive/child', True, False, 'getCognitiveChildScores'),
- ('pages/cognitive-hall', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/cognitive-test/language-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
- ('pages/cognitive-test/logic-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
- ('pages/cognitive-test/memory-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
- ('pages/cognitive-test/perception-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
- ('pages/cognitive-test/spatial-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
- ('pages/cognitive-test/speed-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
- ('pages/dan-assessment/comparison', 'POST', '/api/dan-report/compare', True, False, 'compareDanReports'),
- ('pages/dan-assessment/comparison', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/diet/index', 'POST', '/api/diet/ingredients/add', True, False, 'addDietIngredient'),
- ('pages/diet/index', 'POST', '/api/diet/ingredients/recommend', True, False, 'refreshDietIngredients'),
- ('pages/diet/index', 'POST', '/api/diet/ingredients/remove', True, False, 'removeDietIngredient'),
- ('pages/diet/index', 'POST', '/api/diet/ingredients/search', True, False, 'searchDietFoods'),
- ('pages/diet/index', 'POST', '/api/diet/ingredients/suggest', True, False, 'getDietIngredients'),
- ('pages/diet/index', 'POST', '/api/diet/meals/config', True, False, 'getMealConfig'),
- ('pages/diet/index', 'POST', '/api/diet/recommendation/generate', True, False, 'generateDietRecommendation'),
- ('pages/diet/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/diet/meal-config', 'POST', '/api/diet/meals/config', True, False, 'getMealConfig'),
- ('pages/diet/meal-config', 'POST', '/api/diet/meals/config/save', False, False, 'saveMealConfig'),
- ('pages/diet/preferences', 'POST', '/api/diet/preferences/current-member', True, False, 'getDietPreferences'),
- ('pages/diet/preferences', 'POST', '/api/diet/preferences/save', True, False, 'saveDietPreferences'),
- ('pages/diet/recommendation', 'POST', '/api/diet/recommendation/complete', True, False, 'completeDietRecommendation'),
- ('pages/diet/recommendation', 'POST', '/api/diet/recommendation/generate', True, False, 'generateDietRecommendation'),
- ('pages/diet/recommendation', 'POST', '/api/diet/recommendation/regenerate', True, False, 'regenerateDietRecommendation'),
- ('pages/diet/recommendation', 'POST', '/api/diet/recommendation/today', True, False, 'getDietRecommendation'),
- ('pages/diet/record-detail', 'POST', '/api/diet/record/daily', True, False, 'getDietDailyRecords'),
- ('pages/diet/records', 'POST', '/api/food/recommendation/members', True, False, 'getCautionFamilyMembers'),
- ('pages/diet/records', 'POST', '/api/health/meal/alerts', True, False, 'getMealAlerts'),
- ('pages/diet/records', 'POST', '/api/health/meal/daily', True, False, 'getMealDaily'),
- ('pages/diet/records', 'POST', '/api/health/meal/weekly', True, False, 'getMealWeekly'),
- ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/cart/add', True, False, 'cartAdd'),
- ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/product/detail', False, False, 'productDetail'),
- ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/product/order/pay', False, False, 'productOrderPay'),
- ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/product/spec/map', False, False, 'productSpecMap'),
- ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/share/qrcode', True, False, 'getShareQrCode'),
- ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/special-price/info', True, False, 'getSpecialPriceInfo'),
- ('pages/discover/circle-feed', 'POST', '/api/circle/comment/add', True, False, 'addCircleComment'),
- ('pages/discover/circle-feed', 'POST', '/api/circle/comment/list', True, False, 'getCircleComments'),
- ('pages/discover/circle-feed', 'POST', '/api/circle/feed', False, False, 'getCircleFeed'),
- ('pages/discover/circle-feed', 'POST', '/api/circle/members', True, False, 'getCircleMembers'),
- ('pages/discover/circle-feed', 'POST', '/api/circle/post/create', True, False, 'createCirclePost'),
- ('pages/discover/circle-feed', 'POST', '/api/circle/post/delete', True, False, 'deleteCirclePost'),
- ('pages/discover/circle-feed', 'POST', '/api/circle/post/like', True, False, 'toggleCircleLike'),
- ('pages/discover/circles', 'POST', '/api/circle/approve', True, False, 'approveCircleMember'),
- ('pages/discover/circles', 'POST', '/api/circle/discover', True, False, 'discoverCircles'),
- ('pages/discover/circles', 'POST', '/api/circle/join', True, False, 'joinGeneralCircle'),
- ('pages/discover/circles', 'POST', '/api/circle/leave', True, False, 'leaveGeneralCircle'),
- ('pages/discover/circles', 'POST', '/api/circle/my-circles', True, False, 'getMyCircles'),
- ('pages/discover/circles', 'POST', '/api/circle/pending-members', True, False, 'getPendingCircleMembers'),
- ('pages/discover/circles', 'POST', '/api/circle/update', True, False, 'updateCircle'),
- ('pages/discover/circles', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/discover/create-circle', 'POST', '/api/circle/create', True, False, 'createGeneralCircle'),
- ('pages/discover/index', 'POST', '/api/articles/featured', False, False, 'getFeaturedArticles'),
- ('pages/discover/index', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/discover/index', 'POST', '/api/product/list', False, False, 'productList'),
- ('pages/energy/detail', 'POST', '/api/energy/logs', True, False, 'getEnergyLogs'),
- ('pages/energy/index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
- ('pages/energy/index', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/energy/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/family/add-member', 'POST', '/api/auth/check-phone', False, False, 'checkPhone'),
- ('pages/family/add-member', 'POST', '/api/consent/record', True, False, 'recordConsent'),
- ('pages/family/add-member', 'POST', '/api/family/member/add', True, False, 'addFamilyMember'),
- ('pages/family/add-member', 'POST', '/api/family/member/update', True, False, 'updateFamilyMember'),
- ('pages/family/manual-score-entry', 'POST', '/api/family/manual-score/submit', True, False, 'submitManualScore'),
- ('pages/family/manual-score-entry', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/family/mbti-entry', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/family/mbti-profile', 'POST', '/api/family/mbti/profile', True, False, 'getMbtiProfile'),
- ('pages/family/mbti-result', 'POST', '/api/family/mbti/latest', True, False, 'getMbtiLatest'),
- ('pages/family/mbti-test', 'POST', '/api/family/mbti/questions', True, False, 'getMbtiQuestions'),
- ('pages/family/mbti-test', 'POST', '/api/family/mbti/submit', True, False, 'submitMbti'),
- ('pages/family/self-check', 'POST', '/api/family/self-check/submit', True, False, 'submitSelfCheck'),
- ('pages/family/self-check-ai', 'POST', '/api/family/self-check/submit', True, False, 'submitSelfCheck'),
- ('pages/family/self-check-entry', 'POST', '/api/family/self-check/ignore', True, False, 'ignoreSelfCheck'),
- ('pages/family/self-check-entry', 'POST', '/api/family/self-check/status', True, False, 'getSelfCheckStatus'),
- ('pages/family/self-check-entry', 'POST', '/api/family/self-check/trend-analysis', True, False, 'getSelfCheckTrendAnalysis'),
- ('pages/family/self-check-result', 'POST', '/api/family/self-check/generate-plan', True, False, 'generateSelfCheckPlan'),
- ('pages/family/self-check-result', 'POST', '/api/family/self-check/history', True, False, 'getSelfCheckHistory'),
- ('pages/family/self-check-result', 'POST', '/api/family/self-check/latest', True, False, 'getSelfCheckLatest'),
- ('pages/family/self-check-result', 'POST', '/api/micro-action/complete', True, False, 'microActionComplete'),
- ('pages/family/self-check-result', 'POST', '/api/micro-action/today', True, False, 'microActionToday'),
- ('pages/games/1a2b', 'POST', '/api/mini-game/complete', True, False, 'completeMiniGame'),
- ('pages/games/list', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/games/list', 'POST', '/api/mini-game/list', True, False, 'getMiniGameList'),
- ('pages/games/records', 'POST', '/api/game/history', True, False, 'getGameHistory'),
- ('pages/games/schulte', 'POST', '/api/mini-game/complete', True, False, 'completeMiniGame'),
- ('pages/games/stats', 'POST', '/api/game/best', True, False, 'getGameBestScores'),
- ('pages/games/stats', 'POST', '/api/game/leaderboard', True, False, 'getGameLeaderboard'),
- ('pages/games/stats', 'POST', '/api/game/stats', True, False, 'getGameStats'),
- ('pages/games/sudoku', 'POST', '/api/mini-game/complete', True, False, 'completeMiniGame'),
- ('pages/growth-main/index', 'POST', '/api/food/recommendation/caution', True, False, 'getFoodCautionList'),
- ('pages/growth-main/index', 'POST', '/api/growth/recommendations', True, False, 'getGrowthRecommendations'),
- ('pages/growth-main/index', 'POST', '/api/health/checkin/list', True, False, 'healthCheckinList'),
- ('pages/growth-main/index', 'POST', '/api/health/exercise/list', True, False, 'getExerciseRecords'),
- ('pages/growth-main/index', 'POST', '/api/health/meal/list', True, False, 'getHealthMealList'),
- ('pages/growth-main/index', 'POST', '/api/health/sleep/list', True, False, 'getSleepRecords'),
- ('pages/growth-main/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/growth-main/index', 'POST', '/api/mind/checkin/list', True, False, 'getEmotionCheckinList'),
- ('pages/growth-main/index', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
- ('pages/growth-main/index', 'POST', '/api/wealth/checkin/list', True, False, 'getCheckinList'),
- ('pages/growth/caution-detail', 'POST', '/api/food/recommendation/caution', True, False, 'getFoodCautionList'),
- ('pages/growth/caution-detail', 'POST', '/api/food/recommendation/members', True, False, 'getCautionFamilyMembers'),
- ('pages/growth/caution-detail', 'POST', '/api/food/recommendation/trend', True, False, 'getFoodCautionTrend'),
- ('pages/growth/caution-detail', 'POST', '/api/health/knowledge/v3/section', True, False, 'getKnowledgeSection'),
- ('pages/growth/challenge-progress', 'POST', '/api/purchase/challenge/progress', True, False, 'getChallengeProgress'),
- ('pages/growth/create', 'POST', '/api/growth/record/create', True, False, 'createGrowthRecord'),
- ('pages/growth/create', 'POST', '/api/growth/record/create-with-order', True, False, 'createGrowthRecord'),
- ('pages/growth/diet-checkin', 'POST', '/api/ai/transcribe', True, False, 'sttTranscribe'),
- ('pages/growth/diet-checkin', 'POST', '/api/basic-quota/status/all', True, False, 'getAllQuotaStatus'),
- ('pages/growth/exercise-checkin', 'POST', '/api/ai/transcribe', True, False, 'sttTranscribe'),
- ('pages/growth/supplement', 'POST', '/api/growth/record/supplement', True, False, 'createGrowthSupplement'),
- ('pages/growth/supplement', 'POST', '/api/growth/record/upload-and-parse', True, False, 'uploadAndParseReport'),
- ('pages/growth/upload', 'POST', '/api/growth/record/create-from-upload', True, False, 'createGrowthRecordFromUpload'),
- ('pages/growth/upload', 'POST', '/api/growth/record/upload-and-parse', True, False, 'uploadAndParseReport'),
- ('pages/growth/upload', 'POST', '/api/product/list', False, False, 'productList'),
- ('pages/guide/activities/detail', 'POST', '/api/guide/activities/create', True, False, 'createActivity'),
- ('pages/guide/activities/detail', 'POST', '/api/guide/activities/detail', True, False, 'getGuideActivityDetail'),
- ('pages/guide/activities/detail', 'POST', '/api/guide/activities/publish', True, False, 'publishActivity'),
- ('pages/guide/activities/detail', 'POST', '/api/guide/activities/update', True, False, 'updateActivity'),
- ('pages/guide/activities/index', 'POST', '/api/guide/activities/cancel', True, False, 'cancelActivity'),
- ('pages/guide/activities/index', 'POST', '/api/guide/activities/delete', True, False, 'deleteActivity'),
- ('pages/guide/activities/index', 'POST', '/api/guide/activities/list', True, False, 'getGuideActivityList'),
- ('pages/guide/activities/index', 'POST', '/api/guide/activities/publish', True, False, 'publishActivity'),
- ('pages/guide/bind/invite', 'POST', '/api/common/qrcode', True, False, 'generateQrCodeFromText'),
- ('pages/guide/bind/invite', 'POST', '/api/guide/bind/confirm', True, False, 'confirmBind'),
- ('pages/guide/bind/invite', 'POST', '/api/guide/bind/invite', True, False, 'generateBindInvite'),
- ('pages/guide/hierarchy/index', 'POST', '/api/guide/all-child-guides', True, False, 'getAllChildGuides'),
- ('pages/guide/hierarchy/index', 'POST', '/api/guide/child-guides', True, False, 'getChildGuides'),
- ('pages/guide/hierarchy/index', 'POST', '/api/guide/parent-guide', True, False, 'getParentGuide'),
- ('pages/guide/packages/create', 'POST', '/api/packages', True, False, 'createPackage'),
- ('pages/guide/packages/detail', 'POST', '/api/packages//:var/items', True, True, 'addPackageItem'),
- ('pages/guide/packages/index', 'POST', '/api/packages//:var/publish', True, True, 'publishPackage'),
- ('pages/guide/packages/index', 'POST', '/api/packages//:var/submit', True, True, 'submitPackageForReview'),
- ('pages/guide/register/index', 'POST', '/api/guide/invite-code/validate', False, False, 'validateInviteCode'),
- ('pages/guide/register/index', 'POST', '/api/guide/register', False, False, 'registerGuide'),
- ('pages/health-main/index', 'POST', '/api/articles/featured', False, False, 'getFeaturedArticles'),
- ('pages/health-main/index', 'POST', '/api/cognitive/child', True, False, 'getCognitiveChildScores'),
- ('pages/health-main/index', 'POST', '/api/cognitive/family', True, False, 'getCognitiveFamilyScores'),
- ('pages/health-main/index', 'POST', '/api/dimension/overview', True, False, 'getDimensionOverview'),
- ('pages/health-main/index', 'POST', '/api/emireport/latest', True, False, 'getEmiReport'),
- ('pages/health-main/index', 'POST', '/api/energy/wealth-detail', True, False, 'getWealthDetail'),
- ('pages/health-main/index', 'POST', '/api/family/relationship/scores', True, False, 'getRelationshipScores'),
- ('pages/health-main/index', 'POST', '/api/health/plan/list', True, False, 'getHealthPlanList'),
- ('pages/health-main/index', 'POST', '/api/health/report/list', True, False, 'getReportList'),
- ('pages/health-main/index', 'POST', '/api/survey/status', True, False, 'getSurveyStatus'),
- ('pages/health/bodyfat-confirm', 'POST', '/api/health/report/bodyfat-save', True, False, 'saveBodyFatMetrics'),
- ('pages/health/challenge-manage', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/health/challenge-manage', 'POST', '/api/health/challenge/create', True, False, 'createChallenge'),
- ('pages/health/challenge-manage', 'POST', '/api/health/challenge/history', True, False, 'getChallengeHistory'),
- ('pages/health/challenge-manage', 'POST', '/api/health/challenge/list', True, False, 'getChallengeList'),
- ('pages/health/challenge-manage', 'POST', '/api/health/challenge/respond', True, False, 'respondChallenge'),
- ('pages/health/challenge-manage', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/health/components/MemberChipPicker', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/health/components/feedback-popup', 'POST', '/api/health/feedback/submit', False, False, 'submitFeedback'),
- ('pages/health/doa-index', 'POST', '/api/doa/overview', True, False, 'getDoaOverview'),
- ('pages/health/doa-stage-create', 'POST', '/api/doa/stage/create', True, False, 'createDoaStage'),
- ('pages/health/doa-stage-create', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/health/doa-stage-detail', 'POST', '/api/doa/stage/cancel', True, False, 'cancelDoaStage'),
- ('pages/health/doa-stage-detail', 'POST', '/api/doa/stage/detail', True, False, 'getDoaStageDetail'),
- ('pages/health/doa-week-edit', 'POST', '/api/doa/stage/detail', True, False, 'getDoaStageDetail'),
- ('pages/health/doa-week-edit', 'POST', '/api/doa/week/plan', True, False, 'submitDoaWeekPlan'),
- ('pages/health/doa-week-edit', 'POST', '/api/doa/week/review', True, False, 'submitDoaWeekReview'),
- ('pages/health/gut-flora-detail', 'POST', '/api/family/member/add', True, False, 'addFamilyMember'),
- ('pages/health/gut-flora-detail', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/health/gut-flora-detail', 'POST', '/api/food/recommendation/caution', True, False, 'getFoodCautionList'),
- ('pages/health/gut-flora-detail', 'POST', '/api/health/foods', True, False, 'getHealthFoods'),
- ('pages/health/gut-flora-detail', 'POST', '/api/health/knowledge/query', True, False, 'queryKnowledgeBase'),
- ('pages/health/gut-flora-detail', 'POST', '/api/health/knowledge/v3/indicator/query', True, False, 'queryIndicatorKnowledge'),
- ('pages/health/gut-flora-detail', 'POST', '/api/health/report/confirm', True, False, 'confirmReportPreview'),
- ('pages/health/gut-flora-detail', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
- ('pages/health/gut-flora-detail', 'POST', '/api/health/report/discard', True, False, 'discardReportDraft'),
- ('pages/health/gut-flora-detail', 'POST', '/api/health/report/edit', True, False, 'editHealthReport'),
- ('pages/health/gut-flora-detail', 'POST', '/api/health/report/parse', True, False, 'parseReportDraft'),
- ('pages/health/gut-flora-detail', 'POST', '/api/indicator/change-ranking', True, False, 'getIndicatorChangeRanking'),
- ('pages/health/gut-flora-detail', 'POST', '/api/nutrition/beijing/analysis', True, False, 'getGutFloraAnalysis'),
- ('pages/health/gut-flora-foods-detail', 'POST', '/api/food/recommendation/members', True, False, 'getCautionFamilyMembers'),
- ('pages/health/gut-flora-foods-detail', 'POST', '/api/food/recommendation/trend', True, False, 'getFoodCautionTrend'),
- ('pages/health/gut-flora-foods-detail', 'POST', '/api/health/foods', True, False, 'getHealthFoods'),
- ('pages/health/gut-flora-foods-detail', 'POST', '/api/health/knowledge/v3/food/query', True, False, 'queryFoodKnowledge'),
- ('pages/health/gut-flora-foods-detail', 'POST', '/api/health/report/edit', True, False, 'editHealthReport'),
- ('pages/health/gut-flora-risks-detail', 'POST', '/api/health/knowledge/query', True, False, 'queryKnowledgeBase'),
- ('pages/health/gut-flora-risks-detail', 'POST', '/api/health/knowledge/unified/disease/query', True, False, 'queryDiseaseKnowledge'),
- ('pages/health/gut-flora-risks-detail', 'POST', '/api/health/knowledge/v3/indicator/query', True, False, 'queryIndicatorKnowledge'),
- ('pages/health/gut-flora-risks-detail', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
- ('pages/health/gut-flora-risks-detail', 'POST', '/api/health/report/edit', True, False, 'editHealthReport'),
- ('pages/health/gut-flora-species-detail', 'POST', '/api/health/knowledge/query', True, False, 'queryKnowledgeBase'),
- ('pages/health/gut-flora-species-detail', 'POST', '/api/health/knowledge/v3/bacteria/query', True, False, 'queryBacteriaKnowledge'),
- ('pages/health/gut-flora-species-detail', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
- ('pages/health/gut-flora-species-detail', 'POST', '/api/health/report/edit', True, False, 'editHealthReport'),
- ('pages/health/health-plan-summary', 'POST', '/api/diet/preferences/current-member', True, False, 'getDietPreferences'),
- ('pages/health/health-plan-summary', 'POST', '/api/diet/preferences/save', True, False, 'saveDietPreferences'),
- ('pages/health/health-plan-summary', 'POST', '/api/health-status/get', True, False, 'getHealthStatus'),
- ('pages/health/health-plan-summary', 'POST', '/api/health-status/save', True, False, 'saveHealthStatus'),
- ('pages/health/health-plan-summary', 'POST', '/api/health-status/signature', True, False, 'saveHealthSignature'),
- ('pages/health/health-plan-summary', 'POST', '/api/health/plan/confirm', True, False, 'confirmPlan'),
- ('pages/health/health-plan-summary', 'POST', '/api/health/plan/detail', True, False, 'getHealthPlanDetail'),
- ('pages/health/health-plan-summary', 'POST', '/api/health/plan/generate', True, False, 'generateHealthPlan'),
- ('pages/health/health-plan-summary', 'POST', '/api/health/plan/regenerate-section', True, False, 'regenerateSection'),
- ('pages/health/health-plan-summary', 'POST', '/api/health/plan/save', True, False, 'saveHealthPlan'),
- ('pages/health/health-plan-summary', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/health/health-status-form', 'POST', '/api/health-status/get', True, False, 'getHealthStatus'),
- ('pages/health/health-status-form', 'POST', '/api/health-status/save', True, False, 'saveHealthStatus'),
- ('pages/health/health-survey', 'POST', '/api/diet/preferences/current-member', True, False, 'getDietPreferences'),
- ('pages/health/health-survey', 'POST', '/api/diet/preferences/save', True, False, 'saveDietPreferences'),
- ('pages/health/health-survey', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/health/health-survey', 'POST', '/api/health-status/get', True, False, 'getHealthStatus'),
- ('pages/health/health-survey', 'POST', '/api/health-status/save', True, False, 'saveHealthStatus'),
- ('pages/health/health-survey', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/health/indicator-curve', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/health/indicator-curve', 'POST', '/api/indicator/change-ranking', True, False, 'getIndicatorChangeRanking'),
- ('pages/health/indicator-curve', 'POST', '/api/indicator/trend', True, False, 'getIndicatorTrend'),
- ('pages/health/indicator-quicklook', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/health/indicator-quicklook', 'POST', '/api/indicator/quick-lookup', True, False, 'getIndicatorQuickLookup'),
- ('pages/health/my-feedback', 'POST', '/api/health/feedback/list', False, False, 'getMyReportFeedbacks'),
- ('pages/health/nutrition-profile', 'POST', '/api/health/nutrition/deficiency', True, False, 'getDeficiencyAnalysis'),
- ('pages/health/nutrition-profile', 'POST', '/api/health/nutrition/profile', True, False, 'getChildNutritionProfile'),
- ('pages/health/physical-exam-detail', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
- ('pages/health/plan-list', 'POST', '/api/health/plan/delete', True, False, 'deleteHealthPlan'),
- ('pages/health/plan-list', 'POST', '/api/health/plan/list', True, False, 'getHealthPlanList'),
- ('pages/health/report-confirm', 'POST', '/api/family/member/add', True, False, 'addFamilyMember'),
- ('pages/health/report-confirm', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/health/report-confirm', 'POST', '/api/health/report/parse', True, False, 'parseReportDraft'),
- ('pages/health/report-detail', 'POST', '/api/family/member/add', True, False, 'addFamilyMember'),
- ('pages/health/report-detail', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/health/report-detail', 'POST', '/api/health/report/edit', True, False, 'editHealthReport'),
- ('pages/health/report-detail', 'POST', '/api/health/report/parse', True, False, 'parseReportDraft'),
- ('pages/health/report-detail', 'POST', '/api/health/report/payload', True, False, 'getReportPayload'),
- ('pages/health/report-list', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/health/report-list', 'POST', '/api/health/report/collecting-list', True, False, 'getCollectingReports'),
- ('pages/health/report-list', 'POST', '/api/health/report/delete', True, False, 'deleteReport'),
- ('pages/health/report-list', 'POST', '/api/health/report/list', True, False, 'getReportList'),
- ('pages/health/report-list', 'POST', '/api/health/report/reassign', True, False, 'reassignReport'),
- ('pages/health/report-list', 'POST', '/api/health/report/transfer/approve', True, False, 'approveReportTransfer'),
- ('pages/health/report-list', 'POST', '/api/health/report/transfer/deny', True, False, 'denyReportTransfer'),
- ('pages/health/report-list', 'POST', '/api/health/report/transfer/list', True, False, 'getReportTransferList'),
- ('pages/health/report-survey', 'POST', '/api/health/survey/create', True, False, 'createReportSurvey'),
- ('pages/health/report-survey', 'POST', '/api/health/survey/submit', True, False, 'submitReportSurvey'),
- ('pages/health/report-survey', 'POST', '/api/survey/status', True, False, 'getSurveyStatus'),
- ('pages/health/report-upload', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/health/report-upload', 'POST', '/api/health/report/collect/status', True, False, 'getReportCollectStatus'),
- ('pages/health/report-upload', 'POST', '/api/health/report/transfer/request', True, False, 'requestReportTransfer'),
- ('pages/health/report-upload', 'POST', '/api/health/report/upload-only', True, False, 'uploadReportOnly'),
- ('pages/health/survey-history', 'POST', '/api/survey/history', True, False, 'getSurveyHistory'),
- ('pages/health/survey-history', 'POST', '/api/survey/template/active', True, False, 'getActiveTemplates'),
- ('pages/health/survey-questionnaire', 'POST', '/api/survey/submit', True, False, 'submitSurvey'),
- ('pages/health/survey-questionnaire', 'POST', '/api/survey/template/active', True, False, 'getActiveTemplates'),
- ('pages/health/teacher-service', 'POST', '/api/health-plan/available-teachers', True, False, 'getAvailableTeachers'),
- ('pages/home-pages/child-index', 'POST', '/api/activity/list', False, False, 'getActivityList'),
- ('pages/home-pages/child-index', 'POST', '/api/energy/logs', True, False, 'getEnergyLogs'),
- ('pages/home-pages/child-index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/home-pages/child-index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
- ('pages/home-pages/child-index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/home-pages/child-index', 'POST', '/api/guide-config/current', True, False, 'getGuideConfig'),
- ('pages/home-pages/child-index', 'POST', '/api/guide/popup/consume', True, False, 'consumeGuidePopup'),
- ('pages/home-pages/child-index', 'POST', '/api/guide/popup/list', True, False, 'getGuidePopupList'),
- ('pages/home-pages/child-index', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
- ('pages/home-pages/child-index', 'POST', '/api/unlock/status', True, False, 'getUnlockStatus'),
- ('pages/home-pages/child-index', 'POST', '/api/family/user/switch-mode', True, False, 'switchMode'),
- ('pages/home-pages/components/AdBanner', 'POST', '/api/home-banner/list', True, False, 'getHomeBanners'),
- ('pages/home-pages/components/ContactImport', 'POST', '/api/contact/import-phone', True, False, 'importPhoneContact'),
- ('pages/home-pages/components/DailySummary', 'POST', '/api/feedback/read', False, False, 'markFeedbackRead'),
- ('pages/home-pages/components/DailySummary', 'POST', '/api/feedback/today', False, False, 'getTodayFeedback'),
- ('pages/home-pages/components/MicroActionCard', 'POST', '/api/micro-action/complete', True, False, 'microActionComplete'),
- ('pages/home-pages/components/MicroActionCard', 'POST', '/api/micro-action/today', True, False, 'microActionToday'),
- ('pages/home-pages/member-home-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/home-pages/parent-index', 'POST', '/api/activity/list', False, False, 'getActivityList'),
- ('pages/home-pages/parent-index', 'POST', '/api/articles/featured', False, False, 'getFeaturedArticles'),
- ('pages/home-pages/parent-index', 'POST', '/api/contact/list', True, False, 'getContactList'),
- ('pages/home-pages/parent-index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/home-pages/parent-index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
- ('pages/home-pages/parent-index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/home-pages/parent-index', 'POST', '/api/family/member/switch', True, False, 'switchToFamilyMember'),
- ('pages/home-pages/parent-index', 'POST', '/api/family/self-check/status', True, False, 'getSelfCheckStatus'),
- ('pages/home-pages/parent-index', 'POST', '/api/health/alert/dismiss', True, False, 'dismissAlert'),
- ('pages/home-pages/parent-index', 'POST', '/api/health/alert/list', True, False, 'getActiveAlerts'),
- ('pages/home-pages/parent-index', 'POST', '/api/health/challenge/list', True, False, 'getChallengeList'),
- ('pages/home-pages/parent-index', 'POST', '/api/health/circle/list', True, False, 'getCircleList'),
- ('pages/home-pages/parent-index', 'POST', '/api/health/circle/ranking', True, False, 'getCircleRanking'),
- ('pages/home-pages/parent-index', 'POST', '/api/health/family/ranking', True, False, 'getFamilyRanking'),
- ('pages/home-pages/parent-index', 'POST', '/api/invite/qrcode', True, False, 'getInviteQrCode'),
- ('pages/home-pages/parent-index', 'POST', '/api/parent/dashboard', True, False, 'getParentDashboard'),
- ('pages/home-pages/parent-index', 'POST', '/api/stats/child-completion', True, False, 'getChildCompletionStats'),
- ('pages/home-pages/parent-index', 'POST', '/api/tasks//:var/review', True, True, 'approveTask'),
- ('pages/home-pages/parent-index', 'POST', '/api/tasks//:var/review', True, True, 'rejectTask'),
- ('pages/home-pages/parent-index', 'POST', '/api/tasks/pending-review', True, False, 'getPendingReviewTasks'),
- ('pages/home-pages/parent-index', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
- ('pages/home-pages/parent-index', 'POST', '/api/unlock/status', True, False, 'getUnlockStatus'),
- ('pages/home-pages/parent-index', 'POST', '/api/wishes/pending', True, False, 'getPendingWishes'),
- ('pages/home/app-library', 'POST', '/api/home/app-library', True, False, 'getAppLibrary'),
- ('pages/home/app-library', 'POST', '/api/home/shortcut/reset', True, False, 'resetShortcutConfig'),
- ('pages/home/app-library', 'POST', '/api/home/shortcut/save', True, False, 'saveShortcutConfig'),
- ('pages/index-home/index', 'POST', '/api/activity/list', False, False, 'getActivityList'),
- ('pages/index-home/index', 'POST', '/api/admin/notices/all', True, False, 'getNotices'),
- ('pages/index-home/index', 'POST', '/api/articles/featured', False, False, 'getFeaturedArticles'),
- ('pages/index-home/index', 'POST', '/api/commission/cf/list', True, False, 'getCfList'),
- ('pages/index-home/index', 'POST', '/api/commission/cf/summary', True, False, 'getCfSummary'),
- ('pages/index-home/index', 'POST', '/api/energy/logs', True, False, 'getEnergyLogs'),
- ('pages/index-home/index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/index-home/index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
- ('pages/index-home/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/index-home/index', 'POST', '/api/family/member/switch', True, False, 'switchToFamilyMember'),
- ('pages/index-home/index', 'POST', '/api/family/self-check/status', True, False, 'getSelfCheckStatus'),
- ('pages/index-home/index', 'POST', '/api/guide-config/current', True, False, 'getGuideConfig'),
- ('pages/index-home/index', 'POST', '/api/guide/parent-invite/accept', True, False, 'acceptParentInvite'),
- ('pages/index-home/index', 'POST', '/api/guide/popup/consume', True, False, 'consumeGuidePopup'),
- ('pages/index-home/index', 'POST', '/api/guide/popup/list', True, False, 'getGuidePopupList'),
- ('pages/index-home/index', 'POST', '/api/health/challenge/list', True, False, 'getChallengeList'),
- ('pages/index-home/index', 'POST', '/api/health/challenge/progress', True, False, 'updateChallengeProgress'),
- ('pages/index-home/index', 'POST', '/api/health/challenge/respond', True, False, 'respondChallenge'),
- ('pages/index-home/index', 'POST', '/api/home/app-library', True, False, 'getAppLibrary'),
- ('pages/index-home/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/index-home/index', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
- ('pages/index-home/index', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/index-home/index', 'POST', '/api/notification/list', True, False, 'getNotificationList'),
- ('pages/index-home/index', 'POST', '/api/notification/read', True, False, 'readNotification'),
- ('pages/index-home/index', 'POST', '/api/points/logs', True, False, 'getPointsLogs'),
- ('pages/index-home/index', 'POST', '/api/survey/status', True, False, 'getSurveyStatus'),
- ('pages/index-home/index', 'POST', '/api/tasks/history', True, False, 'getTaskHistory'),
- ('pages/index-home/index', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
- ('pages/invite/join', 'POST', '/api/family/invite/check-family', False, False, 'checkUserFamily'),
- ('pages/invite/join', 'POST', '/api/family/invite/validate', False, False, 'validateInvitation'),
- ('pages/invite/join', 'POST', '/api/family/invite/validate-family-code', False, False, 'validateFamilyCode'),
- ('pages/invite/join', 'POST', '/api/invite/bind', True, False, 'bindReferral'),
- ('pages/invite/join-form', 'POST', '/api/family/invite/request-join-by-code', False, False, 'requestJoinByCode'),
- ('pages/invite/join-form', 'POST', '/api/user/update', True, False, 'updateUserInfo'),
- ('pages/login/scan-login', 'POST', '/api/auth/wechat-web/scan', False, False, 'wechatWebScan'),
- ('pages/match/street-match', 'POST', '/api/admin/families/count', True, False, 'countFamiliesByStreetIds'),
- ('pages/match/street-match', 'POST', '/api/admin/teachers/count', True, False, 'countTeachersByStreetIds'),
- ('pages/meal/log', 'POST', '/api/meal/log', True, False, 'logMeal'),
- ('pages/meal/log', 'POST', '/api/meal/logs', True, False, 'getMealLogs'),
- ('pages/meal/log', 'POST', '/api/meal/nutrition-summary', True, False, 'getNutritionSummary'),
- ('pages/meal/preference', 'POST', '/api/nutrition/profile/get', True, False, 'getNutritionProfile'),
- ('pages/meal/preference', 'POST', '/api/nutrition/profile/save', True, False, 'saveNutritionProfile'),
- ('pages/meal/recommend', 'POST', '/api/meal/recommend', True, False, 'getMealRecommend'),
- ('pages/meal/recommend', 'POST', '/api/meal/replace', True, False, 'replaceFood'),
- ('pages/member-detail/components/member-detail-sections/action-section', 'POST', '/api/activity/list', False, False, 'getActivityList'),
- ('pages/member-detail/components/member-detail-sections/action-section', 'POST', '/api/tasks/today', True, False, 'getTodayTasksByCategory'),
- ('pages/member-detail/components/member-detail-sections/action-section', 'POST', '/api/wealth/checkin/stats', True, False, 'getCheckinStats'),
- ('pages/member-detail/components/member-detail-sections/body-section', 'POST', '/api/dimension/overview', True, False, 'getDimensionOverview'),
- ('pages/member-detail/components/member-detail-sections/body-section', 'POST', '/api/health/analysis', True, False, 'getHealthAnalysis'),
- ('pages/member-detail/components/member-detail-sections/body-section', 'POST', '/api/wealth/checkin/list', True, False, 'getCheckinList'),
- ('pages/member-detail/components/member-detail-sections/mind-section', 'POST', '/api/contact/list', True, False, 'getContactList'),
- ('pages/member-detail/components/member-detail-sections/mind-section', 'POST', '/api/family/relationship/health-alerts', True, False, 'getHealthAlerts'),
- ('pages/member-detail/components/member-detail-sections/mind-section', 'POST', '/api/family/relationship/milestones', True, False, 'getMilestones'),
- ('pages/member-detail/components/member-detail-sections/mind-section', 'POST', '/api/family/relationship/scores', True, False, 'getRelationshipScores'),
- ('pages/member-detail/components/member-detail-sections/wisdom-section', 'POST', '/api/assessment/history', True, False, 'getAssessmentHistory'),
- ('pages/member-detail/components/member-detail-sections/wisdom-section', 'POST', '/api/assessment/latest-result', True, False, 'getAssessmentLatestResult'),
- ('pages/member-detail/member-detail', 'POST', '/api/activity/list', False, False, 'getActivityList'),
- ('pages/member-detail/member-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/member-detail/report-detail', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
- ('pages/membership/benefits', 'POST', '/api/membership/benefits', True, False, 'getMembershipBenefits'),
- ('pages/membership/benefits', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/membership/index', 'POST', '/api/butler/my-butler', False, False, 'getMyButler'),
- ('pages/membership/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/membership/index', 'POST', '/api/membership/benefits', True, False, 'getMembershipBenefits'),
- ('pages/membership/index', 'POST', '/api/membership/compare', True, False, 'getMembershipCompare'),
- ('pages/membership/index', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/membership/pay', 'POST', '/api/coupon/list', True, False, 'getCouponList'),
- ('pages/membership/pay', 'POST', '/api/membership/orders', True, False, 'createOrder'),
- ('pages/membership/pay', 'POST', '/api/membership/orders/continue', True, False, 'nextOrder'),
- ('pages/membership/pay', 'POST', '/api/membership/plans', True, False, 'getMembershipPlans'),
- ('pages/membership/result', 'POST', '/api/coupon/join-rules', True, False, 'getJoinCouponRules'),
- ('pages/membership/result', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/membership/result', 'POST', '/api/membership/orders/continue', True, False, 'nextOrder'),
- ('pages/membership/upgrade', 'POST', '/api/coupon/join-rules', True, False, 'getJoinCouponRules'),
- ('pages/membership/upgrade', 'POST', '/api/membership/compare', True, False, 'getMembershipCompare'),
- ('pages/membership/upgrade', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/membership/upgrade', 'POST', '/api/membership/plans', True, False, 'getMembershipPlans'),
- ('pages/membership/upgrade', 'POST', '/api/membership/upgrade-records', True, False, 'getUpgradeRecords'),
- ('pages/mind-detail/articles', 'POST', '/api/articles/categories', False, False, 'getArticleCategories'),
- ('pages/mind-detail/articles', 'POST', '/api/articles/list', False, False, 'getArticleList'),
- ('pages/mind-detail/components/PsychCrisisBanner', 'POST', '/api/health/alert/dismiss', True, False, 'dismissAlert'),
- ('pages/mind-detail/emotion-report', 'POST', '/api/emireport/latest', True, False, 'getEmiReport'),
- ('pages/mind-detail/family-dashboard', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/mind-detail/family-dashboard', 'POST', '/api/mind/fortune', True, False, 'getFamilyFortune'),
- ('pages/mind-detail/family-dashboard', 'POST', '/api/mind/fortune/month', True, False, 'getMonthFortune'),
- ('pages/mind-detail/family-dashboard', 'POST', '/api/mind/fortune/reports', True, False, 'getFortuneReports'),
- ('pages/mind-detail/family-dashboard', 'POST', '/api/mind/fortune/week', True, False, 'getWeekFortune'),
- ('pages/mind-detail/index', 'POST', '/api/contact/list', True, False, 'getContactList'),
- ('pages/mind-detail/index', 'POST', '/api/content-sections/visible', True, False, 'getVisibleSections'),
- ('pages/mind-detail/index', 'POST', '/api/dan-assessment/report/child', True, False, 'getDanReportByChild'),
- ('pages/mind-detail/index', 'POST', '/api/dimension/radar-data', True, False, 'getRadarData'),
- ('pages/mind-detail/index', 'POST', '/api/emireport/latest', True, False, 'getEmiReport'),
- ('pages/mind-detail/index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/mind-detail/index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
- ('pages/mind-detail/index', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/mind-detail/index', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
- ('pages/mind-detail/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/mind-detail/index', 'POST', '/api/family/relationship/health-alerts', True, False, 'getHealthAlerts'),
- ('pages/mind-detail/index', 'POST', '/api/family/relationship/milestones', True, False, 'getMilestones'),
- ('pages/mind-detail/index', 'POST', '/api/health/indicators', True, False, 'getLatestIndicators'),
- ('pages/mind-detail/index', 'POST', '/api/mind/fortune', True, False, 'getFamilyFortune'),
- ('pages/mind-detail/innate-portrait', 'POST', '/api/mind/innate/reading', True, False, 'getInnateReading'),
- ('pages/mind-detail/innate-trajectory', 'POST', '/api/mind/innate/trajectory', True, False, 'getInnateTrajectory'),
- ('pages/mind-detail/member-mind-detail', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/mind-detail/member-mind-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/mind-detail/training', 'POST', '/api/game/stats', True, False, 'getGameStats'),
- ('pages/notification/index', 'POST', '/api/notification/list', True, False, 'getNotificationList'),
- ('pages/notification/index', 'POST', '/api/notification/read', True, False, 'readNotification'),
- ('pages/nutritionist/apply', 'POST', '/api/nutritionist/apply', False, False, 'nutritionistApply'),
- ('pages/orchestration/editor', 'POST', '/api/admin/task-templates', True, False, 'getNodeTemplateList'),
- ('pages/orchestration/editor', 'POST', '/api/orchestration/flow/detail', True, False, 'getOrchestrationFlowDetail'),
- ('pages/orchestration/editor', 'POST', '/api/orchestration/flow/publish', True, False, 'publishOrchestrationFlow'),
- ('pages/orchestration/editor', 'POST', '/api/orchestration/flow/save', True, False, 'saveOrchestrationFlow'),
- ('pages/orchestration/index', 'POST', '/api/orchestration/flow/archive', True, False, 'archiveOrchestrationFlow'),
- ('pages/orchestration/index', 'POST', '/api/orchestration/flow/delete', True, False, 'deleteOrchestrationFlow'),
- ('pages/orchestration/index', 'POST', '/api/orchestration/flow/list', True, False, 'getOrchestrationFlowList'),
- ('pages/orchestration/index', 'POST', '/api/orchestration/flow/publish', True, False, 'publishOrchestrationFlow'),
- ('pages/orchestration/node-edit', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/parent/appointments', 'POST', '/api/dan-assessment/appointment/cancel', True, False, 'cancelAppointment'),
- ('pages/parent/appointments', 'POST', '/api/dan-assessment/appointment/user', True, False, 'getMyAppointments'),
- ('pages/parent/child-detail', 'POST', '/api/tasks/pending-review', True, False, 'getPendingReviewTasks'),
- ('pages/parent/child-detail', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
- ('pages/parent/child-detail', 'POST', '/api/wishes/pending', True, False, 'getPendingWishes'),
- ('pages/parent/plans/detail', 'POST', '/api/guide/plans/detail', True, False, 'getGuidePlanDetail'),
- ('pages/parent/plans/index', 'POST', '/api/guide/plans/family-list', True, False, 'listFamilyPlans'),
- ('pages/parent/wishes/index', 'POST', '/api/wishes//:var/approve-exchange', True, True, 'approveWishExchange'),
- ('pages/parent/wishes/index', 'POST', '/api/wishes//:var/fulfill', True, True, 'markWishFulfilled'),
- ('pages/parent/wishes/index', 'POST', '/api/wishes//:var/price', True, True, 'setWishPrice'),
- ('pages/parent/wishes/index', 'POST', '/api/wishes//:var/reject', True, True, 'rejectWish'),
- ('pages/parent/wishes/index', 'POST', '/api/wishes/list', True, False, 'getWishes'),
- ('pages/parent/wishes/index', 'POST', '/api/wishes/pending', True, False, 'getPendingWishes'),
- ('pages/pearl-reminders/index', 'POST', '/api/pearl/interaction/add', True, False, 'addPearlInteraction'),
- ('pages/pearl-reminders/index', 'POST', '/api/pearl/reminder/list', True, False, 'getPearlReminders'),
- ('pages/profile-extra/coupons', 'POST', '/api/coupon/claim', True, False, 'claimCoupon'),
- ('pages/profile-extra/coupons', 'POST', '/api/coupon/exchangeable', True, False, 'getExchangeableCoupons'),
- ('pages/profile-extra/coupons', 'POST', '/api/coupon/my', True, False, 'getMyCoupons'),
- ('pages/profile-extra/coupons', 'POST', '/api/family-platform/exchange-coupon', True, False, 'exchangeCouponByCf'),
- ('pages/profile-extra/family-members', 'POST', '/api/family/invite/generate', False, False, 'generateFamilyInvite'),
- ('pages/profile-extra/family-members', 'POST', '/api/family/invite/pending-requests', False, False, 'getPendingJoinRequests'),
- ('pages/profile-extra/family-members', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
- ('pages/profile-extra/family-members', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/profile-extra/family-members', 'POST', '/api/family/member/switch', True, False, 'switchToFamilyMember'),
- ('pages/profile-extra/family-members', 'POST', '/api/health/report/member-permission/revoke', True, False, 'revokeReportMemberPermission'),
- ('pages/profile-extra/family-members', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/profile-extra/gates', 'POST', '/api/unlock/status', True, False, 'getUnlockStatus'),
- ('pages/profile-extra/onboarding', 'POST', '/api/onboarding/claim', True, False, 'claimOnboardingReward'),
- ('pages/profile-extra/onboarding', 'POST', '/api/onboarding/progress', True, False, 'getOnboardingProgress'),
- ('pages/profile-main/profile', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
- ('pages/profile-main/profile', 'POST', '/api/cart/count', True, False, 'cartCount'),
- ('pages/profile-main/profile', 'POST', '/api/commission/my-referrer', True, False, 'getMyReferrer'),
- ('pages/profile-main/profile', 'POST', '/api/commission/team/consumption', True, False, 'getTeamConsumption'),
- ('pages/profile-main/profile', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
- ('pages/profile-main/profile', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/profile-main/profile', 'POST', '/api/health/challenge/list', True, False, 'getChallengeList'),
- ('pages/profile-main/profile', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
- ('pages/profile-main/profile', 'POST', '/api/invite/summary', True, False, 'getReferralSummary'),
- ('pages/profile-main/profile', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/profile-main/profile', 'POST', '/api/product/order/my/counts', False, False, 'getOrderCounts'),
- ('pages/profile-main/profile', 'POST', '/api/share/qrcode', True, False, 'getShareQrCode'),
- ('pages/profile-main/profile', 'POST', '/api/tasks/today', True, False, 'getTodayTasksByCategory'),
- ('pages/profile-main/profile', 'POST', '/api/user/info', True, False, 'getUserInfo'),
- ('pages/profile-main/profile', 'POST', '/api/user/profile-stats', True, False, 'getProfileStats'),
- ('pages/profile-main/profile', 'POST', '/api/vendor/status', False, False, 'vendorStatus'),
- ('pages/profile/components/ProfileHeader', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
- ('pages/profile/components/ProfileHeader', 'POST', '/api/family/member/switch', True, False, 'switchToFamilyMember'),
- ('pages/profile/components/ProfileMenu', 'POST', '/api/auth/set-password', False, False, 'setPassword'),
- ('pages/profile/components/ProfileMenu', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
- ('pages/profile/components/ProfileMenu', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/profile/components/ProfileMenu', 'POST', '/api/family/user/members/update-visibility', True, False, 'updateMemberVisibility'),
- ('pages/profile/components/ProfileMenu', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
- ('pages/profile/components/ProfileMenu', 'POST', '/api/vendor/status', False, False, 'vendorStatus'),
- ('pages/profile/components/ProfileStats', 'POST', '/api/user/action-stats', True, False, 'getUserActionStats'),
- ('pages/profile/index', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
- ('pages/profile/message-history', 'POST', '/api/commission/cf/list', True, False, 'getCfList'),
- ('pages/profile/message-history', 'POST', '/api/energy/logs', True, False, 'getEnergyLogs'),
- ('pages/profile/message-history', 'POST', '/api/notification/list', True, False, 'getNotificationList'),
- ('pages/profile/message-history', 'POST', '/api/notification/read', True, False, 'readNotification'),
- ('pages/profile/message-history', 'POST', '/api/points/logs', True, False, 'getPointsLogs'),
- ('pages/profile/portrait-edit', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
- ('pages/profile/portrait-edit', 'POST', '/api/user/portrait/edit', True, False, 'editPortrait'),
- ('pages/profile/portrait-edit', 'POST', '/api/user/portrait/get', True, False, 'getPortrait'),
- ('pages/profile/report-detail', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
- ('pages/profile/report-management', 'POST', '/api/report-summary/list', True, False, 'getReportSummaryList'),
- ('pages/profile/service-role-apply', 'POST', '/api/service-role/my-apply', True, False, 'getMyServiceRoleApply'),
- ('pages/profile/service-role-apply', 'POST', '/api/service-role/upload-image', True, False, 'uploadServiceRoleImage'),
- ('pages/promotion/commission', 'POST', '/api/commission/cf/list', True, False, 'getCfList'),
- ('pages/promotion/commission', 'POST', '/api/commission/cf/summary', True, False, 'getCfSummary'),
- ('pages/promotion/index', 'POST', '/api/commission/cf/summary', True, False, 'getCfSummary'),
- ('pages/promotion/index', 'POST', '/api/earnings/admin/distribute', True, False, 'distributeToMember'),
- ('pages/promotion/index', 'POST', '/api/earnings/admin/toggle-member', True, False, 'toggleMemberBalance'),
- ('pages/promotion/index', 'POST', '/api/earnings/admin/withdraw', True, False, 'withdrawFamilyEarnings'),
- ('pages/promotion/index', 'POST', '/api/earnings/family/summary', True, False, 'getFamilyEarningsSummary'),
- ('pages/promotion/index', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
- ('pages/promotion/index', 'POST', '/api/invite/summary', True, False, 'getReferralSummary'),
- ('pages/promotion/invite', 'POST', '/api/invite/bind', True, False, 'bindReferral'),
- ('pages/promotion/invite', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
- ('pages/promotion/invite', 'POST', '/api/invite/list', True, False, 'getReferralList'),
- ('pages/promotion/invite', 'POST', '/api/invite/milestone/claim', True, False, 'claimInviteMilestone'),
- ('pages/promotion/invite', 'POST', '/api/invite/milestone/list', True, False, 'getInviteMilestones'),
- ('pages/promotion/invite', 'POST', '/api/invite/qrcode', True, False, 'getInviteQrCode'),
- ('pages/promotion/invite', 'POST', '/api/invite/summary', True, False, 'getReferralSummary'),
- ('pages/promotion/leaderboard', 'POST', '/api/leaderboard/my-rank', True, False, 'getLeaderboardMyRank'),
- ('pages/promotion/leaderboard', 'POST', '/api/leaderboard/top', True, False, 'getLeaderboardTop'),
- ('pages/promotion/team', 'POST', '/api/commission/cf/rate', True, False, 'getCfRate'),
- ('pages/promotion/team', 'POST', '/api/commission/my-referrer', True, False, 'getMyReferrer'),
- ('pages/promotion/team', 'POST', '/api/commission/team/consumption', True, False, 'getTeamConsumption'),
- ('pages/promotion/team', 'POST', '/api/commission/team/consumption-curve', True, False, 'getTeamAllMembersConsumptionCurve'),
- ('pages/promotion/team', 'POST', '/api/commission/team/growth-curve', True, False, 'getTeamGrowthCurve'),
- ('pages/promotion/team', 'POST', '/api/commission/team/l1-consumption-curve', True, False, 'getTeamL1ConsumptionCurve'),
- ('pages/promotion/team', 'POST', '/api/commission/team/list', True, False, 'getTeamList'),
- ('pages/promotion/team', 'POST', '/api/commission/team/tree', True, False, 'getTeamTree'),
- ('pages/promotion/withdraw', 'POST', '/api/commission/summary', True, False, 'getCommissionSummary'),
- ('pages/promotion/withdraw', 'POST', '/api/withdrawal/apply', True, False, 'applyWithdrawal'),
- ('pages/promotion/withdraw', 'POST', '/api/withdrawal/history', True, False, 'getWithdrawalHistory'),
- ('pages/psych-assessment/index', 'POST', '/api/cognitive/child', True, False, 'getCognitiveChildScores'),
- ('pages/psych-assessment/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/psych-assessment/quiz', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
- ('pages/reminder-config/index', 'POST', '/api/task/reminder-config/get', True, False, 'getReminderConfig'),
- ('pages/reminder-config/index', 'POST', '/api/task/reminder-config/save', True, False, 'saveReminderConfig'),
- ('pages/rewards/badge', 'POST', '/api/badges/child/list', True, False, 'getChildBadges'),
- ('pages/rewards/badge', 'POST', '/api/badges/favorite', True, False, 'toggleBadgeFavorite'),
- ('pages/rewards/badge', 'POST', '/api/badges/list', True, False, 'getActiveBadges'),
- ('pages/rewards/badge', 'POST', '/api/badges/ranking/family', True, False, 'getFamilyBadgeRanking'),
- ('pages/rewards/badge', 'POST', '/api/badges/statistics/child', True, False, 'getChildBadgeStats'),
- ('pages/rewards/rewards', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/rewards/rewards', 'POST', '/api/parent/wishlist', True, False, 'createParentWishlist'),
- ('pages/rewards/rewards', 'POST', '/api/parent/wishlist//:var/exchange', True, True, 'exchangeParentWishlist'),
- ('pages/rewards/rewards', 'POST', '/api/parent/wishlist/list', True, False, 'getParentWishlist'),
- ('pages/rewards/rewards', 'POST', '/api/points/balance', True, False, 'getPointsBalance'),
- ('pages/rewards/rewards', 'POST', '/api/rewards', True, False, 'createReward'),
- ('pages/rewards/rewards', 'POST', '/api/rewards//:var/exchange', True, True, 'exchangeReward'),
- ('pages/rewards/rewards', 'POST', '/api/rewards/wishlist', True, False, 'getWishlist'),
- ('pages/rewards/rewards', 'POST', '/api/user/info', True, False, 'getUserInfo'),
- ('pages/share/index', 'POST', '/api/share/family-footprint', True, False, 'getFamilyFootprint'),
- ('pages/shop/cart/cart', 'POST', '/api/membership/gift-membership-progress', True, False, 'getGiftMembershipProgress'),
- ('pages/shop/cart/cart', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/shop/checkout/checkout', 'POST', '/api/coupon/apply', True, False, 'applyCoupon'),
- ('pages/shop/checkout/checkout', 'POST', '/api/coupon/checkout-list', True, False, 'getCouponCheckoutList'),
- ('pages/shop/checkout/checkout', 'POST', '/api/coupon/list', True, False, 'getCouponList'),
- ('pages/shop/checkout/checkout', 'POST', '/api/family-platform/balance', True, False, 'getFamilyPlatformBalance'),
- ('pages/shop/checkout/checkout', 'POST', '/api/family-platform/exchange-coupon', True, False, 'exchangeCouponByCf'),
- ('pages/shop/checkout/checkout', 'POST', '/api/membership/gift-membership-progress', True, False, 'getGiftMembershipProgress'),
- ('pages/shop/checkout/checkout', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/shop/checkout/checkout', 'POST', '/api/product/detail', False, False, 'productDetail'),
- ('pages/shop/checkout/checkout', 'POST', '/api/product/purchase_fields/required', False, False, 'getProductRequiredFields'),
- ('pages/shop/checkout/checkout', 'POST', '/api/shop/discount/calculate', False, False, 'shopDiscountCalculate'),
- ('pages/shop/checkout/checkout', 'POST', '/api/special-price/info', True, False, 'getSpecialPriceInfo'),
- ('pages/shop/checkout/checkout', 'POST', '/api/user/address/list', True, False, 'addressList'),
- ('pages/shop/consignee-edit/consignee-edit', 'POST', '/api/consignee/detail', True, False, 'consigneeDetail'),
- ('pages/shop/consignee-edit/consignee-edit', 'POST', '/api/consignee/save', True, False, 'consigneeSave'),
- ('pages/shop/consignee-list/consignee-list', 'POST', '/api/consignee/delete', True, False, 'consigneeDelete'),
- ('pages/shop/consignee-list/consignee-list', 'POST', '/api/consignee/list', True, False, 'consigneeList'),
- ('pages/shop/index/index', 'POST', '/api/cart/count', True, False, 'cartCount'),
- ('pages/shop/index/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/shop/index/index', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/shop/index/index', 'POST', '/api/product/list', False, False, 'productList'),
- ('pages/shop/index/index', 'POST', '/api/shop/category/tree', False, False, 'goodsCategory'),
- ('pages/shop/order-detail/order-detail', 'POST', '/api/product/order/cancel', False, False, 'productOrderCancel'),
- ('pages/shop/order-detail/order-detail', 'POST', '/api/product/order/confirm', False, False, 'productOrderConfirm'),
- ('pages/shop/order-detail/order-detail', 'POST', '/api/product/order/detail', False, False, 'productOrderDetail'),
- ('pages/shop/order-list/order-list', 'POST', '/api/product/order/cancel', False, False, 'productOrderCancel'),
- ('pages/shop/order-list/order-list', 'POST', '/api/product/order/confirm', False, False, 'productOrderConfirm'),
- ('pages/shop/order-list/order-list', 'POST', '/api/product/order/my', False, False, 'productOrderMy'),
- ('pages/shop/order-list/order-list', 'POST', '/api/product/order/my/counts', False, False, 'productOrderCounts'),
- ('pages/shop/payment/payment', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/shop/search/search', 'POST', '/api/product/list', False, False, 'productList'),
- ('pages/stats/completion-rate', 'POST', '/api/stats/child-completion', True, False, 'getChildCompletionStats'),
- ('pages/stats/completion-rate', 'POST', '/api/stats/family-completion', True, False, 'getFamilyCompletionStats'),
- ('pages/stats/index', 'POST', '/api/stats/child/overview', True, False, 'getChildOverview'),
- ('pages/tasks/create-task', 'POST', '/api/tasks/create', True, False, 'createTask'),
- ('pages/tasks/create-task', 'POST', '/api/tasks/list', True, False, 'getTaskListForPicker'),
- ('pages/tasks/daily-tasks', 'POST', '/api/growth-task/claim', True, False, 'claimGrowthTaskReward'),
- ('pages/tasks/daily-tasks', 'POST', '/api/growth-task/list', True, False, 'getGrowthTaskList'),
- ('pages/tasks/review', 'POST', '/api/tasks//:var/review', True, True, 'approveTask'),
- ('pages/tasks/review', 'POST', '/api/tasks//:var/review', True, True, 'rejectTask'),
- ('pages/tasks/review', 'POST', '/api/tasks/history', True, False, 'getTaskHistory'),
- ('pages/tasks/review', 'POST', '/api/tasks/pending-review', True, False, 'getPendingReviewTasks'),
- ('pages/tasks/tasks', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/tasks/tasks', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/tasks/tasks', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/tasks/tasks', 'POST', '/api/tasks//:var/complete', True, True, 'completeTask'),
- ('pages/tasks/tasks', 'POST', '/api/tasks/accept', True, False, 'acceptTask'),
- ('pages/tasks/tasks', 'POST', '/api/tasks/create', True, False, 'createTask'),
- ('pages/tasks/tasks', 'POST', '/api/tasks/my-pending', True, False, 'getMyPendingTasks'),
- ('pages/tasks/tasks', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
- ('pages/teacher/chat', 'POST', '/api/guide/messages/list', True, False, 'getGuideMessages'),
- ('pages/teacher/families', 'POST', '/api/guide/families', True, False, 'getBoundFamilies'),
- ('pages/teacher/messages', 'POST', '/api/guide/messages/list', True, False, 'getGuideMessages'),
- ('pages/teacher/orders', 'POST', '/api/guide/orders/list', True, False, 'getGuideOrders'),
- ('pages/teacher/orders', 'POST', '/api/guide/orders/stats', True, False, 'getOrderStats'),
- ('pages/teacher/plan-create', 'POST', '/api/guide/training-plans/create', True, False, 'createTrainingPlan'),
- ('pages/teacher/plan-detail', 'POST', '/api/guide/families//:var/plans//:var/update', True, True, 'updateGuidePlanContent'),
- ('pages/teacher/plan-detail', 'POST', '/api/guide/families//:var/plans/pending', True, True, 'getGuidePendingPlans'),
- ('pages/teacher/plan-list', 'POST', '/api/guide/training-plans/list', True, False, 'getTrainingPlanList'),
- ('pages/teacher/review-family', 'POST', '/api/guide/families//:var/children//:var/pending-review', True, True, 'getGuideChildPendingTasks'),
- ('pages/teacher/review-family', 'POST', '/api/guide/families//:var/members', True, True, 'getGuideFamilyMembers'),
- ('pages/teacher/review-family', 'POST', '/api/guide/families//:var/plans/pending', True, True, 'getGuidePendingPlans'),
- ('pages/teacher/review-family', 'POST', '/api/guide/families//:var/tasks//:var/review', True, True, 'reviewGuideTask'),
- ('pages/teacher/review-family', 'POST', '/api/tasks//:var/review', True, True, 'reviewTask'),
- ('pages/teacher/review-workbench', 'POST', '/api/guide/families/my-families', True, False, 'getGuideMyFamilies'),
- ('pages/teacher/service-tasks', 'POST', '/api/tasks//:var/complete', True, True, 'completeTask'),
- ('pages/teacher/teacher-profile', 'POST', '/api/guide/parent-invite/generate', True, False, 'generateParentInvite'),
- ('pages/teacher/teacher-profile', 'POST', '/api/auth/switch-role', True, False, 'switchRole'),
- ('pages/teacher/team', 'POST', '/api/guide/invite-code/generate', False, False, 'generateInviteCode'),
- ('pages/teacher/team', 'POST', '/api/guide/team/invite-code/generate', True, False, 'generateTeamInviteCode'),
- ('pages/teacher/team', 'POST', '/api/guide/team/members', True, False, 'getTeamMembers'),
- ('pages/teacher/team', 'POST', '/api/guide/team/stats', True, False, 'getTeamStats'),
- ('pages/user-edit/user-edit', 'POST', '/api/auth/direct-register', False, False, 'directRegister'),
- ('pages/user-edit/user-edit', 'POST', '/api/family/invite/request-join-by-code', False, False, 'requestJoinByCode'),
- ('pages/user-edit/user-edit', 'POST', '/api/family/user/create-family', True, False, 'createFamily'),
- ('pages/user-edit/user-edit', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
- ('pages/user-edit/user-edit', 'POST', '/api/user/info', True, False, 'getUserInfo'),
- ('pages/user-edit/user-edit', 'POST', '/api/user/update', True, False, 'updateUserInfo'),
- ('pages/vendor/apply', 'POST', '/api/vendor/apply', True, False, 'vendorApply'),
- ('pages/vendor/center', 'POST', '/api/vendor/info', False, False, 'vendorInfo'),
- ('pages/vendor/center', 'POST', '/api/vendor/status', False, False, 'vendorStatus'),
- ('pages/vendor/order-review/order-review', 'POST', '/api/product/order/detail', False, False, 'productOrderDetail'),
- ('pages/vendor/order-review/order-review', 'POST', '/api/product/order/review/update', False, False, 'productOrderReviewUpdate'),
- ('pages/vendor/orders/orders', 'POST', '/api/product/order/confirm', False, False, 'productOrderConfirm'),
- ('pages/vendor/orders/orders', 'POST', '/api/product/order/vendor', False, False, 'productOrderVendor'),
- ('pages/vendor/product-edit/product-edit', 'POST', '/api/product/create', False, False, 'productCreate'),
- ('pages/vendor/product-edit/product-edit', 'POST', '/api/product/detail', False, False, 'productDetail'),
- ('pages/vendor/product-edit/product-edit', 'POST', '/api/product/update', False, False, 'productUpdate'),
- ('pages/vendor/products/products', 'POST', '/api/product/my', False, False, 'productMy'),
- ('pages/vendor/products/products', 'POST', '/api/product/shelve', False, False, 'productShelve'),
- ('pages/vendor/team-customers/team-customers', 'POST', '/api/admin/supply-team/customers', True, False, 'getTeamCustomers'),
- ('pages/vendor/team-system/team-system', 'POST', '/api/admin/supply-hierarchy/my', True, False, 'getVendorHierarchyInfo'),
- ('pages/vendor/team-system/team-system', 'POST', '/api/admin/supply-system/my-system', True, False, 'getVendorSystemInfo'),
- ('pages/vendor/team-system/team-system', 'POST', '/api/admin/supply-team/customers', True, False, 'getVendorTeamCustomers'),
- ('pages/vendor/team-system/team-system', 'POST', '/api/admin/supply-team/members', True, False, 'getVendorTeamMembers'),
- ('pages/wealth-cf/index', 'GET', '/api/cf/balance', True, False, 'getCfBalance'),
- ('pages/wealth-cf/index', 'GET', '/api/cf/family-coupons', True, False, 'getFamilyCoupons'),
- ('pages/wealth-cf/index', 'GET', '/api/cf/logs', True, False, 'getCfLogs'),
- ('pages/wealth-cf/index', 'POST', '/api/coupon/exchangeable', True, False, 'getExchangeableCoupons'),
- ('pages/wealth-cf/index', 'POST', '/api/family-platform/exchange-coupon', True, False, 'exchangeCouponByCf'),
- ('pages/wealth-detail/member-wealth-detail', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/wealth-detail/member-wealth-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/wealth-sub/checkin', 'POST', '/api/wealth/checkin/create', True, False, 'createCheckin'),
- ('pages/wealth-sub/checkin', 'POST', '/api/wealth/checkin/delete', True, False, 'deleteCheckin'),
- ('pages/wealth-sub/checkin', 'POST', '/api/wealth/checkin/list', True, False, 'getCheckinList'),
- ('pages/wealth-sub/checkin', 'POST', '/api/wealth/checkin/stats', True, False, 'getCheckinStats'),
- ('pages/wealth-sub/insurance-add', 'POST', '/api/wealth/insurance/create', False, False, 'createInsurance'),
- ('pages/wealth-sub/insurance-add', 'POST', '/api/wealth/insurance/detail', False, False, 'getInsuranceDetail'),
- ('pages/wealth-sub/insurance-add', 'POST', '/api/wealth/insurance/update', False, False, 'updateInsurance'),
- ('pages/wealth-sub/insurance-add', 'POST', '/api/wealth/insurance/upload', False, False, 'uploadPolicy'),
- ('pages/wealth-sub/insurance-list', 'POST', '/api/wealth/insurance/delete', False, False, 'deleteInsurance'),
- ('pages/wealth-sub/insurance-list', 'POST', '/api/wealth/insurance/list', False, False, 'getInsuranceList'),
- ('pages/wealth-sub/insurance-planning', 'POST', '/api/insurance/planning', True, False, 'getInsurancePlanning'),
- ('pages/wealth/index', 'POST', '/api/badges/statistics/child', True, False, 'getChildBadgeStats'),
- ('pages/wealth/index', 'POST', '/api/commission/summary', True, False, 'getCommissionSummary'),
- ('pages/wealth/index', 'POST', '/api/daily-task/overview', True, False, 'getDailyTaskOverview'),
- ('pages/wealth/index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/wealth/index', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/wealth/index', 'POST', '/api/energy/wealth-detail', True, False, 'getWealthDetail'),
- ('pages/wealth/index', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
- ('pages/wealth/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/wealth/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/wealth/index', 'POST', '/api/invite/summary', True, False, 'getReferralSummary'),
- ('pages/wealth/index', 'POST', '/api/product/list', False, False, 'productList'),
- ('pages/wealth/index', 'POST', '/api/wealth/insurance/list', False, False, 'getInsuranceList'),
- ('pages/wisdom-detail/cognitive-report', 'POST', '/api/assessment/latest-result', True, False, 'getAssessmentLatestResult'),
- ('pages/wisdom-detail/cognitive-report', 'POST', '/api/cognitive/norms', True, False, 'getCognitiveNorms'),
- ('pages/wisdom-detail/cognitive-report', 'POST', '/api/cognitive/recommendations', True, False, 'getCognitiveRecommendations'),
- ('pages/wisdom-detail/cognitive-report', 'POST', '/api/cognitive/recommendations/create-task', True, False, 'createTaskFromRecommendation'),
- ('pages/wisdom-detail/cognitive-report', 'POST', '/api/cognitive/trend', True, False, 'getCognitiveTrend'),
- ('pages/wisdom-detail/index', 'POST', '/api/assessment/latest-result', True, False, 'getAssessmentLatestResult'),
- ('pages/wisdom-detail/index', 'POST', '/api/content-sections/visible', True, False, 'getVisibleSections'),
- ('pages/wisdom-detail/index', 'POST', '/api/dan-assessment/report/child', True, False, 'getDanReportByChild'),
- ('pages/wisdom-detail/index', 'POST', '/api/dimension/radar-data', True, False, 'getRadarData'),
- ('pages/wisdom-detail/index', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
- ('pages/wisdom-detail/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('pages/wisdom-detail/index', 'POST', '/api/health/indicators', True, False, 'getLatestIndicators'),
- ('pages/wisdom-detail/index', 'POST', '/api/wisdom/gut-cognition', True, False, 'getGutCognitionIndicators'),
- ('pages/wisdom-detail/member-wisdom-detail', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
- ('pages/wisdom-detail/member-wisdom-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
- ('pages/wishes/create', 'POST', '/api/wishes/create', True, False, 'createWish'),
- ('pages/wishes/detail', 'POST', '/api/points/balance', True, False, 'getPointsBalance'),
- ('pages/wishes/detail', 'POST', '/api/wishes//:var', True, True, 'cancelWish'),
- ('pages/wishes/detail', 'POST', '/api/wishes//:var', True, True, 'getWishById'),
- ('pages/wishes/detail', 'POST', '/api/wishes//:var/confirm', True, True, 'confirmWishReceived'),
- ('pages/wishes/detail', 'POST', '/api/wishes//:var/exchange', True, True, 'requestWishExchange'),
- ('pages/wishes/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
- ('pages/wishes/index', 'POST', '/api/points/balance', True, False, 'getPointsBalance'),
- ('pages/wishes/index', 'POST', '/api/wishes//:var', True, True, 'cancelWish'),
- ('pages/wishes/index', 'POST', '/api/wishes//:var/confirm', True, True, 'confirmWishReceived'),
- ('pages/wishes/index', 'POST', '/api/wishes//:var/exchange', True, True, 'requestWishExchange'),
- ('pages/wishes/index', 'POST', '/api/wishes/create', True, False, 'createWish'),
- ('pages/wishes/index', 'POST', '/api/wishes/list', True, False, 'getWishes'),
- ('store/health-alert', 'POST', '/api/health/alert/dismiss', True, False, 'dismissAlert'),
- ('store/health-alert', 'POST', '/api/health/alert/list', True, False, 'getActiveAlerts'),
- ('store/health-score', 'POST', '/api/health/score/info', True, False, 'getHealthScoreInfo'),
- ('store/health-score', 'POST', '/api/health/timeline/list', True, False, 'getHealthTimeline'),
- ('store/index', 'POST', '/api/family/user/switch-back-verify', True, False, 'switchBackVerify'),
- ('store/index', 'POST', '/api/family/user/switch-back-to-parent', True, False, 'switchBackToParent'),
- ('store/index', 'POST', '/api/auth/switch-role', True, False, 'switchRole'),
- ('store/index', 'POST', '/api/family/user/switch-to-child', True, False, 'switchToChild'),
- ('store/modules/tianpan', 'POST', '/api/tianpan/annual-energy', False, False, 'tianpanAnnualEnergy'),
- ('store/modules/tianpan', 'POST', '/api/tianpan/daily-fortune', False, False, 'tianpanDailyFortune'),
- ('store/modules/tianpan', 'POST', '/api/tianpan/dashboard', False, False, 'tianpanDashboard'),
- ('store/modules/tianpan', 'POST', '/api/tianpan/related-items', False, False, 'tianpanRelatedItems'),
- ('utils/api', 'POST', '/api/admin/activity/list', False, False, 'adminListMyActivities'),
- ('utils/api', 'POST', '/api/admin/task-templates', True, False, 'getNodeTemplateList'),
- ('utils/api', 'POST', '/api/auth/silent-login', False, False, 'silentLogin'),
- ('utils/api', 'POST', '/api/badges/child/list', True, False, 'getChildBadges'),
- ('utils/api', 'POST', '/api/butler/available-list', False, False, 'getAvailableButlers'),
- ('utils/api', 'POST', '/api/butler/my-butler', False, False, 'getMyButler'),
- ('utils/api', 'POST', '/api/butler/select', False, False, 'selectButler'),
- ('utils/api', 'POST', '/api/dan-assessment/order/pay', True, False, 'payAssessmentOrder'),
- ('utils/api', 'POST', '/api/family/invite/approve-request', False, False, 'approveJoinRequest'),
- ('utils/api', 'POST', '/api/family/invite/my-request', False, False, 'getMyJoinRequest'),
- ('utils/api', 'POST', '/api/family/invite/pending-requests', False, False, 'getPendingJoinRequests'),
- ('utils/api', 'POST', '/api/family/invite/reject-request', False, False, 'rejectJoinRequest'),
- ('utils/api', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
- ('utils/api', 'POST', '/api/family/user/create-family', True, False, 'createFamily'),
- ('utils/api', 'POST', '/api/internal/virtual-pay/error-report', True, False, 'reportVirtualPayError'),
- ('utils/api', 'POST', '/api/invite/bind', True, False, 'bindReferral'),
- ('utils/api', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
- ('utils/api', 'POST', '/api/orchestration/execution/detail', True, False, 'getOrchestrationExecutionDetail'),
- ('utils/api', 'POST', '/api/orchestration/execution/start', True, False, 'startOrchestrationExecution'),
- ('utils/api', 'POST', '/api/orchestration/execution/terminate', True, False, 'terminateOrchestrationExecution'),
- ('utils/api', 'POST', '/api/orchestration/flow/archive', True, False, 'archiveOrchestrationFlow'),
- ('utils/api', 'POST', '/api/orchestration/flow/delete', True, False, 'deleteOrchestrationFlow'),
- ('utils/api', 'POST', '/api/orchestration/flow/detail', True, False, 'getOrchestrationFlowDetail'),
- ('utils/api', 'POST', '/api/orchestration/flow/list', True, False, 'getOrchestrationFlowList'),
- ('utils/api', 'POST', '/api/orchestration/flow/publish', True, False, 'publishOrchestrationFlow'),
- ('utils/api', 'POST', '/api/orchestration/flow/save', True, False, 'saveOrchestrationFlow'),
- ('utils/api', 'POST', '/api/product/list', False, False, 'productList'),
- ('utils/api', 'POST', '/api/profile/history', True, False, 'getProfileTrend'),
- ('utils/api', 'POST', '/api/profile/my', True, False, 'getMyProfile'),
- ('utils/api', 'POST', '/api/purchase/challenge/progress', True, False, 'getChallengeProgress'),
- ('utils/api', 'POST', '/api/recommend/list', True, False, 'getRecommendList'),
- ('utils/api', 'POST', '/api/stats/child/overview', True, False, 'getChildOverview'),
- ('utils/api', 'POST', '/api/tasks/history', True, False, 'getTaskHistory'),
- ('utils/api', 'POST', '/api/user/portrait/edit', True, False, 'editPortrait'),
- ('utils/api', 'POST', '/api/user/portrait/generate', True, False, 'generatePortrait'),
- ('utils/api', 'POST', '/api/user/portrait/get', True, False, 'getPortrait'),
- ('utils/api', 'POST', '/api/user/portrait/regenerate', True, False, 'regeneratePortrait'),
- ('utils/profile-backfill', 'POST', '/api/user/profile/backfill', True, False, 'backfillProfile'),
- ('utils/sso', 'POST', '/api/auth/sso-ticket', False, False, 'createSsoTicket'),
- ]
- def _call(base, method, path, token=None, timeout=10, host=None, body=b'{}'):
- url = base.rstrip('/') + path
- headers = {'Content-Type': 'application/json'}
- if host:
- headers['Host'] = host
- if token:
- headers['Authorization'] = 'Bearer ' + token
- data = body if method in ('POST', 'PUT', 'DELETE') else None
- req = urllib.request.Request(url, data=data, headers=headers, method=method)
- try:
- with urllib.request.urlopen(req, timeout=timeout) as resp:
- body = resp.read().decode('utf-8', 'replace')
- code = resp.getcode()
- except urllib.error.HTTPError as e:
- try:
- body = e.read().decode('utf-8', 'replace') if e.fp else ''
- except Exception:
- body = ''
- code = e.code
- except urllib.error.URLError as e:
- class _R:
- status_code = -1
- text = str(getattr(e, 'reason', e))
- def json(self):
- raise ValueError('no json')
- return _R()
- except Exception as e:
- class _R:
- status_code = -1
- text = '%s: %s' % (type(e).__name__, str(e)[:80])
- def json(self):
- raise ValueError('no json')
- return _R()
- class _R:
- status_code = code
- text = body
- def json(self):
- return json.loads(self.text)
- return _R()
- def auto_login(base, host=None, timeout=10):
- """测试模式(wechat.test-mode=true)下 wechat-login 空 body 即可换 token。"""
- r = _call(base, 'POST', '/api/auth/wechat-login', timeout=timeout, host=host)
- try:
- d = r.json()
- tok = (d.get('data') or {}).get('token')
- if tok:
- print(f'[登录] 获取 token 成功 userId={(d.get("data") or {}).get("userId")} '
- f'role={(d.get("data") or {}).get("role")}')
- return tok
- except Exception:
- pass
- print('[登录] 失败:未取到 token')
- return None
- def direct_register(base, host=None, timeout=10, phone=None, role=None):
- """测试首选登录:跳过验证码直接注册/登录(AuthController.direct-register)。
- 返回 (token, info);失败返回 (None, None)。phone 不传则按时间生成唯一号避免『已注册』。"""
- if not phone:
- phone = '138' + str(int(time.time() * 1000) % 10 ** 8).zfill(8)
- body = json.dumps({'phone': phone, 'nickname': 'smoke-bot',
- 'role': role or 'parent'}).encode('utf-8')
- r = _call(base, 'POST', '/api/auth/direct-register', timeout=timeout, host=host, body=body)
- try:
- d = r.json()
- tok = (d.get('data') or {}).get('token')
- if tok:
- info = d.get('data') or {}
- print(f'[登录] direct-register 成功 phone={phone} userId={info.get("userId")} '
- f'role={info.get("role")}')
- return tok, info
- except Exception:
- pass
- print('[登录] direct-register 失败: ' + str(getattr(r, 'text', ''))[:120])
- return None, None
- def acquire_tokens(base, host=None, timeout=10, want_teacher=False):
- """多角色 token 前置:返回 {'parent': tok, 'teacher': tok}。
- 父 token 优先 wechat-login(测试模式空 body),失败回退 direct-register;
- 师 token 仅当 want_teacher=True 时用 direct-register(role=teacher) 获取
- (避免定时任务每轮都新建教师账号)。任一获取失败则为 None(不影响其它用例)。"""
- tokens = {'parent': None, 'teacher': None}
- # 父 token
- tok = auto_login(base, host=host, timeout=timeout)
- if not tok:
- tok, _ = direct_register(base, host=host, timeout=timeout, role='parent')
- tokens['parent'] = tok
- # 师 token(按需)
- if want_teacher:
- tok, _ = direct_register(base, host=host, timeout=timeout, role='teacher')
- tokens['teacher'] = tok
- if not tokens['parent'] and not tokens['teacher']:
- print('[登录] 警告:父/师 token 均未取得,登录态接口将被跳过')
- return tokens
- def _classify(r):
- """返回 (http_code, biz_code, 类别)
- 契约基线(见 INTERFACE_CONTRACT_REVIEW.md):
- - 成功 = Result.code == 200;其余为非 0 失败码(含 401/403/410/5001/4001 等)
- - 不带 token 访问非白名单接口:JwtInterceptor 注入匿名用户放行,
- HTTP 仍是 200,但业务 code 非 200(多为 500)——归为 BIZ_FAIL(伪 200)
- - 真正未登录/ token 非法或命中强制登录路径:HTTP 401 —— 归为 AUTH_FAIL
- """
- if r.status_code == -1:
- return -1, None, 'CONN_ERR'
- try:
- d = r.json()
- biz = d.get('code') if isinstance(d, dict) else None
- msg = (d.get('message') if isinstance(d, dict) else None)
- except Exception:
- return r.status_code, None, 'NON_JSON'
- if r.status_code == 404:
- return r.status_code, biz, 'NOT_FOUND'
- if r.status_code == 401:
- return r.status_code, biz, 'AUTH_FAIL' # 真未登录 / token 非法 / 强制登录路径
- if r.status_code >= 500:
- return r.status_code, biz, 'SERVER_ERR'
- if biz == 200:
- return r.status_code, biz, 'BIZ_OK'
- # 匿名放行或业务自定义失败码(410/403/5001/4001/500 等)统一归 BIZ_FAIL
- return r.status_code, biz, 'BIZ_FAIL'
- def main():
- ap = argparse.ArgumentParser(description='CFC 小程序端接口冒烟测试')
- ap.add_argument('--base', default=os.getenv('CFC_BASE', 'http://192.168.16.251'))
- ap.add_argument('--host', default=os.getenv('CFC_HOST', 'cfc.iwintrue.com'),
- help='Host 头(域名 DNS 不通时用 IP + Host 头访问)')
- ap.add_argument('--auto-login', action='store_true', help='自动登录换 token(优先 wechat-login,回退 direct-register)')
- ap.add_argument('--authed', action='store_true', help='同时跑登录态接口')
- ap.add_argument('--multi-role', action='store_true', help='额外获取 teacher token 并跑多角色验证用例')
- ap.add_argument('--param-val', default='1', help='路径参数 :var 的占位值')
- ap.add_argument('--timeout', type=int, default=10)
- ap.add_argument('--only-page', default='', help='只跑指定页面路由(含匹配即可)')
- ap.add_argument('--report', default='', help='结果报告输出文件')
- ap.add_argument('--extra', default='', help='额外用例文件 TSV(page fn method path auth param),追加到 CASES,用于新需求/变更需求补全测试')
- ap.add_argument('--only-extra', action='store_true', help='仅运行 --extra 用例(跳过内置全量用例),用于聚焦业务级重测')
- ap.add_argument('--body-map', default='', help='真实请求体映射 TSV(method<TAB>path<TAB>json),命中则覆盖用例默认空体,用于破除空体冒烟天花板')
- args = ap.parse_args()
- # 加载额外用例(新需求/变更需求补全):追加到 CASES 后再跑
- extra_cases = []
- if args.extra and os.path.exists(args.extra):
- _added = 0
- with open(args.extra, 'r', encoding='utf-8') as _ef:
- for _line in _ef:
- _line = _line.rstrip('\n')
- if not _line or _line.startswith('page'):
- continue
- _p = _line.split('\t')
- if len(_p) < 6:
- continue
- _page, _fn, _method, _path, _auth, _param = _p[:6]
- _c = (_page, _method, _path, _auth.lower() == 'true', _param.lower() == 'true', _fn)
- extra_cases.append(_c)
- CASES.append(_c)
- _added += 1
- print(f'已追加额外用例: {_added} 条(来自 {args.extra})')
- if args.only_extra and extra_cases:
- CASES[:] = extra_cases
- print(f'[only-extra] 仅运行 {len(CASES)} 条额外用例')
- # 加载真实请求体映射(用于破除空体冒烟的天花板)
- body_map = None
- if args.body_map and os.path.exists(args.body_map):
- body_map = {}
- _bm = 0
- with open(args.body_map, 'r', encoding='utf-8') as _bf:
- for _line in _bf:
- _line = _line.rstrip('\n')
- if not _line or _line.startswith('method'):
- continue
- _p = _line.split('\t')
- if len(_p) < 3:
- continue
- _m, _pt, _j = _p[0], _p[1], '\t'.join(_p[2:])
- try:
- json.loads(_j) # 校验合法 JSON,避免注入坏体
- except Exception:
- print(f'[body-map] 跳过非法 JSON: {_m} {_pt}')
- continue
- body_map[(_m.upper(), _pt)] = _j.encode('utf-8')
- _bm += 1
- print(f'已加载请求体映射: {_bm} 条(来自 {args.body_map})')
- tokens = {'parent': None, 'teacher': None}
- token = os.getenv('CFC_TOKEN')
- if args.auto_login and not token:
- tokens = acquire_tokens(args.base, host=args.host, timeout=args.timeout,
- want_teacher=args.multi_role)
- token = tokens['parent']
- print(f'目标: {args.base} Host: {args.host} token: {"有" if token else "无"}')
- stats = {}
- rows = []
- pages = set()
- for case in CASES:
- page, method, path, auth, param, fn, *rest = case
- if args.only_page and args.only_page not in page:
- continue
- if not token and auth:
- continue
- real = path.replace(':var', args.param_val)
- while '//' in real:
- real = real.replace('//', '/')
- # 允许 --body-map 覆盖真实请求体(破除空体冒烟天花板)
- body = rest[0] if rest else b'{}'
- if body_map is not None:
- _m = body_map.get((method, real)) or body_map.get((method, path))
- if _m is not None:
- body = _m
- r = _call(args.base, method, real, token=token, timeout=args.timeout, host=args.host, body=body)
- http_code, biz, cat = _classify(r)
- stats[cat] = stats.get(cat, 0) + 1
- pages.add(page)
- rows.append((page, fn, method, real, http_code, biz, cat))
- # ---- 多角色验证(teacher token 前置)----
- if args.multi_role and tokens.get('teacher'):
- print('\n=== 多角色验证(teacher token)===')
- def _msg(rr):
- try:
- j = rr.json()
- return (j.get('message') if isinstance(j, dict) else '') or ''
- except Exception:
- return ''
- def _run(page, fn, method, path, body, tok):
- rr = _call(args.base, method, path, token=tok, timeout=args.timeout,
- host=args.host, body=body)
- hc, bz, ct = _classify(rr)
- stats[ct] = stats.get(ct, 0) + 1
- pages.add(page)
- rows.append((page, fn, method, path, hc, bz, ct))
- return rr, hc, bz, ct
- # 1) teacher token 本身有效(verify 应 BIZ_OK)
- rr, hc, bz, ct = _run('__multi_role__', 'teacherVerify', 'POST',
- '/api/auth/verify', b'{}', tokens['teacher'])
- print(f' [teacher] /api/auth/verify -> {ct} (biz={bz}) 期望 BIZ_OK')
- # 2) 同一 teacher-only 接口:parent 应被拒、teacher 应进入业务校验(均不应 404/连接错)
- body = b'{"inviteCode":"__smoke_dummy__"}'
- rr_p, hcp, bzp, ctp = _run('__multi_role__', 'guideBindAsParent', 'POST',
- '/api/family/guide-bind', body, tokens['parent'])
- rr_t, hct, bzt, ctt = _run('__multi_role__', 'guideBindAsTeacher', 'POST',
- '/api/family/guide-bind', body, tokens['teacher'])
- mp, mt = _msg(rr_p), _msg(rr_t)
- print(f' [parent ] /api/family/guide-bind -> {ctp} msg="{mp[:36]}"')
- print(f' [teacher] /api/family/guide-bind -> {ctt} msg="{mt[:36]}"')
- # 3) 权限接口:非 admin 调 rebuild 应 "权限不足"
- rr, hc, bz, ct = _run('__multi_role__', 'indicatorsRebuildParent', 'POST',
- '/api/health-report/indicators/rebuild',
- b'{"memberId":1}', tokens['parent'])
- print(f' [parent] /api/health-report/indicators/rebuild -> {ct} (biz={bz}) msg="{_msg(rr)[:36]}"')
- total = len(rows)
- print(f'\n=== 汇总 ===')
- print(f'页面覆盖: {len(pages)} 已请求接口: {total}')
- for k in ('BIZ_OK', 'BIZ_FAIL', 'AUTH_FAIL', 'NOT_FOUND', 'SERVER_ERR', 'NON_JSON', 'CONN_ERR'):
- if k in stats:
- print(f' {k:<10}: {stats[k]}')
- ok = stats.get('BIZ_OK', 0)
- print(f'业务成功率(code=200): {ok}/{total} = {ok * 100 // total if total else 0}%')
- if args.report:
- with open(args.report, 'w', encoding='utf-8') as f:
- f.write('page\tfn\tmethod\tpath\thttp\tbiz\tcat\n')
- for row in rows:
- f.write('\t'.join(str(x) for x in row) + '\n')
- print(f'报告已写入: {args.report}')
- # 打印非 BIZ_OK 的前若干条
- bad = [r for r in rows if r[6] != 'BIZ_OK']
- if bad:
- print(f'\n=== 非成功样例(前 30 条 / 共 {len(bad)})===')
- for row in bad[:30]:
- print(f' [{row[6]:<10}] {row[3]:<52} HTTP {row[4]} biz={row[5]} ({row[0]} :: {row[1]})')
- if __name__ == '__main__':
- main()
- """
- AUTH_NOTE —— 鉴权流程(需微信上下文,无法纯脚本自动化,给出 curl 模板):
- 1) 微信登录(需 uni.login 的 code,只能在小程序内拿):
- curl -X POST {BASE}/api/auth/wechat-login \
- -H 'Content-Type: application/json' \
- -d '{"code":"<wx_login_code>","nickname":"test","avatar":"https://..."}'
- 2) 手机号验证码登录(需微信 phoneCode):
- curl -X POST {BASE}/api/auth/phone-login \
- -H 'Content-Type: application/json' -d '{"phone":"...","code":"..."}'
- 3) 测试环境直接注册(api.js 中 directRegister,标"测试环境"):
- curl -X POST {BASE}/api/auth/direct-register \
- -H 'Content-Type: application/json' -d '{"phone":"13800000000","nickname":"smoke"}'
- 拿到 token 后:export CFC_TOKEN=<token>,再跑 --authed。
- """
|