@blueking/bk-user-selector 0.0.39-beta.3 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +314 -88
- package/package.json +2 -2
- package/typings/api/user.d.ts +42 -21
- package/typings/components/me-tag.vue.d.ts +14 -35
- package/typings/components/selection-popover.vue.d.ts +42 -197
- package/typings/components/user-selector.vue.d.ts +21 -29
- package/typings/constants/index.d.ts +25 -0
- package/typings/hooks/use-current-user.d.ts +30 -0
- package/typings/hooks/use-focus-state.d.ts +48 -0
- package/typings/hooks/use-input-handler.d.ts +44 -0
- package/typings/hooks/use-resize-observer.d.ts +17 -0
- package/typings/hooks/use-selected-users.d.ts +78 -0
- package/typings/hooks/use-sortable.d.ts +41 -0
- package/typings/hooks/use-tenant-data.d.ts +17 -0
- package/typings/hooks/use-user-search.d.ts +38 -0
- package/typings/hooks/use-user-selection.d.ts +32 -0
- package/typings/hooks/use-visible-tags.d.ts +51 -0
- package/typings/types/index.d.ts +117 -98
- package/typings/utils/logger.d.ts +47 -0
- package/vue2/index.es.min.js +2918 -4553
- package/vue2/index.iife.min.js +2864 -4442
- package/vue2/index.umd.min.js +2910 -4545
- package/vue2/vue2.css +28 -75
- package/vue3/index.es.min.js +1325 -1595
- package/vue3/index.iife.min.js +2908 -4543
- package/vue3/index.umd.min.js +1324 -1594
- package/vue3/vue3.css +28 -61
package/README.md
CHANGED
|
@@ -2,26 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://badge.fury.io/js/%40blueking%2Fbk-user-selector)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://vuejs.org/)
|
|
6
|
+
[](https://vuejs.org/)
|
|
5
7
|
|
|
6
8
|
蓝鲸多租户人员选择器(BkUserSelector)是一个用于在蓝鲸系统中选择用户的组件,支持单选和多选模式,具备搜索、跨租户查询等功能。
|
|
7
9
|
|
|
8
|
-
## 特性
|
|
10
|
+
## ✨ 特性
|
|
9
11
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
| 特性 | 说明 |
|
|
13
|
+
| ----------------- | ------------------------------------ |
|
|
14
|
+
| 🎯 **双版本支持** | 同时支持 Vue2 和 Vue3 |
|
|
15
|
+
| 🔄 **单选/多选** | 灵活切换单选和多选模式 |
|
|
16
|
+
| 🔍 **智能搜索** | 支持用户名、登录名、全名等多字段搜索 |
|
|
17
|
+
| 🏢 **跨租户** | 支持多租户场景下的用户选择和显示 |
|
|
18
|
+
| 🎨 **可拖拽** | 多选模式下支持拖拽排序 |
|
|
19
|
+
| ⚡ **快捷操作** | 支持快速选择当前用户("我") |
|
|
20
|
+
| 👥 **用户组** | 支持用户组/角色分组显示 |
|
|
21
|
+
| ✏️ **自定义输入** | 支持创建自定义用户和自由粘贴 |
|
|
22
|
+
| 🎭 **自定义渲染** | 支持自定义标签和列表项渲染 |
|
|
17
23
|
|
|
18
|
-
## 安装
|
|
24
|
+
## 📦 安装
|
|
19
25
|
|
|
20
26
|
```bash
|
|
27
|
+
# npm
|
|
21
28
|
npm install @blueking/bk-user-selector
|
|
29
|
+
|
|
30
|
+
# yarn
|
|
31
|
+
yarn add @blueking/bk-user-selector
|
|
32
|
+
|
|
33
|
+
# pnpm
|
|
34
|
+
pnpm add @blueking/bk-user-selector
|
|
22
35
|
```
|
|
23
36
|
|
|
24
|
-
##
|
|
37
|
+
## 🚀 快速开始
|
|
25
38
|
|
|
26
39
|
### 在 Vue3 中使用
|
|
27
40
|
|
|
@@ -49,6 +62,8 @@ export default {
|
|
|
49
62
|
};
|
|
50
63
|
```
|
|
51
64
|
|
|
65
|
+
## 📖 使用示例
|
|
66
|
+
|
|
52
67
|
### 基本用法
|
|
53
68
|
|
|
54
69
|
```vue
|
|
@@ -59,7 +74,6 @@ export default {
|
|
|
59
74
|
:api-base-url="apiBaseUrl"
|
|
60
75
|
:tenant-id="tenantId"
|
|
61
76
|
:current-user-id="currentUserId"
|
|
62
|
-
:exact-search-key="exactSearchKey"
|
|
63
77
|
@change="handleUserChange"
|
|
64
78
|
/>
|
|
65
79
|
|
|
@@ -69,11 +83,8 @@ export default {
|
|
|
69
83
|
:api-base-url="apiBaseUrl"
|
|
70
84
|
:tenant-id="tenantId"
|
|
71
85
|
:current-user-id="currentUserId"
|
|
72
|
-
:exact-search-key="exactSearchKey"
|
|
73
86
|
:multiple="true"
|
|
74
87
|
:draggable="true"
|
|
75
|
-
:user-group="userGroup"
|
|
76
|
-
:user-group-name="userGroupName"
|
|
77
88
|
@change="handleUsersChange"
|
|
78
89
|
/>
|
|
79
90
|
</template>
|
|
@@ -81,124 +92,339 @@ export default {
|
|
|
81
92
|
<script setup>
|
|
82
93
|
import { ref } from 'vue';
|
|
83
94
|
|
|
84
|
-
// API 基础路径
|
|
85
95
|
const apiBaseUrl = ref('https://api.example.com');
|
|
86
|
-
// 租户 ID
|
|
87
96
|
const tenantId = ref('default');
|
|
88
|
-
// 当前用户ID
|
|
89
97
|
const currentUserId = ref('admin');
|
|
90
|
-
|
|
91
|
-
const exactSearchKey = ref('bk_username');
|
|
98
|
+
|
|
92
99
|
// 单选选中值
|
|
93
100
|
const selectedUser = ref('');
|
|
94
101
|
// 多选选中值
|
|
95
102
|
const selectedUsers = ref([]);
|
|
96
|
-
|
|
103
|
+
|
|
104
|
+
const handleUserChange = user => {
|
|
105
|
+
console.log('Selected user:', user);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const handleUsersChange = users => {
|
|
109
|
+
console.log('Selected users:', users);
|
|
110
|
+
};
|
|
111
|
+
</script>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 用户组/角色模式
|
|
115
|
+
|
|
116
|
+
当需要在下拉列表中展示用户组(如角色、部门等)时:
|
|
117
|
+
|
|
118
|
+
```vue
|
|
119
|
+
<template>
|
|
120
|
+
<BkUserSelector
|
|
121
|
+
v-model="selectedUsers"
|
|
122
|
+
:api-base-url="apiBaseUrl"
|
|
123
|
+
:tenant-id="tenantId"
|
|
124
|
+
:multiple="true"
|
|
125
|
+
:user-group="userGroup"
|
|
126
|
+
:user-group-name="userGroupName"
|
|
127
|
+
@change="handleChange"
|
|
128
|
+
/>
|
|
129
|
+
</template>
|
|
130
|
+
|
|
131
|
+
<script setup>
|
|
132
|
+
import { ref } from 'vue';
|
|
133
|
+
|
|
134
|
+
const apiBaseUrl = ref('https://api.example.com');
|
|
135
|
+
const tenantId = ref('default');
|
|
136
|
+
const selectedUsers = ref([]);
|
|
137
|
+
|
|
138
|
+
// 用户组配置
|
|
97
139
|
const userGroup = ref([
|
|
98
140
|
{
|
|
99
141
|
id: '1',
|
|
100
142
|
name: '运维人员',
|
|
101
|
-
hidden: true,
|
|
143
|
+
hidden: true, // hidden 为 true 时,不会展示在下拉列表里,但回显时会展示
|
|
102
144
|
},
|
|
103
145
|
{
|
|
104
146
|
id: '2',
|
|
105
147
|
name: '产品人员',
|
|
106
148
|
},
|
|
107
149
|
]);
|
|
108
|
-
// 用户组名称
|
|
109
150
|
const userGroupName = ref('角色');
|
|
110
151
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
console.log('Selected user:', user);
|
|
152
|
+
const handleChange = users => {
|
|
153
|
+
console.log('Selected:', users);
|
|
114
154
|
};
|
|
155
|
+
</script>
|
|
156
|
+
```
|
|
115
157
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
158
|
+
### 自定义渲染
|
|
159
|
+
|
|
160
|
+
支持自定义标签和列表项的渲染:
|
|
161
|
+
|
|
162
|
+
```vue
|
|
163
|
+
<template>
|
|
164
|
+
<BkUserSelector
|
|
165
|
+
v-model="selectedUsers"
|
|
166
|
+
:api-base-url="apiBaseUrl"
|
|
167
|
+
:tenant-id="tenantId"
|
|
168
|
+
:multiple="true"
|
|
169
|
+
:render-tag="renderTag"
|
|
170
|
+
:render-list-item="renderListItem"
|
|
171
|
+
/>
|
|
172
|
+
</template>
|
|
173
|
+
|
|
174
|
+
<script setup>
|
|
175
|
+
import { ref, h } from 'vue';
|
|
176
|
+
|
|
177
|
+
const apiBaseUrl = ref('https://api.example.com');
|
|
178
|
+
const tenantId = ref('default');
|
|
179
|
+
const selectedUsers = ref([]);
|
|
180
|
+
|
|
181
|
+
// 自定义标签渲染
|
|
182
|
+
const renderTag = (createElement, userInfo) => {
|
|
183
|
+
return createElement('span', { class: 'custom-tag' }, [
|
|
184
|
+
createElement('img', { src: userInfo.logo, class: 'avatar' }),
|
|
185
|
+
userInfo.display_name,
|
|
186
|
+
]);
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
// 自定义列表项渲染
|
|
190
|
+
const renderListItem = (createElement, userInfo) => {
|
|
191
|
+
return createElement('div', { class: 'custom-item' }, [
|
|
192
|
+
createElement('img', { src: userInfo.logo, class: 'avatar' }),
|
|
193
|
+
createElement('div', { class: 'info' }, [
|
|
194
|
+
createElement('span', { class: 'name' }, userInfo.display_name),
|
|
195
|
+
createElement('span', { class: 'username' }, `@${userInfo.username}`),
|
|
196
|
+
]),
|
|
197
|
+
]);
|
|
198
|
+
};
|
|
199
|
+
</script>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
### 自定义输入
|
|
203
|
+
|
|
204
|
+
当 API 无法覆盖所有用户时,允许用户自定义输入:
|
|
205
|
+
|
|
206
|
+
```vue
|
|
207
|
+
<template>
|
|
208
|
+
<BkUserSelector
|
|
209
|
+
v-model="selectedUsers"
|
|
210
|
+
:api-base-url="apiBaseUrl"
|
|
211
|
+
:tenant-id="tenantId"
|
|
212
|
+
:multiple="true"
|
|
213
|
+
:allow-create="true"
|
|
214
|
+
:free-paste="true"
|
|
215
|
+
placeholder="输入用户名,按 Enter 确认"
|
|
216
|
+
@change="handleChange"
|
|
217
|
+
/>
|
|
218
|
+
</template>
|
|
219
|
+
|
|
220
|
+
<script setup>
|
|
221
|
+
import { ref } from 'vue';
|
|
222
|
+
|
|
223
|
+
const apiBaseUrl = ref('https://api.example.com');
|
|
224
|
+
const tenantId = ref('default');
|
|
225
|
+
const selectedUsers = ref([]);
|
|
226
|
+
|
|
227
|
+
const handleChange = users => {
|
|
228
|
+
// 自定义输入的用户 id 为输入的文本
|
|
229
|
+
console.log('Selected:', users);
|
|
119
230
|
};
|
|
120
231
|
</script>
|
|
121
232
|
```
|
|
122
233
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
|
154
|
-
|
|
|
155
|
-
|
|
|
156
|
-
|
|
|
157
|
-
|
|
158
|
-
|
|
234
|
+
### 排除指定用户
|
|
235
|
+
|
|
236
|
+
从下拉列表中排除特定用户:
|
|
237
|
+
|
|
238
|
+
```vue
|
|
239
|
+
<template>
|
|
240
|
+
<BkUserSelector
|
|
241
|
+
v-model="selectedUser"
|
|
242
|
+
:api-base-url="apiBaseUrl"
|
|
243
|
+
:tenant-id="tenantId"
|
|
244
|
+
:exclude-user-ids="excludeUserIds"
|
|
245
|
+
/>
|
|
246
|
+
</template>
|
|
247
|
+
|
|
248
|
+
<script setup>
|
|
249
|
+
import { ref } from 'vue';
|
|
250
|
+
|
|
251
|
+
const apiBaseUrl = ref('https://api.example.com');
|
|
252
|
+
const tenantId = ref('default');
|
|
253
|
+
const selectedUser = ref('');
|
|
254
|
+
|
|
255
|
+
// 排除这些用户,不会出现在搜索结果中
|
|
256
|
+
const excludeUserIds = ref(['user1', 'user2', 'user3']);
|
|
257
|
+
</script>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## 📋 API 文档
|
|
261
|
+
|
|
262
|
+
### Props 属性
|
|
263
|
+
|
|
264
|
+
| 参数 | 说明 | 类型 | 默认值 | 必填 |
|
|
265
|
+
| --------------------- | --------------------------------- | ------------------------------------------------ | ---------------------- | ---- |
|
|
266
|
+
| modelValue / v-model | 绑定值,单选为字符串,多选为数组 | `string` / `string[]` | `''` / `[]` | 是 |
|
|
267
|
+
| apiBaseUrl | API 基础 URL | `string` | `''` | 是 |
|
|
268
|
+
| tenantId | 租户 ID | `string` | `''` | 是 |
|
|
269
|
+
| label | 文本标签 | `string` | `'人员选择'` | 否 |
|
|
270
|
+
| placeholder | 占位文本 | `string` | `'请输入人员名称搜索'` | 否 |
|
|
271
|
+
| multiple | 是否多选 | `boolean` | `false` | 否 |
|
|
272
|
+
| draggable | 是否可拖拽排序(仅多选模式有效) | `boolean` | `false` | 否 |
|
|
273
|
+
| exactSearchKey | 精确查找 key | `'bk_username'` / `'login_name'` / `'full_name'` | `'bk_username'` | 否 |
|
|
274
|
+
| currentUserId | 当前用户 ID(用于快速选择"我") | `string` | `''` | 否 |
|
|
275
|
+
| userGroup | 用户组列表 | `UserGroupItem[]` | `[]` | 否 |
|
|
276
|
+
| userGroupName | 用户组分类名称 | `string` | `'用户群组'` | 否 |
|
|
277
|
+
| emptyText | 无匹配人员时的提示文本 | `string` | `'无匹配人员'` | 否 |
|
|
278
|
+
| disabled | 是否禁用 | `boolean` | `false` | 否 |
|
|
279
|
+
| renderTag | 自定义标签渲染函数 | `(h, userInfo) => VNode` | - | 否 |
|
|
280
|
+
| renderListItem | 自定义列表项渲染函数 | `(h, userInfo) => VNode` | - | 否 |
|
|
281
|
+
| excludeUserIds | 排除的用户 ID 列表 | `string[]` | `[]` | 否 |
|
|
282
|
+
| enableMultiTenantMode | 是否启用多租户模式 | `boolean` | `true` | 否 |
|
|
283
|
+
| allowCreate | 是否允许自定义输入,按 Enter 确认 | `boolean` | `false` | 否 |
|
|
284
|
+
| freePaste | 是否允许粘贴任意文本 | `boolean` | `false` | 否 |
|
|
285
|
+
| maxCount | 最大可选数量(0 表示不限制) | `number` | `0` | 否 |
|
|
286
|
+
|
|
287
|
+
#### exactSearchKey 说明
|
|
288
|
+
|
|
289
|
+
支持多个字段组合搜索,以逗号分隔:
|
|
290
|
+
|
|
291
|
+
| 值 | 说明 |
|
|
292
|
+
| ----------------------- | ---------------------- |
|
|
293
|
+
| `bk_username` | 按蓝鲸用户名搜索 |
|
|
294
|
+
| `login_name` | 按登录名搜索 |
|
|
295
|
+
| `full_name` | 按全名搜索 |
|
|
296
|
+
| `bk_username,full_name` | 同时按用户名和全名搜索 |
|
|
297
|
+
|
|
298
|
+
### Events 事件
|
|
299
|
+
|
|
300
|
+
| 事件名称 | 说明 | 回调参数 |
|
|
301
|
+
| ----------------- | -------------------- | ------------------------------------ |
|
|
302
|
+
| update:modelValue | 绑定值变化时触发 | `(value: string \| string[])` |
|
|
303
|
+
| change | 选中值变化时触发 | `(userInfo: UserInfo \| UserInfo[])` |
|
|
304
|
+
| focus | 输入框获得焦点时触发 | `(event: FocusEvent)` |
|
|
305
|
+
| blur | 输入框失去焦点时触发 | `(event: FocusEvent)` |
|
|
306
|
+
|
|
307
|
+
### 类型定义
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
// 用户信息
|
|
311
|
+
interface UserInfo {
|
|
312
|
+
id: string; // 用户 ID
|
|
313
|
+
username: string; // 用户名
|
|
314
|
+
display_name: string; // 显示名称
|
|
315
|
+
logo?: string; // 头像 URL
|
|
316
|
+
tenant_id?: string; // 租户 ID
|
|
317
|
+
// ... 其他字段
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// 用户组项
|
|
321
|
+
interface UserGroupItem {
|
|
322
|
+
id: string; // 用户组 ID
|
|
323
|
+
name: string; // 用户组名称
|
|
324
|
+
hidden?: boolean; // 是否隐藏(不在下拉列表显示,但会在回显时展示)
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// 自定义渲染函数
|
|
328
|
+
type RenderFunction = (
|
|
329
|
+
h: CreateElement, // Vue createElement 函数
|
|
330
|
+
userInfo: UserInfo, // 用户信息
|
|
331
|
+
) => VNode;
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
## 💡 功能说明
|
|
159
335
|
|
|
160
336
|
### 快速选择"我"
|
|
161
337
|
|
|
162
|
-
|
|
338
|
+
当设置了 `currentUserId` 属性后,组件会在输入框右侧显示一个"我"的标签:
|
|
163
339
|
|
|
164
|
-
-
|
|
165
|
-
-
|
|
166
|
-
-
|
|
340
|
+
- **单选模式**:点击"我"直接选中当前用户
|
|
341
|
+
- **多选模式**:点击"我"将当前用户添加到已选列表
|
|
342
|
+
- **状态反馈**:当前用户已被选中时,"我"标签显示为灰色且不可点击
|
|
167
343
|
|
|
168
344
|
### 用户组显示
|
|
169
345
|
|
|
170
|
-
|
|
346
|
+
当设置了 `userGroup` 属性后:
|
|
347
|
+
|
|
348
|
+
- 用户组会显示在下拉列表的独立分组中(默认名称为"用户群组")
|
|
349
|
+
- 用户组数据优先展示在列表顶部
|
|
350
|
+
- 聚焦时会自动展示下拉框
|
|
351
|
+
- 设置 `hidden: true` 的用户组不会在下拉列表中显示,但选中后会正常回显
|
|
352
|
+
|
|
353
|
+
### 多租户模式
|
|
354
|
+
|
|
355
|
+
通过 `enableMultiTenantMode` 控制:
|
|
356
|
+
|
|
357
|
+
- **开启(默认)**:使用多租户用户管理接口查询,支持跨租户显示
|
|
358
|
+
- **关闭**:使用原有用户管理接口查询
|
|
359
|
+
|
|
360
|
+
### 拖拽排序
|
|
361
|
+
|
|
362
|
+
在多选模式下启用 `draggable`:
|
|
363
|
+
|
|
364
|
+
- 支持拖拽调整已选用户的顺序
|
|
365
|
+
- 拖拽时会有视觉反馈
|
|
366
|
+
- 拖拽完成后会触发 `change` 事件
|
|
367
|
+
|
|
368
|
+
## ⚠️ 注意事项
|
|
369
|
+
|
|
370
|
+
1. **API 配置**:使用前必须正确配置 `apiBaseUrl` 和 `tenantId`
|
|
371
|
+
2. **CSS 引入**:记得引入对应版本的样式文件
|
|
372
|
+
3. **v-model 类型**:
|
|
373
|
+
- 单选模式:`v-model` 应为 `string` 类型
|
|
374
|
+
- 多选模式:`v-model` 应为 `string[]` 类型
|
|
375
|
+
4. **跨租户显示**:跨租户用户会在名称旁显示租户标识
|
|
376
|
+
5. **自定义输入**:启用 `allowCreate` 后,用户输入的内容会作为 `id` 值
|
|
377
|
+
|
|
378
|
+
## ❓ FAQ
|
|
379
|
+
|
|
380
|
+
### Q: 组件没有样式怎么办?
|
|
381
|
+
|
|
382
|
+
A: 请确保引入了对应版本的 CSS 文件:
|
|
171
383
|
|
|
172
384
|
```javascript
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
{
|
|
179
|
-
id: '2',
|
|
180
|
-
name: '产品人员',
|
|
181
|
-
},
|
|
182
|
-
];
|
|
385
|
+
// Vue3
|
|
386
|
+
import '@blueking/bk-user-selector/vue3/vue3.css';
|
|
387
|
+
|
|
388
|
+
// Vue2
|
|
389
|
+
import '@blueking/bk-user-selector/vue2/vue2.css';
|
|
183
390
|
```
|
|
184
391
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
392
|
+
### Q: 如何禁止选择某些用户?
|
|
393
|
+
|
|
394
|
+
A: 使用 `excludeUserIds` 属性传入需要排除的用户 ID 数组。
|
|
188
395
|
|
|
189
|
-
|
|
396
|
+
### Q: 如何获取完整的用户信息?
|
|
397
|
+
|
|
398
|
+
A: 通过 `change` 事件获取,它会返回完整的用户信息对象,而不仅仅是 ID。
|
|
399
|
+
|
|
400
|
+
### Q: 多选模式下如何限制选择数量?
|
|
401
|
+
|
|
402
|
+
A: 目前组件暂不支持直接限制,可以通过 `change` 事件监听并在超出数量时给出提示。
|
|
403
|
+
|
|
404
|
+
### Q: 搜索没有结果怎么办?
|
|
405
|
+
|
|
406
|
+
A: 检查以下几点:
|
|
407
|
+
|
|
408
|
+
1. `apiBaseUrl` 和 `tenantId` 是否正确配置
|
|
409
|
+
2. 网络请求是否正常
|
|
410
|
+
3. 搜索关键词是否匹配 `exactSearchKey` 配置的字段
|
|
411
|
+
|
|
412
|
+
## 🛠️ 开发
|
|
190
413
|
|
|
191
414
|
```bash
|
|
192
415
|
# 安装依赖
|
|
193
|
-
|
|
416
|
+
pnpm install
|
|
194
417
|
|
|
195
418
|
# 开发模式
|
|
196
|
-
|
|
419
|
+
pnpm run dev
|
|
197
420
|
|
|
198
421
|
# 构建
|
|
199
|
-
|
|
422
|
+
pnpm run build
|
|
423
|
+
|
|
424
|
+
# 类型检查
|
|
425
|
+
pnpm run type-check
|
|
200
426
|
```
|
|
201
427
|
|
|
202
|
-
## 许可证
|
|
428
|
+
## 📄 许可证
|
|
203
429
|
|
|
204
|
-
MIT
|
|
430
|
+
[MIT](./LICENSE) © 蓝鲸智云
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blueking/bk-user-selector",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"description": "蓝鲸用户选择器",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Tencent BlueKing",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"build": "tsx ./scripts/vite.build.ts",
|
|
11
11
|
"dts": "vue-tsc --project tsconfig.dts.json",
|
|
12
12
|
"prettier": "prettier ./src ./scripts ./playground --write",
|
|
13
|
-
"visualize": "vite-bundle-visualizer -c scripts/vite.
|
|
13
|
+
"visualize": "vite-bundle-visualizer -c scripts/vite.visualizer.ts"
|
|
14
14
|
},
|
|
15
15
|
"exports": {
|
|
16
16
|
".": {
|
package/typings/api/user.d.ts
CHANGED
|
@@ -7,33 +7,45 @@ import type { FormattedUser, Tenant, User } from '../types';
|
|
|
7
7
|
*/
|
|
8
8
|
export declare const getTenants: (apiBaseUrl: string, tenantId: string) => Promise<Tenant[]>;
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
11
|
-
* @param apiBaseUrl - API基础URL
|
|
12
|
-
* @param tenantId - 租户ID
|
|
13
|
-
* @param keyword - 搜索关键词
|
|
14
|
-
* @returns 用户列表Promise
|
|
10
|
+
* 搜索用户参数
|
|
15
11
|
*/
|
|
16
|
-
export
|
|
12
|
+
export interface SearchUsersParams {
|
|
13
|
+
/** API 基础 URL */
|
|
17
14
|
apiBaseUrl: string;
|
|
15
|
+
/** 是否启用多租户模式 */
|
|
18
16
|
enableMultiTenantMode?: boolean;
|
|
17
|
+
/** 搜索关键词 */
|
|
19
18
|
keyword: string;
|
|
19
|
+
/** 租户 ID */
|
|
20
20
|
tenantId: string;
|
|
21
|
-
}
|
|
21
|
+
}
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
24
|
-
* @param
|
|
25
|
-
* @
|
|
26
|
-
* @param users - 用户名列表
|
|
27
|
-
* @param exactSearchKey - 精确查找key
|
|
28
|
-
* @returns 查找到的用户列表Promise
|
|
23
|
+
* 模糊搜索用户
|
|
24
|
+
* @param params - 搜索参数
|
|
25
|
+
* @returns 用户列表Promise
|
|
29
26
|
*/
|
|
30
|
-
export declare const
|
|
27
|
+
export declare const searchUsers: (params: SearchUsersParams) => Promise<User[]>;
|
|
28
|
+
/**
|
|
29
|
+
* 批量查找用户参数
|
|
30
|
+
*/
|
|
31
|
+
export interface LookupUsersParams {
|
|
32
|
+
/** API 基础 URL */
|
|
31
33
|
apiBaseUrl: string;
|
|
34
|
+
/** 是否启用多租户模式 */
|
|
32
35
|
enableMultiTenantMode?: boolean;
|
|
36
|
+
/** 精确查找字段 */
|
|
33
37
|
exactSearchKey: string;
|
|
38
|
+
/** 租户 ID */
|
|
34
39
|
tenantId: string;
|
|
40
|
+
/** 用户名列表 */
|
|
35
41
|
usersList: string[];
|
|
36
|
-
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 批量精准查找用户
|
|
45
|
+
* @param params - 查找参数
|
|
46
|
+
* @returns 查找到的用户列表Promise
|
|
47
|
+
*/
|
|
48
|
+
export declare const lookupUsers: (params: LookupUsersParams) => Promise<User[]>;
|
|
37
49
|
/**
|
|
38
50
|
* 将API返回的用户数据格式化为组件所需格式
|
|
39
51
|
* @param users - API返回的用户列表
|
|
@@ -41,15 +53,24 @@ export declare const lookupUsers: (params: {
|
|
|
41
53
|
*/
|
|
42
54
|
export declare const formatUsers: (users: User[], enableMultiTenantMode?: boolean) => FormattedUser[];
|
|
43
55
|
/**
|
|
44
|
-
*
|
|
45
|
-
* @param url 请求的 URL
|
|
46
|
-
* @param params 请求参数
|
|
47
|
-
* @returns 用户列表
|
|
56
|
+
* 获取用户列表参数(兼容旧版本)
|
|
48
57
|
*/
|
|
49
|
-
export
|
|
58
|
+
export interface GetUserListParams {
|
|
59
|
+
/** 应用代码 */
|
|
50
60
|
appCode?: string;
|
|
61
|
+
/** 搜索关键词 */
|
|
51
62
|
keyword?: string;
|
|
63
|
+
/** 页码 */
|
|
52
64
|
page?: number;
|
|
65
|
+
/** 分页大小 */
|
|
53
66
|
pageSize?: number;
|
|
67
|
+
/** 用户 ID 列表 */
|
|
54
68
|
userIds?: string[];
|
|
55
|
-
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 获取用户列表(兼容旧版本的人员选择器)
|
|
72
|
+
* @param url - 请求的 URL
|
|
73
|
+
* @param params - 请求参数
|
|
74
|
+
* @returns 用户列表
|
|
75
|
+
*/
|
|
76
|
+
export declare const getUserList: (url: string, params: GetUserListParams) => Promise<User[]>;
|
|
@@ -1,39 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
default: boolean;
|
|
15
|
-
};
|
|
16
|
-
}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
17
|
-
click: (...args: any[]) => void;
|
|
18
|
-
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
19
|
-
/**
|
|
20
|
-
* 当前用户ID
|
|
21
|
-
*/
|
|
22
|
-
currentUserId: {
|
|
23
|
-
type: StringConstructor;
|
|
24
|
-
default: string;
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* 是否禁用
|
|
28
|
-
*/
|
|
29
|
-
isDisabled: {
|
|
30
|
-
type: BooleanConstructor;
|
|
31
|
-
default: boolean;
|
|
32
|
-
};
|
|
33
|
-
}>> & Readonly<{
|
|
34
|
-
onClick?: ((...args: any[]) => any) | undefined;
|
|
1
|
+
/**
|
|
2
|
+
* 组件属性
|
|
3
|
+
*/
|
|
4
|
+
interface MeTagProps {
|
|
5
|
+
/** 当前用户ID */
|
|
6
|
+
currentUserId?: string;
|
|
7
|
+
/** 是否禁用 */
|
|
8
|
+
isDisabled?: boolean;
|
|
9
|
+
}
|
|
10
|
+
declare const _default: import("vue").DefineComponent<MeTagProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
11
|
+
click: () => any;
|
|
12
|
+
}, string, import("vue").PublicProps, Readonly<MeTagProps> & Readonly<{
|
|
13
|
+
onClick?: (() => any) | undefined;
|
|
35
14
|
}>, {
|
|
36
15
|
currentUserId: string;
|
|
37
16
|
isDisabled: boolean;
|
|
38
|
-
}, {}, {}, {}, string, import("vue").ComponentProvideOptions,
|
|
17
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
39
18
|
export default _default;
|