565 lines
19 KiB
HTML
565 lines
19 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
|
||
<title>mobile-oa-h5 · 详情头区去掉标题 + 打印印章 Demo</title>
|
||
<style>
|
||
:root {
|
||
--brand: #0a9f6d;
|
||
--brand-dark: #087f57;
|
||
--brand-soft: #e9f9f2;
|
||
--page-bg: #f5f6f8;
|
||
--text: #1f2a26;
|
||
--text-muted: #6b7b74;
|
||
--nav-bg: #ecfdf5;
|
||
}
|
||
* { box-sizing: border-box; }
|
||
body {
|
||
margin: 0;
|
||
font-family: "PingFang SC", "Hiragino Sans GB", "Noto Sans SC", -apple-system, system-ui, sans-serif;
|
||
color: var(--text);
|
||
background:
|
||
radial-gradient(900px 420px at 8% -8%, rgba(10, 159, 109, 0.12), transparent 55%),
|
||
radial-gradient(700px 380px at 92% 0%, rgba(214, 163, 67, 0.1), transparent 50%),
|
||
linear-gradient(180deg, #f8fffc 0%, #f4f7fb 50%, #f7f8fa 100%);
|
||
line-height: 1.45;
|
||
}
|
||
.stage { max-width: 1280px; margin: 0 auto; padding: 28px 16px 56px; }
|
||
.hero h1 { margin: 0 0 8px; font-size: 22px; font-weight: 720; }
|
||
.hero p { margin: 0; color: #64748b; font-size: 14px; max-width: 820px; }
|
||
.hero .note {
|
||
margin-top: 12px; display: inline-block; padding: 8px 12px;
|
||
border-radius: 10px; background: #fff; border: 1px solid #e2e8f0;
|
||
font-size: 12px; color: #64748b;
|
||
}
|
||
.hero .note strong { color: #0f766e; }
|
||
|
||
.goals {
|
||
margin-top: 14px; padding: 12px 14px; border-radius: 12px;
|
||
background: #ecfdf5; border: 1px solid #a7f3d0;
|
||
font-size: 13px; color: #065f46;
|
||
}
|
||
.goals ul { margin: 6px 0 0; padding-left: 18px; }
|
||
|
||
.grid {
|
||
margin-top: 22px;
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||
gap: 20px;
|
||
align-items: start;
|
||
}
|
||
|
||
.card {
|
||
background: rgba(255,255,255,.94);
|
||
border: 1px solid #e2e8f0;
|
||
border-radius: 16px;
|
||
padding: 14px;
|
||
box-shadow: 0 10px 28px rgba(15,23,42,.05);
|
||
}
|
||
.card h2 {
|
||
margin: 0 0 4px;
|
||
font-size: 15px;
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 8px;
|
||
}
|
||
.card .sub { margin: 0 0 12px; font-size: 12px; color: #64748b; }
|
||
.pill {
|
||
display: inline-block;
|
||
padding: 2px 8px;
|
||
border-radius: 999px;
|
||
font-size: 10px;
|
||
font-weight: 700;
|
||
letter-spacing: 0.02em;
|
||
}
|
||
.pill.now { background: #fff1f2; color: #be123c; border: 1px solid #fecdd3; }
|
||
.pill.rec { background: #ecfdf5; color: #047857; border: 1px solid #a7f3d0; }
|
||
.pill.alt { background: #eff6ff; color: #1d4ed8; border: 1px solid #bfdbfe; }
|
||
|
||
/* phone frame */
|
||
.phone {
|
||
width: 100%;
|
||
max-width: 360px;
|
||
margin: 0 auto;
|
||
border-radius: 28px;
|
||
border: 1px solid #cbd5e1;
|
||
background: #0f172a;
|
||
padding: 10px;
|
||
box-shadow: 0 18px 40px rgba(15, 23, 42, 0.12);
|
||
}
|
||
.phone__screen {
|
||
border-radius: 20px;
|
||
overflow: hidden;
|
||
background: var(--page-bg);
|
||
min-height: 520px;
|
||
display: flex;
|
||
flex-direction: column;
|
||
}
|
||
.nav {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 8px;
|
||
min-height: 48px;
|
||
padding: 10px 12px;
|
||
background: linear-gradient(180deg, #d1fae5 0%, var(--nav-bg) 100%);
|
||
border-bottom: 1px solid #bbf7d0;
|
||
}
|
||
.nav__back {
|
||
width: 28px; height: 28px; border-radius: 999px;
|
||
display: grid; place-items: center;
|
||
color: var(--brand-dark); font-weight: 700; font-size: 16px;
|
||
background: rgba(255,255,255,.55);
|
||
}
|
||
.nav__title {
|
||
flex: 1; min-width: 0;
|
||
font-size: 15px; font-weight: 700;
|
||
color: #064e3b;
|
||
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
|
||
}
|
||
.body {
|
||
position: relative;
|
||
flex: 1;
|
||
padding: 12px 12px 20px;
|
||
}
|
||
.body--stamp-pad {
|
||
padding-top: 8px;
|
||
}
|
||
|
||
/* current header: title + tag */
|
||
.hd {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 8px;
|
||
align-items: center;
|
||
margin-bottom: 12px;
|
||
padding: 4px 2px;
|
||
}
|
||
.hd__title {
|
||
margin: 0;
|
||
font-size: 17px;
|
||
font-weight: 700;
|
||
line-height: 1.35;
|
||
color: #0f291e;
|
||
}
|
||
.tag {
|
||
flex-shrink: 0;
|
||
padding: 2px 8px;
|
||
border-radius: 6px;
|
||
font-size: 12px;
|
||
font-weight: 600;
|
||
color: #10b981;
|
||
background: #ecfdf5;
|
||
}
|
||
.dup-hint {
|
||
outline: 2px dashed #f43f5e;
|
||
outline-offset: 2px;
|
||
border-radius: 4px;
|
||
background: rgba(244, 63, 94, 0.06);
|
||
}
|
||
|
||
/* form fake */
|
||
.form {
|
||
background: #fff;
|
||
border: 1px solid #e8edf2;
|
||
border-radius: 12px;
|
||
overflow: hidden;
|
||
}
|
||
.form__row {
|
||
display: grid;
|
||
grid-template-columns: 88px 1fr;
|
||
border-bottom: 1px solid #f1f5f9;
|
||
min-height: 44px;
|
||
}
|
||
.form__row:last-child { border-bottom: 0; }
|
||
.form__k {
|
||
padding: 10px 12px;
|
||
font-size: 12px;
|
||
color: #64748b;
|
||
background: #fafbfc;
|
||
border-right: 1px solid #f1f5f9;
|
||
display: flex; align-items: center;
|
||
}
|
||
.form__v {
|
||
padding: 10px 12px;
|
||
font-size: 13px;
|
||
color: #0f172a;
|
||
display: flex; align-items: center;
|
||
}
|
||
.tl {
|
||
margin-top: 12px;
|
||
background: #fff;
|
||
border: 1px solid #e8edf2;
|
||
border-radius: 12px;
|
||
padding: 12px;
|
||
}
|
||
.tl h3 { margin: 0 0 8px; font-size: 13px; color: #334155; }
|
||
.tl p { margin: 0; font-size: 12px; color: #64748b; }
|
||
|
||
/* ===== 印章 v4(对齐 web-admin OaApprovalPrintSheet) ===== */
|
||
.stamp-host {
|
||
position: relative;
|
||
min-height: 0;
|
||
}
|
||
.oa-stamp {
|
||
--stamp: #3ec9a8;
|
||
position: absolute;
|
||
top: -2px;
|
||
right: 4px;
|
||
width: 96px;
|
||
height: 96px;
|
||
z-index: 5;
|
||
pointer-events: none;
|
||
transform: rotate(-18deg);
|
||
opacity: 0.88;
|
||
color: var(--stamp);
|
||
}
|
||
.oa-stamp.ok { --stamp: #3ec9a8; }
|
||
.oa-stamp.run { --stamp: #f0a020; }
|
||
.oa-stamp.rej { --stamp: #e85d5d; }
|
||
.oa-stamp.ret { --stamp: #e07070; }
|
||
.oa-stamp.can { --stamp: #9aa0a6; }
|
||
.oa-stamp .outer {
|
||
position: absolute;
|
||
inset: 0;
|
||
border-radius: 50%;
|
||
border: 4px solid currentColor;
|
||
box-sizing: border-box;
|
||
}
|
||
.oa-stamp .arc-top,
|
||
.oa-stamp .arc-bottom {
|
||
position: absolute;
|
||
left: 12px;
|
||
right: 12px;
|
||
border: 2px solid currentColor;
|
||
opacity: 0.95;
|
||
pointer-events: none;
|
||
}
|
||
.oa-stamp .arc-top {
|
||
top: 9px;
|
||
height: 28px;
|
||
border-bottom: none;
|
||
border-left-color: transparent;
|
||
border-right-color: transparent;
|
||
border-radius: 50% 50% 0 0 / 100% 100% 0 0;
|
||
}
|
||
.oa-stamp .arc-bottom {
|
||
bottom: 9px;
|
||
height: 28px;
|
||
border-top: none;
|
||
border-left-color: transparent;
|
||
border-right-color: transparent;
|
||
border-radius: 0 0 50% 50% / 0 0 100% 100%;
|
||
}
|
||
.oa-stamp .label-top {
|
||
position: absolute;
|
||
top: 18px;
|
||
left: 0; right: 0;
|
||
text-align: center;
|
||
font-size: 9px;
|
||
font-weight: 500;
|
||
letter-spacing: 1.5px;
|
||
line-height: 1;
|
||
color: currentColor;
|
||
opacity: 0.95;
|
||
}
|
||
.oa-stamp .label-bottom {
|
||
position: absolute;
|
||
bottom: 16px;
|
||
left: 0; right: 0;
|
||
text-align: center;
|
||
font-size: 8px;
|
||
font-weight: 500;
|
||
letter-spacing: 0.5px;
|
||
line-height: 1;
|
||
color: currentColor;
|
||
opacity: 0.9;
|
||
font-family: Arial, "Helvetica Neue", sans-serif;
|
||
}
|
||
.oa-stamp .main {
|
||
position: absolute;
|
||
inset: 0;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 24px;
|
||
font-weight: 800;
|
||
letter-spacing: 1px;
|
||
line-height: 1;
|
||
color: currentColor;
|
||
font-family: "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
|
||
-webkit-text-stroke: 0.3px currentColor;
|
||
}
|
||
.oa-stamp .main.chars-3 {
|
||
font-size: 20px;
|
||
letter-spacing: 0.5px;
|
||
}
|
||
|
||
/* A2: 略小印章浮在表单右上(已选 72px) */
|
||
.oa-stamp.sm {
|
||
width: 72px;
|
||
height: 72px;
|
||
top: 8px;
|
||
right: 8px;
|
||
}
|
||
.oa-stamp.sm .outer { border-width: 3px; }
|
||
.oa-stamp.sm .main { font-size: 17px; }
|
||
.oa-stamp.sm .main.chars-3 { font-size: 14px; }
|
||
.oa-stamp.sm .label-top { top: 13px; font-size: 7px; letter-spacing: 1px; }
|
||
.oa-stamp.sm .label-bottom { bottom: 12px; font-size: 6px; }
|
||
.oa-stamp.sm .arc-top { top: 7px; height: 20px; left: 8px; right: 8px; }
|
||
.oa-stamp.sm .arc-bottom { bottom: 7px; height: 20px; left: 8px; right: 8px; }
|
||
|
||
/* 对照:上一版 84px */
|
||
.oa-stamp.md {
|
||
width: 84px;
|
||
height: 84px;
|
||
top: 6px;
|
||
right: 8px;
|
||
}
|
||
.oa-stamp.md .main { font-size: 20px; }
|
||
.oa-stamp.md .main.chars-3 { font-size: 17px; }
|
||
.oa-stamp.md .label-top { top: 15px; font-size: 8px; }
|
||
.oa-stamp.md .label-bottom { bottom: 14px; font-size: 7px; }
|
||
.oa-stamp.md .arc-top { top: 8px; height: 24px; left: 10px; right: 10px; }
|
||
.oa-stamp.md .arc-bottom { bottom: 8px; height: 24px; left: 10px; right: 10px; }
|
||
|
||
.stamp-row {
|
||
margin-top: 18px;
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 16px;
|
||
justify-content: center;
|
||
padding: 16px;
|
||
background: #fff;
|
||
border: 1px dashed #cbd5e1;
|
||
border-radius: 14px;
|
||
}
|
||
.stamp-row .item {
|
||
display: flex;
|
||
flex-direction: column;
|
||
align-items: center;
|
||
gap: 8px;
|
||
min-width: 110px;
|
||
}
|
||
.stamp-row .item span {
|
||
font-size: 11px;
|
||
color: #64748b;
|
||
}
|
||
.stamp-static {
|
||
position: relative;
|
||
width: 96px;
|
||
height: 96px;
|
||
}
|
||
.stamp-static .oa-stamp {
|
||
position: absolute;
|
||
top: 0; right: 0;
|
||
transform: rotate(-18deg);
|
||
}
|
||
|
||
.legend {
|
||
margin-top: 18px;
|
||
padding: 14px 16px;
|
||
border-radius: 14px;
|
||
background: rgba(255,255,255,.94);
|
||
border: 1px solid #e2e8f0;
|
||
font-size: 13px;
|
||
color: #475569;
|
||
}
|
||
.legend h2 { margin: 0 0 8px; font-size: 15px; color: var(--text); }
|
||
.legend ol { margin: 0; padding-left: 18px; }
|
||
.legend li { margin: 4px 0; }
|
||
.legend code {
|
||
font-size: 12px;
|
||
background: #f1f5f9;
|
||
padding: 1px 6px;
|
||
border-radius: 4px;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="stage">
|
||
<header class="hero">
|
||
<h1>OA 详情 · 去掉内容区流程标题 + 右上角打印印章</h1>
|
||
<p>
|
||
对比当前「标题 + 已完成 Tag」与目标态「顶栏已有标题,内容区不再重复标题;状态改为对齐 web 打印的钉钉风印章,叠在右上角」。
|
||
改动落点:<code>mobile-oa-h5/src/views/OaDetail.vue</code>(webview 内嵌页)。
|
||
</p>
|
||
<div class="note">本地打开本文件即可预览 · 文件:<strong>mobile-ui/zkxw-mobile-oa-detail-header-stamp-demo.html</strong></div>
|
||
<div class="goals">
|
||
<strong>目标</strong>
|
||
<ul>
|
||
<li>去掉内容区顶部流程名称(与顶栏标题重复)</li>
|
||
<li>「已完成」等状态 Tag → web 打印同款圆形印章,放在界面右上角</li>
|
||
<li>文案对齐打印:completed →「已通过」(非「已完成」)</li>
|
||
</ul>
|
||
</div>
|
||
</header>
|
||
|
||
<div class="grid">
|
||
<!-- 现状 -->
|
||
<section class="card">
|
||
<h2><span class="pill now">现状</span> 标题 + Tag</h2>
|
||
<p class="sub">顶栏与内容区标题重复(红框);状态为小胶囊 Tag。</p>
|
||
<div class="phone">
|
||
<div class="phone__screen">
|
||
<div class="nav">
|
||
<div class="nav__back">‹</div>
|
||
<div class="nav__title">差旅报销申请</div>
|
||
</div>
|
||
<div class="body">
|
||
<header class="hd">
|
||
<h1 class="hd__title dup-hint">差旅报销申请</h1>
|
||
<span class="tag">已完成</span>
|
||
</header>
|
||
<div class="form">
|
||
<div class="form__row"><div class="form__k">申请人</div><div class="form__v">张三</div></div>
|
||
<div class="form__row"><div class="form__k">金额</div><div class="form__v">¥ 1,280.00</div></div>
|
||
<div class="form__row"><div class="form__k">事由</div><div class="form__v">客户拜访差旅</div></div>
|
||
</div>
|
||
<div class="tl">
|
||
<h3>审批进度</h3>
|
||
<p>发起 → 部门负责人(已同意)→ 结束</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- 选定:A 布局 + 略小印章 -->
|
||
<section class="card">
|
||
<h2><span class="pill rec">已选</span> A 布局 · 印章 72px</h2>
|
||
<p class="sub">去掉内容区标题;钉钉风印章叠在表单右上(相对 web 打印 118px / 上一版 84px 再小一档)。</p>
|
||
<div class="phone">
|
||
<div class="phone__screen">
|
||
<div class="nav">
|
||
<div class="nav__back">‹</div>
|
||
<div class="nav__title">差旅报销申请</div>
|
||
</div>
|
||
<div class="body body--stamp-pad">
|
||
<div class="stamp-host">
|
||
<div class="oa-stamp ok sm" aria-label="已通过">
|
||
<div class="outer"></div>
|
||
<div class="arc-top"></div>
|
||
<div class="arc-bottom"></div>
|
||
<div class="label-top">OA审批</div>
|
||
<div class="main">已通过</div>
|
||
<div class="label-bottom">approval</div>
|
||
</div>
|
||
<div class="form">
|
||
<div class="form__row"><div class="form__k">申请人</div><div class="form__v">张三</div></div>
|
||
<div class="form__row"><div class="form__k">金额</div><div class="form__v">¥ 1,280.00</div></div>
|
||
<div class="form__row"><div class="form__k">事由</div><div class="form__v">客户拜访差旅</div></div>
|
||
<div class="form__row"><div class="form__k">备注</div><div class="form__v">含市内交通</div></div>
|
||
</div>
|
||
</div>
|
||
<div class="tl">
|
||
<h3>审批进度</h3>
|
||
<p>发起 → 部门负责人(已同意)→ 结束</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<!-- 对照:大一号 -->
|
||
<section class="card">
|
||
<h2><span class="pill alt">对照</span> 若用 84px(未选)</h2>
|
||
<p class="sub">仅尺寸对照;落地用左侧 72px。</p>
|
||
<div class="phone">
|
||
<div class="phone__screen">
|
||
<div class="nav">
|
||
<div class="nav__back">‹</div>
|
||
<div class="nav__title">差旅报销申请</div>
|
||
</div>
|
||
<div class="body body--stamp-pad">
|
||
<div class="stamp-host">
|
||
<div class="oa-stamp ok md" aria-label="已通过">
|
||
<div class="outer"></div>
|
||
<div class="arc-top"></div>
|
||
<div class="arc-bottom"></div>
|
||
<div class="label-top">OA审批</div>
|
||
<div class="main">已通过</div>
|
||
<div class="label-bottom">approval</div>
|
||
</div>
|
||
<div class="form">
|
||
<div class="form__row"><div class="form__k">申请人</div><div class="form__v">张三</div></div>
|
||
<div class="form__row"><div class="form__k">金额</div><div class="form__v">¥ 1,280.00</div></div>
|
||
<div class="form__row"><div class="form__k">事由</div><div class="form__v">客户拜访差旅</div></div>
|
||
<div class="form__row"><div class="form__k">备注</div><div class="form__v">含市内交通</div></div>
|
||
</div>
|
||
</div>
|
||
<div class="tl">
|
||
<h3>审批进度</h3>
|
||
<p>发起 → 部门负责人(已同意)→ 结束</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
|
||
<section class="legend">
|
||
<h2>各状态印章色(与 web 打印一致)</h2>
|
||
<div class="stamp-row">
|
||
<div class="item">
|
||
<div class="stamp-static">
|
||
<div class="oa-stamp ok">
|
||
<div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
|
||
<div class="label-top">OA审批</div><div class="main">已通过</div><div class="label-bottom">approval</div>
|
||
</div>
|
||
</div>
|
||
<span>completed / approved → ok</span>
|
||
</div>
|
||
<div class="item">
|
||
<div class="stamp-static">
|
||
<div class="oa-stamp run">
|
||
<div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
|
||
<div class="label-top">OA审批</div><div class="main">审批中</div><div class="label-bottom">approval</div>
|
||
</div>
|
||
</div>
|
||
<span>running / pending → run</span>
|
||
</div>
|
||
<div class="item">
|
||
<div class="stamp-static">
|
||
<div class="oa-stamp rej">
|
||
<div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
|
||
<div class="label-top">OA审批</div><div class="main">已拒绝</div><div class="label-bottom">approval</div>
|
||
</div>
|
||
</div>
|
||
<span>rejected → rej</span>
|
||
</div>
|
||
<div class="item">
|
||
<div class="stamp-static">
|
||
<div class="oa-stamp ret">
|
||
<div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
|
||
<div class="label-top">OA审批</div><div class="main">已打回</div><div class="label-bottom">approval</div>
|
||
</div>
|
||
</div>
|
||
<span>returned → ret</span>
|
||
</div>
|
||
<div class="item">
|
||
<div class="stamp-static">
|
||
<div class="oa-stamp can">
|
||
<div class="outer"></div><div class="arc-top"></div><div class="arc-bottom"></div>
|
||
<div class="label-top">OA审批</div><div class="main">已撤销</div><div class="label-bottom">approval</div>
|
||
</div>
|
||
</div>
|
||
<span>cancelled → can</span>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="legend">
|
||
<h2>当前共识</h2>
|
||
<ol>
|
||
<li>去掉内容区流程标题(顶栏已有)</li>
|
||
<li>状态改为 web 打印同款印章,叠在表单区域右上角</li>
|
||
<li>尺寸用 <strong>72px</strong>(A 布局 + 再小一档),文案用打印 <code>resolveStamp</code>(如 completed →「已通过」)</li>
|
||
</ol>
|
||
<p style="margin:10px 0 0">若 72px 仍偏大/偏小,直接说目标像素即可;否则回复「按此设计」我写 spec 并实现。</p>
|
||
</section>
|
||
</div>
|
||
</body>
|
||
</html>
|