From de22605535065aa6de41bcecafbeaa6d46b7c289 Mon Sep 17 00:00:00 2001
From: biybuy <1368735060@qq.com>
Date: Mon, 23 Mar 2026 18:03:05 +0800
Subject: [PATCH] 2026032301
---
.eslintrc-auto-import.json | 1 +
...¾计20260316.md => oms表结构与接口设计20260323.md} | 68 --
docs/前端页面设计规范.md | 66 +-
src/auto-imports.d.ts | 2 +
src/components/HandsontablePro/index.vue | 54 +-
src/components/PaginationPro/index.vue | 4 +-
src/layout/default-layout.vue | 3 +
src/layout/page-layout.vue | 2 +-
src/locale/en-US.ts | 10 +
src/locale/zh-CN.ts | 10 +
src/views/api/callStatistics/index.vue | 235 ++++---
src/views/api/requestLog/index.vue | 3 +-
src/views/channel/autoTrigger/index.vue | 598 +++++++++++++-----
src/views/channel/labelDesign/index.vue | 72 ++-
src/views/operation/inboundScan/index.vue | 36 +-
src/views/operation/outboundScan/index.vue | 35 +-
src/views/operation/printLabel/index.vue | 35 +-
src/views/order/myOrders/index.vue | 35 +-
src/views/order/placeOrder/index.vue | 21 +-
src/views/order/priceCheck/index.vue | 27 +-
src/views/system/organization/index.vue | 30 +-
src/views/system/organization/user/index.vue | 21 +-
src/views/system/permission/menu/index.vue | 28 +-
src/views/system/permission/role/index.vue | 21 +-
src/views/system/warehouseAddress/index.vue | 25 +-
src/views/track/trackContent/index.vue | 25 +-
src/views/track/trackFlag/index.vue | 25 +-
src/views/track/trackOrder/index.vue | 22 +-
src/views/track/trackState/index.vue | 26 +-
src/views/user/customer/index.vue | 22 +-
src/views/user/recharge/rechargeRecord.vue | 22 +-
31 files changed, 1037 insertions(+), 547 deletions(-)
rename docs/{oms表结构与接口设计20260316.md => oms表结构与接口设计20260323.md} (98%)
diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json
index e61e6f3..d1576a3 100644
--- a/.eslintrc-auto-import.json
+++ b/.eslintrc-auto-import.json
@@ -262,6 +262,7 @@
"useSwipe": true,
"useSystemConfig": true,
"useTabBarStore": true,
+ "useTableContainerHeight": true,
"useTemplateRef": true,
"useTemplateRefsList": true,
"useTextDirection": true,
diff --git a/docs/oms表结构与接口设计20260316.md b/docs/oms表结构与接口设计20260323.md
similarity index 98%
rename from docs/oms表结构与接口设计20260316.md
rename to docs/oms表结构与接口设计20260323.md
index f5b3010..5c9ae60 100644
--- a/docs/oms表结构与接口设计20260316.md
+++ b/docs/oms表结构与接口设计20260323.md
@@ -43,74 +43,6 @@ OMS(Order Management System,订单管理系统)作为独立服务运行和
4. **出库扫描**:订单发货时完成**出库扫描**,进入待发货/运输中。
5. **闭环完成**:出库扫描完成后,订单进入运输、派送环节,正常订单流程闭环结束。
-----------------------------------------------------------------------------------------
-
-## 一、通用设计规范
-
-### 1.1 接口设计规范
-
-#### HTTP 方法约束(仅 POST / GET)
-
-| 方法 | 用途 | 说明 |
-| --- | --- | --- |
-| **GET** | 查询、详情、列表、导出 | 幂等、无副作用,参数放 Query String |
-| **POST** | 新增、修改、删除、状态变更、提交 | 所有变更类操作统一用 POST,参数放 Request Body |
-
-> 因网关/代理/防火墙限制,仅支持 GET/POST 时,更新、删除等操作均通过 POST + 业务动作区分。
-
-#### URL 设计规范
-
-| 规范 | 说明 | 示例 |
-| --- | --- | --- |
-| 路径小写 | 使用小写字母,短横线分隔 | `/api/order/list`、`/api/sales-product/detail` |
-| 资源名词 | URL 表示资源,不包含动词 | `/api/customer` 而非 `/api/getCustomer` |
-| 层级清晰 | 最多 3 级,避免过深 | `/api/channel/sales-product/price/list` |
-| 动作后缀 | POST 动作可用动词后缀 | `/api/order/delete`、`/api/recharge/approve` |
-
-#### 统一响应格式
-
-```json
-{
- "code": 0, // 0-成功,非0-业务错误码
- "msg": "success", // 提示信息
- "data": { } // 业务数据,可为 null
-}
-```
-
-#### 分页规范
-
-**请求**:`page`(页码,从 1 开始)、`pageSize`(每页条数,默认 20,最大 100)
-
-**响应**:
-
-```json
-{
- "code": 0, // 0-成功,非0-业务错误码
- "msg": "success", // 提示信息
- "data": {
- "items": [], // 数据列表
- "total": 100 // 总条数
- }
-}
-```
-
-#### 错误码规范
-
-| 错误码 | 说明 |
-| --- | --- |
-| 0 | 成功 |
-| 401 | 未登录 |
-| 403 | 无权限 |
-| 400 | 参数错误 |
-| 500 | 服务器内部错误 |
-| 1xxxx | 业务错误码(按模块划分) |
-
-#### 其他规范
-
-- **Content-Type**:`application/json`;文件上传用 `multipart/form-data`
-- **时间格式**:`yyyy-MM-dd HH:mm:ss` 或 ISO 8601
-- **认证**:`Authorization: Bearer {token}` 或 Cookie
-- **幂等**:涉及金额、库存等变更的接口需支持幂等(如传 `requestId`)
----------------------------------------------------------------------------------------
diff --git a/docs/前端页面设计规范.md b/docs/前端页面设计规范.md
index a747a96..c70aecd 100644
--- a/docs/前端页面设计规范.md
+++ b/docs/前端页面设计规范.md
@@ -81,6 +81,57 @@ a-layout (垂直)
@screen-xxl: 1600px; // 超大屏
```
+### 2.5 页面壳、白卡片与列表区尺寸(列表 / Handsontable 类页面)
+
+以下约定与 `default-layout` + `page-layout`、`*-container` / `*-page` 等实现一致,避免「灰底大块留白、列表高度塌缩、内外边距叠成 32px/40px」等问题。
+
+#### 2.5.1 页面层(灰底壳)
+
+| 项目 | 约定 |
+|------|------|
+| 背景色 | `#f0f3f4`(与布局主内容区一致) |
+| 页面根容器 padding | **`16px 16px 24px`**:上/左/右 **16px**,**底 24px** —— 与视口底边留白,列表区随 flex 撑满后,整块内容与屏幕底边保持 **24px** 间距 |
+| 参与主内容区高度 | `flex: 1; min-height: 0; display: flex; flex-direction: column;`,与 `PageLayout` 子节点 flex 链衔接 |
+| 纵向滚动 | 页面根容器宜 `overflow-y: hidden`(或仅最外层允许滚动),**表格/Handsontable 在内部 `.list-wrap` / `.wtHolder` 滚动**,避免整页与表格双滚动条 |
+
+#### 2.5.2 白卡片(白色内容块)
+
+| 项目 | 约定 |
+|------|------|
+| 视觉 | 背景 `#fff`,`border-radius: 8px`,`box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08)`(可按页面微调透明度) |
+| 撑满剩余高度 | `flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden` |
+| 内边距(与列表区配合) | **二选一,避免与 `.list-wrap` 重复叠加**:
• **推荐**:白卡片 **`padding: 0`**,由 **页头/搜索行、`.table-toolbar`、`.list-wrap`** 分区控制留白(见下);
• **简化页**:白卡片统一 `padding: 16px`,则内部列表区不再重复加左右底 padding |
+
+#### 2.5.3 表格工具栏(`.table-toolbar`)
+
+| 项目 | 约定 |
+|------|------|
+| 与列表横向对齐 | `padding: 16px 16px 0`(上 16、左右 16,底由与列表的间距承担) |
+| 与分页/标题间距 | `margin-bottom: 16px`(分页组件(`PaginationPro`)与列表区 `.list-wrap` 的固定间距) |
+| 收缩 | `flex-shrink: 0` |
+
+分页组件放置约束:`PaginationPro` 放在 `.toolbar-right` 内,并与 `toolbar-left` 保持在同一行(同一个 `flex` 行中)展示;工具栏外层使用 `padding: 16px 16px 0` 以保证分页组件距上边/右边均为 16px,且不需要在 `PaginationPro` 外再额外套一层 padding。
+
+有**独立搜索行**(如轨迹配置页)时:搜索框可用 `margin: 16px 16px 16px`,与工具栏、列表区 **左右 16px** 对齐。
+
+#### 2.5.4 列表区(`.list-wrap`)
+
+用于包裹 **HandsontablePro** 或需 **固定测量高度** 的表格容器(配合 `useTableContainerHeight` 的 `tableContainerRef` **挂在本层**)。
+
+| 项目 | 约定 |
+|------|------|
+| 与内容区四边距离 | **默认**:`padding: 16px`(上、右、下、左均为 **16px**,相对**白卡片内容边缘**或分区后的可用区域,勿与白卡片 padding 重复叠加)。
**与 `.list-toolbar` 联用**:当 `.list-toolbar` 使用 `margin-bottom: 16px` 作为“分页组件到列表”的固定间距时,为避免重复留白,建议 `.list-wrap` 使用 `padding: 0 16px 16px`(上 0、左右/下 16)。 |
+| 布局 | `flex: 1; min-height: 0; width: 100%; box-sizing: border-box; overflow: hidden; display: flex; flex-direction: column` |
+| 触摸/滚动冒泡 | 可选:`overscroll-behavior: contain; touch-action: pan-x pan-y` |
+| 子级 Handsontable | 建议 `:deep(.handsontable-pro-container) { flex: 1; min-height: 0; display: flex; flex-direction: column; }`,保证纵向撑满 |
+
+分页组件同一行约束(列表工具栏场景):当页面存在 `.list-toolbar` / `table-toolbar` 时,`PaginationPro` 必须放在右侧同一行的工具栏区域(如 `.toolbar-right`),不要将分页组件单独再做成一行(避免“工具栏一行 + 分页下一行”的不一致布局)。
+
+#### 2.5.5 与布局组件的关系
+
+- `PageLayout` 下直接子节点(路由页根)需能被主内容区赋予高度:项目中通过 `flex: 1; min-height: 0` 等与 `a-layout-content` 链式配合。
+- `default-layout` 中对 `[class$='-container']` 的样式仅作用于布局模板内节点;**业务页根类名**(如 `xxx-page`、`track-order-container`)需在**页面自身样式**中按上表补齐 flex 与 padding。
+
---
## 三、色彩规范
@@ -426,8 +477,11 @@ const { t } = useI18n();
### 13.2 容器类
-- 页面根容器:`xxx-container`(如 `role-page`、业务相关命名),保证 `padding: 16px`
-- 表格工具栏:`table-toolbar`、`toolbar-left`、`toolbar-right`
+- 页面根容器:`xxx-container` / `xxx-page`(如 `role-page`、`track-order-container`),**列表类页面**推荐 `padding: 16px 16px 24px`,详见 **§2.5 页面壳、白卡片与列表区尺寸**
+- 白卡片:`*-page-card`、`*-section` 等,与 `.list-wrap` 的 padding **勿重复叠加**
+- 列表区:`.list-wrap`,**四边 16px**(相对分区后的内容边缘)
+- 表格工具栏:`table-toolbar`、`toolbar-left`、`toolbar-right`,工具栏 **`padding: 16px 16px 0`** 与列表对齐
+- Handsontable/列表分页工具栏:`.list-toolbar`(当页面没有标准 `table-toolbar` 时),与 `table-toolbar` 保持一致,使用 **`padding: 16px 16px 0`** 且 `margin-bottom: 16px`;`PaginationPro` 必须与 `toolbar-left` 同一行展示(放在 `.toolbar-right` 内,禁止分页另起行),同时 `.list-wrap` 在联用场景建议 `padding-top: 0`(例如 `padding: 0 16px 16px`),实现分页距上/右 16px、距列表 16px
### 13.3 按钮间距
@@ -438,8 +492,10 @@ const { t } = useI18n();
## 十四、检查清单(新页面开发)
-- [ ] 使用 `xxx-container` 或等效布局结构
-- [ ] 工具栏使用 `table-toolbar`、`toolbar-left`、`toolbar-right`
+- [ ] 使用 `xxx-container` / `xxx-page` 或等效布局结构;列表页见 **§2.5**:灰底 **`padding: 16px 16px 24px`**、`flex: 1; min-height: 0`
+- [ ] 白卡片与 **`.list-wrap`** 内边距勿重复叠加(推荐白卡片 `padding: 0` + 分区 padding)
+- [ ] **`.list-wrap`**:`padding: 16px`、`flex: 1; min-height: 0`;需测高时 `ref` 挂在本层
+- [ ] 工具栏使用 `table-toolbar`、`toolbar-left`、`toolbar-right`,工具栏 **`padding: 16px 16px 0`**
- [ ] 按钮、输入框符合全局样式(高度、圆角)
- [ ] 使用主题色变量,不硬编码 `#2D8C8C`
- [ ] 弹窗 / 抽屉使用 ModalPro / DrawerPro + useModal
@@ -517,4 +573,4 @@ const { t } = useI18n();
---
-*文档版本:1.0 | 更新日期:2025-03-21*
+*文档版本:1.1 | 更新日期:2026-03-23*
diff --git a/src/auto-imports.d.ts b/src/auto-imports.d.ts
index f7733e0..f3da9d6 100644
--- a/src/auto-imports.d.ts
+++ b/src/auto-imports.d.ts
@@ -251,6 +251,7 @@ declare global {
const useSwipe: typeof import('@vueuse/core')['useSwipe']
const useSystemConfig: typeof import('./composables/useSystemConfig')['useSystemConfig']
const useTabBarStore: typeof import('./store/index')['useTabBarStore']
+ const useTableContainerHeight: typeof import('./composables/useTableContainerHeight')['useTableContainerHeight']
const useTemplateRef: typeof import('vue')['useTemplateRef']
const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList']
const useTextDirection: typeof import('@vueuse/core')['useTextDirection']
@@ -561,6 +562,7 @@ declare module 'vue' {
readonly useSwipe: UnwrapRef
readonly useSystemConfig: UnwrapRef
readonly useTabBarStore: UnwrapRef
+ readonly useTableContainerHeight: UnwrapRef
readonly useTemplateRef: UnwrapRef
readonly useTemplateRefsList: UnwrapRef
readonly useTextDirection: UnwrapRef
diff --git a/src/components/HandsontablePro/index.vue b/src/components/HandsontablePro/index.vue
index 41b1c30..3a46756 100644
--- a/src/components/HandsontablePro/index.vue
+++ b/src/components/HandsontablePro/index.vue
@@ -58,6 +58,10 @@
showCheckboxColumn?: boolean;
// 复选框列表头文案(空则表头为空)
checkboxColumnHeader?: string;
+ // 序号列表头文案
+ serialNoHeader?: string;
+ // 操作列表头文案
+ actionColumnHeader?: string;
// 复选框变化回调
onCheckboxChange?: (row: any, checked: boolean, rowIndex: number) => void;
// 操作列渲染器
@@ -105,6 +109,8 @@
actionColumnWidth: 60,
showCheckboxColumn: false,
checkboxColumnHeader: '',
+ serialNoHeader: '序号',
+ actionColumnHeader: '操作',
readOnly: true,
multiValueFields: () => [],
height: undefined,
@@ -176,16 +182,23 @@
// 计算表格高度
const calculatedHeight = computed(() => {
- if (props.height) {
+ if (props.height != null && props.height > 0) {
return props.height;
}
const headerHeight = 40;
const rowHeight = 50;
const maxRows = 20;
- const minHeight = 1000;
+ const minHeight = 400;
return Math.max(headerHeight + maxRows * rowHeight, minHeight);
});
+ /** 外部传入 height 为 0 时不能用 ?? 回退(0 非 nullish),需显式判断 */
+ const resolveTableHeight = (containerH: number): number => {
+ if (props.height != null && props.height > 0) return props.height;
+ if (containerH > 0) return containerH;
+ return calculatedHeight.value;
+ };
+
// 创建省略号渲染器
const createEllipsisRenderer = () => {
return function(instance: any, td: any, row: number, col: number, prop: any, value: any) {
@@ -241,7 +254,7 @@
// 操作列(在前面)
if (props.showActionColumn && props.actionColumnPosition === 'start') {
columns.push({ data: currentDataIndex, type: 'text', readOnly: true, width: props.actionColumnWidth, className: 'htCenter', headerClassName: 'htLeft' });
- headerTexts.push('操作');
+ headerTexts.push(props.actionColumnHeader);
currentDataIndex++;
}
@@ -255,7 +268,7 @@
headerClassName: 'htLeft',
renderer: ellipsisRenderer
});
- headerTexts.push('序号');
+ headerTexts.push(props.serialNoHeader);
currentDataIndex++;
// 数据列(beforeLast 时最后一列在操作列之后)
@@ -264,7 +277,7 @@
// beforeLast:在倒数第二列后插入操作列
if (props.showActionColumn && props.actionColumnPosition === 'beforeLast' && index === dataColCount - 1) {
columns.push({ data: currentDataIndex, type: 'text', readOnly: true, width: props.actionColumnWidth, className: 'htCenter', headerClassName: 'htLeft' });
- headerTexts.push('操作');
+ headerTexts.push(props.actionColumnHeader);
currentDataIndex++;
}
columns.push({
@@ -282,7 +295,7 @@
// 操作列(在后面,非 beforeLast 时)
if (props.showActionColumn && props.actionColumnPosition === 'end') {
columns.push({ data: currentDataIndex, type: 'text', readOnly: true, width: props.actionColumnWidth, className: 'htCenter', headerClassName: 'htLeft' });
- headerTexts.push('操作');
+ headerTexts.push(props.actionColumnHeader);
currentDataIndex++;
}
@@ -343,7 +356,7 @@
try {
// 未传 height 时使用容器实际高度,使列表高度与容器一致
const containerH = containerRef.value?.clientHeight ?? 0;
- const tableHeight = props.height ?? (containerH > 0 ? containerH : calculatedHeight.value);
+ const tableHeight = resolveTableHeight(containerH);
const hotConfig: any = {
data: data,
@@ -511,7 +524,7 @@
// 操作列、序号列:用极简表头替换,去除 div.relative/span.colHeader 等多余容器,确保 60px 下完整显示
if (col === actionColStartIndex || col === serialColIndex || col === actionColEndIndex) {
- const label = col === serialColIndex ? '序号' : '操作';
+ const label = col === serialColIndex ? props.serialNoHeader : props.actionColumnHeader;
TH.innerHTML = '';
TH.classList.add('ht-header-simple');
const span = document.createElement('span');
@@ -1069,17 +1082,12 @@
}, 50);
};
- // 初始化完成后再次刷新尺寸
+ // 初始化完成后刷新尺寸(避免与 ResizeObserver 重复狂刷导致 stretchH 列宽错乱)
const finalizeInit = () => {
setTimeout(() => {
if (hotInstance) {
hotInstance.refreshDimensions();
-
- setTimeout(() => {
- if (hotInstance) {
- hotInstance.refreshDimensions();
- }
- }, 100);
+ setTimeout(() => hotInstance?.refreshDimensions(), 100);
}
}, 300);
};
@@ -1193,13 +1201,15 @@
if (!containerRef.value) return;
resizeObserver = new ResizeObserver((entries) => {
const entry = entries[0];
- if (entry && hotInstance && entry.contentRect.height > 0) {
- const h = Math.floor(entry.contentRect.height);
- hotInstance.updateSettings({ height: h });
- nextTick(() => {
- hotInstance?.refreshDimensions();
- });
- }
+ if (!entry || !hotInstance) return;
+ const h = entry.contentRect.height;
+ // 高度以本组件根容器实测为准;勿用外层 props.height 覆盖,否则与 flex 内真实高度不一致,stretchH 会把列压满导致横向条消失
+ if (h <= 0) return;
+ const fh = Math.floor(h);
+ hotInstance.updateSettings({ height: fh });
+ nextTick(() => {
+ hotInstance?.refreshDimensions();
+ });
});
resizeObserver.observe(containerRef.value);
};
diff --git a/src/components/PaginationPro/index.vue b/src/components/PaginationPro/index.vue
index d67d03a..93def03 100644
--- a/src/components/PaginationPro/index.vue
+++ b/src/components/PaginationPro/index.vue
@@ -80,7 +80,7 @@
:model-value="props.pageSize"
size="small"
class="page-size-select"
- :style="{ width: '110px' }"
+ :style="{ width: '85px' }"
@update:model-value="handlePageSizeChange"
>
{{ t('common.pagination.page') }}
diff --git a/src/layout/default-layout.vue b/src/layout/default-layout.vue
index 6206a7a..93e2fd7 100644
--- a/src/layout/default-layout.vue
+++ b/src/layout/default-layout.vue
@@ -52,6 +52,9 @@
padding: 16px;
width: 100%;
height: 100%;
+ box-sizing: border-box;
+ min-height: 0;
+ max-width: 100%;
}
.layout {
diff --git a/src/layout/page-layout.vue b/src/layout/page-layout.vue
index 694d50d..6fddaf9 100644
--- a/src/layout/page-layout.vue
+++ b/src/layout/page-layout.vue
@@ -35,7 +35,7 @@
flex-direction: column;
}
- .page-layout-root > * {
+ .page-layout-root :deep(> *) {
flex: 1;
min-height: 0;
}
diff --git a/src/locale/en-US.ts b/src/locale/en-US.ts
index 12dcb1e..8bc0c3e 100644
--- a/src/locale/en-US.ts
+++ b/src/locale/en-US.ts
@@ -109,6 +109,16 @@ export default {
'menu.api.apiDebugger': 'API Debugger',
'menu.api.apiLike': 'API LIKE',
'menu.api.apiTest': 'API Test',
+
+ // API - Call Statistics
+ 'api.callStatistics.name.app': 'Application Name',
+ 'api.callStatistics.name.provider': 'Service Provider Name',
+ 'api.callStatistics.table.date': 'Date',
+ 'api.callStatistics.table.interfaceName': 'Interface Name',
+ 'api.callStatistics.table.total': 'Total Calls',
+ 'api.callStatistics.table.succeedCount': 'Successful Calls',
+ 'api.callStatistics.table.failCount': 'Failed Calls',
+ 'api.callStatistics.table.successRate': 'Success Rate',
'menu.system': 'System',
'menu.system.org': 'Organization',
'menu.system.organization': 'Organization',
diff --git a/src/locale/zh-CN.ts b/src/locale/zh-CN.ts
index f7749d5..32dbef3 100644
--- a/src/locale/zh-CN.ts
+++ b/src/locale/zh-CN.ts
@@ -109,6 +109,16 @@ export default {
'menu.api.apiDebugger': 'API调试',
'menu.api.apiLike': 'API LIKE',
'menu.api.apiTest': 'API测试',
+
+ // API - 调用统计
+ 'api.callStatistics.name.app': '应用名称',
+ 'api.callStatistics.name.provider': '服务商名称',
+ 'api.callStatistics.table.date': '日期',
+ 'api.callStatistics.table.interfaceName': '接口名称',
+ 'api.callStatistics.table.total': '总调用次数',
+ 'api.callStatistics.table.succeedCount': '成功调用次数',
+ 'api.callStatistics.table.failCount': '失败调用次数',
+ 'api.callStatistics.table.successRate': '成功率',
'menu.system': '系统',
'menu.system.org': '组织管理',
'menu.system.organization': '组织管理',
diff --git a/src/views/api/callStatistics/index.vue b/src/views/api/callStatistics/index.vue
index 7a409f9..b4ffaf6 100644
--- a/src/views/api/callStatistics/index.vue
+++ b/src/views/api/callStatistics/index.vue
@@ -6,14 +6,16 @@
import HandsontablePro from '@/components/HandsontablePro/index.vue';
import PaginationPro from '@/components/PaginationPro/index.vue';
import { useTableContainerHeight } from '@/composables/useTableContainerHeight';
+ import { useI18n } from 'vue-i18n';
defineOptions({ name: 'CallStatistics' });
+ const { t } = useI18n();
const activeName = ref('1'); // 1:应用,2:服务商
const { tableContainerRef, tableHeight } = useTableContainerHeight();
const tabList = [
- { key: '1', label: '应用' },
- { key: '2', label: '服务商' },
+ { key: '1', label: t('system.log.options.app') },
+ { key: '2', label: t('system.log.options.provider') },
];
const tableData = ref([]);
@@ -30,16 +32,16 @@
});
const typeParam = computed(() => (activeName.value === '2' ? 2 : 1));
- const nameLabel = computed(() => (activeName.value === '2' ? '服务商名称' : '应用名称'));
+ const nameLabel = computed(() => (activeName.value === '2' ? t('api.callStatistics.name.provider') : t('api.callStatistics.name.app')));
const columns = computed(() => [
- { key: 'date', label: '日期', width: 120, searchable: false },
+ { key: 'date', label: t('api.callStatistics.table.date'), width: 120, searchable: false },
{ key: 'name', label: nameLabel.value, width: 180, searchable: true, searchField: 'name' },
- { key: 'interfaceName', label: '接口名称', width: 180, searchable: true, searchField: 'interfaceName' },
- { key: 'total', label: '总调用次数', width: 120, searchable: false },
- { key: 'succeedCount', label: '成功调用次数', width: 140, searchable: false },
- { key: 'failCount', label: '失败调用次数', width: 140, searchable: false },
- { key: 'successRate', label: '成功率', width: 100, searchable: false },
+ { key: 'interfaceName', label: t('api.callStatistics.table.interfaceName'), width: 180, searchable: true, searchField: 'interfaceName' },
+ { key: 'total', label: t('api.callStatistics.table.total'), width: 120, searchable: false },
+ { key: 'succeedCount', label: t('api.callStatistics.table.succeedCount'), width: 140, searchable: false },
+ { key: 'failCount', label: t('api.callStatistics.table.failCount'), width: 140, searchable: false },
+ { key: 'successRate', label: t('api.callStatistics.table.successRate'), width: 100, searchable: false },
]);
const processedTableData = computed(() =>
@@ -121,105 +123,122 @@
-