@pnt-team/pnt-component-frontend 0.0.40 → 0.0.41
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 +70 -183
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -24,15 +24,12 @@ yarn add @pnt-team/pnt-component-frontend
|
|
|
24
24
|
|
|
25
25
|
```tsx
|
|
26
26
|
import {
|
|
27
|
-
//
|
|
28
|
-
PntCopyData,
|
|
27
|
+
// L1 基础展示组件
|
|
29
28
|
PntImagePreview,
|
|
29
|
+
// L2 业务复合组件
|
|
30
30
|
PntSecureBox,
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
useBtnPermission,
|
|
34
|
-
useHighSecurity,
|
|
35
|
-
useOsPlatformList,
|
|
31
|
+
// L3 布局组件
|
|
32
|
+
PntGeneralLayout,
|
|
36
33
|
} from '@pnt-team/pnt-component-frontend';
|
|
37
34
|
```
|
|
38
35
|
|
|
@@ -40,44 +37,6 @@ import {
|
|
|
40
37
|
|
|
41
38
|
### L1 基础展示组件
|
|
42
39
|
|
|
43
|
-
#### PntCopyData — 数据复制组件
|
|
44
|
-
|
|
45
|
-
点击触发元素将数据复制到剪贴板,通过 Popup 气泡提示复制结果。优先使用 `navigator.clipboard`,非安全上下文自动降级为 `document.execCommand('copy')`。
|
|
46
|
-
|
|
47
|
-
**Props:**
|
|
48
|
-
|
|
49
|
-
| 属性 | 类型 | 必填 | 说明 |
|
|
50
|
-
| ----------- | ------------------------------------------------- | ---- | ------------------------------------ |
|
|
51
|
-
| `data` | `string \| (() => Promise<string>)` | ✅ | 需要复制的数据,支持字符串或异步函数 |
|
|
52
|
-
| `tips` | `(isCopy: boolean, isFail: boolean) => ReactNode` | ✅ | 提示内容渲染函数 |
|
|
53
|
-
| `contentFn` | `(props: { onClick, onMouseLeave }) => ReactNode` | ✅ | 触发元素渲染函数 |
|
|
54
|
-
| `placement` | `PopupPlacement` | ❌ | Popup 弹出位置,默认由 TDesign 决定 |
|
|
55
|
-
| `className` | `string` | ❌ | 自定义类名 |
|
|
56
|
-
|
|
57
|
-
**示例:**
|
|
58
|
-
|
|
59
|
-
```tsx
|
|
60
|
-
// 基础用法
|
|
61
|
-
<PntCopyData
|
|
62
|
-
data="这是一段需要复制的文本"
|
|
63
|
-
tips={(isCopy, isFail) => (isFail ? '复制失败' : '复制成功')}
|
|
64
|
-
contentFn={({ onClick, onMouseLeave }) => (
|
|
65
|
-
<Button onClick={onClick} onMouseLeave={onMouseLeave}>复制</Button>
|
|
66
|
-
)}
|
|
67
|
-
/>
|
|
68
|
-
|
|
69
|
-
// 异步获取数据(如从接口获取密码)
|
|
70
|
-
<PntCopyData
|
|
71
|
-
data={async () => await fetchSecret()}
|
|
72
|
-
tips={(isCopy, isFail) => (isFail ? '获取失败' : '已复制到剪贴板')}
|
|
73
|
-
contentFn={({ onClick, onMouseLeave }) => (
|
|
74
|
-
<Link onClick={onClick} onMouseLeave={onMouseLeave}>查看密码</Link>
|
|
75
|
-
)}
|
|
76
|
-
/>
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
---
|
|
80
|
-
|
|
81
40
|
#### PntImagePreview — 图片预览组件
|
|
82
41
|
|
|
83
42
|
用于展示上传的图片,支持预览、删除功能和上传状态显示。
|
|
@@ -110,7 +69,7 @@ import {
|
|
|
110
69
|
|
|
111
70
|
#### PntSecureBox — 高敏信息展示组件
|
|
112
71
|
|
|
113
|
-
|
|
72
|
+
统一处理和展示高敏信息,支持脱敏显示和按需获取真实数据。通过外部注入 `fetcher` 请求函数解锁敏感数据,零内部依赖。
|
|
114
73
|
|
|
115
74
|
**Props:**
|
|
116
75
|
|
|
@@ -121,169 +80,91 @@ import {
|
|
|
121
80
|
| `env` | `string \| number` | ✅ | 环境标识(如 dev / test / production) |
|
|
122
81
|
| `gameId` | `string \| number` | ✅ | 游戏 ID |
|
|
123
82
|
| `renderDom` | `(content: string) => React.ReactNode` | ✅ | 自定义渲染函数 |
|
|
83
|
+
| `fetcher` | `HighSecurityFetcher` | ✅ | 高敏数据请求函数(外部注入) |
|
|
124
84
|
| `viewText` | `string` | ❌ | 查看按钮文案,默认 `'View'` |
|
|
125
85
|
| `pageId` | `string` | ❌ | 页面 ID(用于操作日志和权限验证) |
|
|
126
86
|
|
|
127
87
|
**示例:**
|
|
128
88
|
|
|
129
89
|
```tsx
|
|
90
|
+
import http from '@/utils/request';
|
|
91
|
+
import { PntSecureBox } from '@pnt-team/pnt-component-frontend';
|
|
92
|
+
|
|
130
93
|
<PntSecureBox
|
|
131
94
|
dataKey="userPhone"
|
|
132
95
|
dataValue="138****8888"
|
|
133
96
|
env="production"
|
|
134
97
|
gameId={12345}
|
|
98
|
+
fetcher={(params) =>
|
|
99
|
+
http
|
|
100
|
+
.post('/api/v3/business/game_info/high-security-decrypt', params)
|
|
101
|
+
.then((r) => r.data)
|
|
102
|
+
}
|
|
135
103
|
renderDom={(content) => <span>{content}</span>}
|
|
136
104
|
viewText="查看"
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
### L3 业务 Hooks
|
|
143
|
-
|
|
144
|
-
#### usePagination — 分页 Hook
|
|
145
|
-
|
|
146
|
-
维护分页状态,页码/每页条数变化时通过回调通知外部发起请求。`totalCount` 为 0 时返回 `undefined`,可直接条件渲染 `<Pagination>`。
|
|
147
|
-
|
|
148
|
-
**参数:**
|
|
149
|
-
|
|
150
|
-
| 参数 | 类型 | 说明 |
|
|
151
|
-
| --------------------- | -------------------------------------------- | -------------------------------------- |
|
|
152
|
-
| `onPaginationRequest` | `(params: { pageNumber, pageSize }) => void` | 分页变化时的回调,外部在此发起列表请求 |
|
|
153
|
-
|
|
154
|
-
**返回值:**
|
|
155
|
-
|
|
156
|
-
| 返回值 | 类型 | 说明 |
|
|
157
|
-
| ------------------- | -------------------------------------------------- | -------------------------------------------------- |
|
|
158
|
-
| `paginationData` | `{ currentPage, totalCount, totalPage, pageSize }` | 当前分页数据 |
|
|
159
|
-
| `setPaginationData` | `(data: PaginationData) => void` | 回写分页数据(通常由外部请求完成后调用) |
|
|
160
|
-
| `paginationProps` | `PaginationProps \| undefined` | 可直接展开到 `<Pagination {...paginationProps} />` |
|
|
161
|
-
|
|
162
|
-
**示例:**
|
|
163
|
-
|
|
164
|
-
```tsx
|
|
165
|
-
const Demo = () => {
|
|
166
|
-
const [list, setList] = useState([]);
|
|
167
|
-
const { paginationData, setPaginationData, paginationProps } = usePagination(
|
|
168
|
-
async ({ pageNumber, pageSize }) => {
|
|
169
|
-
const res = await fetchList({ page: pageNumber, size: pageSize });
|
|
170
|
-
setList(res.data.list);
|
|
171
|
-
setPaginationData((prev) => ({
|
|
172
|
-
...prev,
|
|
173
|
-
currentPage: pageNumber,
|
|
174
|
-
pageSize,
|
|
175
|
-
totalCount: res.data.total,
|
|
176
|
-
totalPage: Math.ceil(res.data.total / pageSize),
|
|
177
|
-
}));
|
|
178
|
-
},
|
|
179
|
-
);
|
|
180
|
-
|
|
181
|
-
return (
|
|
182
|
-
<>
|
|
183
|
-
<Table data={list} />
|
|
184
|
-
{paginationProps && <Pagination {...paginationProps} />}
|
|
185
|
-
</>
|
|
186
|
-
);
|
|
187
|
-
};
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
---
|
|
191
|
-
|
|
192
|
-
#### useBtnPermission — 按钮权限 Hook
|
|
193
|
-
|
|
194
|
-
获取按钮权限处理方式,支持演示游戏判定和无权限兜底配置。零业务侵入:权限列表与演示游戏信息均通过入参注入。
|
|
195
|
-
|
|
196
|
-
**参数:**
|
|
197
|
-
|
|
198
|
-
| 参数 | 类型 | 说明 |
|
|
199
|
-
| ------------- | ---------------------------------------- | --------------------------------------------------- |
|
|
200
|
-
| `permissions` | `BtnPermissionMap` | 按钮权限映射 `{ [type]: { [key]: 1 \| -1 \| -2 } }` |
|
|
201
|
-
| `demoGame` | `{ id: number \| string; name: string }` | 演示游戏信息 |
|
|
202
|
-
| `serviceInfo` | `{ serviceType?, serviceName? }` | 当前服务信息 |
|
|
203
|
-
|
|
204
|
-
**返回值:**
|
|
205
|
-
|
|
206
|
-
| 返回值 | 类型 | 说明 |
|
|
207
|
-
| ------------------ | --------------------------------------------- | -------------------------------------------- |
|
|
208
|
-
| `btnPermission` | `BtnPermissionMap` | 权限映射原文 |
|
|
209
|
-
| `isDemoGame` | `boolean` | 是否为演示游戏 |
|
|
210
|
-
| `getBtnPermission` | `(type, key, defaultValue?) => 1 \| -1 \| -2` | 获取按钮权限(1 有权限 / -1 隐藏 / -2 禁用) |
|
|
211
|
-
|
|
212
|
-
**示例:**
|
|
213
|
-
|
|
214
|
-
```tsx
|
|
215
|
-
const Demo = ({ btnPermission, userInfo }) => {
|
|
216
|
-
const { isDemoGame, getBtnPermission } = useBtnPermission({
|
|
217
|
-
permissions: btnPermission,
|
|
218
|
-
demoGame: userInfo?.demoGame,
|
|
219
|
-
serviceInfo: {
|
|
220
|
-
serviceType: userInfo?.serviceType,
|
|
221
|
-
serviceName: userInfo?.serviceName,
|
|
222
|
-
},
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
const createPerm = getBtnPermission('global', 'create');
|
|
226
|
-
if (createPerm === -1) return null; // 隐藏
|
|
227
|
-
return (
|
|
228
|
-
<Button disabled={createPerm === -2}>
|
|
229
|
-
新建{isDemoGame ? '(演示)' : ''}
|
|
230
|
-
</Button>
|
|
231
|
-
);
|
|
232
|
-
};
|
|
105
|
+
/>;
|
|
233
106
|
```
|
|
234
107
|
|
|
235
108
|
---
|
|
236
109
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
管理高敏数据的解锁状态,通过接口请求获取真实数据。配合 `PntSecureBox` 组件使用。
|
|
240
|
-
|
|
241
|
-
**返回值:**
|
|
242
|
-
|
|
243
|
-
| 返回值 | 类型 | 说明 |
|
|
244
|
-
| --------------------- | ---------------------------------- | --------------------------------------- |
|
|
245
|
-
| `securityData` | `object` | 已解锁的高敏数据映射 `{ [key]: value }` |
|
|
246
|
-
| `setSecurityData` | `(data: object) => void` | 手动设置已解锁数据 |
|
|
247
|
-
| `requestSecurityData` | `({ gameId, param, env }) => void` | 请求解锁指定高敏数据 |
|
|
248
|
-
|
|
249
|
-
---
|
|
250
|
-
|
|
251
|
-
#### useOsPlatformList — OS/平台列表 Hook
|
|
110
|
+
### L3 布局组件
|
|
252
111
|
|
|
253
|
-
|
|
112
|
+
#### PntGeneralLayout — 通用页面布局组件
|
|
254
113
|
|
|
255
|
-
|
|
114
|
+
提供标准的「头部 + 子头部 + 内容区 + 底部」页面布局结构,基于 TDesign Layout 封装,适用于后台管理系统的详情页、表单页等场景。
|
|
256
115
|
|
|
257
|
-
|
|
258
|
-
| --------- | ------------------------------------ | -------------------------------------------- |
|
|
259
|
-
| `fetcher` | `() => Promise<{ code, msg, data }>` | 自定义请求函数(不传则使用内置默认 fetcher) |
|
|
260
|
-
|
|
261
|
-
**返回值:**
|
|
116
|
+
**Props:**
|
|
262
117
|
|
|
263
|
-
|
|
|
264
|
-
|
|
|
265
|
-
| `
|
|
118
|
+
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|
|
119
|
+
| ------------------- | --------------------- | ---- | ------ | ------------------------------------ |
|
|
120
|
+
| `className` | `string` | ❌ | - | 自定义类名 |
|
|
121
|
+
| `headerTitle` | `ReactNode` | ❌ | - | 头部标题内容,传入后渲染 Header 区域 |
|
|
122
|
+
| `showBackButton` | `boolean` | ❌ | false | 是否显示返回按钮 |
|
|
123
|
+
| `onBackButtonClick` | `() => void` | ❌ | - | 返回按钮点击回调 |
|
|
124
|
+
| `subHeaderContent` | `ReactNode` | ❌ | - | 子头部内容,位于 Header 下方 |
|
|
125
|
+
| `operation` | `ReactNode` | ❌ | - | 头部右侧操作区,常用于放置按钮组 |
|
|
126
|
+
| `bodyRef` | `Ref<HTMLDivElement>` | ❌ | - | 内容区 ref 引用 |
|
|
127
|
+
| `bodyStyle` | `CSSProperties` | ❌ | - | 内容区自定义样式 |
|
|
128
|
+
| `footer` | `ReactNode` | ❌ | - | 底部内容,传入后渲染 Footer 区域 |
|
|
129
|
+
| `children` | `ReactNode` | ❌ | - | 页面主体内容 |
|
|
266
130
|
|
|
267
131
|
**示例:**
|
|
268
132
|
|
|
269
133
|
```tsx
|
|
270
|
-
//
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
134
|
+
// 基础用法:仅内容区
|
|
135
|
+
<PntGeneralLayout>
|
|
136
|
+
<div>页面内容</div>
|
|
137
|
+
</PntGeneralLayout>
|
|
138
|
+
|
|
139
|
+
// 带标题和操作按钮
|
|
140
|
+
<PntGeneralLayout
|
|
141
|
+
headerTitle="业务配置"
|
|
142
|
+
operation={
|
|
143
|
+
<Space>
|
|
144
|
+
<Button theme="primary">保存</Button>
|
|
145
|
+
<Button variant="outline">取消</Button>
|
|
146
|
+
</Space>
|
|
147
|
+
}
|
|
148
|
+
>
|
|
149
|
+
<Form />
|
|
150
|
+
</PntGeneralLayout>
|
|
151
|
+
|
|
152
|
+
// 带返回按钮和底部操作栏
|
|
153
|
+
<PntGeneralLayout
|
|
154
|
+
headerTitle="详情页"
|
|
155
|
+
showBackButton
|
|
156
|
+
onBackButtonClick={() => history.back()}
|
|
157
|
+
footer={
|
|
158
|
+
<Space>
|
|
159
|
+
<Button theme="primary">提交</Button>
|
|
160
|
+
<Button variant="outline">重置</Button>
|
|
161
|
+
</Space>
|
|
162
|
+
}
|
|
163
|
+
>
|
|
164
|
+
<Detail />
|
|
165
|
+
</PntGeneralLayout>
|
|
283
166
|
```
|
|
284
167
|
|
|
285
|
-
> 💡 如需强制刷新缓存,可调用 `clearOsPlatformListCache()` 清除全部缓存,或传入指定 fetcher 清除对应缓存。
|
|
286
|
-
|
|
287
168
|
---
|
|
288
169
|
|
|
289
170
|
## 本地开发
|
|
@@ -304,7 +185,13 @@ yarn build
|
|
|
304
185
|
yarn test
|
|
305
186
|
```
|
|
306
187
|
|
|
307
|
-
|
|
188
|
+
## 发布流程
|
|
189
|
+
|
|
190
|
+
1. 推送代码到 `master` 分支
|
|
191
|
+
2. 触发 Coding 自动构建流程
|
|
192
|
+
3. 自动发布到 npm 制品库:[点击查看](https://ptc.coding.intlgame.com/p/player-network/artifacts/158595/npm/packages)
|
|
193
|
+
4. 自动发布组件文档到测试机
|
|
194
|
+
5. 组件文档预览:http://component.pnt-dev.intlgame.com/
|
|
308
195
|
|
|
309
196
|
## 技术栈
|
|
310
197
|
|