外观
产品矩阵总览
沉思波的产品按「一个产品一节」组织:一句话定位 + 真实入口 + 当前状态。只列真实存在的产品——已上线的给真实链接,在建的写在建,没入口的写「待补充」,不吹不掩。
产品线一览
| 产品线 | 产品 | 定位 |
|---|---|---|
| AI 能力线 | 千序言 AI 聚合平台、弄潮 AI、算力小店、创作空间 | 多模型 AI 能力底座 + AI 能力的商业出口(含合作主推平台) |
| 教育线 | 知新、百书斩、近代史纲要题库、学飞乐、鹿鸣 | 高校与教育场景的教、学、练 |
| 文化数字化线 | 文化传声筒、江苏藏书楼云游展厅、AI 赋能古籍展览大屏站、白泽非遗大模型 | 图书馆 / 文化馆 / 非遗的数字化 |
| 企业服务线 | 园联云(产业园管理系统)、马来 AI CRM、安居码、名帖(原智能名片系统)、祝融 AIGC 培训平台、青语 | 园区运营、企业 AI、政务公示与工具 |
| 游戏线 | 诡舍 | 独立游戏产品 |
共 20 款产品 + 官网;状态与链接以真实访问为准(2026-10-03 逐款外网实测;弄潮 AI 2026-10-12 新增,合作主推)。
状态标记:已上线 开发中 规划中 权益角标:会员可享(与顶栏「免费学 / 免费进」角标同族,只表会员权益一种语义)
千序言 AI 聚合平台
- 定位:生文 / 生图 / 生视频的大模型聚合平台,面向 AIGC 创作与培训团队,是全产品线的 AI 能力底座。
- 入口:https://ai.qianxuyan.com(AI 聚合)· https://qianxuyan.com(门户)
- 状态:已上线 已上线运营,子域矩阵最全(门户 / AI / AIGC 培训 / 管理端)。
- 文档:接入方式 · 模型与计费概念
弄潮 AI · 一站式 AI 聚合平台(合作主推)

- 定位:一站式 AI 聚合平台——AI 对话、文本生成、图像生成、视频生成、智能体应用,聚合 500+ 模型,一个入口用齐主流 AI 能力;与重庆灵境智联网络科技有限公司(战略合作伙伴)联合运营,是我方主推的聚合平台。
- 入口:https://nongchaoai.com
- 状态:已上线 合作运营、公开可访问(2026-10-12 收录)。
- 合作方:重庆灵境智联网络科技有限公司(灵客 AI · CortexIQ)——成立于 2025 年的 AI 应用服务商,详见战略合作伙伴。
知新 · AI 赋能教育风向标

- 定位:教育行业 AI 动态追踪站,每天早上 8 点出「教育 AI 日报」。
- 入口:https://zhixin.qianxuyan.com
- 状态:已上线 2026-09-30 上线,首刊 2026-10-01。
- 文档:知新是什么 · 日报怎么看
文化传声筒
- 定位:面向图书馆 / 文化馆的多租户内容平台,以标品包形式交付。
- 入口:https://culturevoice.qianxuyan.com
- 状态:已上线 已按标品交付,多域名落位,已服务南京图书馆。
祝融 AIGC 培训平台
- 定位:多租户 AIGC 课程教学、创作与协作系统,面向培训学员与机构。
- 入口:https://zhurong.qianxuyan.com
- 状态:已上线 域名落位、部署链路已验证。
百书斩(原名百题斩,2026-10-01 品牌正名)
- 定位:面向高校场景的垂类教育产品(刷题 / 答题系统)——「书籍阅读答题,知识通过奇特的方式进入脑子」;与教师备课端鹿鸣同属高校教育线。
- 入口:https://baishuzhan.qianxuyan.com(Next.js 答题平台)· https://qm.chensibo.cn(PHP 刷题本体,9978 题 / 364 用户)· https://st.mystudyzone.cn(备用部署)
- 状态:已上线 2026-10-01 重部署并分配域名,三域名并行在线。
园联云 · 产业园管理系统
- 定位:产业园区运营平台(园区总览 / 楼宇租控 / 财务 / 招商线索 / 企业报修),把园区业务整体数字化。
- 入口:https://yuanquyun.qianxuyan.com(商业版)
- 状态:已上线 商用化改造后完成三轮验收(2026-10-02),经营指标回填实测通过。
白泽非遗大模型
- 定位:面向非遗领域的 AI 检索增强问答应用,服务非遗数字化场景。
- 入口:https://ich.qianxuyan.com
- 状态:已上线 非遗数字化交付线的模型应用。
江苏藏书楼 · 云游展厅(南图案例线)
- 定位:360° 全景漫游线上特展,南京图书馆数字化交付案例。
- 入口:https://memory.qianxuyan.com
- 状态:已上线 案例资产,另有古籍 / 藏书楼系列子站。
AI 赋能古籍展览大屏站
- 定位:学校图书馆电子屏用的成果展示大屏站(Kiosk 五幕轮播 + 二维码导览)。
- 入口:http://expo.chensibo.cn
- 状态:已上线 HTTPS 证书收口中,当前为 HTTP 访问。
诡舍
- 定位:游戏线产品(独立产品线),剧本 / 恐怖题材游戏项目。
- 入口:https://guishe.qianxuyan.com
- 状态:已上线 正式名称与后续规划待定。
青语
- 定位:学生内容社群,已落地案例,2000+ 用户。
- 入口:https://mystudyzone.cn
- 状态:存量维护 维持 / 收割 / 关停三选一决策中。
学飞乐学习平台
- 定位:交互式全领域学习平台。
- 入口:https://xfl.mystudyzone.cn
- 状态:已上线
近代史纲要题库
- 定位:近代史纲要在线刷题与练习。
- 入口:https://jds.mystudyzone.cn
- 状态:已上线
创作空间
- 定位:面向内容创作者的 AI 漫剧 / 创作平台。
- 入口:待补充(尚未接入对外域名)
- 状态:规划中 后端能力就位,域名与产品化待排期。
鹿鸣(原名育见)

- 定位:高校教师 AI 备课工作台(教师备课端)。
- 入口:待补充(预研阶段,未对外)
- 状态:预研中 对外名已定「鹿鸣」。
算力小店(原名算力超市,2026-10-04 更名)
- 定位:AI 模型按量选购的商业出口——千序言的模型能力对外开卖,让「你也可以用 AI 把想法做成产品」。
- 入口:https://suanli.qianxuyan.com
- 状态:已上线 2026-10 上线运营。
- 会员权益:会员可享 会员可享店内内容;免费社区(论坛 / 课程 / 开源 Skill)照常用,会员权益以用户社群公告为准,口径见会员 · 两个社区。
随堂 · 课堂互动工具(demo)
- 定位:课堂互动三端 demo——扫码点名、随堂答题、AI 三模式抽奖、课堂报告导出(教师控制台 / 投影大屏 / 学生扫码页,一仓三端)。
- 入口:https://suitang.chensibo.cn(大屏
/screen· 教师/· 学生/join) - 状态:demo 已上线 2026-10-04 起对外演示;旧域 suitang.qianxuyan.com 已 301 至新域。
- 口径:按「默认 chensibo」域名规矩落位(31 号域名清单 §10/5);demo 工具,不计入上方「共 20 款产品」数。
安居码(吴中 · 长桥街道出租房安全公示)
- 定位:出租房安全公示平台——消防专栏 C 位(最近检查结果、隐患整改、三清三关),配合治安登记核验。
- 入口:https://anjuma.qianxuyan.com
- 状态:已上线 2026-10-02 公网全流程实测通过(33/33 断言全绿)。
马来 AI CRM
- 定位:企业级 AI 知识助手——把企业资料变成能问答的知识库。
- 入口:https://crm.chensibo.cn(另见 https://crm.qianxuyan.com)
- 状态:已上线 2026-10-02 域名修复指向新址后首次正常服务。
名帖 · 沉思波名片定制(原「智能名片系统」)
- 定位:把姓名、职务、公司与联系方式做成一张微信里点开就能看的电子名片——5 套主题任选,专属链接与二维码交付,内容与样式由我们定制。
- 入口:https://card.qianxuyan.com
- 状态:已上线 2026-10-04 由「注册登录 + 自助创作的工具站」改为纯名片定制落地页(定制案例、5 套主题、4 步定制流程、官网渠道联系定制);注册登录入口与账号接口已全部下线,站内已交付的公开名片可点开核对。
- 服务与价格:源码代部署 + 代运维 ¥5/月;定制交付 ¥15/个(纯静态)· ¥50/个(带交互),按难度分档、含名片页与落地页,做完代部署——学生尝鲜价(2026-10-04 拍板),下单走官方小店与联系我们。
沉思波公司官网(含文档中心)
- 定位:沉思波品牌与产品线的第一入口(本站)。
- 入口:https://chensibo.cn · 文档中心 https://chensibo.cn/docs/(原
docs.qianxuyan.com已于 2026-10-08 整站 301 收口到本站) - 状态:已上线 2026-10-02 文档站升格官网:官网页 + /docs 文档中心 + 用户社群(注册 / 评论 / 交流区)+ Vibe 学习中心。
- 仓库口径:现役官网 =
chensibo/biz/chensibo-web(本仓,push 即部署;原名chensibo/biz/docs-site,2026-10-10 更名)。chensibo/biz/sisibo-web= 旧版 PHP 官网的 Nuxt 3 重制版,属旧站重制·留档——不部署上线、不作为 chensibo.cn 官网(如需启用须先上独立测试子域评审,禁止直接接管现役 docroot)。 - 单域名收口(2026-10-08 当日二代):老板先问「两个域名不是同一个源码吧?」→ 实测同一份产物、两套壳(
html.is-docs-center由域名判定,字节逐项相同);当晚拍板文档站下线——docs.qianxuyan.com整站 301 →chensibo.cn(软下线:DNS 与证书保留,秒级可回滚)。文档中心从此只在chensibo.cn/docs/;同源双壳的壳代码保留未启用(域名 301 后不再有域名挂is-docs-center)。规矩不变且更硬:内容只维护这一处,任何情况下不要再复制出第二套站点或第二个对外域名(复制就会分叉,分叉就会让"哪个是官网"的老问题重演)。 - 论坛独立成域,但「统领归官网」(2026-10-11 老板令「论坛独立出来…权限也是独立的,但是要被我们的大官网统领」):独立的是「权」不是「人」——账号 / 登录 / 身份真源仍是
users+user_roles,论坛不建第二套身份;论坛域角色forum_admin(版务总管 · 全论坛)/forum_mod(版主 · 用user_roles.scope圈板块),官网 admin 统领兜底。口径与 schema 全在community-api/forum.js(模块自建,不动db.js)。① 统领归官网(/api/console/forum/*,admin,全写console_audit):总览 · 待审/举报队列 · 总开关(open/readonly/closed)· 任免版主 · 禁言 · 置顶。② 论坛管理台(/api/forum/*):/me·/queue·/moderate(下架/恢复/置顶,版主按帖子板块判权)·/mute(需全论坛权限)·/report。③ 总开关与禁言真的挡发言(接在发帖/回帖口):只读 / 关闭 / 被禁言一律 403,不是页面写行字。④ 跨 origin 免密:签 60 秒一次性票据(库内只存 HMAC、一次一用)→ 论坛子域兑成登录令牌。验收:community-api/smoke-forum.mjs真库真服务 40/40(鉴权矩阵 / 开关与禁言闭环 / 版主板块作用域 / 票据一次一用 / 统领动作全写审计)。前端(2026-10-12 补,原「未含」已消):① 控制台「论坛」统领页(console.js的viewForum,NAV#/forum):总览 / 总开关 / 版主名单与任免 / 禁言 / 置顶 / 待办队列(只读)/ 最近动作;② 论坛子域同源双壳(config.mts按 hostname/^forum\./i加html.is-forum+style.css,不复制第二套站点);③ 跨 origin 免密前端(api.tssignForumTicket/redeemForumTicket/consumeForumTicket+CommunityHub.vue「去论坛」入口与子域兑票落地)。验收:scripts/assert-console-forum.mjs17/17。待办:forum.chensibo.cn的 DNS + vhost(代码已就位)。
沉思波统一控制台(含会员体系)
- 定位:一套身份管全平台——管理员进管理面(监控大盘 / 站点总览 / 平台总览 / 数据总览 / 用户 / 会员体系 / 内容 / 举报 / 工单 / 待办 / 图床 / 审计),用户进个人中心;账号与 chensibo.cn 社群通用。
- 入口:https://chensibo.cn/console/(零构建 SPA,源码
docs/public/console/console.js+console.css,登录态与/api同源)。 - 浅色 / 深色主题(2026-10-08 上线 · 独立文件交付,零侵入):老板令「管理后台 UI 要能切浅色/深色」——
- 做法:新增
console/theme.css+console/theme.js两个独立文件,一律不改console.js/console.css(那两个文件另有维护线,避免并发写冲突);index.html只加两行引用 + 一段首屏防闪内联脚本(在样式表之前定主题)。 - 偏好口径:
localStorage('csb_theme')(light | dark)优先;未设置时跟随系统prefers-color-scheme。切换入口在顶栏(登录页无顶栏 → 右上角悬浮按钮)。 - 浅色怎么实现:覆盖
:root[data-theme='light']的调色板令牌 + 少数硬编码色(徽章/胶囊文字、顶栏/条带底、hover、阴影、移动底栏)。半透明徽章底/边照旧,只把文字换成深色系保对比度;深色渲染一个字节不动(断言逐条比对原色值)。 - ⚠️ 维护规矩(新增硬编码色必看):
console.css里凡是写死color: #xxxxxx或写死深色底的样式,必须在theme.css补一条浅色覆盖,否则就是「浅色下浅字浅底」——首批就漏了 5 处:.auth-error1.77:1、.plat-glyph1.17:1、窄屏.nav-strip a.active1.05:1、.srv-err/.srv-err.soft、移动端.mtab-bar(浅色下变黑条)。现已补齐并有断言兜住。 - 验收(主题):
scripts/assert-console-theme.mjs(40 项:静态加载顺序与防闪 → 切换/持久化/跟随系统 → WCAG 对比度实算(computed style 逐级合成 alpha 底)+ 全页「浅底浅字」扫描,自动跳渐变底避免假阳性);本地与线上各 40/40。与assert-console-px.mjs分工不重复(那个管#/lab、#/traffic的内容渲染与两色态)。证据证据/证据-控制台主题-20261008/(16 张截图 + 像素直读 + 断言日志)。
- 做法:新增
- 侧栏折叠 + 商务风配色(2026-10-10 上线 · 独立文件交付,零侵入):老板令「要能折叠的侧边导航栏(大分类可折叠);清晰一点、颜色不要太浅;商务风一点」——
- 做法:新增
console/sidebar.css+console/sidebar.js两个独立文件(同主题 / 图床那条路子,一律不改console.js/console.css),index.html只加两行引用 + 防闪内联脚本补一行「折叠态」判断。 - ① 大分类可折叠(原生能力做清楚):分组折叠逻辑仍在
console.js(点.navg-h收起 / 展开该组,态存localStorage('csb_nav_closed'));本层只把分组标题做成分区标题——文字从--muted-2#6b7787提亮到--side-title#94a7c2、加粗、悬停高亮、折叠箭头放大,让人一眼看出「能点」。 - ② 整栏折叠成图标栏(默认折叠):顶栏左侧新增折叠开关(
sidebar.js注入,MutationObserver常驻补挂,同theme.js);折叠态打在<html>(html.csb-side-collapsed),侧栏收到 56px、只留图标 + 原生 tooltip + 待办角标缩成红点;态存localStorage('csb_side_collapsed')('1'折叠 /'0'展开 / 未设置 = 折叠),首屏由index.html内联脚本先打类 → 无闪。 - ④ 第二轮微调(2026-10-10 追加令「侧边栏再侧一点;默认就是折叠;折叠卡片上的字再大一点;左上角的 logo 一定得方便」):① 侧栏更窄——展开态 200px(不吃
console.css的--sidebar-w:本地工作区 236 / 线上 224 两份不一致,直接覆盖.sidebar宽高,两处都吃得住)、折叠图标栏 56px,折叠态图标 16→18px;② 默认折叠(无偏好即收栏);③ 字号上一档;④ 左上角品牌 logo 折叠态放大到 34px,并挂成点回官网首页(sidebar.js的wireBrand:含 hover 反馈 + 键盘 Enter/Space)。 - ⑤ 第三轮微调(2026-10-10 追加令「侧栏的字太小了;浅色下白 logo 看不见」):① 字号再上一档——导航项 15px、分组标题 14px、品牌/账号 14~15px、角标 12px;② 浅色下白 logo 反色:控制台侧栏与登录页用的都是
chensibo-logo-mark-white.png(Chrome 实读中心rgb(255,255,255)),浅色主题(侧栏白底 / 登录卡片白底)下看不见 →sidebar.css给:root[data-theme='light'] .side-logo, .auth-logo-img加filter: invert(1)(白标 → 黑标;品牌 on-light 件chensibo-logo-mark.png实读中心rgb(0,0,0),正是黑标,观感一致)。 - ⑥ 第四轮微调(2026-10-10 追加令「他们那种侧边栏都是非常分明的,而且背景都是深色的有层次的」):参照 layui 后台那类「父分组 + 子项」的菜单观感,把大分类卡片化 + 深色分层——层次模型 L0 侧栏底
#0f1b2d→ L1 大分类卡#14243c(圆角 10px + 描边,分组之间一眼分开)→ L2 分组标题带#1c2e4c(加粗 + 字距 + 下沿分隔线 + 右侧条数药丸)→ L3 悬停#1d3150→ L4 激活linear-gradient(#1a6fe8 → #0f5fd6)品牌蓝实底 + 白字(原rgba(22,119,255,.22)太虚);品牌头 / 底部署名条压深到#0b1626(两头沉、中间浮),侧栏顶加一层极淡品牌蓝辉光(走background-image,不动background-color→ 主题断言的.sidebar底色仍读得到#0f1b2d);菜单筛选框改吃侧栏令牌(原吃全局--panel,和深藏蓝不是一套色);浅色一套对应浅层(卡#f5f8fc/ 标题带#eaeff7)。折叠态卡片压平(图标栏里只留分组间细分隔线)。踩坑一处:theme.css的:root[data-theme='light'] .nav a.active(0,3,1)优先级高于本文件的.nav a.active,浅色激活态被它拉回浅蓝底 → 本文件补同优先级规则(加载在后,靠后覆盖)。另外:线上console.js的navLink还没带图标(本地工作区那版已加navIcon,属并行会话未提交的改动)→ 线上侧栏是纯文字、折叠后是空条;sidebar.js因此补了兜底图标注入(与console.js同一套 path,key 取 href 的 slug:#/dashboard→dashboard;只在.nav a里没有svg时才插、带data-csb-ico标记)→ 并行会话的图标一上线自动让位,零冲突零重复(实测:用 HEAD 版console.js拦截 → 19/19 全部由兜底补上;本地带图标版 → 兜底注入 0 个)。踩坑二处:图标尺寸规则也在并行会话未提交的console.css里(HEAD 没有.nav a svg)→ 兜底注入的 svg 没有width/height属性会撑成巨图(线上实拍踩到:图标撑满整行),故图标尺寸也由本文件自己定(展开 16px / 折叠 18px,与并行会话同值,他们上线后不冲突)。 - ③ 商务风配色:侧栏换深藏蓝
#0f1b2d(导航项--side-text#c6d1e0、分组标题--side-title#94a7c2,都比原来的--muted#8b98a9/--muted-2#6b7787亮一档);浅色主题同步一套干净商务浅色(白底 + 深板岩字#334155)。顺带把深色body从#0d1117对齐回#0e1218(与<meta theme-color>一致,并修好主题断言里那条过期项)。 - 验收(侧栏):
scripts/assert-console-sidebar.mjs(39 项:商务色令牌 / 更窄宽度 / 字号加大 / logo 可点回首页 / 浅色 logo 反色(侧栏 + 登录页) / 大分类折叠 / 整栏折叠 56px / 默认折叠 / 持久化 / 防闪 / 折叠态 tooltip 与角标红点 / 浅色 / 换视图补挂 / 零 JS 报错 / 层次①~④:分组卡比侧栏底亮 → 标题带比卡再亮 → 品牌头更沉 → 激活品牌蓝实底 + 白字,折叠态卡片压平 / 每项都有图标(线上console.js无图标时sidebar.js兜底注入,折叠后不是空条)/ 图标尺寸 展开 16px · 折叠 18px(线上console.css无尺寸规则时由本文件兜底));本地与线上各 39/39;证据证据/证据-控制台侧栏-20261010/。既有回归零破坏:assert-console-theme.mjs40/40(原 39/40,--bg对齐后转绿)、assert-console-px.mjs26/26、assert-console-tasks.mjs6/6。
- 做法:新增
- 账号全生命周期 + 免密登录(2026-10-10 上线 · 老板令「所有的账号都要求可以去增删改查,包括用户的身份、用户的账号密码」「
/me这个页面也要优化,用户要支持修改账号密码」「如果是用户的电脑没有指纹,也要想一个智能一点的办法让用户免密登录,比如和设备绑定,当然这也要考虑安全性」):- 增删改查收进控制台(
#/users):增 = 列表页「+ 新建账号」(昵称必填,邮箱/手机至少一个,口令留空即服务端生成一次性初始口令、只回显一次;建号即发「读者 / 社群成员」两张卡,另可勾选学生 / 教师 / 会员 / 老用户);改 = 详情页「编辑身份资料」(昵称 / 用户名 / 邮箱 / 手机 / 会员编号,前端只提交真正改过的字段);查 = 列表(搜索 + 角色 / 来源筛 + 分页)与详情(资料 + 角色卡 + 积分流水 + 内容计数);删 = 两级——停用(可逆,suspended,口令 / 短信 / 免密登录一律拒,数据全留)与注销(不可逆,匿名化:昵称→「已注销用户」、邮箱/用户名/手机清空、角色卡 + 免密设备 + 通行密钥收回,内容保留——别人的回帖不受牵连,这是合规与社区完整性的平衡)。全部写console_audit。 - ⚠️ 停用另立
suspended,不复用dormant:dormant是青语迁移的「迁入号无内容行为」标记、不参与任何权限判断;拿它当停用会把存量迁入号误锁在门外,故新加suspended+suspended_at两列,并在口令验证通过之后 / 验证码核销之后才回「账号已停用」(不向未授权者泄露账号状态)。 - 防自锁(服务端强制):管理员卡账号不可被停用 / 注销(先撤卡再操作)、不能停用或注销自己、注销要手输账号编号才执行(前端同样拦一道)。
- 本人自助(
/me· 账号与安全):后端/api/me/profile本来就支持改昵称 / 用户名 / 邮箱 / 手机 / 口令,只是页面上一直没有入口——本轮补成三块:账号资料、修改密码(当前 + 新 + 再输;改完服务端把所有免密设备一并作废)、手机号换绑(要新号验证码,短信宝要求的人机验证题由服务端签在 token 里、页面就地呈现)。 - 免密设备(trusted device,给「没有指纹的电脑」的那条路):与通行密钥互补不是替代——有生物识别走通行密钥(更强),没有就走设备令牌。安全口径(全部写在服务端
server.js):① 令牌 32 字节 CSPRNG,库里只存 sha256;② Cookie 为 HttpOnly + Secure + SameSite=Lax,Path限定/api/auth/device(前端 JS 读不到、别的接口收不到);③ 每次使用轮换令牌并滑动续期 90 天(旧摘要当场作废 → 被拷走也只用得成一次,二次使用必被拒);④ UA 摘要弱绑定(换浏览器就要求重新登录再绑,防整包 Cookie 被搬走,命中即自动作废并记device_ua_mismatch审计);⑤ 改密 / 注销 / 停用 → 该账号全部免密设备立即失效;⑥ 绑定要已登录 + 二次验证(有口令验口令;无口令的手机号注册号验验证码)+ 限流;⑦ 用户在「我的 · 免密设备」看得见(设备名 / 绑定时间 / 最近使用 / 到期)并随时撤销。 - 登录页:
/api/auth/device/status说这台机器绑过 → 亮出「本机免密登录(昵称打码)」,点一下直接进;没绑过 / 接口不可用时静默隐藏(不影响邮箱密码这条路,也不误导)。 /users与/lab结合(老板令「要结合一下」):按会员编号双向互链——用户详情页显示「实验室会员 L2 有效 · 到期日 + 到会员体系看全部会员」,会员名单新增「站内账号」列(点进去就是账号详情,停用会标出来)。只读互链,不做自动绑定写回(会员档案是线下体系,账号是线上身份,谁也别替谁改)。- 验收:① 前端
scripts/assert-console-accounts.mjs(32 项,桩数据驱动真页面:建号提交体 / 改资料只提交改动项 / 停用 / 注销要输编号 / 改密带 currentPassword / 两次新密码不一致前端拦下 / 绑定与撤销设备 / 登录页免密入口出现与隐藏 / 零 JS 报错);② 服务端community-api/smoke-accounts.mjs(45 项,真库真接口:建号闭环、初始口令能登录、重复邮箱 409、越权 403、停用后 403、管理员号不可停用、注销匿名化 + 角色卡收回、免密绑定/登录/轮换后旧 Cookie 复用 401/UA 不符自动作废/改密即失效/撤销/只能撤自己的、审计七种动作齐全);③ 真浏览器端到端(注册 → 登录 → 绑定本机 → 退出 → 免密一键进 → 改密后免密立即失效,7/7)。线上复验(release20261011012235-39da78d):账号页 32/32、会员体系 40/40、访问统计回归 26/26、待办看板 6/6,新接口线上探活正确(/auth/device/status200{bound:false}、未登录的/auth/device/list·/me/profile·POST /console/users一律 401)。证据证据/证据-控制台账号-20261010/(含 7 张实拍 + 4 份断言日志,其中 01–04 为线上实拍)。 - ⚠️ 部署踩坑(并行会话回拨,2026-10-11 01:25):CI 为本次提交发版时静态站已通过验证并冻结(release
20261011012235-39da78d,服务器releases/下产物完整、首页指纹与 release.txt 均正确),但current软链在 01:25:05 被指回上一版20261011011208-a9073e2,造成「静态站旧版 + 社群后端新版」的混合态。排查结论:不是看门狗(其日志停在 10-08、无 clobber 状态文件、每分钟巡检都判 good),而是另一台机器(SSH 连接111.55.72.183,紧邻 01:25:09 的那次连接;CI 构建机是45.40.228.119)执行了回拨——即两个会话同时往同一套生产发版时的互踩。处置:确认两个 release 的产物都可追溯到干净提交(console/console.js、console/index.html的 sha256 与 git 版本逐字节一致,切过去不会丢任何人的改动)后,按deploy.sh第 3 步把current切回已验证的39da78d,外网复核release.txt与console.js(303119B、含新代码)均正确。教训:发版前先readlink /opt/docs-site/current对一下是不是自己那次 release,别默认「切了链就一直是自己的」。
- 增删改查收进控制台(
- 图床可视化增强层(2026-10-08 上线 · 独立文件交付,零侵入):老板令「图床 UI 也优化一下,要能可视化看到上传了哪些东西,才好去删除;上传要有拖入快速上传」——
- 做法:新增
console/imgbed.css+console/imgbed.js两个独立文件(同主题那条路子,不改console.js/console.css),index.html加两行引用。是增强不是重写:行首插一格缩略图、表头补「预览」列、表格上方加批量条、工具栏下加拖放区——他们的表格行数与列语义不变。 - ① 缩略图:公开前缀(web/products/mystudyzone/culturevoice)走 CDN 直连 + COS 图片处理,零 API 调用;私有前缀(miniapp/tmp)进视口才调
GET /api/console/imgbed/preview?key=…&w=160&json=1换短时效 URL(内存缓存 4 分钟,一页 300 张不会一进来就 300 次签名)。w=降采样是必需的:桶里 mystudyzone 有张 31,229,121B 的 JPEG,降采样到 160 宽后 37,730B(828×)。 - ② 灯箱:点缩略图看大图(
w=1280);公开对象可「复制 CDN 链接」,私有对象不给(签出的链接会过期,不误导);「删除」= 点他们那行的删除按钮——复用其二次确认与审计,不另造一套删除。 - ③ 快速上传:整页可拖 + 多选,逐张「签名 → XHR 直传 COS」带真实进度条(并发 3);完成后 500ms 才刷新,且结果跨他们的重渲保留(否则刷完就看不到哪张失败了——这条是断言逼出来的)。
- ④ 批量删除:复选框 + 全选,逐条调他们的删除接口;撞到服务端 30/分 限流会停下来说清,不闷声失败。
- ⚠️ COS 图片处理的三个边界(均实测):① 处理参数不能进签名(签进去反而
SignatureDoesNotMatch;在容器内用真密钥试了 7 种写法:签不带参的 3 种全 200);②imageMogr2对非图片与 SVG 一律 400(.txt、目录占位对象、矢量图都不行);③ 个别源对象本身损坏(例如被改名成.jpg的网页文件)连原图也渲染不了 → 缩略图显「查看」、灯箱里说明原因。 - ⚠️ 上传落点规矩:默认页签
miniapp/不能直传(signForClient只签miniapp/<自己 uid>/,admin 也只多公开前缀与tmp/;实测miniapp/console/x.png→ 400 无权访问该路径),增强层自动改道到「自己名下的miniapp/<uid>/console/」并在提示里说明。 - 验收:
scripts/assert-imgbed-visual.mjs(26 项:缩略图注入/降采样/SVG 与非图片边界/灯箱/删除点透/拖入上传/批量删除/零 JS 错误)本地与线上各 26/26;零破坏:既有scripts/assert-imgbed-console.mjs的 S1–S3d 全过;真账号真 COS 端到端(拖入上传 → 对象真进桶 → 批量删除 → 桶里已无);证据证据/证据-图床可视化-20261008/。
- 做法:新增
- 图床协作四件(2026-10-08 上线 · 老板令第二批:目录可设置 / 安排人审核 / 逐条备注 / 多种看的方式): 老板原话「不是有文件夹吗,那么文件夹就可以去设置,然后我们还要可以对图床安排人审核,然后还可以对图片文件等等内容进行备注,要兼容多种看的方式」。
- 做法:后端新增独立模块
community-api/imgbed-meta.js(schema 自建、不动db.js,与traffic.js/lab.js同法), 在server.js的图床段追加 8 个协作口(workbench/folder/reviewers/queue/review/note/notes + 出图口放宽); 前端仍只在console/imgbed.js|css里做(不改console.js/console.css)。 - 三张表:
imgbed_folders目录设置(显示名 / 说明 / 是否需审核 / 上传落点)·imgbed_reviewers审核人安排(一行一个职责)·imgbed_objects逐条备注(标题/备注/标签)与审核状态同表(一条对象一行,少一处会分叉的地方)。 - 「待审」是算出来的,不是上传时写进去的:上传走「浏览器拿一次性签名直传 COS」,服务端从不经手字节, 所以没有「新对象到达」这个事件;判定放在读侧 —— 桶里有、但(没审过 ‖ 审完之后指纹变了)→ 待审, 指纹 =
size:LastModified(COS list 就能拿到)。好处:直传的、从七牛迁来的、历史存量一个口径全覆盖;代价: 对象被覆盖后自动回到待审(改过的东西要重看,这是想要的行为)。 - 只有
need_review=true的目录才产生待审(默认全 false):否则一开功能,mystudyzone/那 357 张存量瞬间全变待审; 开启后存量从那一刻起算,不回溯重审。 - 审核人不是角色卡:
imgbed_reviewers里记一行「谁负责哪个目录」,范围限该目录及其子路径,别的目录一律 403; 他不挂 admin(不给删除权、不给改设置、不给看审计)——最小授权判定用left(target, length(prefix)) = prefix(不用LIKE:前缀里可能有_/%,会造成越权匹配)。管理动作(改目录设置、安排/撤审核人)只有 admin。 - 前端四件事:① 表格补一列「备注」(摘要 + 审核角标,点开弹层编辑:标题/备注/标签); ② 多种看的方式——表格 / 卡片 / 紧凑(10/11 已扩到 8 种,见下一条),
localStorage('csb_imv_view')记住,纯 CSS 换装同一份 DOM (卡片视图缩略图自动升到w=400,不重写他们的表格渲染);③「目录设置」弹层(显示名/说明/需审核/上传落点 + 搜人加审核人、撤销); ④「审核」工作台(待审 / 已过审 / 已驳回 / 有备注 / 全部 五个筛选,通过 / 驳回必填理由、可顺手写备注)。 - 上传落点在设置里是「真开关」:服务端只肯存
signForClient签得出去的落点(公开前缀 /tmp// 自己名下miniapp/<uid>/), 设一个签不出去的路径上传必然 400 —— 所以不让设,并说清原因;拖入上传会优先用这里设的落点。 - 审核员的进路(他没有 admin 卡,
#/imgbed会被console.js判 403):本层把这块死页换成就地工作页, 并在任意页面挂一个「图床审核 · N 个目录」悬浮入口 ——console.js一个字节没动; 真·无权限者仍看原来的 403 面板(不越权、不假装)。 - 顺手修的既有毛病(老板 10/8 指出):工具栏那个原生
<input type=file id=imgUpFile>从没被样式化过 (console.css/theme.css里没有input[type=file]规则),::file-selector-button是浏览器默认的 白底rgb(239,239,239)+ 2px 黑边 + 0 圆角 + Arial 13.3px,深色主题里像贴了张白纸,框高 25px 与旁边.btn-sm(30) 也不齐; 已在imgbed.css里按.btn-sm规格整容(高 30 / 圆角 7 / 12.5px,内钮走--brand白字),并写了断言钉住。 - 验收:服务端
community-api/smoke-imgbed-meta.mjs72/72(模块 31 + HTTP 端到端 41;真本地 PG + 真 COS, 对象只落tmp/smoke-meta/并收尾删除;含越权 403、驳回必填理由、内容变化回待审、审计留痕、未登录 401 优先); 前端scripts/assert-imgbed-workbench.mjs本地 / 线上各 37/37(管理员 / 审核员 / 无权限者三场景); 零破坏:既有assert-imgbed-visual.mjs26/26、assert-imgbed-console.mjsS1–S3d 7/7、assert-console-theme.mjs40/40(本地与线上)。 证据证据/证据-图床协作四件-20261008/。
- 做法:后端新增独立模块
- 图床「看的方式」从 3 种扩到 8 种(2026-10-11 · 老板令「展开的查看方式太少了,而且都差不多、没什么意义」): 病根:原来三种只是同一张表换个缩略图尺寸(
table/card/compact),行、列、顺序一模一样,看来看去是同一件事。 改法:让每种视图回答一个不同的问题,且全部从既有数据(list 已返回的 key / 体积文本 / 时间文本)反推 —— 不加数据字段、不改console.js/console.css(同「图床页只加在console/imgbed.*」那条规矩):- 排版类(4):表格 / 紧凑 / 卡片 / 图库——CSS 多列瀑布流(
column-width:200px),缩略图按onload写回aspect-ratio保持原比例,缩略图换档w=640; - 分析类(4):时间轴(今天 / 昨天 / 近 7 天 / 近 30 天 / 更早)· 体积(大件 ≥5MB / 中件 1–5MB / 小件 100KB–1MB / 微件 <100KB, 附占比条 +
#1角标 + 百分比)· 类型(按扩展名分组)· 重复(同名 / 同体积两种口径找重传候选,非候选行自动收起,只列要处理的); - 每种视图顶部一句「结论」是算出来的、不是写死的(体积视图「前 3 个占 96%(77.0 MB)」、时间轴「最近一次:…」、重复「发现 N 组,各留 1 个可省 X」)—— 这是与「只换个皮肤」的分界线;
- 重排是搬 DOM 节点不是重画(
appendChild移动既有<tr>)→ 老板自己的删除按钮、勾选框、备注绑定切视图后照常可用(断言钉住); - 灯箱升级成连播:第 i / N 张 + 上一张 / 下一张 +
←→翻页 +Esc关 + 工具栏「逐张过」从本页第一张连播; 翻页顺序按当前视图的可见顺序(重复视图里被收起的行不参与); - 验收:新增
scripts/assert-imgbed-views.mjs(桩 9 个对象覆盖 5 个体量档 / 5 个时间桶 / 5 种格式 / 2 组重复候选,31 项: 8 个视图逐个断言 + 结论行 + 分组头 + 占比条与角标 + 切回表格行序还原 + 多选/删除绑定仍通 + 灯箱连播 + 偏好记忆 + 零 JS 错误),本地 / 线上各 31/31(线上 release20261011112038-ad1df70); 零破坏:scripts/assert-imgbed-workbench.mjs37/37(其视图契约已同步成 8 种)、scripts/assert-imgbed-visual.mjs26/26(均本地 + 线上)。 证据证据/证据-图床多视图-20261011/。
- 排版类(4):表格 / 紧凑 / 卡片 / 图库——CSS 多列瀑布流(
- 会员体系(2026-10-08 上线 · 模式 v1 落地):把「实验室会员与活动体系」搬进后台——
- 真源三处:规则骨架
community-api/lab.json(身份五层 L0–L4 / 五本账 / 四条红线 / 编号前缀 GL·AN / 待拍四项与建议值);个人数据lab_members、lab_ledger、lab_salons三张表;老板拍板结果lab_config; - 接口:
GET /api/console/lab+POST /api/console/lab/members|ledger|salons|decisions(admin 门禁;每个写动作写console_audit); - 四条红线在服务端执行(不在前端):出资池账目必挂《合作分红协议》编号、单人 2000 / 池 1.2 万封顶、L4 无协议不发号——越线一律 400 并说清原因;
- 规矩:会员名单与五本账只在控制台这一处维护,不要在文档或表格里另抄一份(同「两个域名一份源码」的理由:抄一份就会分叉)。
- 第五轮:按第一性原理重构成「操作台」(2026-10-10 老板令「
/lab这个页面得改,里面我真的不知道如何操作,得按第一性原理去优化」):病根不是缺功能,而是报表在前、动作埋在最后、术语没人解释(原顺序:KPI → 漏斗 → 五本账 → 拍板 → 名单 → 表单在第六块 → 沙龙 → 账目 → 红线)。改法按「先结论 → 再待办 → 再动作 → 后明细」重排:① 首屏「这一页是干什么的」——三句话说清体系(先缴费进实验室 → 干出成绩拿认证 → 才谈出资分红,顺序不能反;两账永不混;你在这页只做四件事),配五层漏斗条形可视化(人数 + 转化率 + 怎么进 / 得到什么,不再是干表格);② 「现在要处理(N 件)」行动清单——待拍 / 30 天内到期 / 没会员(开张)/ 没沙龙 / 出资池,每条一句话说清为什么 + 一个按钮一键直达(自动展开对应卡片并聚焦第一个要填的框;「看到期名单」还会自动展开明细并切到到期筛选);③ 三个动作卡(发号 / 记账 / 登记沙龙)——默认只展开「发号」第一步,卡头一句话说清「这一步是干什么的」,表单下方补层级说明与出资池红线提示;④ 待拍四项保留(拍板本身就是待办);⑤ 明细台账整体折叠(身份五层 / 会员名单 / 五本账 / 账目 / 沙龙 / 红线),日常收起、要核对时才展开。表单元素 id 与交互绑定零改动(只重排结构与文案)。
- 真源三处:规则骨架
- 会员体系 · 第六轮:看 / 做 分离 + 模块独立 + 卡密(2026-10-11 上线,老板令「这页有问题,我不能直观地去添加会员……导致效率很慢」):四条要求——① 页面美化 ② 模块独立(卡密等相关内容也得单独做)③ 第一性原理(更高效地查看)④ 看和做分离(目前仪表盘还需要往下滑动)。
- 病根:第五轮虽已把顺序改成「结论 → 待办 → 动作 → 明细」,但**「做」的表单仍在页面里**——发号表单落在第三屏,「添加会员」要往下滚两屏;报表与动作同屏互相挤,老板找不到「现在就点哪个」。
- 做法(零侵入):新增
console/lab.css+console/lab.js两个独立文件(同主题 / 侧栏 / 图床那条规矩,一律不改console.js/console.css——那两个文件由并行会话维护),index.html只加两行;本层在console.js渲出.lab-page之后接管这一页(MutationObserver 等它出现 + 微任务里整块换掉,不闪)。 - ① 看 / 做 分离:页面本体只有看的——默认「总览」模块里一个输入框都没有(断言钉死这条);「做」全在右侧抽屉,顶栏常驻主按钮「+ 发号会员」在第一屏(不用滚),另有 记一笔 / 登记沙龙 / 拍板;抽屉里只把必填放前面,其余收进「更多(可选)」。
- ② 模块独立:总览 / 会员与编号 / 卡密 / 账目 / 沙龙 / 规则 六个模块,各带一句算出来的结论 + 自己的搜索筛选,不再挤成一条长滚动;URL 带
m=可直达(#/lab?m=cards,走replaceState不触发 hashchange → 不会被console.js重渲掉筛选态)。 - ③ 第一性原理:第一行是算出来的判定句(例:真实空名单时给「还没开张:会员 0 人、编号一个没发。第一步 → 点右上角「+ 发号会员」:姓名必填,实验室 / 层级 / 缴费都有默认值,编号留空自动发 GL-2026-0001」)+「现在要处理(N 件)」待办,每条右边一个按钮直达对应抽屉;报表退到各自模块里。
- 卡密独立成模块(老板「卡密等相关内容也得单独做」):新只读口
GET /api/console/cards(admin 门禁 + 限流 120/分,只读——发卡 / 冻结 / 挂卡仍走既有写入路径,本口只负责「看得清」),支持q(卡号 / 姓名 / 邮箱 / 用户名 / 会员编号)+status(active|frozen|revoked)+page/pageSize,返回summary(总数 / 三态 / 账号总数 / 覆盖率)。一屏看全 卡号 + 卡密(核销凭证)+ 持卡人 + 编号 + 状态 + 发卡时间;默认打码(Tok••••••••bb),点「显示卡密」才出明文、每行一个「复制卡密」(载荷CSB:<卡密>,与/api/card/me同口径)——卡密是核销凭证,先防住「随手截图外发」。两类编号同屏:站内号(users.member_no,注册即发CSB-…)在上、实验室号(lab_members.member_no,GL/AN-…)在下;没进会员名册的明写「未入会员名册」(与lab.js总览同一关联口径:按member_no相等关联,只展示与跳转、不写回)。 - 顺带修掉两个真问题:① 层级下拉渲染成「undefined(199 元)」——
lab.json里字段是name不是label(已修,现为「实验室会员(199 元)/ 认证人才 / 分红合作 · 需协议」,并有断言钉住防复发);② L4 未填协议号时前端先拦一句「红线③:L4 先签协议、再发号」(服务端 400 照旧兜底,不是前端假装合规)。 - 验收:
scripts/assert-lab-page.mjs重写(桩驱动真页面,45 项,四轮:桌面 1440 全契约 / 移动 390 / 空名单引导 / 换桩 6→7 证判定句是算出来的),本地与线上各 45/45;回归scripts/assert-console-px.mjs26/26(其#/lab口径已同步成新契约:六模块 / 总览零输入框 / 首屏主按钮 / 顶部条两色态都是实色,两色各出一张全页截图);线上 release20261011131608-2244cc0(后端20261011131441-2244cc0)。真数据复核(现取老板账号只读令牌、不落盘不回显):91 张卡 / 1,863 个账号 / 覆盖率 5% 一屏看全、卡密默认打码、会员 0 人时判定句直接给「第一步 → 点右上角「+ 发号会员」」——正是老板遇到的空名单场景。证据证据/证据-控制台会员体系-20261011/。
- 会员体系 · 第七轮:卡型(限量黑卡)在「卡密」页只读展示(2026-10-11,老板令「要有种限量版的黑卡的感觉,当然需要准备不同的卡型,然后这些卡是用来区分用户的,然后管理员要可以在用户页面进行设置」):
- 分工划清:设置卡型(写口
POST /api/console/cards/:userId/tier+CARD_TIERS白名单)由并行会话在用户页做;本页只做「看」——卡密模块每行卡号下方挂一枚卡型 chip,standard是默认档不挂(91 行都挂「标准」是噪音),title 里带全称 + 说明 + 一句「卡型只做分级与展示,不是权限」(权益仍走 benefits,别把卡型当门禁)。 - 单一真源:卡型字典优先吃服务端下发的(响应里的
cardTiers/tiers,字段{key,label,short,desc})——服务端一上线,文案与顺序自动换成服务端的,前端不另排;服务端还没带时才落前端过渡兜底表,且服务端没登记过的 key 一律原样显示(不隐藏、不报错:多一种卡型不该让这一页塌掉)。读口GET /api/console/cards本来就返回tier(cards.card_tier,库里早有此字段)——所以本次一个字节都没改服务端(那份server.js正被并行会话改卡型写口,不去抢同一文件的未提交改动)。 - 验收:
scripts/assert-lab-page.mjs45 → 49 项(新增 4 条卡型契约:标准卡不挂 chip / 非标准显示短标签且 title 带全称与说明 / 未登记 key 原样显示 / 同一份卡数据换一份服务端字典 → chip 文案跟着换「哑光黑 · 曜石」),本地与线上各 49/49;回归scripts/assert-console-px.mjs26/26 不破。线上 release20261011151335-3c8e80c(同提交,后端未改)。证据证据/证据-控制台会员体系-20261011/(04 卡密那张含黑卡 chip)。现状提示:线上 91 张卡当前全是standard(库里默认值),所以 chip 暂不显示——等并行会话的「设卡型」写口上线并设过一次,这一屏就会自己长出来(不需要再动本页)。
- 分工划清:设置卡型(写口
- 验收(会员体系 · 第五轮操作台):前端
scripts/assert-lab-page.mjs(桩数据驱动真页面,40 项:首屏结论块 / 待办清单 / 三动作卡 / 默认只展开第一步 / 明细默认收起 / 六卡 / 漏斗 ≥5 行 / 七拍板 / 三表单 / 五 chip / 站内账号互链 / 红线 / 点待办一键直达(展开 + 落点 + 切筛选) / 桌面 + 移动两档 / 零 JS 报错);服务端在容器内直调lab.js(建表 / 红线拒止 / 写入 / 清理,14 项);回归scripts/assert-console-px.mjs26/26(其#/lab口径已同步成新结构契约)。证据证据/证据-控制台会员体系-20261008/。 - 访问统计 · 自研统计探针(2026-10-08 上线 · 与 51la 双跑):老板问「能不能换成自研探针统计所有子站」——
- 为什么换:26 站挂着 51la 的码,但后台只能核验「挂没挂」,PV/UV 要走 51la 付费 OpenAPI(一直未接)——等于付了挂码的成本、只换来一张核验表。自研探针把数字拿回自己手里,并从 26 站扩到全部自有站(台账 55 个域名)。
- 真源:采集端
community-api/traffic.js(口径红线写在这里,不在前端);明细site_hits(保留 90 天滚动清理)+ 汇总site_daily(长期保留)+ 当天去重site_daily_visitors;站点清单与 51la 登记读community-api/monitor.json(不另抄一份)。 - 接口:
GET|POST /api/track(公开采集——sendBeacon 走 POST;成败都回 204,不打扰访客;每 IP 独立预算 300/分,超限静默丢弃不 429)+GET /api/track/px.js(探针脚本 first-party 下发)+GET /api/console/traffic?days=14(admin:覆盖率三态 + PV/UV + 来源/热页/设备)。 - 口径红线(服务端强制,不是文案):① 不存原始 IP——UV 用日盐哈希(IP+UA+站点),盐每天轮换(不种 cookie、不需要同意弹窗);② DNT/GPC 请求不落库;③ 机器人(bot/crawl/spider/headless/curl…)入库标
bot=true但不计 PV/UV(可查可审计);④ 只采最小集(站点/路径/来源域名/UA/语言/屏幕档),不采 cookie、账号、表单内容、来源完整 URL;⑤ 明细 90 天滚动,长期只留按天汇总。 - 覆盖率三态(与台账自动对账):已接入 / 静默(挂着没上报)/ 未接入 / 不适用(第三方伙伴域)——顺手把「差集检测」做掉了,不用手抄。
- 挂码(两条腿):
- ① 边缘注入(主力,2026-10-08 起):quan 的 1Panel openresty 上用 nginx
sub_filter一处注入,站点源码/构建产物零改动、秒级全站生效/回滚。真源deploy/px-edge/00-px-inject.conf(http 级:map $host $px_tag+sub_filter '</head>' '$px_tag</head>'),写法与 51la 段(墨衡 2026-10-01)同款;配套deploy/px-edge/patch-confs.py(逐站补段,幂等/带标记/可--revert)+deploy/px-edge/px-edge-apply.sh(pilot/all/rollback/status)。 - ② 源码挂码(自家仓库):文档站/官网等由我们自己的源码构建的站,直接在模板里挂(
docs/.vitepress/config.mts的 head),边缘地图里把这两站置空避免同页两份;探针自带幂等守卫__PX_LOADED__,万一重复也只会算一次。 - 任意站点手工挂码=
<head>里加一行<script src="https://chensibo.cn/api/track/px.js" async></script>;CSP 白名单站(script-src/connect-src只认 'self')走同源/_px.js(该站 nginx 把/_px.js、/_px反代到采集端 8399)。 docs/deploy.sh(文档站)与community-api/deploy.sh(采集端:px.js 含幂等守卫 + 别名 204)都加了断言,部署这关拦住「挂了没生效」。
- ① 边缘注入(主力,2026-10-08 起):quan 的 1Panel openresty 上用 nginx
- 覆盖率(2026-10-08 铺开当天):
node scripts/px-edge-verify.mjs外网核验 57 个域名 → 已接入 49 · 静默 0 · 不适用 8(退出码 0,可当断言)。「不适用」=第三方伙伴域 / 已下线站 / 域名被外部拦截页接管(crm.qianxuyan.com被腾讯云 DNSPod 拦截页 302 走了,请求根本没到我们服务器——域名侧问题,值得单独核)。同日真浏览器端到端 6/6 通过(探针执行 + 每页恰 1 次上报)。 - 三条坑(都踩过,写在这免得后人重踩):① 同一 location 里已写过
sub_filter的站(51la 段所在处)会整体覆盖 http 级数组 → 需要在那个 location 单独补一条sub_filter '</body>' ...(共 14 处:7 个 conf.d + 7 个站内proxy/*.conf);② 上游应用自己 gzip 时sub_filter整段跳过(nginx 遇响应带Content-Encoding就不替换)→ 这类站(6 个,如 anjuma/slc/yuanquyun)要在主 location 加proxy_set_header Accept-Encoding "";;③ 补丁锚点必须在 server/location 内——culturevoice 顶部有个 http 级的 51lamap段,插在那里会让规则泄漏到全站(表现=每个站多插一份标签),补丁已加花括号深度守卫。 - 51la 已于 2026-10-08 摘除(老板令「反正我们自研统计我就是要替代 51la 的」):
- 已摘:nginx 边缘段 14 个 conf(culturevoice/daolan/ich/park/qianxuyan.com/szh/voice + card/crm.chensibo.cn/cv3/guishe/guji/img/nt 的
proxy/*.conf)+服务器静态产物 8 个 docroot 首页+自家源码(docs/.vitepress/config.mts,文档中心与 chensibo.cn 同源页面,已重新发布); - 一条命令:
./deploy/px-edge/px-edge-apply.sh drop-51la(逐文件存.bak-51la-<时间戳>,自动核验「51la=0 且 探针=1」;restore-51la秒级还原); - 还剩 7 个域名是「站点应用内」挂码(知新 root.tsx / 百书斩 / 青语 WordPress / AI 聚合 / 算力小店),归各站负责人——清单在
04-潘卫本人/60-51la全站统计挂载清单.md「自研探针替代进度」节;复查用node scripts/px-la-scan.mjs; - 部署断言已改口径:
deploy/deploy.sh、deploy/rollback.sh从「51la+探针各 1 份」改为「51la=0 份、探针恰 1 份」——旧产物回流会被部署这关拦住。
- 已摘:nginx 边缘段 14 个 conf(culturevoice/daolan/ich/park/qianxuyan.com/szh/voice + card/crm.chensibo.cn/cv3/guishe/guji/img/nt 的
- 顺带发现(值得老板知道):
daolan.qianxuyan.com的 CSP 是script-src 'self',51la 的码在那站被浏览器直接拦死(SDK + 内联 init 都报 CSP 违规)→ 该站 51la 数字应是长期缺失的;换同源探针后才统计得上。
- 验收(访问统计):前端
scripts/assert-console-px.mjs(桩数据驱动真页面:深/浅两色 × 访问统计 + 会员体系回归,26 项全绿);服务端容器内直调traffic.js(落库 / 机器人不计 / DNT 不落库 / 限流 305 次全 204 静默 / 残留清理);真浏览器端到端(sendBeacon 204 落库、跨域上报、SPA 路由补报、DNT 零上报);证据证据/证据-控制台访问统计-20261008/(含线上真实数据截图)。
维护约定
- 新产品立项上线后,在本页加一节:一句话定位 + 入口 + 状态。
- 产品改名、入口变更时同步本页,避免对外口径漂移。
- 尚未确定的信息写「待补充」,不猜、不编。
- 会员与账目只有一处:控制台「会员体系」页(真源见上一节)——别在本页或任何表格里再抄会员名单, 同「两个域名一份源码」的理由:抄一份就会分叉。
- 会员体系页「看 / 做 分离」是硬规矩:
#/lab的页面本体不放表单(默认总览模块零输入框,assert-lab-page.mjs钉死这条); 要给会员体系加动作就加右侧抽屉(console/lab.js的openDrawer+ 对应 POST),别往页面里塞表单—— 那是「加会员要往下滚两屏」的复发路径。 - 统计也只有一处:子站访问数据一律看控制台「访问统计」页(自研探针)——别另建表格抄 PV/UV。 51la 双跑期两套码并存,对账只比趋势与量级,不追数字相等(两家 UV 定义、去重窗口、机器人过滤都不同)。
- 探针脚本只有一处改:脚本内容由
community-api/traffic.js的PX_JS下发(各站只留一行引用), 要改采集逻辑改这里;口径红线(不存 IP / DNT 不落库 / bot 不计 / 90 天明细)改动必须同步本页。 - 边缘注入只有一处改:全站挂码的真源=
deploy/px-edge/00-px-inject.conf(quan:/opt/1panel/www/conf.d/00-px-inject.conf), 铺开/回滚一条命令:./deploy/px-edge/px-edge-apply.sh all|rollback;核验:node scripts/px-edge-verify.mjs。 别直接手改各站 conf 里那两行标记段(# >>> 自研统计探针)——它们是脚本生成的,改了下一次 apply 会被覆盖回去。 - 51la 摘除/恢复也只有一处命令:
./deploy/px-edge/px-edge-apply.sh drop-51la|restore-51la(逐文件.bak-51la-<时间戳>;摘要与 7 个应用内残留站名单见04-潘卫本人/60-51la全站统计挂载清单.md)。 - 控制台主题只有一处:浅色/深色一律在
console/theme.css里覆盖——console.css新增「写死颜色」或 「写死深色底」的样式时,必须同步在theme.css补一条浅色覆盖,否则控制台一切浅色就出「浅字浅底」; 改完跑node scripts/assert-console-theme.mjs(40 项,含 WCAG 对比度实算与全页扫描)。 - 图床预览只有一处口子:私有对象出图一律走
GET /api/console/imgbed/preview(admin 门禁 + 服务端代签;w=降采样、json=1给前端取 URL)——别在前端另造签名路子(signForClient红线:他人miniapp/<uid>/连 admin 不签); 图床页的新交互只加在console/imgbed.js,而console.css里新增写死颜色时仍须在theme.css补浅色覆盖。 - 图床缩略图必须带
w=:不许直接<img>拉原图——桶里有 30MB 级大图,一页 300 张会打爆流量与首屏; 公开前缀走 CDN + 图片处理,私有前缀走预览口 + 图片处理(imageMogr2对 SVG/非图片会 400,前端与出图口都已挡)。 - 图床「待审」只有一处口径:待审 = 服务端按「桶里有 + 没审过 / 指纹变了」算出来的 (
community-api/imgbed-meta.js的annotateObjects;指纹 =size:LastModified)—— 别在库里另存一个状态字段、也别在前端自己推,那会和桶里真实内容分叉;只有need_review=true的目录进队列。 - 图床审核人只有一处安排:控制台图床页「目录设置」→ 审核人名单(表
imgbed_reviewers)—— 别在文档、群公告或表格里另记一份「谁审谁」;审核人是职责不是角色卡(不挂 admin)。 - 图床页的样式/交互只加在
console/imgbed.css|js:连#imgUpFile这种浏览器原生控件也在这里整容 (浏览器默认::file-selector-button是白底黑边,两色主题都格格不入)——console.css里不该补input[type=file]规则(那文件另有维护线);新增写死颜色仍须在theme.css补浅色覆盖。 - 图床「看的方式」每种必须回答一个不同的问题:加视图 ≠ 加皮肤——新视图要么换排版(图库/瀑布流),要么换口径(时间/体积/类型/重复), 并必须自带一句算出来的结论(不是写死的文案)。只把缩略图改大小不算新视图(10/11 老板否掉的正是原来那三种)。 重排一律
appendChild搬既有<tr>、不重建节点(否则会打断老板自己的删除/勾选/备注绑定)。

本页讨论
0 条评论还没有评论,来说第一句。