crm-product-view-dialog-demos.html 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. <!doctype html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>产品查看弹窗 · 信息展示样式 Demo(非表格)</title>
  7. <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet" />
  8. <style>
  9. :root {
  10. --primary: #10b981;
  11. --primary-dark: #059669;
  12. --primary-bg: #ecfdf5;
  13. --text: #1e293b;
  14. --text-muted: #64748b;
  15. --border: #d9e8e2;
  16. --surface: #fff;
  17. }
  18. * { box-sizing: border-box; }
  19. body {
  20. margin: 0;
  21. font-family: Inter, -apple-system, sans-serif;
  22. font-size: 14px;
  23. line-height: 1.45;
  24. color: var(--text);
  25. background: #f4f7f6;
  26. padding: 24px 20px 48px;
  27. }
  28. .page { max-width: 760px; margin: 0 auto; }
  29. .page h1 { margin: 0 0 6px; font-size: 20px; font-weight: 700; }
  30. .page > .sub { margin: 0 0 14px; color: var(--text-muted); font-size: 13px; line-height: 1.5; }
  31. .tabs {
  32. display: flex;
  33. flex-wrap: wrap;
  34. gap: 6px;
  35. margin-bottom: 12px;
  36. }
  37. .tab {
  38. border: 1px solid var(--border);
  39. background: var(--surface);
  40. border-radius: 8px;
  41. padding: 7px 12px;
  42. font-size: 13px;
  43. font-weight: 500;
  44. cursor: pointer;
  45. font-family: inherit;
  46. color: var(--text);
  47. }
  48. .tab.is-active {
  49. background: var(--primary-bg);
  50. border-color: #a7f3d0;
  51. color: var(--primary-dark);
  52. }
  53. .panel { display: none; }
  54. .panel.is-active { display: block; }
  55. .note {
  56. margin: 0 0 12px;
  57. padding: 8px 12px;
  58. border-radius: 8px;
  59. background: var(--primary-bg);
  60. border: 1px solid #a7f3d0;
  61. color: var(--primary-dark);
  62. font-size: 12px;
  63. line-height: 1.55;
  64. }
  65. .note strong { font-weight: 600; }
  66. /* ── 弹窗壳(统一) ── */
  67. .dialog {
  68. background: var(--surface);
  69. border: 1px solid var(--border);
  70. border-radius: 10px;
  71. box-shadow: 0 8px 28px rgba(15, 23, 42, 0.1);
  72. overflow: hidden;
  73. }
  74. .hero {
  75. display: flex;
  76. align-items: flex-start;
  77. gap: 10px;
  78. padding: 12px 16px 8px;
  79. border-bottom: 1px solid #f1f5f9;
  80. }
  81. .hero-main { flex: 1; min-width: 0; }
  82. .hero h2 { margin: 0 0 2px; font-size: 16px; font-weight: 700; }
  83. .hero .meta { margin: 0; font-size: 12px; color: var(--text-muted); }
  84. .hero-actions { display: flex; gap: 6px; flex-shrink: 0; }
  85. .body { padding: 10px 16px 12px; }
  86. .footer {
  87. padding: 10px 16px;
  88. border-top: 1px solid var(--border);
  89. display: flex;
  90. justify-content: flex-end;
  91. background: #f8fafc;
  92. }
  93. .btn {
  94. display: inline-flex;
  95. align-items: center;
  96. height: 32px;
  97. padding: 0 12px;
  98. border-radius: 8px;
  99. border: 1px solid var(--border);
  100. background: #fff;
  101. font-size: 13px;
  102. font-weight: 500;
  103. font-family: inherit;
  104. cursor: default;
  105. }
  106. .btn-primary { background: var(--primary); border-color: var(--primary); color: #fff; }
  107. .btn-danger { color: #dc2626; border-color: #fecaca; }
  108. .btn-ghost { color: var(--text); }
  109. .tag {
  110. display: inline-flex;
  111. height: 20px;
  112. padding: 0 7px;
  113. border-radius: 5px;
  114. font-size: 11px;
  115. font-weight: 600;
  116. align-items: center;
  117. background: #ecfdf5;
  118. color: #059669;
  119. }
  120. .tag.danger { background: #fef2f2; color: #dc2626; }
  121. .money { color: var(--primary-dark); font-weight: 700; }
  122. .field-label {
  123. margin: 10px 0 6px;
  124. font-size: 12px;
  125. color: var(--text-muted);
  126. font-weight: 500;
  127. }
  128. .imgs { display: flex; gap: 6px; flex-wrap: wrap; }
  129. .imgs img {
  130. width: 48px;
  131. height: 48px;
  132. border-radius: 6px;
  133. object-fit: cover;
  134. border: 1px solid var(--border);
  135. }
  136. /* ══ 方案 A:四列栅格(ViewKvGrid,label 上 value 下)══ */
  137. .kv-grid {
  138. display: grid;
  139. grid-template-columns: repeat(4, minmax(0, 1fr));
  140. gap: 10px 14px;
  141. }
  142. .kv-grid .kv dt {
  143. margin: 0 0 3px;
  144. font-size: 12px;
  145. color: var(--text-muted);
  146. font-weight: 500;
  147. }
  148. .kv-grid .kv dd {
  149. margin: 0;
  150. font-size: 13px;
  151. font-weight: 600;
  152. word-break: break-word;
  153. line-height: 1.4;
  154. }
  155. .kv-grid .kv.span-2 { grid-column: span 2; }
  156. .kv-grid .kv.span-full { grid-column: 1 / -1; }
  157. .kv-grid .kv dd.muted { font-weight: 400; line-height: 1.5; }
  158. /* ══ 方案 B:左右行列表(label 左 value 右,无表格线)══ */
  159. .kv-rows { display: grid; gap: 0; }
  160. .kv-row {
  161. display: grid;
  162. grid-template-columns: 108px 1fr;
  163. gap: 10px;
  164. padding: 7px 0;
  165. border-bottom: 1px solid #f1f5f9;
  166. align-items: start;
  167. }
  168. .kv-row:last-child { border-bottom: none; }
  169. .kv-row .k {
  170. font-size: 12px;
  171. color: var(--text-muted);
  172. font-weight: 500;
  173. line-height: 1.45;
  174. }
  175. .kv-row .v {
  176. font-size: 13px;
  177. font-weight: 600;
  178. word-break: break-word;
  179. line-height: 1.45;
  180. }
  181. .kv-row .v.muted { font-weight: 400; }
  182. .kv-row.is-core .v { color: var(--primary-dark); font-weight: 700; }
  183. /* ══ 方案 C:核心指标条 + 双列紧凑栅格 ══ */
  184. .core-strip {
  185. display: flex;
  186. flex-wrap: wrap;
  187. gap: 8px;
  188. margin-bottom: 10px;
  189. padding-bottom: 10px;
  190. border-bottom: 1px solid #f1f5f9;
  191. }
  192. .core-chip {
  193. flex: 1 1 140px;
  194. min-width: 0;
  195. padding: 8px 10px;
  196. border-radius: 8px;
  197. background: var(--primary-bg);
  198. border: 1px solid #a7f3d0;
  199. }
  200. .core-chip .k { font-size: 11px; color: var(--text-muted); margin-bottom: 2px; }
  201. .core-chip .v { font-size: 15px; font-weight: 700; color: var(--primary-dark); }
  202. .kv-grid-2 {
  203. display: grid;
  204. grid-template-columns: repeat(2, minmax(0, 1fr));
  205. gap: 8px 16px;
  206. }
  207. .kv-grid-2 .kv dt { margin: 0 0 2px; font-size: 12px; color: var(--text-muted); }
  208. .kv-grid-2 .kv dd { margin: 0; font-size: 13px; font-weight: 600; }
  209. .kv-grid-2 .kv.span-full { grid-column: 1 / -1; }
  210. .kv-grid-2 .kv dd.muted { font-weight: 400; line-height: 1.5; }
  211. /* ══ 方案 D:分组标签 + 内联文本(最简)══ */
  212. .group { margin-bottom: 10px; }
  213. .group:last-child { margin-bottom: 0; }
  214. .group-title {
  215. margin: 0 0 6px;
  216. font-size: 11px;
  217. font-weight: 600;
  218. color: var(--text-muted);
  219. letter-spacing: 0.03em;
  220. text-transform: uppercase;
  221. }
  222. .inline-kv {
  223. margin: 0;
  224. font-size: 13px;
  225. line-height: 1.65;
  226. color: var(--text);
  227. }
  228. .inline-kv .pair { white-space: nowrap; }
  229. .inline-kv .pair .k { color: var(--text-muted); font-weight: 500; }
  230. .inline-kv .pair .k::after { content: ' '; }
  231. .inline-kv .pair .v { font-weight: 600; }
  232. .inline-kv .sep { color: #cbd5e1; margin: 0 8px; user-select: none; }
  233. .inline-kv-block {
  234. margin: 0;
  235. font-size: 13px;
  236. line-height: 1.55;
  237. }
  238. .inline-kv-block .k {
  239. color: var(--text-muted);
  240. font-weight: 500;
  241. margin-right: 6px;
  242. }
  243. @media (max-width: 640px) {
  244. .kv-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  245. .kv-row { grid-template-columns: 88px 1fr; }
  246. }
  247. </style>
  248. </head>
  249. <body>
  250. <div class="page">
  251. <h1>产品查看弹窗 · 信息展示样式(非表格)</h1>
  252. <p class="sub">先在 Demo 中对比选型,确认后再改 <code>SystemViewDialog</code> / 产品管理页代码。以下均<strong>不含 table 表格模式</strong>。</p>
  253. <div class="tabs">
  254. <button class="tab is-active" data-target="demo-a">A · 四列栅格</button>
  255. <button class="tab" data-target="demo-b">B · 左右行列表</button>
  256. <button class="tab" data-target="demo-c">C · 核心条 + 双列</button>
  257. <button class="tab" data-target="demo-d">D · 分组内联</button>
  258. </div>
  259. <!-- 方案 A -->
  260. <section id="demo-a" class="panel is-active">
  261. <p class="note"><strong>对应组件:</strong><code>ViewKvGrid</code>(4 列,label 在上 value 在下)。规范默认方案,与 <code>SystemViewDialog</code> 原生一致,改造成本最低。</p>
  262. <div class="dialog">
  263. <div class="hero">
  264. <div class="hero-main">
  265. <h2>工业级无水乙醇</h2>
  266. <p class="meta">产品编号:P20260328001</p>
  267. </div>
  268. <div class="hero-actions">
  269. <button class="btn btn-primary" type="button">编辑</button>
  270. <button class="btn btn-danger" type="button">删除</button>
  271. </div>
  272. </div>
  273. <div class="body">
  274. <dl class="kv-grid">
  275. <div class="kv"><dt>标准价(元)</dt><dd class="money">¥86.00</dd></div>
  276. <div class="kv"><dt>成本价(元)</dt><dd class="money">¥52.50</dd></div>
  277. <div class="kv"><dt>库存数量</dt><dd>128 瓶</dd></div>
  278. <div class="kv"><dt>状态</dt><dd><span class="tag">在售</span></dd></div>
  279. <div class="kv"><dt>产品分类</dt><dd>化工原料 / 有机溶剂</dd></div>
  280. <div class="kv"><dt>规格型号</dt><dd>AR 500ml</dd></div>
  281. <div class="kv"><dt>条码</dt><dd>6901234567890</dd></div>
  282. <div class="kv"><dt>库存预警值</dt><dd>20</dd></div>
  283. <div class="kv"><dt>销售次数</dt><dd>36</dd></div>
  284. <div class="kv"><dt>税率</dt><dd>13%</dd></div>
  285. <div class="kv"><dt>是否易制毒</dt><dd><span class="tag danger">是</span></dd></div>
  286. <div class="kv"><dt>是否易制爆</dt><dd>否</dd></div>
  287. <div class="kv span-2"><dt>创建时间</dt><dd>2026-03-28 14:32:10</dd></div>
  288. <div class="kv span-full"><dt>产品描述</dt><dd class="muted">适用于实验室分析、工业清洗;阴凉干燥储存,远离火源。</dd></div>
  289. <div class="kv span-full"><dt>备注</dt><dd class="muted">2026 Q1 采购批次,供应商资质已核验。</dd></div>
  290. </dl>
  291. <div class="field-label">产品图片</div>
  292. <div class="imgs">
  293. <img src="https://picsum.photos/seed/p1/96/96" alt="" />
  294. <img src="https://picsum.photos/seed/p2/96/96" alt="" />
  295. </div>
  296. </div>
  297. <div class="footer"><button class="btn btn-ghost" type="button">关闭</button></div>
  298. </div>
  299. </section>
  300. <!-- 方案 B -->
  301. <section id="demo-b" class="panel">
  302. <p class="note"><strong>特点:</strong>每行「标签左 · 值右」,无竖线表格感,纵向阅读清晰;长文本自然换行。需新增 <code>ViewKvRows</code> 或在 dense 模式加 <code>layout="rows"</code>。</p>
  303. <div class="dialog">
  304. <div class="hero">
  305. <div class="hero-main">
  306. <h2>工业级无水乙醇</h2>
  307. <p class="meta">产品编号:P20260328001</p>
  308. </div>
  309. <div class="hero-actions">
  310. <button class="btn btn-primary" type="button">编辑</button>
  311. <button class="btn btn-danger" type="button">删除</button>
  312. </div>
  313. </div>
  314. <div class="body">
  315. <div class="kv-rows">
  316. <div class="kv-row is-core"><span class="k">标准价(元)</span><span class="v money">¥86.00</span></div>
  317. <div class="kv-row is-core"><span class="k">成本价(元)</span><span class="v money">¥52.50</span></div>
  318. <div class="kv-row is-core"><span class="k">库存数量</span><span class="v">128 瓶</span></div>
  319. <div class="kv-row"><span class="k">状态</span><span class="v"><span class="tag">在售</span></span></div>
  320. <div class="kv-row"><span class="k">产品分类</span><span class="v">化工原料 / 有机溶剂</span></div>
  321. <div class="kv-row"><span class="k">规格型号</span><span class="v">AR 500ml</span></div>
  322. <div class="kv-row"><span class="k">条码</span><span class="v">6901234567890</span></div>
  323. <div class="kv-row"><span class="k">库存预警值</span><span class="v">20</span></div>
  324. <div class="kv-row"><span class="k">销售次数</span><span class="v">36</span></div>
  325. <div class="kv-row"><span class="k">税率</span><span class="v">13%</span></div>
  326. <div class="kv-row"><span class="k">是否易制毒</span><span class="v"><span class="tag danger">是</span></span></div>
  327. <div class="kv-row"><span class="k">是否易制爆</span><span class="v">否</span></div>
  328. <div class="kv-row"><span class="k">创建时间</span><span class="v">2026-03-28 14:32:10</span></div>
  329. <div class="kv-row"><span class="k">产品描述</span><span class="v muted">适用于实验室分析、工业清洗;阴凉干燥储存,远离火源。</span></div>
  330. <div class="kv-row"><span class="k">备注</span><span class="v muted">2026 Q1 采购批次,供应商资质已核验。</span></div>
  331. </div>
  332. <div class="field-label">产品图片</div>
  333. <div class="imgs">
  334. <img src="https://picsum.photos/seed/p1/96/96" alt="" />
  335. <img src="https://picsum.photos/seed/p2/96/96" alt="" />
  336. </div>
  337. </div>
  338. <div class="footer"><button class="btn btn-ghost" type="button">关闭</button></div>
  339. </div>
  340. </section>
  341. <!-- 方案 C -->
  342. <section id="demo-c" class="panel">
  343. <p class="note"><strong>特点:</strong>价/库存/状态先「核心条」高亮,其余字段双列栅格;信息聚拢、层次清楚。可复用现有 <code>highlights</code> + <code>ViewKvGrid</code> 两列。</p>
  344. <div class="dialog">
  345. <div class="hero">
  346. <div class="hero-main">
  347. <h2>工业级无水乙醇</h2>
  348. <p class="meta">产品编号:P20260328001</p>
  349. </div>
  350. <div class="hero-actions">
  351. <button class="btn btn-primary" type="button">编辑</button>
  352. <button class="btn btn-danger" type="button">删除</button>
  353. </div>
  354. </div>
  355. <div class="body">
  356. <div class="core-strip">
  357. <div class="core-chip"><div class="k">标准价</div><div class="v">¥86.00</div></div>
  358. <div class="core-chip"><div class="k">成本价</div><div class="v">¥52.50</div></div>
  359. <div class="core-chip"><div class="k">库存</div><div class="v">128 瓶</div></div>
  360. <div class="core-chip"><div class="k">状态</div><div class="v"><span class="tag">在售</span></div></div>
  361. </div>
  362. <dl class="kv-grid-2">
  363. <div class="kv"><dt>产品分类</dt><dd>化工原料 / 有机溶剂</dd></div>
  364. <div class="kv"><dt>规格型号</dt><dd>AR 500ml</dd></div>
  365. <div class="kv"><dt>条码</dt><dd>6901234567890</dd></div>
  366. <div class="kv"><dt>库存预警值</dt><dd>20</dd></div>
  367. <div class="kv"><dt>销售次数</dt><dd>36</dd></div>
  368. <div class="kv"><dt>税率</dt><dd>13%</dd></div>
  369. <div class="kv"><dt>是否易制毒</dt><dd><span class="tag danger">是</span></dd></div>
  370. <div class="kv"><dt>是否易制爆</dt><dd>否</dd></div>
  371. <div class="kv span-full"><dt>创建时间</dt><dd>2026-03-28 14:32:10</dd></div>
  372. <div class="kv span-full"><dt>产品描述</dt><dd class="muted">适用于实验室分析、工业清洗;阴凉干燥储存。</dd></div>
  373. <div class="kv span-full"><dt>备注</dt><dd class="muted">2026 Q1 采购批次。</dd></div>
  374. </dl>
  375. <div class="field-label">产品图片</div>
  376. <div class="imgs">
  377. <img src="https://picsum.photos/seed/p1/96/96" alt="" />
  378. <img src="https://picsum.photos/seed/p2/96/96" alt="" />
  379. </div>
  380. </div>
  381. <div class="footer"><button class="btn btn-ghost" type="button">关闭</button></div>
  382. </div>
  383. </section>
  384. <!-- 方案 D -->
  385. <section id="demo-d" class="panel">
  386. <p class="note"><strong>特点:</strong>按「价格 / 库存 / 其他 / 说明」分组,组内用「标签 值 · 标签 值」内联,最省纵向空间。适合字段多但希望一屏看完。</p>
  387. <div class="dialog">
  388. <div class="hero">
  389. <div class="hero-main">
  390. <h2>工业级无水乙醇</h2>
  391. <p class="meta">产品编号:P20260328001</p>
  392. </div>
  393. <div class="hero-actions">
  394. <button class="btn btn-primary" type="button">编辑</button>
  395. <button class="btn btn-danger" type="button">删除</button>
  396. </div>
  397. </div>
  398. <div class="body">
  399. <div class="group">
  400. <div class="group-title">价格与状态</div>
  401. <p class="inline-kv">
  402. <span class="pair"><span class="k">标准价</span><span class="v money">¥86.00</span></span><span class="sep">·</span>
  403. <span class="pair"><span class="k">成本价</span><span class="v money">¥52.50</span></span><span class="sep">·</span>
  404. <span class="pair"><span class="k">状态</span><span class="v"><span class="tag">在售</span></span></span>
  405. </p>
  406. </div>
  407. <div class="group">
  408. <div class="group-title">库存</div>
  409. <p class="inline-kv">
  410. <span class="pair"><span class="k">库存数量</span><span class="v">128 瓶</span></span><span class="sep">·</span>
  411. <span class="pair"><span class="k">预警值</span><span class="v">20</span></span><span class="sep">·</span>
  412. <span class="pair"><span class="k">销售次数</span><span class="v">36</span></span>
  413. </p>
  414. </div>
  415. <div class="group">
  416. <div class="group-title">基本信息</div>
  417. <p class="inline-kv">
  418. <span class="pair"><span class="k">分类</span><span class="v">化工原料 / 有机溶剂</span></span><span class="sep">·</span>
  419. <span class="pair"><span class="k">规格</span><span class="v">AR 500ml</span></span><span class="sep">·</span>
  420. <span class="pair"><span class="k">条码</span><span class="v">6901234567890</span></span><span class="sep">·</span>
  421. <span class="pair"><span class="k">税率</span><span class="v">13%</span></span><span class="sep">·</span>
  422. <span class="pair"><span class="k">易制毒</span><span class="v"><span class="tag danger">是</span></span></span><span class="sep">·</span>
  423. <span class="pair"><span class="k">易制爆</span><span class="v">否</span></span><span class="sep">·</span>
  424. <span class="pair"><span class="k">创建</span><span class="v">2026-03-28 14:32</span></span>
  425. </p>
  426. </div>
  427. <div class="group">
  428. <div class="group-title">说明</div>
  429. <p class="inline-kv-block"><span class="k">产品描述</span>适用于实验室分析、工业清洗;阴凉干燥储存。</p>
  430. <p class="inline-kv-block" style="margin-top:6px"><span class="k">备注</span>2026 Q1 采购批次。</p>
  431. </div>
  432. <div class="field-label">产品图片</div>
  433. <div class="imgs">
  434. <img src="https://picsum.photos/seed/p1/96/96" alt="" />
  435. <img src="https://picsum.photos/seed/p2/96/96" alt="" />
  436. </div>
  437. </div>
  438. <div class="footer"><button class="btn btn-ghost" type="button">关闭</button></div>
  439. </div>
  440. </section>
  441. </div>
  442. <script>
  443. document.querySelectorAll('.tab').forEach((tab) => {
  444. tab.addEventListener('click', () => {
  445. document.querySelectorAll('.tab').forEach((t) => t.classList.remove('is-active'))
  446. document.querySelectorAll('.panel').forEach((p) => p.classList.remove('is-active'))
  447. tab.classList.add('is-active')
  448. document.getElementById(tab.dataset.target).classList.add('is-active')
  449. })
  450. })
  451. </script>
  452. </body>
  453. </html>