zkxw-mobile-oa-detail-header-stamp-demo.html 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  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, maximum-scale=1" />
  6. <title>mobile-oa-h5 · 详情头区去掉标题 + 打印印章 Demo</title>
  7. <style>
  8. :root {
  9. --brand: #0a9f6d;
  10. --brand-dark: #087f57;
  11. --brand-soft: #e9f9f2;
  12. --page-bg: #f5f6f8;
  13. --text: #1f2a26;
  14. --text-muted: #6b7b74;
  15. --nav-bg: #ecfdf5;
  16. }
  17. * { box-sizing: border-box; }
  18. body {
  19. margin: 0;
  20. font-family: "PingFang SC", "Hiragino Sans GB", "Noto Sans SC", -apple-system, system-ui, sans-serif;
  21. color: var(--text);
  22. background:
  23. radial-gradient(900px 420px at 8% -8%, rgba(10, 159, 109, 0.12), transparent 55%),
  24. radial-gradient(700px 380px at 92% 0%, rgba(214, 163, 67, 0.1), transparent 50%),
  25. linear-gradient(180deg, #f8fffc 0%, #f4f7fb 50%, #f7f8fa 100%);
  26. line-height: 1.45;
  27. }
  28. .stage { max-width: 1280px; margin: 0 auto; padding: 28px 16px 56px; }
  29. .hero h1 { margin: 0 0 8px; font-size: 22px; font-weight: 720; }
  30. .hero p { margin: 0; color: #64748b; font-size: 14px; max-width: 820px; }
  31. .hero .note {
  32. margin-top: 12px; display: inline-block; padding: 8px 12px;
  33. border-radius: 10px; background: #fff; border: 1px solid #e2e8f0;
  34. font-size: 12px; color: #64748b;
  35. }
  36. .hero .note strong { color: #0f766e; }
  37. .goals {
  38. margin-top: 14px; padding: 12px 14px; border-radius: 12px;
  39. background: #ecfdf5; border: 1px solid #a7f3d0;
  40. font-size: 13px; color: #065f46;
  41. }
  42. .goals ul { margin: 6px 0 0; padding-left: 18px; }
  43. .grid {
  44. margin-top: 22px;
  45. display: grid;
  46. grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  47. gap: 20px;
  48. align-items: start;
  49. }
  50. .card {
  51. background: rgba(255,255,255,.94);
  52. border: 1px solid #e2e8f0;
  53. border-radius: 16px;
  54. padding: 14px;
  55. box-shadow: 0 10px 28px rgba(15,23,42,.05);
  56. }
  57. .card h2 {
  58. margin: 0 0 4px;
  59. font-size: 15px;
  60. display: flex;
  61. align-items: center;
  62. gap: 8px;
  63. }
  64. .card .sub { margin: 0 0 12px; font-size: 12px; color: #64748b; }
  65. .pill {
  66. display: inline-block;
  67. padding: 2px 8px;
  68. border-radius: 999px;
  69. font-size: 10px;
  70. font-weight: 700;
  71. letter-spacing: 0.02em;
  72. }
  73. .pill.now { background: #fff1f2; color: #be123c; border: 1px solid #fecdd3; }
  74. .pill.rec { background: #ecfdf5; color: #047857; border: 1px solid #a7f3d0; }
  75. .pill.alt { background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe; }
  76. /* phone frame */
  77. .phone {
  78. width: 100%;
  79. max-width: 360px;
  80. margin: 0 auto;
  81. border-radius: 28px;
  82. border: 1px solid #cbd5e1;
  83. background: #0f172a;
  84. padding: 10px;
  85. box-shadow: 0 18px 40px rgba(15, 23, 42, 0.12);
  86. }
  87. .phone__screen {
  88. border-radius: 20px;
  89. overflow: hidden;
  90. background: var(--page-bg);
  91. min-height: 520px;
  92. display: flex;
  93. flex-direction: column;
  94. }
  95. .nav {
  96. display: flex;
  97. align-items: center;
  98. gap: 8px;
  99. min-height: 48px;
  100. padding: 10px 12px;
  101. background: linear-gradient(180deg, #d1fae5 0%, var(--nav-bg) 100%);
  102. border-bottom: 1px solid #bbf7d0;
  103. }
  104. .nav__back {
  105. width: 28px; height: 28px; border-radius: 999px;
  106. display: grid; place-items: center;
  107. color: var(--brand-dark); font-weight: 700; font-size: 16px;
  108. background: rgba(255,255,255,.55);
  109. }
  110. .nav__title {
  111. flex: 1; min-width: 0;
  112. font-size: 15px; font-weight: 700;
  113. color: #064e3b;
  114. white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  115. }
  116. .body {
  117. position: relative;
  118. flex: 1;
  119. padding: 12px 12px 20px;
  120. }
  121. .body--stamp-pad {
  122. padding-top: 8px;
  123. }
  124. /* current header: title + tag */
  125. .hd {
  126. display: flex;
  127. flex-wrap: wrap;
  128. gap: 8px;
  129. align-items: center;
  130. margin-bottom: 12px;
  131. padding: 4px 2px;
  132. }
  133. .hd__title {
  134. margin: 0;
  135. font-size: 17px;
  136. font-weight: 700;
  137. line-height: 1.35;
  138. color: #0f291e;
  139. }
  140. .tag {
  141. flex-shrink: 0;
  142. padding: 2px 8px;
  143. border-radius: 6px;
  144. font-size: 12px;
  145. font-weight: 600;
  146. color: #10b981;
  147. background: #ecfdf5;
  148. }
  149. .dup-hint {
  150. outline: 2px dashed #f43f5e;
  151. outline-offset: 2px;
  152. border-radius: 4px;
  153. background: rgba(244, 63, 94, 0.06);
  154. }
  155. /* form fake */
  156. .form {
  157. background: #fff;
  158. border: 1px solid #e8edf2;
  159. border-radius: 12px;
  160. overflow: hidden;
  161. }
  162. .form__row {
  163. display: grid;
  164. grid-template-columns: 88px 1fr;
  165. border-bottom: 1px solid #f1f5f9;
  166. min-height: 44px;
  167. }
  168. .form__row:last-child { border-bottom: 0; }
  169. .form__k {
  170. padding: 10px 12px;
  171. font-size: 12px;
  172. color: #64748b;
  173. background: #fafbfc;
  174. border-right: 1px solid #f1f5f9;
  175. display: flex; align-items: center;
  176. }
  177. .form__v {
  178. padding: 10px 12px;
  179. font-size: 13px;
  180. color: #0f172a;
  181. display: flex; align-items: center;
  182. }
  183. .tl {
  184. margin-top: 12px;
  185. background: #fff;
  186. border: 1px solid #e8edf2;
  187. border-radius: 12px;
  188. padding: 12px;
  189. }
  190. .tl h3 { margin: 0 0 8px; font-size: 13px; color: #334155; }
  191. .tl p { margin: 0; font-size: 12px; color: #64748b; }
  192. /* ===== 印章 v4(对齐 web-admin OaApprovalPrintSheet) ===== */
  193. .stamp-host {
  194. position: relative;
  195. min-height: 0;
  196. }
  197. .oa-stamp {
  198. --stamp: #3ec9a8;
  199. position: absolute;
  200. top: -2px;
  201. right: 4px;
  202. width: 96px;
  203. height: 96px;
  204. z-index: 5;
  205. pointer-events: none;
  206. transform: rotate(-18deg);
  207. opacity: 0.88;
  208. color: var(--stamp);
  209. }
  210. .oa-stamp.ok { --stamp: #3ec9a8; }
  211. .oa-stamp.run { --stamp: #f0a020; }
  212. .oa-stamp.rej { --stamp: #e85d5d; }
  213. .oa-stamp.ret { --stamp: #e07070; }
  214. .oa-stamp.can { --stamp: #9aa0a6; }
  215. .oa-stamp .outer {
  216. position: absolute;
  217. inset: 0;
  218. border-radius: 50%;
  219. border: 4px solid currentColor;
  220. box-sizing: border-box;
  221. }
  222. .oa-stamp .arc-top,
  223. .oa-stamp .arc-bottom {
  224. position: absolute;
  225. left: 12px;
  226. right: 12px;
  227. border: 2px solid currentColor;
  228. opacity: 0.95;
  229. pointer-events: none;
  230. }
  231. .oa-stamp .arc-top {
  232. top: 9px;
  233. height: 28px;
  234. border-bottom: none;
  235. border-left-color: transparent;
  236. border-right-color: transparent;
  237. border-radius: 50% 50% 0 0 / 100% 100% 0 0;
  238. }
  239. .oa-stamp .arc-bottom {
  240. bottom: 9px;
  241. height: 28px;
  242. border-top: none;
  243. border-left-color: transparent;
  244. border-right-color: transparent;
  245. border-radius: 0 0 50% 50% / 0 0 100% 100%;
  246. }
  247. .oa-stamp .label-top {
  248. position: absolute;
  249. top: 18px;
  250. left: 0; right: 0;
  251. text-align: center;
  252. font-size: 9px;
  253. font-weight: 500;
  254. letter-spacing: 1.5px;
  255. line-height: 1;
  256. color: currentColor;
  257. opacity: 0.95;
  258. }
  259. .oa-stamp .label-bottom {
  260. position: absolute;
  261. bottom: 16px;
  262. left: 0; right: 0;
  263. text-align: center;
  264. font-size: 8px;
  265. font-weight: 500;
  266. letter-spacing: 0.5px;
  267. line-height: 1;
  268. color: currentColor;
  269. opacity: 0.9;
  270. font-family: Arial, "Helvetica Neue", sans-serif;
  271. }
  272. .oa-stamp .main {
  273. position: absolute;
  274. inset: 0;
  275. display: flex;
  276. align-items: center;
  277. justify-content: center;
  278. font-size: 24px;
  279. font-weight: 800;
  280. letter-spacing: 1px;
  281. line-height: 1;
  282. color: currentColor;
  283. font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
  284. -webkit-text-stroke: 0.3px currentColor;
  285. }
  286. .oa-stamp .main.chars-3 {
  287. font-size: 20px;
  288. letter-spacing: 0.5px;
  289. }
  290. /* A2: 略小印章浮在表单右上(已选 72px) */
  291. .oa-stamp.sm {
  292. width: 72px;
  293. height: 72px;
  294. top: 8px;
  295. right: 8px;
  296. }
  297. .oa-stamp.sm .outer { border-width: 3px; }
  298. .oa-stamp.sm .main { font-size: 17px; }
  299. .oa-stamp.sm .main.chars-3 { font-size: 14px; }
  300. .oa-stamp.sm .label-top { top: 13px; font-size: 7px; letter-spacing: 1px; }
  301. .oa-stamp.sm .label-bottom { bottom: 12px; font-size: 6px; }
  302. .oa-stamp.sm .arc-top { top: 7px; height: 20px; left: 8px; right: 8px; }
  303. .oa-stamp.sm .arc-bottom { bottom: 7px; height: 20px; left: 8px; right: 8px; }
  304. /* 对照:上一版 84px */
  305. .oa-stamp.md {
  306. width: 84px;
  307. height: 84px;
  308. top: 6px;
  309. right: 8px;
  310. }
  311. .oa-stamp.md .main { font-size: 20px; }
  312. .oa-stamp.md .main.chars-3 { font-size: 17px; }
  313. .oa-stamp.md .label-top { top: 15px; font-size: 8px; }
  314. .oa-stamp.md .label-bottom { bottom: 14px; font-size: 7px; }
  315. .oa-stamp.md .arc-top { top: 8px; height: 24px; left: 10px; right: 10px; }
  316. .oa-stamp.md .arc-bottom { bottom: 8px; height: 24px; left: 10px; right: 10px; }
  317. .stamp-row {
  318. margin-top: 18px;
  319. display: flex;
  320. flex-wrap: wrap;
  321. gap: 16px;
  322. justify-content: center;
  323. padding: 16px;
  324. background: #fff;
  325. border: 1px dashed #cbd5e1;
  326. border-radius: 14px;
  327. }
  328. .stamp-row .item {
  329. display: flex;
  330. flex-direction: column;
  331. align-items: center;
  332. gap: 8px;
  333. min-width: 110px;
  334. }
  335. .stamp-row .item span {
  336. font-size: 11px;
  337. color: #64748b;
  338. }
  339. .stamp-static {
  340. position: relative;
  341. width: 96px;
  342. height: 96px;
  343. }
  344. .stamp-static .oa-stamp {
  345. position: absolute;
  346. top: 0; right: 0;
  347. transform: rotate(-18deg);
  348. }
  349. .legend {
  350. margin-top: 18px;
  351. padding: 14px 16px;
  352. border-radius: 14px;
  353. background: rgba(255,255,255,.94);
  354. border: 1px solid #e2e8f0;
  355. font-size: 13px;
  356. color: #475569;
  357. }
  358. .legend h2 { margin: 0 0 8px; font-size: 15px; color: var(--text); }
  359. .legend ol { margin: 0; padding-left: 18px; }
  360. .legend li { margin: 4px 0; }
  361. .legend code {
  362. font-size: 12px;
  363. background: #f1f5f9;
  364. padding: 1px 6px;
  365. border-radius: 4px;
  366. }
  367. </style>
  368. </head>
  369. <body>
  370. <div class="stage">
  371. <header class="hero">
  372. <h1>OA 详情 · 去掉内容区流程标题 + 右上角打印印章</h1>
  373. <p>
  374. 对比当前「标题 + 已完成 Tag」与目标态「顶栏已有标题,内容区不再重复标题;状态改为对齐 web 打印的钉钉风印章,叠在右上角」。
  375. 改动落点:<code>mobile-oa-h5/src/views/OaDetail.vue</code>(webview 内嵌页)。
  376. </p>
  377. <div class="note">本地打开本文件即可预览 · 文件:<strong>mobile-ui/zkxw-mobile-oa-detail-header-stamp-demo.html</strong></div>
  378. <div class="goals">
  379. <strong>目标</strong>
  380. <ul>
  381. <li>去掉内容区顶部流程名称(与顶栏标题重复)</li>
  382. <li>「已完成」等状态 Tag → web 打印同款圆形印章,放在界面右上角</li>
  383. <li>文案对齐打印:completed →「已通过」(非「已完成」)</li>
  384. </ul>
  385. </div>
  386. </header>
  387. <div class="grid">
  388. <!-- 现状 -->
  389. <section class="card">
  390. <h2><span class="pill now">现状</span> 标题 + Tag</h2>
  391. <p class="sub">顶栏与内容区标题重复(红框);状态为小胶囊 Tag。</p>
  392. <div class="phone">
  393. <div class="phone__screen">
  394. <div class="nav">
  395. <div class="nav__back">‹</div>
  396. <div class="nav__title">差旅报销申请</div>
  397. </div>
  398. <div class="body">
  399. <header class="hd">
  400. <h1 class="hd__title dup-hint">差旅报销申请</h1>
  401. <span class="tag">已完成</span>
  402. </header>
  403. <div class="form">
  404. <div class="form__row"><div class="form__k">申请人</div><div class="form__v">张三</div></div>
  405. <div class="form__row"><div class="form__k">金额</div><div class="form__v">¥ 1,280.00</div></div>
  406. <div class="form__row"><div class="form__k">事由</div><div class="form__v">客户拜访差旅</div></div>
  407. </div>
  408. <div class="tl">
  409. <h3>审批进度</h3>
  410. <p>发起 → 部门负责人(已同意)→ 结束</p>
  411. </div>
  412. </div>
  413. </div>
  414. </div>
  415. </section>
  416. <!-- 选定:A 布局 + 略小印章 -->
  417. <section class="card">
  418. <h2><span class="pill rec">已选</span> A 布局 · 印章 72px</h2>
  419. <p class="sub">去掉内容区标题;钉钉风印章叠在表单右上(相对 web 打印 118px / 上一版 84px 再小一档)。</p>
  420. <div class="phone">
  421. <div class="phone__screen">
  422. <div class="nav">
  423. <div class="nav__back">‹</div>
  424. <div class="nav__title">差旅报销申请</div>
  425. </div>
  426. <div class="body body--stamp-pad">
  427. <div class="stamp-host">
  428. <div class="oa-stamp ok sm" aria-label="已通过">
  429. <div class="outer"></div>
  430. <div class="arc-top"></div>
  431. <div class="arc-bottom"></div>
  432. <div class="label-top">OA审批</div>
  433. <div class="main">已通过</div>
  434. <div class="label-bottom">approval</div>
  435. </div>
  436. <div class="form">
  437. <div class="form__row"><div class="form__k">申请人</div><div class="form__v">张三</div></div>
  438. <div class="form__row"><div class="form__k">金额</div><div class="form__v">¥ 1,280.00</div></div>
  439. <div class="form__row"><div class="form__k">事由</div><div class="form__v">客户拜访差旅</div></div>
  440. <div class="form__row"><div class="form__k">备注</div><div class="form__v">含市内交通</div></div>
  441. </div>
  442. </div>
  443. <div class="tl">
  444. <h3>审批进度</h3>
  445. <p>发起 → 部门负责人(已同意)→ 结束</p>
  446. </div>
  447. </div>
  448. </div>
  449. </div>
  450. </section>
  451. <!-- 对照:大一号 -->
  452. <section class="card">
  453. <h2><span class="pill alt">对照</span> 若用 84px(未选)</h2>
  454. <p class="sub">仅尺寸对照;落地用左侧 72px。</p>
  455. <div class="phone">
  456. <div class="phone__screen">
  457. <div class="nav">
  458. <div class="nav__back">‹</div>
  459. <div class="nav__title">差旅报销申请</div>
  460. </div>
  461. <div class="body body--stamp-pad">
  462. <div class="stamp-host">
  463. <div class="oa-stamp ok md" aria-label="已通过">
  464. <div class="outer"></div>
  465. <div class="arc-top"></div>
  466. <div class="arc-bottom"></div>
  467. <div class="label-top">OA审批</div>
  468. <div class="main">已通过</div>
  469. <div class="label-bottom">approval</div>
  470. </div>
  471. <div class="form">
  472. <div class="form__row"><div class="form__k">申请人</div><div class="form__v">张三</div></div>
  473. <div class="form__row"><div class="form__k">金额</div><div class="form__v">¥ 1,280.00</div></div>
  474. <div class="form__row"><div class="form__k">事由</div><div class="form__v">客户拜访差旅</div></div>
  475. <div class="form__row"><div class="form__k">备注</div><div class="form__v">含市内交通</div></div>
  476. </div>
  477. </div>
  478. <div class="tl">
  479. <h3>审批进度</h3>
  480. <p>发起 → 部门负责人(已同意)→ 结束</p>
  481. </div>
  482. </div>
  483. </div>
  484. </div>
  485. </section>
  486. </div>
  487. <section class="legend">
  488. <h2>各状态印章色(与 web 打印一致)</h2>
  489. <div class="stamp-row">
  490. <div class="item">
  491. <div class="stamp-static">
  492. <div class="oa-stamp ok">
  493. <div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
  494. <div class="label-top">OA审批</div><div class="main">已通过</div><div class="label-bottom">approval</div>
  495. </div>
  496. </div>
  497. <span>completed / approved → ok</span>
  498. </div>
  499. <div class="item">
  500. <div class="stamp-static">
  501. <div class="oa-stamp run">
  502. <div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
  503. <div class="label-top">OA审批</div><div class="main">审批中</div><div class="label-bottom">approval</div>
  504. </div>
  505. </div>
  506. <span>running / pending → run</span>
  507. </div>
  508. <div class="item">
  509. <div class="stamp-static">
  510. <div class="oa-stamp rej">
  511. <div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
  512. <div class="label-top">OA审批</div><div class="main">已拒绝</div><div class="label-bottom">approval</div>
  513. </div>
  514. </div>
  515. <span>rejected → rej</span>
  516. </div>
  517. <div class="item">
  518. <div class="stamp-static">
  519. <div class="oa-stamp ret">
  520. <div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
  521. <div class="label-top">OA审批</div><div class="main">已打回</div><div class="label-bottom">approval</div>
  522. </div>
  523. </div>
  524. <span>returned → ret</span>
  525. </div>
  526. <div class="item">
  527. <div class="stamp-static">
  528. <div class="oa-stamp can">
  529. <div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
  530. <div class="label-top">OA审批</div><div class="main">已撤销</div><div class="label-bottom">approval</div>
  531. </div>
  532. </div>
  533. <span>cancelled → can</span>
  534. </div>
  535. </div>
  536. </section>
  537. <section class="legend">
  538. <h2>当前共识</h2>
  539. <ol>
  540. <li>去掉内容区流程标题(顶栏已有)</li>
  541. <li>状态改为 web 打印同款印章,叠在表单区域右上角</li>
  542. <li>尺寸用 <strong>72px</strong>(A 布局 + 再小一档),文案用打印 <code>resolveStamp</code>(如 completed →「已通过」)</li>
  543. </ol>
  544. <p style="margin:10px 0 0">若 72px 仍偏大/偏小,直接说目标像素即可;否则回复「按此设计」我写 spec 并实现。</p>
  545. </section>
  546. </div>
  547. </body>
  548. </html>