ops_interface_smoke.py 119 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362
  1. # -*- coding: utf-8 -*-
  2. """
  3. CFC 小程序端「操作接口」冒烟脚本 — 由页面功能自动派生(共 1016 个接口用例)。
  4. 用法:
  5. # 公开接口冒烟(无需登录)
  6. python ops_interface_smoke.py --base http://<可达地址>
  7. # 带登录态接口测试
  8. export CFC_TOKEN="eyJ..."
  9. python ops_interface_smoke.py --base http://<可达地址> --authed
  10. # 路径参数占位符(默认 '1',可换成真实 ID)
  11. python ops_interface_smoke.py --base ... --param-val 真实ID
  12. 说明:
  13. * 仅做「连通性 + 返回结构」断言(HTTP 可达、JSON 可解析、含 code/data)。
  14. * 业务正确性(字段值、状态机)需结合真实数据人工/用例补充。
  15. * 鉴权流程(wechat-login 等)依赖微信 code,无法纯脚本自动化,见脚本底部 AUTH_NOTE。
  16. """
  17. import argparse, json, os, sys, time
  18. import urllib.request, urllib.error
  19. # 纯标准库实现,无需 pip install requests。
  20. # 自动生成的用例: (page, method, path, auth, param, fn)
  21. CASES = [
  22. ('App', 'POST', '/api/auth/auto-login', False, False, 'autoLogin'),
  23. ('App', 'POST', '/api/auth/sso-login', False, False, 'ssoLogin'),
  24. ('App', 'POST', '/api/auth/verify', False, False, 'verifyToken'),
  25. ('App', 'POST', '/api/family/invite/check-family', False, False, 'checkUserFamily'),
  26. ('__tests__/api/api.indicator.test', 'POST', '/api/indicator/change-ranking', True, False, 'getIndicatorChangeRanking'),
  27. ('__tests__/api/api.indicator.test', 'POST', '/api/indicator/correlation/list', True, False, 'getIndicatorCorrelationList'),
  28. ('__tests__/api/api.indicator.test', 'POST', '/api/indicator/quick-lookup', True, False, 'getIndicatorQuickLookup'),
  29. ('__tests__/api/api.indicator.test', 'POST', '/api/indicator/trend', True, False, 'getIndicatorTrend'),
  30. ('__tests__/api/api.test', 'POST', '/api/ai/chat/conversations', True, False, 'aiGetConversations'),
  31. ('__tests__/api/api.test', 'POST', '/api/ai/chat/send', True, False, 'aiSendMessage'),
  32. ('__tests__/api/api.test', 'POST', '/api/articles/categories', False, False, 'getArticleCategories'),
  33. ('__tests__/api/api.test', 'POST', '/api/articles/daily-tip', False, False, 'getDailyTip'),
  34. ('__tests__/api/api.test', 'POST', '/api/articles/detail', False, False, 'getArticleDetail'),
  35. ('__tests__/api/api.test', 'POST', '/api/articles/list', False, False, 'getArticleList'),
  36. ('__tests__/api/api.test', 'POST', '/api/articles/related', False, False, 'getRelatedArticles'),
  37. ('__tests__/api/api.test', 'POST', '/api/auth/auto-login', False, False, 'autoLogin'),
  38. ('__tests__/api/api.test', 'POST', '/api/auth/check-phone', False, False, 'checkPhone'),
  39. ('__tests__/api/api.test', 'POST', '/api/auth/direct-register', False, False, 'directRegister'),
  40. ('__tests__/api/api.test', 'POST', '/api/auth/phone-login', False, False, 'phoneLogin'),
  41. ('__tests__/api/api.test', 'POST', '/api/auth/send-code', False, False, 'sendCode'),
  42. ('__tests__/api/api.test', 'POST', '/api/auth/set-password', False, False, 'setPassword'),
  43. ('__tests__/api/api.test', 'POST', '/api/auth/silent-login', False, False, 'silentLogin'),
  44. ('__tests__/api/api.test', 'POST', '/api/auth/verify', False, False, 'verifyToken'),
  45. ('__tests__/api/api.test', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
  46. ('__tests__/api/api.test', 'POST', '/api/auth/wechat-login', False, False, 'wechatLogin'),
  47. ('__tests__/api/api.test', 'POST', '/api/auth/wechat-phone-login', False, False, 'wechatPhoneLogin'),
  48. ('__tests__/api/api.test', 'POST', '/api/badges/member/list', True, False, 'getMemberBadges'),
  49. ('__tests__/api/api.test', 'POST', '/api/badges/favorite', True, False, 'toggleBadgeFavorite'),
  50. ('__tests__/api/api.test', 'POST', '/api/badges/list', True, False, 'getActiveBadges'),
  51. ('__tests__/api/api.test', 'POST', '/api/commission/summary', True, False, 'getCommissionSummary'),
  52. ('__tests__/api/api.test', 'POST', '/api/contact/create', True, False, 'createContact'),
  53. ('__tests__/api/api.test', 'POST', '/api/contact/delete', True, False, 'deleteContact'),
  54. ('__tests__/api/api.test', 'POST', '/api/contact/import-phone', True, False, 'importPhoneContact'),
  55. ('__tests__/api/api.test', 'POST', '/api/contact/list', True, False, 'getContactList'),
  56. ('__tests__/api/api.test', 'POST', '/api/dan-assessment/child-results', True, False, 'getChildAssessmentResults'),
  57. ('__tests__/api/api.test', 'POST', '/api/dan-assessment/my-results', True, False, 'getMyAssessmentResults'),
  58. ('__tests__/api/api.test', 'POST', '/api/dan-assessment/order/pay', True, False, 'payAssessmentOrder'),
  59. ('__tests__/api/api.test', 'POST', '/api/dan-assessment/result/record', False, False, 'recordAssessmentResult'),
  60. ('__tests__/api/api.test', 'POST', '/api/energy/logs', True, False, 'getEnergyLogs'),
  61. ('__tests__/api/api.test', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  62. ('__tests__/api/api.test', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  63. ('__tests__/api/api.test', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  64. ('__tests__/api/api.test', 'POST', '/api/family/user/children', True, False, 'createChild'),
  65. ('__tests__/api/api.test', 'POST', '/api/family/user/children/update', True, False, 'updateChild'),
  66. ('__tests__/api/api.test', 'POST', '/api/family/user/create-family', True, False, 'createFamily'),
  67. ('__tests__/api/api.test', 'POST', '/api/family/user/kick', True, False, 'kickFamilyMember'),
  68. ('__tests__/api/api.test', 'POST', '/api/family/user/members/update-visibility', True, False, 'updateMemberVisibility'),
  69. ('__tests__/api/api.test', 'POST', '/api/game/history', True, False, 'getGameHistory'),
  70. ('__tests__/api/api.test', 'POST', '/api/game/leaderboard', True, False, 'getGameLeaderboard'),
  71. ('__tests__/api/api.test', 'POST', '/api/growth/record/create', True, False, 'createGrowthRecord'),
  72. ('__tests__/api/api.test', 'POST', '/api/growth/record/create-with-order', True, False, 'createGrowthRecord'),
  73. ('__tests__/api/api.test', 'POST', '/api/growth/record/list', True, False, 'getGrowthRecordList'),
  74. ('__tests__/api/api.test', 'POST', '/api/guide/bind/invite', True, False, 'generateBindInvite'),
  75. ('__tests__/api/api.test', 'POST', '/api/guide/families', True, False, 'getBoundFamilies'),
  76. ('__tests__/api/api.test', 'POST', '/api/guide/messages/list', True, False, 'getGuideMessages'),
  77. ('__tests__/api/api.test', 'POST', '/api/guide/orders/list', True, False, 'getGuideOrders'),
  78. ('__tests__/api/api.test', 'POST', '/api/guide/packages/my', True, False, 'getGuidePackages'),
  79. ('__tests__/api/api.test', 'POST', '/api/guide/register', False, False, 'registerGuide'),
  80. ('__tests__/api/api.test', 'POST', '/api/guide/team/members', True, False, 'getTeamMembers'),
  81. ('__tests__/api/api.test', 'POST', '/api/health/checkin/list', True, False, 'healthCheckinList'),
  82. ('__tests__/api/api.test', 'POST', '/api/health/indicator/list', True, False, 'getHealthIndicatorList'),
  83. ('__tests__/api/api.test', 'POST', '/api/health/report/create', True, False, 'createHealthReport'),
  84. ('__tests__/api/api.test', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
  85. ('__tests__/api/api.test', 'POST', '/api/health/report/latest', True, False, 'getLatestHealthReport'),
  86. ('__tests__/api/api.test', 'POST', '/api/health/report/list', True, False, 'getReportList'),
  87. ('__tests__/api/api.test', 'POST', '/api/health/survey/create', True, False, 'createReportSurvey'),
  88. ('__tests__/api/api.test', 'POST', '/api/health/survey/submit', True, False, 'submitReportSurvey'),
  89. ('__tests__/api/api.test', 'POST', '/api/invite-card/generate', False, False, 'generateInviteCard'),
  90. ('__tests__/api/api.test', 'POST', '/api/invite-card/verify', False, False, 'verifyInviteCard'),
  91. ('__tests__/api/api.test', 'POST', '/api/invite/bind', True, False, 'bindReferral'),
  92. ('__tests__/api/api.test', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
  93. ('__tests__/api/api.test', 'POST', '/api/membership/levels', True, False, 'getMembershipLevels'),
  94. ('__tests__/api/api.test', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  95. ('__tests__/api/api.test', 'POST', '/api/membership/orders', True, False, 'createOrder'),
  96. ('__tests__/api/api.test', 'POST', '/api/mini-game//:var', True, True, 'getMiniGameByCode'),
  97. ('__tests__/api/api.test', 'POST', '/api/mini-game/complete', True, False, 'completeMiniGame'),
  98. ('__tests__/api/api.test', 'POST', '/api/mini-game/list', True, False, 'getMiniGameList'),
  99. ('__tests__/api/api.test', 'POST', '/api/packages//:var/publish', True, True, 'publishPackage'),
  100. ('__tests__/api/api.test', 'POST', '/api/points/balance', True, False, 'getPointsBalance'),
  101. ('__tests__/api/api.test', 'POST', '/api/points/logs', True, False, 'getPointsLogs'),
  102. ('__tests__/api/api.test', 'POST', '/api/product/create', False, False, 'productCreate'),
  103. ('__tests__/api/api.test', 'POST', '/api/product/detail', False, False, 'productDetail'),
  104. ('__tests__/api/api.test', 'POST', '/api/product/list', False, False, 'productList'),
  105. ('__tests__/api/api.test', 'POST', '/api/product/order/create', False, False, 'productOrderCreate'),
  106. ('__tests__/api/api.test', 'POST', '/api/rewards', True, False, 'createReward'),
  107. ('__tests__/api/api.test', 'POST', '/api/rewards//:var/exchange', True, True, 'exchangeReward'),
  108. ('__tests__/api/api.test', 'POST', '/api/rewards/wishlist', True, False, 'getWishlist'),
  109. ('__tests__/api/api.test', 'POST', '/api/stats/child-completion', True, False, 'getChildCompletionStats'),
  110. ('__tests__/api/api.test', 'POST', '/api/stats/child/overview', True, False, 'getChildOverview'),
  111. ('__tests__/api/api.test', 'POST', '/api/survey/status', True, False, 'getSurveyStatus'),
  112. ('__tests__/api/api.test', 'POST', '/api/tasks//:var', True, True, 'deleteTask'),
  113. ('__tests__/api/api.test', 'POST', '/api/tasks//:var/complete', True, True, 'completeTask'),
  114. ('__tests__/api/api.test', 'POST', '/api/tasks//:var/review', True, True, 'approveTask'),
  115. ('__tests__/api/api.test', 'POST', '/api/tasks//:var/review', True, True, 'rejectTask'),
  116. ('__tests__/api/api.test', 'POST', '/api/tasks//:var/review', True, True, 'reviewTask'),
  117. ('__tests__/api/api.test', 'POST', '/api/tasks/batch-complete', True, False, 'batchCompleteTasks'),
  118. ('__tests__/api/api.test', 'POST', '/api/tasks/create', True, False, 'createTask'),
  119. ('__tests__/api/api.test', 'POST', '/api/tasks/history', True, False, 'getTaskHistory'),
  120. ('__tests__/api/api.test', 'POST', '/api/tasks/pending-review', True, False, 'getPendingReviewTasks'),
  121. ('__tests__/api/api.test', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
  122. ('__tests__/api/api.test', 'POST', '/api/tasks/today', True, False, 'getTodayTasksByCategory'),
  123. ('__tests__/api/api.test', 'POST', '/api/tasks/today-parent', True, False, 'getTodayParentTasks'),
  124. ('__tests__/api/api.test', 'POST', '/api/user/info', True, False, 'getUserInfo'),
  125. ('__tests__/api/api.test', 'POST', '/api/user/join-family', True, False, 'joinFamily'),
  126. ('__tests__/api/api.test', 'POST', '/api/family/user/switch-back-to-parent', True, False, 'switchBackToParent'),
  127. ('__tests__/api/api.test', 'POST', '/api/family/user/switch-mode', True, False, 'switchMode'),
  128. ('__tests__/api/api.test', 'POST', '/api/family/user/switch-to-child', True, False, 'switchToChild'),
  129. ('__tests__/api/api.test', 'POST', '/api/user/update', True, False, 'updateUserInfo'),
  130. ('__tests__/api/api.test', 'POST', '/api/vendor/apply', True, False, 'vendorApply'),
  131. ('__tests__/api/api.test', 'POST', '/api/vendor/info', False, False, 'vendorInfo'),
  132. ('__tests__/api/api.test', 'POST', '/api/vendor/status', False, False, 'vendorStatus'),
  133. ('__tests__/api/api.test', 'POST', '/api/wealth/checkin/list', True, False, 'getCheckinList'),
  134. ('__tests__/api/api.test', 'POST', '/api/wealth/insurance/list', False, False, 'getInsuranceList'),
  135. ('__tests__/api/api.test', 'POST', '/api/wishes//:var/approve-exchange', True, True, 'approveWishExchange'),
  136. ('__tests__/api/api.test', 'POST', '/api/wishes//:var/price', True, True, 'setWishPrice'),
  137. ('__tests__/api/api.test', 'POST', '/api/wishes/create', True, False, 'createWish'),
  138. ('__tests__/api/api.test', 'POST', '/api/wishes/list', True, False, 'getWishes'),
  139. ('__tests__/api/api.test', 'POST', '/api/wishes/pending', True, False, 'getPendingWishes'),
  140. ('__tests__/api/api.test', 'POST', '/api/withdrawal/apply', True, False, 'applyWithdrawal'),
  141. ('__tests__/store/store.test', 'POST', '/api/auth/switch-role', True, False, 'switchRole'),
  142. ('components/DimensionActivities', 'POST', '/api/activity/list', False, False, 'getActivityList'),
  143. ('components/DimensionActivities', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  144. ('components/DimensionProducts', 'POST', '/api/recommend/dimension-products', True, False, 'getDimensionProducts'),
  145. ('components/DimensionTasks', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
  146. ('components/MemberSelector', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
  147. ('components/MemberSelector', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  148. ('components/MemberSelector', 'POST', '/api/family/relationship/pairwise', True, False, 'getPairwiseRelationships'),
  149. ('components/MemberSelector', 'POST', '/api/family/user/create-family', True, False, 'createFamily'),
  150. ('components/OnboardingGuide', 'POST', '/api/guide-config/current', True, False, 'getGuideConfig'),
  151. ('components/OnboardingProgressBar', 'POST', '/api/onboarding/progress', True, False, 'getOnboardingProgress'),
  152. ('components/RelatedContent', 'POST', '/api/content/related-items', True, False, 'getContentRelated'),
  153. ('components/daily-task-card', 'POST', '/api/daily-task/overview', True, False, 'getDailyTaskOverview'),
  154. ('components/login-sheet', 'POST', '/api/auth/wechat-phone-login', False, False, 'wechatPhoneLogin'),
  155. ('components/share-mixin', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
  156. ('pages/achievement/index', 'POST', '/api/badges/member/list', True, False, 'getMemberBadges'),
  157. ('pages/action-detail/components/PearlDiagram', 'POST', '/api/pearl/interaction/add', True, False, 'addPearlInteraction'),
  158. ('pages/action-detail/components/PearlDiagram', 'POST', '/api/pearl/item/update-priority', True, False, 'updatePearlPriority'),
  159. ('pages/action-detail/contact-detail', 'POST', '/api/contact/delete', True, False, 'deleteContact'),
  160. ('pages/action-detail/contact-detail', 'POST', '/api/contact/detail', True, False, 'getContactDetail'),
  161. ('pages/action-detail/contact-detail', 'POST', '/api/contact/interaction', True, False, 'recordContactInteraction'),
  162. ('pages/action-detail/contact-detail', 'POST', '/api/contact/update', True, False, 'updateContact'),
  163. ('pages/action-detail/index', 'POST', '/api/ability/map', True, False, 'getAbilityMap'),
  164. ('pages/action-detail/index', 'POST', '/api/content-sections/visible', True, False, 'getVisibleSections'),
  165. ('pages/action-detail/index', 'POST', '/api/dimension/radar-data', True, False, 'getRadarData'),
  166. ('pages/action-detail/index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  167. ('pages/action-detail/index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
  168. ('pages/action-detail/index', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  169. ('pages/action-detail/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  170. ('pages/action-detail/index', 'POST', '/api/octopus/analysis/summary', True, False, 'getOctopusAnalysisSummary'),
  171. ('pages/action-detail/index', 'POST', '/api/octopus/effect/key-persons', True, False, 'getOctopusEffectKeyPersons'),
  172. ('pages/action-detail/index', 'POST', '/api/octopus/effect/list', True, False, 'getOctopusEffects'),
  173. ('pages/action-detail/index', 'POST', '/api/pearl/item/delete', True, False, 'deletePearlResource'),
  174. ('pages/action-detail/index', 'POST', '/api/pearl/reminder/list', True, False, 'getPearlReminders'),
  175. ('pages/action-detail/index', 'POST', '/api/pearl/resources', True, False, 'getPearlResources'),
  176. ('pages/action-detail/interaction-log', 'POST', '/api/family/interaction/add', True, False, 'addInteraction'),
  177. ('pages/action-detail/interaction-log', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  178. ('pages/action-detail/interaction-log', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  179. ('pages/action-detail/member-action-detail', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  180. ('pages/action-detail/member-action-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  181. ('pages/action-detail/octopus-add-effect', 'POST', '/api/octopus/effect/add', True, False, 'addOctopusEffect'),
  182. ('pages/action-detail/octopus-add-effect', 'POST', '/api/octopus/key-person/bind-system-user', True, False, 'bindOctopusKeyPersonSystemUser'),
  183. ('pages/action-detail/octopus-add-effect', 'POST', '/api/octopus/key-person/list', True, False, 'getOctopusKeyPersons'),
  184. ('pages/action-detail/octopus-add-effect', 'POST', '/api/octopus/key-person/match-by-phone', True, False, 'matchOctopusKeyPersonByPhone'),
  185. ('pages/action-detail/octopus-add-key-person', 'POST', '/api/octopus/key-person/add', True, False, 'addOctopusKeyPerson'),
  186. ('pages/action-detail/octopus-add-key-person', 'POST', '/api/octopus/key-person/list', True, False, 'getOctopusKeyPersons'),
  187. ('pages/action-detail/octopus-effects-list', 'POST', '/api/octopus/effect/delete', True, False, 'deleteOctopusEffect'),
  188. ('pages/action-detail/octopus-effects-list', 'POST', '/api/octopus/effect/list', True, False, 'getOctopusEffects'),
  189. ('pages/action-detail/pearl-add-resource', 'POST', '/api/contact/list', True, False, 'getContactList'),
  190. ('pages/action-detail/pearl-add-resource', 'POST', '/api/pearl/connection-types', True, False, 'getConnectionTypes'),
  191. ('pages/action-detail/pearl-add-resource', 'POST', '/api/pearl/item/add', True, False, 'addPearlResource'),
  192. ('pages/action-detail/relationship-questionnaire', 'POST', '/api/family/questionnaire/generate', True, False, 'generateQuestionnaire'),
  193. ('pages/action-detail/relationship-questionnaire', 'POST', '/api/family/questionnaire/submit', True, False, 'submitQuestionnaire'),
  194. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/cancel-registration', False, False, 'cancelActivityRegistration'),
  195. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/checkin', False, False, 'activityCheckin'),
  196. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/detail', False, False, 'getActivityDetail'),
  197. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/feedback/my', False, False, 'getMyActivityFeedback'),
  198. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/feedback/submit', False, False, 'submitActivityFeedback'),
  199. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/order/create', False, False, 'createActivityOrder'),
  200. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/activity/registration-roster', False, False, 'getActivityRegistrationRoster'),
  201. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  202. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  203. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/poster-template/list', True, False, 'getPosterTemplates'),
  204. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/share/qrcode', True, False, 'getShareQrCode'),
  205. ('pages/activity/activity-detail/activity-detail', 'POST', '/api/user/profile/backfill', True, False, 'backfillProfile'),
  206. ('pages/activity/create', 'POST', '/api/activity/create', False, False, 'adminCreateActivity'),
  207. ('pages/activity/create', 'POST', '/api/activity/detail', False, False, 'getActivityDetail'),
  208. ('pages/activity/create', 'POST', '/api/activity/publish', False, False, 'adminPublishActivity'),
  209. ('pages/activity/create', 'POST', '/api/activity/submit-review', False, False, 'submitActivityForReview'),
  210. ('pages/activity/create', 'POST', '/api/activity/update', False, False, 'adminUpdateActivity'),
  211. ('pages/activity/create', 'POST', '/api/poster-template/list', True, False, 'getPosterTemplates'),
  212. ('pages/activity/index', 'POST', '/api/activity/cancel-registration', False, False, 'cancelActivityRegistration'),
  213. ('pages/activity/index', 'POST', '/api/activity/checkin', False, False, 'activityCheckin'),
  214. ('pages/activity/index', 'POST', '/api/activity/end', False, False, 'adminEndActivity'),
  215. ('pages/activity/index', 'POST', '/api/activity/list', False, False, 'getActivityList'),
  216. ('pages/activity/index', 'POST', '/api/activity/my-registrations', False, False, 'getMyActivityRegistrations'),
  217. ('pages/activity/index', 'POST', '/api/activity/publish', False, False, 'adminPublishActivity'),
  218. ('pages/activity/index', 'POST', '/api/activity/submit-review', False, False, 'submitActivityForReview'),
  219. ('pages/activity/index', 'POST', '/api/admin/activity/list', False, False, 'adminListMyActivities'),
  220. ('pages/activity/index', 'POST', '/api/admin/activity/withdraw', False, False, 'adminWithdrawActivity'),
  221. ('pages/activity/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  222. ('pages/activity/index', 'POST', '/api/vendor/status', False, False, 'vendorStatus'),
  223. ('pages/activity/order-pay/order-pay', 'POST', '/api/activity/order/handlePaymentSuccess', False, False, 'handleActivityOrderSuccess'),
  224. ('pages/activity/order-pay/order-pay', 'POST', '/api/activity/order/pay', False, False, 'payActivityOrder'),
  225. ('pages/ai/chat', 'POST', '/api/ai/butler/send', False, False, 'aiSendHealthButlerMessage'),
  226. ('pages/ai/chat', 'POST', '/api/ai/chat/conversations', True, False, 'aiGetConversations'),
  227. ('pages/ai/chat', 'POST', '/api/ai/chat/messages', True, False, 'aiGetMessages'),
  228. ('pages/ai/chat', 'POST', '/api/ai/health-coach/send', True, False, 'aiSendHealthCoachMessage'),
  229. ('pages/ai/chat', 'POST', '/api/ai/nutrition/send', True, False, 'aiSendNutritionMessage'),
  230. ('pages/ai/chat', 'POST', '/api/ai/transcribe', True, False, 'sttTranscribe'),
  231. ('pages/ai/chat', 'POST', '/api/basic-quota/status/all', True, False, 'getAllQuotaStatus'),
  232. ('pages/ai/chat', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  233. ('pages/ai/chat', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  234. ('pages/article-center/article-detail', 'POST', '/api/articles/audio', False, False, 'getArticleAudio'),
  235. ('pages/article-center/article-detail', 'POST', '/api/articles/complete-read', False, False, 'completeArticleRead'),
  236. ('pages/article-center/article-detail', 'POST', '/api/articles/detail', False, False, 'getArticleDetail'),
  237. ('pages/article-center/article-detail', 'POST', '/api/articles/quiz/generate', False, False, 'generateQuiz'),
  238. ('pages/article-center/article-detail', 'POST', '/api/articles/quiz/submit', False, False, 'submitQuiz'),
  239. ('pages/article-center/article-detail', 'POST', '/api/articles/report-reading-time', False, False, 'reportReadingTime'),
  240. ('pages/article-center/article-detail', 'POST', '/api/share/qrcode', True, False, 'getShareQrCode'),
  241. ('pages/article-center/article-detail', 'POST', '/api/tasks//:var/complete', True, True, 'completeTask'),
  242. ('pages/article-center/article-edit', 'POST', '/api/articles/publish', False, False, 'publishArticle'),
  243. ('pages/article-center/index', 'POST', '/api/articles/featured', False, False, 'getFeaturedArticles'),
  244. ('pages/article-center/index', 'POST', '/api/articles/list', False, False, 'getArticleList'),
  245. ('pages/article-center/my-posts', 'POST', '/api/articles/my-posts', False, False, 'getMyPosts'),
  246. ('pages/assessment-plan/detail', 'POST', '/api/dan-assessment/result/plans/list', False, False, 'getMyAssessmentPlans'),
  247. ('pages/assessment-plan/list', 'POST', '/api/dan-assessment/result/plans/list', False, False, 'getMyAssessmentPlans'),
  248. ('pages/assessment/apply', 'POST', '/api/assessment/appointment/create', True, False, 'createAssessmentAppointmentWithQuota'),
  249. ('pages/assessment/apply', 'POST', '/api/assessment/quota/my-list', True, False, 'getAssessmentQuotas'),
  250. ('pages/assessment/apply', 'POST', '/api/guide/invite-code/validate', False, False, 'validateInviteCode'),
  251. ('pages/assessment/apply', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  252. ('pages/assessment/apply', 'POST', '/api/package/available-guides', True, False, 'getAvailableGuides'),
  253. ('pages/assessment/purchase', 'POST', '/api/dan-assessment/order/create', True, False, 'createAssessmentOrder'),
  254. ('pages/assessment/purchase', 'POST', '/api/dan-assessment/order/detail', True, False, 'getAssessmentOrderDetail'),
  255. ('pages/assessment/purchase', 'POST', '/api/guide/invite-code/validate', False, False, 'validateInviteCode'),
  256. ('pages/assessment/purchase', 'POST', '/api/package/available-guides', True, False, 'getAvailableGuides'),
  257. ('pages/assessment/quota', 'POST', '/api/assessment/quota/my-list', True, False, 'getAssessmentQuotas'),
  258. ('pages/assessment/results', 'POST', '/api/dan-assessment/child-results', True, False, 'getChildAssessmentResults'),
  259. ('pages/assessment/results', 'POST', '/api/dan-assessment/my-results', True, False, 'getMyAssessmentResults'),
  260. ('pages/assessment/upload-report', 'POST', '/api/dan-assessment/result/upload', False, False, 'uploadAssessmentReport'),
  261. ('pages/body-detail/dimension-detail', 'POST', '/api/dimension/history', True, False, 'getDimensionHistory'),
  262. ('pages/body-detail/dimension-detail', 'POST', '/api/dimension/overview', True, False, 'getDimensionOverview'),
  263. ('pages/body-detail/dimension-questionnaire', 'POST', '/api/articles/submit-answers', False, False, 'submitAnswers'),
  264. ('pages/body-detail/dimension-questionnaire', 'POST', '/api/dimension/questionnaire', True, False, 'submitDimensionQuestionnaire'),
  265. ('pages/body-detail/health-dimensions', 'POST', '/api/dimension/overview', True, False, 'getDimensionOverview'),
  266. ('pages/body-detail/health-dimensions', 'POST', '/api/dimension/upload', True, False, 'uploadDimensionScore'),
  267. ('pages/body-detail/health-report', 'POST', '/api/health/nutrition/deficiency', True, False, 'getDeficiencyAnalysis'),
  268. ('pages/body-detail/index', 'POST', '/api/content-sections/visible', True, False, 'getVisibleSections'),
  269. ('pages/body-detail/index', 'POST', '/api/dimension/overview', True, False, 'getDimensionOverview'),
  270. ('pages/body-detail/index', 'POST', '/api/dimension/radar-data', True, False, 'getRadarData'),
  271. ('pages/body-detail/index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  272. ('pages/body-detail/index', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  273. ('pages/body-detail/index', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
  274. ('pages/body-detail/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  275. ('pages/body-detail/index', 'POST', '/api/health/gut-flora', True, False, 'getGutFloraIndicators'),
  276. ('pages/body-detail/index', 'POST', '/api/health/indicators', True, False, 'getLatestIndicators'),
  277. ('pages/body-detail/index', 'POST', '/api/health/report/body-abnormal', True, False, 'getBodyAbnormalIndicators'),
  278. ('pages/body-detail/member-body-detail', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  279. ('pages/body-detail/member-body-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  280. ('pages/butler/apply', 'POST', '/api/butler/apply', False, False, 'butlerApply'),
  281. ('pages/butler/select', 'POST', '/api/butler/available-list', False, False, 'getAvailableButlers'),
  282. ('pages/butler/select', 'POST', '/api/butler/my-butler', False, False, 'getMyButler'),
  283. ('pages/butler/select', 'POST', '/api/butler/select', False, False, 'selectButler'),
  284. ('pages/child/rewards', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
  285. ('pages/child/rewards', 'POST', '/api/points/balance', True, False, 'getPointsBalance'),
  286. ('pages/child/rewards', 'POST', '/api/rewards/wishlist', True, False, 'getWishlist'),
  287. ('pages/child/rewards', 'POST', '/api/family/user/switch-back-to-parent', True, False, 'switchBackToParent'),
  288. ('pages/child/tasks', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
  289. ('pages/child/tasks', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
  290. ('pages/child/tasks', 'POST', '/api/family/user/switch-back-to-parent', True, False, 'switchBackToParent'),
  291. ('pages/cognitive-hall', 'POST', '/api/cognitive/child', True, False, 'getCognitiveChildScores'),
  292. ('pages/cognitive-hall', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  293. ('pages/cognitive-test/language-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
  294. ('pages/cognitive-test/logic-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
  295. ('pages/cognitive-test/memory-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
  296. ('pages/cognitive-test/perception-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
  297. ('pages/cognitive-test/spatial-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
  298. ('pages/cognitive-test/speed-test', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
  299. ('pages/dan-assessment/comparison', 'POST', '/api/dan-report/compare', True, False, 'compareDanReports'),
  300. ('pages/dan-assessment/comparison', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  301. ('pages/diet/index', 'POST', '/api/diet/ingredients/add', True, False, 'addDietIngredient'),
  302. ('pages/diet/index', 'POST', '/api/diet/ingredients/recommend', True, False, 'refreshDietIngredients'),
  303. ('pages/diet/index', 'POST', '/api/diet/ingredients/remove', True, False, 'removeDietIngredient'),
  304. ('pages/diet/index', 'POST', '/api/diet/ingredients/search', True, False, 'searchDietFoods'),
  305. ('pages/diet/index', 'POST', '/api/diet/ingredients/suggest', True, False, 'getDietIngredients'),
  306. ('pages/diet/index', 'POST', '/api/diet/meals/config', True, False, 'getMealConfig'),
  307. ('pages/diet/index', 'POST', '/api/diet/recommendation/generate', True, False, 'generateDietRecommendation'),
  308. ('pages/diet/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  309. ('pages/diet/meal-config', 'POST', '/api/diet/meals/config', True, False, 'getMealConfig'),
  310. ('pages/diet/meal-config', 'POST', '/api/diet/meals/config/save', False, False, 'saveMealConfig'),
  311. ('pages/diet/preferences', 'POST', '/api/diet/preferences/current-member', True, False, 'getDietPreferences'),
  312. ('pages/diet/preferences', 'POST', '/api/diet/preferences/save', True, False, 'saveDietPreferences'),
  313. ('pages/diet/recommendation', 'POST', '/api/diet/recommendation/complete', True, False, 'completeDietRecommendation'),
  314. ('pages/diet/recommendation', 'POST', '/api/diet/recommendation/generate', True, False, 'generateDietRecommendation'),
  315. ('pages/diet/recommendation', 'POST', '/api/diet/recommendation/regenerate', True, False, 'regenerateDietRecommendation'),
  316. ('pages/diet/recommendation', 'POST', '/api/diet/recommendation/today', True, False, 'getDietRecommendation'),
  317. ('pages/diet/record-detail', 'POST', '/api/diet/record/daily', True, False, 'getDietDailyRecords'),
  318. ('pages/diet/records', 'POST', '/api/food/recommendation/members', True, False, 'getCautionFamilyMembers'),
  319. ('pages/diet/records', 'POST', '/api/health/meal/alerts', True, False, 'getMealAlerts'),
  320. ('pages/diet/records', 'POST', '/api/health/meal/daily', True, False, 'getMealDaily'),
  321. ('pages/diet/records', 'POST', '/api/health/meal/weekly', True, False, 'getMealWeekly'),
  322. ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/cart/add', True, False, 'cartAdd'),
  323. ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  324. ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/product/detail', False, False, 'productDetail'),
  325. ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/product/order/pay', False, False, 'productOrderPay'),
  326. ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/product/spec/map', False, False, 'productSpecMap'),
  327. ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/share/qrcode', True, False, 'getShareQrCode'),
  328. ('pages/discover-detail/product-detail/product-detail', 'POST', '/api/special-price/info', True, False, 'getSpecialPriceInfo'),
  329. ('pages/discover/circle-feed', 'POST', '/api/circle/comment/add', True, False, 'addCircleComment'),
  330. ('pages/discover/circle-feed', 'POST', '/api/circle/comment/list', True, False, 'getCircleComments'),
  331. ('pages/discover/circle-feed', 'POST', '/api/circle/feed', False, False, 'getCircleFeed'),
  332. ('pages/discover/circle-feed', 'POST', '/api/circle/members', True, False, 'getCircleMembers'),
  333. ('pages/discover/circle-feed', 'POST', '/api/circle/post/create', True, False, 'createCirclePost'),
  334. ('pages/discover/circle-feed', 'POST', '/api/circle/post/delete', True, False, 'deleteCirclePost'),
  335. ('pages/discover/circle-feed', 'POST', '/api/circle/post/like', True, False, 'toggleCircleLike'),
  336. ('pages/discover/circles', 'POST', '/api/circle/approve', True, False, 'approveCircleMember'),
  337. ('pages/discover/circles', 'POST', '/api/circle/discover', True, False, 'discoverCircles'),
  338. ('pages/discover/circles', 'POST', '/api/circle/join', True, False, 'joinGeneralCircle'),
  339. ('pages/discover/circles', 'POST', '/api/circle/leave', True, False, 'leaveGeneralCircle'),
  340. ('pages/discover/circles', 'POST', '/api/circle/my-circles', True, False, 'getMyCircles'),
  341. ('pages/discover/circles', 'POST', '/api/circle/pending-members', True, False, 'getPendingCircleMembers'),
  342. ('pages/discover/circles', 'POST', '/api/circle/update', True, False, 'updateCircle'),
  343. ('pages/discover/circles', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  344. ('pages/discover/create-circle', 'POST', '/api/circle/create', True, False, 'createGeneralCircle'),
  345. ('pages/discover/index', 'POST', '/api/articles/featured', False, False, 'getFeaturedArticles'),
  346. ('pages/discover/index', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  347. ('pages/discover/index', 'POST', '/api/product/list', False, False, 'productList'),
  348. ('pages/energy/detail', 'POST', '/api/energy/logs', True, False, 'getEnergyLogs'),
  349. ('pages/energy/index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
  350. ('pages/energy/index', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  351. ('pages/energy/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  352. ('pages/family/add-member', 'POST', '/api/auth/check-phone', False, False, 'checkPhone'),
  353. ('pages/family/add-member', 'POST', '/api/consent/record', True, False, 'recordConsent'),
  354. ('pages/family/add-member', 'POST', '/api/family/member/add', True, False, 'addFamilyMember'),
  355. ('pages/family/add-member', 'POST', '/api/family/member/update', True, False, 'updateFamilyMember'),
  356. ('pages/family/manual-score-entry', 'POST', '/api/family/manual-score/submit', True, False, 'submitManualScore'),
  357. ('pages/family/manual-score-entry', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  358. ('pages/family/mbti-entry', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  359. ('pages/family/mbti-profile', 'POST', '/api/family/mbti/profile', True, False, 'getMbtiProfile'),
  360. ('pages/family/mbti-result', 'POST', '/api/family/mbti/latest', True, False, 'getMbtiLatest'),
  361. ('pages/family/mbti-test', 'POST', '/api/family/mbti/questions', True, False, 'getMbtiQuestions'),
  362. ('pages/family/mbti-test', 'POST', '/api/family/mbti/submit', True, False, 'submitMbti'),
  363. ('pages/family/self-check', 'POST', '/api/family/self-check/submit', True, False, 'submitSelfCheck'),
  364. ('pages/family/self-check-ai', 'POST', '/api/family/self-check/submit', True, False, 'submitSelfCheck'),
  365. ('pages/family/self-check-entry', 'POST', '/api/family/self-check/ignore', True, False, 'ignoreSelfCheck'),
  366. ('pages/family/self-check-entry', 'POST', '/api/family/self-check/status', True, False, 'getSelfCheckStatus'),
  367. ('pages/family/self-check-entry', 'POST', '/api/family/self-check/trend-analysis', True, False, 'getSelfCheckTrendAnalysis'),
  368. ('pages/family/self-check-result', 'POST', '/api/family/self-check/generate-plan', True, False, 'generateSelfCheckPlan'),
  369. ('pages/family/self-check-result', 'POST', '/api/family/self-check/history', True, False, 'getSelfCheckHistory'),
  370. ('pages/family/self-check-result', 'POST', '/api/family/self-check/latest', True, False, 'getSelfCheckLatest'),
  371. ('pages/family/self-check-result', 'POST', '/api/micro-action/complete', True, False, 'microActionComplete'),
  372. ('pages/family/self-check-result', 'POST', '/api/micro-action/today', True, False, 'microActionToday'),
  373. ('pages/games/1a2b', 'POST', '/api/mini-game/complete', True, False, 'completeMiniGame'),
  374. ('pages/games/list', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  375. ('pages/games/list', 'POST', '/api/mini-game/list', True, False, 'getMiniGameList'),
  376. ('pages/games/records', 'POST', '/api/game/history', True, False, 'getGameHistory'),
  377. ('pages/games/schulte', 'POST', '/api/mini-game/complete', True, False, 'completeMiniGame'),
  378. ('pages/games/stats', 'POST', '/api/game/best', True, False, 'getGameBestScores'),
  379. ('pages/games/stats', 'POST', '/api/game/leaderboard', True, False, 'getGameLeaderboard'),
  380. ('pages/games/stats', 'POST', '/api/game/stats', True, False, 'getGameStats'),
  381. ('pages/games/sudoku', 'POST', '/api/mini-game/complete', True, False, 'completeMiniGame'),
  382. ('pages/growth-main/index', 'POST', '/api/food/recommendation/caution', True, False, 'getFoodCautionList'),
  383. ('pages/growth-main/index', 'POST', '/api/growth/recommendations', True, False, 'getGrowthRecommendations'),
  384. ('pages/growth-main/index', 'POST', '/api/health/checkin/list', True, False, 'healthCheckinList'),
  385. ('pages/growth-main/index', 'POST', '/api/health/exercise/list', True, False, 'getExerciseRecords'),
  386. ('pages/growth-main/index', 'POST', '/api/health/meal/list', True, False, 'getHealthMealList'),
  387. ('pages/growth-main/index', 'POST', '/api/health/sleep/list', True, False, 'getSleepRecords'),
  388. ('pages/growth-main/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  389. ('pages/growth-main/index', 'POST', '/api/mind/checkin/list', True, False, 'getEmotionCheckinList'),
  390. ('pages/growth-main/index', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
  391. ('pages/growth-main/index', 'POST', '/api/wealth/checkin/list', True, False, 'getCheckinList'),
  392. ('pages/growth/caution-detail', 'POST', '/api/food/recommendation/caution', True, False, 'getFoodCautionList'),
  393. ('pages/growth/caution-detail', 'POST', '/api/food/recommendation/members', True, False, 'getCautionFamilyMembers'),
  394. ('pages/growth/caution-detail', 'POST', '/api/food/recommendation/trend', True, False, 'getFoodCautionTrend'),
  395. ('pages/growth/caution-detail', 'POST', '/api/health/knowledge/v3/section', True, False, 'getKnowledgeSection'),
  396. ('pages/growth/challenge-progress', 'POST', '/api/purchase/challenge/progress', True, False, 'getChallengeProgress'),
  397. ('pages/growth/create', 'POST', '/api/growth/record/create', True, False, 'createGrowthRecord'),
  398. ('pages/growth/create', 'POST', '/api/growth/record/create-with-order', True, False, 'createGrowthRecord'),
  399. ('pages/growth/diet-checkin', 'POST', '/api/ai/transcribe', True, False, 'sttTranscribe'),
  400. ('pages/growth/diet-checkin', 'POST', '/api/basic-quota/status/all', True, False, 'getAllQuotaStatus'),
  401. ('pages/growth/exercise-checkin', 'POST', '/api/ai/transcribe', True, False, 'sttTranscribe'),
  402. ('pages/growth/supplement', 'POST', '/api/growth/record/supplement', True, False, 'createGrowthSupplement'),
  403. ('pages/growth/supplement', 'POST', '/api/growth/record/upload-and-parse', True, False, 'uploadAndParseReport'),
  404. ('pages/growth/upload', 'POST', '/api/growth/record/create-from-upload', True, False, 'createGrowthRecordFromUpload'),
  405. ('pages/growth/upload', 'POST', '/api/growth/record/upload-and-parse', True, False, 'uploadAndParseReport'),
  406. ('pages/growth/upload', 'POST', '/api/product/list', False, False, 'productList'),
  407. ('pages/guide/activities/detail', 'POST', '/api/guide/activities/create', True, False, 'createActivity'),
  408. ('pages/guide/activities/detail', 'POST', '/api/guide/activities/detail', True, False, 'getGuideActivityDetail'),
  409. ('pages/guide/activities/detail', 'POST', '/api/guide/activities/publish', True, False, 'publishActivity'),
  410. ('pages/guide/activities/detail', 'POST', '/api/guide/activities/update', True, False, 'updateActivity'),
  411. ('pages/guide/activities/index', 'POST', '/api/guide/activities/cancel', True, False, 'cancelActivity'),
  412. ('pages/guide/activities/index', 'POST', '/api/guide/activities/delete', True, False, 'deleteActivity'),
  413. ('pages/guide/activities/index', 'POST', '/api/guide/activities/list', True, False, 'getGuideActivityList'),
  414. ('pages/guide/activities/index', 'POST', '/api/guide/activities/publish', True, False, 'publishActivity'),
  415. ('pages/guide/bind/invite', 'POST', '/api/common/qrcode', True, False, 'generateQrCodeFromText'),
  416. ('pages/guide/bind/invite', 'POST', '/api/guide/bind/confirm', True, False, 'confirmBind'),
  417. ('pages/guide/bind/invite', 'POST', '/api/guide/bind/invite', True, False, 'generateBindInvite'),
  418. ('pages/guide/hierarchy/index', 'POST', '/api/guide/all-child-guides', True, False, 'getAllChildGuides'),
  419. ('pages/guide/hierarchy/index', 'POST', '/api/guide/child-guides', True, False, 'getChildGuides'),
  420. ('pages/guide/hierarchy/index', 'POST', '/api/guide/parent-guide', True, False, 'getParentGuide'),
  421. ('pages/guide/packages/create', 'POST', '/api/packages', True, False, 'createPackage'),
  422. ('pages/guide/packages/detail', 'POST', '/api/packages//:var/items', True, True, 'addPackageItem'),
  423. ('pages/guide/packages/index', 'POST', '/api/packages//:var/publish', True, True, 'publishPackage'),
  424. ('pages/guide/packages/index', 'POST', '/api/packages//:var/submit', True, True, 'submitPackageForReview'),
  425. ('pages/guide/register/index', 'POST', '/api/guide/invite-code/validate', False, False, 'validateInviteCode'),
  426. ('pages/guide/register/index', 'POST', '/api/guide/register', False, False, 'registerGuide'),
  427. ('pages/health-main/index', 'POST', '/api/articles/featured', False, False, 'getFeaturedArticles'),
  428. ('pages/health-main/index', 'POST', '/api/cognitive/child', True, False, 'getCognitiveChildScores'),
  429. ('pages/health-main/index', 'POST', '/api/cognitive/family', True, False, 'getCognitiveFamilyScores'),
  430. ('pages/health-main/index', 'POST', '/api/dimension/overview', True, False, 'getDimensionOverview'),
  431. ('pages/health-main/index', 'POST', '/api/emireport/latest', True, False, 'getEmiReport'),
  432. ('pages/health-main/index', 'POST', '/api/energy/wealth-detail', True, False, 'getWealthDetail'),
  433. ('pages/health-main/index', 'POST', '/api/family/relationship/scores', True, False, 'getRelationshipScores'),
  434. ('pages/health-main/index', 'POST', '/api/health/plan/list', True, False, 'getHealthPlanList'),
  435. ('pages/health-main/index', 'POST', '/api/health/report/list', True, False, 'getReportList'),
  436. ('pages/health-main/index', 'POST', '/api/survey/status', True, False, 'getSurveyStatus'),
  437. ('pages/health/bodyfat-confirm', 'POST', '/api/health/report/bodyfat-save', True, False, 'saveBodyFatMetrics'),
  438. ('pages/health/challenge-manage', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  439. ('pages/health/challenge-manage', 'POST', '/api/health/challenge/create', True, False, 'createChallenge'),
  440. ('pages/health/challenge-manage', 'POST', '/api/health/challenge/history', True, False, 'getChallengeHistory'),
  441. ('pages/health/challenge-manage', 'POST', '/api/health/challenge/list', True, False, 'getChallengeList'),
  442. ('pages/health/challenge-manage', 'POST', '/api/health/challenge/respond', True, False, 'respondChallenge'),
  443. ('pages/health/challenge-manage', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  444. ('pages/health/components/MemberChipPicker', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  445. ('pages/health/components/feedback-popup', 'POST', '/api/health/feedback/submit', False, False, 'submitFeedback'),
  446. ('pages/health/doa-index', 'POST', '/api/doa/overview', True, False, 'getDoaOverview'),
  447. ('pages/health/doa-stage-create', 'POST', '/api/doa/stage/create', True, False, 'createDoaStage'),
  448. ('pages/health/doa-stage-create', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  449. ('pages/health/doa-stage-detail', 'POST', '/api/doa/stage/cancel', True, False, 'cancelDoaStage'),
  450. ('pages/health/doa-stage-detail', 'POST', '/api/doa/stage/detail', True, False, 'getDoaStageDetail'),
  451. ('pages/health/doa-week-edit', 'POST', '/api/doa/stage/detail', True, False, 'getDoaStageDetail'),
  452. ('pages/health/doa-week-edit', 'POST', '/api/doa/week/plan', True, False, 'submitDoaWeekPlan'),
  453. ('pages/health/doa-week-edit', 'POST', '/api/doa/week/review', True, False, 'submitDoaWeekReview'),
  454. ('pages/health/gut-flora-detail', 'POST', '/api/family/member/add', True, False, 'addFamilyMember'),
  455. ('pages/health/gut-flora-detail', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  456. ('pages/health/gut-flora-detail', 'POST', '/api/food/recommendation/caution', True, False, 'getFoodCautionList'),
  457. ('pages/health/gut-flora-detail', 'POST', '/api/health/foods', True, False, 'getHealthFoods'),
  458. ('pages/health/gut-flora-detail', 'POST', '/api/health/knowledge/query', True, False, 'queryKnowledgeBase'),
  459. ('pages/health/gut-flora-detail', 'POST', '/api/health/knowledge/v3/indicator/query', True, False, 'queryIndicatorKnowledge'),
  460. ('pages/health/gut-flora-detail', 'POST', '/api/health/report/confirm', True, False, 'confirmReportPreview'),
  461. ('pages/health/gut-flora-detail', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
  462. ('pages/health/gut-flora-detail', 'POST', '/api/health/report/discard', True, False, 'discardReportDraft'),
  463. ('pages/health/gut-flora-detail', 'POST', '/api/health/report/edit', True, False, 'editHealthReport'),
  464. ('pages/health/gut-flora-detail', 'POST', '/api/health/report/parse', True, False, 'parseReportDraft'),
  465. ('pages/health/gut-flora-detail', 'POST', '/api/indicator/change-ranking', True, False, 'getIndicatorChangeRanking'),
  466. ('pages/health/gut-flora-detail', 'POST', '/api/nutrition/beijing/analysis', True, False, 'getGutFloraAnalysis'),
  467. ('pages/health/gut-flora-foods-detail', 'POST', '/api/food/recommendation/members', True, False, 'getCautionFamilyMembers'),
  468. ('pages/health/gut-flora-foods-detail', 'POST', '/api/food/recommendation/trend', True, False, 'getFoodCautionTrend'),
  469. ('pages/health/gut-flora-foods-detail', 'POST', '/api/health/foods', True, False, 'getHealthFoods'),
  470. ('pages/health/gut-flora-foods-detail', 'POST', '/api/health/knowledge/v3/food/query', True, False, 'queryFoodKnowledge'),
  471. ('pages/health/gut-flora-foods-detail', 'POST', '/api/health/report/edit', True, False, 'editHealthReport'),
  472. ('pages/health/gut-flora-risks-detail', 'POST', '/api/health/knowledge/query', True, False, 'queryKnowledgeBase'),
  473. ('pages/health/gut-flora-risks-detail', 'POST', '/api/health/knowledge/unified/disease/query', True, False, 'queryDiseaseKnowledge'),
  474. ('pages/health/gut-flora-risks-detail', 'POST', '/api/health/knowledge/v3/indicator/query', True, False, 'queryIndicatorKnowledge'),
  475. ('pages/health/gut-flora-risks-detail', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
  476. ('pages/health/gut-flora-risks-detail', 'POST', '/api/health/report/edit', True, False, 'editHealthReport'),
  477. ('pages/health/gut-flora-species-detail', 'POST', '/api/health/knowledge/query', True, False, 'queryKnowledgeBase'),
  478. ('pages/health/gut-flora-species-detail', 'POST', '/api/health/knowledge/v3/bacteria/query', True, False, 'queryBacteriaKnowledge'),
  479. ('pages/health/gut-flora-species-detail', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
  480. ('pages/health/gut-flora-species-detail', 'POST', '/api/health/report/edit', True, False, 'editHealthReport'),
  481. ('pages/health/health-plan-summary', 'POST', '/api/diet/preferences/current-member', True, False, 'getDietPreferences'),
  482. ('pages/health/health-plan-summary', 'POST', '/api/diet/preferences/save', True, False, 'saveDietPreferences'),
  483. ('pages/health/health-plan-summary', 'POST', '/api/health-status/get', True, False, 'getHealthStatus'),
  484. ('pages/health/health-plan-summary', 'POST', '/api/health-status/save', True, False, 'saveHealthStatus'),
  485. ('pages/health/health-plan-summary', 'POST', '/api/health-status/signature', True, False, 'saveHealthSignature'),
  486. ('pages/health/health-plan-summary', 'POST', '/api/health/plan/confirm', True, False, 'confirmPlan'),
  487. ('pages/health/health-plan-summary', 'POST', '/api/health/plan/detail', True, False, 'getHealthPlanDetail'),
  488. ('pages/health/health-plan-summary', 'POST', '/api/health/plan/generate', True, False, 'generateHealthPlan'),
  489. ('pages/health/health-plan-summary', 'POST', '/api/health/plan/regenerate-section', True, False, 'regenerateSection'),
  490. ('pages/health/health-plan-summary', 'POST', '/api/health/plan/save', True, False, 'saveHealthPlan'),
  491. ('pages/health/health-plan-summary', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  492. ('pages/health/health-status-form', 'POST', '/api/health-status/get', True, False, 'getHealthStatus'),
  493. ('pages/health/health-status-form', 'POST', '/api/health-status/save', True, False, 'saveHealthStatus'),
  494. ('pages/health/health-survey', 'POST', '/api/diet/preferences/current-member', True, False, 'getDietPreferences'),
  495. ('pages/health/health-survey', 'POST', '/api/diet/preferences/save', True, False, 'saveDietPreferences'),
  496. ('pages/health/health-survey', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  497. ('pages/health/health-survey', 'POST', '/api/health-status/get', True, False, 'getHealthStatus'),
  498. ('pages/health/health-survey', 'POST', '/api/health-status/save', True, False, 'saveHealthStatus'),
  499. ('pages/health/health-survey', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  500. ('pages/health/indicator-curve', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  501. ('pages/health/indicator-curve', 'POST', '/api/indicator/change-ranking', True, False, 'getIndicatorChangeRanking'),
  502. ('pages/health/indicator-curve', 'POST', '/api/indicator/trend', True, False, 'getIndicatorTrend'),
  503. ('pages/health/indicator-quicklook', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  504. ('pages/health/indicator-quicklook', 'POST', '/api/indicator/quick-lookup', True, False, 'getIndicatorQuickLookup'),
  505. ('pages/health/my-feedback', 'POST', '/api/health/feedback/list', False, False, 'getMyReportFeedbacks'),
  506. ('pages/health/nutrition-profile', 'POST', '/api/health/nutrition/deficiency', True, False, 'getDeficiencyAnalysis'),
  507. ('pages/health/nutrition-profile', 'POST', '/api/health/nutrition/profile', True, False, 'getChildNutritionProfile'),
  508. ('pages/health/physical-exam-detail', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
  509. ('pages/health/plan-list', 'POST', '/api/health/plan/delete', True, False, 'deleteHealthPlan'),
  510. ('pages/health/plan-list', 'POST', '/api/health/plan/list', True, False, 'getHealthPlanList'),
  511. ('pages/health/report-confirm', 'POST', '/api/family/member/add', True, False, 'addFamilyMember'),
  512. ('pages/health/report-confirm', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  513. ('pages/health/report-confirm', 'POST', '/api/health/report/parse', True, False, 'parseReportDraft'),
  514. ('pages/health/report-detail', 'POST', '/api/family/member/add', True, False, 'addFamilyMember'),
  515. ('pages/health/report-detail', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  516. ('pages/health/report-detail', 'POST', '/api/health/report/edit', True, False, 'editHealthReport'),
  517. ('pages/health/report-detail', 'POST', '/api/health/report/parse', True, False, 'parseReportDraft'),
  518. ('pages/health/report-detail', 'POST', '/api/health/report/payload', True, False, 'getReportPayload'),
  519. ('pages/health/report-list', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  520. ('pages/health/report-list', 'POST', '/api/health/report/collecting-list', True, False, 'getCollectingReports'),
  521. ('pages/health/report-list', 'POST', '/api/health/report/delete', True, False, 'deleteReport'),
  522. ('pages/health/report-list', 'POST', '/api/health/report/list', True, False, 'getReportList'),
  523. ('pages/health/report-list', 'POST', '/api/health/report/reassign', True, False, 'reassignReport'),
  524. ('pages/health/report-list', 'POST', '/api/health/report/transfer/approve', True, False, 'approveReportTransfer'),
  525. ('pages/health/report-list', 'POST', '/api/health/report/transfer/deny', True, False, 'denyReportTransfer'),
  526. ('pages/health/report-list', 'POST', '/api/health/report/transfer/list', True, False, 'getReportTransferList'),
  527. ('pages/health/report-survey', 'POST', '/api/health/survey/create', True, False, 'createReportSurvey'),
  528. ('pages/health/report-survey', 'POST', '/api/health/survey/submit', True, False, 'submitReportSurvey'),
  529. ('pages/health/report-survey', 'POST', '/api/survey/status', True, False, 'getSurveyStatus'),
  530. ('pages/health/report-upload', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  531. ('pages/health/report-upload', 'POST', '/api/health/report/collect/status', True, False, 'getReportCollectStatus'),
  532. ('pages/health/report-upload', 'POST', '/api/health/report/transfer/request', True, False, 'requestReportTransfer'),
  533. ('pages/health/report-upload', 'POST', '/api/health/report/upload-only', True, False, 'uploadReportOnly'),
  534. ('pages/health/survey-history', 'POST', '/api/survey/history', True, False, 'getSurveyHistory'),
  535. ('pages/health/survey-history', 'POST', '/api/survey/template/active', True, False, 'getActiveTemplates'),
  536. ('pages/health/survey-questionnaire', 'POST', '/api/survey/submit', True, False, 'submitSurvey'),
  537. ('pages/health/survey-questionnaire', 'POST', '/api/survey/template/active', True, False, 'getActiveTemplates'),
  538. ('pages/health/teacher-service', 'POST', '/api/health-plan/available-teachers', True, False, 'getAvailableTeachers'),
  539. ('pages/home-pages/child-index', 'POST', '/api/activity/list', False, False, 'getActivityList'),
  540. ('pages/home-pages/child-index', 'POST', '/api/energy/logs', True, False, 'getEnergyLogs'),
  541. ('pages/home-pages/child-index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  542. ('pages/home-pages/child-index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
  543. ('pages/home-pages/child-index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  544. ('pages/home-pages/child-index', 'POST', '/api/guide-config/current', True, False, 'getGuideConfig'),
  545. ('pages/home-pages/child-index', 'POST', '/api/guide/popup/consume', True, False, 'consumeGuidePopup'),
  546. ('pages/home-pages/child-index', 'POST', '/api/guide/popup/list', True, False, 'getGuidePopupList'),
  547. ('pages/home-pages/child-index', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
  548. ('pages/home-pages/child-index', 'POST', '/api/unlock/status', True, False, 'getUnlockStatus'),
  549. ('pages/home-pages/child-index', 'POST', '/api/family/user/switch-mode', True, False, 'switchMode'),
  550. ('pages/home-pages/components/AdBanner', 'POST', '/api/home-banner/list', True, False, 'getHomeBanners'),
  551. ('pages/home-pages/components/ContactImport', 'POST', '/api/contact/import-phone', True, False, 'importPhoneContact'),
  552. ('pages/home-pages/components/DailySummary', 'POST', '/api/feedback/read', False, False, 'markFeedbackRead'),
  553. ('pages/home-pages/components/DailySummary', 'POST', '/api/feedback/today', False, False, 'getTodayFeedback'),
  554. ('pages/home-pages/components/MicroActionCard', 'POST', '/api/micro-action/complete', True, False, 'microActionComplete'),
  555. ('pages/home-pages/components/MicroActionCard', 'POST', '/api/micro-action/today', True, False, 'microActionToday'),
  556. ('pages/home-pages/member-home-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  557. ('pages/home-pages/parent-index', 'POST', '/api/activity/list', False, False, 'getActivityList'),
  558. ('pages/home-pages/parent-index', 'POST', '/api/articles/featured', False, False, 'getFeaturedArticles'),
  559. ('pages/home-pages/parent-index', 'POST', '/api/contact/list', True, False, 'getContactList'),
  560. ('pages/home-pages/parent-index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  561. ('pages/home-pages/parent-index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
  562. ('pages/home-pages/parent-index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  563. ('pages/home-pages/parent-index', 'POST', '/api/family/member/switch', True, False, 'switchToFamilyMember'),
  564. ('pages/home-pages/parent-index', 'POST', '/api/family/self-check/status', True, False, 'getSelfCheckStatus'),
  565. ('pages/home-pages/parent-index', 'POST', '/api/health/alert/dismiss', True, False, 'dismissAlert'),
  566. ('pages/home-pages/parent-index', 'POST', '/api/health/alert/list', True, False, 'getActiveAlerts'),
  567. ('pages/home-pages/parent-index', 'POST', '/api/health/challenge/list', True, False, 'getChallengeList'),
  568. ('pages/home-pages/parent-index', 'POST', '/api/health/circle/list', True, False, 'getCircleList'),
  569. ('pages/home-pages/parent-index', 'POST', '/api/health/circle/ranking', True, False, 'getCircleRanking'),
  570. ('pages/home-pages/parent-index', 'POST', '/api/health/family/ranking', True, False, 'getFamilyRanking'),
  571. ('pages/home-pages/parent-index', 'POST', '/api/invite/qrcode', True, False, 'getInviteQrCode'),
  572. ('pages/home-pages/parent-index', 'POST', '/api/parent/dashboard', True, False, 'getParentDashboard'),
  573. ('pages/home-pages/parent-index', 'POST', '/api/stats/child-completion', True, False, 'getChildCompletionStats'),
  574. ('pages/home-pages/parent-index', 'POST', '/api/tasks//:var/review', True, True, 'approveTask'),
  575. ('pages/home-pages/parent-index', 'POST', '/api/tasks//:var/review', True, True, 'rejectTask'),
  576. ('pages/home-pages/parent-index', 'POST', '/api/tasks/pending-review', True, False, 'getPendingReviewTasks'),
  577. ('pages/home-pages/parent-index', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
  578. ('pages/home-pages/parent-index', 'POST', '/api/unlock/status', True, False, 'getUnlockStatus'),
  579. ('pages/home-pages/parent-index', 'POST', '/api/wishes/pending', True, False, 'getPendingWishes'),
  580. ('pages/home/app-library', 'POST', '/api/home/app-library', True, False, 'getAppLibrary'),
  581. ('pages/home/app-library', 'POST', '/api/home/shortcut/reset', True, False, 'resetShortcutConfig'),
  582. ('pages/home/app-library', 'POST', '/api/home/shortcut/save', True, False, 'saveShortcutConfig'),
  583. ('pages/index-home/index', 'POST', '/api/activity/list', False, False, 'getActivityList'),
  584. ('pages/index-home/index', 'POST', '/api/admin/notices/all', True, False, 'getNotices'),
  585. ('pages/index-home/index', 'POST', '/api/articles/featured', False, False, 'getFeaturedArticles'),
  586. ('pages/index-home/index', 'POST', '/api/commission/cf/list', True, False, 'getCfList'),
  587. ('pages/index-home/index', 'POST', '/api/commission/cf/summary', True, False, 'getCfSummary'),
  588. ('pages/index-home/index', 'POST', '/api/energy/logs', True, False, 'getEnergyLogs'),
  589. ('pages/index-home/index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  590. ('pages/index-home/index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
  591. ('pages/index-home/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  592. ('pages/index-home/index', 'POST', '/api/family/member/switch', True, False, 'switchToFamilyMember'),
  593. ('pages/index-home/index', 'POST', '/api/family/self-check/status', True, False, 'getSelfCheckStatus'),
  594. ('pages/index-home/index', 'POST', '/api/guide-config/current', True, False, 'getGuideConfig'),
  595. ('pages/index-home/index', 'POST', '/api/guide/parent-invite/accept', True, False, 'acceptParentInvite'),
  596. ('pages/index-home/index', 'POST', '/api/guide/popup/consume', True, False, 'consumeGuidePopup'),
  597. ('pages/index-home/index', 'POST', '/api/guide/popup/list', True, False, 'getGuidePopupList'),
  598. ('pages/index-home/index', 'POST', '/api/health/challenge/list', True, False, 'getChallengeList'),
  599. ('pages/index-home/index', 'POST', '/api/health/challenge/progress', True, False, 'updateChallengeProgress'),
  600. ('pages/index-home/index', 'POST', '/api/health/challenge/respond', True, False, 'respondChallenge'),
  601. ('pages/index-home/index', 'POST', '/api/home/app-library', True, False, 'getAppLibrary'),
  602. ('pages/index-home/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  603. ('pages/index-home/index', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
  604. ('pages/index-home/index', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  605. ('pages/index-home/index', 'POST', '/api/notification/list', True, False, 'getNotificationList'),
  606. ('pages/index-home/index', 'POST', '/api/notification/read', True, False, 'readNotification'),
  607. ('pages/index-home/index', 'POST', '/api/points/logs', True, False, 'getPointsLogs'),
  608. ('pages/index-home/index', 'POST', '/api/survey/status', True, False, 'getSurveyStatus'),
  609. ('pages/index-home/index', 'POST', '/api/tasks/history', True, False, 'getTaskHistory'),
  610. ('pages/index-home/index', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
  611. ('pages/invite/join', 'POST', '/api/family/invite/check-family', False, False, 'checkUserFamily'),
  612. ('pages/invite/join', 'POST', '/api/family/invite/validate', False, False, 'validateInvitation'),
  613. ('pages/invite/join', 'POST', '/api/family/invite/validate-family-code', False, False, 'validateFamilyCode'),
  614. ('pages/invite/join', 'POST', '/api/invite/bind', True, False, 'bindReferral'),
  615. ('pages/invite/join-form', 'POST', '/api/family/invite/request-join-by-code', False, False, 'requestJoinByCode'),
  616. ('pages/invite/join-form', 'POST', '/api/user/update', True, False, 'updateUserInfo'),
  617. ('pages/login/scan-login', 'POST', '/api/auth/wechat-web/scan', False, False, 'wechatWebScan'),
  618. ('pages/match/street-match', 'POST', '/api/admin/families/count', True, False, 'countFamiliesByStreetIds'),
  619. ('pages/match/street-match', 'POST', '/api/admin/teachers/count', True, False, 'countTeachersByStreetIds'),
  620. ('pages/meal/log', 'POST', '/api/meal/log', True, False, 'logMeal'),
  621. ('pages/meal/log', 'POST', '/api/meal/logs', True, False, 'getMealLogs'),
  622. ('pages/meal/log', 'POST', '/api/meal/nutrition-summary', True, False, 'getNutritionSummary'),
  623. ('pages/meal/preference', 'POST', '/api/nutrition/profile/get', True, False, 'getNutritionProfile'),
  624. ('pages/meal/preference', 'POST', '/api/nutrition/profile/save', True, False, 'saveNutritionProfile'),
  625. ('pages/meal/recommend', 'POST', '/api/meal/recommend', True, False, 'getMealRecommend'),
  626. ('pages/meal/recommend', 'POST', '/api/meal/replace', True, False, 'replaceFood'),
  627. ('pages/member-detail/components/member-detail-sections/action-section', 'POST', '/api/activity/list', False, False, 'getActivityList'),
  628. ('pages/member-detail/components/member-detail-sections/action-section', 'POST', '/api/tasks/today', True, False, 'getTodayTasksByCategory'),
  629. ('pages/member-detail/components/member-detail-sections/action-section', 'POST', '/api/wealth/checkin/stats', True, False, 'getCheckinStats'),
  630. ('pages/member-detail/components/member-detail-sections/body-section', 'POST', '/api/dimension/overview', True, False, 'getDimensionOverview'),
  631. ('pages/member-detail/components/member-detail-sections/body-section', 'POST', '/api/health/analysis', True, False, 'getHealthAnalysis'),
  632. ('pages/member-detail/components/member-detail-sections/body-section', 'POST', '/api/wealth/checkin/list', True, False, 'getCheckinList'),
  633. ('pages/member-detail/components/member-detail-sections/mind-section', 'POST', '/api/contact/list', True, False, 'getContactList'),
  634. ('pages/member-detail/components/member-detail-sections/mind-section', 'POST', '/api/family/relationship/health-alerts', True, False, 'getHealthAlerts'),
  635. ('pages/member-detail/components/member-detail-sections/mind-section', 'POST', '/api/family/relationship/milestones', True, False, 'getMilestones'),
  636. ('pages/member-detail/components/member-detail-sections/mind-section', 'POST', '/api/family/relationship/scores', True, False, 'getRelationshipScores'),
  637. ('pages/member-detail/components/member-detail-sections/wisdom-section', 'POST', '/api/assessment/history', True, False, 'getAssessmentHistory'),
  638. ('pages/member-detail/components/member-detail-sections/wisdom-section', 'POST', '/api/assessment/latest-result', True, False, 'getAssessmentLatestResult'),
  639. ('pages/member-detail/member-detail', 'POST', '/api/activity/list', False, False, 'getActivityList'),
  640. ('pages/member-detail/member-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  641. ('pages/member-detail/report-detail', 'POST', '/api/health/report/detail', True, False, 'getReportDetail'),
  642. ('pages/membership/benefits', 'POST', '/api/membership/benefits', True, False, 'getMembershipBenefits'),
  643. ('pages/membership/benefits', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  644. ('pages/membership/index', 'POST', '/api/butler/my-butler', False, False, 'getMyButler'),
  645. ('pages/membership/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  646. ('pages/membership/index', 'POST', '/api/membership/benefits', True, False, 'getMembershipBenefits'),
  647. ('pages/membership/index', 'POST', '/api/membership/compare', True, False, 'getMembershipCompare'),
  648. ('pages/membership/index', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  649. ('pages/membership/pay', 'POST', '/api/coupon/list', True, False, 'getCouponList'),
  650. ('pages/membership/pay', 'POST', '/api/membership/orders', True, False, 'createOrder'),
  651. ('pages/membership/pay', 'POST', '/api/membership/orders/continue', True, False, 'nextOrder'),
  652. ('pages/membership/pay', 'POST', '/api/membership/plans', True, False, 'getMembershipPlans'),
  653. ('pages/membership/result', 'POST', '/api/coupon/join-rules', True, False, 'getJoinCouponRules'),
  654. ('pages/membership/result', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  655. ('pages/membership/result', 'POST', '/api/membership/orders/continue', True, False, 'nextOrder'),
  656. ('pages/membership/upgrade', 'POST', '/api/coupon/join-rules', True, False, 'getJoinCouponRules'),
  657. ('pages/membership/upgrade', 'POST', '/api/membership/compare', True, False, 'getMembershipCompare'),
  658. ('pages/membership/upgrade', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  659. ('pages/membership/upgrade', 'POST', '/api/membership/plans', True, False, 'getMembershipPlans'),
  660. ('pages/membership/upgrade', 'POST', '/api/membership/upgrade-records', True, False, 'getUpgradeRecords'),
  661. ('pages/mind-detail/articles', 'POST', '/api/articles/categories', False, False, 'getArticleCategories'),
  662. ('pages/mind-detail/articles', 'POST', '/api/articles/list', False, False, 'getArticleList'),
  663. ('pages/mind-detail/components/PsychCrisisBanner', 'POST', '/api/health/alert/dismiss', True, False, 'dismissAlert'),
  664. ('pages/mind-detail/emotion-report', 'POST', '/api/emireport/latest', True, False, 'getEmiReport'),
  665. ('pages/mind-detail/family-dashboard', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  666. ('pages/mind-detail/family-dashboard', 'POST', '/api/mind/fortune', True, False, 'getFamilyFortune'),
  667. ('pages/mind-detail/family-dashboard', 'POST', '/api/mind/fortune/month', True, False, 'getMonthFortune'),
  668. ('pages/mind-detail/family-dashboard', 'POST', '/api/mind/fortune/reports', True, False, 'getFortuneReports'),
  669. ('pages/mind-detail/family-dashboard', 'POST', '/api/mind/fortune/week', True, False, 'getWeekFortune'),
  670. ('pages/mind-detail/index', 'POST', '/api/contact/list', True, False, 'getContactList'),
  671. ('pages/mind-detail/index', 'POST', '/api/content-sections/visible', True, False, 'getVisibleSections'),
  672. ('pages/mind-detail/index', 'POST', '/api/dan-assessment/report/child', True, False, 'getDanReportByChild'),
  673. ('pages/mind-detail/index', 'POST', '/api/dimension/radar-data', True, False, 'getRadarData'),
  674. ('pages/mind-detail/index', 'POST', '/api/emireport/latest', True, False, 'getEmiReport'),
  675. ('pages/mind-detail/index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  676. ('pages/mind-detail/index', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
  677. ('pages/mind-detail/index', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  678. ('pages/mind-detail/index', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
  679. ('pages/mind-detail/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  680. ('pages/mind-detail/index', 'POST', '/api/family/relationship/health-alerts', True, False, 'getHealthAlerts'),
  681. ('pages/mind-detail/index', 'POST', '/api/family/relationship/milestones', True, False, 'getMilestones'),
  682. ('pages/mind-detail/index', 'POST', '/api/health/indicators', True, False, 'getLatestIndicators'),
  683. ('pages/mind-detail/index', 'POST', '/api/mind/fortune', True, False, 'getFamilyFortune'),
  684. ('pages/mind-detail/innate-portrait', 'POST', '/api/mind/innate/reading', True, False, 'getInnateReading'),
  685. ('pages/mind-detail/innate-trajectory', 'POST', '/api/mind/innate/trajectory', True, False, 'getInnateTrajectory'),
  686. ('pages/mind-detail/member-mind-detail', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  687. ('pages/mind-detail/member-mind-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  688. ('pages/mind-detail/training', 'POST', '/api/game/stats', True, False, 'getGameStats'),
  689. ('pages/notification/index', 'POST', '/api/notification/list', True, False, 'getNotificationList'),
  690. ('pages/notification/index', 'POST', '/api/notification/read', True, False, 'readNotification'),
  691. ('pages/nutritionist/apply', 'POST', '/api/nutritionist/apply', False, False, 'nutritionistApply'),
  692. ('pages/orchestration/editor', 'POST', '/api/admin/task-templates', True, False, 'getNodeTemplateList'),
  693. ('pages/orchestration/editor', 'POST', '/api/orchestration/flow/detail', True, False, 'getOrchestrationFlowDetail'),
  694. ('pages/orchestration/editor', 'POST', '/api/orchestration/flow/publish', True, False, 'publishOrchestrationFlow'),
  695. ('pages/orchestration/editor', 'POST', '/api/orchestration/flow/save', True, False, 'saveOrchestrationFlow'),
  696. ('pages/orchestration/index', 'POST', '/api/orchestration/flow/archive', True, False, 'archiveOrchestrationFlow'),
  697. ('pages/orchestration/index', 'POST', '/api/orchestration/flow/delete', True, False, 'deleteOrchestrationFlow'),
  698. ('pages/orchestration/index', 'POST', '/api/orchestration/flow/list', True, False, 'getOrchestrationFlowList'),
  699. ('pages/orchestration/index', 'POST', '/api/orchestration/flow/publish', True, False, 'publishOrchestrationFlow'),
  700. ('pages/orchestration/node-edit', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  701. ('pages/parent/appointments', 'POST', '/api/dan-assessment/appointment/cancel', True, False, 'cancelAppointment'),
  702. ('pages/parent/appointments', 'POST', '/api/dan-assessment/appointment/user', True, False, 'getMyAppointments'),
  703. ('pages/parent/child-detail', 'POST', '/api/tasks/pending-review', True, False, 'getPendingReviewTasks'),
  704. ('pages/parent/child-detail', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
  705. ('pages/parent/child-detail', 'POST', '/api/wishes/pending', True, False, 'getPendingWishes'),
  706. ('pages/parent/plans/detail', 'POST', '/api/guide/plans/detail', True, False, 'getGuidePlanDetail'),
  707. ('pages/parent/plans/index', 'POST', '/api/guide/plans/family-list', True, False, 'listFamilyPlans'),
  708. ('pages/parent/wishes/index', 'POST', '/api/wishes//:var/approve-exchange', True, True, 'approveWishExchange'),
  709. ('pages/parent/wishes/index', 'POST', '/api/wishes//:var/fulfill', True, True, 'markWishFulfilled'),
  710. ('pages/parent/wishes/index', 'POST', '/api/wishes//:var/price', True, True, 'setWishPrice'),
  711. ('pages/parent/wishes/index', 'POST', '/api/wishes//:var/reject', True, True, 'rejectWish'),
  712. ('pages/parent/wishes/index', 'POST', '/api/wishes/list', True, False, 'getWishes'),
  713. ('pages/parent/wishes/index', 'POST', '/api/wishes/pending', True, False, 'getPendingWishes'),
  714. ('pages/pearl-reminders/index', 'POST', '/api/pearl/interaction/add', True, False, 'addPearlInteraction'),
  715. ('pages/pearl-reminders/index', 'POST', '/api/pearl/reminder/list', True, False, 'getPearlReminders'),
  716. ('pages/profile-extra/coupons', 'POST', '/api/coupon/claim', True, False, 'claimCoupon'),
  717. ('pages/profile-extra/coupons', 'POST', '/api/coupon/exchangeable', True, False, 'getExchangeableCoupons'),
  718. ('pages/profile-extra/coupons', 'POST', '/api/coupon/my', True, False, 'getMyCoupons'),
  719. ('pages/profile-extra/coupons', 'POST', '/api/family-platform/exchange-coupon', True, False, 'exchangeCouponByCf'),
  720. ('pages/profile-extra/family-members', 'POST', '/api/family/invite/generate', False, False, 'generateFamilyInvite'),
  721. ('pages/profile-extra/family-members', 'POST', '/api/family/invite/pending-requests', False, False, 'getPendingJoinRequests'),
  722. ('pages/profile-extra/family-members', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
  723. ('pages/profile-extra/family-members', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  724. ('pages/profile-extra/family-members', 'POST', '/api/family/member/switch', True, False, 'switchToFamilyMember'),
  725. ('pages/profile-extra/family-members', 'POST', '/api/health/report/member-permission/revoke', True, False, 'revokeReportMemberPermission'),
  726. ('pages/profile-extra/family-members', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  727. ('pages/profile-extra/gates', 'POST', '/api/unlock/status', True, False, 'getUnlockStatus'),
  728. ('pages/profile-extra/onboarding', 'POST', '/api/onboarding/claim', True, False, 'claimOnboardingReward'),
  729. ('pages/profile-extra/onboarding', 'POST', '/api/onboarding/progress', True, False, 'getOnboardingProgress'),
  730. ('pages/profile-main/profile', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
  731. ('pages/profile-main/profile', 'POST', '/api/cart/count', True, False, 'cartCount'),
  732. ('pages/profile-main/profile', 'POST', '/api/commission/my-referrer', True, False, 'getMyReferrer'),
  733. ('pages/profile-main/profile', 'POST', '/api/commission/team/consumption', True, False, 'getTeamConsumption'),
  734. ('pages/profile-main/profile', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
  735. ('pages/profile-main/profile', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  736. ('pages/profile-main/profile', 'POST', '/api/health/challenge/list', True, False, 'getChallengeList'),
  737. ('pages/profile-main/profile', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
  738. ('pages/profile-main/profile', 'POST', '/api/invite/summary', True, False, 'getReferralSummary'),
  739. ('pages/profile-main/profile', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  740. ('pages/profile-main/profile', 'POST', '/api/product/order/my/counts', False, False, 'getOrderCounts'),
  741. ('pages/profile-main/profile', 'POST', '/api/share/qrcode', True, False, 'getShareQrCode'),
  742. ('pages/profile-main/profile', 'POST', '/api/tasks/today', True, False, 'getTodayTasksByCategory'),
  743. ('pages/profile-main/profile', 'POST', '/api/user/info', True, False, 'getUserInfo'),
  744. ('pages/profile-main/profile', 'POST', '/api/user/profile-stats', True, False, 'getProfileStats'),
  745. ('pages/profile-main/profile', 'POST', '/api/vendor/status', False, False, 'vendorStatus'),
  746. ('pages/profile/components/ProfileHeader', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
  747. ('pages/profile/components/ProfileHeader', 'POST', '/api/family/member/switch', True, False, 'switchToFamilyMember'),
  748. ('pages/profile/components/ProfileMenu', 'POST', '/api/auth/set-password', False, False, 'setPassword'),
  749. ('pages/profile/components/ProfileMenu', 'POST', '/api/auth/verify-password', False, False, 'verifyPassword'),
  750. ('pages/profile/components/ProfileMenu', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  751. ('pages/profile/components/ProfileMenu', 'POST', '/api/family/user/members/update-visibility', True, False, 'updateMemberVisibility'),
  752. ('pages/profile/components/ProfileMenu', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
  753. ('pages/profile/components/ProfileMenu', 'POST', '/api/vendor/status', False, False, 'vendorStatus'),
  754. ('pages/profile/components/ProfileStats', 'POST', '/api/user/action-stats', True, False, 'getUserActionStats'),
  755. ('pages/profile/index', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
  756. ('pages/profile/message-history', 'POST', '/api/commission/cf/list', True, False, 'getCfList'),
  757. ('pages/profile/message-history', 'POST', '/api/energy/logs', True, False, 'getEnergyLogs'),
  758. ('pages/profile/message-history', 'POST', '/api/notification/list', True, False, 'getNotificationList'),
  759. ('pages/profile/message-history', 'POST', '/api/notification/read', True, False, 'readNotification'),
  760. ('pages/profile/message-history', 'POST', '/api/points/logs', True, False, 'getPointsLogs'),
  761. ('pages/profile/portrait-edit', 'POST', '/api/energy/sandbox', True, False, 'getEnergySandbox'),
  762. ('pages/profile/portrait-edit', 'POST', '/api/user/portrait/edit', True, False, 'editPortrait'),
  763. ('pages/profile/portrait-edit', 'POST', '/api/user/portrait/get', True, False, 'getPortrait'),
  764. ('pages/profile/report-detail', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
  765. ('pages/profile/report-management', 'POST', '/api/report-summary/list', True, False, 'getReportSummaryList'),
  766. ('pages/profile/service-role-apply', 'POST', '/api/service-role/my-apply', True, False, 'getMyServiceRoleApply'),
  767. ('pages/profile/service-role-apply', 'POST', '/api/service-role/upload-image', True, False, 'uploadServiceRoleImage'),
  768. ('pages/promotion/commission', 'POST', '/api/commission/cf/list', True, False, 'getCfList'),
  769. ('pages/promotion/commission', 'POST', '/api/commission/cf/summary', True, False, 'getCfSummary'),
  770. ('pages/promotion/index', 'POST', '/api/commission/cf/summary', True, False, 'getCfSummary'),
  771. ('pages/promotion/index', 'POST', '/api/earnings/admin/distribute', True, False, 'distributeToMember'),
  772. ('pages/promotion/index', 'POST', '/api/earnings/admin/toggle-member', True, False, 'toggleMemberBalance'),
  773. ('pages/promotion/index', 'POST', '/api/earnings/admin/withdraw', True, False, 'withdrawFamilyEarnings'),
  774. ('pages/promotion/index', 'POST', '/api/earnings/family/summary', True, False, 'getFamilyEarningsSummary'),
  775. ('pages/promotion/index', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
  776. ('pages/promotion/index', 'POST', '/api/invite/summary', True, False, 'getReferralSummary'),
  777. ('pages/promotion/invite', 'POST', '/api/invite/bind', True, False, 'bindReferral'),
  778. ('pages/promotion/invite', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
  779. ('pages/promotion/invite', 'POST', '/api/invite/list', True, False, 'getReferralList'),
  780. ('pages/promotion/invite', 'POST', '/api/invite/milestone/claim', True, False, 'claimInviteMilestone'),
  781. ('pages/promotion/invite', 'POST', '/api/invite/milestone/list', True, False, 'getInviteMilestones'),
  782. ('pages/promotion/invite', 'POST', '/api/invite/qrcode', True, False, 'getInviteQrCode'),
  783. ('pages/promotion/invite', 'POST', '/api/invite/summary', True, False, 'getReferralSummary'),
  784. ('pages/promotion/leaderboard', 'POST', '/api/leaderboard/my-rank', True, False, 'getLeaderboardMyRank'),
  785. ('pages/promotion/leaderboard', 'POST', '/api/leaderboard/top', True, False, 'getLeaderboardTop'),
  786. ('pages/promotion/team', 'POST', '/api/commission/cf/rate', True, False, 'getCfRate'),
  787. ('pages/promotion/team', 'POST', '/api/commission/my-referrer', True, False, 'getMyReferrer'),
  788. ('pages/promotion/team', 'POST', '/api/commission/team/consumption', True, False, 'getTeamConsumption'),
  789. ('pages/promotion/team', 'POST', '/api/commission/team/consumption-curve', True, False, 'getTeamAllMembersConsumptionCurve'),
  790. ('pages/promotion/team', 'POST', '/api/commission/team/growth-curve', True, False, 'getTeamGrowthCurve'),
  791. ('pages/promotion/team', 'POST', '/api/commission/team/l1-consumption-curve', True, False, 'getTeamL1ConsumptionCurve'),
  792. ('pages/promotion/team', 'POST', '/api/commission/team/list', True, False, 'getTeamList'),
  793. ('pages/promotion/team', 'POST', '/api/commission/team/tree', True, False, 'getTeamTree'),
  794. ('pages/promotion/withdraw', 'POST', '/api/commission/summary', True, False, 'getCommissionSummary'),
  795. ('pages/promotion/withdraw', 'POST', '/api/withdrawal/apply', True, False, 'applyWithdrawal'),
  796. ('pages/promotion/withdraw', 'POST', '/api/withdrawal/history', True, False, 'getWithdrawalHistory'),
  797. ('pages/psych-assessment/index', 'POST', '/api/cognitive/child', True, False, 'getCognitiveChildScores'),
  798. ('pages/psych-assessment/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  799. ('pages/psych-assessment/quiz', 'POST', '/api/cognitive/self-test', True, False, 'submitCognitiveSelfTest'),
  800. ('pages/reminder-config/index', 'POST', '/api/task/reminder-config/get', True, False, 'getReminderConfig'),
  801. ('pages/reminder-config/index', 'POST', '/api/task/reminder-config/save', True, False, 'saveReminderConfig'),
  802. ('pages/rewards/badge', 'POST', '/api/badges/member/list', True, False, 'getMemberBadges'),
  803. ('pages/rewards/badge', 'POST', '/api/badges/favorite', True, False, 'toggleBadgeFavorite'),
  804. ('pages/rewards/badge', 'POST', '/api/badges/list', True, False, 'getActiveBadges'),
  805. ('pages/rewards/badge', 'POST', '/api/badges/ranking/family', True, False, 'getFamilyBadgeRanking'),
  806. ('pages/rewards/badge', 'POST', '/api/badges/statistics/member', True, False, 'getMemberBadgeStats'),
  807. ('pages/rewards/rewards', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  808. ('pages/rewards/rewards', 'POST', '/api/parent/wishlist', True, False, 'createParentWishlist'),
  809. ('pages/rewards/rewards', 'POST', '/api/parent/wishlist//:var/exchange', True, True, 'exchangeParentWishlist'),
  810. ('pages/rewards/rewards', 'POST', '/api/parent/wishlist/list', True, False, 'getParentWishlist'),
  811. ('pages/rewards/rewards', 'POST', '/api/points/balance', True, False, 'getPointsBalance'),
  812. ('pages/rewards/rewards', 'POST', '/api/rewards', True, False, 'createReward'),
  813. ('pages/rewards/rewards', 'POST', '/api/rewards//:var/exchange', True, True, 'exchangeReward'),
  814. ('pages/rewards/rewards', 'POST', '/api/rewards/wishlist', True, False, 'getWishlist'),
  815. ('pages/rewards/rewards', 'POST', '/api/user/info', True, False, 'getUserInfo'),
  816. ('pages/share/index', 'POST', '/api/share/family-footprint', True, False, 'getFamilyFootprint'),
  817. ('pages/shop/cart/cart', 'POST', '/api/membership/gift-membership-progress', True, False, 'getGiftMembershipProgress'),
  818. ('pages/shop/cart/cart', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  819. ('pages/shop/checkout/checkout', 'POST', '/api/coupon/apply', True, False, 'applyCoupon'),
  820. ('pages/shop/checkout/checkout', 'POST', '/api/coupon/checkout-list', True, False, 'getCouponCheckoutList'),
  821. ('pages/shop/checkout/checkout', 'POST', '/api/coupon/list', True, False, 'getCouponList'),
  822. ('pages/shop/checkout/checkout', 'POST', '/api/family-platform/balance', True, False, 'getFamilyPlatformBalance'),
  823. ('pages/shop/checkout/checkout', 'POST', '/api/family-platform/exchange-coupon', True, False, 'exchangeCouponByCf'),
  824. ('pages/shop/checkout/checkout', 'POST', '/api/membership/gift-membership-progress', True, False, 'getGiftMembershipProgress'),
  825. ('pages/shop/checkout/checkout', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  826. ('pages/shop/checkout/checkout', 'POST', '/api/product/detail', False, False, 'productDetail'),
  827. ('pages/shop/checkout/checkout', 'POST', '/api/product/purchase_fields/required', False, False, 'getProductRequiredFields'),
  828. ('pages/shop/checkout/checkout', 'POST', '/api/shop/discount/calculate', False, False, 'shopDiscountCalculate'),
  829. ('pages/shop/checkout/checkout', 'POST', '/api/special-price/info', True, False, 'getSpecialPriceInfo'),
  830. ('pages/shop/checkout/checkout', 'POST', '/api/user/address/list', True, False, 'addressList'),
  831. ('pages/shop/consignee-edit/consignee-edit', 'POST', '/api/consignee/detail', True, False, 'consigneeDetail'),
  832. ('pages/shop/consignee-edit/consignee-edit', 'POST', '/api/consignee/save', True, False, 'consigneeSave'),
  833. ('pages/shop/consignee-list/consignee-list', 'POST', '/api/consignee/delete', True, False, 'consigneeDelete'),
  834. ('pages/shop/consignee-list/consignee-list', 'POST', '/api/consignee/list', True, False, 'consigneeList'),
  835. ('pages/shop/index/index', 'POST', '/api/cart/count', True, False, 'cartCount'),
  836. ('pages/shop/index/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  837. ('pages/shop/index/index', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  838. ('pages/shop/index/index', 'POST', '/api/product/list', False, False, 'productList'),
  839. ('pages/shop/index/index', 'POST', '/api/shop/category/tree', False, False, 'goodsCategory'),
  840. ('pages/shop/order-detail/order-detail', 'POST', '/api/product/order/cancel', False, False, 'productOrderCancel'),
  841. ('pages/shop/order-detail/order-detail', 'POST', '/api/product/order/confirm', False, False, 'productOrderConfirm'),
  842. ('pages/shop/order-detail/order-detail', 'POST', '/api/product/order/detail', False, False, 'productOrderDetail'),
  843. ('pages/shop/order-list/order-list', 'POST', '/api/product/order/cancel', False, False, 'productOrderCancel'),
  844. ('pages/shop/order-list/order-list', 'POST', '/api/product/order/confirm', False, False, 'productOrderConfirm'),
  845. ('pages/shop/order-list/order-list', 'POST', '/api/product/order/my', False, False, 'productOrderMy'),
  846. ('pages/shop/order-list/order-list', 'POST', '/api/product/order/my/counts', False, False, 'productOrderCounts'),
  847. ('pages/shop/payment/payment', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  848. ('pages/shop/search/search', 'POST', '/api/product/list', False, False, 'productList'),
  849. ('pages/stats/completion-rate', 'POST', '/api/stats/child-completion', True, False, 'getChildCompletionStats'),
  850. ('pages/stats/completion-rate', 'POST', '/api/stats/family-completion', True, False, 'getFamilyCompletionStats'),
  851. ('pages/stats/index', 'POST', '/api/stats/child/overview', True, False, 'getChildOverview'),
  852. ('pages/tasks/create-task', 'POST', '/api/tasks/create', True, False, 'createTask'),
  853. ('pages/tasks/create-task', 'POST', '/api/tasks/list', True, False, 'getTaskListForPicker'),
  854. ('pages/tasks/daily-tasks', 'POST', '/api/growth-task/claim', True, False, 'claimGrowthTaskReward'),
  855. ('pages/tasks/daily-tasks', 'POST', '/api/growth-task/list', True, False, 'getGrowthTaskList'),
  856. ('pages/tasks/review', 'POST', '/api/tasks//:var/review', True, True, 'approveTask'),
  857. ('pages/tasks/review', 'POST', '/api/tasks//:var/review', True, True, 'rejectTask'),
  858. ('pages/tasks/review', 'POST', '/api/tasks/history', True, False, 'getTaskHistory'),
  859. ('pages/tasks/review', 'POST', '/api/tasks/pending-review', True, False, 'getPendingReviewTasks'),
  860. ('pages/tasks/tasks', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  861. ('pages/tasks/tasks', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  862. ('pages/tasks/tasks', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  863. ('pages/tasks/tasks', 'POST', '/api/tasks//:var/complete', True, True, 'completeTask'),
  864. ('pages/tasks/tasks', 'POST', '/api/tasks/accept', True, False, 'acceptTask'),
  865. ('pages/tasks/tasks', 'POST', '/api/tasks/create', True, False, 'createTask'),
  866. ('pages/tasks/tasks', 'POST', '/api/tasks/my-pending', True, False, 'getMyPendingTasks'),
  867. ('pages/tasks/tasks', 'POST', '/api/tasks/today', True, False, 'getTodayTasks'),
  868. ('pages/teacher/chat', 'POST', '/api/guide/messages/list', True, False, 'getGuideMessages'),
  869. ('pages/teacher/families', 'POST', '/api/guide/families', True, False, 'getBoundFamilies'),
  870. ('pages/teacher/messages', 'POST', '/api/guide/messages/list', True, False, 'getGuideMessages'),
  871. ('pages/teacher/orders', 'POST', '/api/guide/orders/list', True, False, 'getGuideOrders'),
  872. ('pages/teacher/orders', 'POST', '/api/guide/orders/stats', True, False, 'getOrderStats'),
  873. ('pages/teacher/plan-create', 'POST', '/api/guide/training-plans/create', True, False, 'createTrainingPlan'),
  874. ('pages/teacher/plan-detail', 'POST', '/api/guide/families//:var/plans//:var/update', True, True, 'updateGuidePlanContent'),
  875. ('pages/teacher/plan-detail', 'POST', '/api/guide/families//:var/plans/pending', True, True, 'getGuidePendingPlans'),
  876. ('pages/teacher/plan-list', 'POST', '/api/guide/training-plans/list', True, False, 'getTrainingPlanList'),
  877. ('pages/teacher/review-family', 'POST', '/api/guide/families//:var/children//:var/pending-review', True, True, 'getGuideChildPendingTasks'),
  878. ('pages/teacher/review-family', 'POST', '/api/guide/families//:var/members', True, True, 'getGuideFamilyMembers'),
  879. ('pages/teacher/review-family', 'POST', '/api/guide/families//:var/plans/pending', True, True, 'getGuidePendingPlans'),
  880. ('pages/teacher/review-family', 'POST', '/api/guide/families//:var/tasks//:var/review', True, True, 'reviewGuideTask'),
  881. ('pages/teacher/review-family', 'POST', '/api/tasks//:var/review', True, True, 'reviewTask'),
  882. ('pages/teacher/review-workbench', 'POST', '/api/guide/families/my-families', True, False, 'getGuideMyFamilies'),
  883. ('pages/teacher/service-tasks', 'POST', '/api/tasks//:var/complete', True, True, 'completeTask'),
  884. ('pages/teacher/teacher-profile', 'POST', '/api/guide/parent-invite/generate', True, False, 'generateParentInvite'),
  885. ('pages/teacher/teacher-profile', 'POST', '/api/auth/switch-role', True, False, 'switchRole'),
  886. ('pages/teacher/team', 'POST', '/api/guide/invite-code/generate', False, False, 'generateInviteCode'),
  887. ('pages/teacher/team', 'POST', '/api/guide/team/invite-code/generate', True, False, 'generateTeamInviteCode'),
  888. ('pages/teacher/team', 'POST', '/api/guide/team/members', True, False, 'getTeamMembers'),
  889. ('pages/teacher/team', 'POST', '/api/guide/team/stats', True, False, 'getTeamStats'),
  890. ('pages/user-edit/user-edit', 'POST', '/api/auth/direct-register', False, False, 'directRegister'),
  891. ('pages/user-edit/user-edit', 'POST', '/api/family/invite/request-join-by-code', False, False, 'requestJoinByCode'),
  892. ('pages/user-edit/user-edit', 'POST', '/api/family/user/create-family', True, False, 'createFamily'),
  893. ('pages/user-edit/user-edit', 'POST', '/api/membership/my', True, False, 'getMyMembership'),
  894. ('pages/user-edit/user-edit', 'POST', '/api/user/info', True, False, 'getUserInfo'),
  895. ('pages/user-edit/user-edit', 'POST', '/api/user/update', True, False, 'updateUserInfo'),
  896. ('pages/vendor/apply', 'POST', '/api/vendor/apply', True, False, 'vendorApply'),
  897. ('pages/vendor/center', 'POST', '/api/vendor/info', False, False, 'vendorInfo'),
  898. ('pages/vendor/center', 'POST', '/api/vendor/status', False, False, 'vendorStatus'),
  899. ('pages/vendor/order-review/order-review', 'POST', '/api/product/order/detail', False, False, 'productOrderDetail'),
  900. ('pages/vendor/order-review/order-review', 'POST', '/api/product/order/review/update', False, False, 'productOrderReviewUpdate'),
  901. ('pages/vendor/orders/orders', 'POST', '/api/product/order/confirm', False, False, 'productOrderConfirm'),
  902. ('pages/vendor/orders/orders', 'POST', '/api/product/order/vendor', False, False, 'productOrderVendor'),
  903. ('pages/vendor/product-edit/product-edit', 'POST', '/api/product/create', False, False, 'productCreate'),
  904. ('pages/vendor/product-edit/product-edit', 'POST', '/api/product/detail', False, False, 'productDetail'),
  905. ('pages/vendor/product-edit/product-edit', 'POST', '/api/product/update', False, False, 'productUpdate'),
  906. ('pages/vendor/products/products', 'POST', '/api/product/my', False, False, 'productMy'),
  907. ('pages/vendor/products/products', 'POST', '/api/product/shelve', False, False, 'productShelve'),
  908. ('pages/vendor/team-customers/team-customers', 'POST', '/api/admin/supply-team/customers', True, False, 'getTeamCustomers'),
  909. ('pages/vendor/team-system/team-system', 'POST', '/api/admin/supply-hierarchy/my', True, False, 'getVendorHierarchyInfo'),
  910. ('pages/vendor/team-system/team-system', 'POST', '/api/admin/supply-system/my-system', True, False, 'getVendorSystemInfo'),
  911. ('pages/vendor/team-system/team-system', 'POST', '/api/admin/supply-team/customers', True, False, 'getVendorTeamCustomers'),
  912. ('pages/vendor/team-system/team-system', 'POST', '/api/admin/supply-team/members', True, False, 'getVendorTeamMembers'),
  913. ('pages/wealth-cf/index', 'GET', '/api/cf/balance', True, False, 'getCfBalance'),
  914. ('pages/wealth-cf/index', 'GET', '/api/cf/family-coupons', True, False, 'getFamilyCoupons'),
  915. ('pages/wealth-cf/index', 'GET', '/api/cf/logs', True, False, 'getCfLogs'),
  916. ('pages/wealth-cf/index', 'POST', '/api/coupon/exchangeable', True, False, 'getExchangeableCoupons'),
  917. ('pages/wealth-cf/index', 'POST', '/api/family-platform/exchange-coupon', True, False, 'exchangeCouponByCf'),
  918. ('pages/wealth-detail/member-wealth-detail', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  919. ('pages/wealth-detail/member-wealth-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  920. ('pages/wealth-sub/checkin', 'POST', '/api/wealth/checkin/create', True, False, 'createCheckin'),
  921. ('pages/wealth-sub/checkin', 'POST', '/api/wealth/checkin/delete', True, False, 'deleteCheckin'),
  922. ('pages/wealth-sub/checkin', 'POST', '/api/wealth/checkin/list', True, False, 'getCheckinList'),
  923. ('pages/wealth-sub/checkin', 'POST', '/api/wealth/checkin/stats', True, False, 'getCheckinStats'),
  924. ('pages/wealth-sub/insurance-add', 'POST', '/api/wealth/insurance/create', False, False, 'createInsurance'),
  925. ('pages/wealth-sub/insurance-add', 'POST', '/api/wealth/insurance/detail', False, False, 'getInsuranceDetail'),
  926. ('pages/wealth-sub/insurance-add', 'POST', '/api/wealth/insurance/update', False, False, 'updateInsurance'),
  927. ('pages/wealth-sub/insurance-add', 'POST', '/api/wealth/insurance/upload', False, False, 'uploadPolicy'),
  928. ('pages/wealth-sub/insurance-list', 'POST', '/api/wealth/insurance/delete', False, False, 'deleteInsurance'),
  929. ('pages/wealth-sub/insurance-list', 'POST', '/api/wealth/insurance/list', False, False, 'getInsuranceList'),
  930. ('pages/wealth-sub/insurance-planning', 'POST', '/api/insurance/planning', True, False, 'getInsurancePlanning'),
  931. ('pages/wealth/index', 'POST', '/api/badges/statistics/member', True, False, 'getMemberBadgeStats'),
  932. ('pages/wealth/index', 'POST', '/api/commission/summary', True, False, 'getCommissionSummary'),
  933. ('pages/wealth/index', 'POST', '/api/daily-task/overview', True, False, 'getDailyTaskOverview'),
  934. ('pages/wealth/index', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  935. ('pages/wealth/index', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  936. ('pages/wealth/index', 'POST', '/api/energy/wealth-detail', True, False, 'getWealthDetail'),
  937. ('pages/wealth/index', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
  938. ('pages/wealth/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  939. ('pages/wealth/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  940. ('pages/wealth/index', 'POST', '/api/invite/summary', True, False, 'getReferralSummary'),
  941. ('pages/wealth/index', 'POST', '/api/product/list', False, False, 'productList'),
  942. ('pages/wealth/index', 'POST', '/api/wealth/insurance/list', False, False, 'getInsuranceList'),
  943. ('pages/wisdom-detail/cognitive-report', 'POST', '/api/assessment/latest-result', True, False, 'getAssessmentLatestResult'),
  944. ('pages/wisdom-detail/cognitive-report', 'POST', '/api/cognitive/norms', True, False, 'getCognitiveNorms'),
  945. ('pages/wisdom-detail/cognitive-report', 'POST', '/api/cognitive/recommendations', True, False, 'getCognitiveRecommendations'),
  946. ('pages/wisdom-detail/cognitive-report', 'POST', '/api/cognitive/recommendations/create-task', True, False, 'createTaskFromRecommendation'),
  947. ('pages/wisdom-detail/cognitive-report', 'POST', '/api/cognitive/trend', True, False, 'getCognitiveTrend'),
  948. ('pages/wisdom-detail/index', 'POST', '/api/assessment/latest-result', True, False, 'getAssessmentLatestResult'),
  949. ('pages/wisdom-detail/index', 'POST', '/api/content-sections/visible', True, False, 'getVisibleSections'),
  950. ('pages/wisdom-detail/index', 'POST', '/api/dan-assessment/report/child', True, False, 'getDanReportByChild'),
  951. ('pages/wisdom-detail/index', 'POST', '/api/dimension/radar-data', True, False, 'getRadarData'),
  952. ('pages/wisdom-detail/index', 'POST', '/api/family/member/kick', True, False, 'kickFamilyMemberById'),
  953. ('pages/wisdom-detail/index', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  954. ('pages/wisdom-detail/index', 'POST', '/api/health/indicators', True, False, 'getLatestIndicators'),
  955. ('pages/wisdom-detail/index', 'POST', '/api/wisdom/gut-cognition', True, False, 'getGutCognitionIndicators'),
  956. ('pages/wisdom-detail/member-wisdom-detail', 'POST', '/api/energy/overview', True, False, 'getEnergyOverview'),
  957. ('pages/wisdom-detail/member-wisdom-detail', 'POST', '/api/energy/sandbox', True, False, 'getFamilyEnergySandbox'),
  958. ('pages/wishes/create', 'POST', '/api/wishes/create', True, False, 'createWish'),
  959. ('pages/wishes/detail', 'POST', '/api/points/balance', True, False, 'getPointsBalance'),
  960. ('pages/wishes/detail', 'POST', '/api/wishes//:var', True, True, 'cancelWish'),
  961. ('pages/wishes/detail', 'POST', '/api/wishes//:var', True, True, 'getWishById'),
  962. ('pages/wishes/detail', 'POST', '/api/wishes//:var/confirm', True, True, 'confirmWishReceived'),
  963. ('pages/wishes/detail', 'POST', '/api/wishes//:var/exchange', True, True, 'requestWishExchange'),
  964. ('pages/wishes/index', 'POST', '/api/home/app/enter', True, False, 'reportAppEnter'),
  965. ('pages/wishes/index', 'POST', '/api/points/balance', True, False, 'getPointsBalance'),
  966. ('pages/wishes/index', 'POST', '/api/wishes//:var', True, True, 'cancelWish'),
  967. ('pages/wishes/index', 'POST', '/api/wishes//:var/confirm', True, True, 'confirmWishReceived'),
  968. ('pages/wishes/index', 'POST', '/api/wishes//:var/exchange', True, True, 'requestWishExchange'),
  969. ('pages/wishes/index', 'POST', '/api/wishes/create', True, False, 'createWish'),
  970. ('pages/wishes/index', 'POST', '/api/wishes/list', True, False, 'getWishes'),
  971. ('store/health-alert', 'POST', '/api/health/alert/dismiss', True, False, 'dismissAlert'),
  972. ('store/health-alert', 'POST', '/api/health/alert/list', True, False, 'getActiveAlerts'),
  973. ('store/health-score', 'POST', '/api/health/score/info', True, False, 'getHealthScoreInfo'),
  974. ('store/health-score', 'POST', '/api/health/timeline/list', True, False, 'getHealthTimeline'),
  975. ('store/index', 'POST', '/api/family/user/switch-back-verify', True, False, 'switchBackVerify'),
  976. ('store/index', 'POST', '/api/family/user/switch-back-to-parent', True, False, 'switchBackToParent'),
  977. ('store/index', 'POST', '/api/auth/switch-role', True, False, 'switchRole'),
  978. ('store/index', 'POST', '/api/family/user/switch-to-child', True, False, 'switchToChild'),
  979. ('store/modules/tianpan', 'POST', '/api/tianpan/annual-energy', False, False, 'tianpanAnnualEnergy'),
  980. ('store/modules/tianpan', 'POST', '/api/tianpan/daily-fortune', False, False, 'tianpanDailyFortune'),
  981. ('store/modules/tianpan', 'POST', '/api/tianpan/dashboard', False, False, 'tianpanDashboard'),
  982. ('store/modules/tianpan', 'POST', '/api/tianpan/related-items', False, False, 'tianpanRelatedItems'),
  983. ('utils/api', 'POST', '/api/admin/activity/list', False, False, 'adminListMyActivities'),
  984. ('utils/api', 'POST', '/api/admin/task-templates', True, False, 'getNodeTemplateList'),
  985. ('utils/api', 'POST', '/api/auth/silent-login', False, False, 'silentLogin'),
  986. ('utils/api', 'POST', '/api/badges/member/list', True, False, 'getMemberBadges'),
  987. ('utils/api', 'POST', '/api/butler/available-list', False, False, 'getAvailableButlers'),
  988. ('utils/api', 'POST', '/api/butler/my-butler', False, False, 'getMyButler'),
  989. ('utils/api', 'POST', '/api/butler/select', False, False, 'selectButler'),
  990. ('utils/api', 'POST', '/api/dan-assessment/order/pay', True, False, 'payAssessmentOrder'),
  991. ('utils/api', 'POST', '/api/family/invite/approve-request', False, False, 'approveJoinRequest'),
  992. ('utils/api', 'POST', '/api/family/invite/my-request', False, False, 'getMyJoinRequest'),
  993. ('utils/api', 'POST', '/api/family/invite/pending-requests', False, False, 'getPendingJoinRequests'),
  994. ('utils/api', 'POST', '/api/family/invite/reject-request', False, False, 'rejectJoinRequest'),
  995. ('utils/api', 'POST', '/api/family/member/list', True, False, 'getFamilyMemberList'),
  996. ('utils/api', 'POST', '/api/family/user/create-family', True, False, 'createFamily'),
  997. ('utils/api', 'POST', '/api/internal/virtual-pay/error-report', True, False, 'reportVirtualPayError'),
  998. ('utils/api', 'POST', '/api/invite/bind', True, False, 'bindReferral'),
  999. ('utils/api', 'POST', '/api/invite/code', True, False, 'getReferralCode'),
  1000. ('utils/api', 'POST', '/api/orchestration/execution/detail', True, False, 'getOrchestrationExecutionDetail'),
  1001. ('utils/api', 'POST', '/api/orchestration/execution/start', True, False, 'startOrchestrationExecution'),
  1002. ('utils/api', 'POST', '/api/orchestration/execution/terminate', True, False, 'terminateOrchestrationExecution'),
  1003. ('utils/api', 'POST', '/api/orchestration/flow/archive', True, False, 'archiveOrchestrationFlow'),
  1004. ('utils/api', 'POST', '/api/orchestration/flow/delete', True, False, 'deleteOrchestrationFlow'),
  1005. ('utils/api', 'POST', '/api/orchestration/flow/detail', True, False, 'getOrchestrationFlowDetail'),
  1006. ('utils/api', 'POST', '/api/orchestration/flow/list', True, False, 'getOrchestrationFlowList'),
  1007. ('utils/api', 'POST', '/api/orchestration/flow/publish', True, False, 'publishOrchestrationFlow'),
  1008. ('utils/api', 'POST', '/api/orchestration/flow/save', True, False, 'saveOrchestrationFlow'),
  1009. ('utils/api', 'POST', '/api/product/list', False, False, 'productList'),
  1010. ('utils/api', 'POST', '/api/profile/history', True, False, 'getProfileTrend'),
  1011. ('utils/api', 'POST', '/api/profile/my', True, False, 'getMyProfile'),
  1012. ('utils/api', 'POST', '/api/purchase/challenge/progress', True, False, 'getChallengeProgress'),
  1013. ('utils/api', 'POST', '/api/recommend/list', True, False, 'getRecommendList'),
  1014. ('utils/api', 'POST', '/api/stats/child/overview', True, False, 'getChildOverview'),
  1015. ('utils/api', 'POST', '/api/tasks/history', True, False, 'getTaskHistory'),
  1016. ('utils/api', 'POST', '/api/user/portrait/edit', True, False, 'editPortrait'),
  1017. ('utils/api', 'POST', '/api/user/portrait/generate', True, False, 'generatePortrait'),
  1018. ('utils/api', 'POST', '/api/user/portrait/get', True, False, 'getPortrait'),
  1019. ('utils/api', 'POST', '/api/user/portrait/regenerate', True, False, 'regeneratePortrait'),
  1020. ('utils/profile-backfill', 'POST', '/api/user/profile/backfill', True, False, 'backfillProfile'),
  1021. ('utils/sso', 'POST', '/api/auth/sso-ticket', False, False, 'createSsoTicket'),
  1022. ]
  1023. # ── 长耗时 AI 路径单列超时(避免「正常但慢」被误判成 CONN_ERR)───────────────
  1024. # 这些接口即使空体冒烟也会同步触发 LLM 调用,历史实测耗时在 5~50s 区间抖动,
  1025. # 网关侧另有 proxy_read_timeout 60s 的一道 504。若沿用统一的 --timeout(8~10s),
  1026. # 同一接口会在 fix/reg 之间来回假翻转(06:54 轮实测 9.52s 通过、10.55s 被斩,
  1027. # 恰好骑在 10s 阈值两侧)。故此处按前缀单列更宽的超时,让慢但成功如实记 BIZ_OK,
  1028. # 让真正超过网关 60s 的失败如实记 SERVER_ERR/504,而不是混成 CONN_ERR。
  1029. SLOW_PATH_PREFIXES = (
  1030. '/api/user/portrait/generate',
  1031. '/api/user/portrait/regenerate',
  1032. )
  1033. SLOW_PATH_TIMEOUT = int(os.getenv('CFC_SLOW_TIMEOUT', '90'))
  1034. def _timeout_for(path, default):
  1035. """长耗时 AI 路径放行到 SLOW_PATH_TIMEOUT,其余接口沿用 --timeout。"""
  1036. for _pfx in SLOW_PATH_PREFIXES:
  1037. if path.startswith(_pfx):
  1038. return max(default, SLOW_PATH_TIMEOUT)
  1039. return default
  1040. def _call(base, method, path, token=None, timeout=10, host=None, body=b'{}'):
  1041. url = base.rstrip('/') + path
  1042. headers = {'Content-Type': 'application/json'}
  1043. if host:
  1044. headers['Host'] = host
  1045. if token:
  1046. headers['Authorization'] = 'Bearer ' + token
  1047. data = body if method in ('POST', 'PUT', 'DELETE') else None
  1048. req = urllib.request.Request(url, data=data, headers=headers, method=method)
  1049. try:
  1050. with urllib.request.urlopen(req, timeout=timeout) as resp:
  1051. body = resp.read().decode('utf-8', 'replace')
  1052. code = resp.getcode()
  1053. except urllib.error.HTTPError as e:
  1054. try:
  1055. body = e.read().decode('utf-8', 'replace') if e.fp else ''
  1056. except Exception:
  1057. body = ''
  1058. code = e.code
  1059. except urllib.error.URLError as e:
  1060. class _R:
  1061. status_code = -1
  1062. text = str(getattr(e, 'reason', e))
  1063. def json(self):
  1064. raise ValueError('no json')
  1065. return _R()
  1066. except Exception as e:
  1067. class _R:
  1068. status_code = -1
  1069. text = '%s: %s' % (type(e).__name__, str(e)[:80])
  1070. def json(self):
  1071. raise ValueError('no json')
  1072. return _R()
  1073. class _R:
  1074. status_code = code
  1075. text = body
  1076. def json(self):
  1077. return json.loads(self.text)
  1078. return _R()
  1079. def auto_login(base, host=None, timeout=10):
  1080. """测试模式(wechat.test-mode=true)下 wechat-login 空 body 即可换 token。"""
  1081. r = _call(base, 'POST', '/api/auth/wechat-login', timeout=timeout, host=host)
  1082. try:
  1083. d = r.json()
  1084. tok = (d.get('data') or {}).get('token')
  1085. if tok:
  1086. print(f'[登录] 获取 token 成功 userId={(d.get("data") or {}).get("userId")} '
  1087. f'role={(d.get("data") or {}).get("role")}')
  1088. return tok
  1089. except Exception:
  1090. pass
  1091. print('[登录] 失败:未取到 token')
  1092. return None
  1093. def direct_register(base, host=None, timeout=10, phone=None, role=None):
  1094. """测试首选登录:跳过验证码直接注册/登录(AuthController.direct-register)。
  1095. 返回 (token, info);失败返回 (None, None)。phone 不传则按时间生成唯一号避免『已注册』。"""
  1096. if not phone:
  1097. phone = '138' + str(int(time.time() * 1000) % 10 ** 8).zfill(8)
  1098. body = json.dumps({'phone': phone, 'nickname': 'smoke-bot',
  1099. 'role': role or 'parent'}).encode('utf-8')
  1100. r = _call(base, 'POST', '/api/auth/direct-register', timeout=timeout, host=host, body=body)
  1101. try:
  1102. d = r.json()
  1103. tok = (d.get('data') or {}).get('token')
  1104. if tok:
  1105. info = d.get('data') or {}
  1106. print(f'[登录] direct-register 成功 phone={phone} userId={info.get("userId")} '
  1107. f'role={info.get("role")}')
  1108. return tok, info
  1109. except Exception:
  1110. pass
  1111. print('[登录] direct-register 失败: ' + str(getattr(r, 'text', ''))[:120])
  1112. return None, None
  1113. def acquire_tokens(base, host=None, timeout=10, want_teacher=False):
  1114. """多角色 token 前置:返回 {'parent': tok, 'teacher': tok}。
  1115. 父 token 优先 wechat-login(测试模式空 body),失败回退 direct-register;
  1116. 师 token 仅当 want_teacher=True 时用 direct-register(role=teacher) 获取
  1117. (避免定时任务每轮都新建教师账号)。任一获取失败则为 None(不影响其它用例)。"""
  1118. tokens = {'parent': None, 'teacher': None}
  1119. # 父 token
  1120. tok = auto_login(base, host=host, timeout=timeout)
  1121. if not tok:
  1122. tok, _ = direct_register(base, host=host, timeout=timeout, role='parent')
  1123. tokens['parent'] = tok
  1124. # 师 token(按需)
  1125. if want_teacher:
  1126. tok, _ = direct_register(base, host=host, timeout=timeout, role='teacher')
  1127. tokens['teacher'] = tok
  1128. if not tokens['parent'] and not tokens['teacher']:
  1129. print('[登录] 警告:父/师 token 均未取得,登录态接口将被跳过')
  1130. return tokens
  1131. def _classify(r):
  1132. """返回 (http_code, biz_code, 类别)
  1133. 契约基线(见 INTERFACE_CONTRACT_REVIEW.md):
  1134. - 成功 = Result.code == 200;其余为非 0 失败码(含 401/403/410/5001/4001 等)
  1135. - 不带 token 访问非白名单接口:JwtInterceptor 注入匿名用户放行,
  1136. HTTP 仍是 200,但业务 code 非 200(多为 500)——归为 BIZ_FAIL(伪 200)
  1137. - 真正未登录/ token 非法或命中强制登录路径:HTTP 401 —— 归为 AUTH_FAIL
  1138. """
  1139. if r.status_code == -1:
  1140. return -1, None, 'CONN_ERR'
  1141. try:
  1142. d = r.json()
  1143. biz = d.get('code') if isinstance(d, dict) else None
  1144. msg = (d.get('message') if isinstance(d, dict) else None)
  1145. except Exception:
  1146. return r.status_code, None, 'NON_JSON'
  1147. if r.status_code == 404:
  1148. return r.status_code, biz, 'NOT_FOUND'
  1149. if r.status_code == 401:
  1150. return r.status_code, biz, 'AUTH_FAIL' # 真未登录 / token 非法 / 强制登录路径
  1151. if r.status_code >= 500:
  1152. return r.status_code, biz, 'SERVER_ERR'
  1153. if biz == 200:
  1154. return r.status_code, biz, 'BIZ_OK'
  1155. # 匿名放行或业务自定义失败码(410/403/5001/4001/500 等)统一归 BIZ_FAIL
  1156. return r.status_code, biz, 'BIZ_FAIL'
  1157. def main():
  1158. ap = argparse.ArgumentParser(description='CFC 小程序端接口冒烟测试')
  1159. ap.add_argument('--base', default=os.getenv('CFC_BASE', 'http://192.168.16.251'))
  1160. ap.add_argument('--host', default=os.getenv('CFC_HOST', 'cfc.iwintrue.com'),
  1161. help='Host 头(域名 DNS 不通时用 IP + Host 头访问)')
  1162. ap.add_argument('--auto-login', action='store_true', help='自动登录换 token(优先 wechat-login,回退 direct-register)')
  1163. ap.add_argument('--authed', action='store_true', help='同时跑登录态接口')
  1164. ap.add_argument('--multi-role', action='store_true', help='额外获取 teacher token 并跑多角色验证用例')
  1165. ap.add_argument('--param-val', default='1', help='路径参数 :var 的占位值')
  1166. ap.add_argument('--timeout', type=int, default=10)
  1167. ap.add_argument('--only-page', default='', help='只跑指定页面路由(含匹配即可)')
  1168. ap.add_argument('--report', default='', help='结果报告输出文件')
  1169. ap.add_argument('--extra', default='', help='额外用例文件 TSV(page fn method path auth param),追加到 CASES,用于新需求/变更需求补全测试')
  1170. ap.add_argument('--only-extra', action='store_true', help='仅运行 --extra 用例(跳过内置全量用例),用于聚焦业务级重测')
  1171. ap.add_argument('--body-map', default='', help='真实请求体映射 TSV(method<TAB>path<TAB>json),命中则覆盖用例默认空体,用于破除空体冒烟天花板')
  1172. args = ap.parse_args()
  1173. # 加载额外用例(新需求/变更需求补全):追加到 CASES 后再跑
  1174. extra_cases = []
  1175. if args.extra and os.path.exists(args.extra):
  1176. _added = 0
  1177. with open(args.extra, 'r', encoding='utf-8') as _ef:
  1178. for _line in _ef:
  1179. _line = _line.rstrip('\n')
  1180. if not _line or _line.startswith('page'):
  1181. continue
  1182. _p = _line.split('\t')
  1183. if len(_p) < 6:
  1184. continue
  1185. _page, _fn, _method, _path, _auth, _param = _p[:6]
  1186. _c = (_page, _method, _path, _auth.lower() == 'true', _param.lower() == 'true', _fn)
  1187. extra_cases.append(_c)
  1188. CASES.append(_c)
  1189. _added += 1
  1190. print(f'已追加额外用例: {_added} 条(来自 {args.extra})')
  1191. if args.only_extra and extra_cases:
  1192. CASES[:] = extra_cases
  1193. print(f'[only-extra] 仅运行 {len(CASES)} 条额外用例')
  1194. # 加载真实请求体映射(用于破除空体冒烟的天花板)
  1195. body_map = None
  1196. if args.body_map and os.path.exists(args.body_map):
  1197. body_map = {}
  1198. _bm = 0
  1199. with open(args.body_map, 'r', encoding='utf-8') as _bf:
  1200. for _line in _bf:
  1201. _line = _line.rstrip('\n')
  1202. if not _line or _line.startswith('method'):
  1203. continue
  1204. _p = _line.split('\t')
  1205. if len(_p) < 3:
  1206. continue
  1207. _m, _pt, _j = _p[0], _p[1], '\t'.join(_p[2:])
  1208. try:
  1209. json.loads(_j) # 校验合法 JSON,避免注入坏体
  1210. except Exception:
  1211. print(f'[body-map] 跳过非法 JSON: {_m} {_pt}')
  1212. continue
  1213. body_map[(_m.upper(), _pt)] = _j.encode('utf-8')
  1214. _bm += 1
  1215. print(f'已加载请求体映射: {_bm} 条(来自 {args.body_map})')
  1216. tokens = {'parent': None, 'teacher': None}
  1217. token = os.getenv('CFC_TOKEN')
  1218. if args.auto_login and not token:
  1219. tokens = acquire_tokens(args.base, host=args.host, timeout=args.timeout,
  1220. want_teacher=args.multi_role)
  1221. token = tokens['parent']
  1222. print(f'目标: {args.base} Host: {args.host} token: {"有" if token else "无"}')
  1223. stats = {}
  1224. rows = []
  1225. pages = set()
  1226. for case in CASES:
  1227. page, method, path, auth, param, fn, *rest = case
  1228. if args.only_page and args.only_page not in page:
  1229. continue
  1230. if not token and auth:
  1231. continue
  1232. real = path.replace(':var', args.param_val)
  1233. while '//' in real:
  1234. real = real.replace('//', '/')
  1235. # 允许 --body-map 覆盖真实请求体(破除空体冒烟天花板)
  1236. body = rest[0] if rest else b'{}'
  1237. if body_map is not None:
  1238. _m = body_map.get((method, real)) or body_map.get((method, path))
  1239. if _m is not None:
  1240. body = _m
  1241. r = _call(args.base, method, real, token=token, timeout=_timeout_for(real, args.timeout),
  1242. host=args.host, body=body)
  1243. http_code, biz, cat = _classify(r)
  1244. stats[cat] = stats.get(cat, 0) + 1
  1245. pages.add(page)
  1246. rows.append((page, fn, method, real, http_code, biz, cat))
  1247. # ---- 多角色验证(teacher token 前置)----
  1248. if args.multi_role and tokens.get('teacher'):
  1249. print('\n=== 多角色验证(teacher token)===')
  1250. def _msg(rr):
  1251. try:
  1252. j = rr.json()
  1253. return (j.get('message') if isinstance(j, dict) else '') or ''
  1254. except Exception:
  1255. return ''
  1256. def _run(page, fn, method, path, body, tok):
  1257. rr = _call(args.base, method, path, token=tok, timeout=_timeout_for(path, args.timeout),
  1258. host=args.host, body=body)
  1259. hc, bz, ct = _classify(rr)
  1260. stats[ct] = stats.get(ct, 0) + 1
  1261. pages.add(page)
  1262. rows.append((page, fn, method, path, hc, bz, ct))
  1263. return rr, hc, bz, ct
  1264. # 1) teacher token 本身有效(verify 应 BIZ_OK)
  1265. rr, hc, bz, ct = _run('__multi_role__', 'teacherVerify', 'POST',
  1266. '/api/auth/verify', b'{}', tokens['teacher'])
  1267. print(f' [teacher] /api/auth/verify -> {ct} (biz={bz}) 期望 BIZ_OK')
  1268. # 2) 同一 teacher-only 接口:parent 应被拒、teacher 应进入业务校验(均不应 404/连接错)
  1269. body = b'{"inviteCode":"__smoke_dummy__"}'
  1270. rr_p, hcp, bzp, ctp = _run('__multi_role__', 'guideBindAsParent', 'POST',
  1271. '/api/family/guide-bind', body, tokens['parent'])
  1272. rr_t, hct, bzt, ctt = _run('__multi_role__', 'guideBindAsTeacher', 'POST',
  1273. '/api/family/guide-bind', body, tokens['teacher'])
  1274. mp, mt = _msg(rr_p), _msg(rr_t)
  1275. print(f' [parent ] /api/family/guide-bind -> {ctp} msg="{mp[:36]}"')
  1276. print(f' [teacher] /api/family/guide-bind -> {ctt} msg="{mt[:36]}"')
  1277. # 3) 权限接口:非 admin 调 rebuild 应 "权限不足"
  1278. rr, hc, bz, ct = _run('__multi_role__', 'indicatorsRebuildParent', 'POST',
  1279. '/api/health-report/indicators/rebuild',
  1280. b'{"memberId":1}', tokens['parent'])
  1281. print(f' [parent] /api/health-report/indicators/rebuild -> {ct} (biz={bz}) msg="{_msg(rr)[:36]}"')
  1282. total = len(rows)
  1283. print(f'\n=== 汇总 ===')
  1284. print(f'页面覆盖: {len(pages)} 已请求接口: {total}')
  1285. for k in ('BIZ_OK', 'BIZ_FAIL', 'AUTH_FAIL', 'NOT_FOUND', 'SERVER_ERR', 'NON_JSON', 'CONN_ERR'):
  1286. if k in stats:
  1287. print(f' {k:<10}: {stats[k]}')
  1288. ok = stats.get('BIZ_OK', 0)
  1289. print(f'业务成功率(code=200): {ok}/{total} = {ok * 100 // total if total else 0}%')
  1290. if args.report:
  1291. with open(args.report, 'w', encoding='utf-8') as f:
  1292. f.write('page\tfn\tmethod\tpath\thttp\tbiz\tcat\n')
  1293. for row in rows:
  1294. f.write('\t'.join(str(x) for x in row) + '\n')
  1295. print(f'报告已写入: {args.report}')
  1296. # 打印非 BIZ_OK 的前若干条
  1297. bad = [r for r in rows if r[6] != 'BIZ_OK']
  1298. if bad:
  1299. print(f'\n=== 非成功样例(前 30 条 / 共 {len(bad)})===')
  1300. for row in bad[:30]:
  1301. print(f' [{row[6]:<10}] {row[3]:<52} HTTP {row[4]} biz={row[5]} ({row[0]} :: {row[1]})')
  1302. if __name__ == '__main__':
  1303. main()
  1304. """
  1305. AUTH_NOTE —— 鉴权流程(需微信上下文,无法纯脚本自动化,给出 curl 模板):
  1306. 1) 微信登录(需 uni.login 的 code,只能在小程序内拿):
  1307. curl -X POST {BASE}/api/auth/wechat-login \
  1308. -H 'Content-Type: application/json' \
  1309. -d '{"code":"<wx_login_code>","nickname":"test","avatar":"https://..."}'
  1310. 2) 手机号验证码登录(需微信 phoneCode):
  1311. curl -X POST {BASE}/api/auth/phone-login \
  1312. -H 'Content-Type: application/json' -d '{"phone":"...","code":"..."}'
  1313. 3) 测试环境直接注册(api.js 中 directRegister,标"测试环境"):
  1314. curl -X POST {BASE}/api/auth/direct-register \
  1315. -H 'Content-Type: application/json' -d '{"phone":"13800000000","nickname":"smoke"}'
  1316. 拿到 token 后:export CFC_TOKEN=<token>,再跑 --authed。
  1317. """