@deppon/deppon-skills 2.4.18 → 2.4.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/deppon-npm-skills/SKILL.md +3 -3
- package/dist/deppon-prd-generator/SKILL.md +81 -18
- package/dist/deppon-prd-generator/examples/README.md +17 -0
- package/dist/deppon-prd-generator/examples/app-shell-navigation/layout-spec.md +54 -0
- package/dist/deppon-prd-generator/examples/app-shell-navigation/pages/demo-form.html +57 -0
- package/dist/deppon-prd-generator/examples/app-shell-navigation/pages/demo-home.html +92 -0
- package/dist/deppon-prd-generator/examples/app-shell-navigation/pages/demo-list.html +47 -0
- package/dist/deppon-prd-generator/examples/app-shell-navigation/prd.md +164 -0
- package/dist/deppon-prd-generator/examples/app-shell-navigation/prototype.html +794 -0
- package/dist/deppon-prd-generator/examples/backend-list/prd.md +91 -0
- package/dist/deppon-prd-generator/examples/backend-list/prototype.html +369 -0
- package/dist/deppon-prd-generator/examples/data-dashboard/prd.md +127 -0
- package/dist/deppon-prd-generator/examples/data-dashboard/prototype.html +281 -0
- package/dist/deppon-prd-generator/examples/form-edit/prd.md +108 -0
- package/dist/deppon-prd-generator/examples/form-edit/prototype.html +280 -0
- package/dist/deppon-prd-generator/examples/form-preview/prd.md +106 -0
- package/dist/deppon-prd-generator/examples/form-preview/prototype.html +240 -0
- package/dist/deppon-prd-generator/{user-management → examples/list-crud}/prd.md +9 -4
- package/dist/deppon-prd-generator/{user-management → examples/list-crud}/prototype.html +246 -94
- package/dist/deppon-prd-generator/examples/user-frontend/prd.md +86 -0
- package/dist/deppon-prd-generator/examples/user-frontend/prototype.html +223 -0
- package/dist/deppon-prd-generator/quick-reference.md +23 -6
- package/dist/deppon-prd-generator/template/app-shell-navigation-prd-template.md +180 -0
- package/dist/deppon-prd-generator/template/backend-form-edit-prd-template.md +4 -0
- package/dist/deppon-prd-generator/template/backend-form-preview-prd-template.md +4 -0
- package/dist/deppon-prd-generator/template/backend-list-prd-template.md +4 -0
- package/dist/deppon-prd-generator/template/data-prd-template.md +4 -0
- package/dist/deppon-prd-generator/template/user-frontend-prd-template.md +4 -0
- package/dist/deppon-prd-generator/workflow.md +34 -16
- package/package.json +1 -1
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
技能示例 examples/data-dashboard/ — 对齐 data-prd-template
|
|
3
|
+
fetch prd.md;须 HTTP。
|
|
4
|
+
-->
|
|
5
|
+
<!DOCTYPE html>
|
|
6
|
+
<html lang="zh-CN">
|
|
7
|
+
<head>
|
|
8
|
+
<meta charset="UTF-8" />
|
|
9
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
10
|
+
<title>渠道运营看板 — 原型</title>
|
|
11
|
+
<script src="https://cdn.tailwindcss.com"></script>
|
|
12
|
+
<style>
|
|
13
|
+
.anno-trigger {
|
|
14
|
+
display: inline-flex;
|
|
15
|
+
border-radius: 0.375rem;
|
|
16
|
+
border: 1px solid rgba(217, 119, 6, 0.85);
|
|
17
|
+
background: rgba(254, 243, 199, 0.95);
|
|
18
|
+
padding: 0.12rem 0.45rem;
|
|
19
|
+
font-size: 0.6rem;
|
|
20
|
+
font-weight: 700;
|
|
21
|
+
color: rgb(69 26 3);
|
|
22
|
+
cursor: pointer;
|
|
23
|
+
}
|
|
24
|
+
#annoDlgBody .prd-md table {
|
|
25
|
+
width: 100%;
|
|
26
|
+
border-collapse: collapse;
|
|
27
|
+
font-size: 0.72rem;
|
|
28
|
+
}
|
|
29
|
+
#annoDlgBody .prd-md th,
|
|
30
|
+
#annoDlgBody .prd-md td {
|
|
31
|
+
border: 1px solid rgb(226 232 240);
|
|
32
|
+
padding: 0.3rem;
|
|
33
|
+
}
|
|
34
|
+
</style>
|
|
35
|
+
</head>
|
|
36
|
+
<body class="min-h-screen bg-slate-100">
|
|
37
|
+
<div id="prdLoadBanner" class="hidden border-b border-amber-300 bg-amber-100 px-4 py-2 text-center text-xs"></div>
|
|
38
|
+
<div id="toast" class="fixed top-4 right-4 z-[60] hidden rounded-lg bg-slate-900 px-4 py-2 text-sm text-white"></div>
|
|
39
|
+
<button type="button" id="btnAnnoLegend" class="fixed bottom-5 left-5 z-[65] rounded-full border border-amber-400 bg-white px-3 py-2 text-xs shadow">
|
|
40
|
+
标注说明
|
|
41
|
+
</button>
|
|
42
|
+
|
|
43
|
+
<header class="border-b bg-white px-4 py-3">
|
|
44
|
+
<div class="mx-auto flex max-w-6xl flex-wrap items-center gap-2">
|
|
45
|
+
<h1 class="text-lg font-semibold">渠道运营看板</h1>
|
|
46
|
+
<button type="button" class="anno-trigger" data-anno-key="s1">§1</button>
|
|
47
|
+
<button type="button" class="anno-trigger" data-anno-key="s2">§2</button>
|
|
48
|
+
</div>
|
|
49
|
+
</header>
|
|
50
|
+
|
|
51
|
+
<main class="mx-auto max-w-6xl space-y-6 px-4 py-6">
|
|
52
|
+
<section class="rounded-xl border border-slate-200 bg-white p-4 shadow-sm">
|
|
53
|
+
<div class="mb-3 flex items-center justify-between">
|
|
54
|
+
<span class="text-sm font-semibold">筛选</span>
|
|
55
|
+
<button type="button" class="anno-trigger" data-anno-key="s31">§3.1</button>
|
|
56
|
+
</div>
|
|
57
|
+
<div class="flex flex-wrap gap-3">
|
|
58
|
+
<input type="date" class="rounded border px-2 py-1 text-sm" />
|
|
59
|
+
<select class="rounded border px-2 py-1 text-sm">
|
|
60
|
+
<option>全部渠道类型</option>
|
|
61
|
+
<option>付费</option>
|
|
62
|
+
<option>自然</option>
|
|
63
|
+
</select>
|
|
64
|
+
<button type="button" class="rounded-lg bg-blue-600 px-4 py-1.5 text-sm font-medium text-white">查询</button>
|
|
65
|
+
</div>
|
|
66
|
+
</section>
|
|
67
|
+
|
|
68
|
+
<section>
|
|
69
|
+
<div class="mb-2 flex items-center justify-between">
|
|
70
|
+
<h2 class="text-sm font-semibold text-slate-800">核心指标</h2>
|
|
71
|
+
<button type="button" class="anno-trigger" data-anno-key="s32">§3.2</button>
|
|
72
|
+
</div>
|
|
73
|
+
<div class="grid gap-3 sm:grid-cols-3">
|
|
74
|
+
<div class="rounded-xl border border-slate-200 bg-white p-4 shadow-sm">
|
|
75
|
+
<p class="text-xs text-slate-500">渠道 UV</p>
|
|
76
|
+
<p class="mt-1 text-2xl font-semibold text-slate-900">128,400</p>
|
|
77
|
+
</div>
|
|
78
|
+
<div class="rounded-xl border border-slate-200 bg-white p-4 shadow-sm">
|
|
79
|
+
<p class="text-xs text-slate-500">转化率</p>
|
|
80
|
+
<p class="mt-1 text-2xl font-semibold text-emerald-600">3.2%</p>
|
|
81
|
+
</div>
|
|
82
|
+
<div class="rounded-xl border border-slate-200 bg-white p-4 shadow-sm">
|
|
83
|
+
<p class="text-xs text-slate-500">消耗金额</p>
|
|
84
|
+
<p class="mt-1 text-2xl font-semibold text-slate-900">¥ 42,100</p>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
</section>
|
|
88
|
+
|
|
89
|
+
<section class="rounded-xl border border-slate-200 bg-white p-4 shadow-sm">
|
|
90
|
+
<div class="mb-2 flex items-center justify-between">
|
|
91
|
+
<h2 class="text-sm font-semibold">趋势(占位)</h2>
|
|
92
|
+
<button type="button" class="anno-trigger" data-anno-key="s33">§3.3</button>
|
|
93
|
+
</div>
|
|
94
|
+
<div class="flex h-40 items-end justify-around gap-1 rounded-lg bg-slate-50 p-4">
|
|
95
|
+
<div class="w-6 rounded-t bg-blue-400" style="height: 40%"></div>
|
|
96
|
+
<div class="w-6 rounded-t bg-blue-500" style="height: 55%"></div>
|
|
97
|
+
<div class="w-6 rounded-t bg-blue-600" style="height: 70%"></div>
|
|
98
|
+
<div class="w-6 rounded-t bg-blue-500" style="height: 50%"></div>
|
|
99
|
+
<div class="w-6 rounded-t bg-blue-400" style="height: 45%"></div>
|
|
100
|
+
<div class="w-6 rounded-t bg-blue-600" style="height: 85%"></div>
|
|
101
|
+
<div class="w-6 rounded-t bg-blue-500" style="height: 60%"></div>
|
|
102
|
+
</div>
|
|
103
|
+
</section>
|
|
104
|
+
|
|
105
|
+
<section class="rounded-xl border border-slate-200 bg-white shadow-sm">
|
|
106
|
+
<div class="flex items-center justify-between border-b px-4 py-2">
|
|
107
|
+
<h2 class="text-sm font-semibold">渠道明细</h2>
|
|
108
|
+
<button type="button" class="anno-trigger" data-anno-key="s34">§3.4</button>
|
|
109
|
+
</div>
|
|
110
|
+
<table class="w-full text-left text-sm">
|
|
111
|
+
<thead class="bg-slate-50 text-xs text-slate-600">
|
|
112
|
+
<tr>
|
|
113
|
+
<th class="px-4 py-2">渠道</th>
|
|
114
|
+
<th class="px-4 py-2">UV</th>
|
|
115
|
+
<th class="px-4 py-2">订单</th>
|
|
116
|
+
</tr>
|
|
117
|
+
</thead>
|
|
118
|
+
<tbody>
|
|
119
|
+
<tr class="border-t">
|
|
120
|
+
<td class="px-4 py-2">搜索</td>
|
|
121
|
+
<td class="px-4 py-2">52,000</td>
|
|
122
|
+
<td class="px-4 py-2">1,203</td>
|
|
123
|
+
</tr>
|
|
124
|
+
<tr class="border-t">
|
|
125
|
+
<td class="px-4 py-2">信息流</td>
|
|
126
|
+
<td class="px-4 py-2">41,200</td>
|
|
127
|
+
<td class="px-4 py-2">980</td>
|
|
128
|
+
</tr>
|
|
129
|
+
</tbody>
|
|
130
|
+
</table>
|
|
131
|
+
</section>
|
|
132
|
+
|
|
133
|
+
<section class="rounded-xl border border-amber-200 bg-amber-50/50 p-4">
|
|
134
|
+
<div class="flex items-center justify-between">
|
|
135
|
+
<h2 class="text-sm font-semibold text-amber-950">指标总览(数据研发清单)</h2>
|
|
136
|
+
<button type="button" class="anno-trigger" data-anno-key="s4m">§4</button>
|
|
137
|
+
</div>
|
|
138
|
+
<p class="mt-1 text-xs text-amber-900">见 PRD §4 全量表;原型仅示意。</p>
|
|
139
|
+
</section>
|
|
140
|
+
|
|
141
|
+
<section class="rounded-lg border border-slate-200 bg-white px-4 py-3 text-sm text-slate-600">
|
|
142
|
+
<button type="button" class="anno-trigger" data-anno-key="s5">PRD §5 交互</button>
|
|
143
|
+
— 全局加载、空态、响应式。
|
|
144
|
+
</section>
|
|
145
|
+
</main>
|
|
146
|
+
|
|
147
|
+
<div id="modalAnno" class="fixed inset-0 z-[70] hidden items-center justify-center bg-slate-900/55 p-4" role="dialog">
|
|
148
|
+
<div class="flex max-h-[88vh] w-full max-w-2xl flex-col overflow-hidden rounded-xl border-2 border-amber-400 bg-white shadow-2xl">
|
|
149
|
+
<div class="flex shrink-0 justify-between border-b border-amber-200 bg-amber-50 px-4 py-2">
|
|
150
|
+
<h3 id="annoDlgTitle" class="truncate text-sm font-semibold"></h3>
|
|
151
|
+
<button type="button" id="btnAnnoClose">✕</button>
|
|
152
|
+
</div>
|
|
153
|
+
<div id="annoDlgBody" class="min-h-0 flex-1 overflow-auto p-4 text-sm" tabindex="-1"></div>
|
|
154
|
+
</div>
|
|
155
|
+
</div>
|
|
156
|
+
|
|
157
|
+
<script src="https://cdn.jsdelivr.net/npm/marked@12.0.2/marked.min.js"></script>
|
|
158
|
+
<script>
|
|
159
|
+
function runPrototype(prdMd, prdLoadError) {
|
|
160
|
+
function $(id) {
|
|
161
|
+
return document.getElementById(id);
|
|
162
|
+
}
|
|
163
|
+
function escapeHtml(s) {
|
|
164
|
+
return String(s)
|
|
165
|
+
.replace(/&/g, '&')
|
|
166
|
+
.replace(/</g, '<')
|
|
167
|
+
.replace(/>/g, '>')
|
|
168
|
+
.replace(/"/g, '"');
|
|
169
|
+
}
|
|
170
|
+
if (typeof marked !== 'undefined' && marked.use) marked.use({ gfm: true, breaks: true });
|
|
171
|
+
var ban = $('prdLoadBanner');
|
|
172
|
+
if (ban && (!prdMd || prdLoadError)) {
|
|
173
|
+
ban.textContent = '未加载 prd.md:请用 HTTP 打开本目录。';
|
|
174
|
+
ban.classList.remove('hidden');
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function sliceBetween(md, startRe, endRe) {
|
|
178
|
+
if (!md) return '';
|
|
179
|
+
var m = md.match(startRe);
|
|
180
|
+
if (!m || m.index === undefined) return '';
|
|
181
|
+
var i0 = m.index;
|
|
182
|
+
if (!endRe) return md.slice(i0).trim();
|
|
183
|
+
var tail = md.slice(i0 + m[0].length);
|
|
184
|
+
var j = tail.search(endRe);
|
|
185
|
+
if (j === -1) return md.slice(i0).trim();
|
|
186
|
+
return md.slice(i0, i0 + m[0].length + j).trim();
|
|
187
|
+
}
|
|
188
|
+
function mdToHtml(src) {
|
|
189
|
+
if (!src) return '<p class="text-xs">(无)</p>';
|
|
190
|
+
if (typeof marked !== 'undefined' && marked.parse)
|
|
191
|
+
return '<div class="prd-md">' + marked.parse(src) + '</div>';
|
|
192
|
+
return '<pre class="text-xs">' + escapeHtml(src) + '</pre>';
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
var LEG = '<p class="text-sm">标注与 <strong>prd.md</strong> 联动。</p>';
|
|
196
|
+
var EX = {
|
|
197
|
+
s1: { start: /^## 1\./m, end: /^## 2\./m, title: 'prd.md §1' },
|
|
198
|
+
s2: { start: /^## 2\./m, end: /^## 3\./m, title: 'prd.md §2' },
|
|
199
|
+
s31: { start: /^### 3\.1/m, end: /^### 3\.2/m, title: 'prd.md §3.1' },
|
|
200
|
+
s32: { start: /^### 3\.2/m, end: /^### 3\.3/m, title: 'prd.md §3.2' },
|
|
201
|
+
s33: { start: /^### 3\.3/m, end: /^### 3\.4/m, title: 'prd.md §3.3' },
|
|
202
|
+
s34: { start: /^### 3\.4/m, end: /^## 4\./m, title: 'prd.md §3.4' },
|
|
203
|
+
s4m: { start: /^## 4\./m, end: /^## 5\./m, title: 'prd.md §4 指标总览' },
|
|
204
|
+
s5: { start: /^## 5\./m, end: /^## 9\./m, title: 'prd.md §5' },
|
|
205
|
+
};
|
|
206
|
+
var FB = {
|
|
207
|
+
s1: { html: '<p class="text-xs">兜底</p>' },
|
|
208
|
+
s2: { html: '<p class="text-xs">兜底</p>' },
|
|
209
|
+
s31: { html: '<p class="text-xs">兜底</p>' },
|
|
210
|
+
s32: { html: '<p class="text-xs">兜底</p>' },
|
|
211
|
+
s33: { html: '<p class="text-xs">兜底</p>' },
|
|
212
|
+
s34: { html: '<p class="text-xs">兜底</p>' },
|
|
213
|
+
s4m: { html: '<p class="text-xs">兜底</p>' },
|
|
214
|
+
s5: { html: '<p class="text-xs">兜底</p>' },
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
function openAnno(key) {
|
|
218
|
+
var w =
|
|
219
|
+
!prdMd || prdLoadError
|
|
220
|
+
? '<div class="mb-2 rounded bg-amber-50 p-2 text-xs">prd 未联动</div>'
|
|
221
|
+
: '';
|
|
222
|
+
if (key === 'legend') {
|
|
223
|
+
$('annoDlgTitle').textContent = '说明 · §9';
|
|
224
|
+
var s9 = prdMd ? sliceBetween(prdMd, /^## 9\./m, /^## 10\./m) : '';
|
|
225
|
+
$('annoDlgBody').innerHTML = w + LEG + (s9 ? '<div class="mt-2">' + mdToHtml(s9) + '</div>' : '');
|
|
226
|
+
show();
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
var sp = EX[key];
|
|
230
|
+
if (!sp) return;
|
|
231
|
+
var sl = prdMd ? sliceBetween(prdMd, sp.start, sp.end) : '';
|
|
232
|
+
$('annoDlgTitle').textContent = sp.title;
|
|
233
|
+
$('annoDlgBody').innerHTML = w + (sl ? mdToHtml(sl) : FB[key].html);
|
|
234
|
+
show();
|
|
235
|
+
}
|
|
236
|
+
function show() {
|
|
237
|
+
$('modalAnno').classList.remove('hidden');
|
|
238
|
+
$('modalAnno').classList.add('flex');
|
|
239
|
+
$('annoDlgBody').scrollTop = 0;
|
|
240
|
+
}
|
|
241
|
+
function closeAnno() {
|
|
242
|
+
$('modalAnno').classList.add('hidden');
|
|
243
|
+
$('modalAnno').classList.remove('flex');
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
document.addEventListener(
|
|
247
|
+
'click',
|
|
248
|
+
function (e) {
|
|
249
|
+
var t = e.target.closest('[data-anno-key]');
|
|
250
|
+
if (!t) return;
|
|
251
|
+
e.preventDefault();
|
|
252
|
+
e.stopPropagation();
|
|
253
|
+
openAnno(t.getAttribute('data-anno-key'));
|
|
254
|
+
},
|
|
255
|
+
true,
|
|
256
|
+
);
|
|
257
|
+
$('btnAnnoClose').addEventListener('click', closeAnno);
|
|
258
|
+
$('modalAnno').addEventListener('click', function (e) {
|
|
259
|
+
if (e.target === $('modalAnno')) closeAnno();
|
|
260
|
+
});
|
|
261
|
+
$('btnAnnoLegend').addEventListener('click', function () {
|
|
262
|
+
openAnno('legend');
|
|
263
|
+
});
|
|
264
|
+
document.addEventListener('keydown', function (e) {
|
|
265
|
+
if (e.key === 'Escape' && !$('modalAnno').classList.contains('hidden')) closeAnno();
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
fetch('prd.md', { cache: 'no-store' })
|
|
269
|
+
.then(function (r) {
|
|
270
|
+
if (!r.ok) throw new Error();
|
|
271
|
+
return r.text();
|
|
272
|
+
})
|
|
273
|
+
.then(function (t) {
|
|
274
|
+
runPrototype(t, null);
|
|
275
|
+
})
|
|
276
|
+
.catch(function () {
|
|
277
|
+
runPrototype('', new Error());
|
|
278
|
+
});
|
|
279
|
+
</script>
|
|
280
|
+
</body>
|
|
281
|
+
</html>
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# 通知模板配置 PRD(产品需求文档)
|
|
2
|
+
|
|
3
|
+
> **文档说明**:本文件位于技能目录 `examples/form-edit/`,对应 **`backend-form-edit-prd-template.md`**(整页表单编辑:字段表、联动、保存/取消)。实际产出写入 `src/prototypes/<page-name>/prd.md`。
|
|
4
|
+
|
|
5
|
+
> **交互原型**:[打开 prototype.html](./prototype.html);标注 **`fetch` 同目录 `prd.md`**;须 **HTTP** 打开。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 引言
|
|
10
|
+
|
|
11
|
+
### 1.1 背景
|
|
12
|
+
|
|
13
|
+
为系统管理员配置站内通知的模板:渠道、标题前缀、默认接收范围等,保存后供业务模块引用。
|
|
14
|
+
|
|
15
|
+
### 1.2 功能清单
|
|
16
|
+
|
|
17
|
+
| 模块 | 功能点 | 功能描述 |
|
|
18
|
+
| ------------ | -------- | ------------------------ |
|
|
19
|
+
| 通知模板配置 | 表单编辑 | 字段录入与校验 |
|
|
20
|
+
| 通知模板配置 | 保存提交 | 校验通过后提交接口 |
|
|
21
|
+
| 通知模板配置 | 取消离开 | 有改动时二次确认 |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 2. 页面菜单与权限规划
|
|
26
|
+
|
|
27
|
+
### 2.1 页面菜单
|
|
28
|
+
|
|
29
|
+
**菜单路径**:系统管理 / 通知模板配置
|
|
30
|
+
|
|
31
|
+
### 2.2 权限规划
|
|
32
|
+
|
|
33
|
+
| 权限点 | 操作范围 | 数据范围 |
|
|
34
|
+
| ------ | ------------ | -------- |
|
|
35
|
+
| 查看 | 进入页、查看表单 | 全量 |
|
|
36
|
+
| 编辑 | 保存、修改字段 | 全量 |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 3. 通知模板表单需求说明
|
|
41
|
+
|
|
42
|
+
### 3.1 表单字段说明
|
|
43
|
+
|
|
44
|
+
| 字段名称 | 字段类型 | 必填 | 默认值 | 校验规则 | 说明 |
|
|
45
|
+
| ---------- | -------- | ---- | ------ | --------------- | -------------- |
|
|
46
|
+
| 模板名称 | 文本 | 是 | 无 | 2~64 | 唯一展示名 |
|
|
47
|
+
| 推送渠道 | 多选 | 是 | 站内信 | 至少选一项 | 站内信/邮件/短信 |
|
|
48
|
+
| 标题前缀 | 文本 | 否 | 无 | 0~32 | 可选 |
|
|
49
|
+
| 接收范围 | 下拉 | 是 | 全部用户 | 枚举 | 全部/按部门 |
|
|
50
|
+
|
|
51
|
+
### 3.2 字段详细说明
|
|
52
|
+
|
|
53
|
+
#### 3.2.1 接收范围
|
|
54
|
+
|
|
55
|
+
- **字段说明**:控制模板默认推送对象范围。
|
|
56
|
+
- **输入限制**:枚举;与组织数据联动时以后端为准。
|
|
57
|
+
- **校验规则**:必选。
|
|
58
|
+
- **错误提示**:请选择接收范围。
|
|
59
|
+
|
|
60
|
+
### 3.3 字段联动逻辑
|
|
61
|
+
|
|
62
|
+
| 触发字段 | 触发条件 | 影响字段 | 影响效果 |
|
|
63
|
+
| -------- | ---------- | -------- | ------------ |
|
|
64
|
+
| 接收范围 | 选择按部门 | 部门选择 | 显示且必填 |
|
|
65
|
+
| 接收范围 | 选择全部用户 | 部门选择 | 隐藏并清空 |
|
|
66
|
+
|
|
67
|
+
### 3.4 操作按钮
|
|
68
|
+
|
|
69
|
+
#### 3.4.1 保存/提交
|
|
70
|
+
|
|
71
|
+
- **按钮位置**:表单底部右侧。
|
|
72
|
+
- **点击逻辑**:前端校验 → 提交 → 成功 Toast → 可选留在本页。
|
|
73
|
+
|
|
74
|
+
#### 3.4.2 取消
|
|
75
|
+
|
|
76
|
+
- **按钮位置**:保存旁。
|
|
77
|
+
- **点击逻辑**:有改动时确认离开;无改动直接返回列表(原型用 Toast 模拟)。
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 4. 交互设计
|
|
82
|
+
|
|
83
|
+
### 4.1 全局交互
|
|
84
|
+
|
|
85
|
+
加载、空态、响应式与组件库规范对齐。
|
|
86
|
+
|
|
87
|
+
### 4.2 表单交互
|
|
88
|
+
|
|
89
|
+
失焦校验、必填星号、Tab 顺序;主按钮主题蓝。
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 9. 原型与 PRD 对应关系
|
|
94
|
+
|
|
95
|
+
| PRD 章节 | prototype.html 演示点 |
|
|
96
|
+
| -------- | ---------------------- |
|
|
97
|
+
| §1 | 页头「PRD §1」 |
|
|
98
|
+
| §3.1~§3.4 | 表单卡片分区标注 + 保存/取消 |
|
|
99
|
+
| §4 | 校验与 Toast 行为 |
|
|
100
|
+
| 走查说明 | 左下角「标注说明」 |
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 10. 修订记录
|
|
105
|
+
|
|
106
|
+
| 版本 | 日期 | 说明 |
|
|
107
|
+
| ---- | ---------- | ---- |
|
|
108
|
+
| v0.1 | 2026-05-14 | 初版:对齐 backend-form-edit 模板示例 |
|