From 4a6f5501baf71886cd0257e6789686dc27fe154e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E5=8D=97=E5=9B=BD?= <164292041@qq.com> Date: Thu, 11 Jun 2026 17:42:58 +0800 Subject: [PATCH] =?UTF-8?q?[add]=E6=96=B0=E5=A2=9E=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit embed/programWidget embed/domainStatus embed/partnership embed/gameRtp --- web/src/lang/backend/en/embed/domainStatus.ts | 32 + web/src/lang/backend/en/embed/gameRtp.ts | 56 ++ web/src/lang/backend/en/embed/partnership.ts | 52 ++ .../lang/backend/en/embed/programWidget.ts | 16 + .../lang/backend/zh-cn/embed/domainStatus.ts | 32 + web/src/lang/backend/zh-cn/embed/gameRtp.ts | 56 ++ .../lang/backend/zh-cn/embed/partnership.ts | 52 ++ .../lang/backend/zh-cn/embed/programWidget.ts | 16 + web/src/lang/globs-en.ts | 5 + web/src/lang/globs-zh-cn.ts | 5 + .../backend/components/menus/menuTree.vue | 17 +- web/src/router/static/adminBase.ts | 24 + web/src/utils/router.ts | 8 +- web/src/views/backend/embed/domainStatus.vue | 452 +++++++++++++ web/src/views/backend/embed/gameRtp.vue | 626 ++++++++++++++++++ web/src/views/backend/embed/partnership.vue | 603 +++++++++++++++++ web/src/views/backend/embed/programWidget.vue | 267 ++++++++ 17 files changed, 2315 insertions(+), 4 deletions(-) create mode 100644 web/src/lang/backend/en/embed/domainStatus.ts create mode 100644 web/src/lang/backend/en/embed/gameRtp.ts create mode 100644 web/src/lang/backend/en/embed/partnership.ts create mode 100644 web/src/lang/backend/en/embed/programWidget.ts create mode 100644 web/src/lang/backend/zh-cn/embed/domainStatus.ts create mode 100644 web/src/lang/backend/zh-cn/embed/gameRtp.ts create mode 100644 web/src/lang/backend/zh-cn/embed/partnership.ts create mode 100644 web/src/lang/backend/zh-cn/embed/programWidget.ts create mode 100644 web/src/views/backend/embed/domainStatus.vue create mode 100644 web/src/views/backend/embed/gameRtp.vue create mode 100644 web/src/views/backend/embed/partnership.vue create mode 100644 web/src/views/backend/embed/programWidget.vue diff --git a/web/src/lang/backend/en/embed/domainStatus.ts b/web/src/lang/backend/en/embed/domainStatus.ts new file mode 100644 index 0000000..135412a --- /dev/null +++ b/web/src/lang/backend/en/embed/domainStatus.ts @@ -0,0 +1,32 @@ +export default { + settingTitle: 'Domain Status Setting', + embedCode: 'Embed Code', + headerImage: 'Header Image URL', + customConfig: 'Custom Config', + loadTemplate: 'Load Template', + baseColor: 'Base Color', + borderColor: 'Border Color', + onlineColor: 'Online Color', + offlineColor: 'Offline Color', + titleColor: 'Title Color', + textColor: 'Text Color', + labelColor: 'Label Color', + save: 'SAVE', + copyCode: 'Copy Embed Code', + saved: 'Domain status settings saved', + invalidConfig: 'Custom Config contains invalid JSON', + copied: 'Embed code copied', + copyFailed: 'Unable to copy the embed code', + domainList: 'Domain List', + online: 'ONLINE', + offline: 'OFFLINE', + empty: 'No domains', + editDomainList: 'Click here to edit Domain List', + editTitle: 'Edit Domain List', + addDomain: 'Add Domain', + delete: 'Delete', + cancel: 'Cancel', + confirm: 'Confirm', + duplicateDomain: 'Domain names must be unique', + domainsSaved: 'Domain list saved', +} diff --git a/web/src/lang/backend/en/embed/gameRtp.ts b/web/src/lang/backend/en/embed/gameRtp.ts new file mode 100644 index 0000000..01afce8 --- /dev/null +++ b/web/src/lang/backend/en/embed/gameRtp.ts @@ -0,0 +1,56 @@ +export default { + settingTitle: 'Game RTP Setting', + embedCode: 'Embed Code', + autoRtp: 'Auto Game RTP (%)', + autoAmount: 'Auto RTP Amount', + frequency: 'Auto Frequency (min)', + lastRefresh: 'Last Refresh', + providerDisplay: 'Provider Display', + providerHint: 'Leave it blank to display all providers', + customConfig: 'Custom Config', + loadTemplate: 'Load Template', + headerImage: 'Header Image URL', + textColor: 'Text Color', + baseColor: 'Base Color', + outlineColor: 'Outline Color', + buttonTextColor: 'Button Text Color', + buttonBgColor: 'Button BG Color', + progressBgColor: 'Progress Bar BG Color', + save: 'SAVE', + copyCode: 'Copy Embed Code', + dataTitle: 'Game RTP Data', + provider: 'Game Provider', + allProviders: '- All Game Providers -', + gameName: 'Game Name', + searchName: 'Search by Game Name', + search: 'Search', + clear: 'Clear', + gameId: 'Game ID', + imageUrl: 'Game Image URL', + rtp: 'RTP (%)', + status: 'Status', + action: 'Action', + active: 'ACTIVE', + inactive: 'INACTIVE', + edit: 'Edit', + delete: 'Delete', + totalRecords: 'Total {total} records', + create: 'CREATE NEW GAME RTP', + import: 'IMPORT & REFRESH (VIA JDK API)', + createTitle: 'Create New Game RTP', + editTitle: 'Edit Game RTP', + cancel: 'Cancel', + confirm: 'Confirm', + providerRequired: 'Please enter the game provider', + nameRequired: 'Please enter the game name', + urlRequired: 'Please enter the game image URL', + saved: 'Settings saved', + copied: 'Embed code copied', + copyFailed: 'Unable to copy the embed code', + operationSuccess: 'Operation completed', + deleteConfirm: 'Delete game "{name}"?', + warning: 'Warning', + deleted: 'Game deleted', + importConfirm: 'Import and refresh game data from the JDK API?', + imported: 'Game data refreshed', +} diff --git a/web/src/lang/backend/en/embed/partnership.ts b/web/src/lang/backend/en/embed/partnership.ts new file mode 100644 index 0000000..18e1ea8 --- /dev/null +++ b/web/src/lang/backend/en/embed/partnership.ts @@ -0,0 +1,52 @@ +export default { + settingTitle: 'Partnership Setting', + embedCode: 'Embed Code', + headerImage: 'Header Image URL', + footerConfig: 'Footer Config', + customConfig: 'Custom Config', + loadTemplate: 'Load Template', + baseColor1: 'Base Color 1', + baseColor2: 'Base Color 2', + borderColor: 'Border Color', + highlightColor: 'Highlight Color', + titleColor: 'Title Color', + textColor: 'Text Color', + save: 'SAVE', + copyCode: 'Copy Embed Code', + dataTitle: 'Partner Data', + displayOrder: 'Display Order', + partnerName: 'Partner Name', + currency: 'Currency', + logoImage: 'Logo Image', + option: 'Option', + config: 'Config', + status: 'Status', + action: 'Action', + active: 'ACTIVE', + inactive: 'INACTIVE', + edit: 'Edit', + delete: 'Delete', + empty: 'No partner data', + create: 'CREATE NEW PARTNER', + export: 'EXPORT (PARTNER DATA)', + import: 'IMPORT & REPLACE (PARTNER DATA)', + createTitle: 'Create New Partner', + editTitle: 'Edit Partner', + cancel: 'Cancel', + confirm: 'Confirm', + nameRequired: 'Please enter the partner name', + currencyRequired: 'Please enter the currency', + saved: 'Partnership settings saved', + invalidConfig: 'Footer Config or Custom Config contains invalid JSON', + copied: 'Embed code copied', + copyFailed: 'Unable to copy the embed code', + invalidPartnerConfig: 'Option or Config contains invalid JSON', + operationSuccess: 'Operation completed', + warning: 'Warning', + deleteConfirm: 'Delete partner "{name}"?', + deleted: 'Partner deleted', + exported: 'Partner data exported', + importConfirm: 'Replace current partner data with {total} imported records?', + imported: 'Partner data imported', + importFailed: 'Unable to import this partner data file', +} diff --git a/web/src/lang/backend/en/embed/programWidget.ts b/web/src/lang/backend/en/embed/programWidget.ts new file mode 100644 index 0000000..a9a1ba7 --- /dev/null +++ b/web/src/lang/backend/en/embed/programWidget.ts @@ -0,0 +1,16 @@ +export default { + title: 'Access All Program', + bannerCode: 'Program Banner Code', + bannerHelpPrefix: 'Put the code in', + bannerHelpSuffix: 'or anywhere you want to put it.', + preview: 'Preview', + copyBanner: 'Copy Banner Code', + functionCode: 'Program Function Code', + functionHelpPrefix: 'Put the code in', + copyFunction: 'Copy Function Code', + copied: 'Code copied', + copyFailed: 'Unable to copy the code', + previewTitle: 'Program Banner Preview', + previewNote: 'Preview clicks do not open the live program or submit account information.', + previewProgram: 'Program page {page} selected in preview', +} diff --git a/web/src/lang/backend/zh-cn/embed/domainStatus.ts b/web/src/lang/backend/zh-cn/embed/domainStatus.ts new file mode 100644 index 0000000..7188e32 --- /dev/null +++ b/web/src/lang/backend/zh-cn/embed/domainStatus.ts @@ -0,0 +1,32 @@ +export default { + settingTitle: '域名状态设置', + embedCode: '嵌入代码', + headerImage: '顶部图片 URL', + customConfig: '自定义配置', + loadTemplate: '载入模板', + baseColor: '基础颜色', + borderColor: '边框颜色', + onlineColor: '在线颜色', + offlineColor: '离线颜色', + titleColor: '标题颜色', + textColor: '文字颜色', + labelColor: '标签颜色', + save: '保存', + copyCode: '复制嵌入代码', + saved: '域名状态设置已保存', + invalidConfig: '自定义配置不是有效的 JSON', + copied: '嵌入代码已复制', + copyFailed: '无法复制嵌入代码', + domainList: '域名列表', + online: '在线', + offline: '离线', + empty: '暂无域名', + editDomainList: '点击这里编辑域名列表', + editTitle: '编辑域名列表', + addDomain: '添加域名', + delete: '删除', + cancel: '取消', + confirm: '确认', + duplicateDomain: '域名不能重复', + domainsSaved: '域名列表已保存', +} diff --git a/web/src/lang/backend/zh-cn/embed/gameRtp.ts b/web/src/lang/backend/zh-cn/embed/gameRtp.ts new file mode 100644 index 0000000..4d75b3f --- /dev/null +++ b/web/src/lang/backend/zh-cn/embed/gameRtp.ts @@ -0,0 +1,56 @@ +export default { + settingTitle: '游戏 RTP 设置', + embedCode: '嵌入代码', + autoRtp: '自动游戏 RTP (%)', + autoAmount: '自动 RTP 范围', + frequency: '自动刷新频率(分钟)', + lastRefresh: '上次刷新', + providerDisplay: '显示供应商', + providerHint: '留空则显示所有供应商', + customConfig: '自定义配置', + loadTemplate: '载入模板', + headerImage: '顶部图片 URL', + textColor: '文字颜色', + baseColor: '基础颜色', + outlineColor: '边框颜色', + buttonTextColor: '按钮文字颜色', + buttonBgColor: '按钮背景颜色', + progressBgColor: '进度条背景颜色', + save: '保存', + copyCode: '复制嵌入代码', + dataTitle: '游戏 RTP 数据', + provider: '游戏供应商', + allProviders: '- 所有游戏供应商 -', + gameName: '游戏名称', + searchName: '根据游戏名称搜索', + search: '搜索', + clear: '清空', + gameId: '游戏 ID', + imageUrl: '游戏图片 URL', + rtp: 'RTP (%)', + status: '状态', + action: '操作', + active: '启用', + inactive: '停用', + edit: '编辑', + delete: '删除', + totalRecords: '共 {total} 条记录', + create: '新增游戏 RTP', + import: '从 JDK API 导入并刷新', + createTitle: '新增游戏 RTP', + editTitle: '编辑游戏 RTP', + cancel: '取消', + confirm: '确认', + providerRequired: '请输入游戏供应商', + nameRequired: '请输入游戏名称', + urlRequired: '请输入游戏图片 URL', + saved: '设置已保存', + copied: '嵌入代码已复制', + copyFailed: '无法复制嵌入代码', + operationSuccess: '操作成功', + deleteConfirm: '确定删除游戏“{name}”吗?', + warning: '提示', + deleted: '游戏已删除', + importConfirm: '确定从 JDK API 导入并刷新游戏数据吗?', + imported: '游戏数据已刷新', +} diff --git a/web/src/lang/backend/zh-cn/embed/partnership.ts b/web/src/lang/backend/zh-cn/embed/partnership.ts new file mode 100644 index 0000000..56c7cb3 --- /dev/null +++ b/web/src/lang/backend/zh-cn/embed/partnership.ts @@ -0,0 +1,52 @@ +export default { + settingTitle: '合作伙伴设置', + embedCode: '嵌入代码', + headerImage: '顶部图片 URL', + footerConfig: '页脚配置', + customConfig: '自定义配置', + loadTemplate: '载入模板', + baseColor1: '基础颜色 1', + baseColor2: '基础颜色 2', + borderColor: '边框颜色', + highlightColor: '高亮颜色', + titleColor: '标题颜色', + textColor: '文字颜色', + save: '保存', + copyCode: '复制嵌入代码', + dataTitle: '合作伙伴数据', + displayOrder: '显示顺序', + partnerName: '合作伙伴名称', + currency: '币种', + logoImage: 'Logo 图片', + option: '选项', + config: '配置', + status: '状态', + action: '操作', + active: '启用', + inactive: '停用', + edit: '编辑', + delete: '删除', + empty: '暂无合作伙伴数据', + create: '新增合作伙伴', + export: '导出合作伙伴数据', + import: '导入并替换合作伙伴数据', + createTitle: '新增合作伙伴', + editTitle: '编辑合作伙伴', + cancel: '取消', + confirm: '确认', + nameRequired: '请输入合作伙伴名称', + currencyRequired: '请输入币种', + saved: '合作伙伴设置已保存', + invalidConfig: '页脚配置或自定义配置不是有效的 JSON', + copied: '嵌入代码已复制', + copyFailed: '无法复制嵌入代码', + invalidPartnerConfig: '选项或配置不是有效的 JSON', + operationSuccess: '操作成功', + warning: '提示', + deleteConfirm: '确定删除合作伙伴“{name}”吗?', + deleted: '合作伙伴已删除', + exported: '合作伙伴数据已导出', + importConfirm: '确定用导入的 {total} 条记录替换当前合作伙伴数据吗?', + imported: '合作伙伴数据已导入', + importFailed: '无法导入该合作伙伴数据文件', +} diff --git a/web/src/lang/backend/zh-cn/embed/programWidget.ts b/web/src/lang/backend/zh-cn/embed/programWidget.ts new file mode 100644 index 0000000..546b02d --- /dev/null +++ b/web/src/lang/backend/zh-cn/embed/programWidget.ts @@ -0,0 +1,16 @@ +export default { + title: '访问所有程序', + bannerCode: '程序 Banner 代码', + bannerHelpPrefix: '将代码放到', + bannerHelpSuffix: ',或任何需要展示的位置。', + preview: '预览', + copyBanner: '复制 Banner 代码', + functionCode: '程序功能代码', + functionHelpPrefix: '将代码放到', + copyFunction: '复制功能代码', + copied: '代码已复制', + copyFailed: '无法复制代码', + previewTitle: '程序 Banner 预览', + previewNote: '预览点击不会打开真实程序,也不会提交账号信息。', + previewProgram: '已在预览中选择程序页面 {page}', +} diff --git a/web/src/lang/globs-en.ts b/web/src/lang/globs-en.ts index 7255f71..e83a726 100644 --- a/web/src/lang/globs-en.ts +++ b/web/src/lang/globs-en.ts @@ -56,6 +56,11 @@ export default { Promotion: 'Promotion', 'Submittled Rewards': 'Submitted Rewards', 'Submitted Rewards': 'Submitted Rewards', + Embed: 'Embed', + 'Domain Status': 'Domain Status', + 'Program Widget': 'Program Widget', + 'Game RTP': 'Game RTP', + Partnership: 'Partnership', Report: 'Report', 'Annual Report': 'Annual Report', 'Daily Report': 'Daily Report', diff --git a/web/src/lang/globs-zh-cn.ts b/web/src/lang/globs-zh-cn.ts index 2bfab0f..6610d17 100644 --- a/web/src/lang/globs-zh-cn.ts +++ b/web/src/lang/globs-zh-cn.ts @@ -57,6 +57,11 @@ export default { Promotion: '促销活动', 'Submittled Rewards': '已提交奖励', 'Submitted Rewards': '已提交奖励', + Embed: '嵌入工具', + 'Domain Status': '域名状态', + 'Program Widget': '程序组件', + 'Game RTP': '游戏 RTP', + Partnership: '合作伙伴', Report: '报表', 'Annual Report': '年度报表', 'Daily Report': '日报表', diff --git a/web/src/layouts/backend/components/menus/menuTree.vue b/web/src/layouts/backend/components/menus/menuTree.vue index 65b34ca..94c3567 100644 --- a/web/src/layouts/backend/components/menus/menuTree.vue +++ b/web/src/layouts/backend/components/menus/menuTree.vue @@ -60,11 +60,22 @@ const reportMenuPaths: Record = { 客户报表: '/user/moneyLog/customerReport', } +const embedMenuPaths: Record = { + 'Domain Status': '/embed/domainStatus', + 域名状态: '/embed/domainStatus', + 'Program Widget': '/embed/programWidget', + 程序组件: '/embed/programWidget', + 'Game RTP': '/embed/gameRtp', + '游戏 RTP': '/embed/gameRtp', + Partnership: '/embed/partnership', + 合作伙伴: '/embed/partnership', +} + const onClickMenuItem = (menu: RouteRecordRaw) => { const title = typeof menu.meta?.title === 'string' ? menu.meta.title : '' - const reportPath = reportMenuPaths[title] - if (reportPath) { - routePush(adminBaseRoutePath + reportPath) + const normalizedPath = reportMenuPaths[title] || embedMenuPaths[title] + if (normalizedPath) { + routePush(adminBaseRoutePath + normalizedPath) return } onClickMenu(menu) diff --git a/web/src/router/static/adminBase.ts b/web/src/router/static/adminBase.ts index c98e818..32f4076 100644 --- a/web/src/router/static/adminBase.ts +++ b/web/src/router/static/adminBase.ts @@ -27,6 +27,30 @@ const adminBaseRoute: RouteRecordRaw = { title: `pagesTitle.loading`, }, }, + { + path: 'embed/domainStatus', + name: 'embed/domainStatus', + component: () => import('/@/views/backend/embed/domainStatus.vue'), + meta: { title: 'Domain Status', menu_type: 'tab', type: 'route', addtab: true }, + }, + { + path: 'embed/programWidget', + name: 'embed/programWidget', + component: () => import('/@/views/backend/embed/programWidget.vue'), + meta: { title: 'Program Widget', menu_type: 'tab', type: 'route', addtab: true }, + }, + { + path: 'embed/gameRtp', + name: 'embed/gameRtp', + component: () => import('/@/views/backend/embed/gameRtp.vue'), + meta: { title: 'Game RTP', menu_type: 'tab', type: 'route', addtab: true }, + }, + { + path: 'embed/partnership', + name: 'embed/partnership', + component: () => import('/@/views/backend/embed/partnership.vue'), + meta: { title: 'Partnership', menu_type: 'tab', type: 'route', addtab: true }, + }, ], } diff --git a/web/src/utils/router.ts b/web/src/utils/router.ts index 85c8f00..4377acf 100644 --- a/web/src/utils/router.ts +++ b/web/src/utils/router.ts @@ -276,6 +276,12 @@ export const addRouteAll = (viewsComponent: Record, routes: any, pa * @param analyticRelation 根据 name 从已注册路由分析父级路由 */ export const addRouteItem = (viewsComponent: Record, route: any, parentName: string, analyticRelation: boolean) => { + const routeName = normalizeRouteName(route) + const protectedEmbedRoutes = new Set(['embed/domainStatus', 'embed/programWidget', 'embed/gameRtp', 'embed/partnership']) + if (typeof routeName === 'string' && protectedEmbedRoutes.has(routeName) && router.hasRoute(routeName)) { + return + } + let path = '', component if (route.menu_type == 'iframe') { @@ -301,7 +307,7 @@ export const addRouteItem = (viewsComponent: Record, route: any, pa const routeBaseInfo: RouteRecordRaw = { path: path, - name: normalizeRouteName(route), + name: routeName, component: component, meta: { title: route.title, diff --git a/web/src/views/backend/embed/domainStatus.vue b/web/src/views/backend/embed/domainStatus.vue new file mode 100644 index 0000000..4d896c7 --- /dev/null +++ b/web/src/views/backend/embed/domainStatus.vue @@ -0,0 +1,452 @@ + + + + + diff --git a/web/src/views/backend/embed/gameRtp.vue b/web/src/views/backend/embed/gameRtp.vue new file mode 100644 index 0000000..ff8f1e4 --- /dev/null +++ b/web/src/views/backend/embed/gameRtp.vue @@ -0,0 +1,626 @@ + + + + + diff --git a/web/src/views/backend/embed/partnership.vue b/web/src/views/backend/embed/partnership.vue new file mode 100644 index 0000000..b88670e --- /dev/null +++ b/web/src/views/backend/embed/partnership.vue @@ -0,0 +1,603 @@ + + + + + diff --git a/web/src/views/backend/embed/programWidget.vue b/web/src/views/backend/embed/programWidget.vue new file mode 100644 index 0000000..138672e --- /dev/null +++ b/web/src/views/backend/embed/programWidget.vue @@ -0,0 +1,267 @@ + + + + +