@robot-admin/naive-ui-components 0.14.2 → 0.15.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 +30 -0
- package/README.md +130 -721
- package/README_EN.md +137 -658
- package/dist/C_ActionBar.css +57 -58
- package/dist/C_ActionBar2.cjs +1 -1
- package/dist/C_ActionBar2.js +1 -1
- package/dist/C_AntV.css +215 -222
- package/dist/C_AntV2.cjs +2 -2
- package/dist/C_AntV2.js +2 -2
- package/dist/C_AudioPlayer.css +11 -12
- package/dist/C_AvatarGroup.css +5 -6
- package/dist/C_Barcode.css +1 -1
- package/dist/C_Breadcrumb.css +15 -17
- package/dist/C_Breadcrumb2.cjs +1 -1
- package/dist/C_Breadcrumb2.js +1 -1
- package/dist/C_Captcha.css +45 -47
- package/dist/C_Captcha2.cjs +1 -1
- package/dist/C_Captcha2.js +1 -1
- package/dist/C_Cascade.css +2 -2
- package/dist/C_Chat.css +8 -8
- package/dist/C_City.css +6 -7
- package/dist/C_Code.css +14 -15
- package/dist/C_CollapsePanel.css +12 -13
- package/dist/C_ContextMenu.css +31 -31
- package/dist/C_Cron.css +272 -275
- package/dist/C_Date.css +1 -1
- package/dist/C_Draggable.css +10 -11
- package/dist/C_Editor.css +2 -2
- package/dist/C_FilePreview.css +193 -193
- package/dist/C_Form.base.css +607 -601
- package/dist/C_Form.cjs +1 -1
- package/dist/C_Form.css +609 -603
- package/dist/C_Form.d.cts +2 -2
- package/dist/C_Form.d.ts +2 -2
- package/dist/C_Form.js +1 -1
- package/dist/C_FormModal.cjs +1 -1
- package/dist/C_FormModal.css +14 -20
- package/dist/C_FormModal.js +1 -1
- package/dist/C_FormModal2.cjs +1 -1
- package/dist/C_FormModal2.js +1 -1
- package/dist/C_FormSearch.css +53 -55
- package/dist/C_FormSearch2.cjs +1 -1
- package/dist/C_FormSearch2.js +1 -1
- package/dist/C_FormulaEditor.css +314 -315
- package/dist/C_FullCalendar.css +14 -16
- package/dist/C_FullCalendar2.cjs +1 -1
- package/dist/C_FullCalendar2.js +1 -1
- package/dist/C_GlobalSearch.css +2 -2
- package/dist/C_Guide.css +14 -15
- package/dist/C_Icon.css +7 -8
- package/dist/C_ImageCropper.css +69 -69
- package/dist/C_Language.css +8 -8
- package/dist/C_Loading.css +20 -22
- package/dist/C_Loading2.cjs +1 -1
- package/dist/C_Loading2.js +1 -1
- package/dist/C_Login.css +130 -135
- package/dist/C_Login2.cjs +1 -1
- package/dist/C_Login2.js +1 -1
- package/dist/C_Map.css +22 -23
- package/dist/C_Markdown.css +2 -2
- package/dist/C_Menu.css +2 -5
- package/dist/C_Menu2.cjs +1 -1
- package/dist/C_Menu2.js +1 -1
- package/dist/C_NotificationCenter.css +300 -301
- package/dist/C_OrgChart.css +3 -3
- package/dist/C_PageLoading.css +35 -39
- package/dist/C_QRCode.css +5 -6
- package/dist/C_Signature.css +5 -6
- package/dist/C_Skeleton.css +6 -7
- package/dist/C_SplitPane.css +2 -2
- package/dist/C_Steps.css +2 -2
- package/dist/C_Table.base.css +1097 -870
- package/dist/C_Table.cjs +1 -1
- package/dist/C_Table.css +1101 -874
- package/dist/C_Table.d.cts +1 -1
- package/dist/C_Table.d.ts +1 -1
- package/dist/C_Table.js +1 -1
- package/dist/C_Tabs.css +2 -2
- package/dist/C_TagsView.css +72 -76
- package/dist/C_TagsView2.cjs +1 -1
- package/dist/C_TagsView2.js +1 -1
- package/dist/C_Theme.css +7 -8
- package/dist/C_Time.css +1 -1
- package/dist/C_Timeline.css +8 -8
- package/dist/C_Transfer.css +10 -11
- package/dist/C_Tree.css +16 -17
- package/dist/C_Upload.css +147 -148
- package/dist/C_VideoPlayer.css +280 -281
- package/dist/C_VtableGantt.css +2 -2
- package/dist/C_WaterFall.css +17 -18
- package/dist/C_WorkFlow.css +453 -457
- package/dist/C_WorkFlow2.cjs +1 -1
- package/dist/C_WorkFlow2.js +1 -1
- package/dist/Card.cjs +1 -0
- package/dist/Card.js +1 -0
- package/dist/Custom.cjs +1 -0
- package/dist/Custom.js +1 -0
- package/dist/Dynamic.cjs +1 -0
- package/dist/Dynamic.js +1 -0
- package/dist/Steps.cjs +1 -0
- package/dist/Steps.js +1 -0
- package/dist/Tabs.cjs +1 -0
- package/dist/Tabs.js +1 -0
- package/dist/cascader.cjs +1 -0
- package/dist/cascader.js +1 -0
- package/dist/color-picker.cjs +1 -0
- package/dist/color-picker.js +1 -0
- package/dist/constants.d.cts +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants3.d.cts +5 -5
- package/dist/constants3.d.ts +5 -5
- package/dist/constants4.d.cts +4 -4
- package/dist/constants4.d.ts +4 -4
- package/dist/constants5.d.cts +2 -2
- package/dist/constants5.d.ts +2 -2
- package/dist/context.cjs +1 -0
- package/dist/context.js +1 -0
- package/dist/contracts.d.cts +24 -0
- package/dist/contracts.d.ts +24 -0
- package/dist/createPageLoading.cjs +1 -1
- package/dist/createPageLoading.js +1 -1
- package/dist/data.cjs +1 -1
- package/dist/data.d.cts +9 -9
- package/dist/data.d.ts +9 -9
- package/dist/data.js +1 -1
- package/dist/date-picker.cjs +1 -0
- package/dist/date-picker.js +1 -0
- package/dist/feedback.cjs +1 -0
- package/dist/feedback.js +1 -0
- package/dist/helpers.cjs +1 -1
- package/dist/helpers.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +6 -4
- package/dist/index.d.ts +6 -4
- package/dist/index.js +1 -1
- package/dist/index.vue.d.cts +4 -4
- package/dist/index.vue.d.ts +4 -4
- package/dist/index10.vue.d.cts +3 -3
- package/dist/index11.vue.d.ts +2 -2
- package/dist/index12.vue.d.cts +2 -2
- package/dist/index12.vue.d.ts +1 -1
- package/dist/index13.vue.d.cts +1 -1
- package/dist/index13.vue.d.ts +3 -3
- package/dist/index14.vue.d.cts +3 -3
- package/dist/index14.vue.d.ts +7 -7
- package/dist/index15.vue.d.cts +7 -7
- package/dist/index16.vue.d.ts +1 -1
- package/dist/index17.vue.d.cts +1 -1
- package/dist/index17.vue.d.ts +1 -1
- package/dist/index18.vue.d.cts +1 -1
- package/dist/index18.vue.d.ts +1 -1
- package/dist/index19.vue.d.cts +1 -1
- package/dist/index19.vue.d.ts +2 -9
- package/dist/index2.vue.d.cts +2 -2
- package/dist/index2.vue.d.ts +2 -2
- package/dist/index20.vue.d.cts +1 -1
- package/dist/index20.vue.d.ts +1 -1
- package/dist/index21.vue.d.cts +1 -1
- package/dist/index21.vue.d.ts +1 -1
- package/dist/index22.vue.d.cts +2 -2
- package/dist/index22.vue.d.ts +2 -2
- package/dist/index23.vue.d.cts +1 -1
- package/dist/index23.vue.d.ts +1 -1
- package/dist/index25.vue.d.cts +4 -4
- package/dist/index25.vue.d.ts +4 -4
- package/dist/index26.vue.d.cts +1 -1
- package/dist/index26.vue.d.ts +1 -1
- package/dist/index27.vue.d.cts +4 -4
- package/dist/index27.vue.d.ts +4 -4
- package/dist/index28.vue.d.cts +1 -1
- package/dist/index28.vue.d.ts +1 -1
- package/dist/index3.vue.d.cts +4 -4
- package/dist/index3.vue.d.ts +4 -4
- package/dist/index4.vue.d.cts +2 -9
- package/dist/index6.vue.d.ts +3 -3
- package/dist/index7.vue.d.cts +3 -3
- package/dist/index8.vue.d.ts +2 -2
- package/dist/index9.vue.d.cts +2 -2
- package/dist/index9.vue.d.ts +3 -3
- package/dist/mapUtils.d.cts +2 -2
- package/dist/mapUtils.d.ts +2 -2
- package/dist/presets.d.cts +8 -2
- package/dist/presets.d.ts +8 -2
- package/dist/rate.cjs +1 -0
- package/dist/rate.js +1 -0
- package/dist/slider.cjs +1 -0
- package/dist/slider.js +1 -0
- package/dist/style.css +10898 -10915
- package/dist/time-picker.cjs +1 -0
- package/dist/time-picker.js +1 -0
- package/dist/upload.cjs +1 -0
- package/dist/upload.js +1 -0
- package/dist/useActionTask.cjs +1 -0
- package/dist/useActionTask.js +1 -0
- package/dist/useCalendarEvents.d.cts +1 -1
- package/dist/useCalendarEvents.d.ts +1 -1
- package/dist/useCollapsePanel.d.cts +4 -4
- package/dist/useCollapsePanel.d.ts +4 -4
- package/dist/useComponentLocale.cjs +1 -0
- package/dist/useComponentLocale.js +1 -0
- package/dist/useCropperCore.d.cts +6 -6
- package/dist/useCropperCore.d.ts +6 -6
- package/dist/useDraggableLayout.d.cts +1 -1
- package/dist/useDraggableLayout.d.ts +1 -1
- package/dist/useDynamicFormState.cjs +1 -0
- package/dist/useDynamicFormState.d.cts +64 -40
- package/dist/useDynamicFormState.d.ts +64 -40
- package/dist/useDynamicFormState.js +1 -0
- package/dist/useEdgeInteraction.d.cts +3 -3
- package/dist/useEdgeInteraction.d.ts +3 -3
- package/dist/useGlobalSearch.d.cts +1 -1
- package/dist/useGlobalSearch.d.ts +1 -1
- package/dist/useQRCode.d.cts +2 -2
- package/dist/useQRCode.d.ts +2 -2
- package/dist/useSearchState.d.cts +15 -725
- package/dist/useSearchState.d.ts +15 -834
- package/dist/useSignatureHistory.d.cts +4 -4
- package/dist/useSignatureHistory.d.ts +4 -4
- package/dist/useSplitResize.d.cts +3 -3
- package/dist/useSplitResize.d.ts +3 -3
- package/dist/useTableQuery.cjs +3 -3
- package/dist/useTableQuery.d.cts +73 -34
- package/dist/useTableQuery.d.ts +73 -34
- package/dist/useTableQuery.js +3 -3
- package/dist/useTimeSelection.d.cts +1 -1
- package/dist/useTimeSelection.d.ts +1 -1
- package/dist/useTreeOperations.d.cts +5 -5
- package/dist/useTreeOperations.d.ts +5 -5
- package/dist/useWorkflowValidation.d.cts +3 -3
- package/dist/useWorkflowValidation.d.ts +3 -3
- package/dist/verification.d.cts +4 -4
- package/dist/verification.d.ts +4 -4
- package/docs/architecture.en.md +83 -0
- package/docs/architecture.md +83 -0
- package/docs/assets/README.md +47 -0
- package/docs/assets/naive-ui-components-banner.png +0 -0
- package/docs/assets/naive-ui-components-banner.svg +69 -0
- package/docs/assets/naive-ui-components-logo.png +0 -0
- package/docs/assets/naive-ui-components-logo.svg +22 -0
- package/docs/components.en.md +118 -0
- package/docs/components.md +118 -0
- package/docs/engineering.en.md +132 -0
- package/docs/engineering.md +133 -0
- package/docs/guides/usage.en.md +638 -0
- package/docs/guides/usage.md +699 -0
- package/docs/performance-0.15.0.md +20 -0
- package/docs/security-scan-2026-10-06.md +11 -0
- package/docs/security-scan-2026-10-18.md +16 -0
- package/package.json +35 -12
- package/dist/C_Form2.cjs +0 -1
- package/dist/C_Form2.js +0 -1
- package/dist/config.cjs +0 -1
- package/dist/config.d.cts +0 -33
- package/dist/config.d.ts +0 -33
- package/dist/config.js +0 -1
package/README.md
CHANGED
|
@@ -1,235 +1,105 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
# @robot-admin/naive-ui-components
|
|
4
|
-
|
|
5
|
-
**基于 Naive UI 的 Vue 3 企业级组件库**
|
|
6
|
-
|
|
7
|
-
从 Robot Admin 中提炼的 55 个高质量业务组件,支持全量注册、按需导入(Tree-Shaking)和子路径独立导入。
|
|
1
|
+
<!-- 封面源文件与导出方式:docs/assets/README.md -->
|
|
8
2
|
|
|
9
|
-
|
|
10
|
-
[](./LICENSE)
|
|
11
|
-
|
|
12
|
-
[在线文档](https://www.tzagileteam.com/robot/components/preface) · [GitHub](https://github.com/ChenyCHENYU/naive-ui-components) · [NPM](https://www.npmjs.com/package/@robot-admin/naive-ui-components)
|
|
13
|
-
|
|
14
|
-
[English](./README_EN.md)
|
|
3
|
+

|
|
15
4
|
|
|
5
|
+
<div align="center">
|
|
6
|
+
<p><strong>把重复的业务交互,沉淀为可组合的组件。</strong></p>
|
|
7
|
+
<p>Vue 3 · Naive UI · TypeScript · 55 个业务组件</p>
|
|
8
|
+
<p>
|
|
9
|
+
<a href="https://www.npmjs.com/package/@robot-admin/naive-ui-components"><img src="https://img.shields.io/npm/v/@robot-admin/naive-ui-components?style=flat-square&color=249D70&labelColor=183C2E" alt="npm version"></a>
|
|
10
|
+
<a href="./package.json"><img src="https://img.shields.io/badge/Vue-3.5+-249D70?style=flat-square&logo=vue.js&logoColor=white&labelColor=183C2E" alt="Vue 3.5+"></a>
|
|
11
|
+
<a href="./package.json"><img src="https://img.shields.io/badge/TypeScript-5.9-3178C6?style=flat-square&logo=typescript&logoColor=white&labelColor=183C2E" alt="TypeScript 5.9"></a>
|
|
12
|
+
<a href="https://github.com/ChenyCHENYU/naive-ui-components/actions/workflows/ci.yml"><img src="https://github.com/ChenyCHENYU/naive-ui-components/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
13
|
+
<a href="./LICENSE"><img src="https://img.shields.io/badge/License-MIT-64748B?style=flat-square&labelColor=183C2E" alt="MIT License"></a>
|
|
14
|
+
</p>
|
|
15
|
+
<p>
|
|
16
|
+
<a href="#快速开始">快速开始</a> ·
|
|
17
|
+
<a href="#能力地图">能力地图</a> ·
|
|
18
|
+
<a href="./docs/components.md">组件目录</a> ·
|
|
19
|
+
<a href="https://www.tzagileteam.com/robot/components/preface">在线文档</a> ·
|
|
20
|
+
<a href="https://robotadmin.cn">在线体验</a> ·
|
|
21
|
+
<a href="./README_EN.md">English</a>
|
|
22
|
+
</p>
|
|
16
23
|
</div>
|
|
17
24
|
|
|
18
|
-
|
|
25
|
+
## 项目定位
|
|
19
26
|
|
|
20
|
-
|
|
27
|
+
**Naive UI Components** 是从 [Robot Admin](https://github.com/ChenyCHENYU/Robot_Admin) 提炼的 Vue 3 业务组件库,以 `@robot-admin/naive-ui-components` 独立发布。基于 Naive UI,将配置表单、数据表格、编辑器、流程与文件媒体等常见场景统一为 `C_*` 组件及配套组合函数,也可独立接入其他 Vue 3 项目。
|
|
21
28
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
29
|
+
| 设计重点 | 当前提供 |
|
|
30
|
+
| -------- | ------------------------------------------------------------------------------------------------------ |
|
|
31
|
+
| 配置驱动 | 表单字段、表格列、操作按钮与弹窗通过类型化配置组合;表单提供 8 种布局 |
|
|
32
|
+
| 类型贯通 | 字段路径、列定义、事件与实例方法配套类型;提供 `defineFormOptions`、`useCForm`、`useTableQuery` 等助手 |
|
|
33
|
+
| 按需消费 | 55 个独立组件入口、自动导入 Resolver、组件样式入口,以及表单/表格的基础样式层级 |
|
|
34
|
+
| 独立接入 | 支持全量注册与局部导入;反馈、文案和全局配置可由宿主提供,表单弹窗可接入结构兼容的 Headless CRUD |
|
|
25
35
|
|
|
26
|
-
|
|
36
|
+
组件库负责界面与交互;业务接口、身份权限、上传服务和第三方平台配置由应用接入。当前仓库版本 **0.15.0**,版本变化见 [CHANGELOG](./CHANGELOG.md)。
|
|
27
37
|
|
|
28
|
-
|
|
29
|
-
bun add vue@^3.5.0 naive-ui@^2.35.0
|
|
30
|
-
```
|
|
38
|
+
## 能力地图
|
|
31
39
|
|
|
32
|
-
|
|
40
|
+
| 场景 | 代表组件 | 覆盖能力 |
|
|
41
|
+
| ---------- | ---------------------------------------------------------------- | -------------------------------------------------------- |
|
|
42
|
+
| 数据录入 | `C_Form` · `C_FormModal` · `C_FormSearch` | 动态字段、校验、异步提交、搜索与新增/编辑弹窗 |
|
|
43
|
+
| 数据操作 | `C_Table` · `C_ActionBar` · `C_Tree` · `C_Transfer` | 分页、树形数据、行/单元格编辑、跨页选择、导出与批量操作 |
|
|
44
|
+
| 专业编辑 | `C_Editor` · `C_Markdown` · `C_Cron` · `C_FormulaEditor` | 富文本、Markdown、Cron 预览、公式编辑与本地试算 |
|
|
45
|
+
| 流程与计划 | `C_AntV` · `C_WorkFlow` · `C_VtableGantt` · `C_FullCalendar` | ER/BPMN/UML、审批流程、甘特与日历 |
|
|
46
|
+
| 文件与媒体 | `C_Upload` · `C_FilePreview` · `C_VideoPlayer` · `C_AudioPlayer` | 分片上传、PDF/Word/Excel 预览、音视频播放 |
|
|
47
|
+
| 图像与空间 | `C_Signature` · `C_ImageCropper` · `C_QRCode` · `C_Map` | 签名、裁剪、二维码、OpenStreetMap/高德地图 |
|
|
48
|
+
| 工作空间 | `C_Menu` · `C_Tabs` · `C_TagsView` · `C_GlobalSearch` | 菜单、场景切换、多标签导航、全局搜索 |
|
|
49
|
+
| 通用交互 | `C_Login` · `C_Captcha` · `C_Guide` · `C_PageLoading` | 登录、人机验证、功能引导、页面切换反馈 |
|
|
33
50
|
|
|
34
|
-
|
|
51
|
+
查看 [全部 55 个组件与依赖](./docs/components.md),或在 [Robot Admin](https://robotadmin.cn) 中体验组件场景。Cron 预览只计算时间,公式只进行本地试算;生产人机验证需接入服务端校验,详见[使用指南](./docs/guides/usage.md)。
|
|
35
52
|
|
|
36
|
-
|
|
37
|
-
import { createApp } from 'vue'
|
|
38
|
-
import NaiveUIComponents from '@robot-admin/naive-ui-components'
|
|
39
|
-
import '@robot-admin/naive-ui-components/style.css'
|
|
53
|
+
## 快速开始
|
|
40
54
|
|
|
41
|
-
|
|
42
|
-
app.use(NaiveUIComponents)
|
|
43
|
-
app.mount('#app')
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
#### 按需导入(主入口 Tree-Shaking)
|
|
47
|
-
|
|
48
|
-
```vue
|
|
49
|
-
<script setup lang="ts">
|
|
50
|
-
import { C_Icon, C_Table, C_Form } from '@robot-admin/naive-ui-components'
|
|
51
|
-
import '@robot-admin/naive-ui-components/style.css'
|
|
52
|
-
</script>
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
#### 子路径独立导入(推荐,最小打包体积)
|
|
55
|
+
### 安装
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
在已有 Vue 3 项目中安装组件库及必需的 peer 依赖:
|
|
58
58
|
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
import { C_Table } from '@robot-admin/naive-ui-components/C_Table'
|
|
63
|
-
import { C_Icon } from '@robot-admin/naive-ui-components/C_Icon'
|
|
64
|
-
import { createMenuOptions } from '@robot-admin/naive-ui-components/C_Menu'
|
|
65
|
-
import '@robot-admin/naive-ui-components/style.css'
|
|
66
|
-
</script>
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
> 子路径导入提供完整的 TypeScript 类型支持(`.d.ts`),IDE 可自动补全 props / emits / slots。组件相关工具函数(如 `createMenuOptions`)也从对应组件子路径导出,避免为了单个工具加载组件库根入口。
|
|
70
|
-
|
|
71
|
-
#### Composables 单独使用
|
|
72
|
-
|
|
73
|
-
```typescript
|
|
74
|
-
import {
|
|
75
|
-
useTableManager,
|
|
76
|
-
useFormState,
|
|
77
|
-
usePlayerCore,
|
|
78
|
-
} from '@robot-admin/naive-ui-components'
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
#### 自动按需导入(推荐)
|
|
82
|
-
|
|
83
|
-
Resolver 默认从组件子路径加载,避免只使用少量组件时把整个组件库及重型运行依赖带入首屏:
|
|
84
|
-
|
|
85
|
-
```typescript
|
|
86
|
-
import Components from 'unplugin-vue-components/vite'
|
|
87
|
-
import { RobotNaiveUiResolver } from '@robot-admin/naive-ui-components/resolver'
|
|
88
|
-
|
|
89
|
-
Components({
|
|
90
|
-
resolvers: [RobotNaiveUiResolver({ importStyle: true })],
|
|
91
|
-
})
|
|
59
|
+
```bash
|
|
60
|
+
bun add @robot-admin/naive-ui-components
|
|
61
|
+
bun add vue@^3.5.0 naive-ui@^2.35.0
|
|
92
62
|
```
|
|
93
63
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
每个 `C_*/style.css` 都是可独立消费的完整组件样式入口:如果组件内部组合了 `C_Icon`、`C_Captcha` 等其他公共组件,对应依赖样式会自动包含,无需使用侧重复导入,也不会依赖全量 `style.css` 兜底。
|
|
64
|
+
也可使用项目现有的 npm 或 pnpm。仅在对应场景安装可选 peer:
|
|
97
65
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
```typescript
|
|
103
|
-
import '@robot-admin/naive-ui-components/C_Form/base.css'
|
|
104
|
-
import '@robot-admin/naive-ui-components/C_Table/base.css'
|
|
105
|
-
// 完整模式也可显式使用 C_Form/full.css、C_Table/full.css
|
|
106
|
-
```
|
|
66
|
+
| 功能 | 额外安装 |
|
|
67
|
+
| ------------------------------------------ | -------------------- |
|
|
68
|
+
| 主入口导入 / `C_Breadcrumb` / `C_TagsView` | `vue-router@^4.6.4` |
|
|
69
|
+
| `C_Table` 行/列拖拽 | `sortablejs@^1.15.7` |
|
|
107
70
|
|
|
108
|
-
###
|
|
71
|
+
### 用配置创建一个表单
|
|
109
72
|
|
|
110
|
-
|
|
73
|
+
以下示例可放入 `App.vue`,使用独立组件入口和对应样式,无需全局注册:
|
|
111
74
|
|
|
112
75
|
```vue
|
|
113
76
|
<script setup lang="ts">
|
|
114
77
|
import { ref } from 'vue'
|
|
115
|
-
import {
|
|
116
|
-
C_Cron,
|
|
117
|
-
type CronConfig,
|
|
118
|
-
} from '@robot-admin/naive-ui-components/C_Cron'
|
|
119
|
-
import {
|
|
120
|
-
C_FormulaEditor,
|
|
121
|
-
type FormulaEditorConfig,
|
|
122
|
-
} from '@robot-admin/naive-ui-components/C_FormulaEditor'
|
|
123
|
-
import '@robot-admin/naive-ui-components/C_Cron/style.css'
|
|
124
|
-
import '@robot-admin/naive-ui-components/C_FormulaEditor/style.css'
|
|
125
|
-
|
|
126
|
-
const expression = ref('0 30 8 * * ?')
|
|
127
|
-
const cronConfig: CronConfig = { previewCount: 5 }
|
|
128
|
-
const formula = ref('IF([完成值] > 0, 100 / [完成值], 0)')
|
|
129
|
-
const formulaConfig: FormulaEditorConfig = {
|
|
130
|
-
variables: [{ name: '完成值', field: 'completed', type: 'number' }],
|
|
131
|
-
sampleData: { completed: 5 },
|
|
132
|
-
editableSampleData: true,
|
|
133
|
-
}
|
|
134
|
-
</script>
|
|
135
|
-
<template>
|
|
136
|
-
<C_Cron
|
|
137
|
-
v-model="expression"
|
|
138
|
-
:config="cronConfig"
|
|
139
|
-
/>
|
|
140
|
-
<C_FormulaEditor
|
|
141
|
-
v-model="formula"
|
|
142
|
-
:config="formulaConfig"
|
|
143
|
-
/>
|
|
144
|
-
</template>
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
Cron 支持秒到星期的六个数字字段、范围、间隔、列表及日/星期 `?` 互斥,不实现 L/W/# 扩展;预览按浏览器本地时区计算,不会调度任务。公式试算只在本地进行,不修改传入的 `sampleData`;校验和计算复用有界解析器,条件分支按需执行。通过 `showPreview`、`showKeyboard`、`showVariablePanel` 控制嵌入布局,`disabled` 同时保护试算输入。重置恢复初始模型及数据;切换独立记录时使用新 key 重新挂载。
|
|
148
|
-
|
|
149
|
-
公式键盘默认展开,可手动收起。数字、运算、比较与条件按键直接插入当前光标位置;选中文字会被替换,退格可整体删除变量,清空后继续输入。函数快捷键复用 `functions` 配置及签名说明,不需要项目额外配置;隐藏键盘仍使用 `showKeyboard: false`。
|
|
150
|
-
|
|
151
|
-
### C_Guide 配置引导
|
|
152
|
-
|
|
153
|
-
项目只需要提供目标和步骤,组件内置主题、可选 SVG 示意图及退出清理,不依赖项目的路由或 Store:
|
|
154
|
-
|
|
155
|
-
```vue
|
|
156
|
-
<script setup lang="ts">
|
|
157
|
-
import {
|
|
158
|
-
C_Guide,
|
|
159
|
-
type GuideStep,
|
|
160
|
-
} from '@robot-admin/naive-ui-components/C_Guide'
|
|
161
|
-
import '@robot-admin/naive-ui-components/C_Guide/style.css'
|
|
162
|
-
|
|
163
|
-
const steps: GuideStep[] = [
|
|
164
|
-
{
|
|
165
|
-
element: '[data-guide="search"]',
|
|
166
|
-
popover: {
|
|
167
|
-
title: '搜索',
|
|
168
|
-
description: '快速查找功能。',
|
|
169
|
-
illustration: 'search',
|
|
170
|
-
},
|
|
171
|
-
},
|
|
172
|
-
]
|
|
173
|
-
</script>
|
|
174
|
-
|
|
175
|
-
<template>
|
|
176
|
-
<C_Guide :steps="steps" />
|
|
177
|
-
</template>
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
在 `NConfigProvider` 内会自动跟随亮暗主题和主色。目标支持选择器、元素或解析函数;默认跳过不可见目标,不传目标可展示居中步骤。引擎在打开时加载。启用 `persistence` 后,只有完成引导才记住状态;点击入口仍可重看。每一步默认显示“跳过引导”,跳过会发出 `skip` 和 `close` 事件,不记录为完成;可用 `showSkipButton` 和 `skipBtnText` 控制入口与文案。通过 `GuideExpose` 可调用 `startGuide(force?)`、`stopGuide()`、`isCompleted()` 和 `resetCompleted()`,宿主可在路由切换时主动停止。
|
|
181
|
-
|
|
182
|
-
### C_Form / C_Table 推荐用法
|
|
183
|
-
|
|
184
|
-
推荐使用类型助手和绑定助手:业务模型只声明一次,字段路径、字段值、列 key、保存回调和实例方法即可保持同一套类型推导。字段支持 `profile.name`、`contacts.0.email` 这类嵌套路径。
|
|
185
|
-
|
|
186
|
-
```vue
|
|
187
|
-
<script setup lang="ts">
|
|
188
78
|
import {
|
|
189
79
|
C_Form,
|
|
190
|
-
defineFormConfig,
|
|
191
80
|
defineFormOptions,
|
|
192
81
|
useCForm,
|
|
193
82
|
} from '@robot-admin/naive-ui-components/C_Form'
|
|
83
|
+
import '@robot-admin/naive-ui-components/C_Form/style.css'
|
|
194
84
|
|
|
195
|
-
interface
|
|
85
|
+
interface Contact {
|
|
196
86
|
name: string
|
|
197
|
-
|
|
198
|
-
profile: { email: string }
|
|
87
|
+
email: string
|
|
199
88
|
}
|
|
200
89
|
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
label: '
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
{
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
fetch('/api/departments', { signal: context?.signal }).then(response =>
|
|
214
|
-
response.json()
|
|
215
|
-
),
|
|
216
|
-
},
|
|
217
|
-
{ type: 'input', prop: 'profile.email', label: '邮箱' },
|
|
218
|
-
])
|
|
219
|
-
const config = defineFormConfig<UserForm>({
|
|
220
|
-
mode: 'edit',
|
|
221
|
-
validateOnChange: true,
|
|
222
|
-
onSubmit: async ({ model: validatedModel }) => save(validatedModel),
|
|
223
|
-
onError: (error, context) => reportError(error, context),
|
|
224
|
-
})
|
|
225
|
-
const { model, formRef, bindings } = useCForm<UserForm>({
|
|
226
|
-
initialValues: {
|
|
227
|
-
name: '',
|
|
228
|
-
departmentId: null,
|
|
229
|
-
profile: { email: '' },
|
|
90
|
+
const result = ref('')
|
|
91
|
+
const { formRef, bindings } = useCForm<Contact>({
|
|
92
|
+
initialValues: { name: '', email: '' },
|
|
93
|
+
options: defineFormOptions<Contact>([
|
|
94
|
+
{ type: 'input', prop: 'name', label: '姓名', required: true },
|
|
95
|
+
{ type: 'input', prop: 'email', label: '邮箱' },
|
|
96
|
+
]),
|
|
97
|
+
config: {
|
|
98
|
+
labelPlacement: 'top',
|
|
99
|
+
onSubmit: ({ model }) => {
|
|
100
|
+
result.value = `已通过校验:${model.name}`
|
|
101
|
+
},
|
|
230
102
|
},
|
|
231
|
-
options: fields,
|
|
232
|
-
config,
|
|
233
103
|
})
|
|
234
104
|
</script>
|
|
235
105
|
|
|
@@ -238,560 +108,99 @@ Cron 支持秒到星期的六个数字字段、范围、间隔、列表及日/
|
|
|
238
108
|
ref="formRef"
|
|
239
109
|
v-bind="bindings"
|
|
240
110
|
/>
|
|
111
|
+
<p v-if="result">{{ result }}</p>
|
|
241
112
|
</template>
|
|
242
113
|
```
|
|
243
114
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
```ts
|
|
247
|
-
import {
|
|
248
|
-
defineFormOptions,
|
|
249
|
-
PRESET_RULES,
|
|
250
|
-
NAIVE_COMBOS,
|
|
251
|
-
SPEC_RULES,
|
|
252
|
-
} from '@robot-admin/naive-ui-components/C_Form'
|
|
253
|
-
|
|
254
|
-
const fields = defineFormOptions([
|
|
255
|
-
{
|
|
256
|
-
type: 'input',
|
|
257
|
-
prop: 'name',
|
|
258
|
-
label: '名称',
|
|
259
|
-
required: true,
|
|
260
|
-
rules: [SPEC_RULES.length('名称', 2, 20)],
|
|
261
|
-
},
|
|
262
|
-
{
|
|
263
|
-
type: 'input',
|
|
264
|
-
prop: 'email',
|
|
265
|
-
label: '邮箱',
|
|
266
|
-
rules: NAIVE_COMBOS.email('邮箱'),
|
|
267
|
-
},
|
|
268
|
-
{
|
|
269
|
-
type: 'input',
|
|
270
|
-
prop: 'mobile',
|
|
271
|
-
label: '手机号',
|
|
272
|
-
rules: [PRESET_RULES.mobile('手机号')],
|
|
273
|
-
},
|
|
274
|
-
])
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
普通表单默认提供提交与重置,步骤表单最后一步默认提供提交按钮。只需配置 `submitText`、`resetText` 和 `onSubmit`;要增加预览等业务操作,使用 `action-extra` 插槽即可保留默认按钮和加载管理。需要完全定制时仍可覆盖 `action` / `step-actions`,并调用插槽的 `submit()`,不要用 `validate()` 代替提交。
|
|
278
|
-
|
|
279
|
-
异步保存放在 `config.onSubmit` 中并等待完成;`@submit` 是完成后的通知事件,不等待监听器返回的 Promise。第二参数提供 `context?.signal`,可直接传给支持取消的请求;组件卸载会发出取消信号,并停止晚到的提交事件和提示。`submitSuccessText` / `resetSuccessText` 为可选反馈文案,默认不显示成功提示,也不代表数据已持久化。
|
|
280
|
-
|
|
281
|
-
新增/编辑场景推荐用 `C_FormModal` 直接消费 Headless CRUD 的结构化 `editor`。字段、校验和布局继续由 `C_Form` 配置驱动,页面不再重复编写 Modal、按钮、loading 和草稿状态;默认采用紧凑小尺寸表单和右下角带图标操作按钮,宽度、表单尺寸与动作文案仍可覆盖:
|
|
282
|
-
|
|
283
|
-
```vue
|
|
284
|
-
<script setup lang="ts">
|
|
285
|
-
import { C_FormModal } from '@robot-admin/naive-ui-components/C_FormModal'
|
|
286
|
-
import type { FormModalEditor } from '@robot-admin/naive-ui-components/C_FormModal'
|
|
287
|
-
import {
|
|
288
|
-
defineFormConfig,
|
|
289
|
-
defineFormOptions,
|
|
290
|
-
} from '@robot-admin/naive-ui-components/C_Form'
|
|
291
|
-
|
|
292
|
-
interface UserForm {
|
|
293
|
-
name: string
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
defineProps<{ editor: FormModalEditor<UserForm> }>()
|
|
297
|
-
|
|
298
|
-
const fields = defineFormOptions<UserForm>([
|
|
299
|
-
{ type: 'input', prop: 'name', label: '名称', required: true },
|
|
300
|
-
])
|
|
301
|
-
const formConfig = defineFormConfig<UserForm>({ labelPlacement: 'top' })
|
|
302
|
-
</script>
|
|
303
|
-
|
|
304
|
-
<template>
|
|
305
|
-
<C_FormModal
|
|
306
|
-
:editor="editor"
|
|
307
|
-
:options="fields"
|
|
308
|
-
:config="formConfig"
|
|
309
|
-
/>
|
|
310
|
-
</template>
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
`editor` 采用结构类型,不要求组件库依赖某个请求库;任何提供 `visible/mode/model/title/loading/setModel/close/submit` 的 Headless 控制器都可接入。弹窗默认保留关闭按钮、遮罩关闭和 Esc 行为,也可按高风险表单显式关闭。
|
|
115
|
+
表单内置提交、重置与校验流程。实际保存时,将异步请求放入 `config.onSubmit` 并等待完成;`@submit` 用于完成通知。表单布局、验证规则、弹窗与远程表格示例见[使用指南](./docs/guides/usage.md)。
|
|
314
116
|
|
|
315
|
-
|
|
117
|
+
## 按需加载与样式
|
|
316
118
|
|
|
317
|
-
|
|
318
|
-
<script setup lang="ts">
|
|
319
|
-
import {
|
|
320
|
-
C_Table,
|
|
321
|
-
defineTableColumns,
|
|
322
|
-
defineTableConfig,
|
|
323
|
-
useTableQuery,
|
|
324
|
-
} from '@robot-admin/naive-ui-components/C_Table'
|
|
325
|
-
|
|
326
|
-
interface UserRow {
|
|
327
|
-
id: string
|
|
328
|
-
name: string
|
|
329
|
-
}
|
|
119
|
+
### 选择导入方式
|
|
330
120
|
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
enabled: true,
|
|
338
|
-
mode: 'row',
|
|
339
|
-
onSave: row => saveRow(row),
|
|
340
|
-
onError: error => reportError(error),
|
|
341
|
-
},
|
|
342
|
-
})
|
|
343
|
-
const { bindings } = useTableQuery<UserRow, { keyword: string }>({
|
|
344
|
-
initialQuery: { keyword: '' },
|
|
345
|
-
columns,
|
|
346
|
-
config,
|
|
347
|
-
rowKey: 'id',
|
|
348
|
-
request: async ({ page, pageSize, query, signal }) => {
|
|
349
|
-
const response = await fetch('/api/users', {
|
|
350
|
-
method: 'POST',
|
|
351
|
-
body: JSON.stringify({ page, pageSize, ...query }),
|
|
352
|
-
signal,
|
|
353
|
-
})
|
|
354
|
-
return response.json() as Promise<{ data: UserRow[]; total: number }>
|
|
355
|
-
},
|
|
356
|
-
})
|
|
357
|
-
</script>
|
|
358
|
-
|
|
359
|
-
<template>
|
|
360
|
-
<C_Table v-bind="bindings" />
|
|
361
|
-
</template>
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
将 Headless CRUD 绑定到 `:crud` 时,表格会识别操作结果中的 `{ error }`:失败不会触发删除成功事件,也不会重复展示 CRUD 控制器已经展示的反馈。自定义 `actions.delete` 可返回 Promise,或返回 `{ data, error }` 结构。
|
|
121
|
+
| 方式 | 适用场景 | 样式 |
|
|
122
|
+
| -------------------- | ------------------------------ | ---------------------------------- |
|
|
123
|
+
| 子路径导入 | 显式控制每个组件的依赖入口 | 导入 `C_组件名/style.css` |
|
|
124
|
+
| Resolver 自动导入 | 模板直接使用组件,减少手动导入 | 显式设置 `importStyle: true` |
|
|
125
|
+
| 主入口具名导入 | 已有项目使用 Tree-Shaking | 手动导入所需样式或全量 `style.css` |
|
|
126
|
+
| `app.use()` 全量注册 | 统一注册整个组件库 | 导入全量 `style.css` |
|
|
365
127
|
|
|
366
|
-
|
|
128
|
+
### 自动导入
|
|
367
129
|
|
|
368
|
-
`
|
|
369
|
-
`small` 尺寸、延迟呈现面板并支持受控/非受控状态;只做筛选或视图切换时启用 `tabsOnly`,组件
|
|
370
|
-
不会执行面板内容,避免隐藏内容产生渲染开销或副作用。常规场景只维护数组,复杂内容可以按需使用 `render`、`pane` 或
|
|
371
|
-
`pane-{key}` 插槽:
|
|
372
|
-
|
|
373
|
-
```vue
|
|
374
|
-
<script setup lang="ts">
|
|
375
|
-
import { ref } from 'vue'
|
|
376
|
-
import { C_Tabs, defineTabs } from '@robot-admin/naive-ui-components/C_Tabs'
|
|
377
|
-
|
|
378
|
-
const activeView = ref('basic')
|
|
379
|
-
const views = defineTabs([
|
|
380
|
-
{ key: 'basic', label: '基础表格', icon: 'mdi:table' },
|
|
381
|
-
{ key: 'tree', label: '树形表格', icon: 'mdi:file-tree-outline' },
|
|
382
|
-
])
|
|
383
|
-
</script>
|
|
130
|
+
安装 `unplugin-vue-components` 后,在 Vite 配置中加入 Resolver:
|
|
384
131
|
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
v-model="activeView"
|
|
388
|
-
:items="views"
|
|
389
|
-
type="segment"
|
|
390
|
-
tabs-only
|
|
391
|
-
/>
|
|
392
|
-
</template>
|
|
132
|
+
```bash
|
|
133
|
+
bun add -d unplugin-vue-components
|
|
393
134
|
```
|
|
394
135
|
|
|
395
|
-
| API | 说明 |
|
|
396
|
-
| ----------------------------- | ------------------------------------------------------------------------- |
|
|
397
|
-
| `items` | `key/label` 为必填,支持 `icon`、`badge`、禁用、关闭及 `renderTab/render` |
|
|
398
|
-
| `modelValue` / `defaultValue` | 同时支持受控和非受控状态 |
|
|
399
|
-
| `type` / `size` / `placement` | `line/card/bar/segment` 与常用尺寸、方向;默认 `line/small/top` |
|
|
400
|
-
| `tabsOnly` | 只呈现标签导航,适合表格场景和查询条件切换 |
|
|
401
|
-
| `beforeChange` | 支持同步或异步切换守卫;返回 `false` 或抛错均保留当前页 |
|
|
402
|
-
| 插槽 | `tab`、`pane` 和 `pane-{key}`,均提供当前 item 与 active 状态 |
|
|
403
|
-
| 事件 | `change`、`close`、`add` 及标准 `update:modelValue` |
|
|
404
|
-
|
|
405
|
-
页面级和表格级按钮统一使用 `C_ActionBar`,无需再维护另一套 Toolbar。操作栏默认采用带图标的 `tiny` 紧凑按钮和 `6px` 间距;`add`、`refresh`、`export`、`columns`、`settings` 等语义 key 会自动补齐一致的文案、图标与按钮类型,自定义动作未传图标时使用中性操作图标。`show`、`disabled`、`loading` 可直接传布尔值、`Ref` 或 getter,异步操作默认防重复点击并自动展示 loading。`C_Table` 可在 `toolbar.actions` / `toolbar.rightActions` 中直接复用同一份动作配置,同时保留原有左右插槽;需要更大按钮时,通过 `actionBar.size` 或单个动作的 `size` 覆盖:
|
|
406
|
-
|
|
407
136
|
```ts
|
|
408
|
-
|
|
409
|
-
import {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
{ key: 'refresh', disabled: () => loading.value, onClick: refresh },
|
|
414
|
-
{ key: 'settings', group: 'right', onClick: openSettings },
|
|
415
|
-
])
|
|
416
|
-
|
|
417
|
-
const config = defineTableConfig({
|
|
418
|
-
toolbar: {
|
|
419
|
-
actions,
|
|
420
|
-
actionBar: { size: 'small' }, // 可选;默认是 tiny
|
|
421
|
-
},
|
|
422
|
-
})
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
`C_Table` 继续由当前 Naive UI 表格实现负责;需要 MachTable 时应由业务入口完整渲染 MachTable 及其原生配置,避免在两套列定义、事件和实例 API 之间做隐式转换。二者只共享 `C_ActionBar` 这类框架无关的页面动作模型,不互相污染。
|
|
426
|
-
|
|
427
|
-
### C_Map 推荐用法
|
|
428
|
-
|
|
429
|
-
`C_Map` 统一以 `[纬度, 经度]` 接收中心点和标记坐标;切换高德地图时会在组件内部转换为其要求的 `[经度, 纬度]`,使用侧无需维护两套数据。非法标记会被隔离,组件只清理自己创建的 Marker,不会误删通过 `ready` 事件添加的业务图层。
|
|
430
|
-
|
|
431
|
-
```vue
|
|
432
|
-
<script setup lang="ts">
|
|
433
|
-
import { ref } from 'vue'
|
|
434
|
-
import {
|
|
435
|
-
C_Map,
|
|
436
|
-
type MapExpose,
|
|
437
|
-
type MapMarker,
|
|
438
|
-
} from '@robot-admin/naive-ui-components/C_Map'
|
|
439
|
-
import '@robot-admin/naive-ui-components/C_Map/style.css'
|
|
440
|
-
|
|
441
|
-
const mapRef = ref<MapExpose>()
|
|
442
|
-
const markers: MapMarker[] = [
|
|
443
|
-
{ id: 'beijing', lat: 39.9042, lng: 116.4074, popup: '北京' },
|
|
444
|
-
]
|
|
445
|
-
</script>
|
|
446
|
-
|
|
447
|
-
<template>
|
|
448
|
-
<C_Map
|
|
449
|
-
ref="mapRef"
|
|
450
|
-
:markers="markers"
|
|
451
|
-
fit-markers-on-init
|
|
452
|
-
:tile-config="{ maxZoom: 18 }"
|
|
453
|
-
@error="reportError"
|
|
454
|
-
/>
|
|
455
|
-
<button @click="mapRef?.fitToMarkers({ maxZoom: 14 })">定位全部标记</button>
|
|
456
|
-
</template>
|
|
457
|
-
```
|
|
458
|
-
|
|
459
|
-
组件实例提供 `getMap()`、`refresh()` 和 `fitToMarkers()`,适合标签页显示、容器尺寸变化和业务图层扩展。OpenStreetMap 模式会在组件内部兼容 Leaflet 的 ESM 命名空间和 CommonJS `default` 形态,宿主无需为正确性配置整包预构建。使用 `map-type="amap"` 时必须提供 `amap-key`;2021-12-02 之后申请的 Key 还必须按[高德官方安全密钥说明](https://lbs.amap.com/api/javascript-api-v2/guide/abc/jscode)配置 `:amap-security-config="{ serviceHost: '/_AMapService' }"`(生产推荐,由服务端代理保管安全密钥),或仅在开发环境传 `{ securityJsCode: '...' }`。安全配置会在 SDK 脚本加载前写入,并拒绝同页混用不同 Key。宿主应用还需在 CSP 的 `script-src` 中允许 `https://webapi.amap.com`,同时在高德控制台配置域名白名单和配额限制。
|
|
460
|
-
|
|
461
|
-
`C_Date`、`C_Time`、`C_Menu`、`C_FormSearch` 均支持标准 `v-model`。组件可直接放在没有 `NMessageProvider` / `NDialogProvider` 的页面;如需统一提示、确认和文案,可在安装时传入 `feedback`、`locale`、`form` 与 `table.defaults`。
|
|
462
|
-
|
|
463
|
-
### C_Captcha 服务端校验
|
|
464
|
-
|
|
465
|
-
验证码入口使用组件库内置 SVG 状态图标,不依赖操作系统 Emoji 或在线图标服务;默认、校验中、成功和失败状态均保持一致的尺寸与语义颜色。`C_Login` 会把验证入口放在提交按钮之前并显示明确操作文案,同时透传 `captcha-visible-change`,宿主可在拼图交互期间暂停高开销背景动画。品牌接入可在外层通过 `--cc-height`、`--cc-radius`、`--cc-color`、`--cc-icon-color`、`--cc-bg`、`--cc-bg-hover`、`--cc-border`、`--cc-border-hover` 和 `--cc-focus` 调整外观,无需穿透组件内部 DOM。
|
|
466
|
-
|
|
467
|
-
默认本地模式仅证明浏览器内的拼图交互已经完成,不能作为登录、支付等敏感操作的安全凭证。生产场景应传入 `verifier`,并开启 `require-server-verification`;组件会处理超时、取消和竞态,只在独立的服务端/验证码提供商确认后发出 `success`。请求中的 `token`、`timestamp` 都由客户端生成,只能用于关联和日志,服务端绝不能把它们本身当作可信证明。
|
|
468
|
-
|
|
469
|
-
需要国内网络可用且长期免费的方案时,可显式选择开源 MIT 的 ALTCHA 自托管模式。该模式仅在使用时懒加载,不增加默认拼图入口的首屏执行成本;组件会强制服务端校验,缺少 `challenge-url` 或 `verifier` 时失败关闭。应用后端必须签发新鲜的一次性挑战、验证 PoW payload、阻止重放并限流;密钥只存于服务端。
|
|
470
|
-
|
|
471
|
-
```vue
|
|
472
|
-
<C_Captcha
|
|
473
|
-
provider="altcha"
|
|
474
|
-
challenge-url="/api/auth/captcha/challenge"
|
|
475
|
-
:verifier="
|
|
476
|
-
async ({ token, signal }) => {
|
|
477
|
-
const response = await fetch('/api/auth/captcha/verify', {
|
|
478
|
-
method: 'POST',
|
|
479
|
-
headers: { 'content-type': 'application/json' },
|
|
480
|
-
body: JSON.stringify({ payload: token }),
|
|
481
|
-
signal,
|
|
482
|
-
})
|
|
483
|
-
return response.json() // { valid: boolean, token: '服务端一次性登录令牌' }
|
|
484
|
-
}
|
|
485
|
-
"
|
|
486
|
-
/>
|
|
487
|
-
```
|
|
488
|
-
|
|
489
|
-
```vue
|
|
490
|
-
<C_Captcha
|
|
491
|
-
require-server-verification
|
|
492
|
-
:verification-timeout="8000"
|
|
493
|
-
:verifier="
|
|
494
|
-
async ({ signal }) => {
|
|
495
|
-
// providerProof 必须来自服务端或可信验证码提供商,不能由本地拼图结果伪造。
|
|
496
|
-
const providerProof = await obtainTrustedCaptchaProof({ signal })
|
|
497
|
-
const response = await fetch('/api/captcha/verify', {
|
|
498
|
-
method: 'POST',
|
|
499
|
-
headers: { 'content-type': 'application/json' },
|
|
500
|
-
body: JSON.stringify({ providerProof }),
|
|
501
|
-
signal,
|
|
502
|
-
})
|
|
503
|
-
return response.json() // { valid: boolean, token: 'server-issued-token' }
|
|
504
|
-
}
|
|
505
|
-
"
|
|
506
|
-
@verify-error="reportError"
|
|
507
|
-
/>
|
|
508
|
-
```
|
|
509
|
-
|
|
510
|
-
开启 `require-server-verification` 后,成功响应必须包含服务端 token。该 token 应短期、一次性使用,并绑定当前会话或业务请求。`C_Login` 可通过 `captchaProvider`、`captchaChallengeUrl`、`captchaVerifier`、`requireCaptchaServerVerification` 和 `captchaVerificationTimeout` 透传同一安全策略,并在 `submit` 数据中通过 `captchaType` 与 `captchaVerifiedBy` 标识验证类型和来源。更多边界说明见 [SECURITY.md](./SECURITY.md)。
|
|
511
|
-
|
|
512
|
-
`C_Login` 的“记住我”只保存用户名,不保存密码。短信验证码仅对格式正确的手机号触发事件;组件会立即开始本地倒计时,发送结果和服务端限流仍由宿主处理。`C_City` 在首次打开时才加载城市索引,字母跳转只作用于当前实例;默认触发器、字母和城市项均可用键盘操作。
|
|
513
|
-
|
|
514
|
-
### 表格加载态
|
|
515
|
-
|
|
516
|
-
`C_Table` 默认显示跟随主题主色的数据光环 SVG 加载动画:环形轨道、数据行和细光束提示等待状态,保留已有数据,并遵循系统减少动态效果设置,无需页面配置。内置异步展开行同样复用 `C_Loading`;自定义展开内容仍由使用侧决定展示。可通过 `loading` 插槽替换默认内容。独立的 `C_Loading` 支持 `size`(16–120,默认 48)、`label`(可选说明)和 `color`(可选颜色);原生 `NSpin` 使用时请关闭旋转,避免 SVG 整体转动:
|
|
517
|
-
|
|
518
|
-
```vue
|
|
519
|
-
<NSpin :show="loading" :size="48" :rotate="false">
|
|
520
|
-
<template #icon><C_Loading /></template>
|
|
521
|
-
<section>页面内容</section>
|
|
522
|
-
</NSpin>
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
### 📋 组件清单(55 个)
|
|
526
|
-
|
|
527
|
-
> 💡 所有组件均提供 **在线交互演示**,访问 [组件文档](https://www.tzagileteam.com/robot/components/preface) 可直接在页面中体验真实效果(通过 iframe 嵌入 Robot Admin 生产环境)。
|
|
528
|
-
|
|
529
|
-
#### 基础组件
|
|
530
|
-
|
|
531
|
-
| 组件 | 说明 | 外部依赖 |
|
|
532
|
-
| ---------------- | ----------------------- | ----------------------------- |
|
|
533
|
-
| `C_Icon` | Iconify 图标封装 | `@iconify/vue` |
|
|
534
|
-
| `C_Loading` | 主题化 SVG 加载态 | - |
|
|
535
|
-
| `C_PageLoading` | 主题化页面切换加载 | - |
|
|
536
|
-
| `C_Code` | 代码高亮显示 | `highlight.js` |
|
|
537
|
-
| `C_Barcode` | 条形码生成器 | `@chenfengyuan/vue-barcode` |
|
|
538
|
-
| `C_Captcha` | 拼图/ALTCHA 人机验证 | `vue3-puzzle-vcode`、`altcha` |
|
|
539
|
-
| `C_Cascade` | 级联面板选择器 | - |
|
|
540
|
-
| `C_Guide` | 新手引导 | `driver.js` |
|
|
541
|
-
| `C_Progress` | 增强进度条 | - |
|
|
542
|
-
| `C_Steps` | 步骤条 | - |
|
|
543
|
-
| `C_ActionBar` | 操作按钮栏 | - |
|
|
544
|
-
| `C_Theme` | 主题切换器 | - |
|
|
545
|
-
| `C_Language` | 语言切换器 | - |
|
|
546
|
-
| `C_Date` | 日期选择器增强 | - |
|
|
547
|
-
| `C_City` | 省市区三级联动 | - |
|
|
548
|
-
| `C_Breadcrumb` | 面包屑导航 | - |
|
|
549
|
-
| `C_Menu` | 导航菜单 | - |
|
|
550
|
-
| `C_Tabs` | 数据驱动标签页/场景切换 | - |
|
|
551
|
-
| `C_TagsView` | 标签页导航 | - |
|
|
552
|
-
| `C_GlobalSearch` | 全局搜索面板 | - |
|
|
553
|
-
| `C_AvatarGroup` | 头像组合展示 | - |
|
|
554
|
-
| `C_OrgChart` | 组织架构图 | - |
|
|
555
|
-
| `C_Skeleton` | 骨架屏占位组件 | - |
|
|
556
|
-
|
|
557
|
-
#### 内容 & 编辑组件
|
|
558
|
-
|
|
559
|
-
| 组件 | 说明 | 外部依赖 |
|
|
560
|
-
| ----------------- | ---------------------------- | ------------------------- |
|
|
561
|
-
| `C_Editor` | 富文本编辑器 | `@wangeditor-next/editor` |
|
|
562
|
-
| `C_Markdown` | Markdown 编辑器/预览 | `md-editor-v3` |
|
|
563
|
-
| `C_FormulaEditor` | 公式编辑器(安全表达式引擎) | 内置 |
|
|
564
|
-
| `C_Signature` | 电子签名 | - |
|
|
565
|
-
| `C_QRCode` | 二维码生成器 | `qrcode` |
|
|
566
|
-
| `C_ImageCropper` | 图片裁剪器 | `vue-cropper` |
|
|
567
|
-
|
|
568
|
-
#### 数据展示组件
|
|
569
|
-
|
|
570
|
-
| 组件 | 说明 | 外部依赖 |
|
|
571
|
-
| ---------------- | ----------------------------------------- | -------------------------- |
|
|
572
|
-
| `C_Table` | 高级数据表格(CRUD/行列编辑/动态行/打印) | `print-js`、`html2canvas` |
|
|
573
|
-
| `C_Map` | 地图组件(OSM/高德) | `leaflet` |
|
|
574
|
-
| `C_VtableGantt` | 甘特图 | `@visactor/vtable-gantt` |
|
|
575
|
-
| `C_AntV` | 图编辑器(ER/BPMN/UML) | `@antv/x6`、`html2canvas` |
|
|
576
|
-
| `C_WaterFall` | 瀑布流布局 | - |
|
|
577
|
-
| `C_FullCalendar` | 日历事件 | `@fullcalendar/*` |
|
|
578
|
-
| `C_VideoPlayer` | 视频播放器(HLS/字幕/书签/章节) | `xgplayer`、`xgplayer-hls` |
|
|
579
|
-
| `C_AudioPlayer` | 音频播放器(波形/进度/播放列表) | - |
|
|
580
|
-
| `C_FilePreview` | 文件预览(PDF/Word/Excel) | `xlsx`、`mammoth` |
|
|
581
|
-
| `C_Timeline` | 时间线(垂直/水平/可折叠) | - |
|
|
582
|
-
|
|
583
|
-
图片/日历类组件的使用边界:`C_ImageCropper` 翻转会更新实际图片源并重置当前裁剪位置,加载和导出失败通过 `error: Error` 报告;`C_Signature` 的 `readonly` 只禁止用户交互,暴露方法仍可用于加载历史数据,其 SVG 导出是保留画布效果的栅格嵌入 SVG;`C_QRCode` 带 Logo 的 SVG 同样采用栅格嵌入,以保持预览与导出一致。`C_FullCalendar` 使用本地日历日期创建当日事件;`C_WaterFall` 会根据图片实际宽高比自动重排,建议以稳定唯一的 `id` 标识每项。
|
|
584
|
-
|
|
585
|
-
#### 表单 & 布局组件
|
|
586
|
-
|
|
587
|
-
| 组件 | 说明 | 外部依赖 |
|
|
588
|
-
| ----------------- | ------------------------------------------------- | -------------------- |
|
|
589
|
-
| `C_Form` | 动态表单引擎(Grid/Tabs/Steps/Card/Dynamic 布局) | - |
|
|
590
|
-
| `C_FormModal` | 数据驱动的新增/编辑表单弹窗 | - |
|
|
591
|
-
| `C_FormSearch` | 搜索表单 | - |
|
|
592
|
-
| `C_CollapsePanel` | 折叠面板 | - |
|
|
593
|
-
| `C_SplitPane` | 分割面板 | - |
|
|
594
|
-
| `C_Draggable` | 拖拽排序 | `vue-draggable-plus` |
|
|
595
|
-
| `C_Tree` | 高级树形控件 | - |
|
|
596
|
-
| `C_Time` | 时间选择器增强 | - |
|
|
597
|
-
| `C_Cron` | Cron 表达式编辑器 | - |
|
|
598
|
-
| `C_Transfer` | 穿梭框(搜索/全选/批量操作) | - |
|
|
599
|
-
|
|
600
|
-
#### 交互 & 业务组件
|
|
601
|
-
|
|
602
|
-
| 组件 | 说明 | 外部依赖 |
|
|
603
|
-
| --------------- | -------------------------------------- | -------- |
|
|
604
|
-
| `C_Chat` | 聊天组件(联系人/消息气泡/输入框) | - |
|
|
605
|
-
| `C_ContextMenu` | 右键菜单(嵌套子菜单/快捷键/危险操作) | - |
|
|
606
|
-
| `C_Login` | 登录组件(5种模式/验证码/记住用户名) | - |
|
|
607
|
-
|
|
608
|
-
#### 流程 & 通知组件
|
|
609
|
-
|
|
610
|
-
| 组件 | 说明 | 外部依赖 |
|
|
611
|
-
| ---------------------- | ------------------------------------ | ---------------- |
|
|
612
|
-
| `C_WorkFlow` | 工作流编辑器(审批/抄送/条件节点) | `@vue-flow/core` |
|
|
613
|
-
| `C_NotificationCenter` | 通知中心(WebSocket/轮询) | - |
|
|
614
|
-
| `C_Upload` | 大文件上传(分片/断点续传/哈希校验) | `spark-md5` |
|
|
615
|
-
|
|
616
|
-
### 🔌 依赖说明
|
|
617
|
-
|
|
618
|
-
`C_FilePreview` 的 URL 入口仅接受 HTTPS 或当前站点同源 HTTP(便于本地开发);不接受脚本、数据 URL、带凭据 URL 或跨站明文 HTTP。`autoPreview` 会在有文件源时自动打开预览,已打开时切换文件源会刷新内容。重复预览会释放旧 PDF 对象 URL,并忽略过期加载结果。Excel 单元格的 `0` 与 `false` 会原样保留。
|
|
619
|
-
|
|
620
|
-
`C_AntV` 的 BPMN 对外数据保持 `{ nodes, flows }` 领域结构;组件内部转换为 X6 单元格,并在 `data-change` / `getData()` 中还原节点位置、类型、属性和连线条件。BPMN/UML 仅在未提供 `data` 时加载内置示例;显式传入空数据会显示空画布。
|
|
621
|
-
|
|
622
|
-
`C_VtableGantt` 合并预设与 `options` 时会保留未覆盖的嵌套配置、以新数组整体替换旧数组,并忽略原型相关键;全屏按钮状态仅反映该甘特图容器的实际全屏状态。
|
|
623
|
-
|
|
624
|
-
`C_AudioPlayer` 只在浏览器确认 `play()` 成功后进入播放状态并触发 `play`;自动播放被拒绝时会触发 `error`,空播放列表不会产生虚假的播放事件。静音、曲目和进度条均可用键盘操作。
|
|
625
|
-
|
|
626
|
-
`C_CollapsePanel` 与 `C_TagsView` 会校验本地持久化数据结构;损坏或旧格式数据会安全回退,不会阻断组件初始化。持久化标签仅恢复站内路径,特殊字符路径的定位不会拼接 CSS 选择器。
|
|
627
|
-
|
|
628
|
-
`C_Table` 列设置只恢复有效的列键、可见性、列宽和固定方向;损坏的 `persistKey` 存储会回退到传入列。列设置在本地副本上操作,不会修改调用方的列对象。`C_Upload` 的默认文件列表同样会复制后再管理,文件选择、拖拽和粘贴共用 `accept` 过滤,图片操作可通过键盘识别和访问;并发计算哈希时,各文件显示自己的进度。分片上传在查询断点、请求或合并阶段取消后,不会继续派发请求或发出过期的完成事件。自定义上传请求的 `abort()` 即使不回调,也会释放分片等待任务。
|
|
629
|
-
|
|
630
|
-
`C_WorkFlow` 会在首次渲染时加载传入的 `modelValue`,并在 `getCurrentWorkflowData()` / `save` / `change` / `node-click` 中输出隔离的数据快照,避免调用方意外修改内部节点。条件编辑弹窗在保存前不会修改画布数据,未填完整的条件不会被静默丢弃。`readonly` 禁止节点拖拽、连线、配置、增删与保存,但仍允许预览、验证和适应视图;节点与条件 ID 在同一时刻连续创建时保持唯一。
|
|
631
|
-
|
|
632
|
-
类型验证同时覆盖 TypeScript 源码、Vue 单文件组件模板和发布后的使用侧示例。`C_Table` 合计行的 `summary.render` 应返回按列键组织的对象(`{ columnKey: { value, colSpan? } }`);`C_FormSearch` 的日期范围兼容原有数字时间戳数组,也支持格式化字符串数组,两种值会分别绑定 Naive UI 对应的值接口。
|
|
633
|
-
|
|
634
|
-
组件运行依赖已由本包声明,安装组件库时会自动解析。所有场景都需要:
|
|
137
|
+
// vite.config.ts
|
|
138
|
+
import { defineConfig } from 'vite'
|
|
139
|
+
import vue from '@vitejs/plugin-vue'
|
|
140
|
+
import Components from 'unplugin-vue-components/vite'
|
|
141
|
+
import { RobotNaiveUiResolver } from '@robot-admin/naive-ui-components/resolver'
|
|
635
142
|
|
|
636
|
-
|
|
637
|
-
|
|
143
|
+
export default defineConfig({
|
|
144
|
+
plugins: [
|
|
145
|
+
vue(),
|
|
146
|
+
Components({
|
|
147
|
+
resolvers: [RobotNaiveUiResolver({ importStyle: true })],
|
|
148
|
+
}),
|
|
149
|
+
],
|
|
150
|
+
})
|
|
638
151
|
```
|
|
639
152
|
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
### 🏗️ 构建架构
|
|
153
|
+
Resolver 默认解析到组件子路径;`importStyle` 默认是 `false`,需显式开启自动样式。`true` 与 `'full'` 均加载完整组件样式;`'base'` 为 `C_Form` / `C_Table` 排除内置富文本编辑器样式,其他组件仍使用完整样式。只有不使用内置富文本字段时才选择基础样式。
|
|
643
154
|
|
|
644
|
-
|
|
155
|
+
每个组件样式入口包含其组合组件所需样式。手动导入时可选 `C_Form/base.css`、`C_Table/base.css`;完整样式也提供 `full.css` 别名。重型编辑器、流程、地图和媒体组件建议随业务路由加载。完整策略与全量注册示例见[导入指南](./docs/guides/usage.md#导入方式)。
|
|
645
156
|
|
|
646
|
-
|
|
647
|
-
bun run build
|
|
648
|
-
├── 1. tsdown → 多入口打包(55 组件 ESM/CJS/DTS)
|
|
649
|
-
├── 2. sass CLI → 编译共享变量入口 → global-scss.css
|
|
650
|
-
├── 3. merge-css.js → 合并 Vue 编译后的 SFC CSS + 全局变量 → style.css
|
|
651
|
-
├── 4. gen-exports.js → 自动生成 package.json exports 映射
|
|
652
|
-
├── 5. check:dist → 校验根入口、子路径、SSR 及 DTS 公共导出
|
|
653
|
-
└── 6. check:size → 校验全量/基础样式与发布包体积预算
|
|
654
|
-
```
|
|
157
|
+
本轮最小消费构建中,基础表单与展示表格的首屏 JS gzip 分别下降 36.1% 和 34.6%;包含 Vue 与 Naive UI,测量范围及自动体积门禁见[消费体积记录](./docs/performance-0.15.0.md)。
|
|
655
158
|
|
|
656
|
-
|
|
159
|
+
根入口聚合导航组件,运行时也需要 `vue-router`。不使用路由的项目请选择组件子路径,无需因此补装无关可选 peer。
|
|
657
160
|
|
|
658
|
-
|
|
659
|
-
- **SCSS 处理**:自定义 `scssTransformPlugin` 在 Rolldown 管线内编译 SFC SCSS,独立 Sass CLI 仅编译共享变量入口
|
|
660
|
-
- **CSS 合并**:构建后将 Vue 已完成 scoped 转换的 per-chunk CSS 与共享变量合并为单一 `style.css`,避免重复样式和原始 `:deep()` 选择器泄漏
|
|
661
|
-
- **类型导出**:统一 `export *` barrel 模式,自动生成完整 `.d.ts`
|
|
662
|
-
- **子路径导出**:`gen-exports.js` 自动扫描 `dist/` 并写入 `package.json` 的 `exports` 字段
|
|
663
|
-
- **导出冲突检测**:`check-export-conflicts.js` 确保组件间无命名冲突
|
|
664
|
-
- **产物入口校验**:`check-dist-entries.js` 防止内部 chunk 覆盖根声明,并保证组件工具的子路径类型完整
|
|
665
|
-
- **包契约校验**:禁止 Naive UI 内部类型路径、隐式可选依赖和插件控制台副作用
|
|
666
|
-
- **体积预算**:`check-size-budget.js` 阻止全量样式、C_Form/C_Table 样式和 dist 总量意外膨胀
|
|
161
|
+
## 文档导航
|
|
667
162
|
|
|
668
|
-
|
|
163
|
+
| 文档 | 内容 |
|
|
164
|
+
| ------------------------------------ | ---------------------------------------------------------------- |
|
|
165
|
+
| [架构与隔离](./docs/architecture.md) | 依赖边界、实例所有权与独立 Element Plus 演进路线 |
|
|
166
|
+
| [组件目录](./docs/components.md) | 55 个组件、外部依赖与各组件的使用边界 |
|
|
167
|
+
| [使用指南](./docs/guides/usage.md) | 导入、表单表格、Cron/公式、地图、引导、人机验证、登录与页面加载 |
|
|
168
|
+
| [开发与构建](./docs/engineering.md) | 工程结构、六阶段构建、组件扩展、校验与发布流程 |
|
|
169
|
+
| [品牌资源](./docs/assets/README.md) | Robot 系列 Logo、可编辑 SVG 与高清 PNG 封面 |
|
|
170
|
+
| [变更记录](./CHANGELOG.md) | 版本更新与兼容变化 |
|
|
171
|
+
| [安全策略](./SECURITY.md) | 漏洞报告与维护约定 |
|
|
669
172
|
|
|
670
|
-
|
|
671
|
-
dist/
|
|
672
|
-
├── index.js / index.cjs / index.d.ts # 主入口
|
|
673
|
-
├── C_Form.js / C_Form.cjs / C_Form.d.ts # 子路径入口(55 组件)
|
|
674
|
-
├── C_Form.base.css / C_Form.full.css # 基础/完整样式层级
|
|
675
|
-
├── C_Table.base.css / C_Table.full.css # 基础/完整样式层级
|
|
676
|
-
├── style.css # 合并后的全量样式
|
|
677
|
-
├── images/ # Leaflet Marker/图层控件资源
|
|
678
|
-
└── [chunk].js # 共享代码块
|
|
679
|
-
```
|
|
173
|
+
本轮依赖审计的两项上游告警见 [2026-10-18 扫描记录](./docs/security-scan-2026-10-18.md);[2026-10-06 记录](./docs/security-scan-2026-10-06.md)保留为历史档案。当前依赖状态以实际运行 `bun run check:audit` 的结果为准。
|
|
680
174
|
|
|
681
|
-
|
|
175
|
+
## 本地开发
|
|
682
176
|
|
|
683
|
-
|
|
177
|
+
维护本仓库需要 **Node.js ≥20.19.0**、**Bun ≥1.3.14**;仓库固定包管理器 `bun@1.3.14`,CI 按 `.node-version` 与冻结锁文件安装。
|
|
684
178
|
|
|
685
179
|
```bash
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
bun
|
|
689
|
-
bun run
|
|
690
|
-
bun run build:css # 合并 tsdown 刚生成的 CSS chunk;已完成的 dist 会安全跳过
|
|
691
|
-
bun run build:exports # 仅生成 exports 映射
|
|
692
|
-
bun run check:exports # 检测导出命名冲突
|
|
693
|
-
bun run check:dist # 校验构建后的 JS / DTS 公共入口
|
|
694
|
-
bun run check:package # 校验依赖、导出和源码公共边界
|
|
695
|
-
bun run check:quality # 防止 any、console 与类型抑制债务反弹
|
|
696
|
-
bun run check:audit # 审计直接与传递依赖漏洞
|
|
697
|
-
bun run check:size # 校验发布产物体积预算
|
|
698
|
-
bun run type-check # TypeScript 类型检查
|
|
699
|
-
bun run test # 运行 Bun 单元测试
|
|
700
|
-
bun run lint:check # 强制 Oxlint 正确性检查
|
|
701
|
-
bun run lint:eslint # ESLint 存量规则审计
|
|
702
|
-
bun run verify # 类型、测试、导出和构建全量验证
|
|
703
|
-
```
|
|
704
|
-
|
|
705
|
-
#### 项目结构
|
|
706
|
-
|
|
180
|
+
git clone https://github.com/ChenyCHENYU/naive-ui-components.git
|
|
181
|
+
cd naive-ui-components
|
|
182
|
+
bun install --frozen-lockfile
|
|
183
|
+
bun run dev
|
|
707
184
|
```
|
|
708
|
-
naive-ui-components/
|
|
709
|
-
├── src/
|
|
710
|
-
│ ├── index.ts # 库入口(全量注册 + export * barrel)
|
|
711
|
-
│ ├── styles/
|
|
712
|
-
│ │ ├── variables.scss # CSS 变量 (--c-*)
|
|
713
|
-
│ │ └── global.scss # 自动生成的共享变量入口
|
|
714
|
-
│ ├── components/
|
|
715
|
-
│ │ └── C_[Name]/
|
|
716
|
-
│ │ ├── index.vue # 组件主文件
|
|
717
|
-
│ │ ├── index.ts # Barrel 导出
|
|
718
|
-
│ │ ├── index.scss # 组件样式
|
|
719
|
-
│ │ ├── types.ts # 类型定义
|
|
720
|
-
│ │ ├── constants.ts # 常量
|
|
721
|
-
│ │ ├── data.ts # 静态数据
|
|
722
|
-
│ │ ├── composables/ # 组合式函数
|
|
723
|
-
│ │ ├── components/ # 子组件
|
|
724
|
-
│ │ └── layouts/ # 布局变体(C_Form/C_AntV)
|
|
725
|
-
│ ├── plugins/ # highlight.js 等插件
|
|
726
|
-
│ └── utils/ # 工具函数
|
|
727
|
-
├── scripts/
|
|
728
|
-
│ ├── gen-global-scss.js # 生成 global.scss(仅共享变量)
|
|
729
|
-
│ ├── watch-global-scss.js # 开发模式 SCSS 监听
|
|
730
|
-
│ ├── merge-css.js # 合并 CSS 产物
|
|
731
|
-
│ ├── gen-exports.js # 自动生成 package.json exports
|
|
732
|
-
│ └── check-export-conflicts.js # 导出命名冲突检测
|
|
733
|
-
├── types/
|
|
734
|
-
│ └── env.d.ts # .vue / .scss 模块声明
|
|
735
|
-
├── tsdown.config.ts # 构建配置(多入口 + SCSS 插件 + Vue 插件)
|
|
736
|
-
└── tsconfig.json
|
|
737
|
-
```
|
|
738
|
-
|
|
739
|
-
#### 添加新组件
|
|
740
|
-
|
|
741
|
-
1. 创建 `src/components/C_NewComponent/` 目录
|
|
742
|
-
2. 编写 `index.vue`、`index.ts`(barrel)、`types.ts`
|
|
743
|
-
3. 在 `src/index.ts` 中添加 `export * from './components/C_NewComponent'`
|
|
744
|
-
4. 运行 `bun run build`—构建脚本会自动生成子路径入口和 exports 映射
|
|
745
185
|
|
|
746
|
-
|
|
186
|
+
`dev` 监听组件库与共享 SCSS 的构建变化。交互演示由 Robot Admin 消费组件库提供。
|
|
747
187
|
|
|
748
188
|
```bash
|
|
749
|
-
bun run
|
|
750
|
-
bun run
|
|
751
|
-
bun run verify # 发布前完整验证
|
|
752
|
-
bun run release # 发布 Changesets 中待发布版本
|
|
189
|
+
bun run verify # Lint、类型、逻辑与组件测试、导出、构建与使用侧类型
|
|
190
|
+
bun run check:audit # 单独运行依赖安全审计,CI 在 verify 前执行
|
|
753
191
|
```
|
|
754
192
|
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
## 发布后的安全扫描记录(2026-10-06)
|
|
758
|
-
|
|
759
|
-
`0.13.5` 的 npm 产物与已验证产物内容一致。随后安全扫描更新了开发工具和解析依赖的锁文件,并将仓库 overrides 中的 `@xmldom/xmldom`、`fast-uri` 固定到 `0.8.15`、`3.1.8`;这部分仓库维护不覆盖已经发布的 npm 产物。
|
|
760
|
-
|
|
761
|
-
当前扫描仍报告 [braces](https://github.com/advisories/GHSA-vfj7-8cjw-p6xm) 和 [sprintf-js](https://github.com/advisories/GHSA-hp3w-g68c-fv3c) 两项上游尚无发布修复版本的告警,`bun run check:audit` 仍非零退出。保留 CI 安全门禁和真实扫描结果;待上游发布修复后更新锁文件并复验。
|
|
193
|
+
各项检查与发布步骤见[开发与构建](./docs/engineering.md),CI 定义见 [ci.yml](./.github/workflows/ci.yml)。
|
|
762
194
|
|
|
763
|
-
|
|
195
|
+
## Robot 生态
|
|
764
196
|
|
|
765
|
-
|
|
197
|
+
| 项目 | 职责 |
|
|
198
|
+
| --------------------------------------------------------------------------- | --------------------------------------------------- |
|
|
199
|
+
| **Naive UI Components** | 可独立消费的 Vue 3 业务组件与组合函数 |
|
|
200
|
+
| [Robot Admin](https://github.com/ChenyCHENYU/Robot_Admin) | PC Web 工程模板、业务页面与组件交互演示 |
|
|
201
|
+
| [robot-admin-packages](https://github.com/ChenyCHENYU/robot-admin-packages) | 请求、验证、主题、布局、指令、文件工具与 Git 工程包 |
|
|
202
|
+
| [Robot Cloud](https://github.com/ChenyCHENYU/Robot_Cloud) | 认证、公司上下文、系统管理与权限治理后端 |
|
|
766
203
|
|
|
767
|
-
|
|
204
|
+
## 许可证
|
|
768
205
|
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
## 🔗 链接
|
|
772
|
-
|
|
773
|
-
- [组件在线文档(含交互演示)](https://www.tzagileteam.com/robot/components/preface)
|
|
774
|
-
- [Robot Admin 主项目](https://github.com/ChenyCHENYU/robot_admin)
|
|
775
|
-
- [Robot Admin 在线体验](https://www.robotadmin.cn)
|
|
776
|
-
- [GitHub](https://github.com/ChenyCHENYU/naive-ui-components)
|
|
777
|
-
- [NPM](https://www.npmjs.com/package/@robot-admin/naive-ui-components)
|
|
778
|
-
|
|
779
|
-
### C_Login 扩展表单
|
|
780
|
-
|
|
781
|
-
`password-fields` 插槽位于密码输入框下方,提供 `username`、`loading`,可配置工作空间或其他业务字段。`username-change` 在初始预填、恢复记住的账号和输入变化时同步触发。宿主通过 `submitDisabled` 阻止扩展字段尚未就绪时的按钮与回车提交;`loading` 期间凭据输入禁用。公司查询、成员关系和权限始终由宿主认证服务处理,组件不保存业务上下文。
|
|
782
|
-
|
|
783
|
-
### 页面切换加载
|
|
784
|
-
|
|
785
|
-
路由生命周期只需要关联 `start()` / `finish(id)`;动画、主题和减少动态效果由组件库处理。默认延迟 160ms 显示,快速切换不闪烁,旧任务完成不会关闭新任务。
|
|
786
|
-
|
|
787
|
-
```vue
|
|
788
|
-
<C_PageLoading :show="loading.visible.value" />
|
|
789
|
-
```
|
|
790
|
-
|
|
791
|
-
```ts
|
|
792
|
-
import { createPageLoading } from '@robot-admin/naive-ui-components/C_PageLoading'
|
|
793
|
-
const loading = createPageLoading({ delay: 160 })
|
|
794
|
-
const id = loading.start()
|
|
795
|
-
// 路由完成、取消或失败后
|
|
796
|
-
loading.finish(id)
|
|
797
|
-
```
|
|
206
|
+
[MIT License](./LICENSE) · Made by [CHENY](https://github.com/ChenyCHENYU)
|