Explorar el Código

feat(machine): enhance machine list API and improve UI localization

- Updated the `listMachines` function to accept pagination parameters for better data handling.
- Added new styles for button hover effects and link buttons in the SCSS file to improve UI consistency.
- Expanded English and Chinese localization files with new keys and translations for machine management features, enhancing user experience.
- Adjusted the machine index view to utilize localized labels for better internationalization support.
- Improved pagination handling in the machine list component for a more responsive user interface.
yb hace 2 semanas
padre
commit
bd759c947d
Se han modificado 5 ficheros con 341 adiciones y 248 borrados
  1. 2 2
      src/api/machine.ts
  2. 55 2
      src/assets/styles/theme/element-override.scss
  3. 136 116
      src/locales/en.json
  4. 135 115
      src/locales/zh-cn.json
  5. 13 13
      src/views/machine/index.vue

+ 2 - 2
src/api/machine.ts

@@ -9,8 +9,8 @@ import type {
 } from '@/types'
 
 // 获取机器列表
-export function listMachines(): Promise<IResponse<MachineDTO>> {
-  return get('/admin/machines/list')
+export function listMachines(params?: { page?: number; pageSize?: number }): Promise<IResponse<MachineDTO>> {
+  return get('/admin/machines/list', params)
 }
 
 // 获取机器详情

+ 55 - 2
src/assets/styles/theme/element-override.scss

@@ -36,10 +36,63 @@
   --el-button-active-border-color: var(--color-primary-dark-2);
 }
 
-// 链接
+// Default 按钮 hover - 单色系配色(排除其他类型按钮)
+.el-button--default:not(.is-disabled):not(.el-button--primary):not(.el-button--danger):not(.el-button--success):not(.el-button--warning):not(.el-button--info) {
+  &:hover,
+  &:focus {
+    --el-button-hover-bg-color: var(--color-primary-light-9);
+    --el-button-hover-text-color: var(--color-primary);
+    --el-button-hover-border-color: var(--color-primary-light-5);
+    color: var(--color-primary);
+    border-color: var(--color-primary-light-5);
+    background-color: var(--color-primary-light-9);
+  }
+}
+
+// 链接 - 单色系配色
 .el-link--primary {
   --el-link-text-color: var(--color-primary);
-  --el-link-hover-text-color: var(--color-primary-light-3);
+  --el-link-hover-text-color: var(--color-primary-dark-2);
+}
+
+// 链接按钮统一 hover 风格 - 颜色变亮 + 下划线
+.el-button.is-link:not(.is-disabled) {
+  &:hover,
+  &:focus {
+    text-decoration: underline;
+  }
+}
+
+// Primary 链接按钮
+.el-button--primary.is-link:not(.is-disabled) {
+  &:hover,
+  &:focus {
+    color: var(--color-primary-light-3);
+  }
+}
+
+// Danger 链接按钮
+.el-button--danger.is-link:not(.is-disabled) {
+  &:hover,
+  &:focus {
+    color: var(--color-danger-light);
+  }
+}
+
+// Success 链接按钮
+.el-button--success.is-link:not(.is-disabled) {
+  &:hover,
+  &:focus {
+    color: var(--color-success-light);
+  }
+}
+
+// Warning 链接按钮
+.el-button--warning.is-link:not(.is-disabled) {
+  &:hover,
+  &:focus {
+    color: var(--color-warning-light);
+  }
 }
 
 // 输入框

+ 136 - 116
src/locales/en.json

@@ -1,137 +1,157 @@
 {
-  "版本": "Version",
+  "Cloudflare Stream": "Cloudflare Stream",
+  "Cloudflare Stream 配置": "Cloudflare Stream Configuration",
+  "RTSP 地址": "RTSP URL",
+  "RTSP 流": "RTSP Stream",
+  "RTSP 流需要通过服务端转换为 HLS/WebRTC 后才能在浏览器播放": "RTSP streams need to be converted to HLS/WebRTC via server before playing in browser",
+  "Stream 测试": "Stream Test",
+  "Video ID": "Video ID",
+  "button.cancel": "",
+  "button.confirm": "",
+  "button.disable": "",
+  "button.edit": "",
+  "button.enable": "",
+  "button.selectedSsers": "",
+  "button.whether": "",
+  "errorCode.0": "",
+  "iframe 模式": "iframe Mode",
+  "input.SelectAll": "",
+  "login.confirmPassword": "",
+  "login.editpassWord": "",
+  "login.passWord": "",
+  "pop.ScanQRcode": "",
+  "pop.getsecretkey": "",
+  "pop.secretkey": "",
+  "pop.systemIdentity": "",
+  "table.accountNumber": "",
+  "table.mobilePhoneNumber": "",
+  "table.qrcode": "",
+  "两次输入的密码不一致": "The passwords entered twice do not match",
+  "事件日志": "Event Log",
+  "仅在前端直接调用 API 时需要(不推荐)": "Only needed when directly calling the API in the frontend (not recommended)",
+  "仪表盘": "Dashboard",
+  "位置": "Location",
   "保存配置": "Save Configuration",
-  "编辑": "Edit",
-  "编辑机器": "Edit Machine",
-  "播放": "Play",
-  "播放测试视频": "Play Test Video",
-  "播放方式": "Playback Method",
-  "播放器类型": "Player Type",
-  "播放域名的子域名部分": "The subdomain part of the playback domain",
-  "操作": "Actions",
-  "测试播放": "Test Playback",
-  "测试连接": "Test Connection",
-  "测试视频": "Test Video",
-  "查询": "Search",
-  "成功删除": "Successfully deleted",
+  "修改密码": "Change Password",
+  "修改成功": "Updated successfully",
+  "停止": "Stop",
+  "全屏": "Fullscreen",
   "创建时间": "Created At",
-  "当前状态": "Current Status",
-  "登录": "Sign In",
-  "登录成功": "Login successful",
-  "登录您的管理后台,开始管理您的业务": "Sign in to your admin console and start managing your business",
-  "登录失败": "Login failed",
-  "登录失败,请检查网络": "Login failed, please check your network",
-  "否": "No",
-  "复制": "Copy",
-  "观看统计": "Watching Statistics",
-  "欢迎回来": "Welcome Back",
-  "欢迎回来,这是您的数据概览": "Welcome back, here is your data overview",
-  "获取统计数据失败": "Failed to get statistics",
-  "机器管理": "Machine Management",
-  "机器总数": "Total Machines",
-  "机器ID": "Machine ID",
-  "记住我": "Remember me",
-  "技术支持": "Support",
-  "截图": "Screenshot",
-  "仅在前端直接调用 API 时需要(不推荐)": "Only needed when directly calling the API in the frontend (not recommended)",
-  "静音": "Muted",
+  "删除": "Delete",
+  "删除失败": "Delete failed",
+  "删除成功": "Deleted successfully",
+  "刷新数据": "Refresh",
+  "原密码": "Old Password",
+  "取消": "Cancel",
+  "取消选择": "Clear Selection",
   "可用通道数量": "Available channels",
-  "快捷操作": "Quick Actions",
-  "快速测试": "Quick Test",
-  "离线": "Offline",
-  "两次输入的密码不一致": "The passwords entered twice do not match",
+  "台机器": "machines",
+  "台机器吗?": "machines?",
+  "名称": "Name",
   "吗?": "?",
+  "否": "No",
+  "启用": "Enabled",
+  "启用状态": "Status",
+  "在线": "Online",
+  "复制": "Copy",
+  "如何获取 Customer Subdomain": "How to get Customer Subdomain",
   "密码": "Password",
   "密码长度不能少于6位": "Password length must be at least 6 characters",
-  "描述": "Description",
-  "名称": "Name",
-  "配置说明": "Configuration Description",
+  "已启用": "Enabled",
+  "已禁用": "Disabled",
+  "已选择": "Selected",
+  "序号": "No.",
+  "当前状态": "Current Status",
+  "忘记密码?": "Forgot password?",
+  "快捷操作": "Quick Actions",
+  "快速测试": "Quick Test",
+  "成功删除": "Successfully deleted",
+  "截图": "Screenshot",
+  "手动": "Manual",
   "批量删除": "Batch Delete",
   "批量删除失败": "Batch delete failed",
-  "启用": "Enabled",
-  "启用状态": "Status",
-  "清空": "Clear",
-  "请联系管理员重置密码": "Please contact the administrator to reset your password",
-  "请输入机器ID": "Please enter Machine ID",
-  "请输入密码": "Please enter password",
-  "请输入名称": "Please enter name",
-  "请输入视频地址并点击播放": "Please enter video URL and click play",
-  "请输入新密码": "Please enter the new password",
-  "请输入用户名": "Please enter username",
-  "请输入原密码": "Please enter the old password",
-  "请选择视频源并点击播放": "Please select video source and click play",
-  "请再次输入新密码": "Please enter the new password again",
-  "取消": "Cancel",
-  "取消选择": "Clear Selection",
-  "全屏": "Fullscreen",
-  "确定": "Confirm",
-  "确定要删除机器": "Are you sure you want to delete machine",
-  "确定要删除选中的": "Are you sure you want to delete the selected",
-  "确认密码": "Confirm Password",
-  "如何获取 Customer Subdomain": "How to get Customer Subdomain",
-  "删除": "Delete",
-  "删除成功": "Deleted successfully",
-  "删除失败": "Delete failed",
-  "摄像头管理": "Camera Management",
-  "摄像头管理系统": "Camera Management",
-  "摄像头数": "Cameras",
+  "技术支持": "Support",
+  "推荐通过后端代理调用,避免暴露 Token": "Recommended to call through the backend proxy to avoid exposing the Token",
+  "描述": "Description",
+  "提示": "Notice",
   "摄像头在线率": "Camera Online Rate",
   "摄像头总数": "Total Cameras",
-  "生成地址": "Generate URL",
-  "生成的地址": "Generated URL",
-  "事件日志": "Event Log",
-  "视频播放测试": "Video Playback Test",
-  "视频地址": "Video URL",
-  "是": "Yes",
-  "手动": "Manual",
+  "摄像头数": "Cameras",
+  "摄像头管理": "Camera Management",
+  "摄像头管理系统": "Camera Management",
+  "播放": "Play",
+  "播放器类型": "Player Type",
+  "播放域名的子域名部分": "The subdomain part of the playback domain",
+  "播放方式": "Playback Method",
+  "播放测试视频": "Play Test Video",
+  "操作": "Actions",
   "数据更新时间": "Last Updated",
-  "刷新数据": "Refresh",
-  "台机器": "machines",
-  "台机器吗?": "machines?",
-  "提示": "Notice",
-  "停止": "Stop",
-  "通道总数": "Total Channels",
-  "推荐通过后端代理调用,避免暴露 Token": "Recommended to call through the backend proxy to avoid exposing the Token",
-  "退出登录": "Logout",
-  "忘记密码?": "Forgot password?",
-  "位置": "Location",
-  "稳定性": "Uptime",
-  "系统信息": "System Info",
-  "系统运行正常": "System running normally",
-  "系统状态": "System Status",
-  "项": "items",
-  "新建标签": "New Tab",
-  "新密码": "New Password",
   "新增": "Add",
   "新增成功": "Added successfully",
   "新增机器": "Add Machine",
-  "修改成功": "Updated successfully",
-  "修改密码": "Change Password",
-  "选择测试源": "Select Test Source",
-  "仪表盘": "Dashboard",
-  "已禁用": "Disabled",
-  "已启用": "Enabled",
-  "已选择": "Selected",
-  "用户": "Users",
-  "用户名": "Username",
-  "有声": "Sound",
-  "原密码": "Old Password",
-  "在线": "Online",
+  "新密码": "New Password",
+  "新建标签": "New Tab",
+  "是": "Yes",
   "暂停": "Pause",
   "暂无日志": "No logs",
+  "有声": "Sound",
+  "机器ID": "Machine ID",
+  "机器总数": "Total Machines",
+  "机器管理": "Machine Management",
+  "查询": "Search",
+  "欢迎回来": "Welcome Back",
+  "欢迎回来,这是您的数据概览": "Welcome back, here is your data overview",
   "正常": "Normal",
+  "测试播放": "Test Playback",
+  "测试视频": "Test Video",
+  "测试连接": "Test Connection",
+  "清空": "Clear",
+  "版本": "Version",
+  "生成地址": "Generate URL",
+  "生成的地址": "Generated URL",
+  "用户": "Users",
+  "用户名": "Username",
+  "登录": "Sign In",
+  "登录失败": "Login failed",
+  "登录失败,请检查网络": "Login failed, please check your network",
+  "登录您的管理后台,开始管理您的业务": "Sign in to your admin console and start managing your business",
+  "登录成功": "Login successful",
   "直接 URL": "Direct URL",
   "直接 URL 播放": "Direct URL Playback",
-  "重置": "Reset",
-  "转换服务地址": "Proxy Service URL",
-  "自定义域名": "Custom Domain",
+  "确定": "Confirm",
+  "确定要删除机器": "Are you sure you want to delete machine",
+  "确定要删除选中的": "Are you sure you want to delete the selected",
+  "确认密码": "Confirm Password",
+  "离线": "Offline",
+  "稳定性": "Uptime",
+  "系统信息": "System Info",
+  "系统状态": "System Status",
+  "系统运行正常": "System running normally",
+  "编辑": "Edit",
+  "编辑机器": "Edit Machine",
   "自动播放": "Autoplay",
-  "Cloudflare Stream": "Cloudflare Stream",
-  "Cloudflare Stream 配置": "Cloudflare Stream Configuration",
-  "iframe 模式": "iframe Mode",
-  "RTSP 地址": "RTSP URL",
-  "RTSP 流": "RTSP Stream",
-  "RTSP 流需要通过服务端转换为 HLS/WebRTC 后才能在浏览器播放": "RTSP streams need to be converted to HLS/WebRTC via server before playing in browser",
-  "Stream 测试": "Stream Test",
-  "Video ID": "Video ID"
-}
+  "自定义域名": "Custom Domain",
+  "获取统计数据失败": "Failed to get statistics",
+  "观看统计": "Watching Statistics",
+  "视频地址": "Video URL",
+  "视频播放测试": "Video Playback Test",
+  "记住我": "Remember me",
+  "请再次输入新密码": "Please enter the new password again",
+  "请联系管理员重置密码": "Please contact the administrator to reset your password",
+  "请输入原密码": "Please enter the old password",
+  "请输入名称": "Please enter name",
+  "请输入密码": "Please enter password",
+  "请输入新密码": "Please enter the new password",
+  "请输入机器ID": "Please enter Machine ID",
+  "请输入用户名": "Please enter username",
+  "请输入视频地址并点击播放": "Please enter video URL and click play",
+  "请选择视频源并点击播放": "Please select video source and click play",
+  "转换服务地址": "Proxy Service URL",
+  "退出登录": "Logout",
+  "选择测试源": "Select Test Source",
+  "通道总数": "Total Channels",
+  "配置说明": "Configuration Description",
+  "重置": "Reset",
+  "静音": "Muted",
+  "项": "items"
+}

+ 135 - 115
src/locales/zh-cn.json

@@ -1,137 +1,157 @@
 {
-  "版本": "版本",
+  "Cloudflare Stream": "Cloudflare Stream",
+  "Cloudflare Stream 配置": "Cloudflare Stream 配置",
+  "RTSP 地址": "RTSP 地址",
+  "RTSP 流": "RTSP 流",
+  "RTSP 流需要通过服务端转换为 HLS/WebRTC 后才能在浏览器播放": "RTSP 流需要通过服务端转换为 HLS/WebRTC 后才能在浏览器播放",
+  "Stream 测试": "Stream 测试",
+  "Video ID": "Video ID",
+  "button.cancel": "button.cancel",
+  "button.confirm": "button.confirm",
+  "button.disable": "button.disable",
+  "button.edit": "button.edit",
+  "button.enable": "button.enable",
+  "button.selectedSsers": "button.selectedSsers",
+  "button.whether": "button.whether",
+  "errorCode.0": "errorCode.0",
+  "iframe 模式": "iframe 模式",
+  "input.SelectAll": "input.SelectAll",
+  "login.confirmPassword": "login.confirmPassword",
+  "login.editpassWord": "login.editpassWord",
+  "login.passWord": "login.passWord",
+  "pop.ScanQRcode": "pop.ScanQRcode",
+  "pop.getsecretkey": "pop.getsecretkey",
+  "pop.secretkey": "pop.secretkey",
+  "pop.systemIdentity": "pop.systemIdentity",
+  "table.accountNumber": "table.accountNumber",
+  "table.mobilePhoneNumber": "table.mobilePhoneNumber",
+  "table.qrcode": "table.qrcode",
+  "两次输入的密码不一致": "两次输入的密码不一致",
+  "事件日志": "事件日志",
+  "仅在前端直接调用 API 时需要(不推荐)": "仅在前端直接调用 API 时需要(不推荐)",
+  "仪表盘": "仪表盘",
+  "位置": "位置",
   "保存配置": "保存配置",
-  "编辑": "编辑",
-  "编辑机器": "编辑机器",
-  "播放": "播放",
-  "播放测试视频": "播放测试视频",
-  "播放方式": "播放方式",
-  "播放器类型": "播放器类型",
-  "播放域名的子域名部分": "播放域名的子域名部分",
-  "操作": "操作",
-  "测试播放": "测试播放",
-  "测试连接": "测试连接",
-  "测试视频": "测试视频",
-  "查询": "查询",
-  "成功删除": "成功删除",
+  "修改密码": "修改密码",
+  "修改成功": "修改成功",
+  "停止": "停止",
+  "全屏": "全屏",
   "创建时间": "创建时间",
-  "当前状态": "当前状态",
-  "登录": "登录",
-  "登录成功": "登录成功",
-  "登录您的管理后台,开始管理您的业务": "登录您的管理后台,开始管理您的业务",
-  "登录失败": "登录失败",
-  "登录失败,请检查网络": "登录失败,请检查网络",
-  "否": "否",
-  "复制": "复制",
-  "观看统计": "观看统计",
-  "欢迎回来": "欢迎回来",
-  "欢迎回来,这是您的数据概览": "欢迎回来,这是您的数据概览",
-  "获取统计数据失败": "获取统计数据失败",
-  "机器管理": "机器管理",
-  "机器总数": "机器总数",
-  "机器ID": "机器ID",
-  "记住我": "记住我",
-  "技术支持": "技术支持",
-  "截图": "截图",
-  "仅在前端直接调用 API 时需要(不推荐)": "仅在前端直接调用 API 时需要(不推荐)",
-  "静音": "静音",
+  "删除": "删除",
+  "删除失败": "删除失败",
+  "删除成功": "删除成功",
+  "刷新数据": "刷新数据",
+  "原密码": "原密码",
+  "取消": "取消",
+  "取消选择": "取消选择",
   "可用通道数量": "可用通道数量",
-  "快捷操作": "快捷操作",
-  "快速测试": "快速测试",
-  "离线": "离线",
-  "两次输入的密码不一致": "两次输入的密码不一致",
+  "台机器": "台机器",
+  "台机器吗?": "台机器吗?",
+  "名称": "名称",
   "吗?": "吗?",
+  "否": "否",
+  "启用": "启用",
+  "启用状态": "启用状态",
+  "在线": "在线",
+  "复制": "复制",
+  "如何获取 Customer Subdomain": "如何获取 Customer Subdomain",
   "密码": "密码",
   "密码长度不能少于6位": "密码长度不能少于6位",
-  "描述": "描述",
-  "名称": "名称",
-  "配置说明": "配置说明",
+  "已启用": "已启用",
+  "已禁用": "已禁用",
+  "已选择": "已选择",
+  "序号": "序号",
+  "当前状态": "当前状态",
+  "忘记密码?": "忘记密码?",
+  "快捷操作": "快捷操作",
+  "快速测试": "快速测试",
+  "成功删除": "成功删除",
+  "截图": "截图",
+  "手动": "手动",
   "批量删除": "批量删除",
   "批量删除失败": "批量删除失败",
-  "启用": "启用",
-  "启用状态": "启用状态",
-  "清空": "清空",
-  "请联系管理员重置密码": "请联系管理员重置密码",
-  "请输入机器ID": "请输入机器ID",
-  "请输入密码": "请输入密码",
-  "请输入名称": "请输入名称",
-  "请输入视频地址并点击播放": "请输入视频地址并点击播放",
-  "请输入新密码": "请输入新密码",
-  "请输入用户名": "请输入用户名",
-  "请输入原密码": "请输入原密码",
-  "请选择视频源并点击播放": "请选择视频源并点击播放",
-  "请再次输入新密码": "请再次输入新密码",
-  "取消": "取消",
-  "取消选择": "取消选择",
-  "全屏": "全屏",
-  "确定": "确定",
-  "确定要删除机器": "确定要删除机器",
-  "确定要删除选中的": "确定要删除选中的",
-  "确认密码": "确认密码",
-  "如何获取 Customer Subdomain": "如何获取 Customer Subdomain",
-  "删除": "删除",
-  "删除成功": "删除成功",
-  "删除失败": "删除失败",
-  "摄像头管理": "摄像头管理",
-  "摄像头管理系统": "摄像头管理系统",
-  "摄像头数": "摄像头数",
+  "技术支持": "技术支持",
+  "推荐通过后端代理调用,避免暴露 Token": "推荐通过后端代理调用,避免暴露 Token",
+  "描述": "描述",
+  "提示": "提示",
   "摄像头在线率": "摄像头在线率",
   "摄像头总数": "摄像头总数",
-  "生成地址": "生成地址",
-  "生成的地址": "生成的地址",
-  "事件日志": "事件日志",
-  "视频播放测试": "视频播放测试",
-  "视频地址": "视频地址",
-  "是": "是",
-  "手动": "手动",
+  "摄像头数": "摄像头数",
+  "摄像头管理": "摄像头管理",
+  "摄像头管理系统": "摄像头管理系统",
+  "播放": "播放",
+  "播放器类型": "播放器类型",
+  "播放域名的子域名部分": "播放域名的子域名部分",
+  "播放方式": "播放方式",
+  "播放测试视频": "播放测试视频",
+  "操作": "操作",
   "数据更新时间": "数据更新时间",
-  "刷新数据": "刷新数据",
-  "台机器": "台机器",
-  "台机器吗?": "台机器吗?",
-  "提示": "提示",
-  "停止": "停止",
-  "通道总数": "通道总数",
-  "推荐通过后端代理调用,避免暴露 Token": "推荐通过后端代理调用,避免暴露 Token",
-  "退出登录": "退出登录",
-  "忘记密码?": "忘记密码?",
-  "位置": "位置",
-  "稳定性": "稳定性",
-  "系统信息": "系统信息",
-  "系统运行正常": "系统运行正常",
-  "系统状态": "系统状态",
-  "项": "项",
-  "新建标签": "新建标签",
-  "新密码": "新密码",
   "新增": "新增",
   "新增成功": "新增成功",
   "新增机器": "新增机器",
-  "修改成功": "修改成功",
-  "修改密码": "修改密码",
-  "选择测试源": "选择测试源",
-  "仪表盘": "仪表盘",
-  "已禁用": "已禁用",
-  "已启用": "已启用",
-  "已选择": "已选择",
-  "用户": "用户",
-  "用户名": "用户名",
-  "有声": "有声",
-  "原密码": "原密码",
-  "在线": "在线",
+  "新密码": "新密码",
+  "新建标签": "新建标签",
+  "是": "是",
   "暂停": "暂停",
   "暂无日志": "暂无日志",
+  "有声": "有声",
+  "机器ID": "机器ID",
+  "机器总数": "机器总数",
+  "机器管理": "机器管理",
+  "查询": "查询",
+  "欢迎回来": "欢迎回来",
+  "欢迎回来,这是您的数据概览": "欢迎回来,这是您的数据概览",
   "正常": "正常",
+  "测试播放": "测试播放",
+  "测试视频": "测试视频",
+  "测试连接": "测试连接",
+  "清空": "清空",
+  "版本": "版本",
+  "生成地址": "生成地址",
+  "生成的地址": "生成的地址",
+  "用户": "用户",
+  "用户名": "用户名",
+  "登录": "登录",
+  "登录失败": "登录失败",
+  "登录失败,请检查网络": "登录失败,请检查网络",
+  "登录您的管理后台,开始管理您的业务": "登录您的管理后台,开始管理您的业务",
+  "登录成功": "登录成功",
   "直接 URL": "直接 URL",
   "直接 URL 播放": "直接 URL 播放",
-  "重置": "重置",
-  "转换服务地址": "转换服务地址",
-  "自定义域名": "自定义域名",
+  "确定": "确定",
+  "确定要删除机器": "确定要删除机器",
+  "确定要删除选中的": "确定要删除选中的",
+  "确认密码": "确认密码",
+  "离线": "离线",
+  "稳定性": "稳定性",
+  "系统信息": "系统信息",
+  "系统状态": "系统状态",
+  "系统运行正常": "系统运行正常",
+  "编辑": "编辑",
+  "编辑机器": "编辑机器",
   "自动播放": "自动播放",
-  "Cloudflare Stream": "Cloudflare Stream",
-  "Cloudflare Stream 配置": "Cloudflare Stream 配置",
-  "iframe 模式": "iframe 模式",
-  "RTSP 地址": "RTSP 地址",
-  "RTSP 流": "RTSP 流",
-  "RTSP 流需要通过服务端转换为 HLS/WebRTC 后才能在浏览器播放": "RTSP 流需要通过服务端转换为 HLS/WebRTC 后才能在浏览器播放",
-  "Stream 测试": "Stream 测试",
-  "Video ID": "Video ID"
+  "自定义域名": "自定义域名",
+  "获取统计数据失败": "获取统计数据失败",
+  "观看统计": "观看统计",
+  "视频地址": "视频地址",
+  "视频播放测试": "视频播放测试",
+  "记住我": "记住我",
+  "请再次输入新密码": "请再次输入新密码",
+  "请联系管理员重置密码": "请联系管理员重置密码",
+  "请输入原密码": "请输入原密码",
+  "请输入名称": "请输入名称",
+  "请输入密码": "请输入密码",
+  "请输入新密码": "请输入新密码",
+  "请输入机器ID": "请输入机器ID",
+  "请输入用户名": "请输入用户名",
+  "请输入视频地址并点击播放": "请输入视频地址并点击播放",
+  "请选择视频源并点击播放": "请选择视频源并点击播放",
+  "转换服务地址": "转换服务地址",
+  "退出登录": "退出登录",
+  "选择测试源": "选择测试源",
+  "通道总数": "通道总数",
+  "配置说明": "配置说明",
+  "重置": "重置",
+  "静音": "静音",
+  "项": "项"
 }

+ 13 - 13
src/views/machine/index.vue

@@ -74,7 +74,7 @@
         @sort-change="handleSortChange"
       >
         <el-table-column type="selection" width="50" align="center" />
-        <el-table-column type="index" label="序号" width="60" align="center" />
+        <el-table-column type="index" :label="t('序号')" width="60" align="center" />
         <el-table-column
           prop="machineId"
           :label="t('机器ID')"
@@ -96,7 +96,7 @@
             <el-tag type="info">{{ row.cameraCount || 0 }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="enabled" :label="t('启用')" width="80" sortable="custom" align="center">
+        <el-table-column prop="enabled" :label="t('启用')" sortable="custom" align="center">
           <template #default="{ row }">
             <el-tag :type="row.enabled ? 'success' : 'info'">
               {{ row.enabled ? t('是') : t('否') }}
@@ -108,7 +108,7 @@
             {{ formatDateTime(row.createdAt) }}
           </template>
         </el-table-column>
-        <el-table-column :label="t('操作')" width="150" align="center" fixed="right">
+        <el-table-column :label="t('操作')" min-width="90" align="center" fixed="right">
           <template #default="{ row }">
             <el-button type="primary" link :icon="Edit" :data-id="`btn-edit-${row.machineId}`" @click="handleEdit(row)">
               {{ t('编辑') }}
@@ -229,7 +229,8 @@ const searchForm = reactive<{
 
 // 分页相关
 const currentPage = ref(1)
-const pageSize = ref(30)
+const pageSize = ref(20)
+const total = ref(0)
 
 // 过滤后的数据
 const filteredList = computed(() => {
@@ -258,11 +259,9 @@ const filteredList = computed(() => {
   })
 })
 
-const total = computed(() => filteredList.value.length)
-
-// 排序后的数据
+// 排序后的数据(后端已分页,前端只做排序)
 const sortedList = computed(() => {
-  const list = [...filteredList.value]
+  const list = [...machineList.value]
   if (sortState.prop && sortState.order) {
     list.sort((a, b) => {
       const aVal = a[sortState.prop as keyof MachineDTO]
@@ -286,10 +285,7 @@ const sortedList = computed(() => {
       return sortState.order === 'ascending' ? result : -result
     })
   }
-  // 分页
-  const start = (currentPage.value - 1) * pageSize.value
-  const end = start + pageSize.value
-  return list.slice(start, end)
+  return list
 })
 
 const form = reactive<{
@@ -318,9 +314,10 @@ const rules: FormRules = {
 async function getList() {
   loading.value = true
   try {
-    const res = await listMachines()
+    const res = await listMachines({ page: currentPage.value, pageSize: pageSize.value })
     if (res.success) {
       machineList.value = res.data.list
+      total.value = res.data.total || 0
     }
   } finally {
     loading.value = false
@@ -329,6 +326,7 @@ async function getList() {
 
 function handleSearch() {
   currentPage.value = 1 // 搜索时重置到第一页
+  getList()
 }
 
 function handleReset() {
@@ -474,10 +472,12 @@ async function handleSubmit() {
 function handleSizeChange(val: number) {
   pageSize.value = val
   currentPage.value = 1
+  getList()
 }
 
 function handleCurrentChange(val: number) {
   currentPage.value = val
+  getList()
 }
 
 onMounted(() => {