workdesktop-ai 1.0.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/CHANGELOG.md +62 -0
- package/LICENSE +21 -0
- package/README.md +214 -0
- package/dist/index.esm.js +6531 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.umd.js +11 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/types/src/components/buttons/ApiButton.vue.d.ts +96 -0
- package/dist/types/src/components/buttons/ConfirmButton.vue.d.ts +131 -0
- package/dist/types/src/components/buttons/DialogButton.vue.d.ts +107 -0
- package/dist/types/src/components/buttons/DrawerButton.vue.d.ts +118 -0
- package/dist/types/src/components/buttons/PromptButton.vue.d.ts +140 -0
- package/dist/types/src/components/buttons/RouteButton.vue.d.ts +84 -0
- package/dist/types/src/components/buttons/TipsButton.vue.d.ts +64 -0
- package/dist/types/src/components/buttons/useApiAction.d.ts +20 -0
- package/dist/types/src/components/common/props.d.ts +85 -0
- package/dist/types/src/components/containers/Dialog.vue.d.ts +112 -0
- package/dist/types/src/components/containers/Drawer.vue.d.ts +119 -0
- package/dist/types/src/components/containers/Iframe.vue.d.ts +44 -0
- package/dist/types/src/components/containers/SearchPanel.vue.d.ts +152 -0
- package/dist/types/src/components/containers/containerContext.d.ts +15 -0
- package/dist/types/src/components/containers/useContainerController.d.ts +19 -0
- package/dist/types/src/components/data/datagrid/DataGrid.vue.d.ts +335 -0
- package/dist/types/src/components/data/datagrid/useColumnSettings.d.ts +48 -0
- package/dist/types/src/components/data/editable-table/EditableTable.vue.d.ts +306 -0
- package/dist/types/src/components/form/data-form/DataForm.vue.d.ts +311 -0
- package/dist/types/src/components/index.d.ts +27 -0
- package/dist/types/src/components/inputs/AutoComplete.vue.d.ts +157 -0
- package/dist/types/src/components/inputs/CheckboxList.vue.d.ts +141 -0
- package/dist/types/src/components/inputs/RadioList.vue.d.ts +141 -0
- package/dist/types/src/components/inputs/Select.vue.d.ts +166 -0
- package/dist/types/src/components/inputs/Switch.vue.d.ts +116 -0
- package/dist/types/src/components/inputs/useOptionsLoader.d.ts +29 -0
- package/dist/types/src/components/styles/Panel.vue.d.ts +41 -0
- package/dist/types/src/components/styles/Tips.vue.d.ts +60 -0
- package/dist/types/src/components/upload/ImageUpload.vue.d.ts +176 -0
- package/dist/types/src/components/upload/Upload.vue.d.ts +235 -0
- package/dist/types/src/components/utils/Viewer.vue.d.ts +131 -0
- package/dist/types/src/index.d.ts +20 -0
- package/dist/types/src/lib/composables/useConfig.d.ts +19 -0
- package/dist/types/src/lib/composables/useDataGrid.d.ts +54 -0
- package/dist/types/src/lib/composables/useEventBus.d.ts +16 -0
- package/dist/types/src/lib/composables/useGlobalState.d.ts +5 -0
- package/dist/types/src/lib/composables/useRequest.d.ts +42 -0
- package/dist/types/src/lib/configs/default-config.d.ts +6 -0
- package/dist/types/src/lib/core/config.d.ts +28 -0
- package/dist/types/src/lib/core/http.d.ts +83 -0
- package/dist/types/src/lib/core/linkage.d.ts +48 -0
- package/dist/types/src/lib/core/theme.d.ts +6 -0
- package/dist/types/src/lib/core/utils.d.ts +28 -0
- package/dist/types/src/lib/install.d.ts +11 -0
- package/dist/types/src/types/config.d.ts +109 -0
- package/dist/types/src/types/index.d.ts +4 -0
- package/dist/types/vite.config.d.ts +2 -0
- package/package.json +68 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
本项目遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/)。
|
|
4
|
+
|
|
5
|
+
## [Unreleased]
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- 暂无
|
|
10
|
+
|
|
11
|
+
## [1.0.0] - 2026-09-05
|
|
12
|
+
|
|
13
|
+
首个正式发布。
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
**基础设施**
|
|
18
|
+
|
|
19
|
+
- HTTP 客户端 `request` / `http`:axios 封装,统一 `{ code, message, data }` 解封包、`urlPrefix` 前缀、Loading、成功/失败/异常提示、请求全生命周期监听、`create()` 子实例配置覆盖、请求/响应拦截器。
|
|
20
|
+
- 三级配置系统:内置默认配置 → 全局配置(`app.use` 第二参 / `window.workDesktopConfig`)→ 组件 props,deep merge;运行期 API `initConfig / setGlobalConfig / getGlobalConfig / mergeConfig / resetConfig`。
|
|
21
|
+
- 主题系统:语义色令牌(primary/success/warning/danger/info)与自定义 CSS 变量,支持配置对象生成 + CSS 变量覆盖。
|
|
22
|
+
- 声明式联动注册中心(`registerDataGrid / refreshDataGrid / searchDataGrid / resetSearchDataGrid / getDataGrids`):属性式联动(`head-refresh-datagrid` / `head-close-drawer` 等)。
|
|
23
|
+
- 组合式 Hooks:`useRequest`、`useDataGrid`、`useConfig`、`useGlobalConfig`、`useEventBus`、`useGlobalState`。
|
|
24
|
+
- 轻量事件总线 `useEventBus` 支持跨层级事件驱动联动。
|
|
25
|
+
|
|
26
|
+
**数据组件**
|
|
27
|
+
|
|
28
|
+
- `WdDataGrid`:API / 静态双数据源、分页、搜索联动、工具栏(刷新 / 表格大小 / 视图切换)、动态列设置与本地持久化、序号列、多选、树形数据、卡片模式、行操作列场景规范。
|
|
29
|
+
- `WdEditableTable`:单元格级可编辑表格。
|
|
30
|
+
- `WdDataForm`:新增 / 编辑 / 详情回填、校验、提交(含保存并继续)、API 加载、字段白/黑名单、改动检测(`isDirty` / 离开拦截)、提交后联动刷新目标 DataGrid。
|
|
31
|
+
|
|
32
|
+
**按钮组(7)**
|
|
33
|
+
|
|
34
|
+
- `WdApiButton`、`WdConfirmButton`、`WdPromptButton`、`WdRouteButton`、`WdTipsButton`、`WdDrawerButton`、`WdDialogButton`。
|
|
35
|
+
|
|
36
|
+
**容器组(4)**
|
|
37
|
+
|
|
38
|
+
- `WdDialog`、`WdDrawer`、`WdIframe`、`WdSearchPanel`(含头部刷新/重置声明式联动)。
|
|
39
|
+
|
|
40
|
+
**输入选择组(5)**
|
|
41
|
+
|
|
42
|
+
- `WdSelect`、`WdAutoComplete`、`WdCheckboxList`、`WdRadioList`、`WdSwitch`。
|
|
43
|
+
|
|
44
|
+
**上传组(2)**
|
|
45
|
+
|
|
46
|
+
- `WdUpload`(单/多文件、模板下载、错误回显)、`WdImageUpload`(图片预览与裁剪配合 Viewer)。
|
|
47
|
+
|
|
48
|
+
**展示与工具**
|
|
49
|
+
|
|
50
|
+
- `WdPanel`、`WdTips`(长内容悬停提示)、`WdViewer`(图片 / PDF / 文档预览,缩放旋转翻页)。
|
|
51
|
+
|
|
52
|
+
**工程与质量**
|
|
53
|
+
|
|
54
|
+
- Vite 库模式双产物:ESM(`index.esm.js`)+ UMD(`index.umd.js`,全局名 `WorkDesktop`)+ 全量 `.d.ts` + 汇总 `style.css`。
|
|
55
|
+
- TypeScript 全类型导出;文档站(组件示例 + 场景演示 + Playground)、Mock 服务。
|
|
56
|
+
- 测试体系:vitest + @vue/test-utils,基础设施单测 87 用例 + DataGrid/DataForm 集成 19 用例,基础库行覆盖率 98%。
|
|
57
|
+
- 中文内置文案,语义化版本与开源配置(MIT)。
|
|
58
|
+
|
|
59
|
+
<!-- 仓库地址确定后,可在各版本标题补上比较链接,例如:
|
|
60
|
+
[Unreleased]: https://github.com/<owner>/workdesktop-ai/compare/v1.0.0...HEAD
|
|
61
|
+
[1.0.0]: https://github.com/<owner>/workdesktop-ai/releases/tag/v1.0.0
|
|
62
|
+
-->
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 WorkDesktop AI contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<strong>WorkDesktop AI</strong><br/>
|
|
3
|
+
<span>企业级 Vue 3 组件库 · 基于 ElementPlus · HTML 模板友好 / AI 编码友好</span>
|
|
4
|
+
</p>
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
WorkDesktop AI 是一套面向企业后台管理场景的 Vue 3 组件库,在 ElementPlus 之上做「场景化复合封装」:
|
|
9
|
+
|
|
10
|
+
- **列表一体化**:`DataGrid` 一个组件完成「查询 + 分页 + 工具栏 + 表格 + 列设置 + 卡片/表格切换」;
|
|
11
|
+
- **请求一体化**:内置 axios 封装,自动完成 `{ code, message, data }` 解封包、Loading、错误提示;
|
|
12
|
+
- **AI 编码友好**:`HTML 模板渲染优先`,组件用标签即所得,TypeScript 类型完整;
|
|
13
|
+
- **双入口**:既支持 npm 工程化使用,也支持浏览器 `<script>` 直引(UMD),无需构建。
|
|
14
|
+
|
|
15
|
+
## 特性
|
|
16
|
+
|
|
17
|
+
| 能力 | 说明 |
|
|
18
|
+
| ---- | ---- |
|
|
19
|
+
| 25 个业务组件 | DataGrid / DataForm / EditableTable / SearchPanel / 7 类按钮 / Dialog / Drawer / Viewer 等 |
|
|
20
|
+
| 三级配置 | 内置默认 → 全局(`app.use` / `window.workDesktopConfig`)→ 组件 props,deep merge |
|
|
21
|
+
| 内置 HTTP | axios 封装:统一封包格式、URL 前缀、Loading、失败/异常提示、请求监听、子实例配置 |
|
|
22
|
+
| 声明式联动 | 属性(`head-refresh-datagrid` 等)+ 事件驱动(A+B 混合),无需引入中心化 DSL |
|
|
23
|
+
| 组合式 Hooks | `useRequest` / `useDataGrid` / `useConfig` / `useEventBus` / `useGlobalState` |
|
|
24
|
+
| 双产物构建 | `dist/index.esm.js` + `dist/index.umd.js` + `dist/style.css` + 完整 `.d.ts` |
|
|
25
|
+
| 开箱主题 | 语义色令牌 + CSS 变量覆盖 + 配置对象生成主题 |
|
|
26
|
+
| 测试保障 | vitest + @vue/test-utils:106 用例,基础库行覆盖率 98% |
|
|
27
|
+
|
|
28
|
+
## 安装
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install workdesktop-ai element-plus @element-plus/icons-vue
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`vue`(^3.3)与 `element-plus`(^2.5)为 peer 依赖,由宿主项目安装;`axios` 已打进产物。
|
|
35
|
+
|
|
36
|
+
## 快速开始
|
|
37
|
+
|
|
38
|
+
### npm 全量引入
|
|
39
|
+
|
|
40
|
+
```ts
|
|
41
|
+
import { createApp } from 'vue'
|
|
42
|
+
import ElementPlus from 'element-plus'
|
|
43
|
+
import 'element-plus/dist/index.css'
|
|
44
|
+
import zhCn from 'element-plus/es/locale/lang/zh-cn'
|
|
45
|
+
|
|
46
|
+
import WorkDesktop from 'workdesktop-ai' // Vue 插件:全量注册 25 个组件
|
|
47
|
+
import 'workdesktop-ai/style.css'
|
|
48
|
+
|
|
49
|
+
const app = createApp(App)
|
|
50
|
+
app.use(ElementPlus, { locale: zhCn })
|
|
51
|
+
app.use(WorkDesktop, {
|
|
52
|
+
request: { urlPrefix: '/api' } // 可选的全局配置,见下文「全局配置」
|
|
53
|
+
})
|
|
54
|
+
app.mount('#app')
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
模板中直接写组件:
|
|
58
|
+
|
|
59
|
+
```html
|
|
60
|
+
<wd-search-panel head-refresh-datagrid filter="main" collapsible>
|
|
61
|
+
<template #default="{ model }">
|
|
62
|
+
<el-form-item label="姓名">
|
|
63
|
+
<el-input v-model="model.name" placeholder="模糊搜索姓名" clearable />
|
|
64
|
+
</el-form-item>
|
|
65
|
+
</template>
|
|
66
|
+
</wd-search-panel>
|
|
67
|
+
|
|
68
|
+
<wd-data-grid api="/user/list" :active="true" filter="main">
|
|
69
|
+
<el-table-column prop="id" label="ID" width="80" />
|
|
70
|
+
<el-table-column prop="name" label="姓名" min-width="120" />
|
|
71
|
+
<el-table-column prop="dept" label="部门" width="110" />
|
|
72
|
+
<el-table-column prop="createTime" label="创建时间" min-width="120" />
|
|
73
|
+
</wd-data-grid>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
> 搜索面板与表格配置相同 `filter`,点击「查询」即自动刷新表格并重置到第一页 —— 无需写任何联动代码。
|
|
77
|
+
|
|
78
|
+
### 按需引入
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import { createApp } from 'vue'
|
|
82
|
+
import { WdDataGrid, WdDataForm } from 'workdesktop-ai'
|
|
83
|
+
import 'workdesktop-ai/style.css'
|
|
84
|
+
|
|
85
|
+
const app = createApp(App)
|
|
86
|
+
app.component(WdDataGrid.name, WdDataGrid)
|
|
87
|
+
app.component(WdDataForm.name, WdDataForm)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 纯 script 直引(UMD,无需构建)
|
|
91
|
+
|
|
92
|
+
在 HTML 中依次引入 Vue3、ElementPlus、图标库与本库产物:
|
|
93
|
+
|
|
94
|
+
```html
|
|
95
|
+
<!DOCTYPE html>
|
|
96
|
+
<html lang="zh-CN">
|
|
97
|
+
<head>
|
|
98
|
+
<meta charset="UTF-8" />
|
|
99
|
+
<link rel="stylesheet" href="https://unpkg.com/element-plus/dist/index.css" />
|
|
100
|
+
<link rel="stylesheet" href="./dist/style.css" />
|
|
101
|
+
</head>
|
|
102
|
+
<body>
|
|
103
|
+
<div id="app">
|
|
104
|
+
<wd-data-grid :data-source="rows" :active="false" with-index>
|
|
105
|
+
<el-table-column prop="name" label="姓名" />
|
|
106
|
+
<el-table-column prop="age" label="年龄" width="90" />
|
|
107
|
+
</wd-data-grid>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
|
|
111
|
+
<script src="https://unpkg.com/element-plus/dist/index.full.min.js"></script>
|
|
112
|
+
<script src="https://unpkg.com/@element-plus/icons-vue/dist/index.iife.min.js"></script>
|
|
113
|
+
<!-- UMD 产物:挂载到 window.WorkDesktop -->
|
|
114
|
+
<script src="./dist/index.umd.js"></script>
|
|
115
|
+
<script>
|
|
116
|
+
// 全局配置(可选,在 install 之前声明即可)
|
|
117
|
+
window.workDesktopConfig = {
|
|
118
|
+
request: { urlPrefix: '/api' },
|
|
119
|
+
theme: { colors: { primary: '#2f6bff' } }
|
|
120
|
+
}
|
|
121
|
+
const { WorkDesktop } = window.WorkDesktop
|
|
122
|
+
const app = Vue.createApp({
|
|
123
|
+
setup() { return { rows: [{ name: '张三', age: 28 }] } }
|
|
124
|
+
})
|
|
125
|
+
app.use(ElementPlus)
|
|
126
|
+
app.use(WorkDesktop)
|
|
127
|
+
app.mount('#app')
|
|
128
|
+
</script>
|
|
129
|
+
</body>
|
|
130
|
+
</html>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## 全局配置
|
|
134
|
+
|
|
135
|
+
配置按 **默认层 → 全局层 → 组件 props** 三级覆盖(deep merge)。全局层可通过插件的第二个参数,或在纯 script 场景下通过 `window.workDesktopConfig` 声明:
|
|
136
|
+
|
|
137
|
+
```ts
|
|
138
|
+
app.use(WorkDesktop, {
|
|
139
|
+
// HTTP
|
|
140
|
+
request: {
|
|
141
|
+
urlPrefix: '/api',
|
|
142
|
+
axiosConfig: { timeout: 15000 }, // 透传给 axios
|
|
143
|
+
loading: { enable: true },
|
|
144
|
+
transform: {
|
|
145
|
+
requestInterceptor: (config) => config, // 发请求前改写 axios 配置
|
|
146
|
+
responseInterceptor: (res) => res // 拿到响应后改写
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
// 响应约定:{ code, message, data },code >= successCode 视为成功
|
|
150
|
+
response: { successCode: 0 },
|
|
151
|
+
// 每个组件的默认 props
|
|
152
|
+
page: {
|
|
153
|
+
componentDefault: {
|
|
154
|
+
WdDatagrid: { withPager: true, pageSize: 20 },
|
|
155
|
+
WdDataForm: { submitApi: '/save' }
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
// 主题
|
|
159
|
+
theme: { colors: { primary: '#2f6bff' }, cssVars: { '--wd-radius': '8px' } }
|
|
160
|
+
})
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
组件级 props 优先级最高,三者按需覆盖。运行期也提供 API:`setGlobalConfig` / `mergeConfig` / `getGlobalConfig` / `resetConfig`。
|
|
164
|
+
|
|
165
|
+
## 与 ElementPlus 的边界
|
|
166
|
+
|
|
167
|
+
- 基础控件(按钮、输入框、下拉、表格单元格等)继续使用 ElementPlus,**不重复造轮子**;
|
|
168
|
+
- 本库只做场景化复合与业务约定的封装,宿主对 ElementPlus 的使用方式完全不受影响。
|
|
169
|
+
|
|
170
|
+
## 组件总览
|
|
171
|
+
|
|
172
|
+
| 分组 | 组件 |
|
|
173
|
+
| ---- | ---- |
|
|
174
|
+
| 数据 | `WdDataGrid`(WdDatagrid,`<wd-data-grid>`)、`WdEditableTable` |
|
|
175
|
+
| 表单 | `WdDataForm`(`<wd-data-form>`) |
|
|
176
|
+
| 按钮组 | `WdApiButton` / `WdConfirmButton` / `WdPromptButton` / `WdRouteButton` / `WdTipsButton` / `WdDrawerButton` / `WdDialogButton` |
|
|
177
|
+
| 容器组 | `WdDialog` / `WdDrawer` / `WdIframe` / `WdSearchPanel` |
|
|
178
|
+
| 输入选择 | `WdSelect` / `WdAutoComplete` / `WdCheckboxList` / `WdRadioList` / `WdSwitch` |
|
|
179
|
+
| 上传 | `WdUpload` / `WdImageUpload` |
|
|
180
|
+
| 样式 | `WdPanel` / `WdTips` |
|
|
181
|
+
| 工具 | `WdViewer` |
|
|
182
|
+
|
|
183
|
+
## Hooks
|
|
184
|
+
|
|
185
|
+
```ts
|
|
186
|
+
import { useRequest, useDataGrid, useEventBus } from 'workdesktop-ai'
|
|
187
|
+
|
|
188
|
+
// 请求:自动 loading / 错误处理
|
|
189
|
+
const { data, loading, run, refresh } = useRequest('/user/detail', { immediate: true })
|
|
190
|
+
|
|
191
|
+
// 表格数据流
|
|
192
|
+
const grid = useDataGrid({ api: '/user/list', immediate: true })
|
|
193
|
+
await grid.search({ name: '张' })
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## 本地开发
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
npm install # 安装依赖
|
|
200
|
+
npm run dev # 本地 Playground(vite)
|
|
201
|
+
npm run docs:dev # 文档站本地预览
|
|
202
|
+
npm test # 单元 / 集成测试
|
|
203
|
+
npm run test:coverage # 覆盖率(阈值:lines/funcs ≥ 80%,branches ≥ 70%)
|
|
204
|
+
npm run typecheck # 类型检查(vue-tsc)
|
|
205
|
+
npm run build # 产出 ESM + UMD + .d.ts 到 dist/
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## 参与贡献
|
|
209
|
+
|
|
210
|
+
欢迎提交 Issue 与 PR,详见 [CONTRIBUTING.md](./CONTRIBUTING.md)。
|
|
211
|
+
|
|
212
|
+
## License
|
|
213
|
+
|
|
214
|
+
[MIT](./LICENSE)
|