Skip to content

产品矩阵总览 ​

沉思波的产品按「一个产品一节」组织:一句话定位 + 真实入口 + 当前状态。只列真实存在的产品——已上线的给真实链接,在建的写在建,没入口的写「待补充」,不吹不掩。

产品线一览 ​

产品线产品定位
AI 能力线千序言 AI 聚合平台、弄潮 AI、算力小店、创作空间多模型 AI 能力底座 + AI 能力的商业出口(含合作主推平台)
教育线知新、百书斩、近代史纲要题库、学飞乐、鹿鸣高校与教育场景的教、学、练
文化数字化线文化传声筒、江苏藏书楼云游展厅、AI 赋能古籍展览大屏站、白泽非遗大模型图书馆 / 文化馆 / 非遗的数字化
企业服务线园联云(产业园管理系统)、马来 AI CRM、安居码、名帖(原智能名片系统)、祝融 AIGC 培训平台、青语园区运营、企业 AI、政务公示与工具
游戏线诡舍独立游戏产品

共 20 款产品 + 官网;状态与链接以真实访问为准(2026-10-03 逐款外网实测;弄潮 AI 2026-10-12 新增,合作主推)。


状态标记:已上线 开发中 规划中 权益角标:会员可享(与顶栏「免费学 / 免费进」角标同族,只表会员权益一种语义)


千序言 AI 聚合平台 ​

弄潮 AI · 一站式 AI 聚合平台(合作主推) ​

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

知新 · AI 赋能教育风向标 ​

知新 AI 赋能教育 logo

文化传声筒 ​

  • 定位:面向图书馆 / 文化馆的多租户内容平台,以标品包形式交付。
  • 入口: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
  • 状态:存量维护 维持 / 收割 / 关停三选一决策中。

学飞乐学习平台 ​

近代史纲要题库 ​

创作空间 ​

  • 定位:面向内容创作者的 AI 漫剧 / 创作平台。
  • 入口:待补充(尚未接入对外域名)
  • 状态:规划中 后端能力就位,域名与产品化待排期。

鹿鸣(原名育见) ​

鹿鸣 logo(纯净版)
  • 定位:高校教师 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 ​

名帖 · 沉思波名片定制(原「智能名片系统」) ​

  • 定位:把姓名、职务、公司与联系方式做成一张微信里点开就能看的电子名片——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.ts signForumTicket/redeemForumTicket/consumeForumTicket + CommunityHub.vue「去论坛」入口与子域兑票落地)。验收:scripts/assert-console-forum.mjs 17/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-error 1.77:1、.plat-glyph 1.17:1、窄屏 .nav-strip a.active 1.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.mjs 40/40(原 39/40,--bg 对齐后转绿)、assert-console-px.mjs 26/26、assert-console-tasks.mjs 6/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)。线上复验(release 20261011012235-39da78d):账号页 32/32、会员体系 40/40、访问统计回归 26/26、待办看板 6/6,新接口线上探活正确(/auth/device/status 200 {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.mjs 72/72(模块 31 + HTTP 端到端 41;真本地 PG + 真 COS, 对象只落 tmp/smoke-meta/ 并收尾删除;含越权 403、驳回必填理由、内容变化回待审、审计留痕、未登录 401 优先); 前端 scripts/assert-imgbed-workbench.mjs 本地 / 线上各 37/37(管理员 / 审核员 / 无权限者三场景); 零破坏:既有 assert-imgbed-visual.mjs 26/26、assert-imgbed-console.mjs S1–S3d 7/7、assert-console-theme.mjs 40/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(线上 release 20261011112038-ad1df70); 零破坏:scripts/assert-imgbed-workbench.mjs 37/37(其视图契约已同步成 8 种)、scripts/assert-imgbed-visual.mjs 26/26(均本地 + 线上)。 证据 证据/证据-图床多视图-20261011/。
  • 会员体系(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.mjs 26/26(其 #/lab 口径已同步成新契约:六模块 / 总览零输入框 / 首屏主按钮 / 顶部条两色态都是实色,两色各出一张全页截图);线上 release 20261011131608-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.mjs 45 → 49 项(新增 4 条卡型契约:标准卡不挂 chip / 非标准显示短标签且 title 带全称与说明 / 未登记 key 原样显示 / 同一份卡数据换一份服务端字典 → chip 文案跟着换「哑光黑 · 曜石」),本地与线上各 49/49;回归 scripts/assert-console-px.mjs 26/26 不破。线上 release 20261011151335-3c8e80c(同提交,后端未改)。证据 证据/证据-控制台会员体系-20261011/(04 卡密那张含黑卡 chip)。现状提示:线上 91 张卡当前全是 standard(库里默认值),所以 chip 暂不显示——等并行会话的「设卡型」写口上线并设过一次,这一屏就会自己长出来(不需要再动本页)。
  • 验收(会员体系 · 第五轮操作台):前端 scripts/assert-lab-page.mjs(桩数据驱动真页面,40 项:首屏结论块 / 待办清单 / 三动作卡 / 默认只展开第一步 / 明细默认收起 / 六卡 / 漏斗 ≥5 行 / 七拍板 / 三表单 / 五 chip / 站内账号互链 / 红线 / 点待办一键直达(展开 + 落点 + 切筛选) / 桌面 + 移动两档 / 零 JS 报错);服务端在容器内直调 lab.js(建表 / 红线拒止 / 写入 / 清理,14 项);回归 scripts/assert-console-px.mjs 26/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 铺开当天):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 级的 51la map 段,插在那里会让规则泄漏到全站(表现=每个站多插一份标签),补丁已加花括号深度守卫。
    • 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 份」——旧产物回流会被部署这关拦住。
    • 顺带发现(值得老板知道):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 条评论

还没有评论,来说第一句。

Ctrl + Enter 发布