功能地图
17 个路由模块 / 199 条路由
功能地图
全系统的 199 个网址,按「归属哪个模块」归成 17 组。 一个模块就是一个源文件——哪个功能在哪个文件里,一眼能看到。
| 模块 | 网址数 | 这个模块管什么 |
|---|---|---|
| app/routers/api/v1.py | 36 | 给程序用的接口。老系统完全没有,这次新加的。 含对外开放接口 |
| app/routers/manager/wechat.py | 29 | 微信相关设置:服务号配置、菜单、素材、模板消息。 |
| app/routers/manager/system.py | 27 | 内容库与系统设置:文章、标签、字典、参数。 |
| app/routers/manager/leads.py | 17 | 线索池。谁在跟进、跟到哪一步、打了什么标签。 |
| app/routers/manager/events.py | 15 | 活动与报名。办一场活动、收报名、出二维码和海报。 |
| app/routers/manager/surveys.py | 12 | 问卷调研。建卷、改题、调选项、看答卷。 |
| app/routers/manager/accounts.py | 10 | 账号权限、流量来源、操作日志。 |
| app/routers/video/h5.py | 10 | 客户在手机上看到的页面:活动落地、报名、问卷、分享。 |
| app/routers/manager/dashboard.py | 8 | 后台首页那块看板,和各种统计图。 |
| app/routers/video/qrcode.py | 8 | 二维码图片直出。网址是老名字,故意保留。 |
| app/routers/auth.py | 6 | 登录、退出、改密码。 |
| app/routers/wechat_callback.py | 5 | 微信服务号把事件推过来的地方——客户扫码的归因就靠它。 |
| app/main.py | 4 | 整个程序的入口:装配好所有东西,定义体检地址。 |
| app/routers/manager/audit.py | 4 | 操作日志:谁在什么时候改了什么。老系统完全没有。 |
| app/routers/manager/reports.py | 4 | 报表与导出中心。 |
| app/routers/mcp.py | 3 | 给 AI 助手用的入口——AI 通过它直接读写系统。 |
| app/routers/files.py | 1 | 把二维码、海报这些文件读出来发给浏览器。 |
逐模块展开
点开任意一个模块,能看到它下面每一个网址的完整信息。
app/routers/api/v1.py 36 个网址 36 个开放接口
对外开放 API v1(原站完全没有的新功能)。
给程序用的接口。老系统完全没有,这次新加的。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /api/v1/events | api_events | api/v1.py:884 | 活动列表 |
| GET | /api/v1/events/{aid} | api_event_detail | api/v1.py:898 | 活动详情(含统计/表单字段/分享码) |
| GET | /api/v1/events/{aid}/signups | api_event_signups | api/v1.py:953 | 报名名单 |
| POST | /api/v1/events/{aid}/signups | api_event_signup | api/v1.py:989 | 代客报名(写线索 + 评分 + 归因) |
| POST | /api/v1/events/{aid}/signups/{sid}/audit | api_audit_signup | api/v1.py:1039 | 报名审核 |
| POST | /api/v1/events/{aid}/signups/{sid}/checkin | api_checkin | api/v1.py:1057 | 签到 |
| GET | /api/v1/health | api_health | api/v1.py:456 | 供 Aily / 监控探活。 |
| GET | /api/v1/leads | api_leads | api/v1.py:488 | 线索列表(分页 + 筛选) |
| GET | /api/v1/leads/duplicates | api_find_duplicates | api/v1.py:787 | 查重(手机/邮箱/openid 三键) |
| GET | /api/v1/leads/export.csv | api_export_leads | api/v1.py:801 | 导出线索 CSV。 |
| POST | /api/v1/leads/merge | api_merge_leads | api/v1.py:763 | 合并重复线索(新功能) |
| GET | /api/v1/leads/{uid:int} | api_lead_detail | api/v1.py:517 | 线索详情(含标签/行为/备注/归因链) |
| POST | /api/v1/leads/{uid:int}/behaviors | api_add_behavior | api/v1.py:605 | 写入线索行为(自动参与评分) |
| POST | /api/v1/leads/{uid:int}/remark | api_add_remark | api/v1.py:708 | 追加跟进备注 |
| POST | /api/v1/leads/{uid:int}/status | api_set_status | api/v1.py:660 | 变更线索状态 |
| POST | /api/v1/leads/{uid:int}/tags | api_set_tags | api/v1.py:729 | 打标签 / 取消标签 |
| GET | /api/v1/meta/scopes | api_scopes | api/v1.py:474 | 列出可用 scope |
| GET | /api/v1/qrcodes | api_qrcodes | api/v1.py:1235 | 二维码台账(新功能:原站不落档、不可统计) |
| POST | /api/v1/qrcodes/event | api_qrcode_event | api/v1.py:1245 | 生成活动带参二维码 |
| GET | /api/v1/qrcodes/preview.png | api_qrcode_preview | api/v1.py:1338 | 内网演示 / 联调用:本地生成 PNG 直出,不产生微信归因。 |
| POST | /api/v1/qrcodes/survey | api_qrcode_survey | api/v1.py:1301 | 生成问卷带参二维码 |
| GET | /api/v1/stats/behaviors | api_stats_behaviors | api/v1.py:1380 | 行为分布 |
| GET | /api/v1/stats/channels | api_stats_channels | api/v1.py:1390 | 渠道分布 |
| GET | /api/v1/stats/funnel | api_stats_funnel | api/v1.py:1372 | 状态漏斗 |
| GET | /api/v1/stats/leaderboard | api_stats_leaderboard | api/v1.py:1399 | 顾问业绩榜 + 活动/问卷排行 |
| GET | /api/v1/stats/overview | api_stats_overview | api/v1.py:1354 | 总览指标(含环比) |
| GET | /api/v1/stats/recent-leads | api_stats_recent | api/v1.py:1422 | 最新线索(供大屏轮播) |
| GET | /api/v1/stats/today | api_stats_today | api/v1.py:1414 | 今日快照 |
| GET | /api/v1/stats/trend | api_stats_trend | api/v1.py:1363 | 新增线索 / 报名 / 答卷 趋势 |
| GET | /api/v1/surveys | api_surveys | api/v1.py:1088 | 问卷列表 |
| GET | /api/v1/surveys/{qid}/answers | api_survey_answers | api/v1.py:1195 | 答卷列表 |
| POST | /api/v1/surveys/{qid}/answers | api_survey_answer | api/v1.py:1147 | 提交答卷(自动评分并落线索) |
| GET | /api/v1/surveys/{qid}/schema | api_survey_schema | api/v1.py:1124 | 问卷结构(供 H5 / 外部表单渲染) |
| GET | /api/v1/tokens | api_tokens | api/v1.py:1536 | Token 列表(含归属人与签发人) |
| POST | /api/v1/tokens | api_token_create | api/v1.py:1544 | 按人签发。 |
| DELETE | /api/v1/tokens/{tid} | api_token_revoke | api/v1.py:1652 | 停用 Token(软停,记录保留) |
app/routers/manager/wechat.py 29 个网址
后台 · 微信模块。
微信相关设置:服务号配置、菜单、素材、模板消息。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /manager/Sendmanage/replyauto | autoreply_list | manager/wechat.py:462 | — |
| POST | /manager/Sendmanage/replyauto_save | autoreply_save | manager/wechat.py:469 | — |
| POST | /manager/System/webhook_save | webhook_save | manager/wechat.py:573 | — |
| POST | /manager/System/webhook_test | webhook_test | manager/wechat.py:616 | — |
| GET | /manager/System/webhooks | webhook_list | manager/wechat.py:554 | — |
| GET | /manager/TemplateMsg/template_sendlist | template_list | manager/wechat.py:502 | — |
| POST | /manager/TemplateMsg/template_sync | template_sync | manager/wechat.py:510 | 拉取线上模板消息列表(只读)。实测线上有 11 条。 |
| GET | /manager/WechatPost/addPost | poster_new | manager/wechat.py:102 | 新建海报模板页(复刻原站 addPost 表单:底图 + 偏移 + 尺寸)。 |
| POST | /manager/WechatPost/ajax_addposter | poster_save | manager/wechat.py:116 | 保存海报模板 —— 字段名与原站 ajax_addposter 完全一致。 |
| POST | /manager/WechatPost/deleteoneposter | poster_delete | manager/wechat.py:228 | — |
| GET | /manager/WechatPost/followers | follower_list | manager/wechat.py:279 | 粉丝列表(含扫码归因字段 —— 这是归因链的源头)。 |
| POST | /manager/WechatPost/material_sync | material_sync | manager/wechat.py:439 | 同步素材统计(只读)。原站 6474 图片 / 444 图文 / 29 视频。 |
| GET | /manager/WechatPost/materials | material_list | manager/wechat.py:407 | — |
| GET | /manager/WechatPost/menu | menu_list | manager/wechat.py:354 | — |
| POST | /manager/WechatPost/menu_sync | menu_sync | manager/wechat.py:361 | 从微信拉取线上菜单并落库(只读,不改线上)。 |
| GET | /manager/WechatPost/overview | wechat_overview | manager/wechat.py:249 | 微信模块总览:配置状态 + 接口能力 + 最近事件 + 粉丝/二维码统计。 |
| POST | /manager/WechatPost/preview | poster_preview | manager/wechat.py:164 | 实时预览:按给定坐标把二维码叠到底图/品牌底图上,返回 PNG(不落库)。 |
| GET | /manager/WechatPost/qrcodes | qrcode_list | manager/wechat.py:313 | — |
| GET | /manager/WechatPost/wechatpost_list | poster_list | manager/wechat.py:72 | — |
| GET | /manager/webhooks | webhook_list | manager/wechat.py:554 | — |
| GET | /manager/wechat | wechat_overview | manager/wechat.py:249 | 微信模块总览:配置状态 + 接口能力 + 最近事件 + 粉丝/二维码统计。 |
| GET | /manager/wechat/autoreply | autoreply_list | manager/wechat.py:462 | — |
| GET | /manager/wechat/followers | follower_list | manager/wechat.py:279 | 粉丝列表(含扫码归因字段 —— 这是归因链的源头)。 |
| GET | /manager/wechat/materials | material_list | manager/wechat.py:407 | — |
| GET | /manager/wechat/menu | menu_list | manager/wechat.py:354 | — |
| GET | /manager/wechat/posters | poster_list | manager/wechat.py:72 | — |
| GET | /manager/wechat/posters/new | poster_new | manager/wechat.py:102 | 新建海报模板页(复刻原站 addPost 表单:底图 + 偏移 + 尺寸)。 |
| GET | /manager/wechat/qrcodes | qrcode_list | manager/wechat.py:313 | — |
| GET | /manager/wechat/templates | template_list | manager/wechat.py:502 | — |
app/routers/manager/system.py 27 个网址
后台 · 内容与系统设置 —— 覆盖原站剩余模块。
内容库与系统设置:文章、标签、字典、参数。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /manager/ContentSet/content_management | content_list | manager/system.py:120 | — |
| GET | /manager/ContentSet/receptionset | reception_set | manager/system.py:159 | — |
| GET | /manager/Email_Campaign/newsend_maillist | campaign_list | manager/system.py:356 | 群发记录(短信 / 邮件 / 模板消息共用一张 campaign 表)。 |
| GET | /manager/GroupTemplate/grouptemplist | group_template_list | manager/system.py:348 | — |
| GET | /manager/Interactive/interlist | interactive_list | manager/system.py:325 | — |
| GET | /manager/Message_Send/message_sendlist | campaign_list | manager/system.py:356 | 群发记录(短信 / 邮件 / 模板消息共用一张 campaign 表)。 |
| POST | /manager/Score/rescore_all | rescore_all | manager/system.py:261 | 按新规则批量重算全部线索评分(后台任务,取前 N 条避免阻塞)。 |
| POST | /manager/Score/rule_save | rule_save | manager/system.py:220 | — |
| GET | /manager/Score/scorebehavior | score_rules | manager/system.py:207 | — |
| GET | /manager/Send_ElectronicMail/send_maillist | campaign_list | manager/system.py:356 | 群发记录(短信 / 邮件 / 模板消息共用一张 campaign 表)。 |
| GET | /manager/System/s_systemlist | system_list | manager/system.py:55 | 系统设置:读环境变量 + 数据库覆盖项 + 运行状态自检。 |
| POST | /manager/System/setting_save | setting_save | manager/system.py:88 | — |
| GET | /manager/Tag/eventtagsmart | tag_list | manager/system.py:165 | — |
| POST | /manager/Tag/tag_save | tag_save | manager/system.py:172 | — |
| GET | /manager/TemplateMsg/group_template | group_template_list | manager/system.py:348 | — |
| GET | /manager/WebSite/w_websitelist | website_list | manager/system.py:288 | — |
| GET | /manager/articles | article_list | manager/system.py:294 | — |
| GET | /manager/campaigns | campaign_list | manager/system.py:356 | 群发记录(短信 / 邮件 / 模板消息共用一张 campaign 表)。 |
| GET | /manager/content | content_list | manager/system.py:120 | — |
| GET | /manager/inquiries | inquiry_list | manager/system.py:397 | — |
| GET | /manager/inquiry/inquirylist | inquiry_list | manager/system.py:397 | — |
| GET | /manager/scores | score_rules | manager/system.py:207 | — |
| GET | /manager/system | system_list | manager/system.py:55 | 系统设置:读环境变量 + 数据库覆盖项 + 运行状态自检。 |
| GET | /manager/tags | tag_list | manager/system.py:165 | — |
| GET | /manager/tribune/dis_articlelist | article_list | manager/system.py:294 | — |
| GET | /manager/workFlow/wk_tasklist | workflow_list | manager/system.py:333 | — |
| GET | /manager/workflows | workflow_list | manager/system.py:333 | — |
app/routers/manager/leads.py 17 个网址
后台 · 线索池(潜客)—— MVR 核心模块。
线索池。谁在跟进、跟到哪一步、打了什么标签。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /manager/Leadsfunnel/leadlist | lead_list | manager/leads.py:84 | 线索列表。保留原站全部 s_* 筛选参数。 |
| GET | /manager/UserGrouping/ug_ungroupedlist | ungrouped | manager/leads.py:165 | 未分组用户(原站同名页)。 |
| GET | /manager/leads | lead_list | manager/leads.py:84 | 线索列表。保留原站全部 s_* 筛选参数。 |
| GET | /manager/leads/export | export_leads | manager/leads.py:521 | 导出线索。表头与原站 32 列一致(EXPORTABLE_FIELDS)。 |
| GET | /manager/leads/{uid:int} | lead_detail | manager/leads.py:193 | 线索详情:基本资料 + 行为时间线 + 归因 + 备注 + 标签(路径式 URL)。 |
| POST | /manager/register/ai_score | ai_score | manager/leads.py:471 | 对单条线索触发一次 AI 评分(原站完全没有这个能力)。 |
| POST | /manager/register/assign | assign | manager/leads.py:358 | 线索分配(原站无独立分配记录,本系统记 lead_assignment)。 |
| POST | /manager/register/delete | delete_lead | manager/leads.py:427 | 删除线索。默认软删(原站是物理删除,本系统改为可恢复)。 |
| GET | /manager/register/export | export_leads | manager/leads.py:521 | 导出线索。表头与原站 32 列一致(EXPORTABLE_FIELDS)。 |
| GET | /manager/register/export_fields | export_fields_meta | manager/leads.py:568 | 可选导出字段元数据(供前端勾选列)。 |
| POST | /manager/register/merge | merge | manager/leads.py:402 | — |
| GET | /manager/register/register_detail | lead_detail_by_query | manager/leads.py:208 | 线索详情(查询式 URL:/manager/register/register_detail?uid=)。见上一条说明。 |
| GET | /manager/register/registerlist | lead_list | manager/leads.py:84 | 线索列表。保留原站全部 s_* 筛选参数。 |
| POST | /manager/register/remark | add_remark | manager/leads.py:292 | — |
| POST | /manager/register/rescore | rescore | manager/leads.py:461 | — |
| POST | /manager/register/set_status | set_status | manager/leads.py:266 | — |
| POST | /manager/register/tags | set_tags | manager/leads.py:331 | — |
app/routers/manager/events.py 15 个网址
后台 · 活动与报名 —— MVR 核心模块(M3 报名 + M4 二维码海报工厂)。
活动与报名。办一场活动、收报名、出二维码和海报。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /manager/CustomMeeting/ctm_meetlist | meeting_list | manager/events.py:486 | — |
| GET | /manager/N_Event/a_event_detail | event_detail_by_query | manager/events.py:120 | 活动详情(查询式 URL:/manager/N_Event/a_event_detail?aid=)。见上一条说明。 |
| POST | /manager/N_Event/a_event_save | event_save | manager/events.py:157 | — |
| GET | /manager/N_Event/a_eventlist | event_list | manager/events.py:79 | — |
| POST | /manager/N_Event/gen_all_posters | gen_all_posters | manager/events.py:357 | 一键为全部已有分享码的顾问合成海报。 |
| POST | /manager/N_Event/gen_poster | gen_poster | manager/events.py:279 | 为单个顾问合成品牌海报(复刻 WechatPost 的服务端合成)。 |
| POST | /manager/N_Event/gen_share_qr | gen_share_qr | manager/events.py:225 | 为指定顾问(或全部活跃顾问)生成带参二维码。 |
| GET | /manager/N_Event/share_preview | share_preview | manager/events.py:337 | 顾问分享页(二维码矩阵)—— 与原站 a_event_share_er 同构。 |
| POST | /manager/N_Event/signup_audit | signup_audit | manager/events.py:406 | — |
| POST | /manager/N_Event/signup_checkin | signup_checkin | manager/events.py:428 | — |
| GET | /manager/N_Event/signups_export | signups_export | manager/events.py:446 | 导出某活动的报名名单。 |
| GET | /manager/event/eventlist | event_list | manager/events.py:79 | — |
| GET | /manager/events | event_list | manager/events.py:79 | — |
| GET | /manager/events/{aid} | event_detail | manager/events.py:105 | 活动详情(路径式 URL /manager/events/{aid})。 |
| GET | /manager/meetings | meeting_list | manager/events.py:486 | — |
app/routers/manager/surveys.py 12 个网址
后台 · 问卷调研 —— 对话式建卷 / 改题 / 选项调节。
问卷调研。建卷、改题、调选项、看答卷。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| POST | /manager/Surveyqst/add_question | add_question | manager/surveys.py:197 | 加题。选项用换行分隔,选项分值用逗号分隔(对话式建卷的落点)。 |
| GET | /manager/Surveyqst/answers | survey_answers | manager/surveys.py:323 | 某问卷的答卷列表。 |
| GET | /manager/Surveyqst/answers_export | answers_export | manager/surveys.py:363 | — |
| POST | /manager/Surveyqst/clone | clone_survey | manager/surveys.py:302 | — |
| POST | /manager/Surveyqst/del_question | del_question | manager/surveys.py:247 | — |
| GET | /manager/Surveyqst/schema.json | schema_json | manager/surveys.py:397 | 问卷结构 JSON(前后端契约,含原站 overall/surveyattr 两字段)。 |
| POST | /manager/Surveyqst/set_options | set_options | manager/surveys.py:266 | 整组替换选项 —— 「选项调节通过对话直接设置」的落点。 |
| GET | /manager/Surveyqst/survey_qstcreate_edit | survey_edit_by_query | manager/surveys.py:106 | 问卷编辑(查询式 URL:/manager/Surveyqst/survey_qstcreate_edit?qid=)。见上一条说明。 |
| GET | /manager/Surveyqst/survey_qstlist | survey_list | manager/surveys.py:49 | — |
| POST | /manager/Surveyqst/survey_save | survey_save | manager/surveys.py:143 | 建卷 / 改卷。表单字段名对齐原站 overall[...] 的子键名。 |
| GET | /manager/surveys | survey_list | manager/surveys.py:49 | — |
| GET | /manager/surveys/{qid} | survey_edit | manager/surveys.py:91 | 问卷编辑(路径式 URL /manager/surveys/{qid})。 |
app/routers/manager/accounts.py 10 个网址
后台 · 账号权限、流量溯源与审计。
账号权限、流量来源、操作日志。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| POST | /manager/Power/account_save | account_save | manager/accounts.py:102 | 新建/编辑账号。仅管理员可操作。 |
| POST | /manager/Power/kick_session | kick_session | manager/accounts.py:170 | 踢出会话(原站会话不落库,无此能力)。 |
| GET | /manager/Power/powerlist | account_list | manager/accounts.py:46 | — |
| GET | /manager/accounts | account_list | manager/accounts.py:46 | — |
| GET | /manager/business/ipc2b | ipc2b | manager/accounts.py:289 | IPC2B 业务勾兑(原站同名页)。 |
| GET | /manager/power/businessiplist | power_center | manager/accounts.py:189 | 权限中心:角色 × 权限矩阵。 |
| GET | /manager/power/center | power_center | manager/accounts.py:189 | 权限中心:角色 × 权限矩阵。 |
| GET | /manager/power/traffic | traffic_list | manager/accounts.py:205 | 流量溯源(原站 /manager/power/businessiplist,61 条)。 |
| GET | /manager/profile | profile | manager/accounts.py:307 | — |
| GET | /manager/traffic | traffic_list | manager/accounts.py:205 | 流量溯源(原站 /manager/power/businessiplist,61 条)。 |
app/routers/video/h5.py 10 个网址
前台 H5 获客链路 —— 对齐原站路径。
客户在手机上看到的页面:活动落地、报名、问卷、分享。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /video/A_Event/a_event | event_landing | video/h5.py:115 | 活动报名落地页。 |
| GET | /video/A_Event/a_event_new | event_landing | video/h5.py:115 | 活动报名落地页。 |
| GET | /video/A_Event/a_event_share_er | event_share_page | video/h5.py:289 | 顾问分享页 —— 原站就是从这里拿到二维码矩阵(技能里逆向出的真入口)。 |
| POST | /video/A_Event/a_event_signup | event_signup_submit | video/h5.py:191 | 提交报名。表单字段名与原站一致(name/mobile/company/jobtitle/corpemail)。 |
| GET | /video/A_Event/signup_done | signup_done | video/h5.py:271 | — |
| GET | /video/Questnaire/done | survey_done | video/h5.py:474 | — |
| GET | /video/Questnaire/index | survey_page | video/h5.py:327 | — |
| GET | /video/Questnaire/questionnaire | survey_page | video/h5.py:327 | — |
| POST | /video/Questnaire/submit | survey_submit | video/h5.py:374 | — |
| GET | /video/Questnaire/survey | survey_page | video/h5.py:327 | — |
app/routers/manager/dashboard.py 8 个网址
后台 · 首页看板与平台统计。
后台首页那块看板,和各种统计图。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /manager | dashboard | manager/dashboard.py:29 | 首页看板。原站路径 /manager/Dashboard/statisticall。 |
| GET | /manager/ | dashboard | manager/dashboard.py:29 | 首页看板。原站路径 /manager/Dashboard/statisticall。 |
| GET | /manager/ChartStatictical/chart_staticall | chart_statistical | manager/dashboard.py:64 | 平台统计(趋势 + 构成)。 |
| GET | /manager/Dashboard/statisticall | dashboard | manager/dashboard.py:29 | 首页看板。原站路径 /manager/Dashboard/statisticall。 |
| GET | /manager/dashboard | dashboard | manager/dashboard.py:29 | 首页看板。原站路径 /manager/Dashboard/statisticall。 |
| GET | /manager/health/summary | health_summary | manager/dashboard.py:101 | 系统健康摘要(JSON,供前端轮询)。 |
| GET | /manager/reports/attribution | attribution_report | manager/dashboard.py:85 | 归因报表(新功能)——扫码漏斗 + 顾问榜 + 活动归因。 |
| GET | /manager/reports/charts | chart_statistical | manager/dashboard.py:64 | 平台统计(趋势 + 构成)。 |
app/routers/video/qrcode.py 8 个网址
二维码直出 —— 对齐原站的公开路径。
二维码图片直出。网址是老名字,故意保留。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /Botch_qrcode/New_aevent/{aid:int}/{mid:int} | event_qr | video/qrcode.py:108 | 活动 × 顾问 的二维码直出(原站同名路径,匿名可访问)。 |
| GET | /Botch_qrcode/New_aevent/{aid}/{mid}.jpg | event_qr | video/qrcode.py:108 | 活动 × 顾问 的二维码直出(原站同名路径,匿名可访问)。 |
| GET | /Botch_qrcode/survey/{qid:int}/{mid:int} | survey_qr | video/qrcode.py:161 | 问卷 × 顾问 的二维码直出。语义与 event_qr 一致(必须走微信带参码), 差异只有 scene_str 里带的是 survey_id 而不是 activity_id。见 event_qr 的注释。 |
| GET | /Botch_qrcode/survey/{qid}/{mid}.jpg | survey_qr | video/qrcode.py:161 | 问卷 × 顾问 的二维码直出。语义与 event_qr 一致(必须走微信带参码), 差异只有 scene_str 里带的是 survey_id 而不是 activity_id。见 event_qr 的注释。 |
| GET | /Botch_qrcode/url.png | url_qr | video/qrcode.py:188 | 任意 URL 直出二维码(新功能)。 |
| POST | /manager/N_Event/beautify_qr_code | beautify_qr | video/qrcode.py:295 | 二维码美化(内嵌 Logo)—— 与原站同名路径,接收 image 字节流或 aid/mid。 |
| GET | /manager/N_Event/pack_download | pack_download | video/qrcode.py:245 | 批量二维码(可含海报)ZIP 下载 —— 与原站同名路径。 |
| GET | /qr/preview/{biz}/{biz_id} | preview | video/qrcode.py:202 | 二维码预览页(带下载/复制按钮,运营用)。 |
app/routers/auth.py 6 个网址
认证路由 —— 登录 / 登出 / 修改密码。
登录、退出、改密码。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| POST | /Manager/Common/newlogin | login_submit | auth.py:51 | 路径与字段名刻意复刻原站,方便老脚本/老前端平移。 |
| GET | /manager/login | login_page | auth.py:44 | — |
| POST | /manager/login | login_post | auth.py:63 | — |
| GET | /manager/logout | logout | auth.py:169 | — |
| POST | /manager/logout | logout | auth.py:169 | — |
| POST | /manager/password | change_password | auth.py:195 | — |
app/routers/wechat_callback.py 5 个网址
微信服务号事件回调 —— 扫码归因的入口(原站路径 /video/index/index)。
微信服务号把事件推过来的地方——客户扫码的归因就靠它。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /video/index/index | wechat_verify | wechat_callback.py:90 | /video/index/index 的 GET —— 一条路径两种用途,按参数分流。 |
| POST | /video/index/index | wechat_event | wechat_callback.py:119 | — |
| GET | wechat_verify | wechat_callback.py:90 | /video/index/index 的 GET —— 一条路径两种用途,按参数分流。 |
|
| POST | wechat_event | wechat_callback.py:119 | — | |
| GET | /wechat/health | wechat_health | wechat_callback.py:259 | 回调链路自检(运维用,不暴露敏感值)。 |
app/main.py 4 个网址
CGL SCRM —— 应用入口。
整个程序的入口:装配好所有东西,定义体检地址。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | / | root | app/main.py:395 | — |
| GET | /favicon.ico | favicon | app/main.py:402 | — |
| GET | /healthz | healthz | app/main.py:313 | — |
| GET | /readyz | readyz | app/main.py:330 | — |
app/routers/manager/audit.py 4 个网址
后台 · 操作审计 —— 原站完全缺失的能力。
操作日志:谁在什么时候改了什么。老系统完全没有。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /manager/System/audit_export | audit_export | manager/audit.py:85 | — |
| GET | /manager/System/audit_log | audit_view | manager/audit.py:38 | 操作审计日志(新功能)。 |
| GET | /manager/audit | audit_view | manager/audit.py:38 | 操作审计日志(新功能)。 |
| GET | /manager/audit/target | audit_target | manager/audit.py:114 | 某个对象的操作时间线。 |
app/routers/manager/reports.py 4 个网址
后台 · 报表与导出中心。
报表与导出中心。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /manager/reports | reports_home | manager/reports.py:29 | 报表中心首页。 |
| GET | /manager/reports/api.json | reports_json | manager/reports.py:115 | 报表数据 JSON(供前端图表复用)。 |
| GET | /manager/reports/attribution_export | attribution_export | manager/reports.py:131 | 归因明细导出(每条扫码事件的解析结果)。 |
| GET | /manager/reports/summary_export | summary_export | manager/reports.py:48 | 汇总报表导出(多 sheet CSV → 单 CSV,含 5 个板块)。 |
app/routers/mcp.py 3 个网址
MCP(Model Context Protocol)服务端 —— 让 WorkBuddy / 豆包 / Claude 直接对话 CGL SCRM。
给 AI 助手用的入口——AI 通过它直接读写系统。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| DELETE | /mcp | mcp_delete | mcp.py:783 | 会话终止。无状态实现无需清理,回 204 让客户端收尾干净。 |
| GET | /mcp | mcp_get | mcp.py:773 | 规范里 GET 是「服务端主动推送流」。我们不做推送,明确 405,别让客户端挂住。 |
| POST | /mcp | mcp_post | mcp.py:711 | MCP Streamable HTTP 端点。 |
app/routers/files.py 1 个网址
文件出站:把台账里的资产从当前后端读出来吐给浏览器。
把二维码、海报这些文件读出来发给浏览器。
| 方式 | 网址 | 处理函数 | 源码位置 | 这个网址干什么 |
|---|---|---|---|---|
| GET | /files/{key:path} | serve_file | files.py:90 | 按 key 出图。匿名可访问 —— 与原有的静态目录语义一致。 |
服务层有什么(业务逻辑在哪)
上面那些网址只是「入口」。真正的规则写在
app/services/ 下的 15 个模块里。
app/services/ai_scoring.py 8 个功能点 661 行
线索 AI 智能评分服务。
| 功能 | 说明 | 源码行 |
|---|---|---|
| resolve_config | 从全局配置读取 LLM 连接参数;不可用时返回 None(并记录原因)。 |
130 |
| is_available | 外部(脚本/集成方)判断当前是否具备 AI 打分能力。 | 165 |
| build_profile | 把一条 Lead 的真实字段整理成给模型看的画像字典。 |
196 |
| normalize | 把模型给的 dict 规范化为 ScoringResult。 |
371 |
| evaluate_profile | 对画像字典打分。任何异常都被吞掉并记日志,失败返回 None。 |
553 |
| score_lead | 对一条 Lead 打分(便捷封装)。失败返回 None,不写库。 |
613 |
| persist_result | 把打分结果写到线索的 AI 字段上(不 commit,由调用方控制事务)。 | 626 |
| score_and_store | 打分 + 落库(便捷封装)。 | 639 |
app/services/attribution_match.py 7 个功能点 802 行
顾问归因匹配引擎 —— 把 lead 的自由文本「顾问名」映射回 manager_user。
| 功能 | 说明 | 源码行 |
|---|---|---|
| to_half_width | 全角 → 半角。 | 246 |
| normalize_key | 归一化成一个用于「判等」的 key。 | 267 |
| strip_role_suffix | 剥掉尾部的职位/称谓后缀,并去掉括号备注。 | 285 |
| split_candidates | 把复合串拆成多个候选。 | 306 |
| classify_non_person | 判断候选串是否不可能是人名,返回 (是否非人名, 原因)。 |
346 |
| build_consultants | 把 manager_user 行(ORM 对象或 dict)投影成 ConsultantInfo。 |
755 |
| load_aliases | 读取人工别名表 JSON({"别名": manager_id | 姓名 | 顾问号})。 |
782 |
app/services/attribution_service.py 12 个功能点 749 行
扫码归因服务 —— 「替代 iSupport」的技术核心。
| 功能 | 说明 | 源码行 |
|---|---|---|
| strip_qrscene | 去掉 qrscene_ 前缀,得到纯场景值。 |
93 |
| parse_scene_str | 解析场景值,兼容三种写法。 | 99 |
| build_scene_str | 按 iSupport 的 12 段格式构造 scene_str。 | 162 |
| record_raw_event | 写原始事件流水(无论是否解析出归因)。 | 239 |
| handle_event | 处理 subscribe / SCAN 事件,落归因流水并回填线索。 | 277 |
| resolve_consultant | 按场景值里的顾问号取顾问账号(两段式,顺序不可交换)。 | 399 |
| apply_attribution_to_lead | 把解析出的归因写到线索上。 | 453 |
| timeline | 某线索的归因时间线。 | 558 |
| funnel | 归因漏斗(新功能):扫码 → 关注 → 留资 → 有效线索。 | 586 |
| consultant_ranking | 顾问归因排行(新功能):谁带来的扫码 / 线索最多。 | 624 |
| activity_attribution | 活动归因汇总(新功能):哪个活动带来的线索最多。 | 682 |
| backfill_unmatched | 把「先关注后报名」的悬空归因事件补挂到线索上。 | 722 |
app/services/audit_service.py 7 个功能点 216 行
审计服务 —— 全量操作留痕。
| 功能 | 说明 | 源码行 |
|---|---|---|
| redact | 递归脱敏。 | 34 |
| record | — | 57 |
| diff | 只留变化字段,避免审计表被全量快照撑爆。 | 103 |
| query | — | 114 |
| timeline_of | — | 163 |
| export | — | 174 |
| purge | 按保留期清理(默认一年)。 | 203 |
app/services/event_service.py 18 个功能点 710 行
活动服务 —— 活动 CRUD / 报名(含归因)/ 审核 / 签到 / 二维码与海报工厂。
| 功能 | 说明 | 源码行 |
|---|---|---|
| normalize_audit | 把任何历史表示收敛成 '0'/'1'/'2'。 |
57 |
| audit_int | audit_status → API 契约用的整数 0/1/2。 |
66 |
| create_event | — | 104 |
| get_by_slug | — | 136 |
| list_events | — | 142 |
| public_events | 前台/H5 可见的活动列表(已发布且未结束)。 | 161 |
| reject_reason | 报名准入判据。返回 None 表示可以报名,否则返回拒绝原因。 |
249 |
| signup | 报名。重复报名默认拒绝(同 aid + mobile 唯一)。 | 273 |
| audit_signup | — | 352 |
| checkin | — | 367 |
| signups_of | — | 394 |
| ensure_share | — | 417 |
| generate_share_qr | 为一条分享记录生成 原始码 + 美化码(内嵌 CGL Logo)。 | 458 |
| shares_of | — | 514 |
| resolve_event | 按 aid 取活动:先当内部主键,找不到再回退 legacy_aid(原站 aid)。 |
522 |
| build_poster_zip | 批量出码(可选含海报),打包成 ZIP。 | 569 |
| stats | — | 687 |
| fields_of | — | 707 |
app/services/lead_service.py 26 个功能点 884 行
线索服务 —— 潜客池的核心领域逻辑。
| 功能 | 说明 | 源码行 |
|---|---|---|
| build_conditions | 把 LeadFilters 翻成 SQLAlchemy 条件列表。 | 207 |
| distinct_options | 取某个 s_* 下拉在本库现有数据里出现过的值(升序)。 |
305 |
| search_select_options | SEARCH_SELECT_FIELDS 全部 15 个下拉的 {值: 文案}。 |
324 |
| query_leads | 返回 (当前页线索, 总数)。 | 338 |
| find_duplicates | 按 手机 / 邮箱 / openid 三键查重(任一命中即返回)。 | 382 |
| normalize_email | — | 403 |
| normalize_mobile | — | 407 |
| compute_dedup_key | 行为去重键:同一线索对同一目标重复触发只算一次分。 | 411 |
| merge_leads | 把 merged_ids 并入 primary。保留最早注册时间、最全字段、累加行为分。 | 417 |
| grade_of | — | 503 |
| rule_grade | 规则分该写进 ai_grade 的等级;AI 已评过就返回 None(不要覆盖)。 |
510 |
| add_behavior | 记录一次行为并累加评分。dedup=True 时同一 dedup_key 只计一次。 | 531 |
| rescore | 按 score_rule 表重算总分(后台改了分值规则后调用)。 | 595 |
| set_status | 状态流转。合法值见 LeadsStatus(1 未跟进 / 2 已拒绝 / 4 跟进中 / 6 转化成功 / 7 无效线索)。 |
626 |
| attach_tags | — | 663 |
| detach_tag | — | 680 |
| tags_of | — | 691 |
| remarks_of | 读取某条线索的跟进备注。 | 700 |
| add_remark | 新增跟进备注。 | 722 |
| export_rows | 返回 (表头, 数据行)。表头顺序 = 原站 EXPORTABLE_FIELDS。 | 761 |
| export_csv | — | 786 |
| export_xlsx | — | 799 |
| status_counts | — | 835 |
| grade_counts | — | 847 |
| top_industries | — | 856 |
| behavior_summary | — | 867 |
app/services/objstore.py 1 个功能点 248 行
S3 兼容对象存储客户端(零依赖,只用 httpx + 标准库)。
| 功能 | 说明 | 源码行 |
|---|---|---|
| list_buckets | 列出账号下的桶(用于确认 bucket 名)。 | 232 |
app/services/poster_service.py 7 个功能点 460 行
海报合成服务 —— 1:1 复刻 iSupport「微信海报 WechatPost」的服务端合成行为。
| 功能 | 说明 | 源码行 |
|---|---|---|
| resolve_font_path | 返回实际会被用上的那个字体文件;返回 None 表示只能用 PIL 位图字体。 |
62 |
| reset_font_cache | — | 102 |
| compose | 按坐标把二维码叠到底图上,返回成品。 | 202 |
| compose_from_bytes | 字节进 / 字节出,供 HTTP 层直接调用。 | 296 |
| brand_poster | 生成一张 CGL 品牌底图(无需外部素材)。 | 354 |
| hero_default_qr_box | 返回 brand_poster 里预留给二维码的左上角坐标(与白卡对齐)。 | 432 |
| build_brand_poster | 一步到位:品牌底图 + 二维码 → PNG。 | 438 |
app/services/qrcode_service.py 15 个功能点 476 行
二维码服务 —— 对齐 iSupport 的三条通路 + 本地生成兜底。
| 功能 | 说明 | 源码行 |
|---|---|---|
| invite_url | 活动邀请落地页 URL(二维码编码的目标)。 | 64 |
| survey_url | 问卷作答页 URL(二维码编码的目标)。 | 74 |
| original_qr_path | 原站的单码路径(保持兼容,便于老链接继续可用)。 | 88 |
| is_seed_ticket | — | 109 |
| count_seed_tickets | 统计台账里 dev 种子码的行数(生产期望恒为 0)。 | 113 |
| generate_local | — | 151 |
| generate_local_bytes | — | 158 |
| beautify | 在二维码中心叠加 CGL Logo。 | 193 |
| create_wechat_qr | 创建微信带参二维码并取图。 | 239 |
| create_for_event | 为活动 × 顾问 生成带参二维码,并落 wechat_qrcode 台账。 |
267 |
| create_for_survey | 为问卷 × 顾问 生成带参二维码。 | 319 |
| pack_zip | 把多张二维码打成 ZIP。 | 379 |
| read_zip_names | 读 ZIP 内文件名(自动处理原站的 GBK 名)。 | 397 |
| generate_for_url | 本地生成二维码(不依赖微信)。用于测试 / 内网演示。 | 418 |
| qr_stats | 二维码台账概览(新功能:原站二维码即时生成、不留档,无法统计)。 | 455 |
app/services/stats_service.py 10 个功能点 325 行
看板统计服务 —— 实时聚合(原站没有这块,属新功能)。
| 功能 | 说明 | 源码行 |
|---|---|---|
| overview | 顶部指标卡。 | 26 |
| lead_trend | 按天的新增线索 / 报名 / 关注趋势。 | 76 |
| status_funnel | 线索状态分布(原站 leadsstatus 为 1/2/4/6/7,非连续)。 | 114 |
| behavior_breakdown | — | 132 |
| channel_breakdown | 渠道对比:新增线索 / 报名 / 高分线索。 | 147 |
| consultant_leaderboard | 顾问榜:新客 / 报名 / 高分客。 | 177 |
| event_ranking | — | 219 |
| survey_ranking | — | 242 |
| today_snapshot | 今日实时(供首页)。 | 262 |
| recent_leads | — | 303 |
app/services/storage_service.py 18 个功能点 451 行
统一文件存储服务:本机磁盘 / 腾讯云 COS / Cloudflare R2。
| 功能 | 说明 | 源码行 |
|---|---|---|
| sha256_bytes | — | 55 |
| sha256_file | — | 59 |
| guess_content_type | — | 67 |
| backend | 当前生效的后端名(同时写进 file_asset.storage)。 |
85 |
| reset_client | 测试用:丢弃缓存的客户端(改了配置后必须调用)。 | 139 |
| public_url | 文件对外的可访问 URL(会被写进数据库,必须长期有效)。 | 150 |
| save_bytes | 保存字节并登记台账。dedup=True 时相同内容只落一份(靠 sha256 命中)。 |
166 |
| save_text | — | 235 |
| copy_in | — | 239 |
| abs_path_of | 仅本地后端可用。对象存储没有本地路径 —— 用 :func:read_asset。 |
264 |
| resolve_local | 把「表里存的相对路径」还原成绝对路径(只对本地后端有意义)。 | 271 |
| read_stored | 按「先本地、后对象存储」读一个已存路径的内容;读不到返回 None。 |
289 |
| read_asset | 读台账里的资产内容(后端无关)。 | 331 |
| exists | — | 336 |
| delete_asset | 删除文件。默认只减引用计数,计数归零才真正删物理文件。 | 374 |
| cleanup_orphans | 回收引用计数为 0 的孤儿文件。 | 384 |
| usage | 存储用量概览。本地走文件系统统计,对象存储以台账为准 (列桶要遍历全部对象,.env 里的 R2 密钥可能连 ListBucket 都没有权限, 真去调和台账的差异属于运维巡检,不该由业务接口承担)。 | 415 |
| reset_root | 测试用:清空本地存储。 | 446 |
app/services/survey_service.py 15 个功能点 641 行
问卷构建服务 —— 对话式建卷 / 改题 / 删题。
| 功能 | 说明 | 源码行 |
|---|---|---|
| create_survey | — | 149 |
| assert_mutable | — | 174 |
| update_survey | — | 182 |
| delete_survey | — | 196 |
| clone_survey | 复制问卷(含全部题目与选项)。原站无此能力,属新功能。 | 214 |
| add_question | — | 324 |
| make_contact_module | 建「联系人组件」(asstype=1)—— 每题卷限一个。 |
389 |
| list_questions | — | 436 |
| options_of | — | 446 |
| update_question | — | 454 |
| delete_question | — | 473 |
| replace_options | 整组替换选项 —— 对应「问卷的选项调节都可以通过对话直接设置」。 | 486 |
| reorder | — | 543 |
| render_schema | 把问卷渲染成前端可用的 JSON(供 H5 作答页)。 | 557 |
| score_answer | 按题目/选项分值算分。返回 (总分, {question_id: 得分})。 | 618 |
app/services/webhook_service.py 10 个功能点 296 行
Webhook 服务 —— 把系统内事件实时推给外部(飞书 / 企微 / 自建 CRM / Aily)。
| 功能 | 说明 | 源码行 |
|---|---|---|
| sign | — | 72 |
| verify | — | 79 |
| active_endpoints | — | 95 |
| payload_envelope | — | 111 |
| deliver_one | — | 128 |
| dispatch | 向所有订阅该事件的端点投递。失败按 retry 次数重试(退避)。 | 194 |
| retry_delivery | 手动重投一条失败记录(同步版,供后台按钮用)。 | 224 |
| delivery_stats | — | 259 |
| mask_endpoint | — | 288 |
| now_iso | — | 295 |
app/services/wechat_crypto.py 6 个功能点 201 行
微信消息加解密(兼容模式 / 安全模式)。
| 功能 | 说明 | 源码行 |
|---|---|---|
| calc_signature | 微信服务器校验签名。 | 33 |
| check_signature | — | 39 |
| encrypt_message | AES 加密,返回 base64 密文。 | 74 |
| decrypt_message | AES 解密,返回 (明文, appid)。 | 84 |
| build_encrypted_reply | 构造安全模式下的加密回复报文。 | 120 |
| open_message | 把「可能是明文、也可能是密文」的报文统一解成明文 XML。 | 154 |
app/services/wechat_service.py 2 个功能点 479 行
微信服务号 API 客户端(服务层)。
| 功能 | 说明 | 源码行 |
|---|---|---|
| get_client | — | 470 |
| reset_client | — | 477 |