@qynpm/ui 1.0.8 → 1.0.11

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.
Files changed (102) hide show
  1. package/README.md +508 -47
  2. package/dist/index.cjs +2 -2
  3. package/dist/index.mjs +30 -20
  4. package/dist/qy-action-bar/index.cjs +1 -1
  5. package/dist/qy-action-bar/index.mjs +1 -1
  6. package/dist/{qy-voucher-upload → qy-autocomplete}/index.cjs +1 -1
  7. package/dist/qy-autocomplete/index.mjs +4 -0
  8. package/dist/qy-checkbox/index.cjs +1 -0
  9. package/dist/qy-checkbox/index.mjs +4 -0
  10. package/dist/qy-date-picker/index.cjs +1 -1
  11. package/dist/qy-date-picker/index.mjs +2 -2
  12. package/dist/qy-dialog/index.cjs +1 -1
  13. package/dist/qy-dialog/index.mjs +2 -2
  14. package/dist/qy-form-section/index.cjs +1 -1
  15. package/dist/qy-form-section/index.mjs +1 -1
  16. package/dist/qy-image/index.cjs +1 -0
  17. package/dist/qy-image/index.mjs +4 -0
  18. package/dist/qy-image-preview/index.cjs +1 -0
  19. package/dist/qy-image-preview/index.mjs +5 -0
  20. package/dist/qy-image-upload/index.cjs +1 -0
  21. package/dist/qy-image-upload/index.mjs +4 -0
  22. package/dist/qy-input/index.cjs +1 -1
  23. package/dist/qy-input/index.mjs +1 -1
  24. package/dist/qy-input-number/index.cjs +1 -1
  25. package/dist/qy-input-number/index.mjs +2 -2
  26. package/dist/qy-legacy-selection-dialog/index.cjs +1 -0
  27. package/dist/qy-legacy-selection-dialog/index.mjs +4 -0
  28. package/dist/qy-menu-actions/index.cjs +1 -0
  29. package/dist/qy-menu-actions/index.mjs +7 -0
  30. package/dist/qy-money-input/index.cjs +1 -1
  31. package/dist/qy-money-input/index.mjs +1 -1
  32. package/dist/qy-radio-group/index.cjs +1 -1
  33. package/dist/qy-radio-group/index.mjs +1 -1
  34. package/dist/qy-record-quote-search/index.cjs +1 -1
  35. package/dist/qy-record-quote-search/index.mjs +2 -2
  36. package/dist/qy-remark-image/index.cjs +1 -1
  37. package/dist/qy-remark-image/index.mjs +1 -1
  38. package/dist/qy-remote-select/index.cjs +1 -1
  39. package/dist/qy-remote-select/index.mjs +1 -1
  40. package/dist/qy-search-input/index.cjs +1 -1
  41. package/dist/qy-search-input/index.mjs +2 -2
  42. package/dist/qy-select/index.cjs +1 -1
  43. package/dist/qy-select/index.mjs +1 -1
  44. package/dist/qy-selection-dialog/index.cjs +1 -0
  45. package/dist/qy-selection-dialog/index.mjs +4 -0
  46. package/dist/qy-table-column-settings/index.cjs +1 -0
  47. package/dist/qy-table-column-settings/index.mjs +10 -0
  48. package/dist/qy-tree-select/index.cjs +1 -0
  49. package/dist/qy-tree-select/index.mjs +4 -0
  50. package/dist/qy-upload/index.cjs +1 -1
  51. package/dist/qy-upload/index.mjs +1 -1
  52. package/dist/shared/index-B1BqPX66.cjs +1 -0
  53. package/dist/shared/index-BCxeV3b1.mjs +219 -0
  54. package/dist/shared/index-BZaLAQWR.mjs +106 -0
  55. package/dist/shared/index-Cy8BKei3.cjs +1 -0
  56. package/dist/shared/index-D5Hges_w.cjs +1 -0
  57. package/dist/shared/index-DAHl11pF.mjs +4301 -0
  58. package/dist/shared/install-DMq9RQ-h.mjs +15 -0
  59. package/dist/shared/install-DNgKRKb2.cjs +1 -0
  60. package/index.d.ts +51 -25
  61. package/package.json +61 -6
  62. package/qy-action-bar/index.js +1 -1
  63. package/qy-autocomplete/index.d.ts +5 -0
  64. package/qy-autocomplete/index.js +1 -0
  65. package/qy-checkbox/index.d.ts +5 -0
  66. package/qy-checkbox/index.js +1 -0
  67. package/qy-date-picker/index.d.ts +5 -5
  68. package/qy-date-picker/index.js +1 -1
  69. package/qy-dialog/index.js +1 -1
  70. package/qy-form-section/index.js +1 -1
  71. package/qy-image/index.d.ts +28 -0
  72. package/qy-image/index.js +1 -0
  73. package/qy-image-preview/index.d.ts +20 -0
  74. package/qy-image-preview/index.js +1 -0
  75. package/qy-image-upload/index.d.ts +12 -0
  76. package/qy-image-upload/index.js +1 -0
  77. package/qy-input/index.js +1 -1
  78. package/qy-input-number/index.d.ts +5 -5
  79. package/qy-input-number/index.js +1 -1
  80. package/qy-legacy-selection-dialog/index.d.ts +5 -0
  81. package/qy-legacy-selection-dialog/index.js +1 -0
  82. package/qy-menu-actions/index.d.ts +29 -0
  83. package/qy-menu-actions/index.js +7 -0
  84. package/qy-money-input/index.js +1 -1
  85. package/qy-radio-group/index.js +1 -1
  86. package/qy-record-quote-search/index.js +1 -1
  87. package/qy-remark-image/index.js +1 -1
  88. package/qy-remote-select/index.js +1 -1
  89. package/qy-search-input/index.js +1 -1
  90. package/qy-select/index.js +1 -1
  91. package/qy-selection-dialog/index.d.ts +5 -0
  92. package/qy-selection-dialog/index.js +1 -0
  93. package/qy-table-column-settings/index.d.ts +18 -0
  94. package/qy-table-column-settings/index.js +10 -0
  95. package/qy-tree-select/index.d.ts +5 -0
  96. package/qy-tree-select/index.js +1 -0
  97. package/qy-upload/index.js +1 -1
  98. package/dist/qy-voucher-upload/index.mjs +0 -4
  99. package/dist/shared/index-C5EAafC0.cjs +0 -1
  100. package/dist/shared/index-DB0Fuuxi.mjs +0 -2784
  101. package/qy-voucher-upload/index.d.ts +0 -12
  102. package/qy-voucher-upload/index.js +0 -1
package/README.md CHANGED
@@ -1,8 +1,10 @@
1
1
  # @qynpm/ui
2
2
 
3
- 起印体系内抽离出来的 Vue 3 UI 组件包,当前主要包含基础输入组件、选择器组件、区块容器、底部操作栏,以及上传、弹窗、备注图文等通用能力。
4
-
5
- ## 安装
3
+ 起印体系内抽离出来的 Vue 3 UI 组件包,当前主要包含基础输入组件、选择器组件、区块容器、底部操作栏,以及上传、弹窗、备注图文等通用能力。
4
+
5
+ 录单拆包的 transform 实际代码盘点见 [录单拆包迁移总览](../record-order-migration.md)。其中记录了 `QyImagePreview`、凭证上传模式、设计文件管理等后续 UI 缺口。`QyRichTextEditor` 属于录单追加信息的独立业务组件,不进入当前全局 UI 基础包。
6
+
7
+ ## 安装
6
8
 
7
9
  ```bash
8
10
  pnpm add @qynpm/ui
@@ -32,16 +34,26 @@ app.use(QyUI)
32
34
  也可以按需引入:
33
35
 
34
36
  ```ts
35
- import {
36
- QyUpload,
37
- QyVoucherUpload,
37
+ import {
38
+ QyUpload,
39
+ QyImage,
40
+ QyImagePreview,
41
+ QyImageUpload,
38
42
  QyDialog,
39
43
  QyRemarkImage,
40
44
  QyInput,
41
- QyMoneyInput,
42
- QyRadioGroup,
43
- QySelect,
44
- QyRemoteSelect,
45
+ QyInputNumber,
46
+ QyMoneyInput,
47
+ QyDatePicker,
48
+ QyCheckbox,
49
+ QyAutocomplete,
50
+ QyMenuActions,
51
+ QyTableColumnSettings,
52
+ QyRadioGroup,
53
+ QySelect,
54
+ QyTreeSelect,
55
+ QyRemoteSelect,
56
+ QySelectionDialog,
45
57
  QyFormSection,
46
58
  QyActionBar,
47
59
  QySearchInput,
@@ -54,20 +66,30 @@ import {
54
66
  ```ts
55
67
  import QyInput from '@qynpm/ui/qy-input'
56
68
  import QyMoneyInput from '@qynpm/ui/qy-money-input'
57
- import QyRadioGroup from '@qynpm/ui/qy-radio-group'
58
- import QySelect from '@qynpm/ui/qy-select'
59
- import QyRemoteSelect from '@qynpm/ui/qy-remote-select'
69
+ import QyRadioGroup from '@qynpm/ui/qy-radio-group'
70
+ import QySelect from '@qynpm/ui/qy-select'
71
+ import QyTreeSelect from '@qynpm/ui/qy-tree-select'
72
+ import QyRemoteSelect from '@qynpm/ui/qy-remote-select'
73
+ import QySelectionDialog from '@qynpm/ui/qy-selection-dialog'
60
74
  import QyFormSection from '@qynpm/ui/qy-form-section'
61
75
  import QyActionBar from '@qynpm/ui/qy-action-bar'
62
76
  import QySearchInput from '@qynpm/ui/qy-search-input'
63
77
  import QyRecordQuoteSearch from '@qynpm/ui/qy-record-quote-search'
64
- import QyDialog from '@qynpm/ui/qy-dialog'
65
- import QyUpload from '@qynpm/ui/qy-upload'
66
- import QyVoucherUpload from '@qynpm/ui/qy-voucher-upload'
78
+ import QyDialog from '@qynpm/ui/qy-dialog'
79
+ import QyUpload from '@qynpm/ui/qy-upload'
80
+ import QyImage from '@qynpm/ui/qy-image'
81
+ import QyImagePreview from '@qynpm/ui/qy-image-preview'
82
+ import QyImageUpload from '@qynpm/ui/qy-image-upload'
67
83
  import QyRemarkImage from '@qynpm/ui/qy-remark-image'
68
- ```
69
-
70
- ## 组件说明
84
+ import QyInputNumber from '@qynpm/ui/qy-input-number'
85
+ import QyDatePicker from '@qynpm/ui/qy-date-picker'
86
+ import QyCheckbox from '@qynpm/ui/qy-checkbox'
87
+ import QyAutocomplete from '@qynpm/ui/qy-autocomplete'
88
+ import QyMenuActions from '@qynpm/ui/qy-menu-actions'
89
+ import QyTableColumnSettings from '@qynpm/ui/qy-table-column-settings'
90
+ ```
91
+
92
+ ## 组件说明
71
93
 
72
94
  ### `QyUpload`
73
95
 
@@ -88,12 +110,14 @@ import QyRemarkImage from '@qynpm/ui/qy-remark-image'
88
110
  - `api`
89
111
  - `tokenKey`
90
112
  - `name`
113
+ - `uploadRequest`
91
114
 
92
115
  其中:
93
116
 
94
117
  - `api` 为必填
95
118
  - `tokenKey` 不传时默认使用 `Admin-Token`
96
119
  - `name` 不传时默认使用 `file`
120
+ - `uploadRequest` 可接入宿主项目自己的 request、baseURL、鉴权和错误处理;不传时使用组件默认 XHR 上传
97
121
 
98
122
  值协议:
99
123
 
@@ -103,22 +127,153 @@ import QyRemarkImage from '@qynpm/ui/qy-remark-image'
103
127
  - `showText=false` 可隐藏文字备注区;如仍需粘贴入口,可开启 `showPasteInput`
104
128
  - `defaultValue` 仍保留给老页面做非受控初始化;新页面建议优先使用 `v-model`
105
129
 
106
- ### `QyVoucherUpload`
130
+ ### `QyImageUpload`
107
131
 
108
- 凭证上传组件,基于 `QyUpload` 的薄封装,适合财审凭证、收款凭证、返现凭证等纯图片凭证场景。
132
+ 图片/文件字段上传组件,基于 `QyUpload` 的薄封装,适合商品图、设计图、成本附图、凭证图片集合、单视频字段等场景。
109
133
 
110
134
  固定协议:
111
135
 
112
- - `v-model` `string[]`
136
+ - 默认 `multiple=false`,`v-model` 为单个 URL 字符串
137
+ - `multiple=true` 时,`v-model` 为 URL 数组
138
+ - 单图默认 `limit=1`,多图默认 `limit=9`
113
139
  - 默认 `name="files"`
114
140
  - 默认 `showText=false`
115
- - 默认开启纯粘贴输入条,用于恢复“粘贴图片上传”的凭证交互
116
- - 默认 `pastePlaceholder="粘贴图片上传"`
117
- - 默认 `size="90px"`
118
-
119
- 如果需要图片加文字备注,请直接使用 `QyUpload`。
120
-
121
- ### `QyDialog`
141
+ - 默认开启纯粘贴输入条
142
+ - 默认 `size="128px"`
143
+ - 支持 `supportVideo`、`fileType`、`fileSize`
144
+ - 支持透传 `uploadRequest`,用于接入宿主项目上传请求
145
+
146
+ `QyImageUpload` 不保留旧 `imageUpload` 的 `successUpload(fileList)` 和旧 `CopyImgUpload` 的 `fullPathList` 协议。旧页面后续替换时,应在页面层把旧回调/取值改成直接绑定 `v-model`。
147
+
148
+ ### `QyImage`
149
+
150
+ 图片展示组件,计划承接旧 `packages/qiyin/components/Image`,并作为 `@qynpm/table-schema` 的 `image` 列渲染底座。
151
+
152
+ 这是后续替代旧 `useCol` 的前置组件。旧 `useCol/render/imageRender.vue` 的表格列渲染不应该在 `@qynpm/table-schema` 内重复维护一套通用图片组件,而应组合 `QyImage`。
153
+
154
+ 必须完整覆盖旧能力:
155
+
156
+ - `src` 图片地址。
157
+ - `width / height / size` 缩略图尺寸。
158
+ - `fit` 图片填充方式,透传 `ElImage`。
159
+ - 加载中状态。
160
+ - 加载失败状态。
161
+ - `error` 事件。
162
+ - `placeholder` 空图占位。
163
+ - `compressor` 压缩缩略图参数。
164
+ - 旧域名兼容:`http` 转 `https`,`ys.diansan.com` 转 `admin.qiyinbz.com`。
165
+ - 旧缩略图参数:点三域名使用 `?small=true&style=image/resize,h_{h},w_{w}`,其他域名使用 `?w={w}`。
166
+ - 失败兜底:缩略图请求失败后请求原图 blob,并用浏览器 canvas 压缩成 dataURL 展示。
167
+ - `preview / previewList / initialIndex` 图片预览。
168
+
169
+ 失败兜底属于旧公共图片组件能力,不是录单业务逻辑。当前实现不新增 `compressorjs`,使用浏览器原生 `fetch + blob + canvas` 完成压缩;如果后续发现必须完全等价旧 `compressorjs` 的压缩细节,再单独评估是否新增依赖。
170
+
171
+ 建议新组件 API:
172
+
173
+ ```ts
174
+ type QyImageProps = {
175
+ src?: string
176
+ width?: number | string
177
+ height?: number | string
178
+ size?: number
179
+ fit?: 'fill' | 'contain' | 'cover' | 'none' | 'scale-down'
180
+ placeholder?: boolean
181
+ compressor?: boolean | {
182
+ w?: number
183
+ h?: number
184
+ q?: number
185
+ }
186
+ preview?: boolean
187
+ previewList?: string[]
188
+ initialIndex?: number
189
+ }
190
+ ```
191
+
192
+ 表格 image 列后续直接组合 `QyImage` 和 `QyImagePreview`,不要在 `@qynpm/table-schema` 里复制一份通用图片组件。
193
+
194
+ 已完成:
195
+
196
+ - 创建 `@qiyin/UI/qy-image` 入口。
197
+ - 创建 `src/docs/QyImageDoc.vue` playground 文档。
198
+ - 补 `index.js / index.d.ts / package.json exports / files`。
199
+ - 补构建入口,确保 `@qynpm/ui/qy-image` 可按需引入。
200
+ - 补失败压缩兜底,不新增 `compressorjs`。
201
+ - 补 `preview` 接入,可点击打开 `QyImagePreview`。
202
+
203
+ ### `QyImagePreview`
204
+
205
+ 图片预览组件,承接旧 `useCol/render/imageRender.vue` 中动态创建 `ElImageViewer` 的逻辑。
206
+
207
+ 需要支持:
208
+
209
+ - `urlList` 图片列表。
210
+ - `initialIndex` 初始预览索引。
211
+ - 打开时控制 `body.style.overflow = 'hidden'`。
212
+ - 关闭时恢复 body 滚动并销毁实例。
213
+ - 支持直接作为组件使用,也支持函数式调用,例如 `openQyImagePreview({ urlList, initialIndex })`。
214
+
215
+ 该能力是 `@qynpm/table-schema` 完整迁移 image 列的前置能力。table-schema 不应该长期维护一份独立图片预览逻辑。
216
+
217
+ ### `QyCheckbox`
218
+
219
+ 复选框基础组件,基于 `ElCheckbox` 做薄封装,统一 `v-model`、`change`、`focus`、`blur` 事件和单组件入口。
220
+
221
+ 主要用于普通表单复选框,以及 `@qynpm/table-schema` 的 `edit-checkbox` 渲染器底座。
222
+
223
+ ### `QyAutocomplete`
224
+
225
+ 自动完成输入基础组件,基于 `ElAutocomplete` 做薄封装,支持本地 `options` 过滤和 Element Plus 原生 `fetchSuggestions` 透传。
226
+
227
+ 默认协议:
228
+
229
+ - `v-model` 绑定输入值。
230
+ - `options` 支持 `{ value }` 列表,也支持通过 `valueKey` 映射其它字段。
231
+ - 默认按 `option.value.includes(query)` 过滤。
232
+ - 支持 `select / change / input / clear / focus / blur` 事件。
233
+
234
+ 该组件作为 `@qynpm/table-schema` 的 `edit-autocomplete` 渲染器底座,表格 row 写回逻辑仍留在 table-schema。
235
+
236
+ ### `QyMenuActions`
237
+
238
+ 表格行操作 UI 底座,承接旧 `useCol/render/menu.vue` 的通用展示能力。
239
+
240
+ 支持:
241
+
242
+ - `inline` 横向操作模式。
243
+ - `popover` 更多操作模式。
244
+ - `actions` 列表。
245
+ - `hidden / disabled / loading` 支持布尔值或按行上下文计算。
246
+ - `type` 控制默认、主色、成功、警告、危险操作色。
247
+ - `confirmMethod(action, context)` 由宿主注入确认逻辑。
248
+ - `action(action, context)` 只在可执行且确认通过后触发。
249
+
250
+ `QyMenuActions` 不内置权限、路由、缓存、弹窗实例、消息提示,也不直接执行业务方法。权限过滤和业务执行应留在 `@qynpm/table-schema` adapter 或宿主页面。
251
+
252
+ ### `QyTableColumnSettings`
253
+
254
+ 表格列设置 UI 底座,承接旧 `useCol/render/setup.vue` 的通用 UI 能力。
255
+
256
+ 支持:
257
+
258
+ - 列列表展示。
259
+ - 当前选中列。
260
+ - 置顶、置底、上移、下移。
261
+ - 固定左侧、固定右侧、取消固定。
262
+ - 列宽编辑。
263
+ - 显隐开关。
264
+ - 恢复默认。
265
+ - 删除缓存。
266
+
267
+ 业务缓存读写仍由 `@qynpm/table-schema` 的 settings adapter 或宿主 adapter 负责,UI 组件只负责展示和编辑 settings。
268
+
269
+ ### 编辑类基础组件(待评估)
270
+
271
+ 旧 `useCol` 的 `edit-input / edit-autocomplete` 有一套“展示态 -> 点击编辑 -> blur/enter 写回”的通用交互。后续有两种选择:
272
+
273
+ - 如果表格外也需要该交互,补 `QyInlineEditInput` 和 `QyAutocompleteInput`。
274
+ - 如果只服务表格列,先放在 `@qynpm/table-schema` renderer 内部,避免 UI 包过早扩大。
275
+
276
+ ### `QyDialog`
122
277
 
123
278
  弹窗组件,支持:
124
279
 
@@ -128,6 +283,73 @@ import QyRemarkImage from '@qynpm/ui/qy-remark-image'
128
283
  - 自定义 footer
129
284
  - 移动端自动全屏
130
285
 
286
+ ### `QySelectionDialog`
287
+
288
+ 数据选择弹窗底座,参考老 `@qiyin/components/Dialog` 的核心能力迁移,但不内置任何 ERP 接口或权限逻辑。
289
+
290
+ 适合业务 wrapper 组合:
291
+
292
+ - 店铺选择
293
+ - 人员选择
294
+ - 商品选择
295
+ - 物料/工艺/属性选择
296
+
297
+ 核心能力:
298
+
299
+ - `QyDialog` 弹窗容器
300
+ - `fetchMethod(query)` 或兼容老 `query(query)` 加载表格数据
301
+ - `selectionMode="single | multiple | none"`,兼容老 `selection="single | multi | none"`
302
+ - `modelValue` 管理确认后的已选行,`selected` 兼容老 `Dialog` 初始已选行
303
+ - `rowKey` 控制唯一键
304
+ - `labelKey` 控制已选标签展示
305
+ - `searchKey`、分类、类型筛选
306
+ - 类型筛选内部使用 `QySelect`,可通过 `typeSelectProps` 透传下拉属性
307
+ - `columns` / `cols` 插槽渲染业务列
308
+ - `side`、`search`、`toolbar` 插槽扩展业务区域
309
+ - Element Plus 原生分页
310
+
311
+ `QySelectionDialog` 只解决“怎么选”,不解决“选什么”。业务接口、字段映射、权限判断应放在宿主项目 wrapper 中。
312
+
313
+ 迁移业务选择器前,建议先阅读:
314
+
315
+ - [选择弹窗迁移规范](./选择弹窗迁移规范.md)
316
+
317
+ 选择状态采用“弹窗草稿 + 确认提交”协议:
318
+
319
+ - 行点击、勾选、删除标签、粘贴只修改弹窗内部草稿,并触发 `selection-change(rows)`。
320
+ - 点击确认后才触发 `update:modelValue(rows)`、`confirm(rows)` 和兼容老 `Dialog` 的 `submit({ selection, rows, query })`。
321
+ - 点击取消或关闭会丢弃草稿选择,不会污染宿主表单中的 `v-model`。
322
+ - `search` / `handleQuerySearch` 会重置到第一页并查询;分页切换会按当前条件查询。
323
+
324
+ 主要扩展点:
325
+
326
+ - `columns` / `cols`:表格列,`cols` 用于兼容老 `Dialog`。
327
+ - `side`:左侧业务区域,例如分类树、部门树。
328
+ - `search`:完全自定义查询区,插槽参数为 `{ query, search, reset }`。
329
+ - `toolbar`:搜索区右侧操作区,插槽参数为 `{ query, search }`。
330
+ - `getTableRef`、`getTableData`、`getSelection`:用于业务 wrapper 做必要的桥接。
331
+
332
+ ### `QyRemarkImage`
333
+
334
+ 备注图片组件,承接旧 `@qiyin/components/remarkImage` 的“备注文本 + 单图”协议。
335
+
336
+ 支持:
337
+
338
+ - `defaultValue` 解析 `[url:图片地址]备注文本`
339
+ - `defaultImage` 独立图片默认值
340
+ - `change(value, imageUrl)` 输出完整备注值和图片地址
341
+ - 粘贴图片上传
342
+ - 悬浮预览和删除图片
343
+ - `uploadRequest` 自定义上传请求
344
+
345
+ 默认上传会使用:
346
+
347
+ - `api`,默认 `/permission-api/common/uploads`
348
+ - `tokenKey`,默认 `Admin-Token`
349
+ - `uploadName`,默认 `files`
350
+
351
+ 如果宿主项目有统一 request、baseURL、鉴权、错误处理或登录失效处理,应优先传入 `uploadRequest`,不要在组件内部写死项目请求实现。
352
+
131
353
  ### `QyInput`
132
354
 
133
355
  输入组件,第一版定位为 `ElInput` 的轻量包装层,重点支持:
@@ -150,6 +372,36 @@ import QyRemarkImage from '@qynpm/ui/qy-remark-image'
150
372
  - `allowNegative`
151
373
  - 兼容常见 slots 与 expose 方法
152
374
 
375
+ ### `QyInputNumber`
376
+
377
+ 数字输入组件,第一版定位为 `ElInputNumber` 的轻量包装层,重点支持:
378
+
379
+ - 保持 `number / null` 值语义
380
+ - `min / max`
381
+ - `step`
382
+ - `step-strictly`
383
+ - `precision`
384
+ - `controls / controls-position`
385
+ - 兼容 `focus / blur` expose 方法
386
+
387
+ 金额、费用、税费等财务录入场景请优先使用 `QyMoneyInput`,不要用 `QyInputNumber` 做金额格式化。
388
+
389
+ ### `QyDatePicker`
390
+
391
+ 日期选择组件,第一版定位为 `ElDatePicker` 的轻量包装层,重点支持:
392
+
393
+ - 保持和 `ElDatePicker` 接近的使用方式
394
+ - `date / datetime / daterange / datetimerange` 等常见类型
395
+ - `format / value-format`
396
+ - `default-time`
397
+ - `shortcuts`
398
+ - `disabled-date`
399
+ - 默认弹层挂载到 `body`
400
+ - `normalize-range-end-time` 查询场景结束时间归一化
401
+ - 兼容 `focus / blur / handleOpen / handleClose` expose 方法
402
+
403
+ `normalize-range-end-time` 默认关闭。只有查询表单需要把范围结束值从当天 `00:00:00` 归一为 `23:59:59` 时再显式开启,避免影响普通日期选择。
404
+
153
405
  ### `QyRadioGroup`
154
406
 
155
407
  单选组组件,第一版定位为 `ElRadioGroup` 的轻量包装层,重点支持:
@@ -168,18 +420,35 @@ import QyRemarkImage from '@qynpm/ui/qy-remark-image'
168
420
  - `value`:映射后的选项值
169
421
  - `disabled`:是否禁用
170
422
 
171
- ### `QySelect`
172
-
173
- 选择器组件,第一版定位为 `ElSelect` 的轻量包装层,重点支持:
423
+ ### `QySelect`
424
+
425
+ 选择器组件,第一版定位为 `ElSelect` 的轻量包装层,重点支持:
174
426
 
175
427
  - `options` 直出
176
428
  - `labelKey / valueKey / disabledKey` 映射
177
429
  - 单选 / 多选
178
430
  - `collapse-tags`
179
- - 默认弹层挂载策略
180
- - 保留原生 slot 扩展
181
-
182
- ### `QyRemoteSelect`
431
+ - 默认弹层挂载策略
432
+ - 保留原生 slot 扩展
433
+
434
+ ### `QyTreeSelect`
435
+
436
+ 树选择组件,第一版定位为 `ElTreeSelect` 的轻量包装层,重点支持:
437
+
438
+ - `options` 树数据直出
439
+ - 兼容 `ElTreeSelect` 的 `data` 参数
440
+ - `labelKey / valueKey / childrenKey / disabledKey` 字段映射
441
+ - 单选 / 多选
442
+ - `check-strictly`
443
+ - `collapse-tags`
444
+ - 默认弹层挂载策略
445
+ - 保留原始节点字段,便于业务 slot 和后续透传使用
446
+
447
+ `QyTreeSelect` 只处理树选择器的通用 UI 协议,不内置远程请求、权限过滤或业务接口格式化。业务接口返回字段不一致时,优先通过字段映射解决,避免每个页面先手写一遍 tree map。
448
+
449
+ 为降低迁移成本,`QyTreeSelect` 的 `clearable`、`filterable`、`check-strictly`、`render-after-expand`、`fit-input-width` 等默认行为尽量跟随 `ElTreeSelect`。业务需要搜索、清空、父子不联动时应显式传参。
450
+
451
+ ### `QyRemoteSelect`
183
452
 
184
453
  远程选择器组件,基于 `QySelect` 组合实现,重点支持:
185
454
 
@@ -280,22 +549,181 @@ import QyRemarkImage from '@qynpm/ui/qy-remark-image'
280
549
  </template>
281
550
  ```
282
551
 
283
- ### QyVoucherUpload
552
+ ### QyImageUpload
553
+
554
+ 单图字段:
284
555
 
285
556
  ```vue
286
557
  <template>
287
- <QyVoucherUpload
288
- v-model="payImgs"
558
+ <QyImageUpload
559
+ v-model="imageUrl"
560
+ api="/permission-api/common/uploads"
561
+ :file-size="5"
562
+ />
563
+ </template>
564
+ ```
565
+
566
+ ### QyImage
567
+
568
+ ```vue
569
+ <template>
570
+ <QyImage
571
+ src="https://img.example.com/a.jpg"
572
+ :size="48"
573
+ fit="cover"
574
+ preview
575
+ :compressor="{ w: 200, h: 200, q: 50 }"
576
+ />
577
+ </template>
578
+ ```
579
+
580
+ 函数式预览:
581
+
582
+ ```ts
583
+ import { openQyImagePreview } from '@qynpm/ui'
584
+
585
+ openQyImagePreview({
586
+ urlList: ['https://img.example.com/a.jpg'],
587
+ initialIndex: 0
588
+ })
589
+ ```
590
+
591
+ 多图字段:
592
+
593
+ ```vue
594
+ <template>
595
+ <QyImageUpload
596
+ v-model="payImages"
289
597
  api="/permission-api/common/uploads"
598
+ multiple
290
599
  :limit="9"
291
- :file-size="10"
292
600
  />
293
601
  </template>
294
602
  ```
295
603
 
296
- ### QyDialog
604
+ 接入宿主项目上传请求:
605
+
606
+ ```vue
607
+ <template>
608
+ <QyImageUpload
609
+ v-model="payImgs"
610
+ name="files"
611
+ multiple
612
+ :upload-request="uploadFile"
613
+ />
614
+ </template>
615
+
616
+ <script setup lang="ts">
617
+ import { request } from '@qiyin/utils'
618
+
619
+ async function uploadFile({ formData }) {
620
+ return request({
621
+ url: '/permission-api/common/uploads',
622
+ method: 'POST',
623
+ data: formData
624
+ })
625
+ }
626
+ </script>
627
+ ```
628
+
629
+ ### QyRemarkImage
630
+
631
+ 默认上传:
632
+
633
+ ```vue
634
+ <template>
635
+ <QyRemarkImage
636
+ :default-value="remark"
637
+ api="/permission-api/common/uploads"
638
+ upload-name="files"
639
+ @change="handleRemarkChange"
640
+ />
641
+ </template>
642
+
643
+ <script setup lang="ts">
644
+ function handleRemarkChange(value: string, imageUrl?: string) {
645
+ remark.value = value
646
+ remarkImage.value = imageUrl || ''
647
+ }
648
+ </script>
649
+ ```
650
+
651
+ 接入宿主项目上传请求:
297
652
 
298
653
  ```vue
654
+ <template>
655
+ <QyRemarkImage
656
+ :default-value="remark"
657
+ :upload-request="uploadRemarkImage"
658
+ @change="handleRemarkChange"
659
+ />
660
+ </template>
661
+
662
+ <script setup lang="ts">
663
+ import { request } from '@qiyin/utils'
664
+
665
+ async function uploadRemarkImage({ formData }) {
666
+ return request({
667
+ url: '/permission-api/common/uploads',
668
+ method: 'POST',
669
+ data: formData
670
+ })
671
+ }
672
+
673
+ function handleRemarkChange(value: string, imageUrl?: string) {
674
+ remark.value = value
675
+ remarkImage.value = imageUrl || ''
676
+ }
677
+ </script>
678
+ ```
679
+
680
+ ### QyMenuActions
681
+
682
+ ```vue
683
+ <template>
684
+ <QyMenuActions
685
+ :row="row"
686
+ :row-index="0"
687
+ :actions="actions"
688
+ :confirm-method="confirmAction"
689
+ @action="handleAction"
690
+ />
691
+ </template>
692
+
693
+ <script setup lang="ts">
694
+ const row = { id: 1, status: 'draft' }
695
+ const actions = [
696
+ { key: 'edit', label: '编辑' },
697
+ { key: 'delete', label: '删除', type: 'danger', confirm: true }
698
+ ]
699
+
700
+ function confirmAction(action, context) {
701
+ return window.confirm(`确认${action.label}?`)
702
+ }
703
+
704
+ function handleAction(action, context) {
705
+ // 业务执行、消息提示和权限判断留在宿主或 table-schema adapter。
706
+ }
707
+ </script>
708
+ ```
709
+
710
+ ### QyTableColumnSettings
711
+
712
+ ```vue
713
+ <template>
714
+ <QyTableColumnSettings
715
+ v-model="visible"
716
+ :settings="settings"
717
+ :default-settings="defaultSettings"
718
+ @confirm="saveSettings"
719
+ @delete-cache="removeSettingsCache"
720
+ />
721
+ </template>
722
+ ```
723
+
724
+ ### QyDialog
725
+
726
+ ```vue
299
727
  <template>
300
728
  <QyDialog title="标题" @confirm="handleConfirm">
301
729
  内容区域
@@ -330,6 +758,36 @@ import QyRemarkImage from '@qynpm/ui/qy-remark-image'
330
758
  </template>
331
759
  ```
332
760
 
761
+ ### QyInputNumber
762
+
763
+ ```vue
764
+ <template>
765
+ <QyInputNumber
766
+ v-model="productNum"
767
+ :min="0"
768
+ :step="1"
769
+ :precision="0"
770
+ controls-position="right"
771
+ placeholder="请输入数量"
772
+ />
773
+ </template>
774
+ ```
775
+
776
+ ### QyDatePicker
777
+
778
+ ```vue
779
+ <template>
780
+ <QyDatePicker
781
+ v-model="dateRange"
782
+ type="datetimerange"
783
+ value-format="YYYY-MM-DD HH:mm:ss"
784
+ format="YYYY-MM-DD HH:mm:ss"
785
+ :default-time="defaultTime"
786
+ normalize-range-end-time
787
+ />
788
+ </template>
789
+ ```
790
+
333
791
  ### QyRadioGroup
334
792
 
335
793
  ```vue
@@ -441,13 +899,16 @@ import QyRemarkImage from '@qynpm/ui/qy-remark-image'
441
899
  - 当前版本更适合体系内拆包复用
442
900
  - 上传默认值仍然保留了现有项目约定,后续如果完全独立对外,可以再继续抽离
443
901
  - `QyInput` 第一版优先兼容 `ElInput`,后续再逐步补统一输入规则
902
+ - `QyInputNumber` 第一版优先兼容 `ElInputNumber`,保持数字输入语义,不承接金额格式化
444
903
  - `QyRadioGroup` 第一版优先兼容 `ElRadioGroup`,不内置字典请求或复杂表单联动
445
904
  - `QySelect` 第一版优先兼容 `ElSelect`,不内置远程字典或复杂请求能力
905
+ - `QyDatePicker` 第一版优先兼容 `ElDatePicker`,查询结束时间归一化需要显式开启
446
906
  - `QyRemoteSelect` 负责远程请求状态和回显保留,不承接具体业务接口协议转换
447
907
  - `QyFormSection` 只负责区块壳,不替代 `@qiyin/form` 的 schema / 校验能力
448
- - `QyActionBar` 只负责底部布局壳,不负责编排按钮业务逻辑
449
- - `QySearchInput` 第一版已经覆盖建议搜索场景,但仍然不承接页面级副作用
450
- - `QyRecordQuoteSearch` 只承接报价单搜索入口逻辑,不直接改整页录单状态
908
+ - `QyActionBar` 只负责底部布局壳,不负责编排按钮业务逻辑
909
+ - `QySearchInput` 第一版已经覆盖建议搜索场景,但仍然不承接页面级副作用
910
+ - `QyRecordQuoteSearch` 只承接报价单搜索入口逻辑,不直接改整页录单状态
911
+ - `QyImage` 负责通用图片显示,不负责表格列取值、formatter、水印和列设置;这些由 `@qynpm/table-schema` 组合
451
912
 
452
913
  ## 当前联调说明
453
914
 
@@ -455,7 +916,7 @@ import QyRemarkImage from '@qynpm/ui/qy-remark-image'
455
916
 
456
917
  开关位置:
457
918
 
458
- - [vite.config.ts](/vite.config.ts)
919
+ - `qy-workspace` 顶层 `vite.config.ts`
459
920
 
460
921
  当前配置:
461
922
 
@@ -466,8 +927,8 @@ const ENABLE_LOCAL_QIYIN_DEBUG = true
466
927
  规则如下:
467
928
 
468
929
  1. 当值为 `true` 时
469
- - `@qynpm/ui` 映射到本地 [@qiyin/UI/lib/index.js](/@qiyin/UI/lib/index.js)
470
- - `@qynpm/form` / `@qiyin/form` 映射到本地 [@qiyin/form/index.ts](/@qiyin/form/index.ts)
930
+ - `@qynpm/ui` 映射到本地 [lib/index.js](./lib/index.js)
931
+ - `@qynpm/form` / `@qiyin/form` 映射到本地 [../form/index.ts](../form/index.ts)
471
932
  - 消费项目开发时可以直接联调 `UI` 与 `form`
472
933
 
473
934
  2. 当值为 `false` 时