@cst-ui/nano-buttons 0.2.2 → 0.3.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 +267 -219
- package/dist/NanoTextAddButton.vue_vue_type_script_setup_true_lang-CYuxrToE.js +219 -0
- package/dist/NanoTextAddButton.vue_vue_type_script_setup_true_lang-DIaonSsx.cjs +1 -0
- package/dist/buttons/index.cjs +1 -1
- package/dist/buttons/index.mjs +32 -235
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +19 -2
- package/dist/index.mjs +36 -16
- package/dist/style.css +1 -1
- package/dist/table/CstPagination.vue.d.ts +64 -0
- package/dist/table/CstTable.vue.d.ts +47 -0
- package/dist/table/index.cjs +1 -0
- package/dist/table/index.d.ts +7 -0
- package/dist/table/index.mjs +136 -0
- package/package.json +74 -66
package/README.md
CHANGED
|
@@ -1,244 +1,292 @@
|
|
|
1
|
-
# @cst-ui/nano-buttons
|
|
2
|
-
|
|
3
|
-
Nano
|
|
4
|
-
|
|
5
|
-
这个包用于统一提供 Nano
|
|
6
|
-
|
|
7
|
-
## 入口说明
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
```ts
|
|
12
|
-
// 兼容旧按钮入口
|
|
13
|
-
import NanoButtons from '@cst-ui/nano-buttons'
|
|
14
|
-
|
|
15
|
-
// 明确的按钮入口
|
|
16
|
-
import NanoButtons from '@cst-ui/nano-buttons/buttons'
|
|
17
|
-
|
|
1
|
+
# @cst-ui/nano-buttons
|
|
2
|
+
|
|
3
|
+
Nano 项目公共前端组件库,基于 Vue 3 和 Element Plus 封装。
|
|
4
|
+
|
|
5
|
+
这个包用于统一提供 Nano 系列按钮、表格、分页组件,并通过子入口提供弹窗标签页化的公共能力。模板中统一使用横线法组件名,例如 `<nano-button>`,不再保留旧命名。
|
|
6
|
+
|
|
7
|
+
## 入口说明
|
|
8
|
+
|
|
9
|
+
包内能力按子入口拆分,按钮、表格和弹窗标签页可以分开引入:
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
// 兼容旧按钮入口
|
|
13
|
+
import NanoButtons from '@cst-ui/nano-buttons'
|
|
14
|
+
|
|
15
|
+
// 明确的按钮入口
|
|
16
|
+
import NanoButtons from '@cst-ui/nano-buttons/buttons'
|
|
17
|
+
|
|
18
18
|
// 弹窗标签页入口
|
|
19
19
|
import { createNanoDialogTabs } from '@cst-ui/nano-buttons/dialog-tabs'
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## 在线文档
|
|
23
|
-
|
|
24
|
-
组件效果、安装方式、使用示例和 API 说明见在线文档:
|
|
25
|
-
|
|
26
|
-
https://nano-buttons-docs.netlify.app/
|
|
27
|
-
|
|
28
|
-
## 安装
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
pnpm add @cst-ui/nano-buttons
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## 全局注册
|
|
35
|
-
|
|
36
|
-
在应用入口文件中注册组件并引入样式:
|
|
37
|
-
|
|
38
|
-
```ts
|
|
39
|
-
import { createApp } from 'vue'
|
|
40
|
-
import App from './App.vue'
|
|
41
|
-
import NanoButtons from '@cst-ui/nano-buttons'
|
|
42
|
-
import '@cst-ui/nano-buttons/style.css'
|
|
43
|
-
|
|
44
|
-
const app = createApp(App)
|
|
45
|
-
|
|
46
|
-
app.use(NanoButtons)
|
|
47
|
-
app.mount('#app')
|
|
48
|
-
```
|
|
49
20
|
|
|
21
|
+
// 表格与分页入口
|
|
22
|
+
import { CstTable, CstPagination } from '@cst-ui/nano-buttons/table'
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 在线文档
|
|
26
|
+
|
|
27
|
+
组件效果、安装方式、使用示例和 API 说明见在线文档:
|
|
28
|
+
|
|
29
|
+
https://nano-buttons-docs.netlify.app/
|
|
30
|
+
|
|
31
|
+
## 安装
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pnpm add @cst-ui/nano-buttons
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 全局注册
|
|
38
|
+
|
|
39
|
+
在应用入口文件中注册组件并引入样式:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { createApp } from 'vue'
|
|
43
|
+
import App from './App.vue'
|
|
44
|
+
import NanoButtons from '@cst-ui/nano-buttons'
|
|
45
|
+
import '@cst-ui/nano-buttons/style.css'
|
|
46
|
+
|
|
47
|
+
const app = createApp(App)
|
|
48
|
+
|
|
49
|
+
app.use(NanoButtons)
|
|
50
|
+
app.mount('#app')
|
|
51
|
+
```
|
|
52
|
+
|
|
50
53
|
按钮插件也提供明确的平级子入口,旧入口继续兼容:
|
|
51
|
-
|
|
52
|
-
```ts
|
|
54
|
+
|
|
55
|
+
```ts
|
|
53
56
|
import NanoButtons from '@cst-ui/nano-buttons/buttons'
|
|
54
57
|
```
|
|
55
58
|
|
|
56
|
-
|
|
59
|
+
表格模块使用独立入口,可以按需引入组件或全局安装:
|
|
57
60
|
|
|
58
|
-
|
|
61
|
+
```ts
|
|
62
|
+
import CstTableComponents from '@cst-ui/nano-buttons/table'
|
|
59
63
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
<nano-
|
|
69
|
-
<nano-
|
|
70
|
-
<nano-
|
|
71
|
-
<nano-
|
|
64
|
+
app.use(CstTableComponents)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 组件列表
|
|
68
|
+
|
|
69
|
+
模板中统一使用横线法:
|
|
70
|
+
|
|
71
|
+
```vue
|
|
72
|
+
<nano-button />
|
|
73
|
+
<nano-add-button />
|
|
74
|
+
<nano-text-add-button />
|
|
75
|
+
<nano-move-button />
|
|
76
|
+
<nano-import-button />
|
|
77
|
+
<nano-export-button />
|
|
78
|
+
<nano-edit-button />
|
|
79
|
+
<nano-manage-button />
|
|
80
|
+
<nano-delete-button />
|
|
81
|
+
<nano-submit-button />
|
|
82
|
+
<nano-cancel-button />
|
|
72
83
|
<nano-back-top-button />
|
|
84
|
+
<cst-table />
|
|
85
|
+
<cst-pagination />
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## 使用示例
|
|
89
|
+
|
|
90
|
+
固定语义按钮直接使用对应组件:
|
|
91
|
+
|
|
92
|
+
```vue
|
|
93
|
+
<nano-add-button />
|
|
94
|
+
<nano-import-button />
|
|
95
|
+
<nano-export-button />
|
|
96
|
+
<nano-delete-button />
|
|
97
|
+
<nano-submit-button>保存</nano-submit-button>
|
|
98
|
+
<nano-cancel-button>取消</nano-cancel-button>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
不在固定语义里的普通按钮,统一使用 `<nano-button>`:
|
|
102
|
+
|
|
103
|
+
```vue
|
|
104
|
+
<nano-button icon="Refresh">刷新</nano-button>
|
|
105
|
+
<nano-import-button>导入</nano-import-button>
|
|
106
|
+
<nano-export-button :loading="exporting">导出</nano-export-button>
|
|
73
107
|
```
|
|
74
108
|
|
|
75
|
-
##
|
|
109
|
+
## 表格与分页
|
|
76
110
|
|
|
77
|
-
|
|
111
|
+
`CstPagination` 是独立分页组件,只负责展示分页状态和发送变更事件,不请求接口、不处理业务数据。服务端分页页面可以直接接入现有查询方法:
|
|
78
112
|
|
|
79
113
|
```vue
|
|
80
|
-
<
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
114
|
+
<CstPagination
|
|
115
|
+
:current-page="page.currentPage"
|
|
116
|
+
:page-size="page.pageSize"
|
|
117
|
+
:page-count="page.pageCount"
|
|
118
|
+
:page-sizes="page.pageSizes"
|
|
119
|
+
@update:current-page="onCurrentPageUpdate"
|
|
120
|
+
@update:page-size="onPageSizeUpdate"
|
|
121
|
+
/>
|
|
86
122
|
```
|
|
87
123
|
|
|
88
|
-
|
|
124
|
+
`CstTable` 组合了 Element Plus Table 和 `CstPagination`,默认对传入的完整数组做前端分页。列定义和其他表格属性继续按照 Element Plus Table 使用:
|
|
89
125
|
|
|
90
126
|
```vue
|
|
91
|
-
<
|
|
92
|
-
|
|
93
|
-
|
|
127
|
+
<CstTable
|
|
128
|
+
:data="rows"
|
|
129
|
+
:default-page-size="10"
|
|
130
|
+
>
|
|
131
|
+
<el-table-column prop="name" label="名称" />
|
|
132
|
+
<el-table-column prop="status" label="状态" />
|
|
133
|
+
</CstTable>
|
|
94
134
|
```
|
|
95
135
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
`vue`、`element-plus` 和 `vue-router` 是 peer dependencies,需要由使用方项目提供。
|
|
99
|
-
|
|
100
|
-
## 弹窗标签页
|
|
101
|
-
|
|
102
|
-
弹窗标签页能力用于把原本的弹窗按开关切换成系统 tab 页,同时保留原弹窗模式。公共包只负责打开模式、上下文缓存、保存结果通知、关闭回来源页和 `NanoDialogTabPage` 页面壳;业务项目负责注册页面、请求数据和保存业务。
|
|
103
|
-
|
|
104
|
-
### 入口安装
|
|
105
|
-
|
|
106
|
-
在应用入口安装插件:
|
|
107
|
-
|
|
108
|
-
```ts
|
|
109
|
-
import { createNanoDialogTabs } from '@cst-ui/nano-buttons/dialog-tabs'
|
|
110
|
-
|
|
111
|
-
app.use(createNanoDialogTabs({
|
|
112
|
-
router,
|
|
113
|
-
parentRouteName: 'layout',
|
|
114
|
-
registry: dialogRegistry,
|
|
115
|
-
mode: () => DIALOG_OPEN_MODE,
|
|
116
|
-
translate: key => i18n.global.t(key),
|
|
117
|
-
tabAdapter: {
|
|
118
|
-
getTabs: () => tabStore.tabsOption,
|
|
119
|
-
getCurrentIndex: () => tabStore.currentIndex,
|
|
120
|
-
setCurrentIndex: index => tabStore.SET_TAB(index),
|
|
121
|
-
deleteTab: index => tabStore.DELETE_TAB(index),
|
|
122
|
-
},
|
|
123
|
-
}))
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### 注册页面
|
|
127
|
-
|
|
128
|
-
在业务项目维护弹窗注册表:
|
|
129
|
-
|
|
130
|
-
```ts
|
|
131
|
-
export const dialogRegistry = {
|
|
132
|
-
userEdit: {
|
|
133
|
-
suffix: '/edit',
|
|
134
|
-
title: 'dialog.user.edit',
|
|
135
|
-
component: async () => await import('@/views/user/components/edit-page.vue'),
|
|
136
|
-
props: {
|
|
137
|
-
mode: 'edit',
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
}
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### 打开弹窗或 tab
|
|
144
|
-
|
|
145
|
-
原页面统一使用 `openDialog`。开关为 `dialog` 时走 `openModal`,开关为 `tab` 时打开注册页面:
|
|
146
|
-
|
|
147
|
-
```ts
|
|
148
|
-
import { useDialogOpen } from '@cst-ui/nano-buttons/dialog-tabs'
|
|
149
|
-
|
|
150
|
-
const { openDialog } = useDialogOpen()
|
|
151
|
-
|
|
152
|
-
openDialog({
|
|
153
|
-
key: 'userEdit',
|
|
154
|
-
routeSuffix: `/edit/${row.id}`,
|
|
155
|
-
routePatternSuffix: '/edit/:id',
|
|
156
|
-
context: {
|
|
157
|
-
id: row.id,
|
|
158
|
-
},
|
|
159
|
-
openModal: () => {
|
|
160
|
-
data.showEdit = true
|
|
161
|
-
},
|
|
162
|
-
})
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
### tab 页面
|
|
166
|
-
|
|
167
|
-
tab 页面用 `NanoDialogTabPage` 统一标题、内容滚动、底部操作区和上下文失效兜底:
|
|
136
|
+
只需要表格、不需要分页时关闭分页:
|
|
168
137
|
|
|
169
138
|
```vue
|
|
170
|
-
<
|
|
171
|
-
<
|
|
172
|
-
|
|
173
|
-
:loading="loading"
|
|
174
|
-
:expired="expired"
|
|
175
|
-
@close="closeCurrentDialogTab"
|
|
176
|
-
>
|
|
177
|
-
<UserEditForm
|
|
178
|
-
:item="item"
|
|
179
|
-
variant="page"
|
|
180
|
-
@cancel="closeCurrentDialogTab"
|
|
181
|
-
@save-ok="onSaveOk"
|
|
182
|
-
/>
|
|
183
|
-
</NanoDialogTabPage>
|
|
184
|
-
</template>
|
|
185
|
-
|
|
186
|
-
<script setup lang="ts">
|
|
187
|
-
import { NanoDialogTabPage, useDialogPage } from '@cst-ui/nano-buttons/dialog-tabs'
|
|
188
|
-
|
|
189
|
-
const {
|
|
190
|
-
route,
|
|
191
|
-
dialogContext,
|
|
192
|
-
closeCurrentDialogTab,
|
|
193
|
-
emitSavedAndClose,
|
|
194
|
-
} = useDialogPage<{ id?: string }>('dialog.user.edit')
|
|
195
|
-
|
|
196
|
-
const id = computed(() => dialogContext.value?.id ?? route.params.id)
|
|
197
|
-
|
|
198
|
-
const onSaveOk = () => {
|
|
199
|
-
emitSavedAndClose('userEdit', { id: id.value })
|
|
200
|
-
}
|
|
201
|
-
</script>
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
### 保存后刷新来源页
|
|
205
|
-
|
|
206
|
-
来源页可以监听保存结果并刷新列表:
|
|
207
|
-
|
|
208
|
-
```ts
|
|
209
|
-
import { onDialogResult } from '@cst-ui/nano-buttons/dialog-tabs'
|
|
210
|
-
|
|
211
|
-
onMounted(() => {
|
|
212
|
-
const remove = onDialogResult((result) => {
|
|
213
|
-
if (result.key === 'userEdit' && result.type === 'saved')
|
|
214
|
-
loadList()
|
|
215
|
-
})
|
|
216
|
-
|
|
217
|
-
onUnmounted(remove)
|
|
218
|
-
})
|
|
139
|
+
<CstTable :data="rows" :pagination="false">
|
|
140
|
+
<el-table-column prop="name" label="名称" />
|
|
141
|
+
</CstTable>
|
|
219
142
|
```
|
|
220
143
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
144
|
+
## 依赖说明
|
|
145
|
+
|
|
146
|
+
`vue`、`element-plus` 和 `vue-router` 是 peer dependencies,需要由使用方项目提供。
|
|
147
|
+
|
|
148
|
+
## 弹窗标签页
|
|
149
|
+
|
|
150
|
+
弹窗标签页能力用于把原本的弹窗按开关切换成系统 tab 页,同时保留原弹窗模式。公共包只负责打开模式、上下文缓存、保存结果通知、关闭回来源页和 `NanoDialogTabPage` 页面壳;业务项目负责注册页面、请求数据和保存业务。
|
|
151
|
+
|
|
152
|
+
### 入口安装
|
|
153
|
+
|
|
154
|
+
在应用入口安装插件:
|
|
155
|
+
|
|
156
|
+
```ts
|
|
157
|
+
import { createNanoDialogTabs } from '@cst-ui/nano-buttons/dialog-tabs'
|
|
158
|
+
|
|
159
|
+
app.use(createNanoDialogTabs({
|
|
160
|
+
router,
|
|
161
|
+
parentRouteName: 'layout',
|
|
162
|
+
registry: dialogRegistry,
|
|
163
|
+
mode: () => DIALOG_OPEN_MODE,
|
|
164
|
+
translate: key => i18n.global.t(key),
|
|
165
|
+
tabAdapter: {
|
|
166
|
+
getTabs: () => tabStore.tabsOption,
|
|
167
|
+
getCurrentIndex: () => tabStore.currentIndex,
|
|
168
|
+
setCurrentIndex: index => tabStore.SET_TAB(index),
|
|
169
|
+
deleteTab: index => tabStore.DELETE_TAB(index),
|
|
170
|
+
},
|
|
171
|
+
}))
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 注册页面
|
|
175
|
+
|
|
176
|
+
在业务项目维护弹窗注册表:
|
|
177
|
+
|
|
178
|
+
```ts
|
|
179
|
+
export const dialogRegistry = {
|
|
180
|
+
userEdit: {
|
|
181
|
+
suffix: '/edit',
|
|
182
|
+
title: 'dialog.user.edit',
|
|
183
|
+
component: async () => await import('@/views/user/components/edit-page.vue'),
|
|
184
|
+
props: {
|
|
185
|
+
mode: 'edit',
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 打开弹窗或 tab
|
|
192
|
+
|
|
193
|
+
原页面统一使用 `openDialog`。开关为 `dialog` 时走 `openModal`,开关为 `tab` 时打开注册页面:
|
|
194
|
+
|
|
195
|
+
```ts
|
|
196
|
+
import { useDialogOpen } from '@cst-ui/nano-buttons/dialog-tabs'
|
|
197
|
+
|
|
198
|
+
const { openDialog } = useDialogOpen()
|
|
199
|
+
|
|
200
|
+
openDialog({
|
|
201
|
+
key: 'userEdit',
|
|
202
|
+
routeSuffix: `/edit/${row.id}`,
|
|
203
|
+
routePatternSuffix: '/edit/:id',
|
|
204
|
+
context: {
|
|
205
|
+
id: row.id,
|
|
206
|
+
},
|
|
207
|
+
openModal: () => {
|
|
208
|
+
data.showEdit = true
|
|
209
|
+
},
|
|
210
|
+
})
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### tab 页面
|
|
214
|
+
|
|
215
|
+
tab 页面用 `NanoDialogTabPage` 统一标题、内容滚动、底部操作区和上下文失效兜底:
|
|
216
|
+
|
|
217
|
+
```vue
|
|
218
|
+
<template>
|
|
219
|
+
<NanoDialogTabPage
|
|
220
|
+
:title-key="pageTitleKey"
|
|
221
|
+
:loading="loading"
|
|
222
|
+
:expired="expired"
|
|
223
|
+
@close="closeCurrentDialogTab"
|
|
224
|
+
>
|
|
225
|
+
<UserEditForm
|
|
226
|
+
:item="item"
|
|
227
|
+
variant="page"
|
|
228
|
+
@cancel="closeCurrentDialogTab"
|
|
229
|
+
@save-ok="onSaveOk"
|
|
230
|
+
/>
|
|
231
|
+
</NanoDialogTabPage>
|
|
232
|
+
</template>
|
|
233
|
+
|
|
234
|
+
<script setup lang="ts">
|
|
235
|
+
import { NanoDialogTabPage, useDialogPage } from '@cst-ui/nano-buttons/dialog-tabs'
|
|
236
|
+
|
|
237
|
+
const {
|
|
238
|
+
route,
|
|
239
|
+
dialogContext,
|
|
240
|
+
closeCurrentDialogTab,
|
|
241
|
+
emitSavedAndClose,
|
|
242
|
+
} = useDialogPage<{ id?: string }>('dialog.user.edit')
|
|
243
|
+
|
|
244
|
+
const id = computed(() => dialogContext.value?.id ?? route.params.id)
|
|
245
|
+
|
|
246
|
+
const onSaveOk = () => {
|
|
247
|
+
emitSavedAndClose('userEdit', { id: id.value })
|
|
248
|
+
}
|
|
249
|
+
</script>
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### 保存后刷新来源页
|
|
253
|
+
|
|
254
|
+
来源页可以监听保存结果并刷新列表:
|
|
255
|
+
|
|
256
|
+
```ts
|
|
257
|
+
import { onDialogResult } from '@cst-ui/nano-buttons/dialog-tabs'
|
|
258
|
+
|
|
259
|
+
onMounted(() => {
|
|
260
|
+
const remove = onDialogResult((result) => {
|
|
261
|
+
if (result.key === 'userEdit' && result.type === 'saved')
|
|
262
|
+
loadList()
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
onUnmounted(remove)
|
|
266
|
+
})
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### 使用建议
|
|
270
|
+
|
|
271
|
+
1. 路由上的业务主键只放可被正常访问的 ID,不放敏感数据。
|
|
272
|
+
2. `context` 只作为临时上下文,页面刷新后可能失效,页面应提供兜底提示或根据路由主键重新查数据。
|
|
273
|
+
3. 标题传多语言 key,不在公共模块里写死业务文案。
|
|
274
|
+
4. 保存成功统一用 `emitSavedAndClose` 通知来源页刷新。
|
|
275
|
+
|
|
276
|
+
## 维护与发布
|
|
277
|
+
|
|
278
|
+
包维护、版本发布和权限交接说明见 [MAINTAINING.md](./MAINTAINING.md)。
|
|
279
|
+
|
|
280
|
+
文档站本地开发:
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
pnpm docs:dev
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
文档站构建:
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
pnpm docs:build
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
更新线上文档时,重新构建后将 `docs-dist/` 上传到 Netlify。若 Netlify 站点或域名发生变化,请同步修改本文档中的在线文档链接。
|