@agile-team/wl-skills-kit 2.3.4 → 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 (90) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +13 -7
  3. package/files/.cursor/mcp.json +8 -8
  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 -109
  7. package/files/.github/guides/usage.md +184 -184
  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/headers/agents.txt +8 -8
  16. package/files/.github/skills/_compat/headers/claude-code.txt +7 -7
  17. package/files/.github/skills/_compat/headers/cline.txt +7 -7
  18. package/files/.github/skills/_compat/headers/cursor-mdc.txt +16 -16
  19. package/files/.github/skills/_compat/headers/cursor-rules.txt +7 -7
  20. package/files/.github/skills/_compat/headers/github-copilot.txt +1 -1
  21. package/files/.github/skills/_compat/headers/kiro.txt +10 -10
  22. package/files/.github/skills/_compat/headers/qoder.txt +8 -8
  23. package/files/.github/skills/_compat/headers/trae.txt +11 -11
  24. package/files/.github/skills/_compat/headers/windsurf.txt +7 -7
  25. package/files/.github/skills/_registry.md +81 -81
  26. package/files/.github/skills/core/api-contract/SKILL.md +344 -344
  27. package/files/.github/skills/core/api-contract/USAGE.md +110 -110
  28. package/files/.github/skills/core/convention-audit/SKILL.md +189 -189
  29. package/files/.github/skills/core/convention-audit/USAGE.md +99 -99
  30. package/files/.github/skills/core/page-codegen/SKILL.md +973 -973
  31. package/files/.github/skills/core/page-codegen/USAGE.md +102 -102
  32. package/files/.github/skills/core/page-codegen/templates/_index.md +46 -46
  33. package/files/.github/skills/core/page-codegen/templates/domains/_CONTRIBUTING.md +107 -107
  34. package/files/.github/skills/core/page-codegen/templates/domains/produce/TPL-OPERATION-STATION.md +442 -442
  35. package/files/.github/skills/core/page-codegen/templates/domains/sale/README.md +26 -26
  36. package/files/.github/skills/core/page-codegen/templates/universal/TPL-CHANGE-HISTORY.md +276 -276
  37. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DETAIL-TABS.md +1145 -1145
  38. package/files/.github/skills/core/page-codegen/templates/universal/TPL-DRIVEN.md +309 -309
  39. package/files/.github/skills/core/page-codegen/templates/universal/TPL-FORM-ROUTE.md +436 -436
  40. package/files/.github/skills/core/page-codegen/templates/universal/TPL-LIST.md +191 -191
  41. package/files/.github/skills/core/page-codegen/templates/universal/TPL-MASTER-DETAIL.md +148 -148
  42. package/files/.github/skills/core/page-codegen/templates/universal/TPL-RECORD-FORM.md +376 -376
  43. package/files/.github/skills/core/page-codegen/templates/universal/TPL-TREE-LIST.md +186 -186
  44. package/files/.github/skills/core/prototype-scan/SKILL.md +498 -498
  45. package/files/.github/skills/core/prototype-scan/USAGE.md +95 -95
  46. package/files/.github/skills/core/template-extract/SKILL.md +139 -139
  47. package/files/.github/skills/core/template-extract/USAGE.md +93 -93
  48. package/files/.github/skills/domain/README.md +51 -51
  49. package/files/.github/skills/sync/menu-sync/SKILL.md +263 -263
  50. package/files/.github/skills/sync/menu-sync/USAGE.md +104 -104
  51. package/files/.github/skills/sync/menu-sync/env/env.local.json +7 -7
  52. package/files/.github/skills/sync/menu-sync/env/guide.md +99 -99
  53. package/files/.github/skills/sync/permission-sync/SKILL.draft.md +91 -91
  54. package/files/.github/standards/01-toolchain.md +57 -57
  55. package/files/.github/standards/02-code-structure.md +111 -111
  56. package/files/.github/standards/03-comments.md +53 -53
  57. package/files/.github/standards/04-coding-basics.md +33 -33
  58. package/files/.github/standards/05-logging.md +38 -38
  59. package/files/.github/standards/06-security.md +44 -44
  60. package/files/.github/standards/07-config.md +52 -52
  61. package/files/.github/standards/08-git.md +60 -60
  62. package/files/.github/standards/09-typescript.md +71 -71
  63. package/files/.github/standards/10-pinia.md +57 -57
  64. package/files/.github/standards/11-form-validation.md +81 -81
  65. package/files/.github/standards/12-base-table.md +153 -153
  66. package/files/.github/standards/13-platform-components.md +123 -123
  67. package/files/.github/standards/index.md +89 -89
  68. package/files/.kiro/settings/mcp.json +8 -8
  69. package/files/.mcp.json +8 -8
  70. package/files/.vscode/mcp.json +9 -9
  71. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/data.ts +196 -196
  72. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.scss +150 -150
  73. package/files/demo/produce/aiflow/mmwr-customer-apply-change-history/index.vue +79 -79
  74. package/files/docs/jh-date-range.md +257 -257
  75. package/files/docs/jh-date.md +222 -222
  76. package/files/docs/jh-dept-picker.md +190 -190
  77. package/files/docs/jh-drag-row.md +590 -590
  78. package/files/docs/jh-file-upload.md +216 -216
  79. package/files/docs/jh-picker.md +218 -218
  80. package/files/docs/jh-select.md +148 -148
  81. package/files/docs/jh-text.md +248 -248
  82. package/files/docs/jh-user-picker.md +197 -197
  83. package/files/src/components/global/C_RightToolbar/data.ts +228 -228
  84. package/files/src/components/global/C_RightToolbar/index.scss +44 -44
  85. package/files/src/components/global/C_Splitter/index.scss +61 -61
  86. package/files/src/components/global/C_SvgIcon/index.scss +15 -15
  87. package/files/src/components/global/C_TagStatus/index.scss +20 -20
  88. package/files/src/components/global/C_Tree/data.ts +61 -61
  89. package/files/src/components/local/c_listModal/index.scss +4 -4
  90. 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
+ **推荐作为平台统一的日期范围选择组件使用!**