447 lines
17 KiB
HTML
Raw Permalink Normal View History

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
feat: 全站统一 favicon.svg(取自品牌 logo,替换 Vite 模板紫色闪电) ## 背景 - `software/web/public/favicon.svg` 一直是 **Vite/Arco 模板自带的紫色闪电** (`#863bff`),与项目品牌无关; - 官网 `deploy/landing/index.html` **完全没有 favicon 引用**; - 仓库里本来就有品牌 logo:`logo/圆切独立LOGO.svg`(蓝色渐变底 + 白色充电柜 6 仓 + 柜顶青色闪电 + 右侧白色圆弧 + 底部青色弧线)。 ## 做法 新增规范文件 `logo/favicon.svg`,由 `圆切独立LOGO.svg` **机械变换**而来 (不改任何路径数据): 1. `<style>` 里的 class 上色 → **内联成 `fill`/`opacity` 属性**(favicon 渲染器 对 SVG 内 CSS 支持不一,内联更稳); 2. 渐变 ID `未命名的渐变_5`(中文)→ **`lgBrandBlue`**(ASCII) (`url(#中文)` 在部分渲染链路上会断); 3. 删掉 `<style>` 块; 4. 加 `<title>艾动智能 · 充电柜</title>`。 变换前后**渲染等价已用 resvg 逐像素验证**: - 16px / 32px(favicon 真实尺寸):**逐字节一致**; - 256px:262144 字节中 3 字节不同,且集中在**同一个抗锯齿边界像素** (173,46), 最大单通道差 9/255 —— 渐变舍入,视觉无差异。 ## 落点 | 位置 | 改动 | |---|---| | `logo/favicon.svg` | 新增(规范源) | | `software/web/public/favicon.svg` | 覆盖(管理端;`index.html` L5 已有 `<link rel="icon">`,无需改) | | `deploy/landing/favicon.svg` | 新增 | | `deploy/landing/index.html` | 补 `<link rel="icon" type="image/svg+xml" href="/favicon.svg" />` | **小程序(h5-uniapp)不适用**:微信小程序没有浏览器 favicon 概念 (无 HTML 入口,实测 `src/` 下无 index.html);tabBar 图标是另一套 PNG,不属 favicon。 ## 实测(发布后打真实 URL) ``` app.anzhizhichong.com/favicon.svg → 200 image/svg+xml 21.1KB 新logo ✓ app.anzhizhichong.com/pms/favicon.svg → 200 image/svg+xml 21.1KB 新logo ✓ test.anzhizhichong.com/pms/favicon.svg → 200 image/svg+xml 21.1KB 新logo ✓ ``` 三处均确认**无旧模板紫色残留**(`863bff`)。 `test.anzhizhichong.com/favicon.svg` 返回 404 是**预期**:测试域名 nginx `root /data/pms_dev`,官网只挂生产域名。 ## 验收 - `npm run build`:exit 0,产物含新 favicon.svg(21.1KB) - 已发布:生产(web + 官网 favicon/index.html)、测试(web) - nginx `nginx -t` 通过后 reload;生产 0 ERROR、域名 401/200
2026-09-21 00:54:39 +08:00
<!-- 全站统一 favicon:与 web 管理端同源(logo/favicon.svg) -->
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
feat(protocol): TCP v1.1 协议对齐 + 平台侧兜底 + 生产部署修复 协议(唯一权威文档:docs/柜控板固件对接文档.md) - 应答必带 act(与请求一致)、msg_id 与请求一致;判"应答 vs 指令"只看有没有 suc - dev_id 只在 auth_str/login 携带;其余报文用内部字段 _dev_id 路由(下发前由 device-server 摘除) - id 只表示动作目标(柜级省略 / 一段=单板 / 两段=仓体级),不再含 IMEI - msg_id 每连接从 1 起自增;60 秒交互超时;status_post 每通道 18 字符 hex 全量上报 - 未登录连接 30 秒内未 login 即断开;未登录只放行 auth_str/login 平台侧实现 - 上行解析按新结构重写(cabinet/boards/battery),删除废弃的 status/parsed_status - 订单:唯一入口 = on;bat_in 只登记电池台账;4 条结束路径统一走 finalize_order(含充电记录落库) - 新增设备日志保留策略(90 天,分批删除);未登记 IMEI 静默丢弃;停电标记按 status1 bit0 恢复清除 - 待确认第 13 项兜底:平台侧按 电压 × 电流 × 时间 积分计算订单电量(workers/energy.rs) - 待确认第 18 项兜底:status_post bit7 连续 2 次无电池 → 判定电池被拔走并提前结单 修复(均为部署后才暴露的问题) - 队列消费禁用 BRPOP:无限阻塞会因代理掐连接永久卡死(零错误日志);有限超时也只是 "超时才醒",下行指令延迟 15~45 秒 → 改为 RPOP 非阻塞轮询,延迟降到 0.1~0.2 秒 - sync_iccid 把可空列 iccid 按 Option<String> 解码 → 整条 login 失败(ICCID 未上报的新柜子永远登录不上) - 迁移读 information_schema.COLUMN_COMMENT 需 CAST(... AS CHAR)(MySQL 8 驱动报 VARBINARY,否则迁移 panic) - 部署注意事项:.env 不支持行内注释;pscp 上传需 chmod +x;运行中二进制需 .new + mv 原子替换 部署 - 生产迁到 API 9000 / TCP 9001(systemd 单元补 EnvironmentFile、nginx 同步指向) - 新增 deploy/deploy-prod.ps1(本地一键:构建→校验→备份→原子替换→重启→验收→无副作用探测) - 废弃 deploy-prod.sh / deploy-test.sh(原脚本会在 target/release 找产物、装重复 systemd 单元、 并用本地 .env 覆盖线上 .env) 质量 - 单测:api-server 39 个 / device-server 13 个(含协议示例逐值断言、跨模块 Redis key 契约) - 两服务 cargo check 零错误零告警;web tsc --noEmit 通过 - test/tcp_e2e_smoke.py 端到端联调 13/13 通过
2026-09-19 23:40:46 +08:00
<title>艾动智能 — 智能充电柜矩阵系统</title>
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
<!-- 社交分享(og / Twitter):此前完全缺失,链接被分享时没有预览图 -->
<meta property="og:type" content="website">
<meta property="og:site_name" content="艾动智能">
<meta property="og:title" content="艾动智能 — 为换电场景打造的下一代智能充电">
<meta property="og:description" content="36 仓独立直流快充,4G 远程实时管控,多重安全防护体系。从硬件到云端,全栈自研的智能充电解决方案。">
<meta property="og:image" content="https://app.anzhizhichong.com/og-image.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:url" content="https://app.anzhizhichong.com/">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="艾动智能 — 为换电场景打造的下一代智能充电">
<meta name="twitter:description" content="36 仓独立直流快充,4G 远程实时管控,多重安全防护体系。从硬件到云端,全栈自研。">
<meta name="twitter:image" content="https://app.anzhizhichong.com/og-image.jpg">
<style>
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
/* ==========================================================================
艾动智能 · 产品介绍页(单屏不滚动 / 明亮浅色)
—— 设计口径见 AGENTS.md「操作规则」:偏好明亮浅色、单屏不滚动,⛔ 不做暗色科技风
—— 品牌色直接取自 logo:logo/纯色横向.svg 的 .cls-1 = #0366e6
========================================================================== */
* { margin: 0; padding: 0; box-sizing: border-box; }
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
:root {
--brand: #0366e6; /* 取自 logo 的蓝,全站强调色统一用它 */
--brand-dark: #0354c4; /* hover 加深 */
--brand-soft: #eaf2fe; /* 极浅蓝底,用于标签/弱化背景 */
--ink: #0F1419; /* 主标题 */
--body: #454B58; /* 正文 */
--muted: #8B92A5; /* 辅助文字 */
--line: rgba(15,20,25,0.08);
}
html, body {
height: 100%;
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
overflow: hidden; /* 单屏不滚动(AGENTS.md 口径) */
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans SC", sans-serif;
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
color: var(--body);
-webkit-font-smoothing: antialiased;
}
a { color: inherit; text-decoration: none; }
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
/* ===== 整体:上 / 中 / 下 三块,中块自适应 ===== */
.layout { display: flex; flex-direction: column; height: 100vh; }
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
/* ===== 背景:浅色渐变 + 右侧 3D 舞台 =====
柜子由 Three.js 实时渲染在透明 canvas 上,"浮"在这层浅色渐变上 ——
⛔ 不存在图片硬边界(这正是之前"贴图感"的根因)。
3D 不可用(WebGL 缺失/脚本异常)时,JS 会给 <body> 加 .no3d 类,
由 .stage-fallback 展示静态主视觉图,页面照常可用。 */
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
.bg {
position: fixed; inset: 0; z-index: 0; pointer-events: none;
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
background:
radial-gradient(1100px 760px at 74% 42%, rgba(3,102,230,0.070), transparent 66%),
radial-gradient(900px 640px at 92% 86%, rgba(3,102,230,0.045), transparent 70%),
linear-gradient(to right, #ffffff 0%, #f7f9fc 46%, #eef3fa 100%);
}
/* 3D 舞台:右侧,柜子在其中居中。
⚠️ 上下留 84px 内边距 —— 顶天顶地会显得拥挤、压迫,留白才有"产品感"。 */
.stage {
position: fixed; z-index: 1;
top: 84px; right: 0; bottom: 84px;
width: min(52vw, 940px);
pointer-events: auto;
}
.stage canvas {
display: block; width: 100%; height: 100%;
/* 兜底:WebGL 的 alpha 合成在部分环境会失败(实测 antialias:false + 软件渲染下
canvas 未绘制区域变成黑块)。给画布自身铺一层浅色背景 ——
alpha 正常时透出下面的页面渐变;失败时也只是一片浅色,绝不会露黑。 */
background: linear-gradient(155deg, #ffffff 0%, #f5f8fd 52%, #e8f0fa 100%);
}
/* 静态回落图:默认隐藏,仅 .no3d 时显示 */
.stage-fallback {
position: absolute; inset: 0;
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
background: url("hero-full.jpg") no-repeat center center;
background-size: cover;
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
display: none;
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
}
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
body.no3d .stage-fallback { display: block; }
body.no3d .stage canvas { display: none; }
/* 左侧轻纱:保证毛玻璃上的文字对比度(3D 模式下也要) */
.scrim {
position: fixed; inset: 0; z-index: 1; pointer-events: none;
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
background: linear-gradient(to right,
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
rgba(255,255,255,0.60) 0%,
rgba(255,255,255,0.30) 34%,
rgba(255,255,255,0.04) 54%,
transparent 66%);
}
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
/* ===== TOP: 顶部导航 =====
⚠️ pointer-events 的坑:.top/.mid/.bot 都是**通栏**容器,子元素只占一侧,
但容器自身会横跨整个宽度并把鼠标事件吃掉 —— 右侧 3D canvas 就收不到
拖拽/滚轮了(OrbitControls 装在 canvas 上)。所以通栏容器一律
pointer-events:none,只让真正可交互的子元素恢复 auto。 */
.top {
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
position: relative; z-index: 4;
flex-shrink: 0;
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
display: flex; align-items: center; justify-content: space-between;
padding: 14px 48px;
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
pointer-events: none;
}
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
.top-brand { display: flex; align-items: center; pointer-events: auto; }
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
/* 横版锁标 1511.75×413.59(≈3.65:1);48px 高 ⇒ 约 175px 宽 */
.logo { height: 46px; width: auto; display: block; }
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
.top-links { display: flex; align-items: center; gap: 6px; pointer-events: auto; }
.top-link {
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
font-size: 13px; font-weight: 500; color: var(--body);
padding: 8px 16px; border-radius: 8px; transition: all .2s;
}
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
.top-link:hover { background: var(--brand-soft); color: var(--brand); }
.top-link--cta { background: var(--ink); color: #fff; }
.top-link--cta:hover { background: #23272F; color: #fff; }
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
/* ===== MID: 浅色渐变上叠一块毛玻璃文案面板 =====
⚠️ 容器通栏但 pointer-events:none(否则挡住右侧 3D 的鼠标事件),
只让 .copy 面板自身可交互。 */
.mid {
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
position: relative; z-index: 3;
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
flex: 1; min-height: 0;
display: flex; align-items: center;
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
padding: 0 56px;
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
pointer-events: none;
}
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
/* ---- 毛玻璃面板 ----
半透明白底 + 背景模糊:背后的柜子与渐变会隐约透出来,
边界从"贴图的硬边"变成"玻璃的质感"——这是消除突兀感的关键。 */
.copy {
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
width: min(720px, 44vw);
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
padding: 40px 44px;
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
display: flex; flex-direction: column; gap: 20px;
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
background: rgba(255,255,255,0.56);
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
-webkit-backdrop-filter: blur(26px) saturate(1.5);
backdrop-filter: blur(26px) saturate(1.5);
border: 1px solid rgba(255,255,255,0.72);
border-radius: 22px;
box-shadow:
0 24px 60px rgba(15,20,25,0.10),
0 2px 8px rgba(15,20,25,0.04),
inset 0 1px 0 rgba(255,255,255,0.85);
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
pointer-events: auto; /* 面板自身要能选中文字/点按钮 */
}
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
/* 小标签:品牌蓝 + 呼吸圆点 */
.tag {
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
display: inline-flex; align-items: center; gap: 8px;
padding: 6px 14px 6px 12px;
background: var(--brand-soft);
border: 1px solid rgba(3,102,230,0.16);
border-radius: 100px;
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
font-size: 13px; font-weight: 600; color: var(--brand);
width: fit-content;
}
.tag .dot {
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
width: 7px; height: 7px; border-radius: 50%;
background: var(--brand);
box-shadow: 0 0 0 0 rgba(3,102,230,0.45);
animation: pulse 2.4s ease-out infinite;
}
@keyframes pulse {
0% { box-shadow: 0 0 0 0 rgba(3,102,230,0.40); }
70% { box-shadow: 0 0 0 7px rgba(3,102,230,0); }
100% { box-shadow: 0 0 0 0 rgba(3,102,230,0); }
}
h1 {
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
font-size: clamp(38px, 4.2vw, 58px);
font-weight: 800;
line-height: 1.18;
letter-spacing: -0.02em;
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
color: var(--ink);
}
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
h1 .accent { color: var(--brand); }
.subhead {
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
font-size: clamp(15px, 1.25vw, 17px);
font-weight: 400;
line-height: 1.8;
color: var(--body);
max-width: 500px;
}
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
/* 能力标签:只放 stats 里没有的,避免信息重复 */
.pills { display: flex; flex-wrap: wrap; gap: 8px; }
.pill {
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
padding: 5px 13px;
background: #fff;
border: 1px solid var(--line);
border-radius: 100px;
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
font-size: 13px; font-weight: 500; color: var(--body);
box-shadow: 0 1px 2px rgba(15,20,25,0.03);
}
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
/* 行动按钮(此前只有 CSS、HTML 里从未渲染过)*/
.ctas { display: flex; align-items: center; gap: 12px; margin-top: 2px; }
.btn {
display: inline-flex; align-items: center; gap: 8px;
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
padding: 13px 26px;
font-size: 15px; font-weight: 600;
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
border-radius: 10px; transition: all .2s;
white-space: nowrap;
}
.btn-primary {
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
background: var(--brand); color: #fff;
box-shadow: 0 6px 20px rgba(3,102,230,0.24);
}
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
.btn-primary:hover {
background: var(--brand-dark);
transform: translateY(-2px);
box-shadow: 0 10px 26px rgba(3,102,230,0.30);
}
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
.btn-ghost { color: var(--body); border: 1.5px solid rgba(15,20,25,0.13); background: #fff; }
.btn-ghost:hover { border-color: var(--brand); color: var(--brand); }
.btn .arrow { transition: transform .2s; }
.btn-primary:hover .arrow { transform: translateX(3px); }
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
/* 数据条 */
.stats {
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
display: flex; gap: 40px;
padding-top: 18px; margin-top: 4px;
border-top: 1px solid var(--line);
}
.stat-num {
font-size: 30px; font-weight: 800; color: var(--ink);
line-height: 1.1; letter-spacing: -0.01em;
font-variant-numeric: tabular-nums; /* 数字等宽,四个数据对齐 */
}
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
.stat-num .unit { font-size: 15px; font-weight: 700; color: var(--muted); margin-left: 2px; }
.stat-label { font-size: 12px; font-weight: 500; color: var(--muted); margin-top: 5px; }
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
/* ===== BOT: 底部备案 ===== */
.bot {
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
position: relative; z-index: 2;
flex-shrink: 0;
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
text-align: center; padding: 14px;
font-size: 12px; color: var(--muted);
}
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
.bot a { color: var(--brand); }
.bot a:hover { text-decoration: underline; }
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
/* ===== 自适应:窄屏时收紧,保证仍然单屏不滚动 ===== */
@media (max-width: 1180px) {
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
.mid { padding: 0 32px; }
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
.copy { width: min(640px, 60vw); padding: 32px 34px; }
.stage { width: min(64vw, 760px); }
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
.stats { gap: 26px; }
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
.stat-num { font-size: 26px; }
}
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
/* 更窄/更矮时:面板占满,3D 舞台退到背后并减弱轻纱 */
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
@media (max-width: 820px), (max-height: 600px) {
.copy { width: 100%; padding: 26px 26px; }
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
.stage { width: 100%; opacity: 0.55; }
.scrim {
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
background: linear-gradient(to right,
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
rgba(255,255,255,0.74) 0%, rgba(255,255,255,0.44) 55%, transparent 88%);
refactor(landing): 改为全屏主视觉 + 毛玻璃文案面板(消除"贴图硬边") ## 问题 分栏布局里,产品图是 4:3 矩形、自带浅灰蓝背景,贴在页面白底上有一道 **明显的竖直硬边**;上一提交用径向遮罩缓解了,但本质上"图在盒子里"这个 结构仍会让人觉得过渡生硬(用户指出,并建议:做成一张全图,左边没内容或 少量内容,或者左边用毛玻璃、背后能稍微看到内容)。 ## 方案(按用户建议) **一张全图做底 + 左侧毛玻璃面板**,从结构上消除"过渡"这件事: 1. **重新生成主视觉图**(Agnes Image 图生图,2K 16:9): - 柜子置于画面**右侧约四成**,左侧约六成是**纯净负空间**(无物体/阴影/文字) - ⛔ 明确声明画面内**不出现任何文字、数字、字母、水印、logo** (v1 的教训:提示词里写了十六进制色值和"36",模型把它们**当文字画进了图里**, 左侧出现"36 智能充电电柜 / #0366e6"。故颜色只描述为"品牌蓝",绝不写 hex) 2. **全屏背景**:`.bg` 用 `background-size: cover` 铺满视口(保持宽高比、永不变形) 3. **左侧白纱**:`.bg::after` 叠一层从左到右渐淡的白色轻纱,保证文字对比度 4. **毛玻璃面板**(核心): ```css background: rgba(255,255,255,0.58); backdrop-filter: blur(26px) saturate(1.5); border: 1px solid rgba(255,255,255,0.72); border-radius: 22px; box-shadow: 0 24px 60px rgba(15,20,25,0.10), inset 0 1px 0 rgba(255,255,255,0.85); ``` 背后的柜子与渐变会**隐约透出**,边界从"贴图的硬边"变成"玻璃的质感"。 ## 清理 - 删除 `deploy/landing/hero.jpg`(分栏布局废弃,146KB) - 删除 `.hero` / `.hero::before` / `.hero img` 全部 CSS 与 HTML(含此前的 mask 方案) - 媒体查询改为:窄屏收紧面板宽度、减弱白纱让图更多露出 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero-full.jpg` | 新增(1920×1077,114.7KB) | | `deploy/landing/index.html` | 全屏背景 + 毛玻璃面板;删 hero 相关 | | `deploy/landing/hero.jpg` | **删除** | ## 实测(发布后打真实 URL) ``` 200 114.7KB image/jpeg hero-full.jpg 200 68.6KB image/jpeg og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero.jpg (已删) ``` HTML 已确认含 `background: url("hero-full.jpg")`、两条 `backdrop-filter`、 `<div class="copy">`,且不再有 `class="hero"` / `mask-image`。 ## 备注 生成按 Agnes **串行**要求执行:全程一次一个任务(v1 失败 → v2 成功)。
2026-09-21 03:09:26 +08:00
}
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
}
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
/* 用户偏好减少动效时,关掉自动旋转(JS 里也会读) */
@media (prefers-reduced-motion: reduce) {
.tag .dot { animation: none; }
}
/* ==========================================================================
移动端适配(竖屏 / 窄屏)
桌面的「fixed 右侧舞台 + 通栏轻纱 + 单屏不滚动」在竖屏上会挤爆,
这里改成:3D 变成顶部 hero 块,文案在下面正常流式排列,页面可滚动。
========================================================================== */
@media (max-width: 860px) {
/* 桌面是单屏不滚动;移动端内容多,必须允许纵向滚动 */
html, body { height: auto; overflow-x: hidden; overflow-y: auto; }
.layout { height: auto; min-height: 100vh; }
body { -webkit-text-size-adjust: 100%; }
/* 顶部导航收紧 */
.top { padding: 12px 18px; }
.logo { height: 34px; }
.top-link { padding: 6px 12px; font-size: 12px; }
.top-link--cta { padding: 7px 14px; }
/* 3D 变成顶部 hero 块:有界、不固定、给足高度 */
.stage {
position: relative;
top: auto; right: auto; bottom: auto;
width: 100%;
height: 46vh;
min-height: 280px;
max-height: 460px;
}
/* 单指拖拽旋转模型,不要拿去滚页面(舞台是有界块,周围仍可滚动) */
.stage canvas { touch-action: none; }
/* 通栏轻纱在移动端会糊掉 hero,去掉;背景改简洁浅色渐变 */
.scrim { display: none; }
.bg {
background: linear-gradient(to bottom, #ffffff 0%, #f4f7fc 60%, #eaf0f9 100%);
}
/* 文案面板:通栏、贴住 hero 底部 */
.mid { padding: 0 16px; margin-top: 6px; align-items: flex-start; }
.copy {
width: 100%;
padding: 26px 22px;
border-radius: 18px;
/* 移动端毛玻璃成本高(backdrop-filter + 3D 重绘),改用更实的白底保证可读 */
background: rgba(255,255,255,0.90);
-webkit-backdrop-filter: none;
backdrop-filter: none;
}
h1 { font-size: clamp(28px, 7.6vw, 40px); line-height: 1.22; }
.subhead { font-size: 14px; line-height: 1.75; }
.pill { font-size: 12px; padding: 4px 11px; }
.btn { padding: 12px 20px; font-size: 14px; }
.stats { gap: 18px 22px; flex-wrap: wrap; }
.stat-num { font-size: 22px; }
.stat-num .unit { font-size: 13px; }
.stat-label { font-size: 11px; }
.bot { padding: 16px 12px 20px; font-size: 11px; }
}
/* 极窄屏(老手机 / 分屏)*/
@media (max-width: 380px) {
.stage { height: 38vh; min-height: 220px; }
.copy { padding: 20px 16px; }
.stats { gap: 14px 18px; }
.stat-num { font-size: 19px; }
}
</style>
</head>
<body>
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
<div class="bg"></div>
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
<div class="scrim" aria-hidden="true"></div>
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
<div class="layout">
<!-- 上:顶部导航 -->
<div class="top">
<div class="top-brand">
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
<!-- 横版锁标(图标 + "艾动智能"字样,文字已转为路径、无字体依赖)-->
feat: 全站统一横版锁标(官网页头 + 管理端登录页改用 logo.svg) ## 背景 上一提交把官网页头换成了**方形**品牌图标(favicon.svg)+ 文字 span, 用户指出仓库里本就有**横版带字样**的锁标 —— 确实有: `logo/纯色横向.svg`(12.4KB)与 `logo/纯色横向@2x.png`(74.7KB)。 **重要发现**:`logo/纯色横向@2x.png` 与 `software/web/public/logo.png` **是同一个文件**(SHA256 均为 `8E40298E…`、76523 B、3025×829)—— 即管理端登录页早就在用这套设计,只是 PNG 拷贝,且我此前没认出来。 ## 改动 新增 `logo.svg`(由 `logo/纯色横向.svg` 机械变换,**渲染零差异**): 1. `<style>` 的 class 上色 → 内联 `fill`(14 处); 2. 中文 id(`图层_2`/`图层_1-2`)→ ASCII;`data-name` 元数据删除; 3. 删 `<style>` 与空掉的 `<defs>`;加 `<title>`。 > 该 SVG 的 `<text>` 元素数为 **0** —— "艾动智能"字样**已转为路径**, > 无字体依赖,任何环境渲染都一致。 落点: | 位置 | 改动 | |---|---| | `deploy/landing/logo.svg` | 新增;官网页头 `<img src="logo.svg">` | | `deploy/landing/index.html` | 删掉 `<span class="top-name">`(字样已在锁标里,否则重复)及失效的 `.top-name` CSS | | `software/web/public/logo.svg` | 新增;`Login.tsx` 由 `logo.png` 改指 `logo.svg` | | `software/web/public/logo.png` | **删除**(全仓已无引用,74.7KB 死文件) | ## 渲染等价验证 resvg 逐像素比对(600×164):**393600 字节零差异**。 ## 实测(发布后打真实 URL) ``` 200 21.1KB app.anzhizhichong.com/favicon.svg (tab 图标,方形变体) 200 12.3KB app.anzhizhichong.com/logo.svg (官网页头) 200 12.3KB app.anzhizhichong.com/pms/logo.svg (管理端登录页·生产) 200 12.3KB test.anzhizhichong.com/pms/logo.svg (管理端登录页·测试) 200 21.1KB test.anzhizhichong.com/pms/favicon.svg ``` 三处 logo.svg 均确认含 `<title>艾动智能</title>` 与 `fill="#0366e6"` 路径。 ## 一个差点误判的"异常" `/pms/logo.png` 返回 **HTTP 200**,一度以为旧文件没删掉。 实测其 `Content-Type` 是 **`text/html`**、0.47KB(内容是 index.html)—— nginx `location /pms/` 配了 `try_files $uri $uri/ /pms/index.html`(SPA 回退), **任何**不存在路径都返回 200。对照测试:访问一个肯定不存在的 `/pms/definitely-not-exist-xyz.png` 同样 200 + index.html。 服务器目录实测已无 `logo.png`。**是 404 的预期写错了,不是文件没删。** ## 验收 - `npm run typecheck`:exit 0 - `npm run build`:exit 0,产物仅 `logo.svg`(12.3KB,无 logo.png) - 已发布:生产(web + 官网)、测试(web) - 生产 0 ERROR、域名 401/200;nginx `nginx -t` 通过后 reload
2026-09-21 01:24:58 +08:00
<img class="logo" src="logo.svg" alt="艾动智能">
</div>
<div class="top-links">
<a href="/doc/" class="top-link">开发文档</a>
<a href="/pms/" class="top-link top-link--cta">管理后台</a>
</div>
</div>
feat(users+cabinets): 用户管理加角色过滤、数据范围仅操作员可配、柜子详情透出电表读数 ## 1. 用户管理:角色过滤(页面总共只有三种角色,默认罗列全部太吵) 前端加角色下拉 + 后端 `GET /users` 新增 `role` 参数(0/1/2,越界当作不过滤)。 后端把 `build_user_list_where` 从**二元穷举 match 重构为条件累加** —— 加第三个过滤器时穷举会涨到 8 分支且极易漏。同时修一个潜在坑: **OR 条件必须整体加括号**,否则 `phone LIKE ? OR name LIKE ?` 与 `organization_id = ?` 用 AND 混排时会变成 `(A AND phone LIKE ?) OR name LIKE ?`,把组织/角色过滤整个击穿 (搜个姓名就跨组织串数据)。 新增 6 个守门单测(含"占位符个数必须与 bind 次数一致"的反证), 已自证能失败:去掉 OR 括号 → 2 个用例 FAILED,还原 → 6 passed。 ## 2. 数据范围:仅操作员(role=0)可配 按用户口径: - **总管理员**:豁免范围限制,不需要配; - **企业管理员**:天然管理本组织全部设备,配项目级范围反而有歧义; - **操作员**:才需要设置可管理的项目。 前端对该按钮按 `record.role !== 0` 置灰并加 title 说明。 **创建/编辑时操作员必须选组织**(没有企业归属就看不到任何设备),校验文案也分开提示。 ## 3. 柜子详情:透出电表读数 接口早已返回 `meter_wh`/`meter_at`,但**前端从没接过**(用户看不到)。 现加到详情页基本信息行(IMEI/ICCID/名称 之后),Wh → kWh 展示并附收到时刻; `null` = 从未上报过,显示 `-` 而**不是 0 度**。 ## ⛔ 表号:系统里没有,做不了 全仓搜不到 `meter_no`/`meter_id`/`meter_sn`/`表号`,协议里 `cabinet.meter` 只是读数(Wh),**没有电表编号字段**。这需要硬件侧在协议里加字段, 平台无法单方面补。 ## ⚠️ 我这次犯的流程错误(已修正) 改了 Rust 代码后**只跑了 cargo check/test,没重新 `zigbuild` release 产物**, `deploy -SkipBuild` 于是把几小时前的旧二进制发上去了 —— 第一次实测角色过滤 三种角色全返回、监控词。重建后才通过。 **教训:改 Rust 后必须重建 release 产物再发。** ## 验收 - `cargo check --all-targets` 两服务:**0 error / 0 warning** - `cargo test --bin pms-api`:**210 passed**(204 + 6 新) - web `npm run typecheck`:exit 0 - **角色过滤实测**(测试环境,临时超管+自签 JWT,用完即删): ``` role=0 → 2 人,role 集合 [0] OK role=1 → 1 人,role 集合 [1] OK role=2 → 2 人,role 集合 [2] OK 不带 role → [0,1,2] OK role=0 + keyword → 1 人 OK(keyword 单独查命中 0,证明不是靠关键字通过) role=9 越界 → 5 人 OK(当作不过滤) ``` - 已发布测试 + 生产(四服务 active、0 ERROR、消费链探测通过、二进制时间戳已核对)
2026-09-21 05:02:09 +08:00
<!-- 3D 舞台:桌面端 fixed 到右侧;移动端变为顶部 hero 块(见媒体查询)。
柜子由 Three.js 实时渲染;不可用时回落静态图。 -->
<div class="stage" id="stage">
<div class="stage-fallback" aria-hidden="true"></div>
<canvas id="cabinet-canvas"></canvas>
</div>
<script type="importmap">
{
"imports": {
"three": "./vendor/three.module.min.js",
"three/addons/": "./vendor/addons/"
}
}
</script>
<script type="module">
// 3D 就绪/失败都要有明确信号:失败则 <body> 加 .no3d,展示静态主视觉图
const fail = (why) => {
document.body.classList.add('no3d');
console.warn('[cabinet3d] 回落到静态图:', why);
};
try {
// 无 WebGL 直接回落,不必加载 700KB 的 three
const probe = document.createElement('canvas');
if (!(probe.getContext('webgl2') || probe.getContext('webgl'))) {
fail('浏览器不支持 WebGL');
} else {
import('./cabinet3d.js')
.then(() => {
if (window.__cabinet3d && window.__cabinet3d.ok) {
document.body.classList.add('ready3d');
} else {
fail('场景未就绪');
}
})
.catch((e) => fail(e));
}
} catch (e) {
fail(e);
}
</script>
<div class="mid">
<div class="copy">
<div class="tag"><span class="dot"></span>智能充电矩阵系统</div>
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
<h1>为换电场景打造的<br><span class="accent">下一代智能充电</span></h1>
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
<p class="subhead">
36 仓独立直流快充,4G 远程实时管控,多重安全防护体系。<br>
从硬件到云端,全栈自研的智能充电解决方案。
</p>
<!-- 只放 stats 未覆盖的能力点,"36仓独立"已由下方数据条表达,不再重复 -->
<div class="pills">
<span class="pill">多重防护</span>
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
<span class="pill">4G 在线</span>
<span class="pill">BMS 适配</span>
</div>
<!-- 首屏行动按钮 -->
<div class="ctas">
<a href="/pms/" class="btn btn-primary">
进入管理后台
<svg class="arrow" width="16" height="16" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
<path d="M5 12h14M13 6l6 6-6 6"/>
</svg>
</a>
<a href="/doc/" class="btn btn-ghost">开发文档</a>
</div>
<div class="stats">
<div><div class="stat-num">36</div><div class="stat-label">独立仓体</div></div>
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
<div><div class="stat-num">&lt;0.5<span class="unit">s</span></div><div class="stat-label">指令响应</div></div>
<div><div class="stat-num">8000<span class="unit">h</span></div><div class="stat-label">MTBF</div></div>
<div><div class="stat-num">99<span class="unit">%</span></div><div class="stat-label">可用率</div></div>
</div>
</div>
</div>
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
<!-- 下:备案 -->
<div class="bot">
feat(landing): 首页主图升级 + 补 og:image 社交分享图(用 Agnes Image 生成) ## 主图:906KB 平淡白底照 → 146KB 影棚级产品图 原 `hero-bg.png` 是 1312×736 的产品照,柜子偏在画面右侧、左侧大片死白, 且被 `background-size:100% 100%` 横向拉伸 34%(见上一提交的分栏改造)。 本次用 **Agnes Image 2.5 Flash 图生图**升级: - 输入:原图压缩到 1024 宽(51KB)作 Data URI - 提示词:保持 6×6 共 36 仓的矩阵布局(**产品规格是真的,不能改**), 柜体居中构图,换成干净现代的商业影棚环境,品牌蓝 #0366e6 轮廓光, 玻璃仓门反光、地面投影与倒影,明亮浅色基调 - 输出 2K 4:3(2304×1728)→ 压到 1800 宽 JPEG q87 = **145.9KB** ## og:image:从缺失到补齐 原页面**完全没有** og/Twitter 元信息 —— 链接被分享到微信/Twitter 时没有预览图。 现补全 `og:type/site_name/title/description/image/url` + `twitter:card=summary_large_image` 等,配图用 2K 16:9 生成后压到标准 1200×630 = 68.6KB。 ## 文件 | 文件 | 变化 | |---|---| | `deploy/landing/hero.jpg` | 新增(145.9KB,1800×1350) | | `deploy/landing/og-image.jpg` | 新增(68.6KB,1200×673) | | `deploy/landing/index.html` | 主图 `hero-bg.png`→`hero.jpg`;补 og/Twitter 元信息 | | `deploy/landing/hero-bg.png` | **删除**(905.9KB,已无人引用) | 首屏图片总体积:905.9KB → **214.5KB**(-76%)。 ## 实测(发布后打真实 URL) ``` 200 145.9KB image/jpeg app.anzhizhichong.com/hero.jpg 200 68.6KB image/jpeg app.anzhizhichong.com/og-image.jpg 200 21.1KB image/svg+xml favicon.svg 200 12.3KB image/svg+xml logo.svg 404 text/html hero-bg.png (文件确已删除) ``` HTML 已确认引用 `hero.jpg` 且含 `og:image` / `twitter:card`。 ## 过程中修掉的 CLI 缺陷 生成时撞到 Windows **进程命令行 32KB 上限**(Data URI base64 走参数直接 `WinError 206`)。 已给两个 CLI 补上本地文件入参:`--image-file`(图像)、 `--image-file`/`--first-frame-file`/`--last-frame-file`/`--audio-file`(视频), 内部转 Data URI,不再走命令行。 ## 备注 生成按 Agnes 的**串行**要求执行:两个任务一次一个,顺序完成(主图 → og 图)。
2026-09-21 02:31:55 +08:00
© 2026 艾动智能 · <a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener">苏ICP备2025198376号-1</a>
</div>
</div>
</body>
</html>