vant-vtk 1.0.1 → 1.0.3

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/README.md ADDED
@@ -0,0 +1,28 @@
1
+ ## 本地测试步骤
2
+
3
+ ### 1. 构建组件库
4
+
5
+ ```bash
6
+ npm run build
7
+ npm run build:lib
8
+ ```
9
+
10
+ ### 2. 创建 npm link(在组件库目录)
11
+
12
+ ```bash
13
+ npm link
14
+ ```
15
+
16
+ ### 3. 在测试项目中链接组件库
17
+
18
+ ```bash
19
+ cd test-demo
20
+ npm link vant-vtk
21
+ npm install
22
+ ```
23
+
24
+ ### 4. 运行测试项目
25
+
26
+ ```bash
27
+ npm run dev
28
+ ```
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- [data-v-54417869] .van-checkbox{margin-bottom:8px;margin-right:12px}
1
+ [data-v-eb64e8a9] .van-checkbox{margin-bottom:8px;margin-right:12px}[data-v-3482e335] .van-radio{margin-right:12px}[data-v-2ccc0da3] .van-uploader__preview-image,[data-v-2ccc0da3] .van-uploader__upload{border-radius:4px}.file-preview-container[data-v-1ad2c749]{display:flex;flex-direction:column;height:100%;background-color:#fff;border-radius:8px;overflow:hidden}.file-header[data-v-1ad2c749]{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #ebedf0;background-color:#f7f8fa}.file-title[data-v-1ad2c749]{font-size:16px;font-weight:600;color:#323233}.file-content[data-v-1ad2c749]{flex:1;overflow:hidden;display:flex;flex-direction:column}.image-preview[data-v-1ad2c749]{flex:1;display:flex;flex-direction:column;overflow:hidden}.preview-image[data-v-1ad2c749]{flex:1;width:100%;height:100%}.image-footer[data-v-1ad2c749]{display:flex;align-items:center;justify-content:center;gap:16px;padding:12px 16px;border-top:1px solid #ebedf0;background-color:#fff}.file-info[data-v-1ad2c749]{font-size:14px;color:#646566;min-width:80px;text-align:center}.pdf-preview[data-v-1ad2c749]{flex:1;display:flex;flex-direction:column;overflow:hidden}.pdf-embed-preview[data-v-1ad2c749]{flex:1;max-width:100%;overflow-y:auto;padding:16px;display:flex;justify-content:center;align-items:flex-start;background-color:#f5f5f5;box-shadow:0 2px 8px #0000001a}.pdf-placeholder[data-v-1ad2c749]{flex:1;display:flex;align-items:center;justify-content:center;color:#969799;font-size:14px}.pdf-footer[data-v-1ad2c749]{display:flex;align-items:center;justify-content:center;gap:16px;padding:12px 16px;border-top:1px solid #ebedf0;background-color:#fff}.page-info[data-v-1ad2c749]{font-size:14px;color:#646566;min-width:80px;text-align:center}.footer[data-v-1ad2c749]{position:fixed;top:40%;width:100%}.footer .van-button[data-v-1ad2c749]:nth-child(2){float:right}
@@ -1,11 +1,13 @@
1
- import { computed as f, resolveComponent as c, openBlock as p, createBlock as y, normalizeProps as _, guardReactiveProps as x, withCtx as d, createVNode as b, createElementBlock as k, Fragment as V, renderList as h, createTextVNode as A, toDisplayString as S } from "vue";
2
- const j = (o, n) => {
3
- const e = o.__vccOpts || o;
4
- for (const [i, u] of n)
5
- e[i] = u;
6
- return e;
7
- }, N = /* @__PURE__ */ Object.assign({
8
- name: "VtkCheckboxField"
1
+ import { computed as $, resolveComponent as V, openBlock as k, createBlock as L, normalizeProps as J, guardReactiveProps as K, withCtx as S, createVNode as x, createElementBlock as P, Fragment as W, renderList as Q, createTextVNode as T, toDisplayString as w, ref as C, watch as z, mergeProps as X, createElementVNode as A, unref as Z, createCommentVNode as O } from "vue";
2
+ import { showLoadingToast as H, closeToast as ee, showToast as M } from "vant";
3
+ import ae from "vue-pdf-embed";
4
+ const q = (n, h) => {
5
+ const r = n.__vccOpts || n;
6
+ for (const [c, m] of h)
7
+ r[c] = m;
8
+ return r;
9
+ }, te = /* @__PURE__ */ Object.assign({
10
+ name: "VtkCheckbox"
9
11
  }, {
10
12
  __name: "index",
11
13
  props: {
@@ -23,7 +25,7 @@ const j = (o, n) => {
23
25
  valueType: {
24
26
  type: String,
25
27
  default: "array",
26
- validator: (o) => ["string", "array", "object"].includes(o)
28
+ validator: (n) => ["string", "array", "object"].includes(n)
27
29
  },
28
30
  // 当 valueType 为 string 时的分隔符
29
31
  separator: {
@@ -32,42 +34,42 @@ const j = (o, n) => {
32
34
  }
33
35
  },
34
36
  emits: ["update:modelValue", "change"],
35
- setup(o, { emit: n }) {
36
- const e = o, i = n, u = f(() => Array.isArray(e.options) ? e.options : typeof e.options == "string" && e.options ? e.options.split("/").filter(Boolean).map((r) => {
37
- const [t, a] = r.split(":");
37
+ setup(n, { emit: h }) {
38
+ const r = n, c = h, m = $(() => Array.isArray(r.options) ? r.options : typeof r.options == "string" && r.options ? r.options.split("/").filter(Boolean).map((t) => {
39
+ const [o, s] = t.split(":");
38
40
  return {
39
- text: a || t,
40
- value: t
41
+ text: s || o,
42
+ value: o
41
43
  };
42
- }) : []), m = f({
44
+ }) : []), i = $({
43
45
  get: () => {
44
- const r = e.modelValue;
45
- if (!r) return [];
46
- let t = [];
47
- return e.valueType === "string" ? t = typeof r == "string" ? r.split(e.separator).filter(Boolean) : [] : e.valueType === "object" ? t = Array.isArray(r) ? r.map((a) => (a == null ? void 0 : a.value) ?? a) : [] : t = Array.isArray(r) ? r : [], t.map(String);
46
+ const t = r.modelValue;
47
+ if (!t) return [];
48
+ let o = [];
49
+ return r.valueType === "string" ? o = typeof t == "string" ? t.split(r.separator).filter(Boolean) : [] : r.valueType === "object" ? o = Array.isArray(t) ? t.map((s) => (s == null ? void 0 : s.value) ?? s) : [] : o = Array.isArray(t) ? t : [], o.map(String);
48
50
  },
49
- set: (r) => {
50
- let t;
51
- e.valueType === "string" ? t = r.join(e.separator) : e.valueType === "object" ? t = u.value.filter((a) => r.includes(String(a.value))) : t = r.map((a) => isNaN(Number(a)) ? a : Array.isArray(e.modelValue) && typeof e.modelValue[0] == "number" ? Number(a) : a), i("update:modelValue", t), i("change", t);
51
+ set: (t) => {
52
+ let o;
53
+ r.valueType === "string" ? o = t.join(r.separator) : r.valueType === "object" ? o = m.value.filter((s) => t.includes(String(s.value))) : o = t.map((s) => isNaN(Number(s)) ? s : Array.isArray(r.modelValue) && typeof r.modelValue[0] == "number" ? Number(s) : s), c("update:modelValue", o), c("change", o);
52
54
  }
53
55
  });
54
- return (r, t) => {
55
- const a = c("van-checkbox"), v = c("van-checkbox-group"), g = c("van-field");
56
- return p(), y(g, _(x(r.$attrs)), {
57
- input: d(() => [
58
- b(v, {
59
- modelValue: m.value,
60
- "onUpdate:modelValue": t[0] || (t[0] = (l) => m.value = l),
56
+ return (t, o) => {
57
+ const s = V("van-checkbox"), y = V("van-checkbox-group"), v = V("van-field");
58
+ return k(), L(v, J(K(t.$attrs)), {
59
+ input: S(() => [
60
+ x(y, {
61
+ modelValue: i.value,
62
+ "onUpdate:modelValue": o[0] || (o[0] = (g) => i.value = g),
61
63
  direction: "horizontal"
62
64
  }, {
63
- default: d(() => [
64
- (p(!0), k(V, null, h(u.value, (l) => (p(), y(a, {
65
- key: String(l.value),
66
- name: String(l.value),
65
+ default: S(() => [
66
+ (k(!0), P(W, null, Q(m.value, (g) => (k(), L(s, {
67
+ key: String(g.value),
68
+ name: String(g.value),
67
69
  shape: "square"
68
70
  }, {
69
- default: d(() => [
70
- A(S(l.text), 1)
71
+ default: S(() => [
72
+ T(w(g.text), 1)
71
73
  ]),
72
74
  _: 2
73
75
  }, 1032, ["name"]))), 128))
@@ -79,25 +81,609 @@ const j = (o, n) => {
79
81
  }, 16);
80
82
  };
81
83
  }
82
- }), s = /* @__PURE__ */ j(N, [["__scopeId", "data-v-54417869"]]);
83
- s.install = (o) => {
84
- o.component(s.name || "VtkCheckboxField", s);
84
+ }), F = /* @__PURE__ */ q(te, [["__scopeId", "data-v-eb64e8a9"]]);
85
+ F.install = (n) => {
86
+ n.component(F.name || "VtkCheckbox", F);
85
87
  };
86
- const T = [
87
- s
88
- ], B = (o) => {
89
- T.forEach((n) => {
90
- n.install ? o.use(n) : n.name && o.component(n.name, n);
88
+ const I = /* @__PURE__ */ Object.assign({
89
+ name: "VtkArea"
90
+ }, {
91
+ __name: "index",
92
+ props: {
93
+ // 绑定值,根据 valueType 返回不同类型
94
+ modelValue: {
95
+ type: [String, Object, Array],
96
+ default: ""
97
+ },
98
+ // 默认地区编码,用于初始化加载
99
+ defaultAreaCode: {
100
+ type: String,
101
+ default: "33"
102
+ },
103
+ // 返回值类型: 'code' 返回最后一级areaCode, 'codes' 返回所有级别areaCode数组, 'object' 返回完整对象信息
104
+ valueType: {
105
+ type: String,
106
+ default: "code",
107
+ validator: (n) => ["code", "codes", "object"].includes(n)
108
+ },
109
+ // 显示分隔符
110
+ separator: {
111
+ type: String,
112
+ default: "/"
113
+ },
114
+ // 弹窗标题
115
+ title: {
116
+ type: String,
117
+ default: "请选择所在地区"
118
+ },
119
+ // 占位文本
120
+ placeholder: {
121
+ type: String,
122
+ default: "请选择所在地区"
123
+ },
124
+ // 最大层级限制,达到该层级后不再加载下级
125
+ maxLevel: {
126
+ type: Number,
127
+ default: 12
128
+ },
129
+ // 显示模式: 'full' 显示完整路径, 'last' 只显示最后一级
130
+ displayMode: {
131
+ type: String,
132
+ default: "full",
133
+ validator: (n) => ["full", "last"].includes(n)
134
+ }
135
+ },
136
+ emits: ["update:modelValue", "change", "finish"],
137
+ setup(n, { expose: h, emit: r }) {
138
+ const c = n, m = r, i = C(!1), t = C(""), o = C([]), s = C(""), y = C(!1), v = C([]), g = {
139
+ text: "areaName",
140
+ value: "areaCode",
141
+ children: "children"
142
+ };
143
+ z(
144
+ () => c.modelValue,
145
+ (a) => {
146
+ a || (s.value = "", t.value = "", v.value = []);
147
+ },
148
+ { immediate: !0 }
149
+ );
150
+ const N = () => {
151
+ i.value = !0, o.value.length === 0 && U();
152
+ }, U = async () => {
153
+ if (!y.value) {
154
+ y.value = !0;
155
+ try {
156
+ const a = c.defaultAreaCode, e = await Request.getForm(`dict/area/show/${a}`);
157
+ if (e.data) {
158
+ const l = {
159
+ areaCode: e.data.areaCode,
160
+ areaName: e.data.areaName,
161
+ areaLeve: e.data.areaLeve,
162
+ children: e.data.areaLeve < c.maxLevel ? [] : void 0
163
+ };
164
+ o.value = [l];
165
+ }
166
+ } catch (a) {
167
+ console.error("加载初始地区失败:", a);
168
+ } finally {
169
+ y.value = !1;
170
+ }
171
+ }
172
+ }, u = async (a) => {
173
+ if (!a._loading) {
174
+ a._loading = !0;
175
+ try {
176
+ const e = await Request.getForm(`dict/area/next/${a.areaCode}`);
177
+ e.data && e.data.length > 0 ? (e.data.forEach((l) => {
178
+ l.areaLeve < c.maxLevel && (l.children = []);
179
+ }), a.children = e.data) : delete a.children;
180
+ } catch (e) {
181
+ console.error("加载下级地区失败:", e);
182
+ } finally {
183
+ a._loading = !1;
184
+ }
185
+ }
186
+ }, d = ({ value: a, selectedOptions: e, tabIndex: l }) => {
187
+ const p = e[l];
188
+ p && p.areaLeve < c.maxLevel && Array.isArray(p.children) && p.children.length === 0 && u(p), m("change", { value: a, selectedOptions: e, tabIndex: l });
189
+ }, f = ({ selectedOptions: a }) => {
190
+ var l, p, j, b, E;
191
+ c.displayMode === "last" ? s.value = ((l = a[a.length - 1]) == null ? void 0 : l.areaName) || "" : s.value = a.map((_) => _.areaName).join(c.separator), v.value = a.map((_) => ({
192
+ areaCode: _.areaCode,
193
+ areaName: _.areaName,
194
+ areaLeve: _.areaLeve
195
+ }));
196
+ let e;
197
+ switch (c.valueType) {
198
+ case "code":
199
+ e = ((p = a[a.length - 1]) == null ? void 0 : p.areaCode) || "";
200
+ break;
201
+ case "codes":
202
+ e = a.map((_) => _.areaCode);
203
+ break;
204
+ case "object":
205
+ e = {
206
+ codes: a.map((_) => _.areaCode),
207
+ names: a.map((_) => _.areaName),
208
+ fullName: a.map((_) => _.areaName).join(c.separator),
209
+ lastCode: ((j = a[a.length - 1]) == null ? void 0 : j.areaCode) || "",
210
+ lastLevel: (b = a[a.length - 1]) == null ? void 0 : b.areaLeve,
211
+ options: v.value
212
+ };
213
+ break;
214
+ default:
215
+ e = ((E = a[a.length - 1]) == null ? void 0 : E.areaCode) || "";
216
+ }
217
+ m("update:modelValue", e), m("finish", { selectedOptions: a, value: e }), i.value = !1;
218
+ };
219
+ return h({
220
+ // 获取当前选中的完整数据
221
+ getSelectedData: () => v.value,
222
+ // 获取显示值
223
+ getDisplayValue: () => s.value,
224
+ // 重置选择
225
+ reset: () => {
226
+ s.value = "", t.value = "", v.value = [], m("update:modelValue", c.valueType === "codes" ? [] : c.valueType === "object" ? null : "");
227
+ },
228
+ // 打开选择器
229
+ open: () => {
230
+ N();
231
+ },
232
+ // 关闭选择器
233
+ close: () => {
234
+ i.value = !1;
235
+ }
236
+ }), (a, e) => {
237
+ const l = V("van-field"), p = V("van-cascader"), j = V("van-popup");
238
+ return k(), P(W, null, [
239
+ x(l, X({
240
+ modelValue: s.value,
241
+ "onUpdate:modelValue": e[0] || (e[0] = (b) => s.value = b),
242
+ "is-link": "",
243
+ readonly: ""
244
+ }, a.$attrs, {
245
+ placeholder: n.placeholder,
246
+ onClick: N
247
+ }), null, 16, ["modelValue", "placeholder"]),
248
+ x(j, {
249
+ show: i.value,
250
+ "onUpdate:show": e[3] || (e[3] = (b) => i.value = b),
251
+ round: "",
252
+ position: "bottom"
253
+ }, {
254
+ default: S(() => [
255
+ x(p, {
256
+ modelValue: t.value,
257
+ "onUpdate:modelValue": e[1] || (e[1] = (b) => t.value = b),
258
+ title: n.title,
259
+ options: o.value,
260
+ "field-names": g,
261
+ onClose: e[2] || (e[2] = (b) => i.value = !1),
262
+ onFinish: f,
263
+ onChange: d
264
+ }, null, 8, ["modelValue", "title", "options"])
265
+ ]),
266
+ _: 1
267
+ }, 8, ["show"])
268
+ ], 64);
269
+ };
270
+ }
271
+ });
272
+ I.install = (n) => {
273
+ n.component(I.name || "VtkArea", I);
274
+ };
275
+ const le = /* @__PURE__ */ Object.assign({
276
+ name: "VtkRadio"
277
+ }, {
278
+ __name: "index",
279
+ props: {
280
+ // 绑定值
281
+ modelValue: {
282
+ type: [String, Number, Object],
283
+ default: ""
284
+ },
285
+ // 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'
286
+ options: {
287
+ type: [Array, String],
288
+ default: () => []
289
+ },
290
+ // 返回值类型: 'string' (基本类型), 'object' (完整对象)
291
+ valueType: {
292
+ type: String,
293
+ default: "string",
294
+ validator: (n) => ["string", "object"].includes(n)
295
+ }
296
+ },
297
+ emits: ["update:modelValue", "change"],
298
+ setup(n, { emit: h }) {
299
+ const r = n, c = h, m = $(() => Array.isArray(r.options) ? r.options : typeof r.options == "string" && r.options ? r.options.split("/").filter(Boolean).map((t) => {
300
+ const [o, s] = t.split(":");
301
+ return {
302
+ text: s || o,
303
+ value: o
304
+ };
305
+ }) : []), i = $({
306
+ get: () => {
307
+ const t = r.modelValue;
308
+ return t == null ? "" : r.valueType === "object" && t && typeof t == "object" ? String(t.value ?? "") : String(t);
309
+ },
310
+ set: (t) => {
311
+ var y;
312
+ let o = t;
313
+ typeof (r.valueType === "object" ? (y = r.modelValue) == null ? void 0 : y.value : r.modelValue) == "number" && !isNaN(Number(t)) && (o = Number(t)), r.valueType === "object" && (o = m.value.find((v) => String(v.value) === String(t)) || null), c("update:modelValue", o), c("change", o);
314
+ }
315
+ });
316
+ return (t, o) => {
317
+ const s = V("van-radio"), y = V("van-radio-group"), v = V("van-field");
318
+ return k(), L(v, J(K(t.$attrs)), {
319
+ input: S(() => [
320
+ x(y, {
321
+ modelValue: i.value,
322
+ "onUpdate:modelValue": o[0] || (o[0] = (g) => i.value = g),
323
+ direction: "horizontal"
324
+ }, {
325
+ default: S(() => [
326
+ (k(!0), P(W, null, Q(m.value, (g) => (k(), L(s, {
327
+ key: String(g.value),
328
+ name: String(g.value)
329
+ }, {
330
+ default: S(() => [
331
+ T(w(g.text), 1)
332
+ ]),
333
+ _: 2
334
+ }, 1032, ["name"]))), 128))
335
+ ]),
336
+ _: 1
337
+ }, 8, ["modelValue"])
338
+ ]),
339
+ _: 1
340
+ }, 16);
341
+ };
342
+ }
343
+ }), R = /* @__PURE__ */ q(le, [["__scopeId", "data-v-3482e335"]]);
344
+ R.install = (n) => {
345
+ n.component(R.name || "VtkRadio", R);
346
+ };
347
+ const ne = /* @__PURE__ */ Object.assign({
348
+ name: "VtkUploader",
349
+ inheritAttrs: !1
350
+ }, {
351
+ __name: "index",
352
+ props: {
353
+ /** 绑定值,支持字符串或数组 */
354
+ modelValue: {
355
+ type: [String, Array],
356
+ default: () => []
357
+ },
358
+ /** 返回值类型:'string' 返回逗号分隔的字符串,'array' 返回数组 */
359
+ valueType: {
360
+ type: String,
361
+ default: "array",
362
+ validator: (n) => ["string", "array"].includes(n)
363
+ },
364
+ /** 单个文件最大大小(字节),默认10MB */
365
+ maxSize: {
366
+ type: Number,
367
+ default: 10 * 1024 * 1024
368
+ },
369
+ /** 接受的文件类型 */
370
+ accept: {
371
+ type: String,
372
+ default: "image/*"
373
+ },
374
+ /** 上传接口地址 */
375
+ uploadUrl: {
376
+ type: String,
377
+ default: "/bizp/admin/upload"
378
+ },
379
+ /** 上传文件的字段名 */
380
+ fieldName: {
381
+ type: String,
382
+ default: "file"
383
+ }
384
+ },
385
+ emits: ["update:modelValue", "change", "success", "error"],
386
+ setup(n, { expose: h, emit: r }) {
387
+ const c = n, m = r, i = C([]), t = (u) => {
388
+ if (!u) return [];
389
+ let d = [];
390
+ return typeof u == "string" ? d = u.split(",").filter((f) => f.trim()) : Array.isArray(u) && (d = u.filter((f) => f)), d.map((f) => ({
391
+ url: f,
392
+ status: "done",
393
+ message: ""
394
+ }));
395
+ }, o = () => i.value.filter((u) => u.status === "done" && u.url).map((u) => u.url), s = (u) => c.valueType === "string" ? u.join(",") : u, y = () => {
396
+ const u = o(), d = s(u);
397
+ m("update:modelValue", d), m("change", d);
398
+ };
399
+ z(
400
+ () => c.modelValue,
401
+ (u) => {
402
+ const d = o().join(","), f = Array.isArray(u) ? u.join(",") : u || "";
403
+ d !== f && (i.value = t(u));
404
+ },
405
+ { immediate: !0 }
406
+ );
407
+ const v = (u) => {
408
+ const d = Array.isArray(u) ? u : [u];
409
+ for (const f of d)
410
+ if (f.size > c.maxSize) {
411
+ const a = (c.maxSize / 1024 / 1024).toFixed(1);
412
+ return M(`文件大小不能超过${a}MB`), !1;
413
+ }
414
+ return !0;
415
+ }, g = async (u) => {
416
+ var f, a, e, l;
417
+ const d = new FormData();
418
+ d.append(c.fieldName, u.file);
419
+ try {
420
+ const p = await Request.imp(c.uploadUrl, d);
421
+ return (f = p.meta) != null && f.success ? { success: !0, url: ((a = p.data) == null ? void 0 : a.url) || ((e = p.data) == null ? void 0 : e.path) || p.data } : { success: !1, message: ((l = p.meta) == null ? void 0 : l.message) || "上传失败" };
422
+ } catch (p) {
423
+ return { success: !1, message: p.message || "上传失败" };
424
+ }
425
+ }, N = async (u) => {
426
+ const d = Array.isArray(u) ? u : [u];
427
+ d.length > 1 && H({
428
+ message: `正在上传 0/${d.length}`,
429
+ forbidClick: !0,
430
+ duration: 0
431
+ });
432
+ let f = 0, a = 0;
433
+ for (let e = 0; e < d.length; e++) {
434
+ const l = d[e];
435
+ l.status = "uploading", l.message = "上传中...", d.length > 1 && H({
436
+ message: `正在上传 ${e + 1}/${d.length}`,
437
+ forbidClick: !0,
438
+ duration: 0
439
+ });
440
+ const p = await g(l);
441
+ p.success ? (l.status = "done", l.message = "", l.url = p.url, f++, m("success", { file: l, url: p.url })) : (l.status = "failed", l.message = p.message, a++, m("error", { file: l, message: p.message }));
442
+ }
443
+ ee(), d.length > 1 ? a === 0 ? M(`${f}个文件上传成功`) : M(`${f}个成功,${a}个失败`) : a > 0 && M(d[0].message || "上传失败"), y();
444
+ }, U = () => {
445
+ setTimeout(() => {
446
+ y();
447
+ }, 0);
448
+ };
449
+ return h({
450
+ /** 获取已上传的URL列表 */
451
+ getUrls: o,
452
+ /** 清空文件列表 */
453
+ clear: () => {
454
+ i.value = [], y();
455
+ },
456
+ /** 获取文件列表 */
457
+ getFileList: () => i.value
458
+ }), (u, d) => {
459
+ const f = V("van-uploader");
460
+ return k(), L(f, X({
461
+ modelValue: i.value,
462
+ "onUpdate:modelValue": d[0] || (d[0] = (a) => i.value = a)
463
+ }, u.$attrs, {
464
+ "max-size": n.maxSize,
465
+ accept: n.accept,
466
+ "before-read": v,
467
+ "after-read": N,
468
+ onDelete: U
469
+ }), null, 16, ["modelValue", "max-size", "accept"]);
470
+ };
471
+ }
472
+ }), D = /* @__PURE__ */ q(ne, [["__scopeId", "data-v-2ccc0da3"]]);
473
+ D.install = (n) => {
474
+ n.component(D.name || "VtkUploader", D);
475
+ };
476
+ const oe = { class: "file-preview-container" }, re = { class: "file-header" }, se = { class: "file-title" }, ue = { class: "file-content" }, ie = {
477
+ key: 0,
478
+ class: "image-preview"
479
+ }, de = { class: "image-footer" }, ce = { class: "file-info" }, pe = {
480
+ key: 1,
481
+ class: "pdf-preview"
482
+ }, me = {
483
+ key: 1,
484
+ class: "pdf-placeholder"
485
+ }, fe = { class: "pdf-footer" }, ve = { class: "page-info" }, ge = { class: "footer" }, ye = /* @__PURE__ */ Object.assign({
486
+ name: "VtkPreview"
487
+ }, {
488
+ __name: "index",
489
+ props: {
490
+ modelValue: {
491
+ type: Boolean,
492
+ default: !1
493
+ },
494
+ files: {
495
+ type: Array,
496
+ default: () => []
497
+ },
498
+ startIndex: {
499
+ type: Number,
500
+ default: 0
501
+ }
502
+ },
503
+ emits: ["update:modelValue", "close"],
504
+ setup(n, { emit: h }) {
505
+ const r = n, c = h, m = C(r.modelValue), i = C(r.startIndex), t = C(1), o = C(null), s = C(0), y = $(() => r.files.map((e, l) => {
506
+ if (typeof e == "string") {
507
+ const p = e.toLowerCase().endsWith(".pdf");
508
+ return {
509
+ name: p ? `文档${l + 1}.pdf` : `图片${l + 1}`,
510
+ url: e,
511
+ type: p ? "pdf" : "image"
512
+ };
513
+ }
514
+ return e;
515
+ })), v = $(() => y.value[i.value] || null), g = $(() => {
516
+ if (!v.value) return null;
517
+ const e = v.value.url || v.value;
518
+ return typeof e == "string" ? e.toLowerCase().endsWith(".pdf") ? "pdf" : "image" : v.value.type || "image";
519
+ });
520
+ z(
521
+ () => r.modelValue,
522
+ (e) => {
523
+ m.value = e, e && y.value.length > 0 && (i.value = r.startIndex, N());
524
+ }
525
+ ), z(
526
+ () => r.startIndex,
527
+ (e) => {
528
+ i.value = e, N();
529
+ }
530
+ ), z(m, (e) => {
531
+ c("update:modelValue", e), e || a();
532
+ }), z(i, () => {
533
+ t.value = 1, s.value = 0, N();
534
+ });
535
+ const N = () => {
536
+ const e = v.value;
537
+ e && (g.value === "pdf" ? o.value = e.url || e : o.value = null);
538
+ }, U = (e) => {
539
+ s.value = e.numPages || 0;
540
+ }, u = () => {
541
+ console.log("PDF rendered successfully");
542
+ }, d = () => {
543
+ i.value > 0 && i.value--;
544
+ }, f = () => {
545
+ i.value < y.value.length - 1 && i.value++;
546
+ }, a = () => {
547
+ m.value = !1, o.value = null, t.value = 1, s.value = 0, c("close");
548
+ };
549
+ return (e, l) => {
550
+ const p = V("van-icon"), j = V("van-image"), b = V("van-button"), E = V("van-popup");
551
+ return k(), L(E, {
552
+ show: m.value,
553
+ "onUpdate:show": l[2] || (l[2] = (_) => m.value = _),
554
+ position: "bottom",
555
+ style: { height: "100vh" }
556
+ }, {
557
+ default: S(() => {
558
+ var _, G;
559
+ return [
560
+ A("div", oe, [
561
+ A("div", re, [
562
+ A("div", se, w(((_ = v.value) == null ? void 0 : _.name) || "文件预览"), 1),
563
+ x(p, {
564
+ name: "cross",
565
+ size: "20",
566
+ onClick: a
567
+ })
568
+ ]),
569
+ A("div", ue, [
570
+ g.value === "image" ? (k(), P("div", ie, [
571
+ x(j, {
572
+ src: (G = v.value) == null ? void 0 : G.url,
573
+ fit: "contain",
574
+ class: "preview-image"
575
+ }, null, 8, ["src"]),
576
+ A("div", de, [
577
+ x(b, {
578
+ size: "small",
579
+ disabled: i.value <= 0,
580
+ onClick: d
581
+ }, {
582
+ default: S(() => [...l[3] || (l[3] = [
583
+ T("上一个", -1)
584
+ ])]),
585
+ _: 1
586
+ }, 8, ["disabled"]),
587
+ A("span", ce, w(i.value + 1) + " / " + w(n.files.length), 1),
588
+ x(b, {
589
+ size: "small",
590
+ disabled: i.value >= n.files.length - 1,
591
+ onClick: f
592
+ }, {
593
+ default: S(() => [...l[4] || (l[4] = [
594
+ T("下一个", -1)
595
+ ])]),
596
+ _: 1
597
+ }, 8, ["disabled"])
598
+ ])
599
+ ])) : g.value === "pdf" ? (k(), P("div", pe, [
600
+ o.value ? (k(), L(Z(ae), {
601
+ key: 0,
602
+ source: o.value,
603
+ page: t.value,
604
+ class: "pdf-embed-preview",
605
+ onRendered: u,
606
+ onLoaded: U
607
+ }, null, 8, ["source", "page"])) : (k(), P("div", me, "请选择PDF文件")),
608
+ A("div", fe, [
609
+ x(b, {
610
+ size: "small",
611
+ disabled: t.value <= 1,
612
+ onClick: l[0] || (l[0] = (Y) => t.value--)
613
+ }, {
614
+ default: S(() => [...l[5] || (l[5] = [
615
+ T("上一页", -1)
616
+ ])]),
617
+ _: 1
618
+ }, 8, ["disabled"]),
619
+ A("span", ve, "第 " + w(t.value) + " / " + w(s.value || "?") + " 页", 1),
620
+ x(b, {
621
+ size: "small",
622
+ disabled: !o.value || t.value >= s.value,
623
+ onClick: l[1] || (l[1] = (Y) => t.value++)
624
+ }, {
625
+ default: S(() => [...l[6] || (l[6] = [
626
+ T("下一页", -1)
627
+ ])]),
628
+ _: 1
629
+ }, 8, ["disabled"])
630
+ ])
631
+ ])) : O("", !0),
632
+ A("div", ge, [
633
+ x(b, {
634
+ disabled: i.value <= 0,
635
+ onClick: d,
636
+ icon: "arrow-left",
637
+ type: "primary",
638
+ round: ""
639
+ }, null, 8, ["disabled"]),
640
+ x(b, {
641
+ disabled: i.value >= n.files.length - 1,
642
+ onClick: f,
643
+ icon: "arrow",
644
+ type: "primary",
645
+ round: ""
646
+ }, null, 8, ["disabled"])
647
+ ])
648
+ ])
649
+ ])
650
+ ];
651
+ }),
652
+ _: 1
653
+ }, 8, ["show"]);
654
+ };
655
+ }
656
+ }), B = /* @__PURE__ */ q(ye, [["__scopeId", "data-v-1ad2c749"]]);
657
+ B.install = (n) => {
658
+ n.component(B.name || "VtkPreview", B);
659
+ };
660
+ const _e = [
661
+ F,
662
+ I,
663
+ R,
664
+ D,
665
+ B
666
+ ], he = (n) => {
667
+ _e.forEach((h) => {
668
+ h.install ? n.use(h) : h.name && n.component(h.name, h);
91
669
  });
92
- }, F = {
93
- install: B,
670
+ }, ke = {
671
+ install: he,
94
672
  // 也导出所有组件,方便直接访问
95
- CheckboxField: s
96
- }, O = "1.0.0";
673
+ Checkbox: F,
674
+ Area: I,
675
+ Radio: R,
676
+ Uploader: D,
677
+ Preview: B
678
+ }, Ce = "1.0.0";
97
679
  export {
98
- s as CheckboxField,
99
- F as default,
100
- B as install,
101
- O as version
680
+ I as Area,
681
+ F as Checkbox,
682
+ B as Preview,
683
+ R as Radio,
684
+ D as Uploader,
685
+ ke as default,
686
+ he as install,
687
+ Ce as version
102
688
  };
103
689
  //# sourceMappingURL=vant-vtk.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vant-vtk.es.js","sources":["../packages/checkbox-field/index.vue","../packages/checkbox-field/index.js","../src/index.js"],"sourcesContent":["<template>\r\n <van-field v-bind=\"$attrs\">\r\n <template #input>\r\n <van-checkbox-group v-model=\"internalValue\" direction=\"horizontal\">\r\n <van-checkbox v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\" shape=\"square\">\r\n {{ item.text }}\r\n </van-checkbox>\r\n </van-checkbox-group>\r\n </template>\r\n </van-field>\r\n</template>\r\n\r\n<script setup>\r\n import { computed } from 'vue'\r\n\r\n defineOptions({\r\n name: 'VtkCheckboxField'\r\n })\r\n\r\n const props = defineProps({\r\n // 绑定值\r\n modelValue: {\r\n type: [String, Array, Object],\r\n default: () => [],\r\n },\r\n // 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n options: {\r\n type: [Array, String],\r\n default: () => [],\r\n },\r\n // 返回值类型: 'string' (逗号分隔), 'array' (值数组), 'object' (对象数组)\r\n valueType: {\r\n type: String,\r\n default: 'array',\r\n validator: (val) => ['string', 'array', 'object'].includes(val),\r\n },\r\n // 当 valueType 为 string 时的分隔符\r\n separator: {\r\n type: String,\r\n default: ',',\r\n },\r\n })\r\n\r\n const emit = defineEmits(['update:modelValue', 'change'])\r\n\r\n // 解析选项\r\n const parsedOptions = computed(() => {\r\n if (Array.isArray(props.options)) {\r\n return props.options\r\n }\r\n if (typeof props.options === 'string' && props.options) {\r\n return props.options\r\n .split('/')\r\n .filter(Boolean)\r\n .map((item) => {\r\n const [value, text] = item.split(':')\r\n return {\r\n text: text || value,\r\n value: value,\r\n }\r\n })\r\n }\r\n return []\r\n })\r\n\r\n // 使用可写计算属性处理 v-model 绑定\r\n const internalValue = computed({\r\n get: () => {\r\n const val = props.modelValue\r\n if (!val) return []\r\n\r\n let arr = []\r\n if (props.valueType === 'string') {\r\n arr = typeof val === 'string' ? val.split(props.separator).filter(Boolean) : []\r\n } else if (props.valueType === 'object') {\r\n arr = Array.isArray(val) ? val.map((item) => item?.value ?? item) : []\r\n } else {\r\n arr = Array.isArray(val) ? val : []\r\n }\r\n // 统一转为字符串,确保与 van-checkbox 的 name 匹配\r\n return arr.map(String)\r\n },\r\n set: (newValues) => {\r\n let emitValue\r\n if (props.valueType === 'string') {\r\n emitValue = newValues.join(props.separator)\r\n } else if (props.valueType === 'object') {\r\n // 从解析后的选项中过滤出完整的对象\r\n emitValue = parsedOptions.value.filter((opt) => newValues.includes(String(opt.value)))\r\n } else {\r\n // 如果原始数据是数字,则尝试转回数字,否则保持字符串\r\n emitValue = newValues.map((val) => {\r\n return isNaN(Number(val)) ? val : Array.isArray(props.modelValue) && typeof props.modelValue[0] === 'number' ? Number(val) : val\r\n })\r\n }\r\n\r\n emit('update:modelValue', emitValue)\r\n emit('change', emitValue)\r\n },\r\n })\r\n</script>\r\n\r\n<style scoped>\r\n :deep(.van-checkbox) {\r\n margin-bottom: 8px;\r\n margin-right: 12px;\r\n }\r\n</style>\r\n","/**\r\n * CheckboxField 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport CheckboxField from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nCheckboxField.install = (app) => {\r\n app.component(CheckboxField.name || 'VtkCheckboxField', CheckboxField)\r\n}\r\n\r\nexport default CheckboxField\r\nexport { CheckboxField }\r\n","/**\r\n * Vant-VTK 组件库全量导出入口\r\n * 支持全量引入和按需引入\r\n */\r\nimport CheckboxField from '../packages/checkbox-field/index.js'\r\n\r\n// 所有组件列表\r\nconst components = [\r\n CheckboxField\r\n]\r\n\r\n// 全量注册方法\r\nconst install = (app) => {\r\n components.forEach(component => {\r\n if (component.install) {\r\n app.use(component)\r\n } else if (component.name) {\r\n app.component(component.name, component)\r\n }\r\n })\r\n}\r\n\r\n// 默认导出 - 支持 app.use(VantVtk) 全量注册\r\nexport default {\r\n install,\r\n // 也导出所有组件,方便直接访问\r\n CheckboxField\r\n}\r\n\r\n// 具名导出 - 支持按需引入\r\nexport {\r\n install,\r\n CheckboxField\r\n}\r\n\r\n// 导出版本号\r\nexport const version = '1.0.0'\r\n"],"names":["props","__props","emit","__emit","parsedOptions","computed","item","value","text","internalValue","val","arr","newValues","emitValue","opt","_openBlock","_createBlock","_component_van_field","$attrs","_createVNode","_component_van_checkbox_group","$event","_createElementBlock","_Fragment","_renderList","_component_van_checkbox","_createTextVNode","_toDisplayString","CheckboxField","app","components","install","component","index","version"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBE,UAAMA,IAAQC,GAwBRC,IAAOC,GAGPC,IAAgBC,EAAS,MACzB,MAAM,QAAQL,EAAM,OAAO,IACtBA,EAAM,UAEX,OAAOA,EAAM,WAAY,YAAYA,EAAM,UACtCA,EAAM,QACV,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,CAACM,MAAS;AACb,YAAM,CAACC,GAAOC,CAAI,IAAIF,EAAK,MAAM,GAAG;AACpC,aAAO;AAAA,QACL,MAAME,KAAQD;AAAA,QACd,OAAOA;AAAA,MACnB;AAAA,IACQ,CAAC,IAEE,CAAA,CACR,GAGKE,IAAgBJ,EAAS;AAAA,MAC7B,KAAK,MAAM;AACT,cAAMK,IAAMV,EAAM;AAClB,YAAI,CAACU,EAAK,QAAO,CAAA;AAEjB,YAAIC,IAAM,CAAA;AACV,eAAIX,EAAM,cAAc,WACtBW,IAAM,OAAOD,KAAQ,WAAWA,EAAI,MAAMV,EAAM,SAAS,EAAE,OAAO,OAAO,IAAI,CAAA,IACpEA,EAAM,cAAc,WAC7BW,IAAM,MAAM,QAAQD,CAAG,IAAIA,EAAI,IAAI,CAACJ,OAASA,KAAA,gBAAAA,EAAM,UAASA,CAAI,IAAI,CAAA,IAEpEK,IAAM,MAAM,QAAQD,CAAG,IAAIA,IAAM,CAAA,GAG5BC,EAAI,IAAI,MAAM;AAAA,MACvB;AAAA,MACA,KAAK,CAACC,MAAc;AAClB,YAAIC;AACJ,QAAIb,EAAM,cAAc,WACtBa,IAAYD,EAAU,KAAKZ,EAAM,SAAS,IACjCA,EAAM,cAAc,WAE7Ba,IAAYT,EAAc,MAAM,OAAO,CAACU,MAAQF,EAAU,SAAS,OAAOE,EAAI,KAAK,CAAC,CAAC,IAGrFD,IAAYD,EAAU,IAAI,CAACF,MAClB,MAAM,OAAOA,CAAG,CAAC,IAAIA,IAAM,MAAM,QAAQV,EAAM,UAAU,KAAK,OAAOA,EAAM,WAAW,CAAC,KAAM,WAAW,OAAOU,CAAG,IAAIA,CAC9H,GAGHR,EAAK,qBAAqBW,CAAS,GACnCX,EAAK,UAAUW,CAAS;AAAA,MAC1B;AAAA,IACJ,CAAG;;;AAlGD,aAAAE,EAAA,GAAAC,EAQYC,OAROC,EAAAA,MAAM,CAAA,GAAA;AAAA,QACZ,SACT,MAIqB;AAAA,UAJrBC,EAIqBC,GAAA;AAAA,wBAJQX,EAAA;AAAA,0DAAAA,EAAa,QAAAY;AAAA,YAAE,WAAU;AAAA;uBACtC,MAA6B;AAAA,sBAA3CC,EAEeC,GAAA,MAAAC,EAFcpB,EAAA,OAAa,CAArBE,YAArBU,EAEeS,GAAA;AAAA,gBAF8B,KAAK,OAAOnB,EAAK,KAAK;AAAA,gBAAI,MAAM,OAAOA,EAAK,KAAK;AAAA,gBAAG,OAAM;AAAA;2BACrG,MAAe;AAAA,kBAAZoB,EAAAC,EAAArB,EAAK,IAAI,GAAA,CAAA;AAAA;;;;;;;;;;;;ACEtBsB,EAAc,UAAU,CAACC,MAAQ;AAC/B,EAAAA,EAAI,UAAUD,EAAc,QAAQ,oBAAoBA,CAAa;AACvE;ACFA,MAAME,IAAa;AAAA,EACjBF;AACF,GAGMG,IAAU,CAACF,MAAQ;AACvB,EAAAC,EAAW,QAAQ,CAAAE,MAAa;AAC9B,IAAIA,EAAU,UACZH,EAAI,IAAIG,CAAS,IACRA,EAAU,QACnBH,EAAI,UAAUG,EAAU,MAAMA,CAAS;AAAA,EAE3C,CAAC;AACH,GAGAC,IAAe;AAAA,EACb,SAAAF;AAAA;AAAA,EAEA,eAAAH;AACF,GASaM,IAAU;"}
1
+ {"version":3,"file":"vant-vtk.es.js","sources":["../packages/checkbox/index.vue","../packages/checkbox/index.js","../packages/Area/index.vue","../packages/Area/index.js","../packages/Radio/index.vue","../packages/Radio/index.js","../packages/Uploader/index.vue","../packages/Uploader/index.js","../packages/preview/index.vue","../packages/preview/index.js","../src/index.js"],"sourcesContent":["<template>\r\n <van-field v-bind=\"$attrs\">\r\n <template #input>\r\n <van-checkbox-group v-model=\"internalValue\" direction=\"horizontal\">\r\n <van-checkbox v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\" shape=\"square\">\r\n {{ item.text }}\r\n </van-checkbox>\r\n </van-checkbox-group>\r\n </template>\r\n </van-field>\r\n</template>\r\n\r\n<script setup>\r\n import { computed } from 'vue'\r\n\r\n defineOptions({\r\n name: 'VtkCheckbox'\r\n })\r\n\r\n const props = defineProps({\r\n // 绑定值\r\n modelValue: {\r\n type: [String, Array, Object],\r\n default: () => [],\r\n },\r\n // 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n options: {\r\n type: [Array, String],\r\n default: () => [],\r\n },\r\n // 返回值类型: 'string' (逗号分隔), 'array' (值数组), 'object' (对象数组)\r\n valueType: {\r\n type: String,\r\n default: 'array',\r\n validator: (val) => ['string', 'array', 'object'].includes(val),\r\n },\r\n // 当 valueType 为 string 时的分隔符\r\n separator: {\r\n type: String,\r\n default: ',',\r\n },\r\n })\r\n\r\n const emit = defineEmits(['update:modelValue', 'change'])\r\n\r\n // 解析选项\r\n const parsedOptions = computed(() => {\r\n if (Array.isArray(props.options)) {\r\n return props.options\r\n }\r\n if (typeof props.options === 'string' && props.options) {\r\n return props.options\r\n .split('/')\r\n .filter(Boolean)\r\n .map((item) => {\r\n const [value, text] = item.split(':')\r\n return {\r\n text: text || value,\r\n value: value,\r\n }\r\n })\r\n }\r\n return []\r\n })\r\n\r\n // 使用可写计算属性处理 v-model 绑定\r\n const internalValue = computed({\r\n get: () => {\r\n const val = props.modelValue\r\n if (!val) return []\r\n\r\n let arr = []\r\n if (props.valueType === 'string') {\r\n arr = typeof val === 'string' ? val.split(props.separator).filter(Boolean) : []\r\n } else if (props.valueType === 'object') {\r\n arr = Array.isArray(val) ? val.map((item) => item?.value ?? item) : []\r\n } else {\r\n arr = Array.isArray(val) ? val : []\r\n }\r\n // 统一转为字符串,确保与 van-checkbox 的 name 匹配\r\n return arr.map(String)\r\n },\r\n set: (newValues) => {\r\n let emitValue\r\n if (props.valueType === 'string') {\r\n emitValue = newValues.join(props.separator)\r\n } else if (props.valueType === 'object') {\r\n // 从解析后的选项中过滤出完整的对象\r\n emitValue = parsedOptions.value.filter((opt) => newValues.includes(String(opt.value)))\r\n } else {\r\n // 如果原始数据是数字,则尝试转回数字,否则保持字符串\r\n emitValue = newValues.map((val) => {\r\n return isNaN(Number(val)) ? val : Array.isArray(props.modelValue) && typeof props.modelValue[0] === 'number' ? Number(val) : val\r\n })\r\n }\r\n\r\n emit('update:modelValue', emitValue)\r\n emit('change', emitValue)\r\n },\r\n })\r\n</script>\r\n\r\n<style scoped>\r\n :deep(.van-checkbox) {\r\n margin-bottom: 8px;\r\n margin-right: 12px;\r\n }\r\n</style>\r\n","/**\r\n * Checkbox 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Checkbox from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nCheckbox.install = (app) => {\r\n app.component(Checkbox.name || 'VtkCheckbox', Checkbox)\r\n}\r\n\r\nexport default Checkbox\r\nexport { Checkbox }\r\n","<template>\r\n\t<van-field v-model=\"displayValue\" is-link readonly v-bind=\"$attrs\" :placeholder=\"placeholder\" @click=\"handleClick\" />\r\n\t<van-popup v-model:show=\"show\" round position=\"bottom\">\r\n\t\t<van-cascader v-model=\"cascaderValue\" :title=\"title\" :options=\"options\" :field-names=\"fieldNames\" @close=\"show = false\" @finish=\"onFinish\" @change=\"onChange\" />\r\n\t</van-popup>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkArea\",\r\n});\r\nimport { ref, watch } from \"vue\";\r\n// import Request from \"@/utils/request\";\r\n\r\nconst props = defineProps({\r\n\t// 绑定值,根据 valueType 返回不同类型\r\n\tmodelValue: {\r\n\t\ttype: [String, Object, Array],\r\n\t\tdefault: \"\",\r\n\t},\r\n\t// 默认地区编码,用于初始化加载\r\n\tdefaultAreaCode: {\r\n\t\ttype: String,\r\n\t\tdefault: \"33\",\r\n\t},\r\n\t// 返回值类型: 'code' 返回最后一级areaCode, 'codes' 返回所有级别areaCode数组, 'object' 返回完整对象信息\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"code\",\r\n\t\tvalidator: (val) => [\"code\", \"codes\", \"object\"].includes(val),\r\n\t},\r\n\t// 显示分隔符\r\n\tseparator: {\r\n\t\ttype: String,\r\n\t\tdefault: \"/\",\r\n\t},\r\n\t// 弹窗标题\r\n\ttitle: {\r\n\t\ttype: String,\r\n\t\tdefault: \"请选择所在地区\",\r\n\t},\r\n\t// 占位文本\r\n\tplaceholder: {\r\n\t\ttype: String,\r\n\t\tdefault: \"请选择所在地区\",\r\n\t},\r\n\t// 最大层级限制,达到该层级后不再加载下级\r\n\tmaxLevel: {\r\n\t\ttype: Number,\r\n\t\tdefault: 12,\r\n\t},\r\n\t// 显示模式: 'full' 显示完整路径, 'last' 只显示最后一级\r\n\tdisplayMode: {\r\n\t\ttype: String,\r\n\t\tdefault: \"full\",\r\n\t\tvalidator: (val) => [\"full\", \"last\"].includes(val),\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\", \"finish\"]);\r\n\r\nconst show = ref(false); //弹窗显示隐藏\r\nconst cascaderValue = ref(\"\"); //级联选择器绑定值\r\nconst options = ref([]); //级联选择器选项\r\nconst displayValue = ref(\"\"); //显示值\r\nconst loading = ref(false); //加载状态\r\n// 存储完整的选中信息\r\nconst selectedData = ref([]);\r\n\r\nconst fieldNames = {\r\n\ttext: \"areaName\",\r\n\tvalue: \"areaCode\",\r\n\tchildren: \"children\",\r\n};\r\n\r\n// 监听 modelValue 变化,用于回显\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(val) => {\r\n\t\tif (!val) {\r\n\t\t\tdisplayValue.value = \"\";\r\n\t\t\tcascaderValue.value = \"\";\r\n\t\t\tselectedData.value = [];\r\n\t\t}\r\n\t},\r\n\t{ immediate: true },\r\n);\r\n\r\nconst handleClick = () => {\r\n\tshow.value = true;\r\n\tif (options.value.length === 0) {\r\n\t\tloadInitialArea();\r\n\t}\r\n};\r\n\r\n// 加载初始地区\r\nconst loadInitialArea = async () => {\r\n\tif (loading.value) return;\r\n\tloading.value = true;\r\n\ttry {\r\n\t\tconst areaCode = props.defaultAreaCode;\r\n\t\tconst res = await Request.getForm(`dict/area/show/${areaCode}`);\r\n\t\tif (res.data) {\r\n\t\t\tconst rootArea = {\r\n\t\t\t\tareaCode: res.data.areaCode,\r\n\t\t\t\tareaName: res.data.areaName,\r\n\t\t\t\tareaLeve: res.data.areaLeve,\r\n\t\t\t\tchildren: res.data.areaLeve < props.maxLevel ? [] : undefined,\r\n\t\t\t};\r\n\t\t\toptions.value = [rootArea];\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error(\"加载初始地区失败:\", error);\r\n\t} finally {\r\n\t\tloading.value = false;\r\n\t}\r\n};\r\n\r\n// 加载下级地区\r\nconst loadChildren = async (item) => {\r\n\tif (item._loading) return;\r\n\titem._loading = true;\r\n\ttry {\r\n\t\tconst res = await Request.getForm(`dict/area/next/${item.areaCode}`);\r\n\t\tif (res.data && res.data.length > 0) {\r\n\t\t\tres.data.forEach((it) => {\r\n\t\t\t\t// 根据 maxLevel 判断是否还有下级\r\n\t\t\t\tif (it.areaLeve < props.maxLevel) {\r\n\t\t\t\t\tit.children = [];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\titem.children = res.data;\r\n\t\t} else {\r\n\t\t\t// 没有下级数据,移除 children 属性使其成为叶子节点\r\n\t\t\tdelete item.children;\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error(\"加载下级地区失败:\", error);\r\n\t} finally {\r\n\t\titem._loading = false;\r\n\t}\r\n};\r\n\r\n// 选项变化时加载下级\r\nconst onChange = ({ value, selectedOptions, tabIndex }) => {\r\n\tconst currentItem = selectedOptions[tabIndex];\r\n\tif (currentItem && currentItem.areaLeve < props.maxLevel && Array.isArray(currentItem.children) && currentItem.children.length === 0) {\r\n\t\tloadChildren(currentItem);\r\n\t}\r\n\temit(\"change\", { value, selectedOptions, tabIndex });\r\n};\r\n\r\n// 完成选择\r\nconst onFinish = ({ selectedOptions }) => {\r\n\t// 根据 displayMode 决定显示值\r\n\tif (props.displayMode === \"last\") {\r\n\t\t// 只显示最后一级\r\n\t\tdisplayValue.value = selectedOptions[selectedOptions.length - 1]?.areaName || \"\";\r\n\t} else {\r\n\t\t// 显示完整路径(默认)\r\n\t\tdisplayValue.value = selectedOptions.map((option) => option.areaName).join(props.separator);\r\n\t}\r\n\r\n\t// 存储完整选中数据\r\n\tselectedData.value = selectedOptions.map((option) => ({\r\n\t\tareaCode: option.areaCode,\r\n\t\tareaName: option.areaName,\r\n\t\tareaLeve: option.areaLeve,\r\n\t}));\r\n\r\n\t// 根据 valueType 返回不同格式的值\r\n\tlet emitValue;\r\n\tswitch (props.valueType) {\r\n\t\tcase \"code\":\r\n\t\t\t// 返回最后一级的 areaCode\r\n\t\t\temitValue = selectedOptions[selectedOptions.length - 1]?.areaCode || \"\";\r\n\t\t\tbreak;\r\n\t\tcase \"codes\":\r\n\t\t\t// 返回所有级别的 areaCode 数组\r\n\t\t\temitValue = selectedOptions.map((option) => option.areaCode);\r\n\t\t\tbreak;\r\n\t\tcase \"object\":\r\n\t\t\t// 返回完整对象信息\r\n\t\t\temitValue = {\r\n\t\t\t\tcodes: selectedOptions.map((option) => option.areaCode),\r\n\t\t\t\tnames: selectedOptions.map((option) => option.areaName),\r\n\t\t\t\tfullName: selectedOptions.map((option) => option.areaName).join(props.separator),\r\n\t\t\t\tlastCode: selectedOptions[selectedOptions.length - 1]?.areaCode || \"\",\r\n\t\t\t\tlastLevel: selectedOptions[selectedOptions.length - 1]?.areaLeve,\r\n\t\t\t\toptions: selectedData.value,\r\n\t\t\t};\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\temitValue = selectedOptions[selectedOptions.length - 1]?.areaCode || \"\";\r\n\t}\r\n\r\n\temit(\"update:modelValue\", emitValue);\r\n\temit(\"finish\", { selectedOptions, value: emitValue });\r\n\tshow.value = false;\r\n};\r\n\r\n// 暴露方法供外部调用\r\ndefineExpose({\r\n\t// 获取当前选中的完整数据\r\n\tgetSelectedData: () => selectedData.value,\r\n\t// 获取显示值\r\n\tgetDisplayValue: () => displayValue.value,\r\n\t// 重置选择\r\n\treset: () => {\r\n\t\tdisplayValue.value = \"\";\r\n\t\tcascaderValue.value = \"\";\r\n\t\tselectedData.value = [];\r\n\t\temit(\"update:modelValue\", props.valueType === \"codes\" ? [] : props.valueType === \"object\" ? null : \"\");\r\n\t},\r\n\t// 打开选择器\r\n\topen: () => {\r\n\t\thandleClick();\r\n\t},\r\n\t// 关闭选择器\r\n\tclose: () => {\r\n\t\tshow.value = false;\r\n\t},\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped></style>\r\n","/**\r\n * Area 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Area from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nArea.install = (app) => {\r\n app.component(Area.name || 'VtkArea', Area)\r\n}\r\n\r\nexport default Area\r\nexport { Area }\r\n","<template>\r\n\t<van-field v-bind=\"$attrs\">\r\n\t\t<template #input>\r\n\t\t\t<van-radio-group v-model=\"internalValue\" direction=\"horizontal\">\r\n\t\t\t\t<van-radio v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\">\r\n\t\t\t\t\t{{ item.text }}\r\n\t\t\t\t</van-radio>\r\n\t\t\t</van-radio-group>\r\n\t\t</template>\r\n\t</van-field>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkRadio\",\r\n});\r\nimport { computed } from \"vue\";\r\n\r\nconst props = defineProps({\r\n\t// 绑定值\r\n\tmodelValue: {\r\n\t\ttype: [String, Number, Object],\r\n\t\tdefault: \"\",\r\n\t},\r\n\t// 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n\toptions: {\r\n\t\ttype: [Array, String],\r\n\t\tdefault: () => [],\r\n\t},\r\n\t// 返回值类型: 'string' (基本类型), 'object' (完整对象)\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"string\",\r\n\t\tvalidator: (val) => [\"string\", \"object\"].includes(val),\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\"]);\r\n\r\n// 解析选项\r\nconst parsedOptions = computed(() => {\r\n\tif (Array.isArray(props.options)) {\r\n\t\treturn props.options;\r\n\t}\r\n\tif (typeof props.options === \"string\" && props.options) {\r\n\t\treturn props.options\r\n\t\t\t.split(\"/\")\r\n\t\t\t.filter(Boolean)\r\n\t\t\t.map((item) => {\r\n\t\t\t\tconst [value, text] = item.split(\":\");\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttext: text || value,\r\n\t\t\t\t\tvalue: value,\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t}\r\n\treturn [];\r\n});\r\n\r\n// 使用可写计算属性处理 v-model 绑定\r\nconst internalValue = computed({\r\n\tget: () => {\r\n\t\tconst val = props.modelValue;\r\n\t\tif (val === undefined || val === null) return \"\";\r\n\r\n\t\t// 如果是对象类型,提取其中的 value\r\n\t\tif (props.valueType === \"object\" && val && typeof val === \"object\") {\r\n\t\t\treturn String(val.value ?? \"\");\r\n\t\t}\r\n\t\treturn String(val);\r\n\t},\r\n\tset: (newValue) => {\r\n\t\tlet emitValue = newValue;\r\n\r\n\t\t// 处理原始数据类型逻辑(如果父组件传入的是数字,尝试转回数字)\r\n\t\tconst originalValue = props.valueType === \"object\" ? props.modelValue?.value : props.modelValue;\r\n\t\tif (typeof originalValue === \"number\" && !isNaN(Number(newValue))) {\r\n\t\t\temitValue = Number(newValue);\r\n\t\t}\r\n\r\n\t\tif (props.valueType === \"object\") {\r\n\t\t\t// 找回完整对象\r\n\t\t\temitValue = parsedOptions.value.find((opt) => String(opt.value) === String(newValue)) || null;\r\n\t\t}\r\n\r\n\t\temit(\"update:modelValue\", emitValue);\r\n\t\temit(\"change\", emitValue);\r\n\t},\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n:deep(.van-radio) {\r\n\tmargin-right: 12px;\r\n}\r\n</style>\r\n","/**\r\n * Radio 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Radio from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nRadio.install = (app) => {\r\n app.component(Radio.name || 'VtkRadio', Radio)\r\n}\r\n\r\nexport default Radio\r\nexport { Radio }\r\n","<template>\r\n\t<van-uploader v-model=\"fileList\" v-bind=\"$attrs\" :max-size=\"maxSize\" :accept=\"accept\" :before-read=\"beforeRead\" :after-read=\"afterRead\" @delete=\"onDelete\" />\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkUploader\",\r\n\tinheritAttrs: false,\r\n});\r\nimport { ref, watch } from \"vue\";\r\nimport { showToast, showLoadingToast, closeToast } from \"vant\";\r\n\r\nconst props = defineProps({\r\n\t/** 绑定值,支持字符串或数组 */\r\n\tmodelValue: {\r\n\t\ttype: [String, Array],\r\n\t\tdefault: () => [],\r\n\t},\r\n\t/** 返回值类型:'string' 返回逗号分隔的字符串,'array' 返回数组 */\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"array\",\r\n\t\tvalidator: (val) => [\"string\", \"array\"].includes(val),\r\n\t},\r\n\t/** 单个文件最大大小(字节),默认10MB */\r\n\tmaxSize: {\r\n\t\ttype: Number,\r\n\t\tdefault: 10 * 1024 * 1024,\r\n\t},\r\n\t/** 接受的文件类型 */\r\n\taccept: {\r\n\t\ttype: String,\r\n\t\tdefault: \"image/*\",\r\n\t},\r\n\t/** 上传接口地址 */\r\n\tuploadUrl: {\r\n\t\ttype: String,\r\n\t\tdefault: \"/bizp/admin/upload\",\r\n\t},\r\n\t/** 上传文件的字段名 */\r\n\tfieldName: {\r\n\t\ttype: String,\r\n\t\tdefault: \"file\",\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\", \"success\", \"error\"]);\r\n\r\n// 文件列表\r\nconst fileList = ref([]);\r\n\r\n// 解析初始值\r\nconst parseModelValue = (value) => {\r\n\tif (!value) return [];\r\n\r\n\tlet urls = [];\r\n\tif (typeof value === \"string\") {\r\n\t\turls = value.split(\",\").filter((url) => url.trim());\r\n\t} else if (Array.isArray(value)) {\r\n\t\turls = value.filter((url) => url);\r\n\t}\r\n\r\n\treturn urls.map((url) => ({\r\n\t\turl,\r\n\t\tstatus: \"done\",\r\n\t\tmessage: \"\",\r\n\t}));\r\n};\r\n\r\n// 获取已上传的URL列表\r\nconst getUploadedUrls = () => {\r\n\treturn fileList.value.filter((file) => file.status === \"done\" && file.url).map((file) => file.url);\r\n};\r\n\r\n// 格式化输出值\r\nconst formatOutput = (urls) => {\r\n\tif (props.valueType === \"string\") {\r\n\t\treturn urls.join(\",\");\r\n\t}\r\n\treturn urls;\r\n};\r\n\r\n// 触发更新\r\nconst emitValue = () => {\r\n\tconst urls = getUploadedUrls();\r\n\tconst output = formatOutput(urls);\r\n\temit(\"update:modelValue\", output);\r\n\temit(\"change\", output);\r\n};\r\n\r\n// 监听外部值变化\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(newVal) => {\r\n\t\tconst currentUrls = getUploadedUrls().join(\",\");\r\n\t\tconst newUrls = Array.isArray(newVal) ? newVal.join(\",\") : newVal || \"\";\r\n\r\n\t\t// 只有外部值确实改变时才更新\r\n\t\tif (currentUrls !== newUrls) {\r\n\t\t\tfileList.value = parseModelValue(newVal);\r\n\t\t}\r\n\t},\r\n\t{ immediate: true },\r\n);\r\n\r\n// 上传前校验\r\nconst beforeRead = (file) => {\r\n\tconst files = Array.isArray(file) ? file : [file];\r\n\r\n\tfor (const f of files) {\r\n\t\t// 文件大小校验\r\n\t\tif (f.size > props.maxSize) {\r\n\t\t\tconst maxSizeMB = (props.maxSize / 1024 / 1024).toFixed(1);\r\n\t\t\tshowToast(`文件大小不能超过${maxSizeMB}MB`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\treturn true;\r\n};\r\n\r\n// 上传文件\r\nconst uploadFile = async (file) => {\r\n\tconst formData = new FormData();\r\n\tformData.append(props.fieldName, file.file);\r\n\r\n\ttry {\r\n\t\tconst res = await Request.imp(props.uploadUrl, formData);\r\n\r\n\t\tif (res.meta?.success) {\r\n\t\t\t// 根据实际接口返回格式获取URL\r\n\t\t\tconst url = res.data?.url || res.data?.path || res.data;\r\n\t\t\treturn { success: true, url };\r\n\t\t} else {\r\n\t\t\treturn { success: false, message: res.meta?.message || \"上传失败\" };\r\n\t\t}\r\n\t} catch (error) {\r\n\t\treturn { success: false, message: error.message || \"上传失败\" };\r\n\t}\r\n};\r\n\r\n// 文件读取完成后处理\r\nconst afterRead = async (file) => {\r\n\tconst files = Array.isArray(file) ? file : [file];\r\n\r\n\t// 显示上传中提示\r\n\tif (files.length > 1) {\r\n\t\tshowLoadingToast({\r\n\t\t\tmessage: `正在上传 0/${files.length}`,\r\n\t\t\tforbidClick: true,\r\n\t\t\tduration: 0,\r\n\t\t});\r\n\t}\r\n\r\n\tlet successCount = 0;\r\n\tlet failCount = 0;\r\n\r\n\t// 逐个上传\r\n\tfor (let i = 0; i < files.length; i++) {\r\n\t\tconst fileItem = files[i];\r\n\t\tfileItem.status = \"uploading\";\r\n\t\tfileItem.message = \"上传中...\";\r\n\r\n\t\t// 更新进度提示\r\n\t\tif (files.length > 1) {\r\n\t\t\tshowLoadingToast({\r\n\t\t\t\tmessage: `正在上传 ${i + 1}/${files.length}`,\r\n\t\t\t\tforbidClick: true,\r\n\t\t\t\tduration: 0,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst result = await uploadFile(fileItem);\r\n\r\n\t\tif (result.success) {\r\n\t\t\tfileItem.status = \"done\";\r\n\t\t\tfileItem.message = \"\";\r\n\t\t\tfileItem.url = result.url;\r\n\t\t\tsuccessCount++;\r\n\t\t\temit(\"success\", { file: fileItem, url: result.url });\r\n\t\t} else {\r\n\t\t\tfileItem.status = \"failed\";\r\n\t\t\tfileItem.message = result.message;\r\n\t\t\tfailCount++;\r\n\t\t\temit(\"error\", { file: fileItem, message: result.message });\r\n\t\t}\r\n\t}\r\n\r\n\tcloseToast();\r\n\r\n\t// 显示上传结果\r\n\tif (files.length > 1) {\r\n\t\tif (failCount === 0) {\r\n\t\t\tshowToast(`${successCount}个文件上传成功`);\r\n\t\t} else {\r\n\t\t\tshowToast(`${successCount}个成功,${failCount}个失败`);\r\n\t\t}\r\n\t} else if (failCount > 0) {\r\n\t\tshowToast(files[0].message || \"上传失败\");\r\n\t}\r\n\r\n\t// 触发值更新\r\n\temitValue();\r\n};\r\n\r\n// 删除文件\r\nconst onDelete = () => {\r\n\t// 下一个tick再触发,确保fileList已更新\r\n\tsetTimeout(() => {\r\n\t\temitValue();\r\n\t}, 0);\r\n};\r\n\r\n// 暴露方法给父组件\r\ndefineExpose({\r\n\t/** 获取已上传的URL列表 */\r\n\tgetUrls: getUploadedUrls,\r\n\t/** 清空文件列表 */\r\n\tclear: () => {\r\n\t\tfileList.value = [];\r\n\t\temitValue();\r\n\t},\r\n\t/** 获取文件列表 */\r\n\tgetFileList: () => fileList.value,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n:deep(.van-uploader__preview-image) {\r\n\tborder-radius: 4px;\r\n}\r\n\r\n:deep(.van-uploader__upload) {\r\n\tborder-radius: 4px;\r\n}\r\n</style>\r\n","/**\r\n * Uploader 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Uploader from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nUploader.install = (app) => {\r\n app.component(Uploader.name || 'VtkUploader', Uploader)\r\n}\r\n\r\nexport default Uploader\r\nexport { Uploader }\r\n","<template>\r\n\t<van-popup v-model:show=\"showPopup\" position=\"bottom\" :style=\"{ height: '100vh' }\">\r\n\t\t<div class=\"file-preview-container\">\r\n\t\t\t<div class=\"file-header\">\r\n\t\t\t\t<div class=\"file-title\">{{ currentFile?.name || \"文件预览\" }}</div>\r\n\t\t\t\t<van-icon name=\"cross\" size=\"20\" @click=\"handleClose\" />\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class=\"file-content\">\r\n\t\t\t\t<div v-if=\"currentType === 'image'\" class=\"image-preview\">\r\n\t\t\t\t\t<van-image :src=\"currentFile?.url\" fit=\"contain\" class=\"preview-image\" />\r\n\t\t\t\t\t<div class=\"image-footer\">\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentIndex <= 0\" @click=\"prevFile\">上一个</van-button>\r\n\t\t\t\t\t\t<span class=\"file-info\">{{ currentIndex + 1 }} / {{ files.length }}</span>\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\">下一个</van-button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div v-else-if=\"currentType === 'pdf'\" class=\"pdf-preview\">\r\n\t\t\t\t\t<VuePdfEmbed v-if=\"pdfSource\" :source=\"pdfSource\" :page=\"currentPage\" class=\"pdf-embed-preview\" @rendered=\"handlePdfRendered\" @loaded=\"handlePdfLoaded\" />\r\n\t\t\t\t\t<div v-else class=\"pdf-placeholder\">请选择PDF文件</div>\r\n\t\t\t\t\t<div class=\"pdf-footer\">\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentPage <= 1\" @click=\"currentPage--\">上一页</van-button>\r\n\t\t\t\t\t\t<span class=\"page-info\">第 {{ currentPage }} / {{ totalPages || \"?\" }} 页</span>\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"!pdfSource || currentPage >= totalPages\" @click=\"currentPage++\">下一页</van-button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div class=\"footer\">\r\n\t\t\t\t\t<van-button :disabled=\"currentIndex <= 0\" @click=\"prevFile\" icon=\"arrow-left\" type=\"primary\" round />\r\n\t\t\t\t\t<van-button :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\" icon=\"arrow\" type=\"primary\" round />\r\n\t\t\t\t\t<!-- <van-button size=\"small\" :disabled=\"currentIndex <= 0\" @click=\"prevFile\">上一个</van-button>\r\n <span class=\"file-info\">{{ currentIndex + 1 }} / {{ files.length }}</span>\r\n <van-button size=\"small\" :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\">下一个</van-button> -->\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</van-popup>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkPreview\",\r\n});\r\nimport { ref, watch, computed } from \"vue\";\r\nimport VuePdfEmbed from \"vue-pdf-embed\";\r\n\r\nconst props = defineProps({\r\n\tmodelValue: {\r\n\t\ttype: Boolean,\r\n\t\tdefault: false,\r\n\t},\r\n\tfiles: {\r\n\t\ttype: Array,\r\n\t\tdefault: () => [],\r\n\t},\r\n\tstartIndex: {\r\n\t\ttype: Number,\r\n\t\tdefault: 0,\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"close\"]);\r\n\r\nconst showPopup = ref(props.modelValue);\r\nconst currentIndex = ref(props.startIndex);\r\nconst currentPage = ref(1);\r\nconst pdfSource = ref(null);\r\nconst totalPages = ref(0);\r\n\r\nconst normalizedFiles = computed(() => {\r\n\treturn props.files.map((file, index) => {\r\n\t\tif (typeof file === \"string\") {\r\n\t\t\tconst isPdf = file.toLowerCase().endsWith(\".pdf\");\r\n\t\t\treturn {\r\n\t\t\t\tname: isPdf ? `文档${index + 1}.pdf` : `图片${index + 1}`,\r\n\t\t\t\turl: file,\r\n\t\t\t\ttype: isPdf ? \"pdf\" : \"image\",\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn file;\r\n\t});\r\n});\r\n\r\nconst currentFile = computed(() => {\r\n\treturn normalizedFiles.value[currentIndex.value] || null;\r\n});\r\n\r\nconst currentType = computed(() => {\r\n\tif (!currentFile.value) return null;\r\n\tconst url = currentFile.value.url || currentFile.value;\r\n\tif (typeof url === \"string\") {\r\n\t\treturn url.toLowerCase().endsWith(\".pdf\") ? \"pdf\" : \"image\";\r\n\t}\r\n\treturn currentFile.value.type || \"image\";\r\n});\r\n\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(val) => {\r\n\t\tshowPopup.value = val;\r\n\t\tif (val && normalizedFiles.value.length > 0) {\r\n\t\t\tcurrentIndex.value = props.startIndex;\r\n\t\t\tupdatePreview();\r\n\t\t}\r\n\t},\r\n);\r\n\r\nwatch(\r\n\t() => props.startIndex,\r\n\t(val) => {\r\n\t\tcurrentIndex.value = val;\r\n\t\tupdatePreview();\r\n\t},\r\n);\r\n\r\nwatch(showPopup, (val) => {\r\n\temit(\"update:modelValue\", val);\r\n\tif (!val) {\r\n\t\thandleClose();\r\n\t}\r\n});\r\n\r\nwatch(currentIndex, () => {\r\n\tcurrentPage.value = 1;\r\n\ttotalPages.value = 0;\r\n\tupdatePreview();\r\n});\r\n\r\nconst updatePreview = () => {\r\n\tconst file = currentFile.value;\r\n\tif (!file) return;\r\n\r\n\tif (currentType.value === \"pdf\") {\r\n\t\tpdfSource.value = file.url || file;\r\n\t} else {\r\n\t\tpdfSource.value = null;\r\n\t}\r\n};\r\n\r\nconst handlePdfLoaded = (pdf) => {\r\n\ttotalPages.value = pdf.numPages || 0;\r\n};\r\n\r\nconst handlePdfRendered = () => {\r\n\tconsole.log(\"PDF rendered successfully\");\r\n};\r\n\r\nconst prevFile = () => {\r\n\tif (currentIndex.value > 0) {\r\n\t\tcurrentIndex.value--;\r\n\t}\r\n};\r\n\r\nconst nextFile = () => {\r\n\tif (currentIndex.value < normalizedFiles.value.length - 1) {\r\n\t\tcurrentIndex.value++;\r\n\t}\r\n};\r\n\r\nconst handleClose = () => {\r\n\tshowPopup.value = false;\r\n\tpdfSource.value = null;\r\n\tcurrentPage.value = 1;\r\n\ttotalPages.value = 0;\r\n\temit(\"close\");\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.file-preview-container {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\theight: 100%;\r\n\tbackground-color: #fff;\r\n\tborder-radius: 8px;\r\n\toverflow: hidden;\r\n}\r\n\r\n.file-header {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n\tpadding: 12px 16px;\r\n\tborder-bottom: 1px solid #ebedf0;\r\n\tbackground-color: #f7f8fa;\r\n}\r\n\r\n.file-title {\r\n\tfont-size: 16px;\r\n\tfont-weight: 600;\r\n\tcolor: #323233;\r\n}\r\n\r\n.file-content {\r\n\tflex: 1;\r\n\toverflow: hidden;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n}\r\n\r\n.image-preview {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\toverflow: hidden;\r\n}\r\n\r\n.preview-image {\r\n\tflex: 1;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n}\r\n\r\n.image-footer {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tgap: 16px;\r\n\tpadding: 12px 16px;\r\n\tborder-top: 1px solid #ebedf0;\r\n\tbackground-color: #fff;\r\n}\r\n\r\n.file-info {\r\n\tfont-size: 14px;\r\n\tcolor: #646566;\r\n\tmin-width: 80px;\r\n\ttext-align: center;\r\n}\r\n\r\n.pdf-preview {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\toverflow: hidden;\r\n}\r\n\r\n.pdf-embed-preview {\r\n\tflex: 1;\r\n\tmax-width: 100%;\r\n\toverflow-y: auto;\r\n\tpadding: 16px;\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\talign-items: flex-start;\r\n\tbackground-color: #f5f5f5;\r\n\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.pdf-placeholder {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tcolor: #969799;\r\n\tfont-size: 14px;\r\n}\r\n\r\n.pdf-footer {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tgap: 16px;\r\n\tpadding: 12px 16px;\r\n\tborder-top: 1px solid #ebedf0;\r\n\tbackground-color: #fff;\r\n}\r\n\r\n.page-info {\r\n\tfont-size: 14px;\r\n\tcolor: #646566;\r\n\tmin-width: 80px;\r\n\ttext-align: center;\r\n}\r\n.footer {\r\n\tposition: fixed;\r\n\ttop: 40%;\r\n\twidth: 100%;\r\n\t.van-button {\r\n\t}\r\n\t.van-button:nth-child(2) {\r\n\t\tfloat: right;\r\n\t}\r\n}\r\n</style>\r\n","/**\r\n * Preview 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Preview from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nPreview.install = (app) => {\r\n app.component(Preview.name || 'VtkPreview', Preview)\r\n}\r\n\r\nexport default Preview\r\nexport { Preview }\r\n","/**\r\n * Vant-VTK 组件库全量导出入口\r\n * 支持全量引入和按需引入\r\n */\r\nimport Checkbox from '../packages/checkbox/index.js'\r\nimport Area from '../packages/Area/index.js'\r\nimport Radio from '../packages/radio/index.js'\r\nimport Uploader from '../packages/Uploader/index.js'\r\nimport Preview from '../packages/preview/index.js'\r\n\r\n\r\n\r\n// 所有组件列表\r\nconst components = [\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n]\r\n\r\n// 全量注册方法\r\nconst install = (app) => {\r\n components.forEach(component => {\r\n if (component.install) {\r\n app.use(component)\r\n } else if (component.name) {\r\n app.component(component.name, component)\r\n }\r\n })\r\n}\r\n\r\n// 默认导出 - 支持 app.use(VantVtk) 全量注册\r\nexport default {\r\n install,\r\n // 也导出所有组件,方便直接访问\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n}\r\n\r\n// 具名导出 - 支持按需引入\r\nexport {\r\n install,\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n}\r\n\r\n// 导出版本号\r\nexport const version = '1.0.0'\r\n"],"names":["props","__props","emit","__emit","parsedOptions","computed","item","value","text","internalValue","val","arr","newValues","emitValue","opt","_openBlock","_createBlock","_component_van_field","$attrs","_createVNode","_component_van_checkbox_group","$event","_createElementBlock","_Fragment","_renderList","_component_van_checkbox","_createTextVNode","_toDisplayString","Checkbox","app","show","ref","cascaderValue","options","displayValue","loading","selectedData","fieldNames","watch","handleClick","loadInitialArea","areaCode","res","rootArea","error","loadChildren","it","onChange","selectedOptions","tabIndex","currentItem","onFinish","_a","option","_b","_c","_d","_e","__expose","_mergeProps","_component_van_popup","_component_van_cascader","Area","newValue","_component_van_radio_group","_component_van_radio","Radio","fileList","parseModelValue","urls","url","getUploadedUrls","file","formatOutput","output","newVal","currentUrls","newUrls","beforeRead","files","maxSizeMB","showToast","uploadFile","formData","afterRead","showLoadingToast","successCount","failCount","i","fileItem","result","closeToast","onDelete","_component_van_uploader","Uploader","showPopup","currentIndex","currentPage","pdfSource","totalPages","normalizedFiles","index","isPdf","currentFile","currentType","updatePreview","handleClose","handlePdfLoaded","pdf","handlePdfRendered","prevFile","nextFile","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","_component_van_icon","_hoisted_4","_hoisted_5","_component_van_image","_hoisted_6","_component_van_button","_cache","_hoisted_7","_hoisted_8","_unref","VuePdfEmbed","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","Preview","components","install","component","version"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- (function(l,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(l=typeof globalThis<"u"?globalThis:l||self,e(l.VantVtk={},l.Vue))})(this,function(l,e){"use strict";const s=((a,i)=>{const t=a.__vccOpts||a;for(const[p,u]of i)t[p]=u;return t})(Object.assign({name:"VtkCheckboxField"},{__name:"index",props:{modelValue:{type:[String,Array,Object],default:()=>[]},options:{type:[Array,String],default:()=>[]},valueType:{type:String,default:"array",validator:a=>["string","array","object"].includes(a)},separator:{type:String,default:","}},emits:["update:modelValue","change"],setup(a,{emit:i}){const t=a,p=i,u=e.computed(()=>Array.isArray(t.options)?t.options:typeof t.options=="string"&&t.options?t.options.split("/").filter(Boolean).map(o=>{const[n,r]=o.split(":");return{text:r||n,value:n}}):[]),f=e.computed({get:()=>{const o=t.modelValue;if(!o)return[];let n=[];return t.valueType==="string"?n=typeof o=="string"?o.split(t.separator).filter(Boolean):[]:t.valueType==="object"?n=Array.isArray(o)?o.map(r=>(r==null?void 0:r.value)??r):[]:n=Array.isArray(o)?o:[],n.map(String)},set:o=>{let n;t.valueType==="string"?n=o.join(t.separator):t.valueType==="object"?n=u.value.filter(r=>o.includes(String(r.value))):n=o.map(r=>isNaN(Number(r))?r:Array.isArray(t.modelValue)&&typeof t.modelValue[0]=="number"?Number(r):r),p("update:modelValue",n),p("change",n)}});return(o,n)=>{const r=e.resolveComponent("van-checkbox"),g=e.resolveComponent("van-checkbox-group"),k=e.resolveComponent("van-field");return e.openBlock(),e.createBlock(k,e.normalizeProps(e.guardReactiveProps(o.$attrs)),{input:e.withCtx(()=>[e.createVNode(g,{modelValue:f.value,"onUpdate:modelValue":n[0]||(n[0]=c=>f.value=c),direction:"horizontal"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,c=>(e.openBlock(),e.createBlock(r,{key:String(c.value),name:String(c.value),shape:"square"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.text),1)]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"])]),_:1},16)}}}),[["__scopeId","data-v-54417869"]]);s.install=a=>{a.component(s.name||"VtkCheckboxField",s)};const m=[s],d=a=>{m.forEach(i=>{i.install?a.use(i):i.name&&a.component(i.name,i)})},y={install:d,CheckboxField:s},_="1.0.0";l.CheckboxField=s,l.default=y,l.install=d,l.version=_,Object.defineProperties(l,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ (function(k,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("vant"),require("vue-pdf-embed")):typeof define=="function"&&define.amd?define(["exports","vue","vant","vue-pdf-embed"],e):(k=typeof globalThis<"u"?globalThis:k||self,e(k.VantVtk={},k.Vue,k.vant,k.VuePdfEmbed))})(this,function(k,e,x,E){"use strict";const $=(n,_)=>{const s=n.__vccOpts||n;for(const[p,f]of _)s[p]=f;return s},w=$(Object.assign({name:"VtkCheckbox"},{__name:"index",props:{modelValue:{type:[String,Array,Object],default:()=>[]},options:{type:[Array,String],default:()=>[]},valueType:{type:String,default:"array",validator:n=>["string","array","object"].includes(n)},separator:{type:String,default:","}},emits:["update:modelValue","change"],setup(n,{emit:_}){const s=n,p=_,f=e.computed(()=>Array.isArray(s.options)?s.options:typeof s.options=="string"&&s.options?s.options.split("/").filter(Boolean).map(o=>{const[r,i]=o.split(":");return{text:i||r,value:r}}):[]),c=e.computed({get:()=>{const o=s.modelValue;if(!o)return[];let r=[];return s.valueType==="string"?r=typeof o=="string"?o.split(s.separator).filter(Boolean):[]:s.valueType==="object"?r=Array.isArray(o)?o.map(i=>(i==null?void 0:i.value)??i):[]:r=Array.isArray(o)?o:[],r.map(String)},set:o=>{let r;s.valueType==="string"?r=o.join(s.separator):s.valueType==="object"?r=f.value.filter(i=>o.includes(String(i.value))):r=o.map(i=>isNaN(Number(i))?i:Array.isArray(s.modelValue)&&typeof s.modelValue[0]=="number"?Number(i):i),p("update:modelValue",r),p("change",r)}});return(o,r)=>{const i=e.resolveComponent("van-checkbox"),V=e.resolveComponent("van-checkbox-group"),y=e.resolveComponent("van-field");return e.openBlock(),e.createBlock(y,e.normalizeProps(e.guardReactiveProps(o.$attrs)),{input:e.withCtx(()=>[e.createVNode(V,{modelValue:c.value,"onUpdate:modelValue":r[0]||(r[0]=h=>c.value=h),direction:"horizontal"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value,h=>(e.openBlock(),e.createBlock(i,{key:String(h.value),name:String(h.value),shape:"square"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.text),1)]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"])]),_:1},16)}}}),[["__scopeId","data-v-eb64e8a9"]]);w.install=n=>{n.component(w.name||"VtkCheckbox",w)};const S=Object.assign({name:"VtkArea"},{__name:"index",props:{modelValue:{type:[String,Object,Array],default:""},defaultAreaCode:{type:String,default:"33"},valueType:{type:String,default:"code",validator:n=>["code","codes","object"].includes(n)},separator:{type:String,default:"/"},title:{type:String,default:"请选择所在地区"},placeholder:{type:String,default:"请选择所在地区"},maxLevel:{type:Number,default:12},displayMode:{type:String,default:"full",validator:n=>["full","last"].includes(n)}},emits:["update:modelValue","change","finish"],setup(n,{expose:_,emit:s}){const p=n,f=s,c=e.ref(!1),o=e.ref(""),r=e.ref([]),i=e.ref(""),V=e.ref(!1),y=e.ref([]),h={text:"areaName",value:"areaCode",children:"children"};e.watch(()=>p.modelValue,t=>{t||(i.value="",o.value="",y.value=[])},{immediate:!0});const b=()=>{c.value=!0,r.value.length===0&&j()},j=async()=>{if(!V.value){V.value=!0;try{const t=p.defaultAreaCode,a=await Request.getForm(`dict/area/show/${t}`);if(a.data){const l={areaCode:a.data.areaCode,areaName:a.data.areaName,areaLeve:a.data.areaLeve,children:a.data.areaLeve<p.maxLevel?[]:void 0};r.value=[l]}}catch(t){console.error("加载初始地区失败:",t)}finally{V.value=!1}}},d=async t=>{if(!t._loading){t._loading=!0;try{const a=await Request.getForm(`dict/area/next/${t.areaCode}`);a.data&&a.data.length>0?(a.data.forEach(l=>{l.areaLeve<p.maxLevel&&(l.children=[])}),t.children=a.data):delete t.children}catch(a){console.error("加载下级地区失败:",a)}finally{t._loading=!1}}},u=({value:t,selectedOptions:a,tabIndex:l})=>{const m=a[l];m&&m.areaLeve<p.maxLevel&&Array.isArray(m.children)&&m.children.length===0&&d(m),f("change",{value:t,selectedOptions:a,tabIndex:l})},g=({selectedOptions:t})=>{var l,m,N,C,L;p.displayMode==="last"?i.value=((l=t[t.length-1])==null?void 0:l.areaName)||"":i.value=t.map(v=>v.areaName).join(p.separator),y.value=t.map(v=>({areaCode:v.areaCode,areaName:v.areaName,areaLeve:v.areaLeve}));let a;switch(p.valueType){case"code":a=((m=t[t.length-1])==null?void 0:m.areaCode)||"";break;case"codes":a=t.map(v=>v.areaCode);break;case"object":a={codes:t.map(v=>v.areaCode),names:t.map(v=>v.areaName),fullName:t.map(v=>v.areaName).join(p.separator),lastCode:((N=t[t.length-1])==null?void 0:N.areaCode)||"",lastLevel:(C=t[t.length-1])==null?void 0:C.areaLeve,options:y.value};break;default:a=((L=t[t.length-1])==null?void 0:L.areaCode)||""}f("update:modelValue",a),f("finish",{selectedOptions:t,value:a}),c.value=!1};return _({getSelectedData:()=>y.value,getDisplayValue:()=>i.value,reset:()=>{i.value="",o.value="",y.value=[],f("update:modelValue",p.valueType==="codes"?[]:p.valueType==="object"?null:"")},open:()=>{b()},close:()=>{c.value=!1}}),(t,a)=>{const l=e.resolveComponent("van-field"),m=e.resolveComponent("van-cascader"),N=e.resolveComponent("van-popup");return e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createVNode(l,e.mergeProps({modelValue:i.value,"onUpdate:modelValue":a[0]||(a[0]=C=>i.value=C),"is-link":"",readonly:""},t.$attrs,{placeholder:n.placeholder,onClick:b}),null,16,["modelValue","placeholder"]),e.createVNode(N,{show:c.value,"onUpdate:show":a[3]||(a[3]=C=>c.value=C),round:"",position:"bottom"},{default:e.withCtx(()=>[e.createVNode(m,{modelValue:o.value,"onUpdate:modelValue":a[1]||(a[1]=C=>o.value=C),title:n.title,options:r.value,"field-names":h,onClose:a[2]||(a[2]=C=>c.value=!1),onFinish:g,onChange:u},null,8,["modelValue","title","options"])]),_:1},8,["show"])],64)}}});S.install=n=>{n.component(S.name||"VtkArea",S)};const A=$(Object.assign({name:"VtkRadio"},{__name:"index",props:{modelValue:{type:[String,Number,Object],default:""},options:{type:[Array,String],default:()=>[]},valueType:{type:String,default:"string",validator:n=>["string","object"].includes(n)}},emits:["update:modelValue","change"],setup(n,{emit:_}){const s=n,p=_,f=e.computed(()=>Array.isArray(s.options)?s.options:typeof s.options=="string"&&s.options?s.options.split("/").filter(Boolean).map(o=>{const[r,i]=o.split(":");return{text:i||r,value:r}}):[]),c=e.computed({get:()=>{const o=s.modelValue;return o==null?"":s.valueType==="object"&&o&&typeof o=="object"?String(o.value??""):String(o)},set:o=>{var V;let r=o;typeof(s.valueType==="object"?(V=s.modelValue)==null?void 0:V.value:s.modelValue)=="number"&&!isNaN(Number(o))&&(r=Number(o)),s.valueType==="object"&&(r=f.value.find(y=>String(y.value)===String(o))||null),p("update:modelValue",r),p("change",r)}});return(o,r)=>{const i=e.resolveComponent("van-radio"),V=e.resolveComponent("van-radio-group"),y=e.resolveComponent("van-field");return e.openBlock(),e.createBlock(y,e.normalizeProps(e.guardReactiveProps(o.$attrs)),{input:e.withCtx(()=>[e.createVNode(V,{modelValue:c.value,"onUpdate:modelValue":r[0]||(r[0]=h=>c.value=h),direction:"horizontal"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value,h=>(e.openBlock(),e.createBlock(i,{key:String(h.value),name:String(h.value)},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.text),1)]),_:2},1032,["name"]))),128))]),_:1},8,["modelValue"])]),_:1},16)}}}),[["__scopeId","data-v-3482e335"]]);A.install=n=>{n.component(A.name||"VtkRadio",A)};const U=Object.assign({name:"VtkUploader",inheritAttrs:!1},{__name:"index",props:{modelValue:{type:[String,Array],default:()=>[]},valueType:{type:String,default:"array",validator:n=>["string","array"].includes(n)},maxSize:{type:Number,default:10*1024*1024},accept:{type:String,default:"image/*"},uploadUrl:{type:String,default:"/bizp/admin/upload"},fieldName:{type:String,default:"file"}},emits:["update:modelValue","change","success","error"],setup(n,{expose:_,emit:s}){const p=n,f=s,c=e.ref([]),o=d=>{if(!d)return[];let u=[];return typeof d=="string"?u=d.split(",").filter(g=>g.trim()):Array.isArray(d)&&(u=d.filter(g=>g)),u.map(g=>({url:g,status:"done",message:""}))},r=()=>c.value.filter(d=>d.status==="done"&&d.url).map(d=>d.url),i=d=>p.valueType==="string"?d.join(","):d,V=()=>{const d=r(),u=i(d);f("update:modelValue",u),f("change",u)};e.watch(()=>p.modelValue,d=>{const u=r().join(","),g=Array.isArray(d)?d.join(","):d||"";u!==g&&(c.value=o(d))},{immediate:!0});const y=d=>{const u=Array.isArray(d)?d:[d];for(const g of u)if(g.size>p.maxSize){const t=(p.maxSize/1024/1024).toFixed(1);return x.showToast(`文件大小不能超过${t}MB`),!1}return!0},h=async d=>{var g,t,a,l;const u=new FormData;u.append(p.fieldName,d.file);try{const m=await Request.imp(p.uploadUrl,u);return(g=m.meta)!=null&&g.success?{success:!0,url:((t=m.data)==null?void 0:t.url)||((a=m.data)==null?void 0:a.path)||m.data}:{success:!1,message:((l=m.meta)==null?void 0:l.message)||"上传失败"}}catch(m){return{success:!1,message:m.message||"上传失败"}}},b=async d=>{const u=Array.isArray(d)?d:[d];u.length>1&&x.showLoadingToast({message:`正在上传 0/${u.length}`,forbidClick:!0,duration:0});let g=0,t=0;for(let a=0;a<u.length;a++){const l=u[a];l.status="uploading",l.message="上传中...",u.length>1&&x.showLoadingToast({message:`正在上传 ${a+1}/${u.length}`,forbidClick:!0,duration:0});const m=await h(l);m.success?(l.status="done",l.message="",l.url=m.url,g++,f("success",{file:l,url:m.url})):(l.status="failed",l.message=m.message,t++,f("error",{file:l,message:m.message}))}x.closeToast(),u.length>1?t===0?x.showToast(`${g}个文件上传成功`):x.showToast(`${g}个成功,${t}个失败`):t>0&&x.showToast(u[0].message||"上传失败"),V()},j=()=>{setTimeout(()=>{V()},0)};return _({getUrls:r,clear:()=>{c.value=[],V()},getFileList:()=>c.value}),(d,u)=>{const g=e.resolveComponent("van-uploader");return e.openBlock(),e.createBlock(g,e.mergeProps({modelValue:c.value,"onUpdate:modelValue":u[0]||(u[0]=t=>c.value=t)},d.$attrs,{"max-size":n.maxSize,accept:n.accept,"before-read":y,"after-read":b,onDelete:j}),null,16,["modelValue","max-size","accept"])}}}),T=$(U,[["__scopeId","data-v-2ccc0da3"]]);T.install=n=>{n.component(T.name||"VtkUploader",T)};const F={class:"file-preview-container"},D={class:"file-header"},R={class:"file-title"},I={class:"file-content"},q={key:0,class:"image-preview"},M={class:"image-footer"},W={class:"file-info"},G={key:1,class:"pdf-preview"},H={key:1,class:"pdf-placeholder"},J={class:"pdf-footer"},K={class:"page-info"},Q={class:"footer"},B=$(Object.assign({name:"VtkPreview"},{__name:"index",props:{modelValue:{type:Boolean,default:!1},files:{type:Array,default:()=>[]},startIndex:{type:Number,default:0}},emits:["update:modelValue","close"],setup(n,{emit:_}){const s=n,p=_,f=e.ref(s.modelValue),c=e.ref(s.startIndex),o=e.ref(1),r=e.ref(null),i=e.ref(0),V=e.computed(()=>s.files.map((a,l)=>{if(typeof a=="string"){const m=a.toLowerCase().endsWith(".pdf");return{name:m?`文档${l+1}.pdf`:`图片${l+1}`,url:a,type:m?"pdf":"image"}}return a})),y=e.computed(()=>V.value[c.value]||null),h=e.computed(()=>{if(!y.value)return null;const a=y.value.url||y.value;return typeof a=="string"?a.toLowerCase().endsWith(".pdf")?"pdf":"image":y.value.type||"image"});e.watch(()=>s.modelValue,a=>{f.value=a,a&&V.value.length>0&&(c.value=s.startIndex,b())}),e.watch(()=>s.startIndex,a=>{c.value=a,b()}),e.watch(f,a=>{p("update:modelValue",a),a||t()}),e.watch(c,()=>{o.value=1,i.value=0,b()});const b=()=>{const a=y.value;a&&(h.value==="pdf"?r.value=a.url||a:r.value=null)},j=a=>{i.value=a.numPages||0},d=()=>{console.log("PDF rendered successfully")},u=()=>{c.value>0&&c.value--},g=()=>{c.value<V.value.length-1&&c.value++},t=()=>{f.value=!1,r.value=null,o.value=1,i.value=0,p("close")};return(a,l)=>{const m=e.resolveComponent("van-icon"),N=e.resolveComponent("van-image"),C=e.resolveComponent("van-button"),L=e.resolveComponent("van-popup");return e.openBlock(),e.createBlock(L,{show:f.value,"onUpdate:show":l[2]||(l[2]=v=>f.value=v),position:"bottom",style:{height:"100vh"}},{default:e.withCtx(()=>{var v,z;return[e.createElementVNode("div",F,[e.createElementVNode("div",D,[e.createElementVNode("div",R,e.toDisplayString(((v=y.value)==null?void 0:v.name)||"文件预览"),1),e.createVNode(m,{name:"cross",size:"20",onClick:t})]),e.createElementVNode("div",I,[h.value==="image"?(e.openBlock(),e.createElementBlock("div",q,[e.createVNode(N,{src:(z=y.value)==null?void 0:z.url,fit:"contain",class:"preview-image"},null,8,["src"]),e.createElementVNode("div",M,[e.createVNode(C,{size:"small",disabled:c.value<=0,onClick:u},{default:e.withCtx(()=>[...l[3]||(l[3]=[e.createTextVNode("上一个",-1)])]),_:1},8,["disabled"]),e.createElementVNode("span",W,e.toDisplayString(c.value+1)+" / "+e.toDisplayString(n.files.length),1),e.createVNode(C,{size:"small",disabled:c.value>=n.files.length-1,onClick:g},{default:e.withCtx(()=>[...l[4]||(l[4]=[e.createTextVNode("下一个",-1)])]),_:1},8,["disabled"])])])):h.value==="pdf"?(e.openBlock(),e.createElementBlock("div",G,[r.value?(e.openBlock(),e.createBlock(e.unref(E),{key:0,source:r.value,page:o.value,class:"pdf-embed-preview",onRendered:d,onLoaded:j},null,8,["source","page"])):(e.openBlock(),e.createElementBlock("div",H,"请选择PDF文件")),e.createElementVNode("div",J,[e.createVNode(C,{size:"small",disabled:o.value<=1,onClick:l[0]||(l[0]=O=>o.value--)},{default:e.withCtx(()=>[...l[5]||(l[5]=[e.createTextVNode("上一页",-1)])]),_:1},8,["disabled"]),e.createElementVNode("span",K,"第 "+e.toDisplayString(o.value)+" / "+e.toDisplayString(i.value||"?")+" 页",1),e.createVNode(C,{size:"small",disabled:!r.value||o.value>=i.value,onClick:l[1]||(l[1]=O=>o.value++)},{default:e.withCtx(()=>[...l[6]||(l[6]=[e.createTextVNode("下一页",-1)])]),_:1},8,["disabled"])])])):e.createCommentVNode("",!0),e.createElementVNode("div",Q,[e.createVNode(C,{disabled:c.value<=0,onClick:u,icon:"arrow-left",type:"primary",round:""},null,8,["disabled"]),e.createVNode(C,{disabled:c.value>=n.files.length-1,onClick:g,icon:"arrow",type:"primary",round:""},null,8,["disabled"])])])])]}),_:1},8,["show"])}}}),[["__scopeId","data-v-1ad2c749"]]);B.install=n=>{n.component(B.name||"VtkPreview",B)};const X=[w,S,A,T,B],P=n=>{X.forEach(_=>{_.install?n.use(_):_.name&&n.component(_.name,_)})},Y={install:P,Checkbox:w,Area:S,Radio:A,Uploader:T,Preview:B},Z="1.0.0";k.Area=S,k.Checkbox=w,k.Preview=B,k.Radio=A,k.Uploader=T,k.default=Y,k.install=P,k.version=Z,Object.defineProperties(k,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
2
2
  //# sourceMappingURL=vant-vtk.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vant-vtk.umd.js","sources":["../packages/checkbox-field/index.vue","../packages/checkbox-field/index.js","../src/index.js"],"sourcesContent":["<template>\r\n <van-field v-bind=\"$attrs\">\r\n <template #input>\r\n <van-checkbox-group v-model=\"internalValue\" direction=\"horizontal\">\r\n <van-checkbox v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\" shape=\"square\">\r\n {{ item.text }}\r\n </van-checkbox>\r\n </van-checkbox-group>\r\n </template>\r\n </van-field>\r\n</template>\r\n\r\n<script setup>\r\n import { computed } from 'vue'\r\n\r\n defineOptions({\r\n name: 'VtkCheckboxField'\r\n })\r\n\r\n const props = defineProps({\r\n // 绑定值\r\n modelValue: {\r\n type: [String, Array, Object],\r\n default: () => [],\r\n },\r\n // 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n options: {\r\n type: [Array, String],\r\n default: () => [],\r\n },\r\n // 返回值类型: 'string' (逗号分隔), 'array' (值数组), 'object' (对象数组)\r\n valueType: {\r\n type: String,\r\n default: 'array',\r\n validator: (val) => ['string', 'array', 'object'].includes(val),\r\n },\r\n // 当 valueType 为 string 时的分隔符\r\n separator: {\r\n type: String,\r\n default: ',',\r\n },\r\n })\r\n\r\n const emit = defineEmits(['update:modelValue', 'change'])\r\n\r\n // 解析选项\r\n const parsedOptions = computed(() => {\r\n if (Array.isArray(props.options)) {\r\n return props.options\r\n }\r\n if (typeof props.options === 'string' && props.options) {\r\n return props.options\r\n .split('/')\r\n .filter(Boolean)\r\n .map((item) => {\r\n const [value, text] = item.split(':')\r\n return {\r\n text: text || value,\r\n value: value,\r\n }\r\n })\r\n }\r\n return []\r\n })\r\n\r\n // 使用可写计算属性处理 v-model 绑定\r\n const internalValue = computed({\r\n get: () => {\r\n const val = props.modelValue\r\n if (!val) return []\r\n\r\n let arr = []\r\n if (props.valueType === 'string') {\r\n arr = typeof val === 'string' ? val.split(props.separator).filter(Boolean) : []\r\n } else if (props.valueType === 'object') {\r\n arr = Array.isArray(val) ? val.map((item) => item?.value ?? item) : []\r\n } else {\r\n arr = Array.isArray(val) ? val : []\r\n }\r\n // 统一转为字符串,确保与 van-checkbox 的 name 匹配\r\n return arr.map(String)\r\n },\r\n set: (newValues) => {\r\n let emitValue\r\n if (props.valueType === 'string') {\r\n emitValue = newValues.join(props.separator)\r\n } else if (props.valueType === 'object') {\r\n // 从解析后的选项中过滤出完整的对象\r\n emitValue = parsedOptions.value.filter((opt) => newValues.includes(String(opt.value)))\r\n } else {\r\n // 如果原始数据是数字,则尝试转回数字,否则保持字符串\r\n emitValue = newValues.map((val) => {\r\n return isNaN(Number(val)) ? val : Array.isArray(props.modelValue) && typeof props.modelValue[0] === 'number' ? Number(val) : val\r\n })\r\n }\r\n\r\n emit('update:modelValue', emitValue)\r\n emit('change', emitValue)\r\n },\r\n })\r\n</script>\r\n\r\n<style scoped>\r\n :deep(.van-checkbox) {\r\n margin-bottom: 8px;\r\n margin-right: 12px;\r\n }\r\n</style>\r\n","/**\r\n * CheckboxField 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport CheckboxField from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nCheckboxField.install = (app) => {\r\n app.component(CheckboxField.name || 'VtkCheckboxField', CheckboxField)\r\n}\r\n\r\nexport default CheckboxField\r\nexport { CheckboxField }\r\n","/**\r\n * Vant-VTK 组件库全量导出入口\r\n * 支持全量引入和按需引入\r\n */\r\nimport CheckboxField from '../packages/checkbox-field/index.js'\r\n\r\n// 所有组件列表\r\nconst components = [\r\n CheckboxField\r\n]\r\n\r\n// 全量注册方法\r\nconst install = (app) => {\r\n components.forEach(component => {\r\n if (component.install) {\r\n app.use(component)\r\n } else if (component.name) {\r\n app.component(component.name, component)\r\n }\r\n })\r\n}\r\n\r\n// 默认导出 - 支持 app.use(VantVtk) 全量注册\r\nexport default {\r\n install,\r\n // 也导出所有组件,方便直接访问\r\n CheckboxField\r\n}\r\n\r\n// 具名导出 - 支持按需引入\r\nexport {\r\n install,\r\n CheckboxField\r\n}\r\n\r\n// 导出版本号\r\nexport const version = '1.0.0'\r\n"],"names":["props","__props","emit","__emit","parsedOptions","computed","item","value","text","internalValue","val","arr","newValues","emitValue","opt","_openBlock","_createBlock","_component_van_field","$attrs","_createVNode","_component_van_checkbox_group","$event","_createElementBlock","_Fragment","_renderList","_component_van_checkbox","_createTextVNode","_toDisplayString","CheckboxField","app","components","install","component","index","version"],"mappings":"qqBAmBE,MAAMA,EAAQC,EAwBRC,EAAOC,EAGPC,EAAgBC,EAAAA,SAAS,IACzB,MAAM,QAAQL,EAAM,OAAO,EACtBA,EAAM,QAEX,OAAOA,EAAM,SAAY,UAAYA,EAAM,QACtCA,EAAM,QACV,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAKM,GAAS,CACb,KAAM,CAACC,EAAOC,CAAI,EAAIF,EAAK,MAAM,GAAG,EACpC,MAAO,CACL,KAAME,GAAQD,EACd,MAAOA,CACnB,CACQ,CAAC,EAEE,CAAA,CACR,EAGKE,EAAgBJ,EAAAA,SAAS,CAC7B,IAAK,IAAM,CACT,MAAMK,EAAMV,EAAM,WAClB,GAAI,CAACU,EAAK,MAAO,CAAA,EAEjB,IAAIC,EAAM,CAAA,EACV,OAAIX,EAAM,YAAc,SACtBW,EAAM,OAAOD,GAAQ,SAAWA,EAAI,MAAMV,EAAM,SAAS,EAAE,OAAO,OAAO,EAAI,CAAA,EACpEA,EAAM,YAAc,SAC7BW,EAAM,MAAM,QAAQD,CAAG,EAAIA,EAAI,IAAKJ,IAASA,GAAA,YAAAA,EAAM,QAASA,CAAI,EAAI,CAAA,EAEpEK,EAAM,MAAM,QAAQD,CAAG,EAAIA,EAAM,CAAA,EAG5BC,EAAI,IAAI,MAAM,CACvB,EACA,IAAMC,GAAc,CAClB,IAAIC,EACAb,EAAM,YAAc,SACtBa,EAAYD,EAAU,KAAKZ,EAAM,SAAS,EACjCA,EAAM,YAAc,SAE7Ba,EAAYT,EAAc,MAAM,OAAQU,GAAQF,EAAU,SAAS,OAAOE,EAAI,KAAK,CAAC,CAAC,EAGrFD,EAAYD,EAAU,IAAKF,GAClB,MAAM,OAAOA,CAAG,CAAC,EAAIA,EAAM,MAAM,QAAQV,EAAM,UAAU,GAAK,OAAOA,EAAM,WAAW,CAAC,GAAM,SAAW,OAAOU,CAAG,EAAIA,CAC9H,EAGHR,EAAK,oBAAqBW,CAAS,EACnCX,EAAK,SAAUW,CAAS,CAC1B,CACJ,CAAG,wIAlGD,OAAAE,EAAAA,UAAA,EAAAC,EAAAA,YAQYC,wCAROC,EAAAA,MAAM,CAAA,EAAA,CACZ,gBACT,IAIqB,CAJrBC,EAAAA,YAIqBC,EAAA,YAJQX,EAAA,2CAAAA,EAAa,MAAAY,GAAE,UAAU,iCACtC,IAA6B,kBAA3CC,EAAAA,mBAEeC,EAAAA,SAAA,KAAAC,EAAAA,WAFcpB,EAAA,MAARE,kBAArBU,EAAAA,YAEeS,EAAA,CAF8B,IAAK,OAAOnB,EAAK,KAAK,EAAI,KAAM,OAAOA,EAAK,KAAK,EAAG,MAAM,6BACrG,IAAe,CAAZoB,EAAAA,gBAAAC,EAAAA,gBAAArB,EAAK,IAAI,EAAA,CAAA,2GCEtBsB,EAAc,QAAWC,GAAQ,CAC/BA,EAAI,UAAUD,EAAc,MAAQ,mBAAoBA,CAAa,CACvE,ECFA,MAAME,EAAa,CACjBF,CACF,EAGMG,EAAWF,GAAQ,CACvBC,EAAW,QAAQE,GAAa,CAC1BA,EAAU,QACZH,EAAI,IAAIG,CAAS,EACRA,EAAU,MACnBH,EAAI,UAAUG,EAAU,KAAMA,CAAS,CAE3C,CAAC,CACH,EAGAC,EAAe,CACb,QAAAF,EAEA,cAAAH,CACF,EASaM,EAAU"}
1
+ {"version":3,"file":"vant-vtk.umd.js","sources":["../packages/checkbox/index.vue","../packages/checkbox/index.js","../packages/Area/index.vue","../packages/Area/index.js","../packages/Radio/index.vue","../packages/Radio/index.js","../packages/Uploader/index.vue","../packages/Uploader/index.js","../packages/preview/index.vue","../packages/preview/index.js","../src/index.js"],"sourcesContent":["<template>\r\n <van-field v-bind=\"$attrs\">\r\n <template #input>\r\n <van-checkbox-group v-model=\"internalValue\" direction=\"horizontal\">\r\n <van-checkbox v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\" shape=\"square\">\r\n {{ item.text }}\r\n </van-checkbox>\r\n </van-checkbox-group>\r\n </template>\r\n </van-field>\r\n</template>\r\n\r\n<script setup>\r\n import { computed } from 'vue'\r\n\r\n defineOptions({\r\n name: 'VtkCheckbox'\r\n })\r\n\r\n const props = defineProps({\r\n // 绑定值\r\n modelValue: {\r\n type: [String, Array, Object],\r\n default: () => [],\r\n },\r\n // 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n options: {\r\n type: [Array, String],\r\n default: () => [],\r\n },\r\n // 返回值类型: 'string' (逗号分隔), 'array' (值数组), 'object' (对象数组)\r\n valueType: {\r\n type: String,\r\n default: 'array',\r\n validator: (val) => ['string', 'array', 'object'].includes(val),\r\n },\r\n // 当 valueType 为 string 时的分隔符\r\n separator: {\r\n type: String,\r\n default: ',',\r\n },\r\n })\r\n\r\n const emit = defineEmits(['update:modelValue', 'change'])\r\n\r\n // 解析选项\r\n const parsedOptions = computed(() => {\r\n if (Array.isArray(props.options)) {\r\n return props.options\r\n }\r\n if (typeof props.options === 'string' && props.options) {\r\n return props.options\r\n .split('/')\r\n .filter(Boolean)\r\n .map((item) => {\r\n const [value, text] = item.split(':')\r\n return {\r\n text: text || value,\r\n value: value,\r\n }\r\n })\r\n }\r\n return []\r\n })\r\n\r\n // 使用可写计算属性处理 v-model 绑定\r\n const internalValue = computed({\r\n get: () => {\r\n const val = props.modelValue\r\n if (!val) return []\r\n\r\n let arr = []\r\n if (props.valueType === 'string') {\r\n arr = typeof val === 'string' ? val.split(props.separator).filter(Boolean) : []\r\n } else if (props.valueType === 'object') {\r\n arr = Array.isArray(val) ? val.map((item) => item?.value ?? item) : []\r\n } else {\r\n arr = Array.isArray(val) ? val : []\r\n }\r\n // 统一转为字符串,确保与 van-checkbox 的 name 匹配\r\n return arr.map(String)\r\n },\r\n set: (newValues) => {\r\n let emitValue\r\n if (props.valueType === 'string') {\r\n emitValue = newValues.join(props.separator)\r\n } else if (props.valueType === 'object') {\r\n // 从解析后的选项中过滤出完整的对象\r\n emitValue = parsedOptions.value.filter((opt) => newValues.includes(String(opt.value)))\r\n } else {\r\n // 如果原始数据是数字,则尝试转回数字,否则保持字符串\r\n emitValue = newValues.map((val) => {\r\n return isNaN(Number(val)) ? val : Array.isArray(props.modelValue) && typeof props.modelValue[0] === 'number' ? Number(val) : val\r\n })\r\n }\r\n\r\n emit('update:modelValue', emitValue)\r\n emit('change', emitValue)\r\n },\r\n })\r\n</script>\r\n\r\n<style scoped>\r\n :deep(.van-checkbox) {\r\n margin-bottom: 8px;\r\n margin-right: 12px;\r\n }\r\n</style>\r\n","/**\r\n * Checkbox 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Checkbox from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nCheckbox.install = (app) => {\r\n app.component(Checkbox.name || 'VtkCheckbox', Checkbox)\r\n}\r\n\r\nexport default Checkbox\r\nexport { Checkbox }\r\n","<template>\r\n\t<van-field v-model=\"displayValue\" is-link readonly v-bind=\"$attrs\" :placeholder=\"placeholder\" @click=\"handleClick\" />\r\n\t<van-popup v-model:show=\"show\" round position=\"bottom\">\r\n\t\t<van-cascader v-model=\"cascaderValue\" :title=\"title\" :options=\"options\" :field-names=\"fieldNames\" @close=\"show = false\" @finish=\"onFinish\" @change=\"onChange\" />\r\n\t</van-popup>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkArea\",\r\n});\r\nimport { ref, watch } from \"vue\";\r\n// import Request from \"@/utils/request\";\r\n\r\nconst props = defineProps({\r\n\t// 绑定值,根据 valueType 返回不同类型\r\n\tmodelValue: {\r\n\t\ttype: [String, Object, Array],\r\n\t\tdefault: \"\",\r\n\t},\r\n\t// 默认地区编码,用于初始化加载\r\n\tdefaultAreaCode: {\r\n\t\ttype: String,\r\n\t\tdefault: \"33\",\r\n\t},\r\n\t// 返回值类型: 'code' 返回最后一级areaCode, 'codes' 返回所有级别areaCode数组, 'object' 返回完整对象信息\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"code\",\r\n\t\tvalidator: (val) => [\"code\", \"codes\", \"object\"].includes(val),\r\n\t},\r\n\t// 显示分隔符\r\n\tseparator: {\r\n\t\ttype: String,\r\n\t\tdefault: \"/\",\r\n\t},\r\n\t// 弹窗标题\r\n\ttitle: {\r\n\t\ttype: String,\r\n\t\tdefault: \"请选择所在地区\",\r\n\t},\r\n\t// 占位文本\r\n\tplaceholder: {\r\n\t\ttype: String,\r\n\t\tdefault: \"请选择所在地区\",\r\n\t},\r\n\t// 最大层级限制,达到该层级后不再加载下级\r\n\tmaxLevel: {\r\n\t\ttype: Number,\r\n\t\tdefault: 12,\r\n\t},\r\n\t// 显示模式: 'full' 显示完整路径, 'last' 只显示最后一级\r\n\tdisplayMode: {\r\n\t\ttype: String,\r\n\t\tdefault: \"full\",\r\n\t\tvalidator: (val) => [\"full\", \"last\"].includes(val),\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\", \"finish\"]);\r\n\r\nconst show = ref(false); //弹窗显示隐藏\r\nconst cascaderValue = ref(\"\"); //级联选择器绑定值\r\nconst options = ref([]); //级联选择器选项\r\nconst displayValue = ref(\"\"); //显示值\r\nconst loading = ref(false); //加载状态\r\n// 存储完整的选中信息\r\nconst selectedData = ref([]);\r\n\r\nconst fieldNames = {\r\n\ttext: \"areaName\",\r\n\tvalue: \"areaCode\",\r\n\tchildren: \"children\",\r\n};\r\n\r\n// 监听 modelValue 变化,用于回显\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(val) => {\r\n\t\tif (!val) {\r\n\t\t\tdisplayValue.value = \"\";\r\n\t\t\tcascaderValue.value = \"\";\r\n\t\t\tselectedData.value = [];\r\n\t\t}\r\n\t},\r\n\t{ immediate: true },\r\n);\r\n\r\nconst handleClick = () => {\r\n\tshow.value = true;\r\n\tif (options.value.length === 0) {\r\n\t\tloadInitialArea();\r\n\t}\r\n};\r\n\r\n// 加载初始地区\r\nconst loadInitialArea = async () => {\r\n\tif (loading.value) return;\r\n\tloading.value = true;\r\n\ttry {\r\n\t\tconst areaCode = props.defaultAreaCode;\r\n\t\tconst res = await Request.getForm(`dict/area/show/${areaCode}`);\r\n\t\tif (res.data) {\r\n\t\t\tconst rootArea = {\r\n\t\t\t\tareaCode: res.data.areaCode,\r\n\t\t\t\tareaName: res.data.areaName,\r\n\t\t\t\tareaLeve: res.data.areaLeve,\r\n\t\t\t\tchildren: res.data.areaLeve < props.maxLevel ? [] : undefined,\r\n\t\t\t};\r\n\t\t\toptions.value = [rootArea];\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error(\"加载初始地区失败:\", error);\r\n\t} finally {\r\n\t\tloading.value = false;\r\n\t}\r\n};\r\n\r\n// 加载下级地区\r\nconst loadChildren = async (item) => {\r\n\tif (item._loading) return;\r\n\titem._loading = true;\r\n\ttry {\r\n\t\tconst res = await Request.getForm(`dict/area/next/${item.areaCode}`);\r\n\t\tif (res.data && res.data.length > 0) {\r\n\t\t\tres.data.forEach((it) => {\r\n\t\t\t\t// 根据 maxLevel 判断是否还有下级\r\n\t\t\t\tif (it.areaLeve < props.maxLevel) {\r\n\t\t\t\t\tit.children = [];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\titem.children = res.data;\r\n\t\t} else {\r\n\t\t\t// 没有下级数据,移除 children 属性使其成为叶子节点\r\n\t\t\tdelete item.children;\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error(\"加载下级地区失败:\", error);\r\n\t} finally {\r\n\t\titem._loading = false;\r\n\t}\r\n};\r\n\r\n// 选项变化时加载下级\r\nconst onChange = ({ value, selectedOptions, tabIndex }) => {\r\n\tconst currentItem = selectedOptions[tabIndex];\r\n\tif (currentItem && currentItem.areaLeve < props.maxLevel && Array.isArray(currentItem.children) && currentItem.children.length === 0) {\r\n\t\tloadChildren(currentItem);\r\n\t}\r\n\temit(\"change\", { value, selectedOptions, tabIndex });\r\n};\r\n\r\n// 完成选择\r\nconst onFinish = ({ selectedOptions }) => {\r\n\t// 根据 displayMode 决定显示值\r\n\tif (props.displayMode === \"last\") {\r\n\t\t// 只显示最后一级\r\n\t\tdisplayValue.value = selectedOptions[selectedOptions.length - 1]?.areaName || \"\";\r\n\t} else {\r\n\t\t// 显示完整路径(默认)\r\n\t\tdisplayValue.value = selectedOptions.map((option) => option.areaName).join(props.separator);\r\n\t}\r\n\r\n\t// 存储完整选中数据\r\n\tselectedData.value = selectedOptions.map((option) => ({\r\n\t\tareaCode: option.areaCode,\r\n\t\tareaName: option.areaName,\r\n\t\tareaLeve: option.areaLeve,\r\n\t}));\r\n\r\n\t// 根据 valueType 返回不同格式的值\r\n\tlet emitValue;\r\n\tswitch (props.valueType) {\r\n\t\tcase \"code\":\r\n\t\t\t// 返回最后一级的 areaCode\r\n\t\t\temitValue = selectedOptions[selectedOptions.length - 1]?.areaCode || \"\";\r\n\t\t\tbreak;\r\n\t\tcase \"codes\":\r\n\t\t\t// 返回所有级别的 areaCode 数组\r\n\t\t\temitValue = selectedOptions.map((option) => option.areaCode);\r\n\t\t\tbreak;\r\n\t\tcase \"object\":\r\n\t\t\t// 返回完整对象信息\r\n\t\t\temitValue = {\r\n\t\t\t\tcodes: selectedOptions.map((option) => option.areaCode),\r\n\t\t\t\tnames: selectedOptions.map((option) => option.areaName),\r\n\t\t\t\tfullName: selectedOptions.map((option) => option.areaName).join(props.separator),\r\n\t\t\t\tlastCode: selectedOptions[selectedOptions.length - 1]?.areaCode || \"\",\r\n\t\t\t\tlastLevel: selectedOptions[selectedOptions.length - 1]?.areaLeve,\r\n\t\t\t\toptions: selectedData.value,\r\n\t\t\t};\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\temitValue = selectedOptions[selectedOptions.length - 1]?.areaCode || \"\";\r\n\t}\r\n\r\n\temit(\"update:modelValue\", emitValue);\r\n\temit(\"finish\", { selectedOptions, value: emitValue });\r\n\tshow.value = false;\r\n};\r\n\r\n// 暴露方法供外部调用\r\ndefineExpose({\r\n\t// 获取当前选中的完整数据\r\n\tgetSelectedData: () => selectedData.value,\r\n\t// 获取显示值\r\n\tgetDisplayValue: () => displayValue.value,\r\n\t// 重置选择\r\n\treset: () => {\r\n\t\tdisplayValue.value = \"\";\r\n\t\tcascaderValue.value = \"\";\r\n\t\tselectedData.value = [];\r\n\t\temit(\"update:modelValue\", props.valueType === \"codes\" ? [] : props.valueType === \"object\" ? null : \"\");\r\n\t},\r\n\t// 打开选择器\r\n\topen: () => {\r\n\t\thandleClick();\r\n\t},\r\n\t// 关闭选择器\r\n\tclose: () => {\r\n\t\tshow.value = false;\r\n\t},\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped></style>\r\n","/**\r\n * Area 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Area from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nArea.install = (app) => {\r\n app.component(Area.name || 'VtkArea', Area)\r\n}\r\n\r\nexport default Area\r\nexport { Area }\r\n","<template>\r\n\t<van-field v-bind=\"$attrs\">\r\n\t\t<template #input>\r\n\t\t\t<van-radio-group v-model=\"internalValue\" direction=\"horizontal\">\r\n\t\t\t\t<van-radio v-for=\"item in parsedOptions\" :key=\"String(item.value)\" :name=\"String(item.value)\">\r\n\t\t\t\t\t{{ item.text }}\r\n\t\t\t\t</van-radio>\r\n\t\t\t</van-radio-group>\r\n\t\t</template>\r\n\t</van-field>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkRadio\",\r\n});\r\nimport { computed } from \"vue\";\r\n\r\nconst props = defineProps({\r\n\t// 绑定值\r\n\tmodelValue: {\r\n\t\ttype: [String, Number, Object],\r\n\t\tdefault: \"\",\r\n\t},\r\n\t// 选项数据:支持数组 [{value, text}] 或 字符串 '1:选项1/2:选项2'\r\n\toptions: {\r\n\t\ttype: [Array, String],\r\n\t\tdefault: () => [],\r\n\t},\r\n\t// 返回值类型: 'string' (基本类型), 'object' (完整对象)\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"string\",\r\n\t\tvalidator: (val) => [\"string\", \"object\"].includes(val),\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\"]);\r\n\r\n// 解析选项\r\nconst parsedOptions = computed(() => {\r\n\tif (Array.isArray(props.options)) {\r\n\t\treturn props.options;\r\n\t}\r\n\tif (typeof props.options === \"string\" && props.options) {\r\n\t\treturn props.options\r\n\t\t\t.split(\"/\")\r\n\t\t\t.filter(Boolean)\r\n\t\t\t.map((item) => {\r\n\t\t\t\tconst [value, text] = item.split(\":\");\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttext: text || value,\r\n\t\t\t\t\tvalue: value,\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t}\r\n\treturn [];\r\n});\r\n\r\n// 使用可写计算属性处理 v-model 绑定\r\nconst internalValue = computed({\r\n\tget: () => {\r\n\t\tconst val = props.modelValue;\r\n\t\tif (val === undefined || val === null) return \"\";\r\n\r\n\t\t// 如果是对象类型,提取其中的 value\r\n\t\tif (props.valueType === \"object\" && val && typeof val === \"object\") {\r\n\t\t\treturn String(val.value ?? \"\");\r\n\t\t}\r\n\t\treturn String(val);\r\n\t},\r\n\tset: (newValue) => {\r\n\t\tlet emitValue = newValue;\r\n\r\n\t\t// 处理原始数据类型逻辑(如果父组件传入的是数字,尝试转回数字)\r\n\t\tconst originalValue = props.valueType === \"object\" ? props.modelValue?.value : props.modelValue;\r\n\t\tif (typeof originalValue === \"number\" && !isNaN(Number(newValue))) {\r\n\t\t\temitValue = Number(newValue);\r\n\t\t}\r\n\r\n\t\tif (props.valueType === \"object\") {\r\n\t\t\t// 找回完整对象\r\n\t\t\temitValue = parsedOptions.value.find((opt) => String(opt.value) === String(newValue)) || null;\r\n\t\t}\r\n\r\n\t\temit(\"update:modelValue\", emitValue);\r\n\t\temit(\"change\", emitValue);\r\n\t},\r\n});\r\n</script>\r\n\r\n<style scoped>\r\n:deep(.van-radio) {\r\n\tmargin-right: 12px;\r\n}\r\n</style>\r\n","/**\r\n * Radio 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Radio from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nRadio.install = (app) => {\r\n app.component(Radio.name || 'VtkRadio', Radio)\r\n}\r\n\r\nexport default Radio\r\nexport { Radio }\r\n","<template>\r\n\t<van-uploader v-model=\"fileList\" v-bind=\"$attrs\" :max-size=\"maxSize\" :accept=\"accept\" :before-read=\"beforeRead\" :after-read=\"afterRead\" @delete=\"onDelete\" />\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkUploader\",\r\n\tinheritAttrs: false,\r\n});\r\nimport { ref, watch } from \"vue\";\r\nimport { showToast, showLoadingToast, closeToast } from \"vant\";\r\n\r\nconst props = defineProps({\r\n\t/** 绑定值,支持字符串或数组 */\r\n\tmodelValue: {\r\n\t\ttype: [String, Array],\r\n\t\tdefault: () => [],\r\n\t},\r\n\t/** 返回值类型:'string' 返回逗号分隔的字符串,'array' 返回数组 */\r\n\tvalueType: {\r\n\t\ttype: String,\r\n\t\tdefault: \"array\",\r\n\t\tvalidator: (val) => [\"string\", \"array\"].includes(val),\r\n\t},\r\n\t/** 单个文件最大大小(字节),默认10MB */\r\n\tmaxSize: {\r\n\t\ttype: Number,\r\n\t\tdefault: 10 * 1024 * 1024,\r\n\t},\r\n\t/** 接受的文件类型 */\r\n\taccept: {\r\n\t\ttype: String,\r\n\t\tdefault: \"image/*\",\r\n\t},\r\n\t/** 上传接口地址 */\r\n\tuploadUrl: {\r\n\t\ttype: String,\r\n\t\tdefault: \"/bizp/admin/upload\",\r\n\t},\r\n\t/** 上传文件的字段名 */\r\n\tfieldName: {\r\n\t\ttype: String,\r\n\t\tdefault: \"file\",\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"change\", \"success\", \"error\"]);\r\n\r\n// 文件列表\r\nconst fileList = ref([]);\r\n\r\n// 解析初始值\r\nconst parseModelValue = (value) => {\r\n\tif (!value) return [];\r\n\r\n\tlet urls = [];\r\n\tif (typeof value === \"string\") {\r\n\t\turls = value.split(\",\").filter((url) => url.trim());\r\n\t} else if (Array.isArray(value)) {\r\n\t\turls = value.filter((url) => url);\r\n\t}\r\n\r\n\treturn urls.map((url) => ({\r\n\t\turl,\r\n\t\tstatus: \"done\",\r\n\t\tmessage: \"\",\r\n\t}));\r\n};\r\n\r\n// 获取已上传的URL列表\r\nconst getUploadedUrls = () => {\r\n\treturn fileList.value.filter((file) => file.status === \"done\" && file.url).map((file) => file.url);\r\n};\r\n\r\n// 格式化输出值\r\nconst formatOutput = (urls) => {\r\n\tif (props.valueType === \"string\") {\r\n\t\treturn urls.join(\",\");\r\n\t}\r\n\treturn urls;\r\n};\r\n\r\n// 触发更新\r\nconst emitValue = () => {\r\n\tconst urls = getUploadedUrls();\r\n\tconst output = formatOutput(urls);\r\n\temit(\"update:modelValue\", output);\r\n\temit(\"change\", output);\r\n};\r\n\r\n// 监听外部值变化\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(newVal) => {\r\n\t\tconst currentUrls = getUploadedUrls().join(\",\");\r\n\t\tconst newUrls = Array.isArray(newVal) ? newVal.join(\",\") : newVal || \"\";\r\n\r\n\t\t// 只有外部值确实改变时才更新\r\n\t\tif (currentUrls !== newUrls) {\r\n\t\t\tfileList.value = parseModelValue(newVal);\r\n\t\t}\r\n\t},\r\n\t{ immediate: true },\r\n);\r\n\r\n// 上传前校验\r\nconst beforeRead = (file) => {\r\n\tconst files = Array.isArray(file) ? file : [file];\r\n\r\n\tfor (const f of files) {\r\n\t\t// 文件大小校验\r\n\t\tif (f.size > props.maxSize) {\r\n\t\t\tconst maxSizeMB = (props.maxSize / 1024 / 1024).toFixed(1);\r\n\t\t\tshowToast(`文件大小不能超过${maxSizeMB}MB`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\treturn true;\r\n};\r\n\r\n// 上传文件\r\nconst uploadFile = async (file) => {\r\n\tconst formData = new FormData();\r\n\tformData.append(props.fieldName, file.file);\r\n\r\n\ttry {\r\n\t\tconst res = await Request.imp(props.uploadUrl, formData);\r\n\r\n\t\tif (res.meta?.success) {\r\n\t\t\t// 根据实际接口返回格式获取URL\r\n\t\t\tconst url = res.data?.url || res.data?.path || res.data;\r\n\t\t\treturn { success: true, url };\r\n\t\t} else {\r\n\t\t\treturn { success: false, message: res.meta?.message || \"上传失败\" };\r\n\t\t}\r\n\t} catch (error) {\r\n\t\treturn { success: false, message: error.message || \"上传失败\" };\r\n\t}\r\n};\r\n\r\n// 文件读取完成后处理\r\nconst afterRead = async (file) => {\r\n\tconst files = Array.isArray(file) ? file : [file];\r\n\r\n\t// 显示上传中提示\r\n\tif (files.length > 1) {\r\n\t\tshowLoadingToast({\r\n\t\t\tmessage: `正在上传 0/${files.length}`,\r\n\t\t\tforbidClick: true,\r\n\t\t\tduration: 0,\r\n\t\t});\r\n\t}\r\n\r\n\tlet successCount = 0;\r\n\tlet failCount = 0;\r\n\r\n\t// 逐个上传\r\n\tfor (let i = 0; i < files.length; i++) {\r\n\t\tconst fileItem = files[i];\r\n\t\tfileItem.status = \"uploading\";\r\n\t\tfileItem.message = \"上传中...\";\r\n\r\n\t\t// 更新进度提示\r\n\t\tif (files.length > 1) {\r\n\t\t\tshowLoadingToast({\r\n\t\t\t\tmessage: `正在上传 ${i + 1}/${files.length}`,\r\n\t\t\t\tforbidClick: true,\r\n\t\t\t\tduration: 0,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst result = await uploadFile(fileItem);\r\n\r\n\t\tif (result.success) {\r\n\t\t\tfileItem.status = \"done\";\r\n\t\t\tfileItem.message = \"\";\r\n\t\t\tfileItem.url = result.url;\r\n\t\t\tsuccessCount++;\r\n\t\t\temit(\"success\", { file: fileItem, url: result.url });\r\n\t\t} else {\r\n\t\t\tfileItem.status = \"failed\";\r\n\t\t\tfileItem.message = result.message;\r\n\t\t\tfailCount++;\r\n\t\t\temit(\"error\", { file: fileItem, message: result.message });\r\n\t\t}\r\n\t}\r\n\r\n\tcloseToast();\r\n\r\n\t// 显示上传结果\r\n\tif (files.length > 1) {\r\n\t\tif (failCount === 0) {\r\n\t\t\tshowToast(`${successCount}个文件上传成功`);\r\n\t\t} else {\r\n\t\t\tshowToast(`${successCount}个成功,${failCount}个失败`);\r\n\t\t}\r\n\t} else if (failCount > 0) {\r\n\t\tshowToast(files[0].message || \"上传失败\");\r\n\t}\r\n\r\n\t// 触发值更新\r\n\temitValue();\r\n};\r\n\r\n// 删除文件\r\nconst onDelete = () => {\r\n\t// 下一个tick再触发,确保fileList已更新\r\n\tsetTimeout(() => {\r\n\t\temitValue();\r\n\t}, 0);\r\n};\r\n\r\n// 暴露方法给父组件\r\ndefineExpose({\r\n\t/** 获取已上传的URL列表 */\r\n\tgetUrls: getUploadedUrls,\r\n\t/** 清空文件列表 */\r\n\tclear: () => {\r\n\t\tfileList.value = [];\r\n\t\temitValue();\r\n\t},\r\n\t/** 获取文件列表 */\r\n\tgetFileList: () => fileList.value,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n:deep(.van-uploader__preview-image) {\r\n\tborder-radius: 4px;\r\n}\r\n\r\n:deep(.van-uploader__upload) {\r\n\tborder-radius: 4px;\r\n}\r\n</style>\r\n","/**\r\n * Uploader 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Uploader from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nUploader.install = (app) => {\r\n app.component(Uploader.name || 'VtkUploader', Uploader)\r\n}\r\n\r\nexport default Uploader\r\nexport { Uploader }\r\n","<template>\r\n\t<van-popup v-model:show=\"showPopup\" position=\"bottom\" :style=\"{ height: '100vh' }\">\r\n\t\t<div class=\"file-preview-container\">\r\n\t\t\t<div class=\"file-header\">\r\n\t\t\t\t<div class=\"file-title\">{{ currentFile?.name || \"文件预览\" }}</div>\r\n\t\t\t\t<van-icon name=\"cross\" size=\"20\" @click=\"handleClose\" />\r\n\t\t\t</div>\r\n\r\n\t\t\t<div class=\"file-content\">\r\n\t\t\t\t<div v-if=\"currentType === 'image'\" class=\"image-preview\">\r\n\t\t\t\t\t<van-image :src=\"currentFile?.url\" fit=\"contain\" class=\"preview-image\" />\r\n\t\t\t\t\t<div class=\"image-footer\">\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentIndex <= 0\" @click=\"prevFile\">上一个</van-button>\r\n\t\t\t\t\t\t<span class=\"file-info\">{{ currentIndex + 1 }} / {{ files.length }}</span>\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\">下一个</van-button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div v-else-if=\"currentType === 'pdf'\" class=\"pdf-preview\">\r\n\t\t\t\t\t<VuePdfEmbed v-if=\"pdfSource\" :source=\"pdfSource\" :page=\"currentPage\" class=\"pdf-embed-preview\" @rendered=\"handlePdfRendered\" @loaded=\"handlePdfLoaded\" />\r\n\t\t\t\t\t<div v-else class=\"pdf-placeholder\">请选择PDF文件</div>\r\n\t\t\t\t\t<div class=\"pdf-footer\">\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"currentPage <= 1\" @click=\"currentPage--\">上一页</van-button>\r\n\t\t\t\t\t\t<span class=\"page-info\">第 {{ currentPage }} / {{ totalPages || \"?\" }} 页</span>\r\n\t\t\t\t\t\t<van-button size=\"small\" :disabled=\"!pdfSource || currentPage >= totalPages\" @click=\"currentPage++\">下一页</van-button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<div class=\"footer\">\r\n\t\t\t\t\t<van-button :disabled=\"currentIndex <= 0\" @click=\"prevFile\" icon=\"arrow-left\" type=\"primary\" round />\r\n\t\t\t\t\t<van-button :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\" icon=\"arrow\" type=\"primary\" round />\r\n\t\t\t\t\t<!-- <van-button size=\"small\" :disabled=\"currentIndex <= 0\" @click=\"prevFile\">上一个</van-button>\r\n <span class=\"file-info\">{{ currentIndex + 1 }} / {{ files.length }}</span>\r\n <van-button size=\"small\" :disabled=\"currentIndex >= files.length - 1\" @click=\"nextFile\">下一个</van-button> -->\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</van-popup>\r\n</template>\r\n\r\n<script setup>\r\ndefineOptions({\r\n\tname: \"VtkPreview\",\r\n});\r\nimport { ref, watch, computed } from \"vue\";\r\nimport VuePdfEmbed from \"vue-pdf-embed\";\r\n\r\nconst props = defineProps({\r\n\tmodelValue: {\r\n\t\ttype: Boolean,\r\n\t\tdefault: false,\r\n\t},\r\n\tfiles: {\r\n\t\ttype: Array,\r\n\t\tdefault: () => [],\r\n\t},\r\n\tstartIndex: {\r\n\t\ttype: Number,\r\n\t\tdefault: 0,\r\n\t},\r\n});\r\n\r\nconst emit = defineEmits([\"update:modelValue\", \"close\"]);\r\n\r\nconst showPopup = ref(props.modelValue);\r\nconst currentIndex = ref(props.startIndex);\r\nconst currentPage = ref(1);\r\nconst pdfSource = ref(null);\r\nconst totalPages = ref(0);\r\n\r\nconst normalizedFiles = computed(() => {\r\n\treturn props.files.map((file, index) => {\r\n\t\tif (typeof file === \"string\") {\r\n\t\t\tconst isPdf = file.toLowerCase().endsWith(\".pdf\");\r\n\t\t\treturn {\r\n\t\t\t\tname: isPdf ? `文档${index + 1}.pdf` : `图片${index + 1}`,\r\n\t\t\t\turl: file,\r\n\t\t\t\ttype: isPdf ? \"pdf\" : \"image\",\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn file;\r\n\t});\r\n});\r\n\r\nconst currentFile = computed(() => {\r\n\treturn normalizedFiles.value[currentIndex.value] || null;\r\n});\r\n\r\nconst currentType = computed(() => {\r\n\tif (!currentFile.value) return null;\r\n\tconst url = currentFile.value.url || currentFile.value;\r\n\tif (typeof url === \"string\") {\r\n\t\treturn url.toLowerCase().endsWith(\".pdf\") ? \"pdf\" : \"image\";\r\n\t}\r\n\treturn currentFile.value.type || \"image\";\r\n});\r\n\r\nwatch(\r\n\t() => props.modelValue,\r\n\t(val) => {\r\n\t\tshowPopup.value = val;\r\n\t\tif (val && normalizedFiles.value.length > 0) {\r\n\t\t\tcurrentIndex.value = props.startIndex;\r\n\t\t\tupdatePreview();\r\n\t\t}\r\n\t},\r\n);\r\n\r\nwatch(\r\n\t() => props.startIndex,\r\n\t(val) => {\r\n\t\tcurrentIndex.value = val;\r\n\t\tupdatePreview();\r\n\t},\r\n);\r\n\r\nwatch(showPopup, (val) => {\r\n\temit(\"update:modelValue\", val);\r\n\tif (!val) {\r\n\t\thandleClose();\r\n\t}\r\n});\r\n\r\nwatch(currentIndex, () => {\r\n\tcurrentPage.value = 1;\r\n\ttotalPages.value = 0;\r\n\tupdatePreview();\r\n});\r\n\r\nconst updatePreview = () => {\r\n\tconst file = currentFile.value;\r\n\tif (!file) return;\r\n\r\n\tif (currentType.value === \"pdf\") {\r\n\t\tpdfSource.value = file.url || file;\r\n\t} else {\r\n\t\tpdfSource.value = null;\r\n\t}\r\n};\r\n\r\nconst handlePdfLoaded = (pdf) => {\r\n\ttotalPages.value = pdf.numPages || 0;\r\n};\r\n\r\nconst handlePdfRendered = () => {\r\n\tconsole.log(\"PDF rendered successfully\");\r\n};\r\n\r\nconst prevFile = () => {\r\n\tif (currentIndex.value > 0) {\r\n\t\tcurrentIndex.value--;\r\n\t}\r\n};\r\n\r\nconst nextFile = () => {\r\n\tif (currentIndex.value < normalizedFiles.value.length - 1) {\r\n\t\tcurrentIndex.value++;\r\n\t}\r\n};\r\n\r\nconst handleClose = () => {\r\n\tshowPopup.value = false;\r\n\tpdfSource.value = null;\r\n\tcurrentPage.value = 1;\r\n\ttotalPages.value = 0;\r\n\temit(\"close\");\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.file-preview-container {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\theight: 100%;\r\n\tbackground-color: #fff;\r\n\tborder-radius: 8px;\r\n\toverflow: hidden;\r\n}\r\n\r\n.file-header {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n\tpadding: 12px 16px;\r\n\tborder-bottom: 1px solid #ebedf0;\r\n\tbackground-color: #f7f8fa;\r\n}\r\n\r\n.file-title {\r\n\tfont-size: 16px;\r\n\tfont-weight: 600;\r\n\tcolor: #323233;\r\n}\r\n\r\n.file-content {\r\n\tflex: 1;\r\n\toverflow: hidden;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n}\r\n\r\n.image-preview {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\toverflow: hidden;\r\n}\r\n\r\n.preview-image {\r\n\tflex: 1;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n}\r\n\r\n.image-footer {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tgap: 16px;\r\n\tpadding: 12px 16px;\r\n\tborder-top: 1px solid #ebedf0;\r\n\tbackground-color: #fff;\r\n}\r\n\r\n.file-info {\r\n\tfont-size: 14px;\r\n\tcolor: #646566;\r\n\tmin-width: 80px;\r\n\ttext-align: center;\r\n}\r\n\r\n.pdf-preview {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\toverflow: hidden;\r\n}\r\n\r\n.pdf-embed-preview {\r\n\tflex: 1;\r\n\tmax-width: 100%;\r\n\toverflow-y: auto;\r\n\tpadding: 16px;\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\talign-items: flex-start;\r\n\tbackground-color: #f5f5f5;\r\n\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.pdf-placeholder {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tcolor: #969799;\r\n\tfont-size: 14px;\r\n}\r\n\r\n.pdf-footer {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tgap: 16px;\r\n\tpadding: 12px 16px;\r\n\tborder-top: 1px solid #ebedf0;\r\n\tbackground-color: #fff;\r\n}\r\n\r\n.page-info {\r\n\tfont-size: 14px;\r\n\tcolor: #646566;\r\n\tmin-width: 80px;\r\n\ttext-align: center;\r\n}\r\n.footer {\r\n\tposition: fixed;\r\n\ttop: 40%;\r\n\twidth: 100%;\r\n\t.van-button {\r\n\t}\r\n\t.van-button:nth-child(2) {\r\n\t\tfloat: right;\r\n\t}\r\n}\r\n</style>\r\n","/**\r\n * Preview 组件单独导出入口\r\n * 支持按需引入\r\n */\r\nimport Preview from './index.vue'\r\n\r\n// 为组件添加 install 方法,支持 app.use() 方式注册\r\nPreview.install = (app) => {\r\n app.component(Preview.name || 'VtkPreview', Preview)\r\n}\r\n\r\nexport default Preview\r\nexport { Preview }\r\n","/**\r\n * Vant-VTK 组件库全量导出入口\r\n * 支持全量引入和按需引入\r\n */\r\nimport Checkbox from '../packages/checkbox/index.js'\r\nimport Area from '../packages/Area/index.js'\r\nimport Radio from '../packages/radio/index.js'\r\nimport Uploader from '../packages/Uploader/index.js'\r\nimport Preview from '../packages/preview/index.js'\r\n\r\n\r\n\r\n// 所有组件列表\r\nconst components = [\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n]\r\n\r\n// 全量注册方法\r\nconst install = (app) => {\r\n components.forEach(component => {\r\n if (component.install) {\r\n app.use(component)\r\n } else if (component.name) {\r\n app.component(component.name, component)\r\n }\r\n })\r\n}\r\n\r\n// 默认导出 - 支持 app.use(VantVtk) 全量注册\r\nexport default {\r\n install,\r\n // 也导出所有组件,方便直接访问\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n}\r\n\r\n// 具名导出 - 支持按需引入\r\nexport {\r\n install,\r\n Checkbox,\r\n Area,\r\n Radio,\r\n Uploader,\r\n Preview\r\n}\r\n\r\n// 导出版本号\r\nexport const version = '1.0.0'\r\n"],"names":["props","__props","emit","__emit","parsedOptions","computed","item","value","text","internalValue","val","arr","newValues","emitValue","opt","_openBlock","_createBlock","_component_van_field","$attrs","_createVNode","_component_van_checkbox_group","$event","_createElementBlock","_Fragment","_renderList","_component_van_checkbox","_createTextVNode","_toDisplayString","Checkbox","app","show","ref","cascaderValue","options","displayValue","loading","selectedData","fieldNames","watch","handleClick","loadInitialArea","areaCode","res","rootArea","error","loadChildren","it","onChange","selectedOptions","tabIndex","currentItem","onFinish","_a","option","_b","_c","_d","_e","__expose","_mergeProps","_component_van_popup","_component_van_cascader","Area","newValue","_component_van_radio_group","_component_van_radio","Radio","fileList","parseModelValue","urls","url","getUploadedUrls","file","formatOutput","output","newVal","currentUrls","newUrls","beforeRead","files","f","maxSizeMB","showToast","uploadFile","formData","afterRead","showLoadingToast","successCount","failCount","i","fileItem","result","closeToast","onDelete","_component_van_uploader","Uploader","showPopup","currentIndex","currentPage","pdfSource","totalPages","normalizedFiles","index","isPdf","currentFile","currentType","updatePreview","handleClose","handlePdfLoaded","pdf","handlePdfRendered","prevFile","nextFile","_createElementVNode","_hoisted_1","_hoisted_2","_hoisted_3","_component_van_icon","_hoisted_4","_hoisted_5","_component_van_image","_hoisted_6","_component_van_button","_cache","_hoisted_7","_hoisted_8","_unref","VuePdfEmbed","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","Preview","components","install","component","version"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vant-vtk",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Vue3 + Vant4 扩展组件库",
5
5
  "type": "module",
6
6
  "main": "./dist/vant-vtk.umd.js",
@@ -9,13 +9,25 @@
9
9
  "exports": {
10
10
  ".": {
11
11
  "import": "./dist/vant-vtk.es.js",
12
- "require": "./dist/vant-vtk.umd.js"
12
+ "require": "./dist/vant-vtk.umd.js",
13
+ "types": "./types/index.d.ts"
13
14
  },
14
- "./es": "./dist/vant-vtk.es.js",
15
- "./lib": "./dist/vant-vtk.umd.js",
16
- "./es/*": "./dist/es/*",
17
- "./lib/*": "./dist/lib/*",
18
- "./dist/style.css": "./dist/style.css"
15
+ "./es": {
16
+ "import": "./dist/es/index.js",
17
+ "types": "./types/index.d.ts"
18
+ },
19
+ "./lib": {
20
+ "require": "./dist/lib/index.js",
21
+ "types": "./types/index.d.ts"
22
+ },
23
+ "./es/*": {
24
+ "import": "./dist/es/*.js",
25
+ "types": "./types/index.d.ts"
26
+ },
27
+ "./lib/*": {
28
+ "require": "./dist/lib/*.js",
29
+ "types": "./types/index.d.ts"
30
+ }
19
31
  },
20
32
  "files": [
21
33
  "dist",
@@ -28,7 +40,7 @@
28
40
  "scripts": {
29
41
  "dev": "vite",
30
42
  "build": "vite build",
31
- "build:lib": "vite build --mode lib",
43
+ "build:lib": "vite build -c vite.config.lib.js",
32
44
  "preview": "vite preview"
33
45
  },
34
46
  "keywords": [
@@ -41,18 +53,23 @@
41
53
  "author": "",
42
54
  "license": "MIT",
43
55
  "peerDependencies": {
44
- "vue": "^3.2.0",
45
- "vant": "^4.0.0"
56
+ "vant": "^4.0.0",
57
+ "vue": "^3.2.0"
46
58
  },
47
59
  "devDependencies": {
48
60
  "@vitejs/plugin-vue": "^5.0.0",
61
+ "sass-embedded": "^1.97.3",
62
+ "vant": "^4.8.0",
49
63
  "vite": "^5.0.0",
50
- "vue": "^3.4.0",
51
- "vant": "^4.8.0"
64
+ "vite-plugin-css-injected-by-js": "^3.5.2",
65
+ "vue": "^3.4.0"
52
66
  },
53
67
  "repository": {
54
68
  "type": "git",
55
69
  "url": ""
56
70
  },
57
- "homepage": ""
71
+ "homepage": "",
72
+ "dependencies": {
73
+ "vue-pdf-embed": "^2.1.4"
74
+ }
58
75
  }
package/types/index.d.ts CHANGED
@@ -5,22 +5,81 @@ export interface OptionItem {
5
5
  text: string
6
6
  }
7
7
 
8
- export interface CheckboxFieldProps {
8
+ export interface CheckboxProps {
9
9
  modelValue?: string | any[] | object
10
10
  options?: OptionItem[] | string
11
11
  valueType?: 'string' | 'array' | 'object'
12
12
  separator?: string
13
13
  }
14
14
 
15
- export type CheckboxFieldInstance = DefineComponent<CheckboxFieldProps>
15
+ export interface AreaProps {
16
+ modelValue?: string | number
17
+ options?: OptionItem[] | string
18
+ title?: string
19
+ }
20
+
21
+ export interface RadioProps {
22
+ modelValue?: string | number | object
23
+ options?: OptionItem[] | string
24
+ valueType?: 'string' | 'object'
25
+ }
26
+
27
+ export interface UploaderProps {
28
+ modelValue?: string | any[]
29
+ valueType?: 'string' | 'array'
30
+ maxSize?: number
31
+ accept?: string
32
+ uploadUrl?: string
33
+ fieldName?: string
34
+ }
35
+
36
+ export interface PreviewProps {
37
+ modelValue?: boolean
38
+ pdfFile?: {
39
+ name?: string
40
+ url: string
41
+ }
42
+ }
43
+
44
+ export interface UploaderInstance {
45
+ getUrls: () => string[]
46
+ clear: () => void
47
+ getFileList: () => any[]
48
+ }
49
+
50
+ export type CheckboxInstance = DefineComponent<CheckboxProps>
51
+ export type AreaInstance = DefineComponent<AreaProps>
52
+ export type RadioInstance = DefineComponent<RadioProps>
53
+ export type UploaderInstanceComponent = DefineComponent<UploaderProps> & UploaderInstance
54
+ export type PreviewInstance = DefineComponent<PreviewProps>
55
+
56
+ export declare const Checkbox: CheckboxInstance & {
57
+ install: (app: App) => void
58
+ }
59
+
60
+ export declare const Area: AreaInstance & {
61
+ install: (app: App) => void
62
+ }
63
+
64
+ export declare const Radio: RadioInstance & {
65
+ install: (app: App) => void
66
+ }
67
+
68
+ export declare const Uploader: UploaderInstanceComponent & {
69
+ install: (app: App) => void
70
+ }
16
71
 
17
- export declare const CheckboxField: CheckboxFieldInstance & {
72
+ export declare const Preview: PreviewInstance & {
18
73
  install: (app: App) => void
19
74
  }
20
75
 
21
76
  declare const VantVtk: {
22
77
  install: (app: App) => void
23
- CheckboxField: typeof CheckboxField
78
+ Checkbox: typeof Checkbox
79
+ Area: typeof Area
80
+ Radio: typeof Radio
81
+ Uploader: typeof Uploader
82
+ Preview: typeof Preview
24
83
  }
25
84
 
26
85
  export default VantVtk