@pnt-team/pnt-component-frontend 0.0.40 → 0.0.43

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.
Files changed (2) hide show
  1. package/README.md +70 -183
  2. 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
- // Hooks
32
- usePagination,
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
- 统一处理和展示高敏信息,支持脱敏显示和按需获取真实数据。内部集成 `useHighSecurity` Hook,通过接口解锁敏感数据。
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
- #### useHighSecurity — 高敏数据解锁 Hook
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
- 拉取 OS 与平台枚举数据并做模块级缓存,整个会话只请求一次,并发调用共享同一请求。
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
- | `osPlatformList` | `{ os_list: OsItem[]; platform_list: PlatformItem[] } \| undefined` | OS/平台数据 |
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
- // 使用默认 fetcher
271
- const { osPlatformList } = useOsPlatformList();
272
-
273
- // 注入自定义 fetcher
274
- const { osPlatformList } = useOsPlatformList(() => http.get('/my/os/platform'));
275
-
276
- // 渲染下拉选项
277
- <Select
278
- options={osPlatformList?.platform_list.map((p) => ({
279
- label: p.platform_name_zh,
280
- value: p.id,
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
- > 📝 本地开发涉及接口调试时,需手动更新 `src/configs/token.ts` 中的 token 值。
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pnt-team/pnt-component-frontend",
3
- "version": "0.0.40",
3
+ "version": "0.0.43",
4
4
  "description": "A react library developed with dumi",
5
5
  "license": "MIT",
6
6
  "exports": {