@agile-team/wl-skills-kit 2.3.3 → 2.3.5

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 (91) hide show
  1. package/CHANGELOG.md +24 -23
  2. package/README.md +15 -146
  3. package/files/.cursor/mcp.json +8 -0
  4. package/files/.github/guides/README.md +13 -13
  5. package/files/.github/guides/architecture.md +555 -555
  6. package/files/.github/guides/mcp-setup.md +109 -0
  7. package/files/.github/guides/usage.md +184 -176
  8. package/files/.github/reports/README.md +65 -65
  9. package/files/.github/reports/SYS_DICT_INFO.md +50 -50
  10. package/files/.github/reports/SYS_MENU_INFO.md +247 -247
  11. package/files/.github/reports/SYS_PERMISSION_INFO.md +20 -20
  12. package/files/.github/reports//347/273/204/344/273/266/346/217/220/345/217/226/345/273/272/350/256/256.md +33 -33
  13. package/files/.github/reports//350/247/204/350/214/203/345/256/241/346/237/245/346/212/245/345/221/212.md +44 -44
  14. package/files/.github/skills/_compat/README.md +108 -108
  15. package/files/.github/skills/_compat/editors.json +7 -0
  16. package/files/.github/skills/_compat/headers/agents.txt +8 -8
  17. package/files/.github/skills/_compat/headers/claude-code.txt +7 -7
  18. package/files/.github/skills/_compat/headers/cline.txt +7 -7
  19. package/files/.github/skills/_compat/headers/cursor-mdc.txt +16 -16
  20. package/files/.github/skills/_compat/headers/cursor-rules.txt +7 -7
  21. package/files/.github/skills/_compat/headers/github-copilot.txt +1 -1
  22. package/files/.github/skills/_compat/headers/kiro.txt +10 -10
  23. package/files/.github/skills/_compat/headers/qoder.txt +8 -0
  24. package/files/.github/skills/_compat/headers/trae.txt +11 -11
  25. package/files/.github/skills/_compat/headers/windsurf.txt +7 -7
  26. package/files/.github/skills/_registry.md +81 -81
  27. package/files/.github/skills/core/api-contract/SKILL.md +344 -344
  28. package/files/.github/skills/core/api-contract/USAGE.md +110 -110
  29. package/files/.github/skills/core/convention-audit/SKILL.md +189 -189
  30. package/files/.github/skills/core/convention-audit/USAGE.md +99 -99
  31. package/files/.github/skills/core/page-codegen/SKILL.md +973 -973
  32. package/files/.github/skills/core/page-codegen/USAGE.md +102 -102
  33. package/files/.github/skills/core/page-codegen/templates/_index.md +46 -46
  34. package/files/.github/skills/core/page-codegen/templates/domains/_CONTRIBUTING.md +107 -107
  35. package/files/.github/skills/core/page-codegen/templates/domains/produce/TPL-OPERATION-STATION.md +442 -442
  36. package/files/.github/skills/core/page-codegen/templates/domains/sale/README.md +26 -26
  37. package/files/.github/skills/core/page-codegen/templates/universal/TPL-CHANGE-HISTORY.md +276 -276
  38. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DETAIL-TABS.md +1145 -1145
  39. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DRIVEN.md +309 -309
  40. package/files/.github/skills/core/page-codegen/templates/universal/TPL-FORM-ROUTE.md +436 -436
  41. package/files/.github/skills/core/page-codegen/templates/universal/TPL-LIST.md +191 -191
  42. package/files/.github/skills/core/page-codegen/templates/universal/TPL-MASTER-DETAIL.md +148 -148
  43. package/files/.github/skills/core/page-codegen/templates/universal/TPL-RECORD-FORM.md +376 -376
  44. package/files/.github/skills/core/page-codegen/templates/universal/TPL-TREE-LIST.md +186 -186
  45. package/files/.github/skills/core/prototype-scan/SKILL.md +498 -498
  46. package/files/.github/skills/core/prototype-scan/USAGE.md +95 -95
  47. package/files/.github/skills/core/template-extract/SKILL.md +139 -139
  48. package/files/.github/skills/core/template-extract/USAGE.md +93 -93
  49. package/files/.github/skills/domain/README.md +51 -51
  50. package/files/.github/skills/sync/menu-sync/SKILL.md +263 -263
  51. package/files/.github/skills/sync/menu-sync/USAGE.md +104 -104
  52. package/files/.github/skills/sync/menu-sync/env/env.local.json +7 -7
  53. package/files/.github/skills/sync/menu-sync/env/guide.md +99 -99
  54. package/files/.github/skills/sync/permission-sync/SKILL.draft.md +91 -91
  55. package/files/.github/standards/01-toolchain.md +57 -57
  56. package/files/.github/standards/02-code-structure.md +111 -111
  57. package/files/.github/standards/03-comments.md +53 -53
  58. package/files/.github/standards/04-coding-basics.md +33 -33
  59. package/files/.github/standards/05-logging.md +38 -38
  60. package/files/.github/standards/06-security.md +44 -44
  61. package/files/.github/standards/07-config.md +52 -52
  62. package/files/.github/standards/08-git.md +60 -60
  63. package/files/.github/standards/09-typescript.md +71 -71
  64. package/files/.github/standards/10-pinia.md +57 -57
  65. package/files/.github/standards/11-form-validation.md +81 -81
  66. package/files/.github/standards/12-base-table.md +153 -153
  67. package/files/.github/standards/13-platform-components.md +123 -123
  68. package/files/.github/standards/index.md +89 -89
  69. package/files/.kiro/settings/mcp.json +8 -0
  70. package/files/.mcp.json +8 -0
  71. package/files/.vscode/mcp.json +9 -0
  72. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/data.ts +196 -196
  73. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.scss +150 -150
  74. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.vue +79 -79
  75. package/files/docs/jh-date-range.md +257 -257
  76. package/files/docs/jh-date.md +222 -222
  77. package/files/docs/jh-dept-picker.md +190 -190
  78. package/files/docs/jh-drag-row.md +590 -590
  79. package/files/docs/jh-file-upload.md +216 -216
  80. package/files/docs/jh-picker.md +218 -218
  81. package/files/docs/jh-select.md +148 -148
  82. package/files/docs/jh-text.md +248 -248
  83. package/files/docs/jh-user-picker.md +197 -197
  84. package/files/src/components/global/C_RightToolbar/data.ts +228 -228
  85. package/files/src/components/global/C_RightToolbar/index.scss +44 -44
  86. package/files/src/components/global/C_Splitter/index.scss +61 -61
  87. package/files/src/components/global/C_SvgIcon/index.scss +15 -15
  88. package/files/src/components/global/C_TagStatus/index.scss +20 -20
  89. package/files/src/components/global/C_Tree/data.ts +61 -61
  90. package/files/src/components/local/c_listModal/index.scss +4 -4
  91. package/package.json +1 -1
@@ -1,79 +1,79 @@
1
- <template>
2
- <div class="app-container change-history-page">
3
- <!-- 左侧:变更历史记录面板 -->
4
- <div class="history-panel" v-loading="historyLoading">
5
- <div class="history-panel__header">变更记录</div>
6
- <div class="history-panel__list">
7
- <div
8
- v-for="item in historyList"
9
- :key="item.id"
10
- class="history-card"
11
- :class="{ 'is-active': item.id === selectedId }"
12
- @click="handleSelectHistory(item)"
13
- >
14
- <span
15
- class="history-card__dot"
16
- :class="item.changeType.includes('新增') ? 'is-add' : 'is-change'"
17
- ></span>
18
- <div class="history-card__content">
19
- <div class="history-card__type">{{ item.changeType }}</div>
20
- <div class="history-card__date">{{ item.changeTime }}</div>
21
- <div class="history-card__person">{{ item.changePerson }}</div>
22
- </div>
23
- </div>
24
- <div
25
- v-if="!historyList.length && !historyLoading"
26
- class="history-empty"
27
- >
28
- 暂无变更记录
29
- </div>
30
- </div>
31
- </div>
32
-
33
- <!-- 右侧:变更详情面板 -->
34
- <div class="detail-panel" v-loading="loading">
35
- <div class="page-header">
36
- <span class="page-title">客户变更详情</span>
37
- <span class="page-tag page-tag--change">变更</span>
38
- <span class="page-tag page-tag--status">未审核</span>
39
- </div>
40
- <div class="page-toolbar">
41
- <el-button @click="handleCancel">取消</el-button>
42
- </div>
43
- <div class="detail-panel__body">
44
- <c_customerTabs ref="tabsRef" mode="view" />
45
- </div>
46
- </div>
47
- </div>
48
- </template>
49
-
50
- <script setup lang="ts">
51
- import { useRoute } from "vue-router";
52
- import { useChangeHistory } from "./data";
53
- import c_customerTabs from "@/components/local/c_customerTabs/index.vue";
54
-
55
- const tabsRef = ref<InstanceType<typeof c_customerTabs>>();
56
- const route = useRoute();
57
-
58
- const {
59
- loading,
60
- historyLoading,
61
- historyList,
62
- selectedId,
63
- loadHistoryList,
64
- loadMockData,
65
- handleSelectHistory,
66
- handleCancel
67
- } = useChangeHistory(tabsRef);
68
-
69
- onMounted(() => {
70
- // TODO: 后端接口就绪后,启用真实接口:
71
- // const id = route.query.id as string;
72
- // if (id) { loadHistoryList(id); } else { loadMockData(); }
73
- loadMockData();
74
- });
75
- </script>
76
-
77
- <style scoped lang="scss">
78
- @import "./index.scss";
79
- </style>
1
+ <template>
2
+ <div class="app-container change-history-page">
3
+ <!-- 左侧:变更历史记录面板 -->
4
+ <div class="history-panel" v-loading="historyLoading">
5
+ <div class="history-panel__header">变更记录</div>
6
+ <div class="history-panel__list">
7
+ <div
8
+ v-for="item in historyList"
9
+ :key="item.id"
10
+ class="history-card"
11
+ :class="{ 'is-active': item.id === selectedId }"
12
+ @click="handleSelectHistory(item)"
13
+ >
14
+ <span
15
+ class="history-card__dot"
16
+ :class="item.changeType.includes('新增') ? 'is-add' : 'is-change'"
17
+ ></span>
18
+ <div class="history-card__content">
19
+ <div class="history-card__type">{{ item.changeType }}</div>
20
+ <div class="history-card__date">{{ item.changeTime }}</div>
21
+ <div class="history-card__person">{{ item.changePerson }}</div>
22
+ </div>
23
+ </div>
24
+ <div
25
+ v-if="!historyList.length && !historyLoading"
26
+ class="history-empty"
27
+ >
28
+ 暂无变更记录
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <!-- 右侧:变更详情面板 -->
34
+ <div class="detail-panel" v-loading="loading">
35
+ <div class="page-header">
36
+ <span class="page-title">客户变更详情</span>
37
+ <span class="page-tag page-tag--change">变更</span>
38
+ <span class="page-tag page-tag--status">未审核</span>
39
+ </div>
40
+ <div class="page-toolbar">
41
+ <el-button @click="handleCancel">取消</el-button>
42
+ </div>
43
+ <div class="detail-panel__body">
44
+ <c_customerTabs ref="tabsRef" mode="view" />
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </template>
49
+
50
+ <script setup lang="ts">
51
+ import { useRoute } from "vue-router";
52
+ import { useChangeHistory } from "./data";
53
+ import c_customerTabs from "@/components/local/c_customerTabs/index.vue";
54
+
55
+ const tabsRef = ref<InstanceType<typeof c_customerTabs>>();
56
+ const route = useRoute();
57
+
58
+ const {
59
+ loading,
60
+ historyLoading,
61
+ historyList,
62
+ selectedId,
63
+ loadHistoryList,
64
+ loadMockData,
65
+ handleSelectHistory,
66
+ handleCancel
67
+ } = useChangeHistory(tabsRef);
68
+
69
+ onMounted(() => {
70
+ // TODO: 后端接口就绪后,启用真实接口:
71
+ // const id = route.query.id as string;
72
+ // if (id) { loadHistoryList(id); } else { loadMockData(); }
73
+ loadMockData();
74
+ });
75
+ </script>
76
+
77
+ <style scoped lang="scss">
78
+ @import "./index.scss";
79
+ </style>
@@ -1,257 +1,257 @@
1
- # jh-date-range - 日期范围选择组件
2
-
3
- > 平台统一的日期范围选择组件,封装常用日期范围选择交互与默认格式,适用于查询条件、统计分析等需要选择开始/结束日期的场景
4
-
5
- ## 📦 组件位置
6
-
7
- ```ts
8
- import "@jhlc/common-core";
9
- ```
10
-
11
- 组件已全局注册,可直接在模板中使用 `<jh-date-range />`。
12
-
13
- ---
14
-
15
- ## 基本用法
16
-
17
- ### 1️⃣ 选择日期范围(最常用)
18
-
19
- ```vue
20
- <template>
21
- <jh-date-range v-model="query.dateRange" placeholder="请选择日期范围" />
22
- </template>
23
-
24
- <script setup lang="ts">
25
- import { ref } from "vue";
26
-
27
- const query = ref({
28
- dateRange: []
29
- });
30
- </script>
31
- ```
32
-
33
- ---
34
-
35
- ### 2️⃣ 查询条件中使用(推荐)
36
-
37
- ```vue
38
- <jh-date-range
39
- v-model="query.createDateRange"
40
- placeholder="创建日期"
41
- clearable
42
- />
43
- ```
44
-
45
- ---
46
-
47
- ## Props 属性
48
-
49
- | 参数 | 说明 | 类型 | 默认值 |
50
- | ------------------------------- | ---------------------------- | ------------------------------------------------ | ------------------ |
51
- | modelValue / v-model | 绑定值(开始/结束数组) | `Array<string \| Date>` | `[]` |
52
- | beginValue / v-model:beginValue | 开始日期(可拆分绑定) | `string \| Date` | - |
53
- | endValue / v-model:endValue | 结束日期(可拆分绑定) | `string \| Date` | - |
54
- | placeholder | 占位提示 | `string` | `"请选择日期范围"` |
55
- | startPlaceholder | 开始日期占位 | `string` | `"开始日期"` |
56
- | endPlaceholder | 结束日期占位 | `string` | `"结束日期"` |
57
- | type | 范围选择器类型 | `"daterange" \| "monthrange" \| "datetimerange"` | `"daterange"` |
58
- | format | 绑定值格式(返回给 v-model) | `string` | `"YYYY-MM-DD"` |
59
- | showFormat | 显示格式 | `string` | `"YYYY-MM-DD"` |
60
- | rangeSeparator | 分隔符 | `string` | `"至"` |
61
- | disabled | 是否禁用 | `boolean` | `false` |
62
- | clearable | 是否可清空 | `boolean` | `true` |
63
-
64
- > **新增提示**: 除了使用 `v-model` 绑定数组外,还可以使用 `v-model:beginValue` 和 `v-model:endValue` 分别绑定开始和结束日期,这在某些场景下更加灵活。
65
-
66
- ---
67
-
68
- ## Events 事件
69
-
70
- | 事件名 | 说明 | 回调参数 |
71
- | ----------------- | ------------------ | ---------------------------------------- |
72
- | update:modelValue | v-model 更新时触发 | `(value: Array<string \| Date>) => void` |
73
- | update:beginValue | 开始日期更新时触发 | `(value: string \| Date) => void` |
74
- | update:endValue | 结束日期更新时触发 | `(value: string \| Date) => void` |
75
- | blur | 失去焦点时触发 | `() => void` |
76
-
77
- ---
78
-
79
- ## 常见场景
80
-
81
- ### 场景 1:列表查询时间范围(推荐)
82
-
83
- ```vue
84
- <jh-date-range v-model="query.bizDateRange" placeholder="业务日期" />
85
- ```
86
-
87
- ---
88
-
89
- ### 场景 2:统计报表筛选
90
-
91
- ```vue
92
- <jh-date-range v-model="query.statRange" placeholder="统计区间" />
93
- ```
94
-
95
- ---
96
-
97
- ### 场景 3:BaseQuery 配置式用法(推荐)
98
-
99
- ```ts
100
- // data.ts 查询项配置
101
- export const queryItemsConfig: BaseQueryItemDesc<any>[] = [
102
- {
103
- name: "createDateTime",
104
- startName: "createDateTimeStart", // 开始字段
105
- endName: "createDateTimeEnd", // 结束字段
106
- label: "创建日期",
107
- component: () => {
108
- return {
109
- tag: "jh-date",
110
- type: "daterange",
111
- rangeSeparator: "至",
112
- showFormat: "YYYY-MM-DD",
113
- valueFormat: "YYYY-MM-DD"
114
- };
115
- }
116
- }
117
- ];
118
-
119
- // 使用时会自动拆分为 startName 和 endName 两个字段
120
- // query.createDateTimeStart = "2026-01-01"
121
- // query.createDateTimeEnd = "2026-01-31"
122
- ```
123
-
124
- ### 场景 4:与后端接口参数映射
125
-
126
- ```ts
127
- // v-model 方式
128
- query.dateRange = ["2026-01-01", "2026-01-31"]
129
-
130
- // 请求参数建议拆分传递
131
- params: {
132
- startDate: query.dateRange?.[0],
133
- endDate: query.dateRange?.[1]
134
- }
135
-
136
- // 或使用 beginValue/endValue 方式
137
- query.beginDate = "2026-01-01"
138
- query.endDate = "2026-01-31"
139
-
140
- // 请求参数直接使用
141
- params: {
142
- startDate: query.beginDate,
143
- endDate: query.endDate
144
- }
145
- ```
146
-
147
- ---
148
-
149
- ## 与 el-date-picker 对比
150
-
151
- ### 使用 jh-date-range(推荐)
152
-
153
- ```vue
154
- <jh-date-range v-model="query.dateRange" />
155
- ```
156
-
157
- ✅ 统一默认格式
158
- ✅ 简化配置
159
- ✅ 风格一致
160
-
161
- ### 使用 el-date-picker(不推荐)
162
-
163
- ```vue
164
- <el-date-picker
165
- v-model="query.dateRange"
166
- type="daterange"
167
- value-format="YYYY-MM-DD"
168
- format="YYYY-MM-DD"
169
- range-separator="至"
170
- start-placeholder="开始日期"
171
- end-placeholder="结束日期"
172
- />
173
- ```
174
-
175
- ❌ 配置繁琐
176
- ❌ 每处都要重复写默认格式
177
- ❌ 风格不统一
178
-
179
- ---
180
-
181
- ## 最佳实践
182
-
183
- ### 1️⃣ 统一返回字符串格式(强烈推荐)
184
-
185
- ```vue
186
- <jh-date-range v-model="query.dateRange" value-format="YYYY-MM-DD" />
187
- ```
188
-
189
- 避免 Date / string 混用,接口参数更稳定
190
-
191
- ---
192
-
193
- ### 2️⃣ 查询条件建议 always clearable
194
-
195
- ```vue
196
- <jh-date-range v-model="query.range" clearable />
197
- ```
198
-
199
- ---
200
-
201
- ### 3️⃣ 请求参数建议拆分传递
202
-
203
- ```ts
204
- const [startDate, endDate] = query.value.dateRange || [];
205
- request({
206
- url: "/api/list",
207
- params: { startDate, endDate }
208
- });
209
- ```
210
-
211
- ---
212
-
213
- ### 4️⃣ 与单日期选择区分使用
214
-
215
- - 单个日期:`jh-date`
216
- - 日期范围:`jh-date-range`
217
-
218
- ---
219
-
220
- ## 注意事项
221
-
222
- 1. **v-model 为数组**
223
- - 必须使用数组字段接收
224
- - 推荐默认 `[]`
225
-
226
- 2. **valueFormat 决定返回类型**
227
- - 默认 `"YYYY-MM-DD"` 字符串数组
228
- - 不建议返回 Date(容易引入时区/格式问题)
229
-
230
- 3. **后端字段建议统一**
231
- - 强烈建议后端使用 `startDate/endDate` 两个字段接收
232
-
233
- ---
234
-
235
- ## 🎯 真实项目示例
236
-
237
- ### 示例 1:列表查询
238
-
239
- ```vue
240
- <jh-date-range v-model="query.createDateRange" />
241
- ```
242
-
243
- ### 示例 2:报表筛选
244
-
245
- ```vue
246
- <jh-date-range v-model="query.statRange" />
247
- ```
248
-
249
- ---
250
-
251
- ## 🚀 快速开始
252
-
253
- 1. 使用数组字段绑定 v-model(如 `dateRange`)
254
- 2. 默认返回 `"YYYY-MM-DD"` 字符串数组
255
- 3. 请求参数拆分成 start / end 传递
256
-
257
- **推荐作为平台统一的日期范围选择组件使用!**
1
+ # jh-date-range - 日期范围选择组件
2
+
3
+ > 平台统一的日期范围选择组件,封装常用日期范围选择交互与默认格式,适用于查询条件、统计分析等需要选择开始/结束日期的场景
4
+
5
+ ## 📦 组件位置
6
+
7
+ ```ts
8
+ import "@jhlc/common-core";
9
+ ```
10
+
11
+ 组件已全局注册,可直接在模板中使用 `<jh-date-range />`。
12
+
13
+ ---
14
+
15
+ ## 基本用法
16
+
17
+ ### 1️⃣ 选择日期范围(最常用)
18
+
19
+ ```vue
20
+ <template>
21
+ <jh-date-range v-model="query.dateRange" placeholder="请选择日期范围" />
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ import { ref } from "vue";
26
+
27
+ const query = ref({
28
+ dateRange: []
29
+ });
30
+ </script>
31
+ ```
32
+
33
+ ---
34
+
35
+ ### 2️⃣ 查询条件中使用(推荐)
36
+
37
+ ```vue
38
+ <jh-date-range
39
+ v-model="query.createDateRange"
40
+ placeholder="创建日期"
41
+ clearable
42
+ />
43
+ ```
44
+
45
+ ---
46
+
47
+ ## Props 属性
48
+
49
+ | 参数 | 说明 | 类型 | 默认值 |
50
+ | ------------------------------- | ---------------------------- | ------------------------------------------------ | ------------------ |
51
+ | modelValue / v-model | 绑定值(开始/结束数组) | `Array<string \| Date>` | `[]` |
52
+ | beginValue / v-model:beginValue | 开始日期(可拆分绑定) | `string \| Date` | - |
53
+ | endValue / v-model:endValue | 结束日期(可拆分绑定) | `string \| Date` | - |
54
+ | placeholder | 占位提示 | `string` | `"请选择日期范围"` |
55
+ | startPlaceholder | 开始日期占位 | `string` | `"开始日期"` |
56
+ | endPlaceholder | 结束日期占位 | `string` | `"结束日期"` |
57
+ | type | 范围选择器类型 | `"daterange" \| "monthrange" \| "datetimerange"` | `"daterange"` |
58
+ | format | 绑定值格式(返回给 v-model) | `string` | `"YYYY-MM-DD"` |
59
+ | showFormat | 显示格式 | `string` | `"YYYY-MM-DD"` |
60
+ | rangeSeparator | 分隔符 | `string` | `"至"` |
61
+ | disabled | 是否禁用 | `boolean` | `false` |
62
+ | clearable | 是否可清空 | `boolean` | `true` |
63
+
64
+ > **新增提示**: 除了使用 `v-model` 绑定数组外,还可以使用 `v-model:beginValue` 和 `v-model:endValue` 分别绑定开始和结束日期,这在某些场景下更加灵活。
65
+
66
+ ---
67
+
68
+ ## Events 事件
69
+
70
+ | 事件名 | 说明 | 回调参数 |
71
+ | ----------------- | ------------------ | ---------------------------------------- |
72
+ | update:modelValue | v-model 更新时触发 | `(value: Array<string \| Date>) => void` |
73
+ | update:beginValue | 开始日期更新时触发 | `(value: string \| Date) => void` |
74
+ | update:endValue | 结束日期更新时触发 | `(value: string \| Date) => void` |
75
+ | blur | 失去焦点时触发 | `() => void` |
76
+
77
+ ---
78
+
79
+ ## 常见场景
80
+
81
+ ### 场景 1:列表查询时间范围(推荐)
82
+
83
+ ```vue
84
+ <jh-date-range v-model="query.bizDateRange" placeholder="业务日期" />
85
+ ```
86
+
87
+ ---
88
+
89
+ ### 场景 2:统计报表筛选
90
+
91
+ ```vue
92
+ <jh-date-range v-model="query.statRange" placeholder="统计区间" />
93
+ ```
94
+
95
+ ---
96
+
97
+ ### 场景 3:BaseQuery 配置式用法(推荐)
98
+
99
+ ```ts
100
+ // data.ts 查询项配置
101
+ export const queryItemsConfig: BaseQueryItemDesc<any>[] = [
102
+ {
103
+ name: "createDateTime",
104
+ startName: "createDateTimeStart", // 开始字段
105
+ endName: "createDateTimeEnd", // 结束字段
106
+ label: "创建日期",
107
+ component: () => {
108
+ return {
109
+ tag: "jh-date",
110
+ type: "daterange",
111
+ rangeSeparator: "至",
112
+ showFormat: "YYYY-MM-DD",
113
+ valueFormat: "YYYY-MM-DD"
114
+ };
115
+ }
116
+ }
117
+ ];
118
+
119
+ // 使用时会自动拆分为 startName 和 endName 两个字段
120
+ // query.createDateTimeStart = "2026-01-01"
121
+ // query.createDateTimeEnd = "2026-01-31"
122
+ ```
123
+
124
+ ### 场景 4:与后端接口参数映射
125
+
126
+ ```ts
127
+ // v-model 方式
128
+ query.dateRange = ["2026-01-01", "2026-01-31"]
129
+
130
+ // 请求参数建议拆分传递
131
+ params: {
132
+ startDate: query.dateRange?.[0],
133
+ endDate: query.dateRange?.[1]
134
+ }
135
+
136
+ // 或使用 beginValue/endValue 方式
137
+ query.beginDate = "2026-01-01"
138
+ query.endDate = "2026-01-31"
139
+
140
+ // 请求参数直接使用
141
+ params: {
142
+ startDate: query.beginDate,
143
+ endDate: query.endDate
144
+ }
145
+ ```
146
+
147
+ ---
148
+
149
+ ## 与 el-date-picker 对比
150
+
151
+ ### 使用 jh-date-range(推荐)
152
+
153
+ ```vue
154
+ <jh-date-range v-model="query.dateRange" />
155
+ ```
156
+
157
+ ✅ 统一默认格式
158
+ ✅ 简化配置
159
+ ✅ 风格一致
160
+
161
+ ### 使用 el-date-picker(不推荐)
162
+
163
+ ```vue
164
+ <el-date-picker
165
+ v-model="query.dateRange"
166
+ type="daterange"
167
+ value-format="YYYY-MM-DD"
168
+ format="YYYY-MM-DD"
169
+ range-separator="至"
170
+ start-placeholder="开始日期"
171
+ end-placeholder="结束日期"
172
+ />
173
+ ```
174
+
175
+ ❌ 配置繁琐
176
+ ❌ 每处都要重复写默认格式
177
+ ❌ 风格不统一
178
+
179
+ ---
180
+
181
+ ## 最佳实践
182
+
183
+ ### 1️⃣ 统一返回字符串格式(强烈推荐)
184
+
185
+ ```vue
186
+ <jh-date-range v-model="query.dateRange" value-format="YYYY-MM-DD" />
187
+ ```
188
+
189
+ 避免 Date / string 混用,接口参数更稳定
190
+
191
+ ---
192
+
193
+ ### 2️⃣ 查询条件建议 always clearable
194
+
195
+ ```vue
196
+ <jh-date-range v-model="query.range" clearable />
197
+ ```
198
+
199
+ ---
200
+
201
+ ### 3️⃣ 请求参数建议拆分传递
202
+
203
+ ```ts
204
+ const [startDate, endDate] = query.value.dateRange || [];
205
+ request({
206
+ url: "/api/list",
207
+ params: { startDate, endDate }
208
+ });
209
+ ```
210
+
211
+ ---
212
+
213
+ ### 4️⃣ 与单日期选择区分使用
214
+
215
+ - 单个日期:`jh-date`
216
+ - 日期范围:`jh-date-range`
217
+
218
+ ---
219
+
220
+ ## 注意事项
221
+
222
+ 1. **v-model 为数组**
223
+ - 必须使用数组字段接收
224
+ - 推荐默认 `[]`
225
+
226
+ 2. **valueFormat 决定返回类型**
227
+ - 默认 `"YYYY-MM-DD"` 字符串数组
228
+ - 不建议返回 Date(容易引入时区/格式问题)
229
+
230
+ 3. **后端字段建议统一**
231
+ - 强烈建议后端使用 `startDate/endDate` 两个字段接收
232
+
233
+ ---
234
+
235
+ ## 🎯 真实项目示例
236
+
237
+ ### 示例 1:列表查询
238
+
239
+ ```vue
240
+ <jh-date-range v-model="query.createDateRange" />
241
+ ```
242
+
243
+ ### 示例 2:报表筛选
244
+
245
+ ```vue
246
+ <jh-date-range v-model="query.statRange" />
247
+ ```
248
+
249
+ ---
250
+
251
+ ## 🚀 快速开始
252
+
253
+ 1. 使用数组字段绑定 v-model(如 `dateRange`)
254
+ 2. 默认返回 `"YYYY-MM-DD"` 字符串数组
255
+ 3. 请求参数拆分成 start / end 传递
256
+
257
+ **推荐作为平台统一的日期范围选择组件使用!**