From 7dceefc55e543b2e91f1b6c44a1309cd7243cf84 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Mon, 31 Aug 2026 12:07:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(client):=20=E4=BB=B7=E7=AD=BE=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E6=A8=A1=E6=9D=BF=E5=93=81=E5=90=8D=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=20+=20=E4=BA=8C=E7=BB=B4=E7=A0=81=E6=94=BE?= =?UTF-8?q?=E5=A4=A7=E7=95=99=E5=B0=8F=E8=BE=B9=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 默认模板改为代码只读基准:readLabelTemplates 加载时强制用 builtinDefault() 覆盖 builtin-default 项,忽略存储里的旧脏几何 (旧默认品名被关/旧 QR 坐标等一律自愈回代码基准) - 二维码放大 x198/y44/尺寸96 → x192/y32/尺寸120,四周留 ~1mm 小边框 - 原型 label-template-editor.html 高级 QR 输入同步;golden 重生 - 新增存储测试钉死「内置默认永远回代码基准」 原型与代码同提交(design-first 双边一致) --- client/lib/core/utils/label_bitmap.dart | 14 +- client/lib/core/utils/label_template.dart | 39 ++++- .../devices/label_template_editor_screen.dart | 162 +++++++++++++++--- .../golden/goldens/label_render_default.png | Bin 39264 -> 39064 bytes client/test/label_template_storage_test.dart | 64 +++++++ design/prototype/screens/icons.js | 2 +- .../screens/label-template-editor.html | 83 +++++++-- web/_includes/icons.njk | 2 +- 8 files changed, 312 insertions(+), 54 deletions(-) diff --git a/client/lib/core/utils/label_bitmap.dart b/client/lib/core/utils/label_bitmap.dart index 437f127..140ac78 100644 --- a/client/lib/core/utils/label_bitmap.dart +++ b/client/lib/core/utils/label_bitmap.dart @@ -54,7 +54,8 @@ Future renderLabelImage({ lay.headerFontSize, w - 2 * lay.headerTextX, bold: lay.headerBold, textAlign: _uiAlign(lay.headerAlign), - color: cCream); + color: cCream, + centerInH: lay.headerHeight); // 店名在深蓝带内上下居中(textY 作微调) } // ── 右列二维码(正方形,绝对坐标)───────────────────────────── @@ -127,12 +128,15 @@ Future renderLabelPngBytes({ return bd?.buffer.asUint8List(); } -/// 在 canvas 上画一行文字(默认黑色,单行不换行,CJK 走系统字体回退) +/// 在 canvas 上画一行文字(默认黑色,单行不换行,CJK 走系统字体回退)。 +/// [centerInH] > 0 时:在 [y, y+centerInH] 区间内竖直居中(用紧排行高 1.0 量高后 +/// 上下留白均分),供抬头店名在深蓝带内上下居中;[y] 作为居中基础上的手动微调量。 void _drawText( ui.Canvas canvas, String s, double x, double y, double size, double maxW, {bool bold = false, ui.TextAlign textAlign = ui.TextAlign.left, - ui.Color color = const ui.Color(0xFF000000)}) // ds-ignore: 纸面固定色(默认黑) + ui.Color color = const ui.Color(0xFF000000), // ds-ignore: 纸面固定色(默认黑) + double centerInH = 0}) { if (s.isEmpty) return; final pb = ui.ParagraphBuilder(ui.ParagraphStyle( @@ -142,11 +146,13 @@ void _drawText( textAlign: textAlign, maxLines: 1, ellipsis: '', + height: centerInH > 0 ? 1.0 : null, // 居中时用紧排行高,量出的高≈字号,居中更准 )) ..pushStyle(ui.TextStyle(color: color)) // ds-ignore: 打印画布纸面固定色 ..addText(s); final p = pb.build()..layout(ui.ParagraphConstraints(width: maxW)); - canvas.drawParagraph(p, ui.Offset(x, y)); + final double dy = centerInH > 0 ? y + (centerInH - p.height) / 2 : y; + canvas.drawParagraph(p, ui.Offset(x, dy)); } /// 版式对齐 → 画布 TextAlign。 diff --git a/client/lib/core/utils/label_template.dart b/client/lib/core/utils/label_template.dart index d052ddb..c01de3a 100644 --- a/client/lib/core/utils/label_template.dart +++ b/client/lib/core/utils/label_template.dart @@ -147,7 +147,7 @@ class LabelHeader { this.show = true, this.height = 24, this.textX = 10, - this.textY = 4, + this.textY = 0, // 0=渲染器按 height 竖直居中;正负值作微调 this.fontSize = 14, this.bold = true, this.align = LabelAlign.left, @@ -167,7 +167,7 @@ class LabelHeader { show: j['show'] as bool? ?? true, height: (j['height'] as num?)?.toDouble() ?? 24, textX: (j['textX'] as num?)?.toDouble() ?? 10, - textY: (j['textY'] as num?)?.toDouble() ?? 4, + textY: (j['textY'] as num?)?.toDouble() ?? 0, fontSize: (j['fontSize'] as num?)?.toDouble() ?? 14, bold: j['bold'] as bool? ?? true, align: _alignFrom(j['align'] as String?), @@ -534,7 +534,7 @@ class LabelTemplate { show: true, height: 24, textX: 10, - textY: 4, + textY: 0, // 0=纯居中(渲染器按 height 竖直居中),正负值作微调 fontSize: 14, bold: true, align: LabelAlign.left), @@ -564,12 +564,41 @@ class LabelTemplate { align: LabelAlign.center), ], ), - qr: LabelQr(show: true, x: 178, y: 25, size: 134), + qr: LabelQr(show: true, x: 192, y: 32, size: 120), // 放大占满右列,四周留 ~8px(≈1mm) 小边框;左距条码/文字(x≤172) 20px barcode: LabelBarcode(show: true, x: 8, y: 114, width: 164, height: 40), ); } +/// 历史内置默认的 QR 坐标签名(x/y/size)。加载老店铺模板时,凡 QR 恰好等于某个历史默认, +/// 自动升级为当前 [LabelTemplate.builtinDefault] 的居中坐标——老模板无需手动「重置」即可拿到 +/// 二维码居中+四周留白的新版式。用户手动挪过的 QR 不匹配任一签名,保持不动。 +const List> _legacyDefaultQrXYS = [ + [178, 25, 134], // 最初默认(贴头顶、无留白) + [190, 34, 116], // 中间一版(缩小但仍偏上) +]; + +/// 就地把匹配历史默认签名的 QR 升级到当前默认坐标;返回同一实例便于链式 map。 +LabelTemplate _migrateLegacyDefaults(LabelTemplate t) { + final q = t.qr; + for (final s in _legacyDefaultQrXYS) { + if (q.x == s[0] && q.y == s[1] && q.size == s[2]) { + final def = LabelTemplate.builtinDefault().qr; + q.x = def.x; + q.y = def.y; + q.size = def.size; + break; + } + } + return t; +} + +/// 内置默认模板是「代码真相 + 只读锁」:无论存储里存了什么旧版式(旧 QR、品名被关等), +/// 加载时一律用当前 [LabelTemplate.builtinDefault] 覆盖,保证默认永远是最新基准。 +/// 用户的定制一律走「复制」出来的副本(另一 id),不受影响。 +LabelTemplate _forceBuiltinDefaultFromCode(LabelTemplate t) => + t.id == 'builtin-default' ? LabelTemplate.builtinDefault() : t; + /// 从 shop.custom_fields 读取店级模板列表;为空/损坏时回退单个 [LabelTemplate.builtinDefault]。 List readLabelTemplates(Map cf) { final raw = cf['label_templates']; @@ -577,6 +606,8 @@ List readLabelTemplates(Map cf) { final list = raw .whereType() .map((m) => LabelTemplate.fromJson(m.cast())) + .map(_migrateLegacyDefaults) + .map(_forceBuiltinDefaultFromCode) .toList(); if (list.isNotEmpty) return list; } diff --git a/client/lib/screens/devices/label_template_editor_screen.dart b/client/lib/screens/devices/label_template_editor_screen.dart index 1848882..5f042dc 100644 --- a/client/lib/screens/devices/label_template_editor_screen.dart +++ b/client/lib/screens/devices/label_template_editor_screen.dart @@ -41,8 +41,6 @@ class LabelTemplateEditorScreen extends ConsumerStatefulWidget { const List> _lineGroups = [ [LabelBinding.code, LabelBinding.series], // 行 0 [LabelBinding.spec, LabelBinding.productionDate], // 行 1 - [LabelBinding.batchNo], // 行 2 - [LabelBinding.remark], // 行 3 ]; enum _FKind { name, header, sub, qr, barcode } @@ -64,8 +62,6 @@ const List<_Fd> _fields = [ _Fd('spec', '版本 / 规格', _FKind.sub, line: 1, binding: LabelBinding.spec), _Fd('date', '生产日期', _FKind.sub, line: 1, binding: LabelBinding.productionDate), - _Fd('batch', '批次号', _FKind.sub, line: 2, binding: LabelBinding.batchNo), - _Fd('remark', '备注', _FKind.sub, line: 3, binding: LabelBinding.remark), _Fd('qr', '二维码', _FKind.qr), _Fd('barcode', '条形码', _FKind.barcode), ]; @@ -93,9 +89,15 @@ class _LabelTemplateEditorScreenState final Map _ctrls = {}; final TextEditingController _sizeCtrl = TextEditingController(); + /// 系统自带的默认模板 id(受保护基准版式)。 + static const String _builtinDefaultId = 'builtin-default'; + LabelTemplate get _t => _templates.firstWhere((t) => t.id == _editingId, orElse: () => _templates.first); + /// 默认模板只读:字段/字号/位置/打印参数一律不可改,要改必须先「复制」。 + bool get _isLocked => _t.id == _builtinDefaultId; + @override void initState() { super.initState(); @@ -179,21 +181,49 @@ class _LabelTemplateEditorScreenState } /// 预览/打印共用的示例数据(QR 已在 bootstrap 生成)。 + /// 预览示例的默认内容(仅用于左侧预览;真实出签永远取商品真实数据)。 + String _sampleDefault(String key) { + switch (key) { + case 'name': + return '贵州茅台酒'; + case 'code': + return 'P1001'; + case 'series': + return '飞天53度'; + case 'spec': + return '500ml'; + case 'date': + return '2024-05-18'; + case 'shop': + return ref.read(shopInfoProvider).valueOrNull?.name ?? '鼎晟酒行'; + } + return ''; + } + + /// 字段内容编辑框的控制器(复用 [_ctrls] 池,`sample/` 命名空间,随店级预览而非模板)。 + TextEditingController _contentCtrl(_Fd fd) => _ctrls.putIfAbsent( + 'sample/${fd.key}', + () => TextEditingController(text: _sampleDefault(fd.key))); + + /// 当前预览示例取值:编辑框非空用编辑框,否则回默认。 + String _sampleOf(String key) { + final v = _ctrls['sample/$key']?.text.trim() ?? ''; + return v.isNotEmpty ? v : _sampleDefault(key); + } + LabelData? _sampleLabel() { final qr = _qrBytes; if (qr == null) return null; - final shopName = - ref.read(shopInfoProvider).valueOrNull?.name ?? '鼎晟酒行'; return LabelData( qrBytes: qr, - name: '贵州茅台酒', - code: 'P1001', - series: '飞天53度', - spec: '500ml', - productionDate: '2024-05-18', + name: _sampleOf('name'), + code: _sampleOf('code'), + series: _sampleOf('series'), + spec: _sampleOf('spec'), + productionDate: _sampleOf('date'), batchNo: '20240518-01', remark: '整箱现货', - shopName: shopName, + shopName: _sampleOf('shop'), ); } @@ -282,6 +312,13 @@ class _LabelTemplateEditorScreenState _t.textStack.name.fontSize = v ? null : _t.textStack.name.fontMax; }); + /// 步进器 +1/-1:夹在 [6,48],回写模型与输入框(同原型 stepSize)。 + void _stepSize(_Fd fd, int d) { + final n = (_sizeOf(fd).round() + d).clamp(6, 48); + _setSize(fd, n.toDouble()); + _sizeCtrl.text = n.toString(); + } + bool _boldOf(_Fd fd) => switch (fd.kind) { _FKind.name => _t.textStack.name.bold, _FKind.header => _t.header.bold, @@ -531,7 +568,9 @@ class _LabelTemplateEditorScreenState style: TextStyle(fontSize: AppDims.fsSm, color: t.muted)), ), const Spacer(), - DsButton('重置', icon: LucideIcons.refreshCw, onPressed: _reset), + DsButton('重置', + icon: LucideIcons.refreshCw, + onPressed: _isLocked ? null : _reset), const SizedBox(width: 10), DsButton('打印', icon: LucideIcons.printer, onPressed: _print), const SizedBox(width: 10), @@ -681,6 +720,10 @@ class _LabelTemplateEditorScreenState ], onChanged: _switchEditing, ), + if (_isLocked) ...[ + const SizedBox(height: 10), + _lockNote(t), + ], const SizedBox(height: 10), Wrap( spacing: 8, @@ -695,7 +738,7 @@ class _LabelTemplateEditorScreenState DsButton('重命名', icon: LucideIcons.pencil, small: true, - onPressed: _renameTemplate), + onPressed: _isLocked ? null : _renameTemplate), DsButton('设默认', icon: LucideIcons.check, small: true, @@ -704,7 +747,7 @@ class _LabelTemplateEditorScreenState icon: LucideIcons.x, small: true, variant: DsBtnVariant.danger, - onPressed: _deleteTemplate), + onPressed: _isLocked ? null : _deleteTemplate), ], ), const SizedBox(height: 12), @@ -736,6 +779,19 @@ class _LabelTemplateEditorScreenState ); } + /// 默认模板只读提示条(点「复制」是可编辑逃生口)。 + Widget _lockNote(AppTokens t) => Container( + padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10), + decoration: BoxDecoration( + color: t.warnBg, + borderRadius: BorderRadius.circular(AppDims.rMd), + border: Border.all(color: t.warn), + ), + child: Text('系统默认模板不可修改,点「复制」生成可编辑副本', + style: TextStyle( + fontSize: AppDims.fsXs, color: t.warn, height: 1.5)), + ); + Widget _fieldSection(AppTokens t) => _sectionCard( t, '显示字段', @@ -752,22 +808,25 @@ class _LabelTemplateEditorScreenState Widget _fieldRow(AppTokens t, _Fd fd) { final on = _onOf(fd); - final open = _openField == fd.key; + final open = !_isLocked && _openField == fd.key; final graphic = fd.kind == _FKind.qr || fd.kind == _FKind.barcode; return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ InkWell( borderRadius: BorderRadius.circular(AppDims.rMd), - onTap: () => setState(() { - if (open) { - _openField = null; - } else { - _openField = fd.key; - _sizeCtrl.text = - graphic || _isAuto(fd) ? '' : _sizeOf(fd).round().toString(); - } - }), + onTap: _isLocked + ? null + : () => setState(() { + if (open) { + _openField = null; + } else { + _openField = fd.key; + _sizeCtrl.text = graphic || _isAuto(fd) + ? '' + : _sizeOf(fd).round().toString(); + } + }), child: Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 9), decoration: BoxDecoration( @@ -776,7 +835,9 @@ class _LabelTemplateEditorScreenState ), child: Row( children: [ - DsSwitch(value: on, onChanged: (v) => _setOn(fd, v)), + DsSwitch( + value: on, + onChanged: _isLocked ? null : (v) => _setOn(fd, v)), const SizedBox(width: 10), Expanded( child: Text(fd.label, @@ -822,6 +883,27 @@ class _LabelTemplateEditorScreenState return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + // 内容(仅改左侧预览示例,真实打印永远取商品真实数据) + Row( + children: [ + SizedBox( + width: 44, + child: Text('内容', + style: TextStyle( + fontSize: AppDims.fsSm, color: t.muted))), + Expanded( + child: DsInput( + controller: _contentCtrl(fd), + onChanged: (_) => _scheduleRender(), + ), + ), + ], + ), + const SizedBox(height: 4), + Text('仅改预览示例,真实打印按商品数据填充', + style: TextStyle( + fontSize: AppDims.fsXs, color: t.muted, height: 1.6)), + const SizedBox(height: 12), // 字号(品名可切自动) Row( children: [ @@ -841,6 +923,7 @@ class _LabelTemplateEditorScreenState final n = int.tryParse(v.trim()); if (n != null && n > 0) _setSize(fd, n.toDouble()); }, + suffix: _sizeStepper(fd, t, auto), ), ), if (isName) ...[ @@ -889,6 +972,26 @@ class _LabelTemplateEditorScreenState ); } + /// 字号输入框右侧内嵌的上下箭头步进器(点击 +1/-1,同原型 .lt-steparr)。 + Widget _sizeStepper(_Fd fd, AppTokens t, bool auto) { + Widget arrow(IconData ic, int d) => InkWell( + onTap: auto ? null : () => _stepSize(fd, d), + child: SizedBox( + height: 15, + width: 18, + child: Icon(ic, size: 13, color: auto ? t.faint : t.muted), + ), + ); + return Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + arrow(LucideIcons.chevronUp, 1), + arrow(LucideIcons.chevronDown, -1), + ], + ); + } + // ── 高级 · 区域位置 ─────────────────────────────────────────────────── Widget _advancedSection(AppTokens t) { return Container( @@ -978,8 +1081,10 @@ class _LabelTemplateEditorScreenState DsSeg( items: const ['正向', '反向'], index: _t.print.direction == 0 ? 1 : 0, - onChanged: (i) => - _mutate(() => _t.print.direction = i == 0 ? 1 : 0), + onChanged: (i) { + if (_isLocked) return; + _mutate(() => _t.print.direction = i == 0 ? 1 : 0); + }, ), ], ), @@ -1016,6 +1121,7 @@ class _LabelTemplateEditorScreenState label, input: DsInput( controller: c, + enabled: !_isLocked, keyboardType: TextInputType.numberWithOptions(decimal: decimal), onChanged: (v) { final n = double.tryParse(v.trim()); diff --git a/client/test/golden/goldens/label_render_default.png b/client/test/golden/goldens/label_render_default.png index 9a276ee030c5c4fcac9b750ddb26649a455174c0..60bc78bf9dcb661eb13c9dd570526789576e941c 100644 GIT binary patch literal 39064 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 z zv_XRTm+tB&#eza3sCwQ#tO7%YdclZp!5Xrzf~pPV7pE1$B%-L~#8|C5%wQ9J!G{8l zAn4_}kL*xmAS@|9(i_r#`u6SHG63)hocGzA72$rSr8XlefKFl&HC_Z)QKShQB+svK zHoE9(jiJ9-vxX~FMn*;ywxJInKCnz4Kco=8WGNU{k$!f~ytsEfD~01^TzNI`0_eB` z1CbUQfsez^s587?@XC{0+4p_j-CUJ;-lF~N=ld(E zS}`~PW?%msHPJ&rP6{ROJoq`!P z(PV$(wa(}p78VvkFd+>1T*6Ef1#@#jCoNPSj5a$ zlgzpPj-10_RP>yBWuC`u0sm15)w?E+b`GK>N+6xXwJ)zmTuhBdvI61Xq7nA{sv%nRGN zq}OHzOXaR>jK6}%wI+5892X#FOM!R8G~!>j~$fd1K+5KL7Zhj{!rfnO|d_ryM!6x=W(TnD6m~l6UmGAZ_d|l zxTXy>>4}Mn3KlyJack)y<=Nr8WWW7b;2rkXc+>3Y=;-6gd_W-c)8w9G7ArU11eS=nvKjJAm=`T*^<|zQXXSp;^5VNbSZHB8VJ|Qdhit(Dpm@v z_-(9)#w%2)ar|rrYtxfEYhGb2Pt@eG1|Z{)Rqs6l_jWY}6^t@!Ez_ZM3gH-?`(%I!~(WHc_2M;QBJ?dQWZvShW?7OQvB54?~gFHkZO+?O5jSE zHf->NB;_Ocw>9%;0brkkm6m1K*%if;-OCM%{SwlFkCLVUr33?$h93@znAke-z-8Fh zwa=XGHd|B-jucPtzd#W)2fWKdt)3(!ad9AyZxt5S9?3)h#0?Hwq@$hPu1O=!XK^d9$HuNg7hxlfXB{aq^cqbhhz6?#WG5?NHNgym^^lz)tJpeB{p?-xXkL9`o3J3%hZDd9umi?!)4(4x z{VJ;d4m2k4>2PdvA7di!a3&V*n4OFNG`rQKZUaxsuh0v_(3UY2FVNzsAi_6R^@tNM zZiC|47@qfTCzML6mS1$DM*2vf!DI?va!ICZbO+cq8w~W?Y|(QyLBd6YwVQaSZ%8>b z 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 literal 39264 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 t.id), ['builtin-default', 'tpl-2']); expect(list[1].name, '双语抬头'); }); + + test('老店铺旧默认 QR 加载时自动升级为居中坐标', () { + final def = LabelTemplate.builtinDefault(); + // 构造两个历史默认签名的模板(贴头顶版 + 中间偏上版) + final legacyA = def.copyWith(id: 'tpl-legacy-a', name: '旧模板A'); + legacyA.qr + ..x = 178 + ..y = 25 + ..size = 134; + final legacyB = def.copyWith(id: 'tpl-legacy-b', name: '旧模板B'); + legacyB.qr + ..x = 190 + ..y = 34 + ..size = 116; + final cf = { + 'label_templates': [legacyA.toJson(), legacyB.toJson()], + }; + final list = readLabelTemplates(cf); + for (final t in list) { + expect(t.qr.x, def.qr.x, reason: '${t.name} QR.x 应升级到新默认'); + expect(t.qr.y, def.qr.y, reason: '${t.name} QR.y 应升级到新默认'); + expect(t.qr.size, def.qr.size, reason: '${t.name} QR.size 应升级到新默认'); + } + }); + + test('内置默认模板永远回代码基准:存储里被改脏也覆盖回 builtinDefault', () { + final def = LabelTemplate.builtinDefault(); + // 模拟老库存的 builtin-default:品名被关、QR 乱改、字号乱改 + final stale = def.copyWith(); + stale.textStack.name.show = false; + stale.qr + ..x = 10 + ..y = 10 + ..size = 200; + stale.textStack.subLines[0].fontSize = 99; + final cf = { + 'label_templates': [stale.toJson()], + }; + final t = + readLabelTemplates(cf).firstWhere((x) => x.id == 'builtin-default'); + expect(t.textStack.name.show, isTrue, reason: '品名默认必须展示'); + expect(t.qr.x, def.qr.x); + expect(t.qr.y, def.qr.y); + expect(t.qr.size, def.qr.size); + expect(t.textStack.subLines[0].fontSize, def.textStack.subLines[0].fontSize); + }); + + test('用户自定义过的 QR 不匹配旧签名,加载时保持不动', () { + final custom = LabelTemplate.builtinDefault().copyWith( + id: 'tpl-custom', + name: '自定义位置', + ); + custom.qr + ..x = 210 + ..y = 60 + ..size = 80; // 与任一历史默认都不同 + final cf = { + 'label_templates': [custom.toJson()], + }; + final t = readLabelTemplates(cf).first; + expect(t.qr.x, 210); + expect(t.qr.y, 60); + expect(t.qr.size, 80); + }); }); } diff --git a/design/prototype/screens/icons.js b/design/prototype/screens/icons.js index c579cd9..8b2256e 100644 --- a/design/prototype/screens/icons.js +++ b/design/prototype/screens/icons.js @@ -2,7 +2,7 @@ // 所有屏用 引用;改此处一个 symbol,全局生效。 // 共 108 个:100 个源自 lucide-static(含 i-printer),i-info/i-alert 为点改实心圆的清晰变体,,另有平台品牌图标 i-apple / i-android(simple-icons,填充式,path 自带 fill 覆盖描边样式)与 i-tablet-smartphone(lucide)。新增图标先在此登记 symbol,再用 use 引用。 (function(){ - var SPRITE=''; + var SPRITE=''; function inject(){ if(document.getElementById('ym-icon-sprite'))return; var d=document.createElement('div'); d.id='ym-icon-sprite'; d.style.cssText='position:absolute;width:0;height:0'; d.innerHTML=SPRITE; document.body.insertBefore(d,document.body.firstChild); } if(document.readyState!=='loading')inject(); else document.addEventListener('DOMContentLoaded',inject); // ---- 徽章图标化(2026-07-04 拍板:全系统圆点→代表图标)---- diff --git a/design/prototype/screens/label-template-editor.html b/design/prototype/screens/label-template-editor.html index 300645d..a2dc1e8 100644 --- a/design/prototype/screens/label-template-editor.html +++ b/design/prototype/screens/label-template-editor.html @@ -77,6 +77,17 @@ .lt-srow:last-child{margin-bottom:0;} .lt-srow .k{width:44px; flex:none; font-size:var(--fs-sm); color:var(--muted);} .lt-srow .input{width:80px;} + /* 字号步进器:输入框右侧内嵌上下箭头,点击 +1/-1 */ + .lt-stepper{position:relative; width:80px; flex:none;} + .lt-stepper .input{width:100%; box-sizing:border-box; padding-right:22px;} + .lt-steparr{position:absolute; right:1px; top:1px; bottom:1px; width:20px; + display:flex; flex-direction:column; border-left:1px solid var(--border);} + .lt-steparr button{flex:1; display:flex; align-items:center; justify-content:center; + border:0; background:transparent; cursor:pointer; color:var(--muted); padding:0;} + .lt-steparr button:hover{background:var(--row-hover); color:var(--text);} + .lt-steparr button:last-child{border-top:1px solid var(--border);} + .lt-steparr button:disabled{opacity:.4; cursor:default; background:transparent; color:var(--muted);} + .lt-steparr svg{width:11px; height:11px; stroke:currentColor; fill:none; stroke-width:2.5;} .lt-gnote{margin:0; font-size:var(--fs-xs); color:var(--muted); line-height:1.6;} /* 字体下拉(自包含浮层,每行独立) */ .lt-fontsel{position:relative; flex:1;} @@ -92,6 +103,11 @@ .lt-tplhint{display:flex; align-items:center; gap:6px; margin-top:12px; padding-top:12px; border-top:1px solid var(--border); font-size:var(--fs-xs); color:var(--muted);} .lt-tplhint svg{width:14px; height:14px; flex:none; stroke:currentColor; fill:none; stroke-width:2; color:var(--primary);} .lt-tplhint b{color:var(--primary); font-weight:600;} + /* 默认模板只读锁:提示条 + 受锁区域整体禁用(点「复制」为可编辑逃生口) */ + .lt-locknote{margin-top:10px; padding:10px 12px; background:var(--warn-bg); border:1px solid var(--warn); border-radius:var(--r-md); font-size:var(--fs-xs); color:var(--warn); line-height:1.5;} + .lt-lockoff{transition:opacity .15s;} + .dis{opacity:.45; pointer-events:none;} + .lt-panel.locked #fieldList, .lt-panel.locked .lt-adv, .lt-panel.locked #printSec{opacity:.5; pointer-events:none;} /* 高级折叠 */ .lt-adv{background:var(--surface); border:1px solid var(--border); border-radius:var(--r-lg); overflow:hidden;} .lt-adv>summary{list-style:none; cursor:pointer; padding:14px 16px; font-size:var(--fs-sm); font-weight:700; color:var(--title); display:flex; align-items:center; gap:8px;} @@ -116,7 +132,7 @@
返回

标签模板编辑器

左侧实时预览 · 右侧属性面板
-
重置
+
重置
打印
保存
@@ -167,10 +183,11 @@
新建
复制
-
重命名
+
重命名
设默认
-
删除
+
删除
+
系统默认模板不可修改,点「复制」生成可编辑副本
出签打印使用:默认版式
@@ -186,9 +203,9 @@
二维码
-
-
-
+
+
+
条形码
@@ -205,7 +222,7 @@ -
+
打印参数
@@ -249,14 +266,12 @@ // 字体不做(热敏单色 MVP);仅「品名」支持自动字号。同物理行两字段共用字号/加粗/对齐(PAIR)。 const ALIGN_LABEL = {left:'左', center:'居中', right:'右'}; const FIELDS = [ - {f:'name', label:'品名', type:'text', on:true, auto:true, bold:true, align:'center', size:18}, - {f:'shop', label:'店名(抬头)', type:'text', on:true, auto:false, bold:true, align:'center', size:14}, - {f:'code', label:'编号', type:'text', on:true, auto:false, bold:false, align:'center', size:14}, - {f:'series', label:'型号 / 度数', type:'text', on:true, auto:false, bold:false, align:'center', size:14}, - {f:'spec', label:'版本 / 规格', type:'text', on:true, auto:false, bold:false, align:'center', size:14}, - {f:'date', label:'生产日期', type:'text', on:true, auto:false, bold:false, align:'center', size:14}, - {f:'batch', label:'批次号', type:'text', on:false, auto:false, bold:false, align:'center', size:14}, - {f:'remark', label:'备注', type:'text', on:false, auto:false, bold:false, align:'center', size:14}, + {f:'name', label:'品名', type:'text', on:true, auto:true, bold:true, align:'center', size:18, sample:'贵州茅台酒'}, + {f:'shop', label:'店名(抬头)', type:'text', on:true, auto:false, bold:true, align:'center', size:14, sample:'鼎晟酒行'}, + {f:'code', label:'编号', type:'text', on:true, auto:false, bold:false, align:'center', size:14, sample:'P1001'}, + {f:'series', label:'型号 / 度数', type:'text', on:true, auto:false, bold:false, align:'center', size:14, sample:'飞天53度'}, + {f:'spec', label:'版本 / 规格', type:'text', on:true, auto:false, bold:false, align:'center', size:14, sample:'500ml'}, + {f:'date', label:'生产日期', type:'text', on:true, auto:false, bold:false, align:'center', size:14, sample:'2024-05-18'}, {f:'qr', label:'二维码', type:'graphic', on:true}, {f:'barcode', label:'条形码', type:'graphic', on:true}, ]; @@ -276,8 +291,17 @@ ` : ''; return `
+
内容 +
+

仅改预览示例,真实打印按商品数据填充

字号 - +
+ +
+ + +
+
${autoCtrl}
加粗
@@ -347,11 +371,27 @@ const n = parseInt(v,10); if(!isNaN(n)){ FIELDS[i].size = n; applyStyle(i); refreshMeta(i); mirror(i); } } + /* 内容:仅改左侧预览示例文字,不影响真实打印(真实出签永远取商品数据) */ + function setSample(i, v){ + FIELDS[i].sample = v; + previewEls(i).forEach(el=>{ el.textContent = v; }); + } + /* 步进器 +1/-1:夹在 [6,48],回写输入框并刷新预览 */ + function stepSize(i, d){ + if(FIELDS[i].auto) return; + let n = parseInt(FIELDS[i].size,10); if(isNaN(n)) n = 14; + n = Math.max(6, Math.min(48, n + d)); + FIELDS[i].size = n; + const inp = fieldEl(i).querySelector('.lt-stepper .input'); + if(inp) inp.value = n; + applyStyle(i); refreshMeta(i); mirror(i); + } function toggleAuto(e, i){ e.stopPropagation(); FIELDS[i].auto = !FIELDS[i].auto; e.currentTarget.classList.toggle('on', FIELDS[i].auto); fieldEl(i).querySelector('.lt-srow .input').disabled = FIELDS[i].auto; + fieldEl(i).querySelectorAll('.lt-steparr button').forEach(b=>b.disabled = FIELDS[i].auto); applyStyle(i); refreshMeta(i); } function toggleBold(e, i){ @@ -402,8 +442,18 @@ document.getElementById('renameInput').value = name; document.getElementById('tplPop').classList.remove('show'); renderTplPop(); + applyLock(); toast('正在编辑「'+name+'」'); } + /* 默认模板('默认版式')受保护只读:显示锁提示、禁用字段/高级/打印/重命名/删除/重置, + 其余(下拉/新建/复制/设默认)保持可用;点「复制」生成可编辑副本 */ + function isLockedTpl(){ return tplEditing === '默认版式'; } + function applyLock(){ + const on = isLockedTpl(); + document.getElementById('lockNote').style.display = on ? '' : 'none'; + document.querySelector('.lt-panel').classList.toggle('locked', on); + document.querySelectorAll('.lt-lockoff').forEach(b=>b.classList.toggle('dis', on)); + } function setDefaultTpl(){ tplActive = tplEditing; document.getElementById('tplActive').textContent = tplActive; @@ -413,6 +463,7 @@ renderTplPop(); document.addEventListener('click', ()=>document.querySelectorAll('.lt-fontpop.show').forEach(p=>p.classList.remove('show'))); renderFields(); + applyLock(); function openRename(){ document.getElementById('ovRename').classList.add('show'); } function closeRename(){ document.getElementById('ovRename').classList.remove('show'); } function doRename(){ closeRename(); toast('已重命名 ✓'); } diff --git a/web/_includes/icons.njk b/web/_includes/icons.njk index 25c1b81..e681fc5 100644 --- a/web/_includes/icons.njk +++ b/web/_includes/icons.njk @@ -1,3 +1,3 @@ {# 图标雪碧图 — 单一真相源:自 design/prototype/screens/icons.js 提取(lucide 同源), 页面用 引用;修改图标请先改原型再同步 #} - +