feat: 语言切换功能完成

This commit is contained in:
hzj 2026-05-08 17:04:07 +08:00
parent bbe82fe55a
commit fdb278199b
44 changed files with 4418 additions and 790 deletions

View File

@ -11,7 +11,7 @@
- 路由是否记为独立菜单,先以原始接口返回为准;若入口页再直接引用同目录多个 `.vue` 文件,则这些文件记为页面内功能文件,不单独记成并列主路由 - 路由是否记为独立菜单,先以原始接口返回为准;若入口页再直接引用同目录多个 `.vue` 文件,则这些文件记为页面内功能文件,不单独记成并列主路由
- 后续所有线程领取新任务前,除了读取 `线程协作.md``翻译进度.md``翻译清单.md`,还应先读取本文件 - 后续所有线程领取新任务前,除了读取 `线程协作.md``翻译进度.md``翻译清单.md`,还应先读取本文件
- 其他文档不再重复维护完整主路由树或已完成主要路由索引,最多保留引用本文件的说明 - 其他文档不再重复维护完整主路由树或已完成主要路由索引,最多保留引用本文件的说明
- “当前已完成主要路由摘要”只在本文件维护;完成主要路由页面时必须同步更新本文件,不再去 `docs/i18n/翻译清单.md` 维护第二份主路由索引 - “当前主要路由状态总览(完成 / 进行中 / 未完成)”只在本文件维护;认领或完成主要路由页面时必须同步更新本文件,不再去 `docs/i18n/翻译清单.md` 或 `docs/i18n/翻译进度.md` 维护第二份主路由索引
- 下方保留原始接口返回,顶部摘要用于实际执行 - 下方保留原始接口返回,顶部摘要用于实际执行
### 全线程统一优先级 ### 全线程统一优先级
@ -62,7 +62,7 @@
### 当前跨已完成页面的公共组件联动复查 ### 当前跨已完成页面的公共组件联动复查
- 状态:待处理 - 状态:已完成线程一2026-05-08最终收口
- 已完成:`src/components/data/IpDeviceHandle/index.vue`线程一2026-05-06 - 已完成:`src/components/data/IpDeviceHandle/index.vue`线程一2026-05-06
- 已完成:`src/components/data/UserAccountStatusLogDrawer/index.vue`线程二2026-05-06 - 已完成:`src/components/data/UserAccountStatusLogDrawer/index.vue`线程二2026-05-06
- 已完成:`src/components/data/UserVideoViolationTableDialog/index.vue`线程二2026-05-06同步完成 `src/views/approval/not-pass-history/index.vue` - 已完成:`src/components/data/UserVideoViolationTableDialog/index.vue`线程二2026-05-06同步完成 `src/views/approval/not-pass-history/index.vue`
@ -86,9 +86,9 @@
- 已完成:`src/components/IconsPanel/index.vue`线程一2026-04-28 - 已完成:`src/components/IconsPanel/index.vue`线程一2026-04-28
- 已复核保留:`src/components/data/AccountHanle/index.vue`线程一2026-04-28唯一中文为接口提交内容 - 已复核保留:`src/components/data/AccountHanle/index.vue`线程一2026-04-28唯一中文为接口提交内容
- 已完成:`src/components/data/AddOtherRecharge/index.vue`线程一2026-04-29 - 已完成:`src/components/data/AddOtherRecharge/index.vue`线程一2026-04-29
- 说明:已发现不止 `用户列表 / User List` 使用仍需复核的 `src/components/**` 公共组件;所有已完成主要路由页面都需要按 `docs/i18n/翻译清单.md` 中“对已完成主要路由页面做直接公共组件联动复查”清单逐项确认 - 说明:已发现不止单个页面使用仍需复核的 `src/components/**` 公共组件;所有已完成主要路由页面都需要按 `docs/i18n/翻译清单.md` 中“对已完成主要路由页面做直接公共组件联动复查”清单逐项确认
- 优先建议: - 优先建议:
- 继续处理高频业务弹窗 / 抽屉,例如用户列表直接渲染的流水、充值、扣除、违规记录等组件 - 继续`docs/i18n/翻译清单.md` 中的公共组件联动复查清单,优先处理被多个已完成主要路由页面复用的弹窗 / 抽屉 / 展示组件
### 当前接口返回的主要路由树(整理版) ### 当前接口返回的主要路由树(整理版)
@ -125,7 +125,7 @@
- 状态:已完成 - 状态:已完成
- App系统 / App System - App系统 / App System
- 路由别名:`app:sys:manager` - 路由别名:`app:sys:manager`
- 状态:部分完成 - 状态:完成
- 版本管理 / Version Management - 版本管理 / Version Management
- 路由别名:`sugartime:version` - 路由别名:`sugartime:version`
- 路径:`version/app/index` - 路径:`version/app/index`
@ -146,8 +146,9 @@
- 路由别名:`AppUserList` - 路由别名:`AppUserList`
- 路径:`user/user-table/index` - 路径:`user/user-table/index`
- 文件:`src/views/user/user-table/index.vue` - 文件:`src/views/user/user-table/index.vue`
- 状态:页面本体已完成,直接公共组件待联动复核 - 状态已完成线程一2026-05-08直接公共组件最终复核完成
- 备注:该页面直接渲染多个 `src/components/**` 弹窗、抽屉、流水与表单组件;后续按公共组件联动复查规则逐个确认展示中文 - 备注:入口页及直接渲染的流水、充值、奖励、扣除、违规记录、账号处理、账号处理记录、认证信息、银行卡、注册概览与用户详情等公共组件已复核;可见静态中文无待处理项
- 保留项:`src/components/data/AccountHanle/index.vue` 默认警告语属于提交给接口的业务内容,按规则保留;其他中文命中为注释或已注释代码
- 用户专属礼物制作 / Custom User Gift Creation - 用户专属礼物制作 / Custom User Gift Creation
- 路由别名:`UserCustomGift` - 路由别名:`UserCustomGift`
- 路径:`user/custom-gift/index` - 路径:`user/custom-gift/index`
@ -169,7 +170,7 @@
- 路由别名:`OperationManager` - 路由别名:`OperationManager`
- 营收支出 / Revenue and Expenses - 营收支出 / Revenue and Expenses
- 路由别名:`AppRevenue` - 路由别名:`AppRevenue`
- 状态:部分完成 - 状态:完成
- 消费商品订单 / Purchase Orders - 消费商品订单 / Purchase Orders
- 路由别名:`GoldPurchasing` - 路由别名:`GoldPurchasing`
- 路径:`order/candy/purchasing/index` - 路径:`order/candy/purchasing/index`
@ -180,9 +181,65 @@
- 路径:`order/candy/running-water/index` - 路径:`order/candy/running-water/index`
- 文件:`src/views/order/candy/running-water/index.vue` - 文件:`src/views/order/candy/running-water/index.vue`
- 状态:已完成 - 状态:已完成
- 钻石流水列表 / Diamond Transaction List
- 路由别名:`User:Diamond:Run:Water`
- 路径:`user/diamond-run-water/index`
- 文件:`src/views/user/diamond-run-water/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 页面私有组件状态:无私有组件
- 直接公共组件状态:已复核,中文扫描无命中
- 验证结果:`npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态已完成线程一2026-05-08
- 积分收支记录 / Points Transaction Records
- 路由别名:`IntegralStream`
- 路径:`user/integral-stream/index`
- 文件:
- `src/views/user/integral-stream/index.vue`
- `src/views/user/integral-stream/timely/index.vue`
- `src/views/user/integral-stream/history/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 页面私有组件状态:已随页面同步完成
- 直接公共组件状态:已复核,中文扫描无命中
- 保留项:`timely/index.vue``history/index.vue` 首行中文仅为注释,不参与页面展示
- 验证结果:`npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态已完成线程一2026-05-08
- 金币代理流水 / Gold Agent Transactions
- 路由别名:`UserFreightInfoList`
- 路径:`user/freight-info-list/index`
- 文件:`src/views/user/freight-info-list/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- 页面私有组件状态:无私有组件
- 直接公共组件状态:已复核,中文扫描无命中
- 验证结果:`npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态已完成线程一2026-05-08
- 钻石余额列表 / Diamond Balance List
- 路由别名:`User:Diamond:Balance`
- 路径:`user/diamond-balance/index`
- 文件:`src/views/user/diamond-balance/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 页面私有组件状态:无私有组件
- 直接公共组件状态:已复核,中文扫描无命中
- 验证结果:`npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态已完成线程一2026-05-08
- 数据配置 / Data Configuration - 数据配置 / Data Configuration
- 路由别名:`data:conf` - 路由别名:`data:conf`
- 状态:部分完成 - 状态:完成
- 参数配置 / Parameter Settings - 参数配置 / Parameter Settings
- 路由别名:`SysConfigSetting` - 路由别名:`SysConfigSetting`
- 路径:`cnf/enums/manager/index` - 路径:`cnf/enums/manager/index`
@ -302,7 +359,7 @@
- 状态已完成线程三2026-05-06 - 状态已完成线程三2026-05-06
- 运营日志 / Operations Logs - 运营日志 / Operations Logs
- 路由别名:`operation:log` - 路由别名:`operation:log`
- 状态:部分完成 - 状态:完成
- 礼物赠送记录 / Gift Sending Records - 礼物赠送记录 / Gift Sending Records
- 路由别名:`ContentManagerGiftHistory` - 路由别名:`ContentManagerGiftHistory`
- 路径:`user/gift-history/index` - 路径:`user/gift-history/index`
@ -416,7 +473,7 @@
- 状态已完成线程一2026-05-06 - 状态已完成线程一2026-05-06
- 内购配置 / In-App Purchase Configuration - 内购配置 / In-App Purchase Configuration
- 路由别名:`in:app:purchase:conf` - 路由别名:`in:app:purchase:conf`
- 状态:部分完成 - 状态:完成
- 渠道管理 / Channel Management - 渠道管理 / Channel Management
- 路由别名:`channel:manager` - 路由别名:`channel:manager`
- 路径:`cnf/pay/channel/index` - 路径:`cnf/pay/channel/index`
@ -494,7 +551,7 @@
- 状态已完成线程一2026-05-07 - 状态已完成线程一2026-05-07
- 活动配置 / Activity Configuration - 活动配置 / Activity Configuration
- 路由别名:`Activity:Config` - 路由别名:`Activity:Config`
- 状态:部分完成 - 状态:完成
- 活动管理 / Activity Management - 活动管理 / Activity Management
- 路由别名:`Activity:Manager` - 路由别名:`Activity:Manager`
- 路径:`activity/template-cnf/index` - 路径:`activity/template-cnf/index`
@ -607,7 +664,7 @@
- 状态:已完成 - 状态:已完成
- 用户银行 / User Bank - 用户银行 / User Bank
- 路由别名:`UserBankBalance` - 路由别名:`UserBankBalance`
- 状态:部分完成 - 状态:完成
- 用户银行流水 / User Bank Transactions - 用户银行流水 / User Bank Transactions
- 路由别名:`UserBankRunningWater` - 路由别名:`UserBankRunningWater`
- 路径:`user/bank-balance/running-water/index` - 路径:`user/bank-balance/running-water/index`
@ -795,10 +852,132 @@
- 审批管理 / Approval Management - 审批管理 / Approval Management
- 路由别名:`ApprovalManager` - 路由别名:`ApprovalManager`
- 当前状态:待处理 - 用户头像 / User Avatar
- 路由别名:`AvatatPhotoApproval`
- 路径:`approval/avatar-approval/index`
- 已完成文件:
- `src/views/approval/avatar-approval/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/data/EditUserForm/index.vue`:复核通过
- `src/components/data/AccountHanle/index.vue`:默认警告语属于接口业务内容,按规则保留
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/SysOriginIcon/index.vue`:复核通过
- `src/components/data/UserDeatilsDrawer/index.vue`:复核完成
- 状态已完成线程一2026-05-08
- 用户照片墙 / User Photo Wall
- 路由别名:`PhotoWallApproval`
- 路径:`approval/photo-wall-approval/index`
- 已完成文件:
- `src/views/approval/photo-wall-approval/index.vue`
- 页面私有组件状态:无页面私有组件
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/data/EditUserForm/index.vue`:复核通过
- `src/components/data/UserDeatilsDrawer/index.vue`:复核通过
- 验证结果:`npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态已完成线程一2026-05-08
- 用户昵称 / User Nickname
- 路由别名:`NickNameApproval`
- 路径:`approval/nickname-approval/index`
- 已完成文件:
- `src/views/approval/nickname-approval/index.vue`
- 页面私有组件状态:无页面私有组件
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/SysOriginIcon/index.vue`:复核通过
- `src/components/data/UserDeatilsDrawer/index.vue`:复核通过
- `src/components/data/AccountHanle/index.vue`:仅命中既有接口提交默认警告内容,按保留项处理
- 验证结果:`npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态已完成线程一2026-05-08
- 举报信息 / Reports
- 路由别名:`ReportManagerReport`
- 路径:`approval/report/index`
- 已完成文件:
- `src/views/approval/report/index.vue`
- 页面私有组件状态:无页面私有组件
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/SysOriginIcon/index.vue`:复核通过
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:复核通过
- `src/components/data/UserDeatilsDrawer/index.vue`:复核通过
- `src/components/data/AccountHanle/index.vue`:仅命中既有接口提交默认警告内容,按保留项处理
- 验证结果:`npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态已完成线程二2026-05-08
- 意见反馈 / Feedback
- 路由别名:`user:feedback`
- 路径:`feedback/index`
- 已完成文件:
- `src/views/feedback/index.vue`
- `src/components/data/Feedback/index.vue`
- 页面私有组件状态:无页面私有组件
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/SysOriginIcon/index.vue`:复核通过
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:复核通过
- `src/components/data/UserDeatilsDrawer/index.vue`:复核通过
- `src/components/data/Feedback/index.vue`:已随页面同步完成
- `src/components/videoPlayer/index.vue`:可见倍速文案已完成,剩余中文为注释
- 保留项:`approvalRemarks: '感谢您的反馈意见'` 会作为批量处理备注提交给接口,按提交内容保留
- 验证结果:`npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态已完成线程一2026-05-08
- 用户个性签名 / User Profile Signatures
- 路由别名:`UserProfileDescApproval`
- 路径:`approval/user-profile-desc-approval/index`
- 已完成文件:
- `src/views/approval/user-profile-desc-approval/index.vue`
- 页面私有组件状态:无页面私有组件
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/data/UserDeatilsDrawer/index.vue`:复核通过
- 保留项:
- 模板注释中的“数量”不可见,按注释保留
- `approvalType: 'PROFILE_DESC'``approvalStatus: 'PASS' / 'NOT_PASS'``waitApprovalUser``content: item.profileDesc` 属于接口提交数据,保持原样
- 验证结果:语言文件语法检查通过;`npm run build:prod` 第二次通过,仍保留项目既有 17 个 warning第一次构建因输出目录 `dist\cdn` 偶发 `EEXIST` 失败,重跑后通过
- 状态已完成线程一2026-05-08
- 房间封面 / Room Covers
- 路由别名:`RoomCoverWallApproval`
- 路径:`approval/room-cover-wall-approval/index`
- 已完成文件:
- `src/views/approval/room-cover-wall-approval/index.vue`
- 页面私有组件状态:无页面私有组件
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/data/EditUserForm/index.vue`:复核通过
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/SysOriginIcon/index.vue`:复核通过
- `src/components/data/UserDeatilsDrawer/index.vue`:复核通过
- `src/components/data/AccountHanle/index.vue`:仅命中既有接口提交默认警告内容,按保留项处理
- 保留项:目标页剩余中文仅为注释或注释掉的历史代码,不属于可见展示文案
- 验证结果:语言文件语法校验通过;本轮未使用 `$te``npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态已完成线程二2026-05-08
- 当前状态已完成线程二2026-05-08
- 道具管理 / Prop Management - 道具管理 / Prop Management
- 路由别名:`PropsManager` - 路由别名:`PropsManager`
- 资源配置 / Resource Configuration
- 路由别名:`props:config`
- 路径:`props/props-resource-config/index`
- 已完成文件:
- `src/views/props/props-resource-config/index.vue`
- `src/views/props/props-resource-config/form-edit.vue`
- `src/views/props/props-resource-config/line-graph-charts.vue`
- `src/views/props/props-resource-config/sales-mothly-charts-dialog.vue`
- 页面私有组件状态:`form-edit.vue``line-graph-charts.vue``sales-mothly-charts-dialog.vue` 已随入口页同步完成
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/SysOriginIcon/index.vue`:复核通过
- `src/components/svgaplayer/**`:复核通过
- `src/components/data/PropsSalesOverviewCharts/**`:复核通过
- 保留项:接口字段、接口参数、路由路径、权限码、表单提交值、枚举实际值与接口返回动态数据保持原样;`propsTypes``nobleVipTabs``showcaseTypes` 仅展示 label 映射翻译
- 验证结果:目标文件中文扫描无命中;未使用 `$te`;语言文件语法检查通过;`npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态已完成线程一2026-05-08
- 资源组配置 / Resource Group Configuration - 资源组配置 / Resource Group Configuration
- 路由别名:`PropsActivitySourceGroup` - 路由别名:`PropsActivitySourceGroup`
- 路径:`props/props-source-group/index` - 路径:`props/props-source-group/index`
@ -880,7 +1059,21 @@
- 代理列表 / Agent List - 代理列表 / Agent List
- 路由别名:`team:list` - 路由别名:`team:list`
- 路径:`team/team-list/index` - 路径:`team/team-list/index`
- 状态:待处理 - 文件:`src/views/team/team-list/index.vue`
- 已完成文件:
- `src/views/team/team-list/index.vue`
- `src/views/team/team-list/bind-bd.vue`
- `src/views/team/team-list/team-application-process-drawer.vue`
- `src/views/team/team-list/team-contact.vue`
- `src/views/team/team-list/team-edit.vue`
- `src/views/team/team-list/team-notice-list-drawer.vue`
- `src/views/team/team-list/team-notice-send-drawer.vue`
- `src/views/team/team-list/team-remark.vue`
- `src/views/team/team-list/team-status.vue`
- `src/views/team/team-list/team-switch-own.vue`
- `src/views/team/components/ProcessApprovalDrawer/index.vue`
- 直接公共组件状态:`TeamCreate``TeamDetailsDrawer``SysOriginPermissionSelect` 历史已完成;`SelectSystemRegion``AccountInput``UserTableExhibit` 本轮复核未发现可见中文
- 状态已完成线程二2026-05-08
- 主播成员 / Broadcaster Members - 主播成员 / Broadcaster Members
- 路由别名:`team:member` - 路由别名:`team:member`
- 路径:`team/team-member/index` - 路径:`team/team-member/index`
@ -902,7 +1095,21 @@
- 账单列表 / Bill List - 账单列表 / Bill List
- 路由别名:`team:bill` - 路由别名:`team:bill`
- 路径:`team/team-bill/index` - 路径:`team/team-bill/index`
- 状态:待处理 - 已完成文件:
- `src/views/team/team-bill/index.vue`
- `src/views/team/team-bill/details-drawer.vue`
- `src/views/team/team-bill/team-bill-internal-remark.vue`
- `src/views/team/team-bill/team-bill-remark.vue`
- `src/views/team/team-bill/team-bill-settle.vue`
- `src/views/team/team-bill/team-bill-status.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- 页面私有组件状态:同目录 5 个私有抽屉/弹窗与入口页直接引用的 `TeamDetailsDrawer/index.vue` 已随页面同步完成
- 直接公共组件状态:
- `src/components/data/SysOriginPermissionSelect/index.vue`:复核完成,默认 placeholder 使用展示层 `$t('common.select')`
- `src/components/data/SelectSystemRegion/index.vue`:复核通过
- `src/components/data/AccountInput/index.vue`:复核通过
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:复核通过
- 状态已完成线程一2026-05-08
- 主播工作 / Broadcaster Work - 主播工作 / Broadcaster Work
- 路由别名:`team:member:work` - 路由别名:`team:member:work`
- 路径:`team/team-member-work/index` - 路径:`team/team-member-work/index`
@ -923,8 +1130,11 @@
- `src/components/SysOriginIcon/index.vue`:复核通过 - `src/components/SysOriginIcon/index.vue`:复核通过
- 状态已完成线程二2026-05-07 - 状态已完成线程二2026-05-07
### 当前已完成主要路由摘要 ### 当前主要路由状态总览
- 说明:本段是主要路由完成、进行中与未完成情况的唯一摘要;`翻译进度.md``翻译清单.md` 不再维护第二份主路由摘要。
- 展示规则:完成项不额外标注;仅对 `部分完成``进行中``未完成` 等需要继续关注的项打标;父级标为 `部分完成` 时,必须在其子级中明确标出具体 `进行中``未完成` 页面,避免只看到父级状态而不知道待处理范围。
- 首页 / Dashboard
- 系统管理 / System Management - 系统管理 / System Management
- 用户管理 / User Management - 用户管理 / User Management
- 角色管理 / Role Management - 角色管理 / Role Management
@ -934,7 +1144,7 @@
- 版本管理 / Version Management - 版本管理 / Version Management
- 请求黑名单 / Request Blacklist - 请求黑名单 / Request Blacklist
- 用户管理 / User Management - 用户管理 / User Management
- 用户列表 / User List(页面本体已完成,直接公共组件待联动复核) - 用户列表 / User List
- 用户专属礼物制作 / Custom User Gift Creation - 用户专属礼物制作 / Custom User Gift Creation
- 封禁设备列表 / Blocked Device List - 封禁设备列表 / Blocked Device List
- 最新登记设备 / Latest Registered Devices - 最新登记设备 / Latest Registered Devices
@ -942,6 +1152,10 @@
- 营收支出 / Revenue and Expenses - 营收支出 / Revenue and Expenses
- 消费商品订单 / Purchase Orders - 消费商品订单 / Purchase Orders
- 金币收支记录 / Gold Transaction Records - 金币收支记录 / Gold Transaction Records
- 钻石流水列表 / Diamond Transaction List
- 积分收支记录 / Points Transaction Records
- 金币代理流水 / Gold Agent Transactions
- 钻石余额列表 / Diamond Balance List
- 数据配置 / Data Configuration - 数据配置 / Data Configuration
- 参数配置 / Parameter Settings - 参数配置 / Parameter Settings
- 幸运礼物规则配置 / Lucky Gift Rule Configuration - 幸运礼物规则配置 / Lucky Gift Rule Configuration
@ -1002,7 +1216,16 @@
- 家族管理 / Family Management - 家族管理 / Family Management
- 家族配置 / Family Configuration - 家族配置 / Family Configuration
- 家族列表 / Family List - 家族列表 / Family List
- 审批管理 / Approval Management
- 用户头像 / User Avatar
- 用户照片墙 / User Photo Wall
- 用户昵称 / User Nickname
- 举报信息 / Reports
- 意见反馈 / Feedback
- 用户个性签名 / User Profile Signatures
- 房间封面 / Room Covers
- 道具管理 / Prop Management - 道具管理 / Prop Management
- 资源配置 / Resource Configuration
- 资源组配置 / Resource Group Configuration - 资源组配置 / Resource Group Configuration
- 道具赠送 / Prop Gift - 道具赠送 / Prop Gift
- 道具商店 / Prop Store - 道具商店 / Prop Store
@ -1012,7 +1235,9 @@
- 代理政策 / Agent Policy - 代理政策 / Agent Policy
- BD工作统计 / BD Work Statistics - BD工作统计 / BD Work Statistics
- BD列表 / BD List - BD列表 / BD List
- 代理列表 / Agent List
- 主播成员 / Broadcaster Members - 主播成员 / Broadcaster Members
- 账单列表 / Bill List
- 主播工作 / Broadcaster Work - 主播工作 / Broadcaster Work
### 已部分完成但入口页仍需复核的主要路由 ### 已部分完成但入口页仍需复核的主要路由
@ -1026,7 +1251,8 @@
- 当前无 - 当前无
3. 本文件中“模块部分完成,入口页仍需复核”的页面: 3. 本文件中“模块部分完成,入口页仍需复核”的页面:
- 当前无 - 当前无
4. 本文件中其他待处理主要路由页面 4. 本文件中其他待处理主要路由页面:
- 当前无
## 主要路由 ## 主要路由
@ -2097,6 +2323,17 @@
"id": 305, "id": 305,
"parentId": 0, "parentId": 0,
"childrens": [ "childrens": [
{
"id": 307,
"parentId": 305,
"childrens": [],
"menuName": "资源配置",
"menuType": 2,
"router": "props/config",
"path": "props/props-resource-config/index",
"icon": "sys_manager_2",
"alias": "props:config"
},
{ {
"id": 312, "id": 312,
"parentId": 305, "parentId": 305,

View File

@ -54,7 +54,7 @@
- 每完成一轮修改后,必须同步更新: - 每完成一轮修改后,必须同步更新:
- `docs/i18n/翻译进度.md` - `docs/i18n/翻译进度.md`
- `docs/i18n/翻译清单.md` - `docs/i18n/翻译清单.md`
- 如果完成的是主要路由页面,还必须同步更新 `docs/i18n/主要路由.md` 中该路由的详细状态与“当前已完成主要路由摘要” - 如果完成的是主要路由页面,还必须同步更新 `docs/i18n/主要路由.md` 中该路由的详细状态与“当前主要路由状态总览”;总览中已完成项不额外标注,只对 `部分完成``进行中``未完成` 等需要继续关注的项打标
- `docs/i18n/翻译清单.md` 不再重复维护“已完成主要路由索引”;清单只维护文件级平铺清单、进行中任务、完成记录和保留项,避免两份主路由摘要漂移 - `docs/i18n/翻译清单.md` 不再重复维护“已完成主要路由索引”;清单只维护文件级平铺清单、进行中任务、完成记录和保留项,避免两份主路由摘要漂移
- 判断“独立路由”还是“页面内功能文件”时,统一按以下顺序执行: - 判断“独立路由”还是“页面内功能文件”时,统一按以下顺序执行:
- 先看原始接口返回中该菜单是否是独立菜单项 - 先看原始接口返回中该菜单是否是独立菜单项
@ -180,13 +180,686 @@
| 线程 | 当前状态 | 认领范围 | 说明 | | 线程 | 当前状态 | 认领范围 | 说明 |
| --- | --- | --- | --- | | --- | --- | --- | --- |
| 线程一 | 待分配 | 未认领 | 2026-05-07 已完成主要路由 `钻石提现申请 / Diamond Withdrawal Applications` 入口页、同目录私有抽屉与直接公共组件复核 | | 线程一 | 待分配 | 未认领 | 2026-05-08 已完成主要路由 `资源配置 / Resource Configuration` |
| 线程二 | 待分配 | 未认领 | 2026-05-07 已完成主要路由 `主播成员 / Broadcaster Members` 入口页、同目录私有组件与直接公共组件复核 | | 线程二 | 待分配 | 未认领 | 2026-05-08 已完成主要路由 `房间封面 / Room Covers` |
| 线程三 | 待分配 | 未认领 | 2026-05-07 已完成 `src/views/user/bank-balance/table/**` 用户银行账户页面国际化、同目录私有组件、直接公共组件复核、语言文件校验与构建验证 | | 线程三 | 待分配 | 未认领 | 2026-05-07 已完成 `src/views/user/bank-balance/table/**` 用户银行账户页面国际化、同目录私有组件、直接公共组件复核、语言文件校验与构建验证 |
| 线程四 | 待分配 | 未认领 | 避免和其他线程同时编辑同一语言模块 | | 线程四 | 待分配 | 未认领 | 避免和其他线程同时编辑同一语言模块 |
## 最新认领记录 ## 最新认领记录
- 2026-05-08
- 线程一完成:`src/views/props/props-resource-config/**`
- 对应主要路由:
- 道具管理 / Prop Management
- 资源配置 / Resource Configuration
- 已完成文件:
- `src/views/props/props-resource-config/index.vue`
- `src/views/props/props-resource-config/form-edit.vue`
- `src/views/props/props-resource-config/line-graph-charts.vue`
- `src/views/props/props-resource-config/sales-mothly-charts-dialog.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:复核通过
- `src/components/SysOriginIcon/index.vue`:复核通过
- `src/components/svgaplayer/**`:复核通过
- `src/components/data/PropsSalesOverviewCharts/**`:复核通过
- 保留项:
- `propsTypes``nobleVipTabs``showcaseTypes` 的实际 value 保持原样,仅展示 label 映射翻译
- 接口字段、接口参数、路由路径、权限码、表单提交值、枚举实际值与接口返回动态数据保持原样
- 验证:
- 目标文件中文扫描无命中
- 未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 2026-05-08
- 线程一新认领:`src/views/props/props-resource-config/**`
- 对应主要路由:
- 道具管理 / Prop Management
- 资源配置 / Resource Configuration
- 路由别名:`props:config`
- 路径:`props/props-resource-config/index`
- 范围:
- `src/views/props/props-resource-config/index.vue`
- `src/views/props/props-resource-config/form-edit.vue`
- `src/views/props/props-resource-config/line-graph-charts.vue`
- `src/views/props/props-resource-config/sales-mothly-charts-dialog.vue`
- 约束:
- 仅处理可见静态展示文本
- 不修改接口字段、接口参数、路由路径、权限码、表单提交值、枚举实际值与接口返回动态数据
- 2026-05-08
- 线程一完成:`src/views/approval/user-profile-desc-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户个性签名 / User Profile Signatures
- 本轮完成:
- 页面可见静态文案国际化
- 直接公共组件 `Pagination``AccountInput``UserDeatilsDrawer` 复核无中文命中
- 审批状态仅翻译展示 label`PASS / NOT_PASS / PENDING` 提交值保持原样
- 验证:
- 语言文件语法检查通过
- `npm run build:prod` 第二次通过,仍保留项目既有 17 个 warning
- 第一次构建曾因输出目录 `dist\cdn` 偶发 `EEXIST` 失败,重跑后通过,未发现源码编译错误
- 2026-05-08
- 线程二新认领:`src/views/approval/room-cover-wall-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 房间封面 / Room Covers
- 路由别名:`RoomCoverWallApproval`
- 路径:`approval/room-cover-wall-approval/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已读取 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js`
- 已确认线程一正在处理 `src/views/approval/user-profile-desc-approval/index.vue`,线程二主动避让
- 已确认当前没有其他线程认领 `src/views/approval/room-cover-wall-approval/index.vue`
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``EditUserForm``AccountHanle``AccountInput``SysOriginIcon``UserDeatilsDrawer`
- 同步补充或复用 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语言 key
- 完成后同步更新本文件、`翻译进度.md``翻译清单.md``主要路由.md`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审批类型实际值、审批状态实际值、表单提交值、图片地址、机器标签或接口返回动态数据
- 领取时线程二状态:进行中
- 完成结果:
- 已完成筛选区系统、房间账号、用户 ID、审批状态、日期范围、搜索按钮、卡片信息标签、性别与审批状态展示映射、选择数量、详情、编辑用户、账号处理、通过/拒绝按钮、确认提示与成功提示国际化
- 新增 `pages.roomCoverApproval` 英文与中文语言 key
- 审批状态与性别实际值保持原样,仅在展示层通过 `$t` 映射
- 接口返回的房间封面、机器标签、用户资料、图片地址与动态数据保持原样
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:中文扫描无命中
- `src/components/data/EditUserForm/index.vue`:中文扫描无命中
- `src/components/data/AccountInput/index.vue`:中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:中文扫描无命中
- `src/components/data/UserDeatilsDrawer/index.vue`:中文扫描无命中
- `src/components/data/AccountHanle/index.vue`:仅命中既有接口提交默认警告内容,按保留项处理
- 验证结果:
- 目标页中文扫描仅剩注释或注释掉的历史代码
- 本轮未使用 `$te`
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 完成后线程二状态:待分配
- 2026-05-08
- 线程一新认领:`src/views/approval/user-profile-desc-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户个性签名 / User Profile Signatures
- 路由别名:`UserProfileDescApproval`
- 路径:`approval/user-profile-desc-approval/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已确认当前没有其他线程认领该文件
- 约束:
- 仅处理可见静态展示文本
- 不修改接口字段、接口参数、路由路径、审批类型与提交内容
- 2026-05-08
- 线程一新认领:`src/views/feedback/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 意见反馈 / Feedback
- 路由别名:`user:feedback`
- 路径:`feedback/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已读取 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js`
- 已核对侧边栏英文名来自 `src/lang/messages/base/menu-en.js`
- 已确认线程二当前认领 `src/views/approval/report/index.vue`,线程一主动避让
- 已检查目录仅存在入口页 `index.vue`
- 已确认当前没有其他线程认领该文件
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``AccountInput``SysOriginIcon``UserTableExhibit``UserDeatilsDrawer``Feedback``VideoPlayer`
- 同步补充或复用 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语言 key
- 完成后同步更新本文件、`翻译进度.md``翻译清单.md``主要路由.md`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审核状态实际值、批量处理提交内容、表单提交值或接口返回动态数据
- 领取时线程一状态:进行中
- 完成结果:
- 已完成入口页筛选区、表格展开详情标签、表格列头、状态展示、操作按钮、批量处理提示与成功提示国际化
- 已完成直接公共组件 `src/components/data/Feedback/index.vue` 的抽屉标题、表单标签与提交按钮国际化
- 已完成直接公共组件 `src/components/videoPlayer/index.vue` 可见倍速文案国际化
- 已补充 `pages.feedback``pages.videoPlayer` 英文和中文语言 key
- `approvalStatusArray`、接口查询字段、批量处理提交字段、接口返回动态数据保持原样,仅在展示层做翻译映射
- 保留项:
- `src/views/feedback/index.vue``approvalRemarks: '感谢您的反馈意见'` 会作为批量处理备注提交给接口,按提交内容保留
- `src/components/videoPlayer/index.vue` 剩余中文均为注释,不属于可见展示文案
- 验证结果:
- 目标页中文扫描仅剩提交内容
- 直接公共组件中文扫描仅剩注释
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08
- 线程二新认领:`src/views/approval/report/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 举报信息 / Reports
- 路由别名:`ReportManagerReport`
- 路径:`approval/report/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已读取 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js`
- 已核对侧边栏英文名来自 `src/lang/messages/base/menu-en.js`,本轮使用 `Reports`
- 已发现线程一当前认领 `src/views/approval/nickname-approval/index.vue`,线程二主动避让
- 已检查目录仅存在入口页 `index.vue`
- 已确认当前没有其他线程认领 `src/views/approval/report/index.vue`
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``AccountHanle`
- 同步补充或复用 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语言 key
- 完成后同步更新本文件、`翻译进度.md``翻译清单.md``主要路由.md`
- 完成后按用户要求处理 `翻译进度.md` 中重复的主要路由完成摘要,将主路由完成摘要统一收口到 `主要路由.md`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审批状态实际值、举报类型实际值、批量审批提交值、表单提交值或接口返回动态数据
- 领取时线程二状态:进行中
- 完成结果:
- 已完成筛选区系统/状态/举报类型/举报人/被举报人/日期/后台成员、搜索按钮、展开行标签、表格列头、操作按钮、操作说明、已勾选数量、有效/无效按钮、确认提示与复制提示国际化
- 新增 `pages.userReportApproval` 英文与中文语言 key
- 审批状态与举报类型实际值保持原样,仅在展示层通过 `$t` 映射
- 接口返回的 `reportTypeName``reportedContent``updateNickname`、媒体 URL 与用户资料保持原样
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:中文扫描无命中
- `src/components/data/AccountInput/index.vue`:中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:中文扫描无命中
- `src/components/data/UserDeatilsDrawer/index.vue`:中文扫描无命中
- `src/components/data/AccountHanle/index.vue`:仅命中既有接口提交默认警告内容,按保留项处理
- 验证结果:
- 目标页中文扫描无命中
- 本轮未使用 `$te`
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- `npm run build:prod` 构建通过,仍为项目既有 `17` 条 warning
- 完成后线程二状态:待分配
- 2026-05-08
- 线程一新认领:`src/views/approval/nickname-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户昵称 / User Nickname
- 路由别名:`NickNameApproval`
- 路径:`approval/nickname-approval/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已读取 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js`
- 已核对侧边栏英文名来自 `src/lang/messages/base/menu-en.js`
- 已检查目录仅存在入口页 `index.vue`
- 已确认当前没有其他线程认领该文件
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``AccountInput``SysOriginIcon``UserDeatilsDrawer``AccountHanle`
- 同步补充或复用 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语言 key
- 完成后同步更新本文件、`翻译进度.md``翻译清单.md``主要路由.md`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审批状态实际值、表单提交值或接口返回动态数据
- 领取时线程一状态:进行中
- 完成结果:
- 已完成入口页筛选区、日期占位、审批状态下拉展示映射、搜索按钮、表格列头、操作按钮、批量审批按钮、确认提示与成功提示国际化
- 已补充 `pages.userNicknameApproval` 英文与中文语言 key
- 已对直接公共组件执行中文扫描复核;`AccountHanle` 仅命中既有接口提交默认警告内容,按保留项处理
- `commonApprovalStatus` 常量实际值、接口查询字段、审批提交字段与接口返回动态数据保持原样,仅在展示层做翻译映射
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描仅命中 `AccountHanle` 既有接口提交默认警告内容
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08
- 线程一新认领:`src/views/approval/photo-wall-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户照片墙 / User Photo Wall
- 路由别名:`PhotoWallApproval`
- 路径:`approval/photo-wall-approval/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已读取 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js`
- 已核对侧边栏英文名来自 `src/lang/messages/base/menu-en.js`
- 已检查目录仅存在入口页 `index.vue`
- 已确认当前没有其他线程认领该文件
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``AccountInput``EditUserForm``UserDeatilsDrawer`
- 同步补充或复用 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语言 key
- 完成后同步更新本文件、`翻译进度.md``翻译清单.md``主要路由.md`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审批状态实际值、性别实际值、表单提交值或接口返回动态数据
- 领取时线程一状态:进行中
- 完成结果:
- 已完成入口页筛选区、日期占位、状态/性别下拉展示映射、搜索按钮、卡片信息标签、选择文案、编辑用户按钮、批量审批按钮、确认提示与成功提示国际化
- 已补充 `pages.userPhotoWallApproval` 英文与中文语言 key
- 已对直接公共组件执行中文扫描复核,未发现需处理中文展示文本
- `approvalStatus``genders` 常量实际值、接口查询字段、审批提交字段与接口返回动态数据保持原样,仅在展示层做翻译映射
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08
- 线程一新认领:`src/views/user/diamond-balance/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 营收支出 / Revenue and Expenses
- 钻石余额列表 / Diamond Balance List
- 路由别名:`User:Diamond:Balance`
- 路径:`user/diamond-balance/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已核对侧边栏英文名来自 `src/lang/messages/base/menu-en.js`
- 已检查目录仅存在入口页 `index.vue`
- 已确认当前没有其他线程认领该文件
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``AccountInput``UserTableExhibit``UserDeatilsDrawer`
- 同步补充或复用 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语言 key
- 完成后同步更新本文件、`翻译进度.md``翻译清单.md``主要路由.md`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、提交值或接口返回动态数据
- 领取时线程一状态:进行中
- 完成结果:
- 已完成入口页用户 ID placeholder、搜索按钮、表格列头国际化
- 已补充 `pages.userDiamondBalance` 英文与中文语言 key
- 已将余额列 `min-width` 调整为 120避免英文列名空间过窄
- 已对直接公共组件执行中文扫描复核,未发现需处理中文展示文本
- 接口查询字段、表格 `prop`、路由路径、权限码、提交值与接口返回动态数据保持原样
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08
- 线程一新认领:`src/views/user/freight-info-list/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 营收支出 / Revenue and Expenses
- 金币代理流水 / Gold Agent Transactions
- 路由别名:`UserFreightInfoList`
- 路径:`user/freight-info-list/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已核对侧边栏英文名来自 `src/lang/messages/base/menu-en.js`
- 已检查目录仅存在入口页 `index.vue`
- 已确认当前没有其他线程认领该文件
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``SysOriginIcon``AccountInput``UserTableExhibit`
- 同步补充或复用 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语言 key
- 完成后同步更新本文件、`翻译进度.md``翻译清单.md``主要路由.md`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、提交值、接口返回动态数据、导出文件名或 `freightBalanceOrigin` 常量实际值
- 领取时线程一状态:进行中
- 完成结果:
- 已完成入口页筛选区、表格列头、收支类型、导出抽屉、校验提示与导出提示国际化
- 已补充 `pages.userFreightInfoList` 英文与中文语言 key
- 已对直接公共组件执行中文扫描复核,未发现需处理中文展示文本
- `freightBalanceOrigin` 常量实际值、接口查询字段、提交值与导出文件名保持原样,仅在下拉展示层做翻译映射
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08
- 线程一新认领:`src/views/user/integral-stream/**`
- 对应主要路由:
- 运营管理 / Operations Management
- 营收支出 / Revenue and Expenses
- 积分收支记录 / Points Transaction Records
- 路由别名:`IntegralStream`
- 路径:`user/integral-stream/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已检查 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 中暂无现成 `integralStream` 页面 key
- 已确认当前没有其他线程认领该文件组
- 本轮范围:
- `src/views/user/integral-stream/index.vue`
- `src/views/user/integral-stream/timely/index.vue`
- `src/views/user/integral-stream/history/index.vue`
- 直接公共组件复核:`Pagination``AccountInput``UserDeatilsDrawer`
- 同步补充或复用 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语言 key
- 完成后同步更新本文件、`翻译进度.md``翻译清单.md``主要路由.md`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、提交值、接口返回动态数据或 `videoOrigin` 常量实际值
- 领取时线程一状态:进行中
- 完成结果:
- 已完成入口 tab 页、当前积分流水页与历史积分流水页静态展示文本国际化
- 已补充 `pages.integralStream` 英文与中文语言 key
- 已对直接公共组件执行中文扫描复核,未发现需处理中文展示文本
- `videoOrigin` 常量实际值、接口查询字段与提交值保持原样,仅在下拉展示层做翻译映射
- 保留项:
- `src/views/user/integral-stream/timely/index.vue``src/views/user/integral-stream/history/index.vue` 文件首行中文仅为注释,不参与页面展示,按规则保留
- 验证结果:
- 目标模块中文扫描仅剩注释中文
- 直接公共组件中文扫描无命中
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08
- 线程一新认领:`src/views/user/diamond-run-water/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 营收支出 / Revenue and Expenses
- 钻石流水列表 / Diamond Transaction List
- 路由别名:`User:Diamond:Run:Water`
- 路径:`user/diamond-run-water/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已读取 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js`
- 已确认当前没有其他线程认领该文件
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``SysOriginIcon``AccountInput``UserTableExhibit``UserDeatilsDrawer`
- 同步补充或复用 `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语言 key
- 完成后同步更新本文件、`翻译进度.md``翻译清单.md``主要路由.md`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、提交值、接口返回动态数据或 `diamondOrigins` 常量实际值
- 领取时线程一状态:进行中
- 完成结果:
- 已完成入口页静态展示文本国际化
- 已补充 `pages.userDiamondRunWater` 英文与中文语言 key
- 已对直接公共组件执行中文扫描复核,未发现需处理中文展示文本
- `diamondOrigins` 常量实际值、接口查询字段与提交值保持原样,仅在下拉展示层做翻译映射
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08
- 线程一已完成:已完成主要路由页面的直接公共组件联动复查最终收口
- 任务类型:临时任务收口
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已确认 `docs/i18n/主要路由.md` 中当前没有页面级 `状态:待处理`
- 已确认 `docs/i18n/翻译清单.md` 中“当前扫描到仍需复核的已完成页面 -> 直接公共组件”为空
- 本轮目标:
- 最终确认直接公共组件联动复查无剩余明确可处理项
- 若确认无剩余项,将 `docs/i18n/翻译清单.md``docs/i18n/主要路由.md` 中该临时任务标记为已完成
- 本轮不修改:
- 源码逻辑、接口参数、查询字段、路由路径、权限码、表单提交值或接口返回动态数据
- 最终复核结论:
- `docs/i18n/翻译清单.md` 中“当前扫描到仍需复核的已完成页面 -> 直接公共组件”为空
- `docs/i18n/主要路由.md` 中除本临时任务外没有页面级 `状态:待处理`
- 对已登记完成的直接公共组件再次扫描后,中文命中仅剩注释、已注释代码,或 `src/components/data/AccountHanle/index.vue` 中提交给接口的默认警告内容
- `src/components/data/UserRegistrationOverviewCharts/index.vue` 命中的“系统”位于已注释旧筛选代码中,不参与页面展示
- 状态变更:
- `docs/i18n/翻译清单.md` 中该临时任务已标记为已完成
- `docs/i18n/主要路由.md` 中“当前跨已完成页面的公共组件联动复查”已标记为已完成
- 完成后线程一状态:待分配
- 2026-05-08
- 线程二已完成:`src/views/team/team-list/**`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- 代理列表 / Agent List
- 路由别名:`team:list`
- 路径:`team/team-list/index`
- 领取与处理动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已确认当前没有其他线程认领 `src/views/team/team-list/index.vue`
- 已完成文件:
- `src/views/team/team-list/index.vue`
- `src/views/team/team-list/bind-bd.vue`
- `src/views/team/team-list/team-application-process-drawer.vue`
- `src/views/team/team-list/team-contact.vue`
- `src/views/team/team-list/team-edit.vue`
- `src/views/team/team-list/team-notice-list-drawer.vue`
- `src/views/team/team-list/team-notice-send-drawer.vue`
- `src/views/team/team-list/team-remark.vue`
- `src/views/team/team-list/team-status.vue`
- `src/views/team/team-list/team-switch-own.vue`
- `src/views/team/components/ProcessApprovalDrawer/index.vue`
- 直接公共组件状态:
- `src/views/team/components/TeamCreate/index.vue`:历史已完成,本轮复核引用
- `src/views/team/components/TeamDetailsDrawer/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/SysOriginPermissionSelect/index.vue`:历史已完成
- `src/components/data/SelectSystemRegion/index.vue`:本轮复核未发现可见中文
- `src/components/data/AccountInput/index.vue`:本轮复核未发现可见中文
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:本轮复核未发现可见中文
- 说明:
- 仅处理可见静态展示文案,不改接口参数、查询字段、路由路径、权限码、枚举实际值、表单提交值或接口返回动态数据
- 已完成内容:
- 入口页筛选区、表格列头、状态展示、操作菜单、加载更多、无权限提示、删除确认与提交中提示已国际化
- 绑定 BD、团队申请、联系方式、修改资料、通知记录、发送通知、备注、状态变更、更换团长、申请日志抽屉/弹窗已国际化
- 新增 `pages.teamList`,所有状态、申请原因和审核日志原因均按原枚举 value 做展示层映射
- 验证结果:
- 目标范围中文扫描仅剩注释或已注释代码,不属于可见展示文案
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- `npm run build:prod` 通过,仍为项目既有 `17` 条 warning
- 带 `NODE_OPTIONS=--openssl-legacy-provider` 的构建在当前 Node 下被拒绝,已改用普通构建命令验证通过
- 完成后线程二状态:待分配
- 2026-05-08
- 线程一已完成:`src/views/user/user-table/index.vue` 直接公共组件最终复核
- 对应主要路由:
- 用户管理 / User Management
- 用户列表 / User List
- 路由别名:`AppUserList`
- 路径:`user/user-table/index`
- 领取与复核动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已确认当前没有其他线程认领 `src/views/user/user-table/index.vue` 或其直接公共组件收口复核
- 复核范围包括:
- `src/views/user/user-table/index.vue`
- `src/components/Pagination/index.vue`
- `src/components/PlatformSvgIcon/index.vue`
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- `src/components/data/GoldRunningWaterDialog/index.vue`
- `src/components/data/DiamondRunningWaterDialog/index.vue`
- `src/components/data/DiamondSalaryRunningWaterDialog/index.vue`
- `src/components/data/AccountHanle/index.vue`
- `src/components/data/IpDeviceHandle/index.vue`
- `src/components/data/UserVideoViolationTableDialog/index.vue`
- `src/components/data/EditUserForm/index.vue`
- `src/components/data/EditUserGoldCoinDeductionForm/index.vue`
- `src/components/data/EditUserGoldCoinRewardForm/index.vue`
- `src/components/data/EditDiamondCoinDeductionForm/index.vue`
- `src/components/data/EditUserDiamondRewardForm/index.vue`
- `src/components/data/EditUserGameCouponRewardForm/index.vue`
- `src/components/data/EditUserGameCouponDeductionForm/index.vue`
- `src/components/data/UserAccountStatusLogDrawer/index.vue`
- `src/components/data/AddOtherRecharge/index.vue`
- `src/components/data/AddOtherRechargeDialog/index.vue`
- `src/components/data/UserAuthForm/index.vue`
- `src/components/data/UserInfo/BankCardDrawer/index.vue`
- `src/components/data/UserRegistrationOverviewCharts/dialog.vue`
- `src/components/data/UserRegistrationOverviewCharts/index.vue`
- `src/components/data/UserRegistrationOverviewCharts/bar-graph-charts.vue`
- 说明:
- 本轮目标是关闭 `用户列表 / User List``主要路由.md` 中“页面本体已完成,直接公共组件待联动复核”的状态
- 仅复核/处理可见静态展示文案,不改接口参数、查询字段、路由路径、权限码、表单提交值或接口返回动态数据
- 复核结论:
- 入口页与直接公共组件没有需要继续处理的可见静态中文
- `src/views/user/user-table/index.vue` 命中的中文为注释或已注释代码,不参与页面展示
- `src/components/data/GoldRunningWaterDialog/index.vue``src/components/data/UserVideoViolationTableDialog/index.vue``src/components/data/EditUserGoldCoinRewardForm/index.vue` 命中的中文为注释,不参与页面展示
- `src/components/data/UserRegistrationOverviewCharts/index.vue` 命中的“系统”位于已注释的旧筛选代码中,不参与页面展示
- `src/components/data/AccountHanle/index.vue` 默认警告语属于提交给接口的业务内容,按“不要更改接口参数和提交值”规则保留
- 验证结果:
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 本轮未修改源码,仅更新协作文档状态
- 完成后线程一状态:待分配
- 2026-05-08
- 线程一已完成:`src/views/approval/avatar-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户头像 / User Avatar
- 路由别名:`AvatatPhotoApproval`
- 路径:`approval/avatar-approval/index`
- 已完成文件:
- `src/views/approval/avatar-approval/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 已完成内容:
- 筛选区、日期选择、性别/审批状态展示映射、选择文案、用户信息卡片按钮、批量审批按钮、确认提示、操作成功/失败提示等可见静态文案已国际化
- 新增 `pages.userAvatarApproval`
- 补充 `pages.userDetailsDrawer.title` 与无权限提示文案
- 审批类型、审批状态、性别、权限码和提交给接口的实际值保持原样,仅在展示层通过 `$t` 映射
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:本轮复核中文扫描无命中
- `src/components/data/EditUserForm/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountHanle/index.vue`:历史已完成;默认警告语属于提交给接口的业务内容,按规则保留
- `src/components/data/AccountInput/index.vue`:本轮复核中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:本轮复核中文扫描无命中
- `src/components/data/UserDeatilsDrawer/index.vue`:本轮补充抽屉标题、无权限提示与照片墙 tab 语言 key
- 验证结果:
- 目标范围中文残留仅剩 `src/components/data/AccountHanle/index.vue` 默认警告语,属于接口业务内容
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 本轮改动未使用 `$te`
- `npm run build:prod` 通过,仍为项目既有 `17` 条 warning
- 未修改:
- 接口参数、查询字段、路由路径、权限码、审批类型实际值、审批状态实际值、性别实际值、表单提交值或接口返回动态数据
- 线程一本轮完成后切回待分配
- 2026-05-08
- 线程一已新认领:`src/views/approval/avatar-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户头像 / User Avatar
- 路由别名:`AvatatPhotoApproval`
- 路径:`approval/avatar-approval/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已确认当前没有其他线程认领 `src/views/approval/avatar-approval/index.vue`
- 认领范围包括:
- `src/views/approval/avatar-approval/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/data/EditUserForm/index.vue`
- `src/components/data/AccountHanle/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 说明:
- 仅处理可见静态展示文案,不改接口参数、查询字段、路由路径、权限码、审批类型实际值、审批状态实际值、性别实际值、表单提交值或接口返回动态数据
- `src/components/data/AccountHanle/index.vue` 中默认警告内容属于提交给接口的业务内容,保持原值
- 领取时线程一状态:进行中
- 2026-05-08
- 线程一已完成:`src/views/team/team-bill/**`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- 账单列表 / Bill List
- 路由别名:`team:bill`
- 路径:`team/team-bill/index`
- 已完成文件:
- `src/views/team/team-bill/index.vue`
- `src/views/team/team-bill/details-drawer.vue`
- `src/views/team/team-bill/team-bill-internal-remark.vue`
- `src/views/team/team-bill/team-bill-remark.vue`
- `src/views/team/team-bill/team-bill-settle.vue`
- `src/views/team/team-bill/team-bill-status.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- 已完成内容:
- 筛选区、导出抽屉、表格列头、状态/结算类型展示映射、详情抽屉、备注抽屉、状态变更抽屉、结算抽屉、校验提示与操作提示等可见静态文案已国际化
- 新增 `pages.teamBill`
- 账单状态和结算类型仍使用原接口实际值,仅在展示层通过 `$t` 映射文案
- 页面私有组件状态:
- 同目录 5 个私有抽屉/弹窗已随入口页同步完成
- `src/views/team/components/TeamDetailsDrawer/index.vue` 历史已完成,本轮复核中文扫描无命中
- 直接公共组件状态:
- `src/components/data/SysOriginPermissionSelect/index.vue`:默认 placeholder 改为展示层 `$t('common.select')`,未改传参逻辑
- `src/components/data/SelectSystemRegion/index.vue`:本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:本轮复核中文扫描无命中
- 验证结果:
- `src/views/team/team-bill/*.vue` 中文残留仅在已注释的历史模板块中,不属于可见展示文案
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 本轮改动未使用 `$te`
- `npm run build:prod` 通过,仍为项目既有 `17` 条 warning
- 未修改:
- 接口参数、查询字段、路由路径、权限码、账单状态实际值、结算类型实际值、工资计算值、表单提交值或接口返回动态数据
- 线程一本轮完成后切回待分配
- 2026-05-08
- 线程一已新认领:`src/views/team/team-bill/**`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- 账单列表 / Bill List
- 路由别名:`team:bill`
- 路径:`team/team-bill/index`
- 领取前动作:
- 已重新读取 `docs/i18n/线程协作.md`
- 已重新读取 `docs/i18n/翻译进度.md`
- 已重新读取 `docs/i18n/翻译清单.md`
- 已重新读取 `docs/i18n/主要路由.md`
- 已重新读取 `src/lang/messages/pages/en.js`
- 已重新读取 `src/lang/messages/pages/zh.js`
- 已确认当前没有其他线程认领 `src/views/team/team-bill/**`
- 认领范围包括:
- `src/views/team/team-bill/index.vue`
- `src/views/team/team-bill/details-drawer.vue`
- `src/views/team/team-bill/team-bill-internal-remark.vue`
- `src/views/team/team-bill/team-bill-remark.vue`
- `src/views/team/team-bill/team-bill-settle.vue`
- `src/views/team/team-bill/team-bill-status.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- 直接公共组件复核:
- `src/components/data/SysOriginPermissionSelect/index.vue`
- `src/components/data/SelectSystemRegion/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- 说明:
- 仅处理可见静态展示文案,不改接口参数、查询字段、路由路径、权限码、账单状态实际值、结算状态实际值、工资计算值、表单提交值或接口返回动态数据
- 领取时线程一状态:进行中
- 2026-05-07 - 2026-05-07
- 线程一已完成:`src/views/user/bank-balance/withdraw-diamond-apply/**` - 线程一已完成:`src/views/user/bank-balance/withdraw-diamond-apply/**`
- 对应主要路由: - 对应主要路由:
@ -6177,7 +6850,7 @@
8. 如果需要新增公共 key优先使用已有命名体系避免同义重复 key 8. 如果需要新增公共 key优先使用已有命名体系避免同义重复 key
9. 修改完成后先本地构建验证 9. 修改完成后先本地构建验证
10. 把结果同步写入 `翻译进度.md``翻译清单.md` 10. 把结果同步写入 `翻译进度.md``翻译清单.md`
11. 如果本轮完成主要路由页面,只更新 `主要路由.md` 的主路由详细状态与“当前已完成主要路由摘要”;不要在 `翻译清单.md` 里重复维护主路由索引 11. 如果本轮完成主要路由页面,只更新 `主要路由.md` 的主路由详细状态与“当前主要路由状态总览”;总览中已完成项不额外标注,不要在 `翻译清单.md` 里重复维护主路由索引
12. 在线程认领表里把状态改为“已完成”或“阻塞” 12. 在线程认领表里把状态改为“已完成”或“阻塞”
13. 后续不要再新认领非主要路由页面;已经处理过的非主要路由保持现状即可 13. 后续不要再新认领非主要路由页面;已经处理过的非主要路由保持现状即可

View File

@ -3,8 +3,8 @@
## 文档定位 ## 文档定位
- 本文件只负责维护文件级待办、进行中、已完成与当前认领状态 - 本文件只负责维护文件级待办、进行中、已完成与当前认领状态
- 需要看主要路由的完整父子级结构、路由别名、路径、入口文件、完成状态与已完成主要路由摘要时,统一查看 `docs/i18n/主要路由.md` - 需要看主要路由的完整父子级结构、路由别名、路径、入口文件、完成状态、进行中项与未完成项时,统一查看 `docs/i18n/主要路由.md`
- 本文件不再重复维护“已完成主要路由索引”,避免和 `docs/i18n/主要路由.md` 的主路由摘要在多线程写入时漂移 - 本文件不再重复维护“主要路由状态总览”,避免和 `docs/i18n/主要路由.md` 的主路由摘要在多线程写入时漂移
- 文档中的英文路由名需要与侧边栏实际语言包 `src/lang/messages/base/menu-en.js` 保持一致;如有差异,以 `menu-en.js` 为准 - 文档中的英文路由名需要与侧边栏实际语言包 `src/lang/messages/base/menu-en.js` 保持一致;如有差异,以 `menu-en.js` 为准
- 注意 `src/lang/messages/en.js` 顶层旧中文 key 会在运行时覆盖 `menu-en.js` 的同名 key统一路由英文名时需要同步检查并消除这类重复覆盖 - 注意 `src/lang/messages/en.js` 顶层旧中文 key 会在运行时覆盖 `menu-en.js` 的同名 key统一路由英文名时需要同步检查并消除这类重复覆盖
- 需要看阶段成果、构建验证与时间线时,统一查看 `docs/i18n/翻译进度.md` - 需要看阶段成果、构建验证与时间线时,统一查看 `docs/i18n/翻译进度.md`
@ -65,8 +65,8 @@
### 已完成主要路由索引 ### 已完成主要路由索引
- 本段不再重复维护主路由完成索引。 - 本段不再重复维护主路由完成索引或状态总览
- 已完成主要路由摘要、父子级结构、路由别名、路径、入口文件与完成状态,统一以 `docs/i18n/主要路由.md` 为准。 - 主要路由完成 / 进行中 / 未完成摘要、父子级结构、路由别名、路径、入口文件与完成状态,统一以 `docs/i18n/主要路由.md` 为准。
- 本文件只继续维护下方“已完成文件平铺清单”、进行中任务、最新同步记录和文件级保留项。 - 本文件只继续维护下方“已完成文件平铺清单”、进行中任务、最新同步记录和文件级保留项。
### 已完成文件平铺清单 ### 已完成文件平铺清单
@ -150,6 +150,12 @@
- `src/views/game/lucky-gift/probability-config/index.vue` - `src/views/game/lucky-gift/probability-config/index.vue`
- `src/views/order/candy/purchasing/index.vue` - `src/views/order/candy/purchasing/index.vue`
- `src/views/order/candy/running-water/index.vue` - `src/views/order/candy/running-water/index.vue`
- `src/views/user/diamond-run-water/index.vue`
- `src/views/user/diamond-balance/index.vue`
- `src/views/user/integral-stream/index.vue`
- `src/views/user/integral-stream/timely/index.vue`
- `src/views/user/integral-stream/history/index.vue`
- `src/views/user/freight-info-list/index.vue`
- `src/components/data/UserInfo/BaseInfo/index.vue` - `src/components/data/UserInfo/BaseInfo/index.vue`
- `src/views/room/profile/index.vue` - `src/views/room/profile/index.vue`
- `src/views/room/profile/room-active-charts.vue` - `src/views/room/profile/room-active-charts.vue`
@ -194,6 +200,17 @@
- `src/views/team/team-member/team-member-target-reset.vue` - `src/views/team/team-member/team-member-target-reset.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue` - `src/views/team/components/TeamDetailsDrawer/index.vue`
- `src/views/team/components/TeamCreate/index.vue` - `src/views/team/components/TeamCreate/index.vue`
- `src/views/team/team-list/index.vue`
- `src/views/team/team-list/bind-bd.vue`
- `src/views/team/team-list/team-application-process-drawer.vue`
- `src/views/team/team-list/team-contact.vue`
- `src/views/team/team-list/team-edit.vue`
- `src/views/team/team-list/team-notice-list-drawer.vue`
- `src/views/team/team-list/team-notice-send-drawer.vue`
- `src/views/team/team-list/team-remark.vue`
- `src/views/team/team-list/team-status.vue`
- `src/views/team/team-list/team-switch-own.vue`
- `src/views/team/components/ProcessApprovalDrawer/index.vue`
- `src/views/team/diamond-policy/index.vue` - `src/views/team/diamond-policy/index.vue`
- `src/views/team/diamond-policy/props-form-edit.vue` - `src/views/team/diamond-policy/props-form-edit.vue`
- `src/components/data/AccountHanle/index.vue` - `src/components/data/AccountHanle/index.vue`
@ -319,37 +336,379 @@
- `src/views/user/bank-balance/withdraw-money-apply/index.vue` - `src/views/user/bank-balance/withdraw-money-apply/index.vue`
- `src/views/user/bank-balance/withdraw-money-apply/approval-drawer.vue` - `src/views/user/bank-balance/withdraw-money-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-money-apply/details-drawer.vue` - `src/views/user/bank-balance/withdraw-money-apply/details-drawer.vue`
- `src/views/approval/photo-wall-approval/index.vue`
- `src/views/approval/nickname-approval/index.vue`
- `src/views/feedback/index.vue`
- `src/components/data/Feedback/index.vue`
- `src/views/approval/room-cover-wall-approval/index.vue`
- 表格展示适配:表头自动换行 + 默认最小宽度补齐 - 表格展示适配:表头自动换行 + 默认最小宽度补齐
- 表格展示适配:表头 `.cell` 高度自适应 + 纵向居中修正 - 表格展示适配:表头 `.cell` 高度自适应 + 纵向居中修正
- 表单展示适配:标题纵向居中 - 表单展示适配:标题纵向居中
## 进行中 ## 进行中
- 线程一:待分配 - 线程一:当前无进行中任务,待分配
- 主要路由:钻石提现申请 / Diamond Withdrawal Applications - 上一轮已完成:主要路由页面 / 道具管理 / 资源配置 / Resource Configuration
- 路由别名:`UserBankWithdrawDiamondApply`
- 路径:`user/bank-balance/withdraw-diamond-apply/index`
- 已完成文件:
- `src/views/user/bank-balance/withdraw-diamond-apply/index.vue`
- `src/views/user/bank-balance/withdraw-diamond-apply/approval-drawer.vue`
- `src/views/user/bank-balance/withdraw-diamond-apply/details-drawer.vue`
- 直接公共组件复核:
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- `src/components/upload-image/index.vue`
- 验证结果:
- 中文残留仅剩银行卡复制文本,不属于可见展示文案
- 语言文件语法校验通过
- `npm run build:prod` 通过,仍为项目既有 `17` 条 warning
- 说明:
- 仅处理可见静态展示文案,不改接口参数、查询字段、路由路径、权限码、审核状态实际值、接收方式实际值、银行卡类型实际值、复制内容结构或接口返回动态数据
- 线程二:当前无进行中任务,待分配 - 线程二:当前无进行中任务,待分配
- 线程三:当前无进行中任务,待分配 - 线程三:当前无进行中任务,待分配
## 2026-05-07 最新同步 ## 2026-05-08 最新同步
- 线程一已完成:主要路由页面 / 道具管理 / 资源配置
- 文件:
- `src/views/props/props-resource-config/index.vue`
- `src/views/props/props-resource-config/form-edit.vue`
- `src/views/props/props-resource-config/line-graph-charts.vue`
- `src/views/props/props-resource-config/sales-mothly-charts-dialog.vue`
- 语言 key新增 `pages.propsResourceConfig`
- 直接公共组件复核:`Pagination``SysOriginIcon``svgaplayer``PropsSalesOverviewCharts` 无中文命中
- 保留:接口字段、接口参数、路由路径、权限码、表单提交值、枚举实际值与接口返回动态数据
- 验证:目标文件中文扫描无命中;未使用 `$te`;语言文件语法检查通过;`npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 线程一新认领:主要路由页面 / 道具管理 / 资源配置
- 文件范围:`src/views/props/props-resource-config/**`
- 目标:入口页、编辑表单、折线图、月销售弹窗的可见静态文本国际化
- 保留:接口字段、接口参数、路由路径、权限码、表单提交值、枚举实际值与接口返回动态数据
- 线程一已完成:主要路由页面 / 审批管理 / 用户个性签名
- 文件:`src/views/approval/user-profile-desc-approval/index.vue`
- 直接公共组件复核:`Pagination``AccountInput``UserDeatilsDrawer` 无中文命中
- 接口相关保留:`PROFILE_DESC``PASS``NOT_PASS``waitApprovalUser``content: item.profileDesc`
- 验证:语言文件语法检查通过;`npm run build:prod` 第二次通过,仍保留项目既有 17 个 warning
- 备注:第一次构建曾因输出目录 `dist\cdn` 偶发 `EEXIST` 失败,重跑后通过
- 线程二已完成:主要路由页面 / 审批管理 / 房间封面
- 路由别名:`RoomCoverWallApproval`
- 路径:`approval/room-cover-wall-approval/index`
- 已完成文件:
- `src/views/approval/room-cover-wall-approval/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:中文扫描无命中
- `src/components/data/EditUserForm/index.vue`:中文扫描无命中
- `src/components/data/AccountInput/index.vue`:中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:中文扫描无命中
- `src/components/data/UserDeatilsDrawer/index.vue`:中文扫描无命中
- `src/components/data/AccountHanle/index.vue`:仅命中既有接口提交默认警告内容,按保留项处理
- 已完成内容:
- 筛选区、日期范围、搜索按钮、卡片信息标签、状态与性别展示映射、选择数量、详情、编辑用户、账号处理、通过/拒绝按钮、确认提示与成功提示已国际化
- 新增 `pages.roomCoverApproval` 中英文语言 key
- 审批状态与性别实际值保持原样,仅在展示层映射翻译
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审批类型实际值、审批状态实际值、表单提交值、图片地址、机器标签或接口返回动态数据
- 验证结果:
- 目标页中文扫描仅剩注释或注释掉的历史代码
- 本轮未使用 `$te`
- 语言文件语法校验通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态:已完成,线程二已切回待分配
- 线程一已完成:主要路由页面 / 审批管理 / 意见反馈
- 路由别名:`user:feedback`
- 路径:`feedback/index`
- 已完成文件:
- `src/views/feedback/index.vue`
- `src/components/data/Feedback/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- `src/components/data/Feedback/index.vue`:已随页面同步完成
- `src/components/videoPlayer/index.vue`:可见倍速文案已完成,剩余中文为注释
- 已完成内容:
- 筛选区、表格展开详情标签、表格列头、状态展示、操作按钮、批量处理提示与成功提示已国际化
- 新增 `pages.feedback``pages.videoPlayer` 中英文语言 key
- 保留项:
- `approvalRemarks: '感谢您的反馈意见'` 会作为批量处理备注提交给接口,按提交内容保留
- `src/components/videoPlayer/index.vue` 剩余中文均为注释,不属于可见展示文案
- 验证结果:
- 目标页中文扫描仅剩提交内容
- 直接公共组件中文扫描仅剩注释
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态:已完成,线程一已切回待分配
- 线程二新认领:主要路由页面 / 审批管理 / 举报信息
- 路由别名:`ReportManagerReport`
- 路径:`approval/report/index`
- 文件:`src/views/approval/report/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/data/AccountHanle/index.vue`
- 说明:
- 已发现线程一当前认领 `src/views/approval/nickname-approval/index.vue`,线程二主动避让
- 本轮完成后已按用户要求处理 `翻译进度.md` 中重复的主要路由完成摘要,统一收口到 `docs/i18n/主要路由.md`
- 状态:领取时进行中;本轮随后已完成,见下方完成记录
- 线程二已完成:主要路由页面 / 审批管理 / 举报信息
- 路由别名:`ReportManagerReport`
- 路径:`approval/report/index`
- 已完成文件:
- `src/views/approval/report/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`:中文扫描无命中
- `src/components/data/AccountInput/index.vue`:中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:中文扫描无命中
- `src/components/data/UserDeatilsDrawer/index.vue`:中文扫描无命中
- `src/components/data/AccountHanle/index.vue`:仅命中既有接口提交默认警告内容,按保留项处理
- 已完成内容:
- 筛选区、日期占位、下拉展示、搜索按钮、展开行标签、表格列头、账号处理按钮、操作说明、批量有效/无效按钮、确认提示与复制提示已国际化
- 新增 `pages.userReportApproval` 中英文语言 key
- 审批状态与举报类型实际值保持原样,仅在展示层映射翻译
- 验证结果:
- 目标页中文扫描无命中
- 本轮未使用 `$te`
- 语言文件语法校验通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态:已完成,线程二已切回待分配
- 线程一已完成:主要路由页面 / 审批管理 / 用户昵称
- 路由别名:`NickNameApproval`
- 路径:`approval/nickname-approval/index`
- 已完成文件:
- `src/views/approval/nickname-approval/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- `src/components/data/AccountHanle/index.vue`:仅命中既有接口提交默认警告内容,按保留项处理
- 已完成内容:
- 筛选区、日期占位、审批状态下拉展示映射、搜索按钮、表格列头、操作按钮、批量审批按钮、确认提示与成功提示已国际化
- 新增 `pages.userNicknameApproval` 中英文语言 key
- 审批状态仅在展示层映射翻译,实际值保持原样
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描仅命中 `AccountHanle` 既有接口提交默认警告内容
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态:已完成,线程一已切回待分配
- 线程一已完成:主要路由页面 / 审批管理 / 用户照片墙
- 路由别名:`PhotoWallApproval`
- 路径:`approval/photo-wall-approval/index`
- 已完成文件:
- `src/views/approval/photo-wall-approval/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/EditUserForm/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 已完成内容:
- 筛选区、日期占位、状态/性别下拉展示映射、搜索按钮、卡片信息标签、选择文案、编辑用户按钮、批量审批按钮、确认提示与成功提示已国际化
- 新增 `pages.userPhotoWallApproval` 中英文语言 key
- 审批状态与性别常量仅在展示层映射翻译,实际值保持原样
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态:已完成,线程一已切回待分配
- 线程一已完成:主要路由页面 / 运营管理 / 营收支出 / 钻石余额列表
- 路由别名:`User:Diamond:Balance`
- 路径:`user/diamond-balance/index`
- 已完成文件:
- `src/views/user/diamond-balance/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 已完成内容:
- 用户 ID placeholder、搜索按钮、表格列头已国际化
- 新增 `pages.userDiamondBalance` 中英文语言 key
- 余额列 `min-width` 调整为 120辅助英文列名展示
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态:已完成,线程一已切回待分配
- 线程一已完成:主要路由页面 / 运营管理 / 营收支出 / 金币代理流水
- 路由别名:`UserFreightInfoList`
- 路径:`user/freight-info-list/index`
- 已完成文件:
- `src/views/user/freight-info-list/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- 已完成内容:
- 筛选区、日期占位、来源下拉、搜索 / 导出按钮、表格列头、收支类型、导出抽屉、校验提示与导出提示已国际化
- 新增 `pages.userFreightInfoList` 中英文语言 key
- 来源下拉仅翻译展示文本,`freightBalanceOrigin` 常量实际值与查询逻辑保持原样
- 导出文件名 `FreightWaters ${monthDate}` 保持原样
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态:已完成,线程一已切回待分配
- 线程一已完成:主要路由页面 / 运营管理 / 营收支出 / 积分收支记录
- 路由别名:`IntegralStream`
- 路径:`user/integral-stream/index`
- 已完成文件:
- `src/views/user/integral-stream/index.vue`
- `src/views/user/integral-stream/timely/index.vue`
- `src/views/user/integral-stream/history/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 已完成内容:
- tab 标题、筛选区、日期占位、来源下拉、搜索按钮、提示条与表格列头已国际化
- 新增 `pages.integralStream` 中英文语言 key
- 来源下拉仅翻译展示文本,`videoOrigin` 常量实际值与查询逻辑保持原样
- 保留项:
- `timely/index.vue``history/index.vue` 首行中文仅为注释,不参与页面展示
- 验证结果:
- 目标模块中文扫描仅剩注释中文
- 直接公共组件中文扫描无命中
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态:已完成,线程一已切回待分配
- 线程一已完成:主要路由页面 / 运营管理 / 营收支出 / 钻石流水列表
- 路由别名:`User:Diamond:Run:Water`
- 路径:`user/diamond-run-water/index`
- 已完成文件:
- `src/views/user/diamond-run-water/index.vue`
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 已完成内容:
- 筛选区、类型选项、来源下拉展示、搜索按钮与表格列头已国际化
- 新增 `pages.userDiamondRunWater` 中英文语言 key
- 来源下拉仅翻译展示文本,`diamondOrigins` 常量实际值与查询逻辑保持原样
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 状态:已完成,线程一已切回待分配
- 线程一已完成:已完成主要路由页面的直接公共组件联动复查最终收口
- 任务类型:临时任务收口
- 本轮目标:
- 确认“当前扫描到仍需复核的已完成页面 -> 直接公共组件”是否仍为空
- 确认 `docs/i18n/主要路由.md` 是否仍存在页面级 `状态:待处理`
- 若无剩余项,标记公共组件联动复查临时任务已完成
- 最终复核结论:
- “当前扫描到仍需复核的已完成页面 -> 直接公共组件”为空
- `docs/i18n/主要路由.md` 中除本临时任务外没有页面级 `状态:待处理`
- 已登记完成的直接公共组件中文命中仅剩注释、已注释代码,或 `src/components/data/AccountHanle/index.vue` 中提交给接口的默认警告内容
- `src/components/data/UserRegistrationOverviewCharts/index.vue` 命中的“系统”位于已注释旧筛选代码中,不参与页面展示
- 状态:已完成,线程一已切回待分配
- 线程二已完成:主要路由页面 / 主播中心 / 代理列表
- 路由别名:`team:list`
- 路径:`team/team-list/index`
- 已完成文件:
- `src/views/team/team-list/index.vue`
- `src/views/team/team-list/bind-bd.vue`
- `src/views/team/team-list/team-application-process-drawer.vue`
- `src/views/team/team-list/team-contact.vue`
- `src/views/team/team-list/team-edit.vue`
- `src/views/team/team-list/team-notice-list-drawer.vue`
- `src/views/team/team-list/team-notice-send-drawer.vue`
- `src/views/team/team-list/team-remark.vue`
- `src/views/team/team-list/team-status.vue`
- `src/views/team/team-list/team-switch-own.vue`
- `src/views/team/components/ProcessApprovalDrawer/index.vue`
- 直接公共组件状态:
- `src/views/team/components/TeamCreate/index.vue`:历史已完成,本轮复核引用
- `src/views/team/components/TeamDetailsDrawer/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/SysOriginPermissionSelect/index.vue`:历史已完成
- `src/components/data/SelectSystemRegion/index.vue`:本轮复核未发现可见中文
- `src/components/data/AccountInput/index.vue`:本轮复核未发现可见中文
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:本轮复核未发现可见中文
- 验证结果:
- 目标范围中文扫描仅剩注释或已注释代码,不属于可见展示文案
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- `npm run build:prod` 通过,仍为项目既有 `17` 条 warning
- 状态:已完成,线程二已切回待分配
- 线程一已完成:主要路由页面 / 用户管理 / 用户列表
- 路由别名:`AppUserList`
- 路径:`user/user-table/index`
- 本轮复核:
- 用户列表入口页与其直接公共组件最终复核
- 已关闭 `主要路由.md` 中“页面本体已完成,直接公共组件待联动复核”的状态
- 直接公共组件复核结论:
- 入口页与直接公共组件没有需要继续处理的可见静态中文
- `src/views/user/user-table/index.vue` 命中的中文为注释或已注释代码
- `src/components/data/GoldRunningWaterDialog/index.vue``src/components/data/UserVideoViolationTableDialog/index.vue``src/components/data/EditUserGoldCoinRewardForm/index.vue` 命中的中文为注释
- `src/components/data/UserRegistrationOverviewCharts/index.vue` 命中的“系统”位于已注释旧筛选代码
- `src/components/data/AccountHanle/index.vue` 默认警告语属于提交给接口的业务内容,按规则保留
- 验证结果:
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 本轮未修改源码,仅更新协作文档状态
- 状态:已完成,线程一已切回待分配
- 线程一已完成:主要路由页面 / 审批管理 / 用户头像
- 路由别名:`AvatatPhotoApproval`
- 路径:`approval/avatar-approval/index`
- 已完成文件:
- `src/views/approval/avatar-approval/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:本轮复核中文扫描无命中
- `src/components/data/EditUserForm/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountHanle/index.vue`:默认警告语属于提交给接口的业务内容,按规则保留
- `src/components/data/AccountInput/index.vue`:本轮复核中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:本轮复核中文扫描无命中
- `src/components/data/UserDeatilsDrawer/index.vue`:已补充可见静态文案国际化
- 验证结果:
- 目标范围中文残留仅剩 `src/components/data/AccountHanle/index.vue` 默认警告语,属于接口业务内容
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 本轮改动未使用 `$te`
- `npm run build:prod` 通过,仍为项目既有 `17` 条 warning
- 本轮未修改:
- 接口参数、查询字段、路由路径、权限码、审批类型实际值、审批状态实际值、性别实际值、表单提交值或接口返回动态数据
- 状态:已完成,线程一已切回待分配
- 线程一已完成:主要路由页面 / 主播中心 / 账单列表
- 路由别名:`team:bill`
- 路径:`team/team-bill/index`
- 已完成文件:
- `src/views/team/team-bill/index.vue`
- `src/views/team/team-bill/details-drawer.vue`
- `src/views/team/team-bill/team-bill-internal-remark.vue`
- `src/views/team/team-bill/team-bill-remark.vue`
- `src/views/team/team-bill/team-bill-settle.vue`
- `src/views/team/team-bill/team-bill-status.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- 页面私有组件状态:
- 同目录 5 个私有抽屉/弹窗已随入口页同步完成
- `src/views/team/components/TeamDetailsDrawer/index.vue` 历史已完成,本轮复核中文扫描无命中
- 直接公共组件状态:
- `src/components/data/SysOriginPermissionSelect/index.vue`:默认 placeholder 改为展示层 `$t('common.select')`,未改传参逻辑
- `src/components/data/SelectSystemRegion/index.vue`:本轮复核中文扫描无命中
- `src/components/data/AccountInput/index.vue`:本轮复核中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:本轮复核中文扫描无命中
- 验证结果:
- `src/views/team/team-bill/*.vue` 中文残留仅在已注释的历史模板块中,不属于可见展示文案
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 本轮改动未使用 `$te`
- `npm run build:prod` 通过,仍为项目既有 `17` 条 warning
- 本轮未修改:
- 接口参数、查询字段、路由路径、权限码、账单状态实际值、结算类型实际值、工资计算值、表单提交值或接口返回动态数据
- 状态:已完成,线程一已切回待分配
- 线程二已完成:主要路由页面 / 主播中心 / 主播成员 - 线程二已完成:主要路由页面 / 主播中心 / 主播成员
- 路由别名:`team:member` - 路由别名:`team:member`
@ -1228,7 +1587,7 @@
- 原因:当前未被入口页或 `form-edit.vue` 引用,继续按既有排除项处理 - 原因:当前未被入口页或 `form-edit.vue` 引用,继续按既有排除项处理
- 临时任务:对已完成主要路由页面做直接公共组件联动复查 - 临时任务:对已完成主要路由页面做直接公共组件联动复查
- 状态:待处理 - 状态:已完成线程一2026-05-08最终收口
- 规则说明: - 规则说明:
- 对已经标记“已完成”的主要路由页面,补充检查入口页直接渲染的 `src/components/**` 公共组件 - 对已经标记“已完成”的主要路由页面,补充检查入口页直接渲染的 `src/components/**` 公共组件
- 如果公共组件已完成,补回完成记录;如果仍有中文展示文本,按公共组件任务单独认领或随页面补齐 - 如果公共组件已完成,补回完成记录;如果仍有中文展示文本,按公共组件任务单独认领或随页面补齐
@ -1322,7 +1681,7 @@
- 完成线程:线程三 - 完成线程:线程三
- 关联页面:用户列表页面 - 关联页面:用户列表页面
- 说明:组件内用户工资钻石流水弹窗标题、表格加载文案与表格列名已国际化;分页查询字段、加载逻辑、接口返回工资钻石流水数据、来源、来源描述、类型名称与备注保持原样 - 说明:组件内用户工资钻石流水弹窗标题、表格加载文案与表格列名已国际化;分页查询字段、加载逻辑、接口返回工资钻石流水数据、来源、来源描述、类型名称与备注保持原样
- 当前扫描到仍需复核的“已完成页面 -> 直接公共组件”: - 当前扫描到仍需复核的“已完成页面 -> 直接公共组件”:当前无
- 当前未列入“仍需复核”的直接公共组件: - 当前未列入“仍需复核”的直接公共组件:
- 直接组件文件不存在或未解析到本地 `.vue` 文件 - 直接组件文件不存在或未解析到本地 `.vue` 文件
- 扫描无中文命中 - 扫描无中文命中

View File

@ -3,7 +3,7 @@
## 文档定位 ## 文档定位
- 本文件只负责记录全局进展、阶段成果、构建验证结果与下一步目标 - 本文件只负责记录全局进展、阶段成果、构建验证结果与下一步目标
- 主要路由的完整父子级结构、路由别名、路径、入口文件、完成状态、已完成主要路由摘要与主路由优先级,以 `docs/i18n/主要路由.md` 为准 - 主要路由的完整父子级结构、路由别名、路径、入口文件、完成状态、进行中项、未完成项与主路由优先级,以 `docs/i18n/主要路由.md` 为准
- `docs/i18n/翻译清单.md` 不再重复维护已完成主要路由索引,只维护文件级清单与任务状态 - `docs/i18n/翻译清单.md` 不再重复维护已完成主要路由索引,只维护文件级清单与任务状态
- 文档中的英文路由名需要与侧边栏实际语言包 `src/lang/messages/base/menu-en.js` 保持一致;如有差异,以 `menu-en.js` 为准 - 文档中的英文路由名需要与侧边栏实际语言包 `src/lang/messages/base/menu-en.js` 保持一致;如有差异,以 `menu-en.js` 为准
- 注意 `src/lang/messages/en.js` 顶层旧中文 key 会在运行时覆盖 `menu-en.js` 的同名 key统一路由英文名时需要同步检查并消除这类重复覆盖 - 注意 `src/lang/messages/en.js` 顶层旧中文 key 会在运行时覆盖 `menu-en.js` 的同名 key统一路由英文名时需要同步检查并消除这类重复覆盖
@ -20,11 +20,458 @@
## 当前认领线程 ## 当前认领线程
- 线程一:待分配,上一轮已完成 `src/views/user/bank-balance/withdraw-diamond-apply/**` 钻石提现申请页面入口、同目录私有抽屉、直接公共组件复核、语言文件校验与构建验证 - 线程一:待分配,上一轮已完成 `src/views/props/props-resource-config/**`,对应主要路由 `资源配置 / Resource Configuration`
- 线程二:待分配,上一轮已完成 `src/views/team/team-member/**` 主播成员页面入口、同目录私有组件、直接引用的团队详情抽屉与直接公共组件复核、语言文件校验与构建验证 - 线程二:待分配,上一轮已完成 `src/views/approval/room-cover-wall-approval/index.vue`,对应主要路由 `房间封面 / Room Covers`
- 线程三:待分配,上一轮已完成 `src/views/user/bank-balance/table/**` 用户银行账户页面入口、同目录私有组件、直接公共组件复核、语言文件校验与构建验证 - 线程三:待分配,上一轮已完成 `src/views/user/bank-balance/table/**` 用户银行账户页面入口、同目录私有组件、直接公共组件复核、语言文件校验与构建验证
## 2026-05-07 最新同步 ## 2026-05-08 最新同步
- 2026-05-08 线程一已完成:
- `src/views/props/props-resource-config/index.vue`
- `src/views/props/props-resource-config/form-edit.vue`
- `src/views/props/props-resource-config/line-graph-charts.vue`
- `src/views/props/props-resource-config/sales-mothly-charts-dialog.vue`
- 对应主要路由:
- 道具管理 / Prop Management
- 资源配置 / Resource Configuration
- 本轮完成:
- 入口筛选、表格列名、操作按钮、无权限提示、编辑弹窗、上传提示、销售报表弹窗、图表系列名国际化
- 新增 `pages.propsResourceConfig` 中英文语言 key
- 直接公共组件复核:`Pagination``SysOriginIcon``svgaplayer``PropsSalesOverviewCharts` 无中文命中
- 保留项:
- `propsTypes``nobleVipTabs``showcaseTypes` 的实际 value 保持原样,仅展示 label 映射翻译
- 接口字段、接口参数、路由路径、权限码、表单提交值、枚举实际值与接口返回动态数据保持原样
- 验证结果:
- 目标文件中文扫描无命中
- 未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 2026-05-08 线程一新认领:
- `src/views/props/props-resource-config/**`
- 对应主要路由:
- 道具管理 / Prop Management
- 资源配置 / Resource Configuration
- 范围:
- `src/views/props/props-resource-config/index.vue`
- `src/views/props/props-resource-config/form-edit.vue`
- `src/views/props/props-resource-config/line-graph-charts.vue`
- `src/views/props/props-resource-config/sales-mothly-charts-dialog.vue`
- 约束:
- 仅处理可见静态展示文本
- 不修改接口字段、接口参数、路由路径、权限码、表单提交值、枚举实际值与接口返回动态数据
- 2026-05-08 线程一已完成:
- `src/views/approval/user-profile-desc-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户个性签名 / User Profile Signatures
- 本轮完成:
- 页面日期占位、筛选项、表格列名、操作按钮、批量审批按钮、确认弹窗与提示消息国际化
- 直接公共组件复核:`Pagination``AccountInput``UserDeatilsDrawer` 无中文命中
- 审批状态仅翻译展示 label接口提交值 `PROFILE_DESC``PASS``NOT_PASS``waitApprovalUser` 保持原样
- 验证结果:
- 中文扫描仅剩不可见注释“数量”
- 语言文件语法检查通过
- `npm run build:prod` 第二次通过,仍保留项目既有 17 个 warning
- 第一次构建因输出目录 `dist\cdn` 偶发 `EEXIST` 失败,重跑通过,未发现源码编译错误
- 2026-05-08 线程二已完成:
- `src/views/approval/room-cover-wall-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 房间封面 / Room Covers
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``EditUserForm``AccountHanle``AccountInput``SysOriginIcon``UserDeatilsDrawer`
- 语言文件补充或复用
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审批类型实际值、审批状态实际值、表单提交值、图片地址、机器标签或接口返回动态数据
- 领取时线程二状态:进行中
- 已完成内容:
- 筛选区、日期范围、搜索按钮、卡片信息标签、状态与性别展示映射、选择数量、详情、编辑用户、账号处理、通过/拒绝按钮、确认提示与成功提示已国际化
- 新增 `pages.roomCoverApproval` 中英文语言 key
- 审批状态与性别实际值保持原样,仅在展示层映射翻译
- 接口返回的房间封面、机器标签、用户资料、图片地址与动态数据保持原样
- 直接公共组件复核:
- `Pagination``EditUserForm``AccountInput``SysOriginIcon``UserDeatilsDrawer` 中文扫描无命中
- `AccountHanle` 仅命中既有接口提交默认警告内容,按保留项处理
- 验证结果:
- 目标页中文扫描仅剩注释或注释掉的历史代码
- 本轮未使用 `$te`
- 语言文件语法校验通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程二状态:待分配
- 2026-05-08 线程一新认领:
- `src/views/approval/user-profile-desc-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户个性签名 / User Profile Signatures
- 本轮约束:
- 仅处理可见静态展示文本
- 不修改接口字段、接口参数、路由路径、审批类型与提交内容
- 直接公共组件按页面实际引用与全局标签进行复核并记录
- 2026-05-08 线程一已完成:
- `src/views/feedback/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 意见反馈 / Feedback
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``AccountInput``SysOriginIcon``UserTableExhibit``UserDeatilsDrawer``Feedback``VideoPlayer`
- 语言文件补充或复用
- 已完成内容:
- 筛选区、表格展开详情标签、表格列头、状态展示、操作按钮、批量处理提示与成功提示已国际化
- 直接公共组件 `Feedback` 抽屉标题、表单标签、提交按钮已国际化
- 直接公共组件 `VideoPlayer` 可见倍速文案已国际化
- 新增 `pages.feedback``pages.videoPlayer` 中英文语言 key
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审核状态实际值、批量处理提交内容、表单提交值或接口返回动态数据
- 保留项:
- `approvalRemarks: '感谢您的反馈意见'` 会作为批量处理备注提交给接口,按提交内容保留
- `src/components/videoPlayer/index.vue` 剩余中文均为注释,不属于可见展示文案
- 验证结果:
- 目标页中文扫描仅剩提交内容
- 直接公共组件中文扫描仅剩注释
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08 线程二新认领:
- `src/views/approval/report/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 举报信息 / Reports
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``AccountHanle`
- 语言文件补充或复用
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审批状态实际值、举报类型实际值、批量审批提交值、表单提交值或接口返回动态数据
- 后续文档收口:
- 已按用户要求将本文件中重复的主要路由完成摘要统一迁入 `docs/i18n/主要路由.md`,后续本文件只保留阶段进展、构建验证与必要时间线
- 领取时线程二状态:进行中
- 已完成内容:
- 筛选区、日期占位、下拉展示、搜索按钮、展开行标签、表格列头、账号处理按钮、操作说明、批量有效/无效按钮、确认提示与复制提示已国际化
- 新增 `pages.userReportApproval` 中英文语言 key
- 审批状态与举报类型实际值保持原样,仅在展示层映射翻译
- 接口返回的举报类型名称、举报内容、最近处理人、媒体 URL 与用户资料保持原样
- 直接公共组件复核:
- `Pagination``AccountInput``SysOriginIcon``UserTableExhibit``UserDeatilsDrawer` 中文扫描无命中
- `AccountHanle` 仅命中既有接口提交默认警告内容,按保留项处理
- 验证结果:
- 目标页中文扫描无命中
- 本轮未使用 `$te`
- 语言文件语法校验通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程二状态:待分配
- 2026-05-08 线程一已完成:
- `src/views/approval/nickname-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户昵称 / User Nickname
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``AccountInput``SysOriginIcon``UserDeatilsDrawer``AccountHanle`
- 语言文件补充或复用
- 已完成内容:
- 筛选区、日期占位、审批状态下拉展示映射、搜索按钮、表格列头、操作按钮、批量审批按钮、确认提示与成功提示已国际化
- 新增 `pages.userNicknameApproval` 中英文语言 key
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审批状态实际值、表单提交值或接口返回动态数据
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描仅命中 `AccountHanle` 既有接口提交默认警告内容
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08 线程一已完成:
- `src/views/approval/photo-wall-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户照片墙 / User Photo Wall
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``AccountInput``EditUserForm``UserDeatilsDrawer`
- 语言文件补充或复用
- 已完成内容:
- 筛选区、日期占位、状态/性别下拉展示映射、搜索按钮、卡片信息标签、选择文案、编辑用户按钮、批量审批按钮、确认提示与成功提示已国际化
- 新增 `pages.userPhotoWallApproval` 中英文语言 key
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审批状态实际值、性别实际值、表单提交值或接口返回动态数据
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08 线程一已完成:
- `src/views/user/diamond-balance/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 营收支出 / Revenue and Expenses
- 钻石余额列表 / Diamond Balance List
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``AccountInput``UserTableExhibit``UserDeatilsDrawer`
- 语言文件补充或复用
- 已完成内容:
- 用户 ID placeholder、搜索按钮、表格列头已国际化
- 新增 `pages.userDiamondBalance` 中英文语言 key
- 余额列 `min-width` 调整为 120辅助英文列名展示
- 本轮未修改:
- 接口参数、查询字段、表格 `prop`、路由路径、权限码、提交值或接口返回动态数据
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 本轮未使用 `$te`
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08 线程一已完成:
- `src/views/user/freight-info-list/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 营收支出 / Revenue and Expenses
- 金币代理流水 / Gold Agent Transactions
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``SysOriginIcon``AccountInput``UserTableExhibit`
- 语言文件补充:`pages.userFreightInfoList`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、提交值、接口返回动态数据、导出文件名或 `freightBalanceOrigin` 常量实际值
- 已完成内容:
- 筛选区、日期占位、来源下拉、搜索 / 导出按钮、表格列头、收支类型、导出抽屉、校验提示与导出提示已国际化
- 来源下拉仅将 `freightBalanceOrigin.value` 映射为展示文案,筛选逻辑仍保留原 `value/name` 匹配
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08 线程一已完成:
- `src/views/user/integral-stream/index.vue`
- `src/views/user/integral-stream/timely/index.vue`
- `src/views/user/integral-stream/history/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 营收支出 / Revenue and Expenses
- 积分收支记录 / Points Transaction Records
- 本轮范围:
- 入口 tab 页、当前可见积分流水页、同目录历史积分流水页
- 直接公共组件复核:`Pagination``AccountInput``UserDeatilsDrawer`
- 语言文件补充:`pages.integralStream`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、提交值、接口返回动态数据或 `videoOrigin` 常量实际值
- 已完成内容:
- tab 标题、筛选区、日期占位、来源下拉、搜索按钮、提示条与表格列头已国际化
- 来源下拉仅将 `videoOrigin.value` 映射为展示文案,筛选逻辑仍保留原 `value/name` 匹配
- 保留项:
- `timely/index.vue``history/index.vue` 首行中文仅为注释,不参与页面展示
- 验证结果:
- 目标模块中文扫描仅剩注释中文
- 直接公共组件中文扫描无命中
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08 线程一已完成:
- `src/views/user/diamond-run-water/index.vue`
- 对应主要路由:
- 运营管理 / Operations Management
- 营收支出 / Revenue and Expenses
- 钻石流水列表 / Diamond Transaction List
- 本轮范围:
- 入口页静态展示文本国际化
- 直接公共组件复核:`Pagination``SysOriginIcon``AccountInput``UserTableExhibit``UserDeatilsDrawer`
- 语言文件补充:`pages.userDiamondRunWater`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、提交值、接口返回动态数据或 `diamondOrigins` 常量实际值
- 已完成内容:
- 筛选区、类型选项、来源下拉展示、搜索按钮与表格列头已国际化
- 来源下拉仅将 `diamondOrigins.value` 映射为展示文案,筛选逻辑仍保留原 `value/name` 匹配
- 验证结果:
- 目标页中文扫描无命中
- 直接公共组件中文扫描无命中
- 语言文件语法检查通过
- `npm run build:prod` 通过,仍保留项目既有 17 个 warning
- 完成后线程一状态:待分配
- 2026-05-08 线程一已完成:
- 已完成主要路由页面的直接公共组件联动复查最终收口
- 本轮目标:
- 复核 `docs/i18n/翻译清单.md` 中“当前扫描到仍需复核的已完成页面 -> 直接公共组件”是否仍为空
- 复核 `docs/i18n/主要路由.md` 中是否仍存在页面级 `状态:待处理`
- 如无剩余明确可处理项,将公共组件联动复查临时任务标记为已完成
- 本轮不修改:
- 源码逻辑、接口参数、查询字段、路由路径、权限码、表单提交值或接口返回动态数据
- 最终复核结论:
- `docs/i18n/翻译清单.md` 中“当前扫描到仍需复核的已完成页面 -> 直接公共组件”为空
- `docs/i18n/主要路由.md` 中除本临时任务外没有页面级 `状态:待处理`
- 已登记完成的直接公共组件中文命中仅剩注释、已注释代码,或 `src/components/data/AccountHanle/index.vue` 中提交给接口的默认警告内容
- `src/components/data/UserRegistrationOverviewCharts/index.vue` 命中的“系统”位于已注释旧筛选代码中,不参与页面展示
- 完成后线程一状态:待分配
- 2026-05-08 线程二已完成:
- `src/views/team/team-list/index.vue`
- `src/views/team/team-list/bind-bd.vue`
- `src/views/team/team-list/team-application-process-drawer.vue`
- `src/views/team/team-list/team-contact.vue`
- `src/views/team/team-list/team-edit.vue`
- `src/views/team/team-list/team-notice-list-drawer.vue`
- `src/views/team/team-list/team-notice-send-drawer.vue`
- `src/views/team/team-list/team-remark.vue`
- `src/views/team/team-list/team-status.vue`
- `src/views/team/team-list/team-switch-own.vue`
- `src/views/team/components/ProcessApprovalDrawer/index.vue`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- 代理列表 / Agent List
- 本轮范围:
- 入口页、同目录页面内组件 / 私有组件、页面直接渲染的 `src/components/**` 公共组件
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、枚举实际值、表单提交值或接口返回动态数据
- 已完成内容:
- 入口页筛选区、表格列头、状态展示、操作菜单、加载更多、无权限提示、删除确认与提交中提示已国际化
- 绑定 BD、团队申请、联系方式、修改资料、通知记录、发送通知、备注、状态变更、更换团长、申请日志抽屉/弹窗已国际化
- 新增 `pages.teamList`,状态、申请原因、审核日志原因均保留原枚举 value仅在展示层通过 `$t` 映射
- 直接公共组件状态:
- `src/views/team/components/TeamCreate/index.vue`:历史已完成,本轮复核引用
- `src/views/team/components/TeamDetailsDrawer/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/SysOriginPermissionSelect/index.vue`:历史已完成
- `src/components/data/SelectSystemRegion/index.vue`:本轮复核未发现可见中文
- `src/components/data/AccountInput/index.vue`:本轮复核未发现可见中文
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:本轮复核未发现可见中文
- 验证结果:
- 目标范围中文扫描仅剩注释或已注释代码,不属于可见展示文案
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- `npm run build:prod` 通过,仍为项目既有 `17` 条 warning
- 带 `NODE_OPTIONS=--openssl-legacy-provider` 的构建在当前 Node 下被拒绝,已改用普通构建命令验证通过
- 完成后线程二状态:待分配
- 2026-05-08 线程一已完成:
- `src/views/user/user-table/index.vue`
- 对应主要路由:
- 用户管理 / User Management
- 用户列表 / User List
- 本轮复核范围:
- 用户列表入口页与其直接渲染/注册的公共组件,包括流水、奖励、扣除、违规记录、账号处理、账号处理记录、认证信息、银行卡、充值记录、注册概览、用户详情等弹窗/抽屉组件
- 本轮目标:
- 收口 `主要路由.md``用户列表 / User List` 的“页面本体已完成,直接公共组件待联动复核”状态
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、表单提交值或接口返回动态数据
- 直接公共组件复核结论:
- 入口页与直接公共组件没有需要继续处理的可见静态中文
- `src/views/user/user-table/index.vue` 命中的中文为注释或已注释代码
- `src/components/data/GoldRunningWaterDialog/index.vue``src/components/data/UserVideoViolationTableDialog/index.vue``src/components/data/EditUserGoldCoinRewardForm/index.vue` 命中的中文为注释
- `src/components/data/UserRegistrationOverviewCharts/index.vue` 命中的“系统”位于已注释旧筛选代码
- `src/components/data/AccountHanle/index.vue` 默认警告语属于提交给接口的业务内容,按规则保留
- 已完成验证:
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 本轮未修改源码,仅更新协作文档状态
- 完成后线程一状态:待分配
- 2026-05-08 线程一已完成:
- `src/views/approval/avatar-approval/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户头像 / User Avatar
- 已完成内容:
- 筛选区、日期选择、性别/审批状态展示映射、选择文案、用户信息卡片按钮、批量审批按钮、确认提示、操作成功/失败提示等可见静态文案已国际化
- 新增 `pages.userAvatarApproval`
- 补充 `pages.userDetailsDrawer.title` 与无权限提示文案
- 直接公共组件状态:
- `src/components/Pagination/index.vue`:中文扫描无命中
- `src/components/data/EditUserForm/index.vue`:历史已完成,本轮复核中文扫描无命中
- `src/components/data/AccountHanle/index.vue`:默认警告语属于提交给接口的业务内容,按规则保留
- `src/components/data/AccountInput/index.vue`:中文扫描无命中
- `src/components/SysOriginIcon/index.vue`:中文扫描无命中
- `src/components/data/UserDeatilsDrawer/index.vue`:已补充可见静态文案国际化
- 已完成验证:
- 目标范围中文残留仅剩 `src/components/data/AccountHanle/index.vue` 默认警告语,属于接口业务内容
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 本轮改动未使用 `$te`
- `npm run build:prod` 通过,仍为项目既有 `17` 条 warning
- 本轮未修改:
- 接口参数、查询字段、路由路径、权限码、审批类型实际值、审批状态实际值、性别实际值、表单提交值或接口返回动态数据
- 线程一当前状态:待分配
- 2026-05-08 线程一已新认领:
- `src/views/approval/avatar-approval/index.vue`
- 对应主要路由:
- 审批管理 / Approval Management
- 用户头像 / User Avatar
- 直接公共组件复核:
- `src/components/Pagination/index.vue`
- `src/components/data/EditUserForm/index.vue`
- `src/components/data/AccountHanle/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/SysOriginIcon/index.vue`
- `src/components/data/UserDeatilsDrawer/index.vue`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、审批类型实际值、审批状态实际值、性别实际值、表单提交值或接口返回动态数据
- `src/components/data/AccountHanle/index.vue` 中默认警告内容属于提交给接口的业务内容,保持原值
- 领取时线程一状态:进行中
- 2026-05-08 线程一已完成:
- `src/views/team/team-bill/index.vue`
- `src/views/team/team-bill/details-drawer.vue`
- `src/views/team/team-bill/team-bill-internal-remark.vue`
- `src/views/team/team-bill/team-bill-remark.vue`
- `src/views/team/team-bill/team-bill-settle.vue`
- `src/views/team/team-bill/team-bill-status.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- 账单列表 / Bill List
- 已完成内容:
- 筛选区、导出抽屉、表格列头、状态/结算类型展示映射、详情抽屉、备注抽屉、状态变更抽屉、结算抽屉、校验提示与操作提示等可见静态文案已国际化
- 新增 `pages.teamBill`
- 账单状态和结算类型仍使用原接口实际值,仅在展示层通过 `$t` 映射文案
- 直接公共组件状态:
- `src/components/data/SysOriginPermissionSelect/index.vue`:默认 placeholder 改为展示层 `$t('common.select')`,未改传参逻辑
- `src/components/data/SelectSystemRegion/index.vue`:中文扫描无命中
- `src/components/data/AccountInput/index.vue`:中文扫描无命中
- `src/components/data/UserInfo/UserTableExhibit/index.vue`:中文扫描无命中
- 已完成验证:
- `src/views/team/team-bill/*.vue` 中文残留仅在已注释的历史模板块中,不属于可见展示文案
- `src/lang/messages/pages/en.js``src/lang/messages/pages/zh.js` 语法校验通过
- 本轮改动未使用 `$te`
- `npm run build:prod` 通过,仍为项目既有 `17` 条 warning
- 本轮未修改:
- 接口参数、查询字段、路由路径、权限码、账单状态实际值、结算类型实际值、工资计算值、表单提交值或接口返回动态数据
- 线程一当前状态:待分配
- 2026-05-08 线程一已新认领:
- `src/views/team/team-bill/index.vue`
- `src/views/team/team-bill/details-drawer.vue`
- `src/views/team/team-bill/team-bill-internal-remark.vue`
- `src/views/team/team-bill/team-bill-remark.vue`
- `src/views/team/team-bill/team-bill-settle.vue`
- `src/views/team/team-bill/team-bill-status.vue`
- `src/views/team/components/TeamDetailsDrawer/index.vue`
- 对应主要路由:
- 主播中心 / Broadcaster Center
- 账单列表 / Bill List
- 直接公共组件复核:
- `src/components/data/SysOriginPermissionSelect/index.vue`
- `src/components/data/SelectSystemRegion/index.vue`
- `src/components/data/AccountInput/index.vue`
- `src/components/data/UserInfo/UserTableExhibit/index.vue`
- 本轮不修改:
- 接口参数、查询字段、路由路径、权限码、账单状态实际值、结算状态实际值、工资计算值、表单提交值或接口返回动态数据
- 领取时线程一状态:进行中
- 线程二已完成: - 线程二已完成:
- `src/views/team/team-member/index.vue` - `src/views/team/team-member/index.vue`
@ -1186,57 +1633,11 @@
## 已完成 ## 已完成
### 主要路由完成摘要 ### 主要路由状态总览
- 详细父子级结构、路由别名、路径与验收入口统一见 `docs/i18n/主要路由.md` - 完整父子级结构、路由别名、路径、入口文件、完成状态、进行中项与未完成项,统一查看 `docs/i18n/主要路由.md` 的“当前主要路由状态总览(完成 / 进行中 / 未完成)”。
- 以下摘要已按 `docs/i18n/主要路由.md` 当前父子级顺序同步更新 - 本文件不再维护第二份主要路由完成摘要,避免多线程写入时和 `主要路由.md` 漂移。
- 已完成主路由摘要: - 后续完成或认领主要路由时,只同步更新 `docs/i18n/主要路由.md` 的状态总览;本文件只记录阶段进展、构建验证与必要时间线。
- 系统管理 / System Management
- 用户管理 / User Management
- 角色管理 / Role Management
- 菜单管理 / Menu Management
- App系统 / App System
- 版本管理 / Version Management
- 请求黑名单 / Request Blacklist
- 用户管理 / User Management
- 用户列表 / User List页面本体已完成直接公共组件待联动复核
- 封禁设备列表 / Blocked Device List
- 最新登记设备 / Latest Registered Devices
- 运营管理 / Operations Management
- 营收支出 / Revenue and Expenses
- 消费商品订单 / Purchase Orders
- 金币收支记录 / Gold Transaction Records
- 数据配置 / Data Configuration
- 参数配置 / Parameter Settings
- 幸运礼物规则配置 / Lucky Gift Rule Configuration
- 幸运礼物规格配置 / Lucky Gift Specification Configuration
- 靓号管理(角色) / Special ID Management (Role)
- 游戏列表 / Game List
- 房间主题管理 / Room Theme Management
- 国家管理 / Country Management
- IM账号管理 / IM Account Management
- 活动配置 / Activity Configuration
- 活动管理 / Activity Management
- 活动模版 / Activity Templates
- 消息推送 / Message Push
- APP管理员 / App Administrators
- App启动页 / App Launch Page
- 客服列表 / Customer Service List
- 系统公告管理 / System Notice Management
- 金币代理 / Gold Agents
- 区域配置 / Region Configuration
- 语音房间 / Voice Rooms
- 房间资料列表 / Room Profile List
- 道具管理 / Prop Management
- 资源组配置 / Resource Group Configuration
- 主播中心 / Broadcaster Center
- 代理钻石政策 / Agent Diamond Policy
- BD Lead / BD Lead
- 代理政策 / Agent Policy
- BD列表 / BD List
- 家族管理 / Family Management
- 家族配置 / Family Configuration
- 家族列表 / Family List
### 基础能力 ### 基础能力
- 已接入项目国际化基础能力 - 已接入项目国际化基础能力

View File

@ -1,6 +1,6 @@
<template> <template>
<el-dialog <el-dialog
title="反馈处理" :title="$t('pages.feedback.drawer.title')"
:visible="true" :visible="true"
:modal-append-to-body="true" :modal-append-to-body="true"
:append-to-body="true" :append-to-body="true"
@ -8,11 +8,11 @@
:before-close="handleClose" :before-close="handleClose"
> >
<el-form ref="form" v-loading="loading" :model="form" label-width="80px"> <el-form ref="form" v-loading="loading" :model="form" label-width="80px">
<el-form-item label="处理结果"> <el-form-item :label="$t('pages.feedback.drawer.result')">
<el-input v-model="form.remarks" type="textarea" /> <el-input v-model="form.remarks" type="textarea" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="submit()">提交</el-button> <el-button type="primary" @click="submit()">{{ $t('pages.feedback.drawer.submit') }}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-dialog> </el-dialog>

View File

@ -8,7 +8,7 @@
:multiple-limit="multipleLimit" :multiple-limit="multipleLimit"
:filterable="filterable" :filterable="filterable"
:clearable="clearable" :clearable="clearable"
:placeholder="placeholder" :placeholder="displayPlaceholder"
collapse-tags collapse-tags
@change="selectChanged" @change="selectChanged"
> >
@ -41,7 +41,7 @@ export default {
}, },
placeholder: { placeholder: {
type: String, type: String,
default: '请选择' default: ''
}, },
disabled: { disabled: {
type: Boolean, type: Boolean,
@ -72,6 +72,9 @@ export default {
}, },
computed: { computed: {
...mapGetters(['permissionsSysOriginPlatforms', 'permissionsSysOriginPlatformAlls']), ...mapGetters(['permissionsSysOriginPlatforms', 'permissionsSysOriginPlatformAlls']),
displayPlaceholder() {
return this.placeholder || this.$t('common.select')
},
permissionsSysOrigins() { permissionsSysOrigins() {
const that = this const that = this

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="user-details-drawer"> <div class="user-details-drawer">
<el-drawer <el-drawer
title="用户详情" :title="$t('pages.userDetailsDrawer.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -21,7 +21,7 @@
</el-tabs> </el-tabs>
</div> --> </div> -->
</div> </div>
<div v-else style="padding: 20px;">权限不足,请联系管理员授权: 组件权限/用户资料面板/查看(user:profile:panel:query)</div> <div v-else style="padding: 20px;">{{ $t('pages.userDetailsDrawer.message.permissionDenied') }}</div>
</el-drawer> </el-drawer>
</div> </div>
</template> </template>
@ -46,7 +46,7 @@ export default {
baseInfo: {}, baseInfo: {},
shortVideoVisiable: false, shortVideoVisiable: false,
tabs: [ tabs: [
{ component: 'PhotoWall', label: '照片墙' } { component: 'PhotoWall', label: this.$t('pages.userDetailsDrawer.section.photoWall') }
] ]
} }
}, },

View File

@ -96,7 +96,7 @@ export default {
computed: { computed: {
ratedisplay() { ratedisplay() {
if (this.rate === 1) { if (this.rate === 1) {
return '倍速' return this.$t('pages.videoPlayer.playbackSpeed')
} else { } else {
return this.rate + 'x' return this.rate + 'x'
} }

View File

@ -553,6 +553,7 @@ export default {
} }
}, },
userDetailsDrawer: { userDetailsDrawer: {
title: 'User Details',
section: { section: {
photoWall: 'Photo Wall' photoWall: 'Photo Wall'
}, },
@ -560,6 +561,9 @@ export default {
candy: 'Candy', candy: 'Candy',
vip: 'VIP', vip: 'VIP',
mobileNumber: 'Mobile Number' mobileNumber: 'Mobile Number'
},
message: {
permissionDenied: 'Insufficient permission. Please contact an administrator to grant: Component Permission / User Profile Panel / View (user:profile:panel:query)'
} }
}, },
accountHandle: { accountHandle: {
@ -604,6 +608,353 @@ export default {
dayPlural: '{days} days' dayPlural: '{days} days'
} }
}, },
userAvatarApproval: {
filter: {
system: 'System',
approvalStatus: 'Review Status',
userId: 'User ID',
gender: 'Gender'
},
date: {
rangeSeparator: 'To',
start: 'Start Date',
end: 'End Date'
},
action: {
search: 'Search',
editUser: 'Edit User',
accountHandle: 'Account Handling',
pass: 'Approve',
reject: 'Reject'
},
selection: {
all: 'Select All',
selected: 'Selected'
},
label: {
nickname: 'Nickname',
gender: 'Gender',
age: 'Age',
selectedCount: 'Selected'
},
approvalStatus: {
PASS: 'Approved',
NOT_PASS: 'Rejected',
PENDING: 'Pending Review'
},
gender: {
male: 'Male',
female: 'Female'
},
confirm: {
title: 'Prompt'
},
message: {
selectApprovalItem: 'Please select review items',
confirmApproval: 'Are you sure you want to review the selected records?',
success: 'Successful',
failure: 'Failed',
genderChangeSuccess: "{nickname}'s gender was changed to '{gender}'",
genderChangeFailed: "Failed to change {nickname}'s gender"
}
},
userPhotoWallApproval: {
filter: {
status: 'Status',
userId: 'User ID',
nickname: 'Nickname',
gender: 'Gender'
},
date: {
rangeSeparator: 'To',
start: 'Start Date',
end: 'End Date'
},
action: {
search: 'Search',
editUser: 'Edit User',
pass: 'Approve',
reject: 'Reject as Violation'
},
selection: {
all: 'Select All',
selected: 'Selected'
},
label: {
nickname: 'Nickname',
gender: 'Gender',
age: 'Age',
tags: 'Tags',
selectedCount: 'Selected'
},
approvalStatus: {
NORMAL: 'Normal',
VIOLATION: 'Violation',
SUSPECTED: 'Pending Manual Review'
},
gender: {
male: 'Male',
female: 'Female'
},
confirm: {
title: 'Prompt'
},
message: {
selectApprovalItem: 'Please select review items',
confirmApproval: 'Are you sure you want to review the selected records?',
success: 'Successful'
}
},
roomCoverApproval: {
filter: {
system: 'System',
roomAccount: 'Room Account',
userId: 'User ID',
approvalStatus: 'Review Status'
},
date: {
rangeSeparator: 'To',
start: 'Start Date',
end: 'End Date'
},
action: {
search: 'Search',
editUser: 'Edit User',
accountHandle: 'Account Handling',
pass: 'Approve',
reject: 'Reject as Violation'
},
selection: {
all: 'Select All',
selected: 'Selected'
},
popover: {
details: 'Details'
},
label: {
roomId: 'Room ID',
userId: 'User ID',
nickname: 'Nickname',
gender: 'Gender',
age: 'Age',
selectedCount: 'Selected'
},
approvalStatus: {
PASS: 'Approved',
NOT_PASS: 'Rejected',
PENDING: 'Pending Review'
},
gender: {
male: 'Male',
female: 'Female'
},
confirm: {
title: 'Prompt'
},
message: {
selectApprovalItem: 'Please select review items',
confirmApproval: 'Are you sure you want to review the selected records?',
success: 'Successful'
}
},
userNicknameApproval: {
filter: {
system: 'System',
userId: 'User ID',
approvalStatus: 'Review Status'
},
date: {
rangeSeparator: 'To',
start: 'Start Date',
end: 'End Date'
},
action: {
search: 'Search',
userDetails: 'User Details',
accountHandle: 'Account Handling',
pass: 'Approve',
reject: 'Reject as Violation'
},
table: {
userId: 'User ID',
nickname: 'Nickname',
updateTime: 'Updated At',
actions: 'Actions'
},
label: {
selectedCount: 'Selected'
},
approvalStatus: {
PASS: 'Approved',
NOT_PASS: 'Rejected',
PENDING: 'Pending Review'
},
confirm: {
title: 'Prompt'
},
message: {
selectApprovalItem: 'Please select review items',
confirmApproval: 'Are you sure you want to review the selected records?',
success: 'Successful'
}
},
userProfileDescApproval: {
filter: {
userId: 'User ID',
approvalStatus: 'Review Status'
},
date: {
rangeSeparator: 'To',
start: 'Start Date',
end: 'End Date'
},
action: {
search: 'Search',
userDetails: 'User Details',
pass: 'Approve',
reject: 'Reject as Violation'
},
table: {
nickname: 'Nickname',
signature: 'Signature',
updateTime: 'Updated At',
actions: 'Actions'
},
label: {
selectedCount: 'Selected'
},
approvalStatus: {
PASS: 'Approved',
NOT_PASS: 'Rejected',
PENDING: 'Pending Review'
},
confirm: {
title: 'Prompt'
},
message: {
selectApprovalItem: 'Please select review items',
confirmApproval: 'Are you sure you want to review the selected records?'
}
},
feedback: {
filter: {
system: 'System',
userId: 'Feedback User ID',
approvalStatus: 'Review Status',
backendMember: 'Backend Member'
},
action: {
search: 'Search',
batchProcess: 'Batch Process',
process: 'Process'
},
detail: {
phoneModel: 'Phone Model',
appVersion: 'App Version',
deviceId: 'Device ID',
content: 'Feedback Content',
remarks: 'Remarks',
latestProcessor: 'Latest Processor'
},
table: {
system: 'System',
feedbackUser: 'Feedback User',
processStatus: 'Process Status',
createdAt: 'Created At',
updatedAt: 'Updated At',
actions: 'Actions'
},
status: {
notLoggedIn: 'Not Logged In'
},
approvalStatus: {
unprocessed: 'Unprocessed',
processed: 'Processed',
pending: 'Pending'
},
confirm: {
title: 'Prompt'
},
message: {
selectUnprocessedFirst: 'Please select "{status}" in review status before operating',
selectApprovalItem: 'Please select review items',
confirmApproval: 'Are you sure you want to review the selected records?',
batchProcessSuccess: 'Batch processing successful'
},
drawer: {
title: 'Feedback Processing',
result: 'Result',
submit: 'Submit'
}
},
videoPlayer: {
playbackSpeed: 'Speed'
},
userReportApproval: {
filter: {
system: 'System',
status: 'Status',
reportType: 'Report Type',
reporterId: 'Reporter ID',
reportedUserId: 'Reported User ID',
adminMember: 'Admin Member'
},
date: {
rangeSeparator: 'To',
start: 'Start Date',
end: 'End Date'
},
action: {
search: 'Search',
accountHandle: 'Account Handling',
valid: 'Valid',
invalid: 'Invalid'
},
tag: {
report: 'Reported',
suspected: 'Suspected'
},
label: {
reportContent: 'Report Content',
latestHandler: 'Latest Handler',
selectedCount: 'Selected'
},
table: {
reportType: 'Report Type',
createTime: 'Created At',
updateTime: 'Updated At',
actions: 'Actions'
},
description: {
title: 'Action Description',
noDirectAction: 'Report review does not directly change user information or resources. Any handling must be done in the corresponding resource module.',
valid: '* Valid: the report is valid, and the system will issue the candy reward configured in Parameter Settings to the reporting user.',
invalid: '* Invalid: the report is invalid.'
},
reportStatus: {
0: 'Pending Review',
1: 'Valid Report',
2: 'Invalid Report'
},
reportType: {
0: 'Illegal Information',
1: 'Personal Attack',
2: 'Inappropriate Content',
3: 'Spam',
4: 'Fraud',
5: 'Sexual Content'
},
confirm: {
title: 'Prompt'
},
message: {
selectApprovalItem: 'Please select review items',
confirmApproval: 'Are you sure you want to review the selected records?',
success: 'Successful',
copySuccess: 'Copied successfully',
copyFailed: 'Copy failed'
}
},
accountInput: { accountInput: {
placeholder: { placeholder: {
type: 'Type', type: 'Type',
@ -1541,6 +1892,178 @@ export default {
createdAt: 'Created At' createdAt: 'Created At'
} }
}, },
userDiamondRunWater: {
loading: 'Loading',
filter: {
system: 'System',
userId: 'User ID',
type: 'Type',
origin: 'Please enter or select content'
},
action: {
search: 'Search'
},
type: {
income: 'Income',
expense: 'Expense'
},
table: {
user: 'User',
diamondBalance: 'Diamond Balance',
diamond: 'Diamond',
source: 'Source',
sourceDescription: 'Source Description',
type: 'Type',
remarks: 'Remarks',
createdAt: 'Created At'
},
origin: {
ACTIVITY_REWARD: 'Activity Reward',
ROOM_SUPPORT_REWARD: 'Room Support Reward',
ROOM_HOMEOWNER_SUPPORT_REWARD: 'Room Support Reward - Room Owner Reward',
CP_REWARD: 'CP Reward',
GAME_BURST_CRYSTAL: 'Crystal Burst Game',
ROOM_REWARD: 'Room Reward',
WEEK_STAR: 'Weekly Star',
INVITED_NEW_USER_REWARD: 'Invited New User Registration Reward',
INVITED_USER_FIRST_RECHARGE_REWARD: 'Invited User First Recharge Reward',
INVITE_REGISTER: 'Invite User Registration',
INVITE_FIRST_RECHARGE: 'Invited User First Recharge',
INVITED_USER_EACH_RECHARGE: 'Invited User Recharge Percentage Reward',
PURCHASE_NOBLE_VIP: 'Purchase Noble VIP',
PURCHASE_NOBLE_VIP_GIVEAWAY: 'Purchase Gifted Noble VIP - Diamond',
PURCHASING_AVATAR_FRAME: 'Purchase Avatar Frame - Diamond',
PURCHASING_DATA_CARD: 'Purchase Profile Card - Diamond',
PURCHASING_CHAT_BUBBLE: 'Purchase Chat Bubble - Diamond',
PURCHASING_CAR: 'Purchase Vehicle - Diamond',
PURCHASING_LAYOUT: 'Purchase Outfit - Diamond',
PURCHASING_AVATAR_FRAME_GIVEAWAY: 'Gift Avatar Frame - Diamond',
PURCHASING_DATA_CARD_GIVEAWAY: 'Purchase Profile Card - Diamond',
PURCHASING_CHAT_BUBBLE_GIVEAWAY: 'Gift Chat Bubble - Diamond',
PURCHASING_THEME: 'Purchase Theme - Diamond',
PURCHASING_THEME_GIVEAWAY: 'Gift Theme - Diamond',
PURCHASING_CAR_GIVEAWAY: 'Gift Vehicle',
PURCHASING_LAYOUT_GIVEAWAY: 'Gift Outfit',
GIVE_GIFT: 'Send Gift',
ACCEPT_GIFT: 'Receive Gift',
COMPENSATE: 'Compensation',
REMOVE: 'Violation Deduction',
WEEK_USER_CONSUME: 'King and Queen Ranking',
DIAMOND_EXCHANGE_GOLD: 'Diamond-to-Gold Exchange',
LIVE_BROADCAST_INTEGRAL: 'Live Stream Points',
DAILY_TASK: 'Daily Task',
CHECK_IN_DIAMOND: 'Diamond Check-in',
CUMULATIVE_RECHARGE_REWARDS: 'Cumulative Recharge Reward',
OFFICIAL_GIFT: 'Official Gift',
EXPIRED: 'Expired',
INVITE_USER_RED_PACKET_LOTTERY: 'Invite User Red Packet Draw',
REWARD_DIAMOND: 'Backend Diamond Reward',
DEDUCT_DIAMOND: 'Backend Diamond Deduction'
}
},
userDiamondBalance: {
filter: {
userId: 'User ID'
},
action: {
search: 'Search'
},
table: {
user: 'User',
balance: 'Balance',
createdAt: 'Created At'
}
},
integralStream: {
tab: {
current: 'Points Transactions',
history: 'Historical Points Transactions'
},
filter: {
userId: 'User ID',
origin: 'Points Source'
},
date: {
rangeSeparator: 'To',
start: 'Start Date',
end: 'End Date'
},
action: {
search: 'Search'
},
alert: {
title: 'Notice',
retention: 'Data is retained for only 30 days.'
},
table: {
nickname: 'Nickname',
sourceObject: 'Source Object',
pointsOrigin: 'Points Source',
points: 'Points Earned',
createdAt: 'Created At'
},
origin: {
CLUB: 'Club Chat',
VIDEO_ACTIVE_CALL: 'Video Call',
VIDEO_MATCH_ALL: 'Match All',
VIDEO_CONDITION_FEMALE: 'Match Female Users',
VIDEO_CONDITION_GODDESS: 'Match Goddess Users',
CHAT_CONSUME_CANDY: 'Text Chat',
GIFT: 'Send Gift',
SHORT_VIDEO_WATCH_AD_SETTLE_ACCOUNTS: 'Short Video Ad Settlement'
}
},
userFreightInfoList: {
filter: {
system: 'System',
sender: 'Sender',
receiver: 'Receiver',
origin: 'Source'
},
date: {
rangeSeparator: 'To',
start: 'Start Date',
end: 'End Date'
},
action: {
search: 'Search',
export: 'Export',
close: 'Close'
},
table: {
system: 'System',
user: 'User',
receiver: 'Receiver',
type: 'Type',
quantity: 'Quantity',
balance: 'Balance',
origin: 'Source',
remark: 'Remark',
createdAt: 'Created At'
},
type: {
income: 'Income',
expense: 'Expense'
},
origin: {
SHIPMENT: 'Shipment',
PURCHASE: 'Purchase',
DEDUCTION: 'Deduction'
},
exportDialog: {
title: 'Export Conditions',
system: 'System',
month: 'Month',
selectMonth: 'Select Month'
},
validation: {
requiredField: 'Required field cannot be empty'
},
message: {
exporting: 'Export in progress, please wait',
downloadFailed: 'Download failed'
}
},
salaryDiamondRunningWaterDialog: { salaryDiamondRunningWaterDialog: {
loading: 'Loading', loading: 'Loading',
dialog: { dialog: {
@ -2367,6 +2890,178 @@ export default {
success: 'Successful' success: 'Successful'
} }
}, },
teamList: {
filter: {
region: 'Region',
status: 'Status',
agentId: 'Agent ID',
memberQuantityRange: 'Start~End Member Count',
dateRangeSeparator: 'To',
startDate: 'Start Date',
endDate: 'End Date',
backendMember: 'Backend Member'
},
table: {
agent: 'Agent',
info: 'Info',
member: 'Members',
status: 'Status',
available: 'Active',
close: 'Closed',
region: 'Region',
remark: 'Remarks',
createdBy: 'Created By',
updatedBy: 'Updated By',
time: 'Time',
createdAt: 'Created',
updatedAt: 'Updated',
actions: 'Actions'
},
action: {
search: 'Search',
add: 'Add',
delete: 'Delete',
details: 'Details',
editProfile: 'Edit Profile',
bindBd: 'Bind BD',
remarks: 'Remarks',
contact: 'Contact',
sendNotice: 'Send Notice',
noticeRecords: 'Notice Records',
teamApplications: 'Team Applications',
query: 'Search',
loadMore: 'Load More',
allLoaded: 'All loaded',
close: 'Close',
save: 'Save',
cancel: 'Cancel',
confirm: 'Confirm',
submit: 'Submit'
},
confirm: {
deleteTitle: 'Reminder',
deleteMessage: 'The system will remove all team data. This action cannot be undone. (Host work, bills, team information, team members, BD relationships, and more.)',
confirmDeleteNotice: 'Are you sure you want to delete this notice?',
sendNotice: 'Are you sure you want to send this notice?',
changeRegionMessage: 'Changing the agent team region will clear all host targets under this agent. Continue?'
},
permission: {
validating: 'Validating permissions...',
deniedPrefix: 'Sorry, you do not have permission to view this page. Please contact the administrator to grant access.',
deniedCode: '[Broadcaster Center / Agent List: (team:list:query:all/team:list:query:self)]'
},
validation: {
requiredField: 'Required fields cannot be empty',
titleRequired: 'Please enter a title',
contentRequired: 'Please enter content'
},
message: {
submitting: 'Submitting!',
maxRemarks: 'You can add up to 20 remarks. Please delete unnecessary remarks before adding more.'
},
statusMap: {
AVAILABLE: 'Active',
CLOSE: 'Closed'
},
processStatusMap: {
WAIT: 'Pending',
AGREE: 'Approved',
REJECT: 'Rejected'
},
reasonMap: {
JOIN: 'Join',
QUIT: 'Leave',
EXIT: 'Leave'
},
approvalReasonMap: {
MEMBER_JOIN: 'Member Joined',
MEMBER_QUIT: 'Member Left',
MEMBER_OWN_REMOVE: 'Agent Removed Member',
MEMBER_ADMIN_REMOVE: 'Admin Removed Member',
MEMBER_APPLY_TIME_OUT: 'Application timed out and user left automatically',
REMOVE_MEMBER_NOT_ACTIVE: 'Removed inactive member',
SYSTEM_MEMBER_REMOVE: 'Removed automatically by system check',
SWITCH_TEAM_OWN: 'Changed team owner',
SWITCH_TEAM_REMOVE: 'Removed during team switch'
},
bindBd: {
title: 'Bind BD',
bdAccount: 'Enter BD account'
},
applicationProcess: {
title: 'Team Member Applications',
status: 'Review Status',
reason: 'Reason',
applicationType: 'Application Type',
reviewStatus: 'Review Status',
createdBy: 'Created By',
updatedBy: 'Updated By'
},
contact: {
title: 'Contact',
emptyTip: 'Click the button below to add contact information.',
type: 'Type',
contact: 'Contact',
remark: 'Remark',
dialogTitle: 'Contact',
selectType: 'Select a type',
contactPlaceholder: 'Enter contact information',
remarkPlaceholder: 'Enter a remark'
},
edit: {
title: 'Team Profile',
regionChangeWarning: 'Notice: Changing the agent team region will clear all host targets under this agent. Please proceed carefully.',
region: 'Region',
country: 'Country',
settingInfo: 'Settings',
memberQuantity: 'Member Quantity',
maxMember: 'Maximum member quantity',
hostSalaryToAgent: 'Agent Receives Host Salary',
withdrawalEnabled: 'Allow Withdrawal'
},
noticeList: {
title: 'Team Notice Records',
titleLabel: 'Title',
contentLabel: 'Content',
sender: 'Sender'
},
noticeSend: {
title: 'Send Team Notice',
titleLabel: 'Title',
content: 'Content',
link: 'Link',
cover: 'Cover'
},
remark: {
title: 'Remarks',
emptyTip: 'Click the button below to add a remark.',
placeholder: 'Enter a remark'
},
teamStatus: {
title: 'Status Change',
warning: 'Closing the team will remove all team data. This action cannot be undone. (Host work, bills, team information, team members, BD relationships, and more.)',
status: 'Status',
close: 'Close',
available: 'Start',
remarks: 'Remarks'
},
switchOwn: {
title: 'Change Team Owner',
warning: 'Historical team work data may be cleared. BD relationships will remain if the team has not been dissolved.',
agent: 'Agent',
agentPlaceholder: 'Enter agent ID'
},
processApproval: {
title: 'Team Application Logs',
processedUserId: 'Processed User ID',
reason: 'Reason',
reasonLabel: 'Reason',
processedUser: 'Processed User',
operator: 'Operator',
creator: 'Creator',
createdAt: 'Created At'
}
},
teamCreate: { teamCreate: {
dialog: { dialog: {
title: 'Create Agent' title: 'Create Agent'
@ -5862,6 +6557,102 @@ export default {
GAME_FRUIT_BOX_REWARD_TIMES: 'Fruit Game Box Draw Count Reward' GAME_FRUIT_BOX_REWARD_TIMES: 'Fruit Game Box Draw Count Reward'
} }
}, },
propsResourceConfig: {
filter: {
system: 'System',
type: 'Type',
shelfStatus: 'Shelf Status',
name: 'Name'
},
table: {
code: 'Code',
type: 'Type',
name: 'Name',
resource: 'Resource',
shelfStatus: 'Shelf Status',
basePrice: 'Base Price',
actions: 'Actions'
},
form: {
system: 'System',
type: 'Type',
cover: 'Cover',
coverPreview: 'Cover Preview',
roomSendCover: 'Room Send Image',
roomNotOpened: 'Room Unopened Red Packet Image',
roomOpened: 'Room Opened Red Packet Image',
imSendCover: 'IM Send Image',
imNotOpened: 'IM/Room Unopened Thumbnail',
imOpened: 'IM/Room Opened Thumbnail',
imOpenedTwo: 'IM/Room Opened Thumbnail 2',
iosResource: 'iOS Resource',
androidResource: 'Android Resource',
roomBackground: 'Room Decoration Background',
name: 'Name',
code: 'Code',
basePrice: 'Base Price'
},
placeholder: {
nobleType: 'Noble Type',
codeReadonly: 'Code cannot be modified after it is added',
month: 'Select Month'
},
action: {
search: 'Search',
add: 'Add',
edit: 'Edit',
sales: 'Sales',
upload: 'Upload',
save: 'Save',
cancel: 'Cancel'
},
status: {
onShelf: 'On Shelf',
offShelf: 'Off Shelf',
yes: 'Yes',
no: 'No'
},
propsTypes: {
AVATAR_FRAME: 'Avatar Frame',
RIDE: 'Ride',
NOBLE_VIP: 'Noble',
THEME: 'Theme',
LAYOUT: 'Decoration',
CHAT_BUBBLE: 'Chat Bubble',
FLOAT_PICTURE: 'Floating Image',
FRAGMENTS: 'Fragments',
DATA_CARD: 'Profile Card',
SPECIAL_ID: 'Special ID',
CUSTOMIZE: 'Custom (Read-only)',
RED_PACKET: 'Red Packet Cover'
},
nobleVipTypes: {
VISCOUNT: 'Viscount',
EARL: 'Earl',
MARQUIS: 'Marquis',
DUKE: 'Duke',
KING: 'King',
EMPEROR: 'Emperor'
},
dialog: {
salesReport: 'Sales Report'
},
summary: {
monthTotal: 'Monthly Sales Total',
yearTotal: 'Yearly Sales Total',
separator: ', '
},
chart: {
dailySales: 'Daily Sales'
},
message: {
noPermission: 'Sorry, you do not have permission to view this page. Please contact an administrator to enable View permission for Prop Management - Resource Configuration, props:config:query',
uploadSvgaTip: 'Only svga/pag/mp4 files can be uploaded'
},
validation: {
required: 'Required field cannot be empty'
}
},
propsStore: { propsStore: {
filter: { filter: {
system: 'System', system: 'System',
@ -6746,6 +7537,142 @@ export default {
roomTransactions: 'Room Transactions' roomTransactions: 'Room Transactions'
} }
}, },
teamBill: {
loading: 'Loading',
placeholder: {
region: 'Region',
billStatus: 'Bill Status',
agentId: 'Agent ID',
billId: 'Bill ID',
selectMonth: 'Select Month',
remarks: 'Please enter remarks',
selectRegion: 'Please select a region',
selectPolicy: 'Please select a policy',
selectSettleType: 'Please select a settlement type',
goldQuantity: 'Please enter the gold amount. The system will not send it automatically.',
salaryQuantity: 'Please enter salary USD'
},
date: {
rangeSeparator: 'To',
start: 'Start Date',
end: 'End Date'
},
action: {
search: 'Search',
export: 'Export',
details: 'Details',
loadMore: 'Load More',
loadedAll: 'All Loaded',
cancel: 'Cancel',
confirm: 'Confirm',
close: 'Close',
save: 'Save',
add: 'Add'
},
table: {
agent: 'Agent',
region: 'Region',
belong: 'Belonging',
salary: 'Salary',
updatedBy: 'Updated By',
time: 'Time',
actions: 'Actions'
},
label: {
memberAgent: 'Member/Agent',
total: 'Total',
created: 'Created',
updated: 'Updated',
region: 'Region',
billBelong: 'Bill Belonging',
billTitle: 'Bill Title',
status: 'Status',
workMembers: 'Working Members',
finishMembers: 'Completed Members',
memberSalary: 'Member Salary',
agentSalary: 'Agent Salary',
deductSalary: 'Deducted Salary',
totalSalary: 'Total Salary',
memberSalaryUsd: 'Member Salary USD',
agentSalaryUsd: 'Agent Salary USD',
totalSalaryUsd: 'Total Salary USD',
externalRemarks: 'External Remarks',
remarks: 'Remarks',
policy: 'Policy',
type: 'Type',
gold: 'Gold',
salaryUsd: 'Salary USD',
voucherUpload: 'Voucher Upload'
},
status: {
UNPAID: 'Unbilled',
PAY_OUT: 'Issued',
SETTLED: 'Settled',
HANG_UP: 'On Hold',
PRE_CREATION: 'Pre-created',
CLOSE: 'Closed'
},
settleType: {
MONEY: 'USD',
GOLD: 'Gold',
MONEY_GOLD: 'USD + Gold'
},
exportDialog: {
title: 'Export Conditions',
region: 'Region',
status: 'Status',
time: 'Time'
},
detailsDrawer: {
title: 'Details'
},
section: {
agent: 'Agent',
billInfo: 'Bill Information',
internalRemarks: 'Internal Remarks',
bankCard: 'Bank Card'
},
internalRemarkDrawer: {
title: 'Remarks',
empty: 'Click the button below to add remarks.'
},
remarkDrawer: {
title: 'Edit Remarks'
},
statusDrawer: {
title: 'Status Change'
},
settleDrawer: {
title: 'Settle Bill',
policyCalculation: 'Policy Calculation',
settlement: 'Settlement',
policyTips: {
calculate: '* Calculate team member salary based on the selected region and policy.',
workMembers: '* Users counted as working members include online activity, room transactions, sent gifts, and received gifts recorded in the work bill.',
policyBasis: '* The policy calculation uses the target gift data in the selected region and policy.'
},
settleTips: {
region: '* Region: select the settlement region. Switching regions affects the policy used for this settlement.',
policy: '* Policy: the policy used for team settlement.',
payee: '* Payee: bank card information for settlement. Settlement staff should match it with the transfer voucher screenshot.',
type: '* Type: USD sends USD; Gold converts salary to gold and requires manual gold quantity input; USD + Gold splits the salary into gold and USD for offline coordination.',
voucher: '* Transfer Voucher: screenshot record after settlement staff send gold or USD.',
remarks: '* Remarks: external note shown for this bill.'
}
},
validation: {
requiredField: 'Required field cannot be empty',
uploadVoucherFirst: 'Please upload at least one voucher'
},
message: {
notImplemented: 'Not implemented yet',
exporting: 'Export in progress, please wait',
downloadFailed: 'Download failed',
submitting: 'Submitting, please wait',
maxRemarks: 'You can add up to 20 remarks. Delete unnecessary remarks before adding more.',
calculatingSalary: 'Calculating policy salary, please wait'
}
},
teamDetailsDrawer: { teamDetailsDrawer: {
title: 'Details', title: 'Details',
section: { section: {

View File

@ -552,6 +552,7 @@ export default {
} }
}, },
userDetailsDrawer: { userDetailsDrawer: {
title: '用户详情',
section: { section: {
photoWall: '照片墙' photoWall: '照片墙'
}, },
@ -559,6 +560,9 @@ export default {
candy: '糖果', candy: '糖果',
vip: '会员', vip: '会员',
mobileNumber: '手机号码' mobileNumber: '手机号码'
},
message: {
permissionDenied: '权限不足,请联系管理员授权:组件权限/用户资料面板/查看(user:profile:panel:query)'
} }
}, },
accountHandle: { accountHandle: {
@ -603,6 +607,353 @@ export default {
dayPlural: '{days}天' dayPlural: '{days}天'
} }
}, },
userAvatarApproval: {
filter: {
system: '归属系统',
approvalStatus: '审批状态',
userId: '用户ID',
gender: '性别'
},
date: {
rangeSeparator: '至',
start: '开始日期',
end: '结束日期'
},
action: {
search: '搜索',
editUser: '编辑用户',
accountHandle: '账号处理',
pass: '鉴定通过',
reject: '鉴定违规'
},
selection: {
all: '全选',
selected: '选中'
},
label: {
nickname: '昵称',
gender: '性别',
age: '年龄',
selectedCount: '已勾选'
},
approvalStatus: {
PASS: '通过',
NOT_PASS: '不通过',
PENDING: '等待审核'
},
gender: {
male: '男',
female: '女'
},
confirm: {
title: '提示'
},
message: {
selectApprovalItem: '请勾选审批项',
confirmApproval: '确认审核选中记录吗?',
success: '成功',
failure: '失败',
genderChangeSuccess: "{nickname} 性别变更 '{gender}'",
genderChangeFailed: '{nickname} 性别变更失败!'
}
},
userPhotoWallApproval: {
filter: {
status: '状态',
userId: '用户ID',
nickname: '昵称',
gender: '性别'
},
date: {
rangeSeparator: '至',
start: '开始日期',
end: '结束日期'
},
action: {
search: '搜索',
editUser: '编辑用户',
pass: '鉴定通过',
reject: '鉴定违规'
},
selection: {
all: '全选',
selected: '选中'
},
label: {
nickname: '昵称',
gender: '性别',
age: '年龄',
tags: '标签',
selectedCount: '已勾选'
},
approvalStatus: {
NORMAL: '正常的',
VIOLATION: '违规的',
SUSPECTED: '等待人工复审的'
},
gender: {
male: '男',
female: '女'
},
confirm: {
title: '提示'
},
message: {
selectApprovalItem: '请勾选审批项',
confirmApproval: '确认审核选中记录吗?',
success: '成功'
}
},
roomCoverApproval: {
filter: {
system: '归属系统',
roomAccount: '房间账号',
userId: '用户ID',
approvalStatus: '审批状态'
},
date: {
rangeSeparator: '至',
start: '开始日期',
end: '结束日期'
},
action: {
search: '搜索',
editUser: '编辑用户',
accountHandle: '账号处理',
pass: '鉴定通过',
reject: '鉴定违规'
},
selection: {
all: '全选',
selected: '选中'
},
popover: {
details: '详情'
},
label: {
roomId: '房间ID',
userId: '用户ID',
nickname: '昵称',
gender: '性别',
age: '年龄',
selectedCount: '已勾选了'
},
approvalStatus: {
PASS: '通过',
NOT_PASS: '不通过',
PENDING: '等待审核'
},
gender: {
male: '男',
female: '女'
},
confirm: {
title: '提示'
},
message: {
selectApprovalItem: '请勾选审批项',
confirmApproval: '确认审核选中记录吗?',
success: '成功'
}
},
userNicknameApproval: {
filter: {
system: '归属系统',
userId: '用户ID',
approvalStatus: '审批状态'
},
date: {
rangeSeparator: '至',
start: '开始日期',
end: '结束日期'
},
action: {
search: '搜索',
userDetails: '用户详情',
accountHandle: '账号处理',
pass: '鉴定通过',
reject: '鉴定违规'
},
table: {
userId: '用户ID',
nickname: '昵称',
updateTime: '修改时间',
actions: '操作'
},
label: {
selectedCount: '已勾选'
},
approvalStatus: {
PASS: '通过',
NOT_PASS: '不通过',
PENDING: '等待审核'
},
confirm: {
title: '提示'
},
message: {
selectApprovalItem: '请勾选审批项',
confirmApproval: '确认审核选中记录吗?',
success: '成功'
}
},
userProfileDescApproval: {
filter: {
userId: '用户ID',
approvalStatus: '审批状态'
},
date: {
rangeSeparator: '至',
start: '开始日期',
end: '结束日期'
},
action: {
search: '搜索',
userDetails: '用户详情',
pass: '鉴定通过',
reject: '鉴定违规'
},
table: {
nickname: '昵称',
signature: '签名',
updateTime: '修改时间',
actions: '操作'
},
label: {
selectedCount: '已勾选了'
},
approvalStatus: {
PASS: '通过',
NOT_PASS: '不通过',
PENDING: '等待审核'
},
confirm: {
title: '提示'
},
message: {
selectApprovalItem: '请勾选审批项',
confirmApproval: '确认审核选中记录吗?'
}
},
feedback: {
filter: {
system: '归属系统',
userId: '反馈用户ID',
approvalStatus: '审核状态',
backendMember: '后台成员'
},
action: {
search: '搜索',
batchProcess: '批量处理',
process: '处理'
},
detail: {
phoneModel: '手机型号',
appVersion: 'App版本',
deviceId: '设备号',
content: '反馈内容',
remarks: '备注',
latestProcessor: '最近处理人'
},
table: {
system: '系统',
feedbackUser: '反馈用户',
processStatus: '处理状态',
createdAt: '创建时间',
updatedAt: '修改时间',
actions: '操作'
},
status: {
notLoggedIn: '未登录'
},
approvalStatus: {
unprocessed: '未处理',
processed: '已处理',
pending: '待处理'
},
confirm: {
title: '提示'
},
message: {
selectUnprocessedFirst: '选择审核状态下拉框为【{status}】,再操作',
selectApprovalItem: '请勾选审批项',
confirmApproval: '确认审核选中记录吗?',
batchProcessSuccess: '批量处理成功'
},
drawer: {
title: '反馈处理',
result: '处理结果',
submit: '提交'
}
},
videoPlayer: {
playbackSpeed: '倍速'
},
userReportApproval: {
filter: {
system: '归属系统',
status: '状态',
reportType: '举报类型',
reporterId: '举报人ID',
reportedUserId: '被举报人ID',
adminMember: '后台成员'
},
date: {
rangeSeparator: '至',
start: '开始日期',
end: '结束日期'
},
action: {
search: '搜索',
accountHandle: '账号处理',
valid: '有效',
invalid: '无效'
},
tag: {
report: '举报',
suspected: '涉嫌'
},
label: {
reportContent: '举报内容',
latestHandler: '最近处理人',
selectedCount: '已勾选了'
},
table: {
reportType: '举报类型',
createTime: '创建时间',
updateTime: '修改时间',
actions: '操作'
},
description: {
title: '操作描述',
noDirectAction: '举报审批不会对用户信息及资源做“任何处理”,处理需要到对应的资源模块进行审批',
valid: '* 有效:表示举报有效,系统将发放“参数配置”中指定糖果数量奖励给举报提交用户',
invalid: '* 无效:表示举报无效'
},
reportStatus: {
0: '待审核',
1: '有效举报',
2: '无效举报'
},
reportType: {
0: '非法信息',
1: '人身攻击',
2: '不适当的内容',
3: '发送垃圾邮件',
4: '诈骗',
5: '涉及色情'
},
confirm: {
title: '提示'
},
message: {
selectApprovalItem: '请勾选审批项',
confirmApproval: '确认审核选中记录吗?',
success: '成功',
copySuccess: '复制成功',
copyFailed: '复制失败'
}
},
accountInput: { accountInput: {
placeholder: { placeholder: {
type: '类型', type: '类型',
@ -1540,6 +1891,178 @@ export default {
createdAt: '创建时间' createdAt: '创建时间'
} }
}, },
userDiamondRunWater: {
loading: '加载中',
filter: {
system: '系统',
userId: '用户ID',
type: '类型',
origin: '请输入或选择内容'
},
action: {
search: '搜索'
},
type: {
income: '收入',
expense: '支出'
},
table: {
user: '用户',
diamondBalance: '钻石余额',
diamond: '钻石',
source: '来源',
sourceDescription: '来源描述',
type: '类型',
remarks: '备注',
createdAt: '创建时间'
},
origin: {
ACTIVITY_REWARD: '活动奖励',
ROOM_SUPPORT_REWARD: '房间扶持奖励',
ROOM_HOMEOWNER_SUPPORT_REWARD: '房间扶持奖励 - 房主奖励',
CP_REWARD: 'CP奖励',
GAME_BURST_CRYSTAL: '爆水晶游戏',
ROOM_REWARD: '房间奖励',
WEEK_STAR: '周星',
INVITED_NEW_USER_REWARD: '邀请新用户注册奖励',
INVITED_USER_FIRST_RECHARGE_REWARD: '邀请用户首次充值奖励',
INVITE_REGISTER: '邀请用户注册',
INVITE_FIRST_RECHARGE: '邀请的用户首次充值',
INVITED_USER_EACH_RECHARGE: '邀请用户每笔充值奖励百分比',
PURCHASE_NOBLE_VIP: '购买贵族VIP',
PURCHASE_NOBLE_VIP_GIVEAWAY: '购买赠送贵族VIP-钻石',
PURCHASING_AVATAR_FRAME: '购买头像框-钻石',
PURCHASING_DATA_CARD: '购买资料卡-钻石',
PURCHASING_CHAT_BUBBLE: '购买聊天气泡-钻石',
PURCHASING_CAR: '购买车辆-钻石',
PURCHASING_LAYOUT: '购买装扮-钻石',
PURCHASING_AVATAR_FRAME_GIVEAWAY: '赠送头像框-钻石',
PURCHASING_DATA_CARD_GIVEAWAY: '购买资料卡-钻石',
PURCHASING_CHAT_BUBBLE_GIVEAWAY: '赠送聊天气泡-钻石',
PURCHASING_THEME: '购买主题-钻石',
PURCHASING_THEME_GIVEAWAY: '赠送主题-钻石',
PURCHASING_CAR_GIVEAWAY: '赠送车辆',
PURCHASING_LAYOUT_GIVEAWAY: '赠送装扮',
GIVE_GIFT: '赠送礼物',
ACCEPT_GIFT: '接收礼物',
COMPENSATE: '补给',
REMOVE: '违规扣除',
WEEK_USER_CONSUME: '国王王后King',
DIAMOND_EXCHANGE_GOLD: '钻石兑换金币',
LIVE_BROADCAST_INTEGRAL: '直播积分',
DAILY_TASK: '每日任务',
CHECK_IN_DIAMOND: '钻石打卡',
CUMULATIVE_RECHARGE_REWARDS: '累计充值奖励',
OFFICIAL_GIFT: '官方赠送',
EXPIRED: '过期',
INVITE_USER_RED_PACKET_LOTTERY: '邀请用户红包抽奖',
REWARD_DIAMOND: '后台奖励钻石',
DEDUCT_DIAMOND: '后台扣除钻石'
}
},
userDiamondBalance: {
filter: {
userId: '用户ID'
},
action: {
search: '搜索'
},
table: {
user: '用户',
balance: '余额',
createdAt: '创建时间'
}
},
integralStream: {
tab: {
current: '积分流水',
history: '历史积分流水'
},
filter: {
userId: '用户ID',
origin: '积分来源'
},
date: {
rangeSeparator: '至',
start: '开始日期',
end: '结束日期'
},
action: {
search: '搜索'
},
alert: {
title: '注意',
retention: '数据只会保留30天。'
},
table: {
nickname: '昵称',
sourceObject: '来源对象',
pointsOrigin: '积分来源',
points: '获得积分',
createdAt: '创建时间'
},
origin: {
CLUB: 'Club聊天',
VIDEO_ACTIVE_CALL: '视频电话',
VIDEO_MATCH_ALL: '匹配所有',
VIDEO_CONDITION_FEMALE: '匹配女生',
VIDEO_CONDITION_GODDESS: '匹配女神',
CHAT_CONSUME_CANDY: '文本聊天',
GIFT: '赠送礼物',
SHORT_VIDEO_WATCH_AD_SETTLE_ACCOUNTS: '短视频广告结算'
}
},
userFreightInfoList: {
filter: {
system: '系统',
sender: '发送用户',
receiver: '接收用户',
origin: '来源'
},
date: {
rangeSeparator: '至',
start: '日期开始',
end: '日期结束'
},
action: {
search: '搜索',
export: '导出',
close: '关闭'
},
table: {
system: '系统',
user: '用户',
receiver: '接收人',
type: '类型',
quantity: '数量',
balance: '余额',
origin: '来源',
remark: '备注',
createdAt: '创建时间'
},
type: {
income: '收入',
expense: '支出'
},
origin: {
SHIPMENT: '出货',
PURCHASE: '进货',
DEDUCTION: '扣除'
},
exportDialog: {
title: '导出条件',
system: '系统',
month: '月份',
selectMonth: '选择月'
},
validation: {
requiredField: '必填字段不可为空'
},
message: {
exporting: '正在执行导出,请稍等',
downloadFailed: '下载失败'
}
},
salaryDiamondRunningWaterDialog: { salaryDiamondRunningWaterDialog: {
loading: '加载中', loading: '加载中',
dialog: { dialog: {
@ -2366,6 +2889,178 @@ export default {
success: '成功' success: '成功'
} }
}, },
teamList: {
filter: {
region: '区域',
status: '状态',
agentId: '代理ID',
memberQuantityRange: '开始~结束成员数量',
dateRangeSeparator: '至',
startDate: '开始日期',
endDate: '结束日期',
backendMember: '后台成员'
},
table: {
agent: '代理',
info: '信息',
member: '成员',
status: '状态',
available: '正常',
close: '关闭',
region: '区域',
remark: '备注',
createdBy: '创建人',
updatedBy: '修改人',
time: '时间',
createdAt: '创建',
updatedAt: '修改',
actions: '操作'
},
action: {
search: '搜索',
add: '新增',
delete: '删除',
details: '资料详情',
editProfile: '修改资料',
bindBd: '绑定BD',
remarks: '备注信息',
contact: '联系方式',
sendNotice: '发送通知',
noticeRecords: '通知记录',
teamApplications: '团队申请',
query: '查询',
loadMore: '加载更多',
allLoaded: '已加载全部',
close: '关闭',
save: '保存',
cancel: '取消',
confirm: '确定',
submit: '提交'
},
confirm: {
deleteTitle: '提示',
deleteMessage: '系统将移除团队所有数据,操作不可逆!(主播工作/账单/团队信息/团队成员/BD关系等所有',
confirmDeleteNotice: '确认删除吗?',
sendNotice: '确认发送通知吗?',
changeRegionMessage: '变更代理团队区域将清空该代理名下所有主播目标,你确定继续吗?'
},
permission: {
validating: '权限验证中...',
deniedPrefix: '抱歉您无权查看,请联系管理员开通查看权限',
deniedCode: '【主播中心/代理列表:(team:list:query:all/team:list:query:self)】'
},
validation: {
requiredField: '必填字段不可为空',
titleRequired: '请输入标题',
contentRequired: '请输入内容'
},
message: {
submitting: '正在提交!',
maxRemarks: '最多添加20条备注请删除不必要的备注后重新添加'
},
statusMap: {
AVAILABLE: '正常',
CLOSE: '关闭'
},
processStatusMap: {
WAIT: '待审核',
AGREE: '同意',
REJECT: '驳回'
},
reasonMap: {
JOIN: '加入',
QUIT: '退出',
EXIT: '退出'
},
approvalReasonMap: {
MEMBER_JOIN: '成员加入',
MEMBER_QUIT: '成员主动退出',
MEMBER_OWN_REMOVE: '代理主动删除成员',
MEMBER_ADMIN_REMOVE: '管理员主动删除成员',
MEMBER_APPLY_TIME_OUT: '长时间未处理申请消息,自动退出',
REMOVE_MEMBER_NOT_ACTIVE: '移除不活跃成员',
SYSTEM_MEMBER_REMOVE: '系统检测自动移除',
SWITCH_TEAM_OWN: '更换团长',
SWITCH_TEAM_REMOVE: '切换团队移除'
},
bindBd: {
title: '绑定BD',
bdAccount: '请输入BD账号'
},
applicationProcess: {
title: '申请团队成员列表',
status: '审核状态',
reason: '原因',
applicationType: '申请类型',
reviewStatus: '审核状态',
createdBy: '创建人',
updatedBy: '修改人'
},
contact: {
title: '联系方式',
emptyTip: '点击下方按钮添加“联系方式”',
type: '类型',
contact: '联系',
remark: '备注',
dialogTitle: '联系方式',
selectType: '选择类型',
contactPlaceholder: '请输入联系方式',
remarkPlaceholder: '请输入备注'
},
edit: {
title: '团队资料',
regionChangeWarning: '注意:变更代理团队区域将清空该代理名下所有主播目标,请谨慎操作',
region: '区域',
country: '国家',
settingInfo: '设置信息',
memberQuantity: '成员数量',
maxMember: '最大成员数量',
hostSalaryToAgent: '代理接收主播工资',
withdrawalEnabled: '允许提现'
},
noticeList: {
title: '团队通知记录',
titleLabel: '标题',
contentLabel: '内容',
sender: '发送人'
},
noticeSend: {
title: '发送团队通知',
titleLabel: '标题',
content: '内容',
link: '链接',
cover: '封面'
},
remark: {
title: '备注',
emptyTip: '点击下方按钮添加“备注”',
placeholder: '请输入备注'
},
teamStatus: {
title: '状态变更',
warning: '关闭系统将移除团队所有数据,操作不可逆!(主播工作/账单/团队信息/团队成员/BD关系等所有',
status: '状态',
close: '关闭',
available: '启动',
remarks: '备注'
},
switchOwn: {
title: '更换团长',
warning: '历史团队如果存在工作数据将会被清理团队未解散BD关系将继续维持',
agent: '代理',
agentPlaceholder: '请输入代理ID'
},
processApproval: {
title: '申请团队日志列表',
processedUserId: '被处理人ID',
reason: '原因',
reasonLabel: '原因',
processedUser: '被处理人',
operator: '操作人',
creator: '创建人',
createdAt: '创建时间'
}
},
teamCreate: { teamCreate: {
dialog: { dialog: {
title: '创建代理' title: '创建代理'
@ -5859,6 +6554,102 @@ export default {
GAME_FRUIT_BOX_REWARD_TIMES: '水果游戏宝箱次数奖励' GAME_FRUIT_BOX_REWARD_TIMES: '水果游戏宝箱次数奖励'
} }
}, },
propsResourceConfig: {
filter: {
system: '归属系统',
type: '类型',
shelfStatus: '上/下架',
name: '名称'
},
table: {
code: '编号',
type: '类型',
name: '名称',
resource: '资源',
shelfStatus: '上/下架',
basePrice: '底价',
actions: '操作'
},
form: {
system: '系统',
type: '类型',
cover: '封面',
coverPreview: '封面预览图',
roomSendCover: '房间发送页图',
roomNotOpened: '房间拆红包大图',
roomOpened: '房间红包已打开大图',
imSendCover: 'IM发送页图',
imNotOpened: 'IM/房间封面未打开小图',
imOpened: 'IM/房间封面已打开小图',
imOpenedTwo: 'IM/房间封面已打开小图2',
iosResource: 'iOS 资源',
androidResource: 'Android 资源',
roomBackground: '房间装扮背景',
name: '名称',
code: '编码',
basePrice: '底价'
},
placeholder: {
nobleType: '贵族类型',
codeReadonly: '编码添加后不能修改',
month: '选择月'
},
action: {
search: '搜索',
add: '添加',
edit: '修改',
sales: '销售情况',
upload: '点击上传',
save: '保存',
cancel: '取消'
},
status: {
onShelf: '上架',
offShelf: '下架',
yes: '是',
no: '否'
},
propsTypes: {
AVATAR_FRAME: '头像框',
RIDE: '座驾',
NOBLE_VIP: '贵族',
THEME: '主题',
LAYOUT: '装扮',
CHAT_BUBBLE: '聊天气泡',
FLOAT_PICTURE: '飘窗',
FRAGMENTS: '碎片',
DATA_CARD: '资料卡',
SPECIAL_ID: '靓号',
CUSTOMIZE: '自定义(只读)',
RED_PACKET: '红包封面'
},
nobleVipTypes: {
VISCOUNT: '子爵',
EARL: '伯爵',
MARQUIS: '侯爵',
DUKE: '公爵',
KING: '国王',
EMPEROR: '皇帝'
},
dialog: {
salesReport: '销售报表'
},
summary: {
monthTotal: '月销售总额',
yearTotal: '年售额',
separator: '、'
},
chart: {
dailySales: '每日销售情况'
},
message: {
noPermission: '抱歉您无权查看,请联系管理员开通查看权限【道具管理-资源配置-查看props:config:query】',
uploadSvgaTip: '只能上传svga/pag/mp4文件'
},
validation: {
required: '必填字段不可为空'
}
},
propsStore: { propsStore: {
filter: { filter: {
system: '归属系统', system: '归属系统',
@ -6743,6 +7534,142 @@ export default {
roomTransactions: '房间流水' roomTransactions: '房间流水'
} }
}, },
teamBill: {
loading: '加载中',
placeholder: {
region: '区域',
billStatus: '账单状态',
agentId: '代理ID',
billId: '账单ID',
selectMonth: '选择月',
remarks: '请输入备注',
selectRegion: '请选择区域',
selectPolicy: '请选择政策',
selectSettleType: '请选择结算类型',
goldQuantity: '请输入金币数量,系统不会自动发送',
salaryQuantity: '请输入工资$'
},
date: {
rangeSeparator: '至',
start: '开始日期',
end: '结束日期'
},
action: {
search: '搜索',
export: '导出',
details: '详情',
loadMore: '加载更多',
loadedAll: '已加载全部',
cancel: '取消',
confirm: '确定',
close: '关闭',
save: '保存',
add: '新增'
},
table: {
agent: '代理',
region: '区域',
belong: '归属',
salary: '工资',
updatedBy: '修改人',
time: '时间',
actions: '操作'
},
label: {
memberAgent: '成员/代理',
total: '合计',
created: '创建',
updated: '修改',
region: '区域',
billBelong: '账单归属',
billTitle: '账单标题',
status: '状态',
workMembers: '工作人数',
finishMembers: '完成人数',
memberSalary: '成员工资',
agentSalary: '团长工资',
deductSalary: '扣除工资',
totalSalary: '合计工资',
memberSalaryUsd: '成员工资$',
agentSalaryUsd: '团长工资$',
totalSalaryUsd: '合计工资$',
externalRemarks: '对外备注',
remarks: '备注',
policy: '政策',
type: '类型',
gold: '金币',
salaryUsd: '工资$',
voucherUpload: '凭证上传'
},
status: {
UNPAID: '未出账',
PAY_OUT: '已出账',
SETTLED: '已结算',
HANG_UP: '挂起',
PRE_CREATION: '预创建',
CLOSE: '已关闭'
},
settleType: {
MONEY: '美元',
GOLD: '金币',
MONEY_GOLD: '美元+金币'
},
exportDialog: {
title: '导出条件',
region: '区域',
status: '状态',
time: '时间'
},
detailsDrawer: {
title: '详情'
},
section: {
agent: '代理',
billInfo: '账单信息',
internalRemarks: '内部备注',
bankCard: '银行卡'
},
internalRemarkDrawer: {
title: '备注',
empty: '点击下方按钮添加“备注”'
},
remarkDrawer: {
title: '编辑备注'
},
statusDrawer: {
title: '状态变更'
},
settleDrawer: {
title: '结算账单',
policyCalculation: '政策计算',
settlement: '结算',
policyTips: {
calculate: '* 根据选择“区域+政策”计算团队成员工资情况',
workMembers: '* 在线、房间流水、发送礼物、收礼物都会记录到工作账单并计入工作人数',
policyBasis: '* 政策计算会使用所选“区域+政策”中政策数据的收礼目标'
},
settleTips: {
region: '* 区域:选择本次团队结算区域,切换区域会影响本次结算政策',
policy: '* 政策:团队结算对应的政策',
payee: '* 收款:结算到用户的银行卡信息,结算人员需与转账凭证截图对应',
type: '* 类型:美元会发送美元;金币会将工资折算金币并需手动输入金币数量;美元+金币会拆分为部分金币和部分美元',
voucher: '* 转账凭证:结算人员发送金币或美元后的记录凭证截图',
remarks: '* 备注:本次账单对外显示的备注'
}
},
validation: {
requiredField: '必填字段不可为空',
uploadVoucherFirst: '最少上传1张凭证'
},
message: {
notImplemented: '还没有实现',
exporting: '正在执行导出,请稍等',
downloadFailed: '下载失败',
submitting: '正在提交,请稍等',
maxRemarks: '最多添加20条备注请删除不必要的备注后重新添加',
calculatingSalary: '正在计算政策工资,请稍等'
}
},
teamDetailsDrawer: { teamDetailsDrawer: {
title: '详情', title: '详情',
section: { section: {

View File

@ -1,11 +1,10 @@
<!--房间封面审批-->
<template> <template>
<div class="app-container"> <div class="app-container">
<div class="filter-container"> <div class="filter-container">
<el-select <el-select
v-model="listQuery.sysOrigin" v-model="listQuery.sysOrigin"
placeholder="归属系统" :placeholder="$t('pages.userAvatarApproval.filter.system')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -22,7 +21,7 @@
</el-select> </el-select>
<el-select <el-select
v-model="listQuery.approveStatus" v-model="listQuery.approveStatus"
placeholder="审批状态" :placeholder="$t('pages.userAvatarApproval.filter.approvalStatus')"
style="width: 240px" style="width: 240px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -30,7 +29,7 @@
<el-option <el-option
v-for="item in commonApprovalStatus" v-for="item in commonApprovalStatus"
:key="item.value" :key="item.value"
:label="item.name" :label="approvalStatusName(item.value)"
:value="item.value" :value="item.value"
:disabled="item.value == 'NOT_PASS'" :disabled="item.value == 'NOT_PASS'"
/> />
@ -41,18 +40,18 @@
type="datetimerange" type="datetimerange"
value-format="timestamp" value-format="timestamp"
:picker-options="pickerOptions" :picker-options="pickerOptions"
range-separator="" :range-separator="$t('pages.userAvatarApproval.date.rangeSeparator')"
start-placeholder="开始日期" :start-placeholder="$t('pages.userAvatarApproval.date.start')"
end-placeholder="结束日期" :end-placeholder="$t('pages.userAvatarApproval.date.end')"
align="right" align="right"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" placeholder="用户ID" /> <account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" :placeholder="$t('pages.userAvatarApproval.filter.userId')" />
</div> </div>
<el-select <el-select
v-model="listQuery.userSex" v-model="listQuery.userSex"
placeholder="性别" :placeholder="$t('pages.userAvatarApproval.filter.gender')"
clearable clearable
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@ -60,7 +59,7 @@
<el-option <el-option
v-for="item in genders" v-for="item in genders"
:key="item.value" :key="item.value"
:label="item.name" :label="genderName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
@ -71,10 +70,10 @@
:disabled="searchDisabled" :disabled="searchDisabled"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.userAvatarApproval.action.search') }}
</el-button> </el-button>
</div> </div>
<el-checkbox v-model="checkAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">全选</el-checkbox> <el-checkbox v-model="checkAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">{{ $t('pages.userAvatarApproval.selection.all') }}</el-checkbox>
<div style="margin: 15px 0;" /> <div style="margin: 15px 0;" />
<el-row v-loading="listLoading" :gutter="10"> <el-row v-loading="listLoading" :gutter="10">
<el-col v-for="(item, index) in list" :key="index" :span="4" style="margin-bottom: 10px;"> <el-col v-for="(item, index) in list" :key="index" :span="4" style="margin-bottom: 10px;">
@ -97,36 +96,36 @@
<div style="padding: 14px"> <div style="padding: 14px">
<div class="bottom"> <div class="bottom">
<el-checkbox-group v-model="checkList"> <el-checkbox-group v-model="checkList">
<el-checkbox :key="item.userId" :label="index">选中</el-checkbox> <el-checkbox :key="item.userId" :label="index">{{ $t('pages.userAvatarApproval.selection.selected') }}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
<!--<el-table-column type="radio" width="55" />--> <!--<el-table-column type="radio" width="55" />-->
<div class="info" @click="handleClickCard(index)"> <div class="info" @click="handleClickCard(index)">
<div>昵称 <a class="underline" @click.stop="queryUserDetails(item.userId)">{{ item.userNickname }}</a></div> <div>{{ $t('pages.userAvatarApproval.label.nickname') }}: <a class="underline" @click.stop="queryUserDetails(item.userId)">{{ item.userNickname }}</a></div>
<div class="line"> <div class="line">
<div>性别 <div>{{ $t('pages.userAvatarApproval.label.gender') }}:
<el-dropdown v-loading="item.loading"> <el-dropdown v-loading="item.loading">
<span class="el-dropdown-link"> <span class="el-dropdown-link">
{{ item.userSexName }}<i class="el-icon-arrow-down el-icon--right" /> {{ genderName(item.userSex, item.userSexName) }}<i class="el-icon-arrow-down el-icon--right" />
</span> </span>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item v-if="item.userSex === 0" @click.native="changeGender(item, 1)"></el-dropdown-item> <el-dropdown-item v-if="item.userSex === 0" @click.native="changeGender(item, 1)">{{ $t('pages.userAvatarApproval.gender.male') }}</el-dropdown-item>
<el-dropdown-item v-if="item.userSex === 1" @click.native="changeGender(item, 0)"></el-dropdown-item> <el-dropdown-item v-if="item.userSex === 1" @click.native="changeGender(item, 0)">{{ $t('pages.userAvatarApproval.gender.female') }}</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</div> </div>
<div>年龄{{ item.age }} </div> <div>{{ $t('pages.userAvatarApproval.label.age') }}: {{ item.age }} </div>
</div> </div>
<div v-if="item.approvalUserName" class="seal-block seal-danger approval-user">{{ item.approvalUserName }}</div> <div v-if="item.approvalUserName" class="seal-block seal-danger approval-user">{{ item.approvalUserName }}</div>
</div> </div>
<el-button type="text" class="button" @click="editUserForm(item.userId)">编辑用户</el-button> <el-button type="text" class="button" @click="editUserForm(item.userId)">{{ $t('pages.userAvatarApproval.action.editUser') }}</el-button>
<el-button type="text" class="button" @click="accountHanle(item.userId)">账号处理</el-button> <el-button type="text" class="button" @click="accountHanle(item.userId)">{{ $t('pages.userAvatarApproval.action.accountHandle') }}</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>
<div style="text-align:center;"> <div style="text-align:center;">
<div style="padding:5px;font-size:14px;color:#909399">已勾选了:<span style="color:#F00">{{ checkList.length }}</span></div> <div style="padding:5px;font-size:14px;color:#909399">{{ $t('pages.userAvatarApproval.label.selectedCount') }}: <span style="color:#F00">{{ checkList.length }}</span></div>
<el-button <el-button
v-if="isAllowApproval" v-if="isAllowApproval"
class="filter-item" class="filter-item"
@ -134,7 +133,7 @@
icon="el-icon-folder-checked" icon="el-icon-folder-checked"
@click="pass" @click="pass"
> >
鉴定通过 {{ $t('pages.userAvatarApproval.action.pass') }}
</el-button> </el-button>
<el-button <el-button
@ -143,7 +142,7 @@
icon="el-icon-folder-delete" icon="el-icon-folder-delete"
@click="notpass" @click="notpass"
> >
鉴定违规 {{ $t('pages.userAvatarApproval.action.reject') }}
</el-button> </el-button>
</div> </div>
<pagination <pagination
@ -270,7 +269,6 @@ export default {
handleSearch() { handleSearch() {
this.renderData(true) this.renderData(true)
}, },
//
cutout(cellValue) { cutout(cellValue) {
if (cellValue != null) { if (cellValue != null) {
return cellValue.replace(/\,/g, '</br>') return cellValue.replace(/\,/g, '</br>')
@ -290,13 +288,25 @@ export default {
} }
this.isIndeterminate = false this.isIndeterminate = false
}, },
approvalStatusName(status) {
return this.$t(`pages.userAvatarApproval.approvalStatus.${status}`)
},
genderName(gender, fallback = '') {
if (gender === 0) {
return this.$t('pages.userAvatarApproval.gender.female')
}
if (gender === 1) {
return this.$t('pages.userAvatarApproval.gender.male')
}
return fallback
},
pass() { pass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.userAvatarApproval.message.selectApprovalItem'))
return return
} }
that.$confirm('确认审核选中记录吗?', '提示', { that.$confirm(that.$t('pages.userAvatarApproval.message.confirmApproval'), that.$t('pages.userAvatarApproval.confirm.title'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
that.listLoading = true that.listLoading = true
@ -314,10 +324,10 @@ export default {
notpass() { notpass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.userAvatarApproval.message.selectApprovalItem'))
return return
} }
that.$confirm('确认审核选中记录吗?', '提示', { that.$confirm(that.$t('pages.userAvatarApproval.message.confirmApproval'), that.$t('pages.userAvatarApproval.confirm.title'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
that.listLoading = true that.listLoading = true
@ -339,7 +349,7 @@ export default {
renderDataSuccess() { renderDataSuccess() {
this.$message({ this.$message({
message: 'Successful', message: this.$t('pages.userAvatarApproval.message.success'),
type: 'success' type: 'success'
}) })
this.renderData() this.renderData()
@ -375,18 +385,18 @@ export default {
item.loading = true item.loading = true
updateBaseInfo({ id: item.userId, userSex }).then(res => { updateBaseInfo({ id: item.userId, userSex }).then(res => {
item.loading = false item.loading = false
const userSexName = userSex === 0 ? '女' : '男' const userSexName = that.genderName(userSex)
that.$notify.success({ that.$notify.success({
title: '成功', title: that.$t('pages.userAvatarApproval.message.success'),
message: `${item.userNickname} 性别变更 '${userSexName}'` message: that.$t('pages.userAvatarApproval.message.genderChangeSuccess', { nickname: item.userNickname, gender: userSexName })
}) })
item.userSex = userSex item.userSex = userSex
item.userSexName = userSexName item.userSexName = userSexName
}).catch(er => { }).catch(er => {
item.loading = false item.loading = false
that.$notify.error({ that.$notify.error({
title: '失败', title: that.$t('pages.userAvatarApproval.message.failure'),
message: `${item.userNickname} 性别变更失败!` message: that.$t('pages.userAvatarApproval.message.genderChangeFailed', { nickname: item.userNickname })
}) })
}) })
} }

View File

@ -4,7 +4,7 @@
<div class="filter-container"> <div class="filter-container">
<el-select <el-select
v-model="listQuery.sysOrigin" v-model="listQuery.sysOrigin"
placeholder="归属系统" :placeholder="$t('pages.userNicknameApproval.filter.system')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -25,18 +25,18 @@
type="datetimerange" type="datetimerange"
value-format="timestamp" value-format="timestamp"
:picker-options="pickerOptions" :picker-options="pickerOptions"
range-separator="" :range-separator="$t('pages.userNicknameApproval.date.rangeSeparator')"
start-placeholder="开始日期" :start-placeholder="$t('pages.userNicknameApproval.date.start')"
end-placeholder="结束日期" :end-placeholder="$t('pages.userNicknameApproval.date.end')"
align="right" align="right"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" placeholder="用户ID" /> <account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" :placeholder="$t('pages.userNicknameApproval.filter.userId')" />
</div> </div>
<el-select <el-select
v-model="listQuery.approveStatus" v-model="listQuery.approveStatus"
placeholder="审批状态" :placeholder="$t('pages.userNicknameApproval.filter.approvalStatus')"
style="width: 240px" style="width: 240px"
class="filter-item" class="filter-item"
:disabled="searchDisabled" :disabled="searchDisabled"
@ -45,19 +45,19 @@
<el-option <el-option
v-for="item in commonApprovalStatus" v-for="item in commonApprovalStatus"
:key="item.value" :key="item.value"
:label="item.name" :label="approvalStatusName(item.value)"
:value="item.value" :value="item.value"
:disabled="item.value == 'NOT_PASS'" :disabled="item.value == 'NOT_PASS'"
/> />
</el-select> </el-select>
<!-- <span class="text-item" style="width: 120px;color:#F00;">数量{{ total }}</span> --> <!-- <span class="text-item" style="width: 120px;color:#F00;">Count: {{ total }}</span> -->
<el-button <el-button
class="filter-item" class="filter-item"
type="primary" type="primary"
icon="el-icon-search" icon="el-icon-search"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.userNicknameApproval.action.search') }}
</el-button> </el-button>
</div> </div>
@ -70,33 +70,33 @@
@selection-change="selsUserChange" @selection-change="selsUserChange"
> >
<el-table-column v-if="isAllowApproval" type="selection" width="55" /> <el-table-column v-if="isAllowApproval" type="selection" width="55" />
<el-table-column prop="userId" label="用户id" align="center" width="200" /> <el-table-column prop="userId" :label="$t('pages.userNicknameApproval.table.userId')" align="center" width="200" />
<el-table-column prop="userNickname" label="昵称" align="center" /> <el-table-column prop="userNickname" :label="$t('pages.userNicknameApproval.table.nickname')" align="center" />
<el-table-column prop="updateTime" label="修改时间" align="center" width="200"> <el-table-column prop="updateTime" :label="$t('pages.userNicknameApproval.table.updateTime')" align="center" width="200">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.updateTime | dateFormat }} {{ scope.row.updateTime | dateFormat }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="100"> <el-table-column fixed="right" :label="$t('pages.userNicknameApproval.table.actions')" align="center" width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
<el-button type="text" @click="queryUserDetails(scope.row)">用户详情</el-button> <el-button type="text" @click="queryUserDetails(scope.row)">{{ $t('pages.userNicknameApproval.action.userDetails') }}</el-button>
</div> </div>
<div> <div>
<el-button type="text" @click="accountHanle(scope.row)">账号处理</el-button> <el-button type="text" @click="accountHanle(scope.row)">{{ $t('pages.userNicknameApproval.action.accountHandle') }}</el-button>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div v-if="isAllowApproval" style="text-align:center;padding: 20px;"> <div v-if="isAllowApproval" style="text-align:center;padding: 20px;">
<div style="padding:5px;font-size:14px;color:#909399">已勾选了:<span style="color:#F00">{{ checkList.length }}</span></div> <div style="padding:5px;font-size:14px;color:#909399">{{ $t('pages.userNicknameApproval.label.selectedCount') }}:<span style="color:#F00">{{ checkList.length }}</span></div>
<el-button <el-button
class="filter-item" class="filter-item"
type="primary" type="primary"
icon="el-icon-folder-checked" icon="el-icon-folder-checked"
@click="pass" @click="pass"
> >
鉴定通过 {{ $t('pages.userNicknameApproval.action.pass') }}
</el-button> </el-button>
<el-button <el-button
@ -105,7 +105,7 @@
icon="el-icon-folder-delete" icon="el-icon-folder-delete"
@click="notpass" @click="notpass"
> >
鉴定违规 {{ $t('pages.userNicknameApproval.action.reject') }}
</el-button> </el-button>
</div> </div>
@ -221,7 +221,7 @@ export default {
}, },
renderDataSuccess() { renderDataSuccess() {
this.$message({ this.$message({
message: 'Successful', message: this.$t('pages.userNicknameApproval.message.success'),
type: 'success' type: 'success'
}) })
this.renderData() this.renderData()
@ -232,6 +232,9 @@ export default {
selsUserChange(checkList) { selsUserChange(checkList) {
this.checkList = checkList this.checkList = checkList
}, },
approvalStatusName(status) {
return this.$t(`pages.userNicknameApproval.approvalStatus.${status}`)
},
queryUserDetails(row) { queryUserDetails(row) {
this.userDeatilsDrawer = true this.userDeatilsDrawer = true
this.thatSelectedUserId = row.userId this.thatSelectedUserId = row.userId
@ -239,10 +242,10 @@ export default {
pass() { pass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.userNicknameApproval.message.selectApprovalItem'))
return return
} }
that.$confirm('确认审核选中记录吗?', '提示', { that.$confirm(that.$t('pages.userNicknameApproval.message.confirmApproval'), that.$t('pages.userNicknameApproval.confirm.title'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
that.listLoading = true that.listLoading = true
@ -260,10 +263,10 @@ export default {
notpass() { notpass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.userNicknameApproval.message.selectApprovalItem'))
return return
} }
that.$confirm('确认审核选中记录吗?', '提示', { that.$confirm(that.$t('pages.userNicknameApproval.message.confirmApproval'), that.$t('pages.userNicknameApproval.confirm.title'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
that.listLoading = true that.listLoading = true

View File

@ -3,7 +3,7 @@
<div class="filter-container"> <div class="filter-container">
<el-select <el-select
v-model="listQuery.status" v-model="listQuery.status"
placeholder="状态" :placeholder="$t('pages.userPhotoWallApproval.filter.status')"
style="width: 240px" style="width: 240px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -11,7 +11,7 @@
<el-option <el-option
v-for="item in approvalStatus" v-for="item in approvalStatus"
:key="item.value" :key="item.value"
:label="item.name" :label="approvalStatusName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
@ -21,24 +21,24 @@
type="datetimerange" type="datetimerange"
value-format="timestamp" value-format="timestamp"
:picker-options="pickerOptions" :picker-options="pickerOptions"
range-separator="" :range-separator="$t('pages.userPhotoWallApproval.date.rangeSeparator')"
start-placeholder="开始日期" :start-placeholder="$t('pages.userPhotoWallApproval.date.start')"
end-placeholder="结束日期" :end-placeholder="$t('pages.userPhotoWallApproval.date.end')"
align="right" align="right"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
<account-input v-model="listQuery.userId" placeholder="用户ID" /> <account-input v-model="listQuery.userId" :placeholder="$t('pages.userPhotoWallApproval.filter.userId')" />
</div> </div>
<el-input <el-input
v-model.trim="listQuery.userNickname" v-model.trim="listQuery.userNickname"
placeholder="昵称" :placeholder="$t('pages.userPhotoWallApproval.filter.nickname')"
style="width: 200px;" style="width: 200px;"
class="filter-item" class="filter-item"
/> />
<el-select <el-select
v-model="listQuery.userSex" v-model="listQuery.userSex"
placeholder="性别" :placeholder="$t('pages.userPhotoWallApproval.filter.gender')"
clearable clearable
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@ -46,7 +46,7 @@
<el-option <el-option
v-for="item in genders" v-for="item in genders"
:key="item.value" :key="item.value"
:label="item.name" :label="genderName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
@ -57,14 +57,14 @@
:disabled="searchDisabled" :disabled="searchDisabled"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.userPhotoWallApproval.action.search') }}
</el-button> </el-button>
</div> </div>
<el-checkbox <el-checkbox
v-model="checkAll" v-model="checkAll"
:indeterminate="isIndeterminate" :indeterminate="isIndeterminate"
@change="handleCheckAllChange" @change="handleCheckAllChange"
>全选</el-checkbox> >{{ $t('pages.userPhotoWallApproval.selection.all') }}</el-checkbox>
<div style="margin: 15px 0;" /> <div style="margin: 15px 0;" />
<el-row v-loading="listLoading" :gutter="10"> <el-row v-loading="listLoading" :gutter="10">
<el-col <el-col
@ -88,23 +88,23 @@
v-if="listQuery.status === 'SUSPECTED'" v-if="listQuery.status === 'SUSPECTED'"
:key="item.id" :key="item.id"
:label="index" :label="index"
>选中</el-checkbox> >{{ $t('pages.userPhotoWallApproval.selection.selected') }}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
<!--<el-table-column type="radio" width="55" />--> <!--<el-table-column type="radio" width="55" />-->
<div class="info" @click="handleClickCard(index)"> <div class="info" @click="handleClickCard(index)">
<div> <div>
昵称 {{ $t('pages.userPhotoWallApproval.label.nickname') }}:
<a <a
class="underline" class="underline"
@click.stop="queryUserDetails(item.userId)" @click.stop="queryUserDetails(item.userId)"
>{{ item.userNickname }}</a> >{{ item.userNickname }}</a>
</div> </div>
<div class="line"> <div class="line">
<div>性别{{ item.userSexName }}</div> <div>{{ $t('pages.userPhotoWallApproval.label.gender') }}: {{ genderName(item.userSex, item.userSexName) }}</div>
<div>年龄{{ item.age }}</div> <div>{{ $t('pages.userPhotoWallApproval.label.age') }}: {{ item.age }}</div>
</div> </div>
<div> <div>
标签 {{ $t('pages.userPhotoWallApproval.label.tags') }}:
<el-tooltip placement="top-start"> <el-tooltip placement="top-start">
<div slot="content"> <div slot="content">
<span v-html="cutout(item.labelNames)" /> <span v-html="cutout(item.labelNames)" />
@ -117,7 +117,7 @@
type="text" type="text"
class="button" class="button"
@click="editUserForm(item.userId)" @click="editUserForm(item.userId)"
>编辑用户</el-button> >{{ $t('pages.userPhotoWallApproval.action.editUser') }}</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>
@ -125,7 +125,7 @@
</el-row> </el-row>
<div v-if="listQuery.status === 'SUSPECTED'" style="text-align:center;"> <div v-if="listQuery.status === 'SUSPECTED'" style="text-align:center;">
<div style="padding:5px;font-size:14px;color:#909399"> <div style="padding:5px;font-size:14px;color:#909399">
已勾选了:<span style="color:#F00">{{ checkList.length }}</span> {{ $t('pages.userPhotoWallApproval.label.selectedCount') }}:<span style="color:#F00">{{ checkList.length }}</span>
</div> </div>
<el-button <el-button
class="filter-item" class="filter-item"
@ -133,7 +133,7 @@
icon="el-icon-folder-checked" icon="el-icon-folder-checked"
@click="pass" @click="pass"
> >
鉴定通过 {{ $t('pages.userPhotoWallApproval.action.pass') }}
</el-button> </el-button>
<el-button <el-button
@ -142,7 +142,7 @@
icon="el-icon-folder-delete" icon="el-icon-folder-delete"
@click="notpass" @click="notpass"
> >
鉴定违规 {{ $t('pages.userPhotoWallApproval.action.reject') }}
</el-button> </el-button>
</div> </div>
<pagination <pagination
@ -246,7 +246,7 @@ export default {
handleSearch() { handleSearch() {
this.renderData(true) this.renderData(true)
}, },
// // Format comma-separated labels for tooltip display.
cutout(cellValue) { cutout(cellValue) {
if (cellValue != null) { if (cellValue != null) {
return cellValue.replace(/\,/g, '</br>') return cellValue.replace(/\,/g, '</br>')
@ -265,11 +265,11 @@ export default {
pass() { pass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.userPhotoWallApproval.message.selectApprovalItem'))
return return
} }
that that
.$confirm('确认审核选中记录吗?', '提示', { .$confirm(that.$t('pages.userPhotoWallApproval.message.confirmApproval'), that.$t('pages.userPhotoWallApproval.confirm.title'), {
type: 'warning' type: 'warning'
}) })
.then(() => { .then(() => {
@ -289,11 +289,11 @@ export default {
notpass() { notpass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.userPhotoWallApproval.message.selectApprovalItem'))
return return
} }
that that
.$confirm('确认审核选中记录吗?', '提示', { .$confirm(that.$t('pages.userPhotoWallApproval.message.confirmApproval'), that.$t('pages.userPhotoWallApproval.confirm.title'), {
type: 'warning' type: 'warning'
}) })
.then(() => { .then(() => {
@ -316,7 +316,7 @@ export default {
}, },
renderDataSuccess() { renderDataSuccess() {
this.$message({ this.$message({
message: 'Successful', message: this.$t('pages.userPhotoWallApproval.message.success'),
type: 'success' type: 'success'
}) })
this.renderData() this.renderData()
@ -333,6 +333,18 @@ export default {
} }
this.checkList.push(id) this.checkList.push(id)
}, },
approvalStatusName(status) {
return this.$t(`pages.userPhotoWallApproval.approvalStatus.${status}`)
},
genderName(gender, fallback = '') {
if (gender === 0) {
return this.$t('pages.userPhotoWallApproval.gender.female')
}
if (gender === 1) {
return this.$t('pages.userPhotoWallApproval.gender.male')
}
return fallback
},
getApprovalParams() { getApprovalParams() {
const that = this const that = this
const approvalParams = [] const approvalParams = []

View File

@ -3,7 +3,7 @@
<div class="filter-container"> <div class="filter-container">
<el-select <el-select
v-model="listQuery.sysOrigin" v-model="listQuery.sysOrigin"
placeholder="系统" :placeholder="$t('pages.userReportApproval.filter.system')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -24,7 +24,7 @@
</el-select> </el-select>
<el-select <el-select
v-model="listQuery.approvalStatus" v-model="listQuery.approvalStatus"
placeholder="状态" :placeholder="$t('pages.userReportApproval.filter.status')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -32,13 +32,13 @@
<el-option <el-option
v-for="item in reportStatus" v-for="item in reportStatus"
:key="item.value" :key="item.value"
:label="item.name" :label="reportStatusName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
<el-select <el-select
v-model="listQuery.reportType" v-model="listQuery.reportType"
placeholder="举报类型" :placeholder="$t('pages.userReportApproval.filter.reportType')"
clearable clearable
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@ -46,7 +46,7 @@
<el-option <el-option
v-for="item in reportTypes" v-for="item in reportTypes"
:key="item.value" :key="item.value"
:label="item.name" :label="reportTypeName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
@ -54,14 +54,14 @@
<account-input <account-input
v-model="listQuery.reportUserId" v-model="listQuery.reportUserId"
:sys-origin="listQuery.sysOrigin" :sys-origin="listQuery.sysOrigin"
placeholder="举报人ID" :placeholder="$t('pages.userReportApproval.filter.reporterId')"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
<account-input <account-input
v-model="listQuery.reportedUserId" v-model="listQuery.reportedUserId"
:sys-origin="listQuery.sysOrigin" :sys-origin="listQuery.sysOrigin"
placeholder="被举报人ID" :placeholder="$t('pages.userReportApproval.filter.reportedUserId')"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
@ -70,14 +70,14 @@
value-format="timestamp" value-format="timestamp"
:picker-options="pickerOptions" :picker-options="pickerOptions"
type="datetimerange" type="datetimerange"
range-separator="" :range-separator="$t('pages.userReportApproval.date.rangeSeparator')"
start-placeholder="开始日期" :start-placeholder="$t('pages.userReportApproval.date.start')"
end-placeholder="结束日期" :end-placeholder="$t('pages.userReportApproval.date.end')"
/> />
</div> </div>
<el-select <el-select
v-model="listQuery.updateUserId" v-model="listQuery.updateUserId"
placeholder="后台成员" :placeholder="$t('pages.userReportApproval.filter.adminMember')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
clearable clearable
@ -97,7 +97,7 @@
icon="el-icon-search" icon="el-icon-search"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.userReportApproval.action.search') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table
@ -117,11 +117,11 @@
<div> <div>
<user-table-exhibit :user-profile="scope.row.reportUser" /> <user-table-exhibit :user-profile="scope.row.reportUser" />
</div> </div>
<div style="margin: 0px 20px;"><el-tag>举报</el-tag></div> <div style="margin: 0px 20px;"><el-tag>{{ $t('pages.userReportApproval.tag.report') }}</el-tag></div>
<div> <div>
<user-table-exhibit :user-profile="scope.row.reportedUser" /> <user-table-exhibit :user-profile="scope.row.reportedUser" />
</div> </div>
<div style="margin: 0px 20px;"><el-tag>涉嫌</el-tag></div> <div style="margin: 0px 20px;"><el-tag>{{ $t('pages.userReportApproval.tag.suspected') }}</el-tag></div>
<div>{{ scope.row.reportTypeName }}</div> <div>{{ scope.row.reportTypeName }}</div>
</div> </div>
</el-col> </el-col>
@ -177,10 +177,10 @@
</el-col> </el-col>
<el-col :span="24" class="expand-col"> <el-col :span="24" class="expand-col">
举报内容: {{ scope.row.reportedContent }} {{ $t('pages.userReportApproval.label.reportContent') }}: {{ scope.row.reportedContent }}
</el-col> </el-col>
<el-col v-if="scope.row.updateNickname" :span="24"> <el-col v-if="scope.row.updateNickname" :span="24">
最近处理人: {{ scope.row.updateNickname }} {{ $t('pages.userReportApproval.label.latestHandler') }}: {{ scope.row.updateNickname }}
</el-col> </el-col>
</el-row> </el-row>
</template> </template>
@ -193,13 +193,13 @@
<el-table-column <el-table-column
prop="reportTypeName" prop="reportTypeName"
label="举报类型" :label="$t('pages.userReportApproval.table.reportType')"
align="center" align="center"
min-width="100" min-width="100"
/> />
<el-table-column <el-table-column
prop="createTime" prop="createTime"
label="创建时间" :label="$t('pages.userReportApproval.table.createTime')"
align="center" align="center"
width="200" width="200"
> >
@ -209,7 +209,7 @@
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="updateTime" prop="updateTime"
label="修改时间" :label="$t('pages.userReportApproval.table.updateTime')"
align="center" align="center"
width="200" width="200"
> >
@ -217,12 +217,12 @@
{{ scope.row.updateTime | dateFormat }} {{ scope.row.updateTime | dateFormat }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center" width="100"> <el-table-column :label="$t('pages.userReportApproval.table.actions')" align="center" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
type="text" type="text"
@click="accountHanle(scope.row)" @click="accountHanle(scope.row)"
>账号处理</el-button> >{{ $t('pages.userReportApproval.action.accountHandle') }}</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -233,23 +233,21 @@
<el-collapse> <el-collapse>
<el-collapse-item> <el-collapse-item>
<template slot="title"> <template slot="title">
操作描述&nbsp;<i class="header-icon el-icon-info" /> {{ $t('pages.userReportApproval.description.title') }}&nbsp;<i class="header-icon el-icon-info" />
</template> </template>
<div style="text-align:left;"> <div style="text-align:left;">
<p> <p>
举报审批不会对用户信息及资源做 {{ $t('pages.userReportApproval.description.noDirectAction') }}
任何处理处理需要到对应的资源模块进行审批
</p> </p>
<p> <p>
* 有效表示举报有效系统将发放 参数配置 {{ $t('pages.userReportApproval.description.valid') }}
中指定糖果数量奖励给举报提交用户
</p> </p>
<p>* 无效 表示举报无效</p> <p>{{ $t('pages.userReportApproval.description.invalid') }}</p>
</div> </div>
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
<div style="padding:5px;font-size:14px;color:#909399"> <div style="padding:5px;font-size:14px;color:#909399">
已勾选了:<span style="color:#F00">{{ checkList.length }}</span> {{ $t('pages.userReportApproval.label.selectedCount') }}:<span style="color:#F00">{{ checkList.length }}</span>
</div> </div>
<el-button <el-button
class="filter-item" class="filter-item"
@ -257,7 +255,7 @@
icon="el-icon-folder-checked" icon="el-icon-folder-checked"
@click="pass" @click="pass"
> >
有效 {{ $t('pages.userReportApproval.action.valid') }}
</el-button> </el-button>
<el-button <el-button
@ -266,7 +264,7 @@
icon="el-icon-folder-delete" icon="el-icon-folder-delete"
@click="notpass" @click="notpass"
> >
无效 {{ $t('pages.userReportApproval.action.invalid') }}
</el-button> </el-button>
</div> </div>
<pagination <pagination
@ -310,27 +308,27 @@ export default {
sysOriginPlatforms, sysOriginPlatforms,
pickerOptions, pickerOptions,
reportStatus: [ reportStatus: [
{ value: 0, name: '待审核' }, { value: 0 },
{ value: 1, name: '有效举报' }, { value: 1 },
{ value: 2, name: '无效举报' } { value: 2 }
], ],
thatSelectedUserId: '', thatSelectedUserId: '',
userDeatilsDrawer: false, userDeatilsDrawer: false,
accountHandleVisible: false, accountHandleVisible: false,
reportOrigins: [ reportOrigins: [
{ value: 'VIDEO', name: '视频' }, { value: 'VIDEO' },
{ value: 'CARD', name: '卡片' }, { value: 'CARD' },
{ value: 'IM', name: 'IM聊天' }, { value: 'IM' },
{ value: 'SHORT_VIDEO', name: '短视频' }, { value: 'SHORT_VIDEO' },
{ value: 'PROFILE', name: '个人资料' } { value: 'PROFILE' }
], ],
reportTypes: [ reportTypes: [
{ value: 0, name: '非法信息' }, { value: 0 },
{ value: 1, name: '人身攻击' }, { value: 1 },
{ value: 2, name: '不适当的内容' }, { value: 2 },
{ value: 3, name: '发送垃圾邮件' }, { value: 3 },
{ value: 4, name: '诈骗' }, { value: 4 },
{ value: 5, name: '涉及色情' } { value: 5 }
], ],
list: [], list: [],
checkList: [], checkList: [],
@ -417,9 +415,15 @@ export default {
this.accountHandleVisible = true this.accountHandleVisible = true
this.thatSelectedUserId = row.reportedUser.id this.thatSelectedUserId = row.reportedUser.id
}, },
reportStatusName(status) {
return this.$t(`pages.userReportApproval.reportStatus.${status}`)
},
reportTypeName(type) {
return this.$t(`pages.userReportApproval.reportType.${type}`)
},
renderDataSuccess() { renderDataSuccess() {
this.$message({ this.$message({
message: 'Successful', message: this.$t('pages.userReportApproval.message.success'),
type: 'success' type: 'success'
}) })
this.renderData() this.renderData()
@ -434,11 +438,11 @@ export default {
pass() { pass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.userReportApproval.message.selectApprovalItem'))
return return
} }
that that
.$confirm('确认审核选中记录吗?', '提示', { .$confirm(that.$t('pages.userReportApproval.message.confirmApproval'), that.$t('pages.userReportApproval.confirm.title'), {
type: 'warning' type: 'warning'
}) })
.then(() => { .then(() => {
@ -458,11 +462,11 @@ export default {
notpass() { notpass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.userReportApproval.message.selectApprovalItem'))
return return
} }
that that
.$confirm('确认审核选中记录吗?', '提示', { .$confirm(that.$t('pages.userReportApproval.message.confirmApproval'), that.$t('pages.userReportApproval.confirm.title'), {
type: 'warning' type: 'warning'
}) })
.then(() => { .then(() => {
@ -523,13 +527,13 @@ export default {
copyText(text) copyText(text)
.then(() => { .then(() => {
that.$message({ that.$message({
message: '复制成功', message: that.$t('pages.userReportApproval.message.copySuccess'),
type: 'success' type: 'success'
}) })
}) })
.catch(() => { .catch(() => {
that.$message({ that.$message({
message: '复制失败', message: that.$t('pages.userReportApproval.message.copyFailed'),
type: 'error' type: 'error'
}) })
}) })

View File

@ -5,7 +5,7 @@
<div class="filter-container"> <div class="filter-container">
<el-select <el-select
v-model="listQuery.sysOrigin" v-model="listQuery.sysOrigin"
placeholder="归属系统" :placeholder="$t('pages.roomCoverApproval.filter.system')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -26,25 +26,25 @@
type="datetimerange" type="datetimerange"
value-format="timestamp" value-format="timestamp"
:picker-options="pickerOptions" :picker-options="pickerOptions"
range-separator="" :range-separator="$t('pages.roomCoverApproval.date.rangeSeparator')"
start-placeholder="开始日期" :start-placeholder="$t('pages.roomCoverApproval.date.start')"
end-placeholder="结束日期" :end-placeholder="$t('pages.roomCoverApproval.date.end')"
align="right" align="right"
/> />
</div> </div>
<el-input <el-input
v-model="listQuery.roomAccount" v-model="listQuery.roomAccount"
v-number v-number
placeholder="房间账号" :placeholder="$t('pages.roomCoverApproval.filter.roomAccount')"
style="width: 200px;" style="width: 200px;"
class="filter-item" class="filter-item"
/> />
<div class="filter-item"> <div class="filter-item">
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" placeholder="用户ID" /> <account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" :placeholder="$t('pages.roomCoverApproval.filter.userId')" />
</div> </div>
<el-select <el-select
v-model="listQuery.approveStatus" v-model="listQuery.approveStatus"
placeholder="审批状态" :placeholder="$t('pages.roomCoverApproval.filter.approvalStatus')"
style="width: 240px" style="width: 240px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -52,7 +52,7 @@
<el-option <el-option
v-for="item in commonApprovalStatus" v-for="item in commonApprovalStatus"
:key="item.value" :key="item.value"
:label="item.name" :label="approvalStatusName(item.value)"
:value="item.value" :value="item.value"
:disabled="item.value == 'NOT_PASS'" :disabled="item.value == 'NOT_PASS'"
/> />
@ -65,10 +65,10 @@
:disabled="searchDisabled" :disabled="searchDisabled"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.roomCoverApproval.action.search') }}
</el-button> </el-button>
</div> </div>
<el-checkbox v-model="checkAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">全选</el-checkbox> <el-checkbox v-model="checkAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">{{ $t('pages.roomCoverApproval.selection.all') }}</el-checkbox>
<div style="margin: 15px 0;" /> <div style="margin: 15px 0;" />
<el-row v-loading="listLoading" :gutter="10"> <el-row v-loading="listLoading" :gutter="10">
<el-col v-for="(item, index) in list" :key="index" :span="4" style="margin-bottom: 10px;"> <el-col v-for="(item, index) in list" :key="index" :span="4" style="margin-bottom: 10px;">
@ -77,12 +77,12 @@
<div class="details"> <div class="details">
<el-popover <el-popover
placement="top-start" placement="top-start"
title="详情" :title="$t('pages.roomCoverApproval.popover.details')"
trigger="hover" trigger="hover"
> >
<div> <div>
<div>房间ID{{ item.roomId }} </div> <div>{{ $t('pages.roomCoverApproval.label.roomId') }}: {{ item.roomId }} </div>
<div>用户ID{{ item.userId }} </div> <div>{{ $t('pages.roomCoverApproval.label.userId') }}: {{ item.userId }} </div>
</div> </div>
<i slot="reference" class="el-icon-info" /> <i slot="reference" class="el-icon-info" />
</el-popover> </el-popover>
@ -104,25 +104,25 @@
<div style="padding: 14px"> <div style="padding: 14px">
<div class="bottom"> <div class="bottom">
<el-checkbox-group v-model="checkList"> <el-checkbox-group v-model="checkList">
<el-checkbox :key="item.id" :label="index">选中</el-checkbox> <el-checkbox :key="item.id" :label="index">{{ $t('pages.roomCoverApproval.selection.selected') }}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
<!--<el-table-column type="radio" width="55" />--> <!--<el-table-column type="radio" width="55" />-->
<div class="info" @click="handleClickCard(index)"> <div class="info" @click="handleClickCard(index)">
<div>昵称 <a class="underline" @click.stop="queryUserDetails(item.userId)">{{ item.userBaseInfo.userNickname }}</a></div> <div>{{ $t('pages.roomCoverApproval.label.nickname') }}: <a class="underline" @click.stop="queryUserDetails(item.userId)">{{ item.userBaseInfo.userNickname }}</a></div>
<div class="line"> <div class="line">
<div>性别{{ item.userBaseInfo.userSexName }} </div> <div>{{ $t('pages.roomCoverApproval.label.gender') }}: {{ genderName(item.userBaseInfo.userSex, item.userBaseInfo.userSexName) }} </div>
<div>年龄{{ item.userBaseInfo.age }} </div> <div>{{ $t('pages.roomCoverApproval.label.age') }}: {{ item.userBaseInfo.age }} </div>
</div> </div>
</div> </div>
<el-button type="text" class="button" @click="editUserForm(item.userId)">编辑用户</el-button> <el-button type="text" class="button" @click="editUserForm(item.userId)">{{ $t('pages.roomCoverApproval.action.editUser') }}</el-button>
<el-button type="text" class="button" @click="accountHanle(item.userId)">账号处理</el-button> <el-button type="text" class="button" @click="accountHanle(item.userId)">{{ $t('pages.roomCoverApproval.action.accountHandle') }}</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>
</el-col> </el-col>
</el-row> </el-row>
<div style="text-align:center;"> <div style="text-align:center;">
<div style="padding:5px;font-size:14px;color:#909399">已勾选了:<span style="color:#F00">{{ checkList.length }}</span></div> <div style="padding:5px;font-size:14px;color:#909399">{{ $t('pages.roomCoverApproval.label.selectedCount') }}:<span style="color:#F00">{{ checkList.length }}</span></div>
<el-button <el-button
v-if="isAllowApproval" v-if="isAllowApproval"
class="filter-item" class="filter-item"
@ -130,7 +130,7 @@
icon="el-icon-folder-checked" icon="el-icon-folder-checked"
@click="pass" @click="pass"
> >
鉴定通过 {{ $t('pages.roomCoverApproval.action.pass') }}
</el-button> </el-button>
<el-button <el-button
@ -139,7 +139,7 @@
icon="el-icon-folder-delete" icon="el-icon-folder-delete"
@click="notpass" @click="notpass"
> >
鉴定违规 {{ $t('pages.roomCoverApproval.action.reject') }}
</el-button> </el-button>
</div> </div>
<pagination <pagination
@ -285,13 +285,25 @@ export default {
} }
this.isIndeterminate = false this.isIndeterminate = false
}, },
approvalStatusName(status) {
return this.$t(`pages.roomCoverApproval.approvalStatus.${status}`)
},
genderName(gender, fallback = '') {
if (gender === 0) {
return this.$t('pages.roomCoverApproval.gender.female')
}
if (gender === 1) {
return this.$t('pages.roomCoverApproval.gender.male')
}
return fallback
},
pass() { pass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.roomCoverApproval.message.selectApprovalItem'))
return return
} }
that.$confirm('确认审核选中记录吗?', '提示', { that.$confirm(that.$t('pages.roomCoverApproval.message.confirmApproval'), that.$t('pages.roomCoverApproval.confirm.title'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
that.listLoading = true that.listLoading = true
@ -309,10 +321,10 @@ export default {
notpass() { notpass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.roomCoverApproval.message.selectApprovalItem'))
return return
} }
that.$confirm('确认审核选中记录吗?', '提示', { that.$confirm(that.$t('pages.roomCoverApproval.message.confirmApproval'), that.$t('pages.roomCoverApproval.confirm.title'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
that.listLoading = true that.listLoading = true
@ -333,7 +345,7 @@ export default {
}, },
renderDataSuccess() { renderDataSuccess() {
this.$message({ this.$message({
message: 'Successful', message: this.$t('pages.roomCoverApproval.message.success'),
type: 'success' type: 'success'
}) })
this.renderData() this.renderData()

View File

@ -8,18 +8,18 @@
type="datetimerange" type="datetimerange"
value-format="timestamp" value-format="timestamp"
:picker-options="pickerOptions" :picker-options="pickerOptions"
range-separator="" :range-separator="$t('pages.userProfileDescApproval.date.rangeSeparator')"
start-placeholder="开始日期" :start-placeholder="$t('pages.userProfileDescApproval.date.start')"
end-placeholder="结束日期" :end-placeholder="$t('pages.userProfileDescApproval.date.end')"
align="right" align="right"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
<account-input v-model="listQuery.userId" placeholder="用户ID" /> <account-input v-model="listQuery.userId" :placeholder="$t('pages.userProfileDescApproval.filter.userId')" />
</div> </div>
<el-select <el-select
v-model="listQuery.approveStatus" v-model="listQuery.approveStatus"
placeholder="审批状态" :placeholder="$t('pages.userProfileDescApproval.filter.approvalStatus')"
style="width: 240px" style="width: 240px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -27,7 +27,7 @@
<el-option <el-option
v-for="item in commonApprovalStatus" v-for="item in commonApprovalStatus"
:key="item.value" :key="item.value"
:label="item.name" :label="$t(`pages.userProfileDescApproval.approvalStatus.${item.value}`)"
:value="item.value" :value="item.value"
:disabled="item.value == 'NOT_PASS'" :disabled="item.value == 'NOT_PASS'"
/> />
@ -40,7 +40,7 @@
:disabled="searchDisabled" :disabled="searchDisabled"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.userProfileDescApproval.action.search') }}
</el-button> </el-button>
</div> </div>
@ -53,28 +53,28 @@
@selection-change="selsUserChange" @selection-change="selsUserChange"
> >
<el-table-column v-if="isAllowApproval" type="selection" width="55" /> <el-table-column v-if="isAllowApproval" type="selection" width="55" />
<el-table-column prop="userBaseInfo.userNickname" label="昵称" align="center" /> <el-table-column prop="userBaseInfo.userNickname" :label="$t('pages.userProfileDescApproval.table.nickname')" align="center" />
<el-table-column prop="profileDesc" label="签名" align="center" /> <el-table-column prop="profileDesc" :label="$t('pages.userProfileDescApproval.table.signature')" align="center" />
<el-table-column prop="updateTime" label="修改时间" align="center" width="200"> <el-table-column prop="updateTime" :label="$t('pages.userProfileDescApproval.table.updateTime')" align="center" width="200">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.updateTime | dateFormat }} {{ scope.row.updateTime | dateFormat }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="100"> <el-table-column fixed="right" :label="$t('pages.userProfileDescApproval.table.actions')" align="center" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<div><el-button type="text" @click="queryUserDetails(scope.row)">用户详情</el-button></div> <div><el-button type="text" @click="queryUserDetails(scope.row)">{{ $t('pages.userProfileDescApproval.action.userDetails') }}</el-button></div>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<div v-if="isAllowApproval" style="text-align:center;padding: 20px;"> <div v-if="isAllowApproval" style="text-align:center;padding: 20px;">
<div style="padding:5px;font-size:14px;color:#909399">已勾选了:<span style="color:#F00">{{ checkList.length }}</span></div> <div style="padding:5px;font-size:14px;color:#909399">{{ $t('pages.userProfileDescApproval.label.selectedCount') }}:<span style="color:#F00">{{ checkList.length }}</span></div>
<el-button <el-button
class="filter-item" class="filter-item"
type="primary" type="primary"
icon="el-icon-folder-checked" icon="el-icon-folder-checked"
@click="pass" @click="pass"
> >
鉴定通过 {{ $t('pages.userProfileDescApproval.action.pass') }}
</el-button> </el-button>
<el-button <el-button
@ -83,7 +83,7 @@
icon="el-icon-folder-delete" icon="el-icon-folder-delete"
@click="notpass" @click="notpass"
> >
鉴定违规 {{ $t('pages.userProfileDescApproval.action.reject') }}
</el-button> </el-button>
</div> </div>
@ -184,10 +184,10 @@ export default {
pass() { pass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.userProfileDescApproval.message.selectApprovalItem'))
return return
} }
that.$confirm('确认审核选中记录吗?', '提示', { that.$confirm(that.$t('pages.userProfileDescApproval.message.confirmApproval'), that.$t('pages.userProfileDescApproval.confirm.title'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
that.listLoading = true that.listLoading = true
@ -205,10 +205,10 @@ export default {
notpass() { notpass() {
const that = this const that = this
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.userProfileDescApproval.message.selectApprovalItem'))
return return
} }
that.$confirm('确认审核选中记录吗?', '提示', { that.$confirm(that.$t('pages.userProfileDescApproval.message.confirmApproval'), that.$t('pages.userProfileDescApproval.confirm.title'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
that.listLoading = true that.listLoading = true

View File

@ -3,7 +3,7 @@
<div class="filter-container"> <div class="filter-container">
<el-select <el-select
v-model="listQuery.sysOrigin" v-model="listQuery.sysOrigin"
placeholder="归属系统" :placeholder="$t('pages.feedback.filter.system')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -19,11 +19,11 @@
</el-option> </el-option>
</el-select> </el-select>
<div class="filter-item"> <div class="filter-item">
<account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" placeholder="反馈用户ID" /> <account-input v-model="listQuery.userId" :sys-origin="listQuery.sysOrigin" :placeholder="$t('pages.feedback.filter.userId')" />
</div> </div>
<el-select <el-select
v-model="listQuery.approvalStatus" v-model="listQuery.approvalStatus"
placeholder="审核状态" :placeholder="$t('pages.feedback.filter.approvalStatus')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
clearable clearable
@ -32,13 +32,13 @@
<el-option <el-option
v-for="(item, index) in approvalStatusArray" v-for="(item, index) in approvalStatusArray"
:key="index" :key="index"
:label="item.name" :label="approvalStatusName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
<el-select <el-select
v-model="listQuery.updateUserId" v-model="listQuery.updateUserId"
placeholder="后台成员" :placeholder="$t('pages.feedback.filter.backendMember')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
clearable clearable
@ -58,7 +58,7 @@
icon="el-icon-search" icon="el-icon-search"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.feedback.action.search') }}
</el-button> </el-button>
<el-button <el-button
class="filter-item" class="filter-item"
@ -66,7 +66,7 @@
icon="el-icon-edit" icon="el-icon-edit"
@click="batchProcessing" @click="batchProcessing"
> >
批量处理 {{ $t('pages.feedback.action.batchProcess') }}
</el-button> </el-button>
</div> </div>
@ -111,62 +111,62 @@
</div> </div>
</el-col> </el-col>
<el-col :span="12" class="expand-col"> <el-col :span="12" class="expand-col">
手机型号: <span>{{ scope.row.originPhoneModel }}</span> {{ $t('pages.feedback.detail.phoneModel') }}: <span>{{ scope.row.originPhoneModel }}</span>
</el-col> </el-col>
<el-col :span="12" class="expand-col"> <el-col :span="12" class="expand-col">
App版本: <span>{{ scope.row.appVersion }}</span> {{ $t('pages.feedback.detail.appVersion') }}: <span>{{ scope.row.appVersion }}</span>
</el-col> </el-col>
<el-col :span="24" class="expand-col"> <el-col :span="24" class="expand-col">
设备号: <span>{{ scope.row.imei }}</span> {{ $t('pages.feedback.detail.deviceId') }}: <span>{{ scope.row.imei }}</span>
</el-col> </el-col>
<el-col :span="24" class="expand-col"> <el-col :span="24" class="expand-col">
反馈内容: {{ scope.row.content }} {{ $t('pages.feedback.detail.content') }}: {{ scope.row.content }}
</el-col> </el-col>
<el-col v-if="scope.row.approvalRemarks" :span="24" class="expand-col"> <el-col v-if="scope.row.approvalRemarks" :span="24" class="expand-col">
备注: <span class="font-danger">{{ scope.row.approvalRemarks }}</span> {{ $t('pages.feedback.detail.remarks') }}: <span class="font-danger">{{ scope.row.approvalRemarks }}</span>
</el-col> </el-col>
<el-col v-if="scope.row.updateNickname" :span="24" class="expand-col"> <el-col v-if="scope.row.updateNickname" :span="24" class="expand-col">
最近处理人: {{ scope.row.updateNickname }} {{ $t('pages.feedback.detail.latestProcessor') }}: {{ scope.row.updateNickname }}
</el-col> </el-col>
</el-row> </el-row>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="isAllowApproval" type="selection" width="55" /> <el-table-column v-if="isAllowApproval" type="selection" width="55" />
<el-table-column prop="sysOrigin" label="系统" align="center" width="60"> <el-table-column prop="sysOrigin" :label="$t('pages.feedback.table.system')" align="center" width="80">
<template slot-scope="scope"> <template slot-scope="scope">
<sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" /> <sys-origin-icon :icon="scope.row.sysOrigin" :desc="scope.row.sysOrigin" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="反馈用户" align="center" min-width="200"> <el-table-column :label="$t('pages.feedback.table.feedbackUser')" align="center" min-width="200">
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.userProfile"> <div v-if="scope.row.userProfile">
<user-table-exhibit :user-profile="scope.row.userProfile" /> <user-table-exhibit :user-profile="scope.row.userProfile" />
</div> </div>
<span v-else style="color:rgb(216 157 116)">未登录</span> <span v-else style="color:rgb(216 157 116)">{{ $t('pages.feedback.status.notLoggedIn') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="level" label="处理状态" align="center" min-width="100"> <el-table-column prop="level" :label="$t('pages.feedback.table.processStatus')" align="center" min-width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.approvalStatus === 0">未处理</span> <span v-if="scope.row.approvalStatus === 0">{{ $t('pages.feedback.approvalStatus.unprocessed') }}</span>
<span v-else-if="scope.row.approvalStatus === 1" style="color:rgb(72 196 104)"> 已处理 </span> <span v-else-if="scope.row.approvalStatus === 1" style="color:rgb(72 196 104)"> {{ $t('pages.feedback.approvalStatus.processed') }} </span>
<span v-else>待处理</span> <span v-else>{{ $t('pages.feedback.approvalStatus.pending') }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createTime" label="创建时间" align="center" width="200"> <el-table-column prop="createTime" :label="$t('pages.feedback.table.createdAt')" align="center" width="200">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.createTime | dateFormat }} {{ scope.row.createTime | dateFormat }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="updateTime" label="修改时间" align="center" width="200"> <el-table-column prop="updateTime" :label="$t('pages.feedback.table.updatedAt')" align="center" width="200">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.updateTime | dateFormat }} {{ scope.row.updateTime | dateFormat }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center"> <el-table-column :label="$t('pages.feedback.table.actions')" align="center" min-width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.approvalStatus === 0"> <div v-if="scope.row.approvalStatus === 0">
<!-- <el-button type="text" @click.native="handlDel(scope.row.id)">删除</el-button> --> <!-- <el-button type="text" @click.native="handlDel(scope.row.id)">Delete</el-button> -->
<el-button type="text" @click="feedback(scope.row)">处理</el-button> <el-button type="text" @click="feedback(scope.row)">{{ $t('pages.feedback.action.process') }}</el-button>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
@ -337,6 +337,13 @@ export default {
selsUserChange(checkList) { selsUserChange(checkList) {
this.checkList = checkList this.checkList = checkList
}, },
approvalStatusName(status) {
const statusMap = {
0: this.$t('pages.feedback.approvalStatus.unprocessed'),
1: this.$t('pages.feedback.approvalStatus.processed')
}
return statusMap[status] || this.$t('pages.feedback.approvalStatus.pending')
},
getApprovalParams() { getApprovalParams() {
const that = this const that = this
const approvalParams = [] const approvalParams = []
@ -353,21 +360,21 @@ export default {
batchProcessing() { batchProcessing() {
const that = this const that = this
if (that.listQuery.approvalStatus !== 0) { if (that.listQuery.approvalStatus !== 0) {
that.$opsMessage.warn('选择审核状态下拉框为【未处理】,再操作') that.$opsMessage.warn(that.$t('pages.feedback.message.selectUnprocessedFirst', { status: that.$t('pages.feedback.approvalStatus.unprocessed') }))
return return
} }
if (that.checkList.length === 0) { if (that.checkList.length === 0) {
that.$opsMessage.warn('请勾选审批项') that.$opsMessage.warn(that.$t('pages.feedback.message.selectApprovalItem'))
return return
} }
that.$confirm('确认审核选中记录吗?', '提示', { that.$confirm(that.$t('pages.feedback.message.confirmApproval'), that.$t('pages.feedback.confirm.title'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
that.listLoading = true that.listLoading = true
batchProcessFeedback({ processFeedbacks: that.getApprovalParams() }).then(res => { batchProcessFeedback({ processFeedbacks: that.getApprovalParams() }).then(res => {
this.listLoading = false this.listLoading = false
this.$message({ this.$message({
message: '批量处理成功', message: this.$t('pages.feedback.message.batchProcessSuccess'),
type: 'success' type: 'success'
}) })
this.renderData() this.renderData()

View File

@ -17,10 +17,10 @@
label-width="110px" label-width="110px"
style="margin-right:50px;" style="margin-right:50px;"
> >
<el-form-item label="系统" prop="sysOrigin"> <el-form-item :label="$t('pages.propsResourceConfig.form.system')" prop="sysOrigin">
<el-select <el-select
v-model="form.sysOrigin" v-model="form.sysOrigin"
placeholder="归属系统" :placeholder="$t('pages.propsResourceConfig.filter.system')"
style="width: 100%;" style="width: 100%;"
> >
<el-option <el-option
@ -38,10 +38,10 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="类型" prop="type"> <el-form-item :label="$t('pages.propsResourceConfig.form.type')" prop="type">
<el-select <el-select
v-model="form.type" v-model="form.type"
placeholder="类型" :placeholder="$t('pages.propsResourceConfig.filter.type')"
style="width:100%;" style="width:100%;"
class="filter-item" class="filter-item"
@change="selectdTheme" @change="selectdTheme"
@ -49,12 +49,12 @@
<el-option <el-option
v-for="item in propsTypes" v-for="item in propsTypes"
:key="item.value" :key="item.value"
:label="item.name" :label="$t(`pages.propsResourceConfig.propsTypes.${item.value}`)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="封面" prop="cover"> <el-form-item :label="$t('pages.propsResourceConfig.form.cover')" prop="cover">
<el-upload <el-upload
:disabled="coverUploadLoading" :disabled="coverUploadLoading"
:file-list="coverFileList" :file-list="coverFileList"
@ -75,7 +75,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-show="selectedTypeName === 'RED_PACKET'" v-show="selectedTypeName === 'RED_PACKET'"
label="封面预览图" :label="$t('pages.propsResourceConfig.form.coverPreview')"
prop="sourceUrl" prop="sourceUrl"
> >
<el-upload <el-upload
@ -98,7 +98,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-show="selectedTypeName === 'RED_PACKET'" v-show="selectedTypeName === 'RED_PACKET'"
label="房间发送页图" :label="$t('pages.propsResourceConfig.form.roomSendCover')"
prop="roomSendCoverUrl" prop="roomSendCoverUrl"
> >
<el-upload <el-upload
@ -121,7 +121,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-show="selectedTypeName === 'RED_PACKET'" v-show="selectedTypeName === 'RED_PACKET'"
label=" 房间拆红包大图" :label="$t('pages.propsResourceConfig.form.roomNotOpened')"
prop="roomNotOpenedUrl" prop="roomNotOpenedUrl"
> >
<el-upload <el-upload
@ -144,7 +144,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-show="selectedTypeName === 'RED_PACKET'" v-show="selectedTypeName === 'RED_PACKET'"
label="房间红包已打开大图" :label="$t('pages.propsResourceConfig.form.roomOpened')"
prop="roomOpenedUrl" prop="roomOpenedUrl"
> >
<el-upload <el-upload
@ -167,7 +167,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-show="selectedTypeName === 'RED_PACKET'" v-show="selectedTypeName === 'RED_PACKET'"
label="IM发送页图" :label="$t('pages.propsResourceConfig.form.imSendCover')"
prop="imSendCoverUrl" prop="imSendCoverUrl"
> >
<el-upload <el-upload
@ -190,7 +190,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-show="selectedTypeName === 'RED_PACKET'" v-show="selectedTypeName === 'RED_PACKET'"
label="IM/房间封面未打开小图" :label="$t('pages.propsResourceConfig.form.imNotOpened')"
prop="imNotOpenedUrl" prop="imNotOpenedUrl"
> >
<el-upload <el-upload
@ -213,7 +213,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-show="selectedTypeName === 'RED_PACKET'" v-show="selectedTypeName === 'RED_PACKET'"
label="IM/房间封面已打开小图" :label="$t('pages.propsResourceConfig.form.imOpened')"
prop="imOpenedUrl" prop="imOpenedUrl"
> >
<el-upload <el-upload
@ -237,7 +237,7 @@
<el-form-item <el-form-item
v-show="selectedTypeName === 'RED_PACKET'" v-show="selectedTypeName === 'RED_PACKET'"
label="IM/房间封面已打开小图2" :label="$t('pages.propsResourceConfig.form.imOpenedTwo')"
prop="imOpenedUrlTwo" prop="imOpenedUrlTwo"
> >
<el-upload <el-upload
@ -279,10 +279,10 @@
:loading="sourceUploadLoading" :loading="sourceUploadLoading"
size="small" size="small"
type="primary" type="primary"
>点击上传</el-button >{{ $t('pages.propsResourceConfig.action.upload') }}</el-button
> >
<div slot="tip" class="el-upload__tip"> <div slot="tip" class="el-upload__tip">
只能上传svga/pag/mp4文件 {{ $t('pages.propsResourceConfig.message.uploadSvgaTip') }}
</div> </div>
</div> </div>
</el-upload> </el-upload>
@ -290,7 +290,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-show="selectedTypeName === 'CHAT_BUBBLE'" v-show="selectedTypeName === 'CHAT_BUBBLE'"
label="iOS 资源 " :label="$t('pages.propsResourceConfig.form.iosResource')"
prop="sourceUrl" prop="sourceUrl"
> >
<el-upload <el-upload
@ -313,7 +313,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-show="selectedTypeName === 'CHAT_BUBBLE'" v-show="selectedTypeName === 'CHAT_BUBBLE'"
label="Android 资源 " :label="$t('pages.propsResourceConfig.form.androidResource')"
prop="expand" prop="expand"
> >
<el-upload <el-upload
@ -336,7 +336,7 @@
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-if="isBackground" v-if="isBackground"
label="房间装扮背景" :label="$t('pages.propsResourceConfig.form.roomBackground')"
prop="sourceUrl" prop="sourceUrl"
> >
<el-upload <el-upload
@ -357,50 +357,50 @@
/> />
</el-upload> </el-upload>
</el-form-item> </el-form-item>
<el-form-item label="名称" prop="name"> <el-form-item :label="$t('pages.propsResourceConfig.form.name')" prop="name">
<el-select <el-select
v-if="form.type === 'NOBLE_VIP'" v-if="form.type === 'NOBLE_VIP'"
v-model="form.name" v-model="form.name"
placeholder="贵族类型" :placeholder="$t('pages.propsResourceConfig.placeholder.nobleType')"
style="width: 100%" style="width: 100%"
class="filter-item" class="filter-item"
> >
<el-option <el-option
v-for="item in nobleVipTabs" v-for="item in nobleVipTabs"
:key="item.value" :key="item.value"
:label="item.name" :label="$t(`pages.propsResourceConfig.nobleVipTypes.${item.value}`)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
<el-input v-else v-model.trim="form.name" type="text" /> <el-input v-else v-model.trim="form.name" type="text" />
</el-form-item> </el-form-item>
<el-form-item v-if="!isUpdate" label="编码" prop="code"> <el-form-item v-if="!isUpdate" :label="$t('pages.propsResourceConfig.form.code')" prop="code">
<el-input <el-input
v-model.trim="form.code" v-model.trim="form.code"
type="text" type="text"
placeholder="编码添加后不能修改" :placeholder="$t('pages.propsResourceConfig.placeholder.codeReadonly')"
/> />
</el-form-item> </el-form-item>
<el-form-item v-if="isPrice" label="底价" prop="amount"> <el-form-item v-if="isPrice" :label="$t('pages.propsResourceConfig.form.basePrice')" prop="amount">
<el-input v-model.trim="form.amount" v-number type="text" /> <el-input v-model.trim="form.amount" v-number type="text" />
</el-form-item> </el-form-item>
<el-form-item label="admin free" prop="adminFree"> <el-form-item label="admin free" prop="adminFree">
<el-switch <el-switch
v-model="form.adminFree" v-model="form.adminFree"
active-text="" :active-text="$t('pages.propsResourceConfig.status.yes')"
inactive-text="" :inactive-text="$t('pages.propsResourceConfig.status.no')"
></el-switch> ></el-switch>
</el-form-item> </el-form-item>
<el-form-item label="bd free" prop="bdFree"> <el-form-item label="bd free" prop="bdFree">
<el-switch <el-switch
v-model="form.bdFree" v-model="form.bdFree"
active-text="" :active-text="$t('pages.propsResourceConfig.status.yes')"
inactive-text="" :inactive-text="$t('pages.propsResourceConfig.status.no')"
></el-switch> ></el-switch>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="submitForm()">保存</el-button> <el-button type="primary" @click="submitForm()">{{ $t('pages.propsResourceConfig.action.save') }}</el-button>
<el-button @click="handleClose()">取消</el-button> <el-button @click="handleClose()">{{ $t('pages.propsResourceConfig.action.cancel') }}</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -423,7 +423,7 @@ export default {
}, },
data() { data() {
const commonRules = [ const commonRules = [
{ required: true, message: "必填字段不可为空", trigger: "blur" } { required: true, message: this.$t("pages.propsResourceConfig.validation.required"), trigger: "blur" }
]; ];
return { return {
nobleVipTabs, nobleVipTabs,
@ -550,7 +550,9 @@ export default {
return this.form.type === "CHAT_BUBBLE" && !this.form.expand; return this.form.type === "CHAT_BUBBLE" && !this.form.expand;
}, },
textOptTitle() { textOptTitle() {
return this.row && this.row.id ? "修改" : "添加"; return this.row && this.row.id
? this.$t("pages.propsResourceConfig.action.edit")
: this.$t("pages.propsResourceConfig.action.add");
}, },
isUpdate() { isUpdate() {
return this.row && this.row.id; return this.row && this.row.id;

View File

@ -5,7 +5,7 @@
<div class="filter-container"> <div class="filter-container">
<el-select <el-select
v-model="listQuery.sysOrigin" v-model="listQuery.sysOrigin"
placeholder="归属系统" :placeholder="$t('pages.propsResourceConfig.filter.system')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -23,23 +23,33 @@
<el-select <el-select
v-model="listQuery.type" v-model="listQuery.type"
placeholder="类型" :placeholder="$t('pages.propsResourceConfig.filter.type')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
> >
<el-option v-for="item in propsTypes" :key="item.value" :label="item.name" :value="item.value" /> <el-option
v-for="item in propsTypes"
:key="item.value"
:label="$t(`pages.propsResourceConfig.propsTypes.${item.value}`)"
:value="item.value"
/>
</el-select> </el-select>
<el-select <el-select
v-model="listQuery.del" v-model="listQuery.del"
placeholder="上/下架" :placeholder="$t('pages.propsResourceConfig.filter.shelfStatus')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
clearable clearable
@change="handleSearch" @change="handleSearch"
> >
<el-option v-for="item in showcaseTypes" :key="item.value" :label="item.name" :value="item.value" /> <el-option
v-for="item in showcaseTypes"
:key="item.value"
:label="$t(`pages.propsResourceConfig.status.${item.value ? 'offShelf' : 'onShelf'}`)"
:value="item.value"
/>
</el-select> </el-select>
<el-input <el-input
@ -53,7 +63,7 @@
<el-input <el-input
v-model.trim="listQuery.name" v-model.trim="listQuery.name"
placeholder="名称" :placeholder="$t('pages.propsResourceConfig.filter.name')"
clearable clearable
style="width: 200px;" style="width: 200px;"
class="filter-item" class="filter-item"
@ -65,7 +75,7 @@
icon="el-icon-search" icon="el-icon-search"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.propsResourceConfig.action.search') }}
</el-button> </el-button>
<el-button <el-button
v-if="buttonPermissions.includes('props:config:add')" v-if="buttonPermissions.includes('props:config:add')"
@ -74,7 +84,7 @@
icon="el-icon-edit" icon="el-icon-edit"
@click="handleCreate" @click="handleCreate"
> >
添加 {{ $t('pages.propsResourceConfig.action.add') }}
</el-button> </el-button>
<el-button <el-button
v-if="buttonPermissions.includes('props:config:sales:total')" v-if="buttonPermissions.includes('props:config:sales:total')"
@ -83,7 +93,7 @@
icon="el-icon-monitor" icon="el-icon-monitor"
@click="clickQuerySalesOverview" @click="clickQuerySalesOverview"
> >
销售情况 {{ $t('pages.propsResourceConfig.action.sales') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table
@ -95,10 +105,14 @@
@cell-mouse-enter="handleMouseEnter" @cell-mouse-enter="handleMouseEnter"
> >
<el-table-column prop="id" width="200" label="ID" align="center" /> <el-table-column prop="id" width="200" label="ID" align="center" />
<el-table-column prop="code" width="150" label="编号" align="center" /> <el-table-column prop="code" width="150" :label="$t('pages.propsResourceConfig.table.code')" align="center" />
<el-table-column prop="typeName" width="80" label="类型" align="center" /> <el-table-column prop="typeName" width="80" :label="$t('pages.propsResourceConfig.table.type')" align="center">
<el-table-column prop="name" label="名称" align="center" /> <template slot-scope="scope">
<el-table-column label="资源" width="80" align="center"> {{ scope.row.type ? $t(`pages.propsResourceConfig.propsTypes.${scope.row.type}`) : scope.row.typeName }}
</template>
</el-table-column>
<el-table-column prop="name" :label="$t('pages.propsResourceConfig.table.name')" align="center" />
<el-table-column :label="$t('pages.propsResourceConfig.table.resource')" width="80" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<div class="preview-img"> <div class="preview-img">
<el-image <el-image
@ -115,7 +129,7 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column width="200" label="上/下架" align="center"> <el-table-column width="200" :label="$t('pages.propsResourceConfig.table.shelfStatus')" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-switch <el-switch
v-model="scope.row.del" v-model="scope.row.del"
@ -125,17 +139,17 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="amount" width="80" label="底价" align="center" /> <el-table-column prop="amount" width="80" :label="$t('pages.propsResourceConfig.table.basePrice')" align="center" />
<el-table-column v-if="buttonPermissions.includes('props:config:edit') || buttonPermissions.includes('props:config:sales:single')" fixed="right" label="操作" align="center" width="200"> <el-table-column v-if="buttonPermissions.includes('props:config:edit') || buttonPermissions.includes('props:config:sales:single')" fixed="right" :label="$t('pages.propsResourceConfig.table.actions')" align="center" width="200">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button v-if="buttonPermissions.includes('props:config:edit')" type="text" @click.native="handleUpdate(scope.row)">编辑</el-button> <el-button v-if="buttonPermissions.includes('props:config:edit')" type="text" @click.native="handleUpdate(scope.row)">{{ $t('pages.propsResourceConfig.action.edit') }}</el-button>
<el-button v-if="buttonPermissions.includes('props:config:sales:single')" type="text" @click.native="clickQuerySales(scope.row)">销售情况</el-button> <el-button v-if="buttonPermissions.includes('props:config:sales:single')" type="text" @click.native="clickQuerySales(scope.row)">{{ $t('pages.propsResourceConfig.action.sales') }}</el-button>
</template> </template>
</el-table-column> </el-table-column>
<template> <template>
<el-table-column prop="adminFree" label="admin free" align="center"> <el-table-column prop="adminFree" label="admin free" align="center">
<template #default="scope"> <template #default="scope">
<span>{{ scope.row.adminFree ? '是' : '否' }}</span> <span>{{ scope.row.adminFree ? $t('pages.propsResourceConfig.status.yes') : $t('pages.propsResourceConfig.status.no') }}</span>
</template> </template>
</el-table-column> </el-table-column>
</template> </template>
@ -166,7 +180,7 @@
/> />
</div> </div>
<div v-else style="text-align: center;"> <div v-else style="text-align: center;">
抱歉您无权查看请联系管理员开通查看权限 道具管理-资源配置-查看props:config:query {{ $t('pages.propsResourceConfig.message.noPermission') }}
</div> </div>
</div> </div>
</template> </template>
@ -187,8 +201,8 @@ export default {
salesOverviewChartsDialogVisible: false, salesOverviewChartsDialogVisible: false,
salesMothlyChartsDialogVisible: false, salesMothlyChartsDialogVisible: false,
showcaseTypes: [ showcaseTypes: [
{ value: true, name: '下架' }, { value: true, name: 'offShelf' },
{ value: false, name: '上架' } { value: false, name: 'onShelf' }
], ],
formEditVisable: false, formEditVisable: false,
thisRow: {}, thisRow: {},

View File

@ -31,6 +31,12 @@ export default {
this.renderCharts() this.renderCharts()
} }
} }
},
$locale() {
if (this.charts) {
this.charts.clear()
this.renderCharts()
}
} }
}, },
created() { created() {
@ -111,9 +117,9 @@ export default {
}, },
series: [ series: [
{ {
name: '每日销售情况', name: that.$t('pages.propsResourceConfig.chart.dailySales'),
type: 'line', type: 'line',
stack: '每日销售情况', stack: that.$t('pages.propsResourceConfig.chart.dailySales'),
smooth: 0.6, smooth: 0.6,
symbol: 'none', symbol: 'none',
symbolSize: 10, symbolSize: 10,

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="props-config-edit"> <div class="props-config-edit">
<el-dialog <el-dialog
title="销售报表" :title="$t('pages.propsResourceConfig.dialog.salesReport')"
:visible="true" :visible="true"
:modal-append-to-body="true" :modal-append-to-body="true"
:append-to-body="true" :append-to-body="true"
@ -13,7 +13,7 @@
<div class="filter-container"> <div class="filter-container">
<el-select <el-select
v-model="listQuery.sysOrigin" v-model="listQuery.sysOrigin"
placeholder="系统" :placeholder="$t('pages.propsResourceConfig.filter.system')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="renderData" @change="renderData"
@ -34,13 +34,13 @@
:clearable="false" :clearable="false"
value-format="yyyyMM" value-format="yyyyMM"
type="month" type="month"
placeholder="选择月" :placeholder="$t('pages.propsResourceConfig.placeholder.month')"
:editable="false" :editable="false"
@change="renderData" @change="renderData"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
月销售总额: {{ sale.monthTotal || '-' }}年售额: {{ sale.yearTotal || '-' }} {{ $t('pages.propsResourceConfig.summary.monthTotal') }}: {{ sale.monthTotal || '-' }}{{ $t('pages.propsResourceConfig.summary.separator') }}{{ $t('pages.propsResourceConfig.summary.yearTotal') }}: {{ sale.yearTotal || '-' }}
</div> </div>
</div> </div>
<div v-loading="loading"> <div v-loading="loading">

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="team-application-process-approval-list"> <div class="team-application-process-approval-list">
<el-drawer <el-drawer
title="申请团队日志列表" :title="$t('pages.teamList.processApproval.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -13,11 +13,11 @@
<div class="filter-container" style="margin: 10px;"> <div class="filter-container" style="margin: 10px;">
<div class="filter-item"> <div class="filter-item">
<account-input v-model="listQuery.beProcessUserId" :sys-origin="sysOrigin" placeholder="被处理人ID" /> <account-input v-model="listQuery.beProcessUserId" :sys-origin="sysOrigin" :placeholder="$t('pages.teamList.processApproval.processedUserId')" />
</div> </div>
<el-select <el-select
v-model="listQuery.reason" v-model="listQuery.reason"
placeholder="原因" :placeholder="$t('pages.teamList.processApproval.reason')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -25,7 +25,7 @@
<el-option <el-option
v-for="(item, index) in teamApprovalReasons" v-for="(item, index) in teamApprovalReasons"
:key="index" :key="index"
:label="item.name" :label="getTeamApprovalReasonName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
@ -34,26 +34,26 @@
type="primary" type="primary"
@click="handleSearch" @click="handleSearch"
> >
查询 {{ $t('pages.teamList.action.query') }}
</el-button> </el-button>
</div> </div>
<div v-loading="listLoading"> <div v-loading="listLoading">
<el-row v-for="(item, index) in list" :key="index"> <el-row v-for="(item, index) in list" :key="index">
<el-card style="margin: 10px;"> <el-card style="margin: 10px;">
<div> <div>
<el-tag type="warning">原因: {{ getTeamApprovalReasonName(item.reason) }}</el-tag> <el-tag type="warning">{{ $t('pages.teamList.processApproval.reasonLabel') }}: {{ getTeamApprovalReasonName(item.reason) }}</el-tag>
<el-tag type="warning" @click.native="queryUserDetails(item.beProcessUser.id)">被处理人: {{ item.beProcessUser.userNickname }}</el-tag> <el-tag type="warning" @click.native="queryUserDetails(item.beProcessUser.id)">{{ $t('pages.teamList.processApproval.processedUser') }}: {{ item.beProcessUser.userNickname }}</el-tag>
<el-tag v-if="item.createUserOrigin == 1 && item.createSysUser != null" type="info">操作人: {{ item.createSysUser.nickname }}</el-tag> <el-tag v-if="item.createUserOrigin == 1 && item.createSysUser != null" type="info">{{ $t('pages.teamList.processApproval.operator') }}: {{ item.createSysUser.nickname }}</el-tag>
<el-tag v-if="item.createUserOrigin == 0 && item.createUserProfile != null" type="info" @click.native="queryUserDetails(item.createUserProfile.id)">创建人: {{ item.createUserProfile.userNickname }}</el-tag> <el-tag v-if="item.createUserOrigin == 0 && item.createUserProfile != null" type="info" @click.native="queryUserDetails(item.createUserProfile.id)">{{ $t('pages.teamList.processApproval.creator') }}: {{ item.createUserProfile.userNickname }}</el-tag>
</div> </div>
<div class="bottom clearfix"> <div class="bottom clearfix">
<time class="time">创建时间:{{ item.createTime }}</time> <time class="time">{{ $t('pages.teamList.processApproval.createdAt') }}: {{ item.createTime }}</time>
</div> </div>
</el-card> </el-card>
</el-row> </el-row>
<div v-if="list && list.length > 0" style="text-align: center; margin-top:20px;"> <div v-if="list && list.length > 0" style="text-align: center; margin-top:20px;">
<el-button v-if="!notMore " size="mini" :disabled="listLoading" @click="clickLoadMore">加载更多</el-button> <el-button v-if="!notMore " size="mini" :disabled="listLoading" @click="clickLoadMore">{{ $t('pages.teamList.action.loadMore') }}</el-button>
<span v-else>已加载全部</span> <span v-else>{{ $t('pages.teamList.action.allLoaded') }}</span>
</div> </div>
</div> </div>
@ -128,14 +128,7 @@ export default {
this.renderData(true) this.renderData(true)
}, },
getTeamApprovalReasonName(_reason) { getTeamApprovalReasonName(_reason) {
var _name = '' return this.$t(`pages.teamList.approvalReasonMap.${_reason}`)
this.teamApprovalReasons.forEach(function(v, i) {
if (v.value === _reason) {
_name = v.name
return
}
})
return _name
}, },
handleClose() { handleClose() {
this.$emit('close') this.$emit('close')

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="team-bill-drawer"> <div class="team-bill-drawer">
<el-drawer <el-drawer
title="详情" :title="$t('pages.teamBill.detailsDrawer.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -11,7 +11,7 @@
custom-class="drawer-auto-layout" custom-class="drawer-auto-layout"
> >
<div class="team-bill-content"> <div class="team-bill-content">
<div class="blockquote">代理</div> <div class="blockquote">{{ $t('pages.teamBill.section.agent') }}</div>
<div class="content"> <div class="content">
<user-table-exhibit <user-table-exhibit
:user-profile="row.ownUserProfile" :user-profile="row.ownUserProfile"
@ -19,54 +19,54 @@
/> />
</div> </div>
<div class="blockquote">账单信息</div> <div class="blockquote">{{ $t('pages.teamBill.section.billInfo') }}</div>
<div class="content"> <div class="content">
<div class="flex-b bill-row"> <div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis">ID: {{ row.id }}</div> <div class="left bill-col nowrap-ellipsis">ID: {{ row.id }}</div>
<div class="right bill-col nowrap-ellipsis"> <div class="right bill-col nowrap-ellipsis">
区域: {{ row.regionName }} {{ $t('pages.teamBill.label.region') }}: {{ row.regionName }}
</div> </div>
</div> </div>
<div class="flex-b bill-row"> <div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis"> <div class="left bill-col nowrap-ellipsis">
账单归属: {{ row.billBelong }} {{ $t('pages.teamBill.label.billBelong') }}: {{ row.billBelong }}
</div> </div>
<div class="left bill-col nowrap-ellipsis"> <div class="left bill-col nowrap-ellipsis">
账单标题: {{ row.billTitle }} {{ $t('pages.teamBill.label.billTitle') }}: {{ row.billTitle }}
</div> </div>
</div> </div>
<div class="flex-b bill-row"> <div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis"> <div class="left bill-col nowrap-ellipsis">
状态: {{ teamBillStatusMap[row.status].name }} {{ $t('pages.teamBill.label.status') }}: {{ teamBillStatusName(row.status) }}
</div> </div>
</div> </div>
<div v-if="row.settleResult"> <div v-if="row.settleResult">
<div class="flex-b bill-row"> <div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis"> <div class="left bill-col nowrap-ellipsis">
工作人数: {{ row.settleResult.workMembers }} {{ $t('pages.teamBill.label.workMembers') }}: {{ row.settleResult.workMembers }}
</div> </div>
<div class="right bill-col nowrap-ellipsis"> <div class="right bill-col nowrap-ellipsis">
完成人数: {{ row.settleResult.finishMembers }} {{ $t('pages.teamBill.label.finishMembers') }}: {{ row.settleResult.finishMembers }}
</div> </div>
</div> </div>
<div class="flex-b bill-row"> <div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis"> <div class="left bill-col nowrap-ellipsis">
成员工资: {{ row.settleResult.memberSalary || 0 }} {{ $t('pages.teamBill.label.memberSalary') }}: {{ row.settleResult.memberSalary || 0 }}
</div> </div>
<div class="right bill-col nowrap-ellipsis"> <div class="right bill-col nowrap-ellipsis">
团长工资: {{ row.settleResult.ownSalary || 0 }} {{ $t('pages.teamBill.label.agentSalary') }}: {{ row.settleResult.ownSalary || 0 }}
</div> </div>
</div> </div>
<div class="flex-b bill-row"> <div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis"> <div class="left bill-col nowrap-ellipsis">
扣除工资: {{ row.settleResult.deductSalary || 0 }} {{ $t('pages.teamBill.label.deductSalary') }}: {{ row.settleResult.deductSalary || 0 }}
</div> </div>
<div class="right bill-col nowrap-ellipsis"> <div class="right bill-col nowrap-ellipsis">
合计工资: {{ row.settleResult.totalSalary || 0 }} {{ $t('pages.teamBill.label.totalSalary') }}: {{ row.settleResult.totalSalary || 0 }}
</div> </div>
</div> </div>
@ -86,12 +86,12 @@
</div> </div>
<div v-if="row.remarks" class="bill-row"> <div v-if="row.remarks" class="bill-row">
对外备注: {{ row.remarks }} {{ $t('pages.teamBill.label.externalRemarks') }}: {{ row.remarks }}
</div> </div>
</div> </div>
<div v-if="row.internalRemarks && row.internalRemarks.length > 0"> <div v-if="row.internalRemarks && row.internalRemarks.length > 0">
<div class="blockquote">内部备注</div> <div class="blockquote">{{ $t('pages.teamBill.section.internalRemarks') }}</div>
<div class="content"> <div class="content">
<el-timeline :reverse="true"> <el-timeline :reverse="true">
<el-timeline-item <el-timeline-item
@ -109,7 +109,7 @@
</div> </div>
<div v-if="row.settleResult && row.settleResult.bankCardArchives"> <div v-if="row.settleResult && row.settleResult.bankCardArchives">
<div class="blockquote">银行卡</div> <div class="blockquote">{{ $t('pages.teamBill.section.bankCard') }}</div>
<div class="content"> <div class="content">
<div class="bank-card-list"> <div class="bank-card-list">
<div class="bank-card-item back-blue"> <div class="bank-card-item back-blue">
@ -179,7 +179,6 @@
</div> </div>
</template> </template>
<script> <script>
import { teamBillStatusMap } from "@/constant/team-type";
export default { export default {
name: "TeamBillDetailsDrawer", name: "TeamBillDetailsDrawer",
props: { props: {
@ -188,12 +187,10 @@ export default {
required: true required: true
} }
}, },
data() {
return {
teamBillStatusMap: teamBillStatusMap()
};
},
methods: { methods: {
teamBillStatusName(status) {
return this.$t(`pages.teamBill.status.${status}`);
},
handleClose() { handleClose() {
this.$emit("close"); this.$emit("close");
} }

View File

@ -15,14 +15,14 @@
v-model="listQuery.region" v-model="listQuery.region"
:sys-origin="listQuery.sysOrigin" :sys-origin="listQuery.sysOrigin"
clearable clearable
placeholder="区域" :placeholder="$t('pages.teamBill.placeholder.region')"
@change="handleSearch" @change="handleSearch"
/> />
</div> </div>
<el-select <el-select
v-model="listQuery.status" v-model="listQuery.status"
placeholder="账单状态" :placeholder="$t('pages.teamBill.placeholder.billStatus')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -31,7 +31,7 @@
v-for="(item, index) in teamBillStatus" v-for="(item, index) in teamBillStatus"
:key="index" :key="index"
:dis="item.value === 'UNPAID'" :dis="item.value === 'UNPAID'"
:label="item.name" :label="teamBillStatusName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
@ -56,12 +56,12 @@
<account-input <account-input
v-model="listQuery.ownUserId" v-model="listQuery.ownUserId"
:sys-origin="listQuery.sysOrigin" :sys-origin="listQuery.sysOrigin"
placeholder="代理ID" :placeholder="$t('pages.teamBill.placeholder.agentId')"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
<el-input v-model="listQuery.id" placeholder="账单ID" /> <el-input v-model="listQuery.id" :placeholder="$t('pages.teamBill.placeholder.billId')" />
</div> </div>
<div class="filter-item"> <div class="filter-item">
@ -71,9 +71,9 @@
value-format="timestamp" value-format="timestamp"
type="datetimerange" type="datetimerange"
:picker-options="pickerOptions" :picker-options="pickerOptions"
range-separator="" :range-separator="$t('pages.teamBill.date.rangeSeparator')"
start-placeholder="开始日期开始" :start-placeholder="$t('pages.teamBill.date.start')"
end-placeholder="结束日期结束" :end-placeholder="$t('pages.teamBill.date.end')"
/> />
</div> </div>
<el-button <el-button
@ -82,7 +82,7 @@
icon="el-icon-search" icon="el-icon-search"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.teamBill.action.search') }}
</el-button> </el-button>
<el-button <el-button
:loading="importLoading" :loading="importLoading"
@ -91,7 +91,7 @@
icon="el-icon-download" icon="el-icon-download"
@click="clickExcel" @click="clickExcel"
> >
导出 {{ $t('pages.teamBill.action.export') }}
</el-button> </el-button>
</div> </div>
@ -105,7 +105,7 @@
> >
<el-table-column type="index" width="50" label="No" /> <el-table-column type="index" width="50" label="No" />
<el-table-column <el-table-column
label="代理" :label="$t('pages.teamBill.table.agent')"
align="left" align="left"
show-overflow-tooltip show-overflow-tooltip
min-width="220" min-width="220"
@ -119,14 +119,14 @@
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="区域" :label="$t('pages.teamBill.table.region')"
align="left" align="left"
prop="regionName" prop="regionName"
show-overflow-tooltip show-overflow-tooltip
min-width="100" min-width="100"
/> />
<el-table-column <el-table-column
label="归属" :label="$t('pages.teamBill.table.belong')"
prop="billBelong" prop="billBelong"
align="center" align="center"
show-overflow-tooltip show-overflow-tooltip
@ -142,7 +142,7 @@
v-if=" v-if="
listQuery.status === 'SETTLED' && listQuery.status !== 'PRE_CREATION' listQuery.status === 'SETTLED' && listQuery.status !== 'PRE_CREATION'
" "
label="工资" :label="$t('pages.teamBill.table.salary')"
align="left" align="left"
show-overflow-tooltip show-overflow-tooltip
min-width="220" min-width="220"
@ -150,12 +150,12 @@
<template slot-scope="scope"> <template slot-scope="scope">
<div class="settled-row"> <div class="settled-row">
<div class="col "> <div class="col ">
成员/代理: {{ scope.row.settleResult.memberSalary }}/{{ {{ $t('pages.teamBill.label.memberAgent') }}: {{ scope.row.settleResult.memberSalary }}/{{
scope.row.settleResult.ownSalary scope.row.settleResult.ownSalary
}} }}
</div> </div>
<div class="col"> <div class="col">
合计: {{ scope.row.settleResult.totalSalary }} {{ $t('pages.teamBill.label.total') }}: {{ scope.row.settleResult.totalSalary }}
</div> </div>
</div> </div>
</template> </template>
@ -192,7 +192,7 @@
</el-table-column> --> </el-table-column> -->
<el-table-column <el-table-column
label="修改人" :label="$t('pages.teamBill.table.updatedBy')"
prop="updateUserNickname" prop="updateUserNickname"
align="center" align="center"
show-overflow-tooltip show-overflow-tooltip
@ -200,18 +200,18 @@
/> />
<el-table-column <el-table-column
label="时间" :label="$t('pages.teamBill.table.time')"
align="center" align="center"
show-overflow-tooltip show-overflow-tooltip
min-width="200" min-width="200"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<div>创建: {{ scope.row.createTime | dateFormat }}</div> <div>{{ $t('pages.teamBill.label.created') }}: {{ scope.row.createTime | dateFormat }}</div>
<div>修改: {{ scope.row.updateTime | dateFormat }}</div> <div>{{ $t('pages.teamBill.label.updated') }}: {{ scope.row.updateTime | dateFormat }}</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="100"> <el-table-column fixed="right" :label="$t('pages.teamBill.table.actions')" align="center" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<el-dropdown> <el-dropdown>
<span class="el-dropdown-link"> <span class="el-dropdown-link">
@ -219,7 +219,7 @@
</span> </span>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="clickQueryDetails(scope.row)" <el-dropdown-item @click.native="clickQueryDetails(scope.row)"
>详情</el-dropdown-item >{{ $t('pages.teamBill.action.details') }}</el-dropdown-item
> >
<!-- <el-dropdown-item <!-- <el-dropdown-item
:disabled="scope.row.status === 'PRE_CREATION'" :disabled="scope.row.status === 'PRE_CREATION'"
@ -237,19 +237,19 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<div v-if="listQuery.lastId" class="load-more"> <div v-if="listQuery.lastId" class="load-more">
<span v-if="notData">已加载全部</span> <span v-if="notData">{{ $t('pages.teamBill.action.loadedAll') }}</span>
<el-button <el-button
v-else v-else
size="mini" size="mini"
:disabled="loadMoreLoading" :disabled="loadMoreLoading"
:loading="loadMoreLoading" :loading="loadMoreLoading"
@click="clickLoadMore" @click="clickLoadMore"
>加载更多</el-button >{{ $t('pages.teamBill.action.loadMore') }}</el-button
> >
</div> </div>
<el-drawer <el-drawer
title="导出条件" :title="$t('pages.teamBill.exportDialog.title')"
:visible="dialogExcelVisible" :visible="dialogExcelVisible"
:before-close="exportConditionClose" :before-close="exportConditionClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -267,35 +267,35 @@
label-position="left" label-position="left"
label-width="70px" label-width="70px"
> >
<el-form-item label="区域" prop="region"> <el-form-item :label="$t('pages.teamBill.exportDialog.region')" prop="region">
<select-system-region <select-system-region
v-model="excelQuery.region" v-model="excelQuery.region"
:sys-origin="excelQuery.sysOrigin" :sys-origin="excelQuery.sysOrigin"
placeholder="区域" :placeholder="$t('pages.teamBill.placeholder.region')"
/> />
</el-form-item> </el-form-item>
<el-form-item label="状态" prop="billStatusList"> <el-form-item :label="$t('pages.teamBill.exportDialog.status')" prop="billStatusList">
<el-select <el-select
v-model="excelQuery.billStatusList" v-model="excelQuery.billStatusList"
multiple multiple
placeholder="账单状态" :placeholder="$t('pages.teamBill.placeholder.billStatus')"
style="width: 100%;" style="width: 100%;"
> >
<el-option <el-option
v-for="(item, index) in teamBillStatus" v-for="(item, index) in teamBillStatus"
:key="index" :key="index"
:label="item.name" :label="teamBillStatusName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="时间" prop="monthDate"> <el-form-item :label="$t('pages.teamBill.exportDialog.time')" prop="monthDate">
<el-date-picker <el-date-picker
v-model="excelQuery.monthDate" v-model="excelQuery.monthDate"
value-format="yyyyMM" value-format="yyyyMM"
type="month" type="month"
placeholder="选择月" :placeholder="$t('pages.teamBill.placeholder.selectMonth')"
style="width: 100%;" style="width: 100%;"
/> />
</el-form-item> </el-form-item>
@ -303,14 +303,14 @@
</div> </div>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button :disabled="importLoading" @click="exportConditionClose" <el-button :disabled="importLoading" @click="exportConditionClose"
> </el-button >{{ $t('pages.teamBill.action.cancel') }}</el-button
> >
<el-button <el-button
type="primary" type="primary"
:loading="importLoading" :loading="importLoading"
:disabled="importLoading" :disabled="importLoading"
@click="handleExcel()" @click="handleExcel()"
> </el-button >{{ $t('pages.teamBill.action.confirm') }}</el-button
> >
</div> </div>
</div> </div>
@ -365,8 +365,7 @@ import { listTeamBillTable, excelAnchorBill } from "@/api/team";
import { pickerOptions } from "@/constant/el-const"; import { pickerOptions } from "@/constant/el-const";
import { import {
billCyclePolicyTypes, billCyclePolicyTypes,
teamBillStatus, teamBillStatus
teamBillStatusMap
} from "@/constant/team-type"; } from "@/constant/team-type";
import TeamBillRemark from "./team-bill-remark"; import TeamBillRemark from "./team-bill-remark";
@ -387,7 +386,11 @@ export default {
}, },
data() { data() {
const commonRules = [ const commonRules = [
{ required: true, message: "必填字段不可为空", trigger: "blur" } {
required: true,
message: this.$t("pages.teamBill.validation.requiredField"),
trigger: "blur"
}
]; ];
return { return {
importLoading: false, importLoading: false,
@ -401,7 +404,6 @@ export default {
teamBillRemarkVisible: false, teamBillRemarkVisible: false,
teamBillInternalRemarkVisible: false, teamBillInternalRemarkVisible: false,
billDetailsVisible: false, billDetailsVisible: false,
teamBillStatusMap: teamBillStatusMap(),
teamBillStatus, teamBillStatus,
dialogExcelVisible: false, dialogExcelVisible: false,
billCyclePolicyTypes, billCyclePolicyTypes,
@ -498,6 +500,9 @@ export default {
this.thatRow = row; this.thatRow = row;
this.teamEditVisible = true; this.teamEditVisible = true;
}, },
teamBillStatusName(status) {
return this.$t(`pages.teamBill.status.${status}`);
},
tableSelectable(row) { tableSelectable(row) {
return row.role !== "OWN"; return row.role !== "OWN";
}, },
@ -552,7 +557,7 @@ export default {
this.thatRow.status = form.status; this.thatRow.status = form.status;
}, },
clickBillShare(row) { clickBillShare(row) {
this.$opsMessage.fail("还没有实现"); this.$opsMessage.fail(this.$t("pages.teamBill.message.notImplemented"));
}, },
clickQueryTeamDetails(row) { clickQueryTeamDetails(row) {
this.thatRow = row; this.thatRow = row;
@ -569,7 +574,7 @@ export default {
}, },
exportConditionClose() { exportConditionClose() {
if (this.importLoading) { if (this.importLoading) {
this.$opsMessage.warn("正在执行导出, 请稍等~"); this.$opsMessage.warn(this.$t("pages.teamBill.message.exporting"));
return; return;
} }
this.dialogExcelVisible = false; this.dialogExcelVisible = false;
@ -592,7 +597,7 @@ export default {
.catch(er => { .catch(er => {
that.importLoading = false; that.importLoading = false;
this.dialogExcelVisible = false; this.dialogExcelVisible = false;
this.$opsMessage.fail("下载失败!"); this.$opsMessage.fail(this.$t("pages.teamBill.message.downloadFailed"));
}); });
}); });
} }

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="team-bill-remark-drawer"> <div class="team-bill-remark-drawer">
<el-drawer <el-drawer
title="备注" :title="$t('pages.teamBill.internalRemarkDrawer.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -12,7 +12,7 @@
> >
<div class="team-bill-remark"> <div class="team-bill-remark">
<p v-if="!remarks || remarks.length === 0">点击下方按钮添加 备注</p> <p v-if="!remarks || remarks.length === 0">{{ $t('pages.teamBill.internalRemarkDrawer.empty') }}</p>
<el-timeline v-else :reverse="true"> <el-timeline v-else :reverse="true">
<el-timeline-item <el-timeline-item
v-for="(item, index) in remarks" v-for="(item, index) in remarks"
@ -28,14 +28,14 @@
</el-timeline> </el-timeline>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button @click="handleClose()">关闭</el-button> <el-button @click="handleClose()">{{ $t('pages.teamBill.action.close') }}</el-button>
<el-button type="primary" @click="clickAddRemarks">新增</el-button> <el-button type="primary" @click="clickAddRemarks">{{ $t('pages.teamBill.action.add') }}</el-button>
</div> </div>
</div> </div>
</el-drawer> </el-drawer>
<el-dialog <el-dialog
title="备注" :title="$t('pages.teamBill.internalRemarkDrawer.title')"
:visible.sync="remarkVisible" :visible.sync="remarkVisible"
:modal-append-to-body="true" :modal-append-to-body="true"
:append-to-body="true" :append-to-body="true"
@ -47,7 +47,7 @@
<el-input <el-input
v-model="form.remarks" v-model="form.remarks"
type="textarea" type="textarea"
placeholder="请输入备注" :placeholder="$t('pages.teamBill.placeholder.remarks')"
maxlength="100" maxlength="100"
show-word-limit show-word-limit
resize="none" resize="none"
@ -56,8 +56,8 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button :disabled="submitLoading" @click="remarkVisible = false"> </el-button> <el-button :disabled="submitLoading" @click="remarkVisible = false">{{ $t('pages.teamBill.action.cancel') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submitAddRemarks"> </el-button> <el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submitAddRemarks">{{ $t('pages.teamBill.action.confirm') }}</el-button>
</span> </span>
</el-dialog> </el-dialog>
</div> </div>
@ -85,7 +85,7 @@ export default {
}, },
formRules: { formRules: {
remarks: [ remarks: [
{ required: true, message: '必填字段不可为空', trigger: 'blur' } { required: true, message: this.$t('pages.teamBill.validation.requiredField'), trigger: 'blur' }
] ]
}, },
delForm: { delForm: {
@ -111,7 +111,7 @@ export default {
methods: { methods: {
handleClose() { handleClose() {
if (this.submitLoading) { if (this.submitLoading) {
this.$opsMessage.warn('正在提交!') this.$opsMessage.warn(this.$t('pages.teamBill.message.submitting'))
return return
} }
this.$emit('close') this.$emit('close')
@ -151,7 +151,7 @@ export default {
}, },
clickAddRemarks() { clickAddRemarks() {
if (this.remarks && this.remarks.length >= 20) { if (this.remarks && this.remarks.length >= 20) {
this.$opsMessage.warn('最多添加20条备注, 清删除不必要的备注后重新添加') this.$opsMessage.warn(this.$t('pages.teamBill.message.maxRemarks'))
return return
} }
this.remarkVisible = true this.remarkVisible = true

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="team-bill-remarks-drawer"> <div class="team-bill-remarks-drawer">
<el-drawer <el-drawer
title="编辑备注" :title="$t('pages.teamBill.remarkDrawer.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -13,11 +13,11 @@
<div class="team-bill-remarks"> <div class="team-bill-remarks">
<div class="drawer-form"> <div class="drawer-form">
<el-form ref="form" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;"> <el-form ref="form" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;">
<el-form-item prop="remarks" label="备注"> <el-form-item prop="remarks" :label="$t('pages.teamBill.label.remarks')">
<el-input <el-input
v-model="form.remarks" v-model="form.remarks"
type="textarea" type="textarea"
placeholder="请输入备注" :placeholder="$t('pages.teamBill.placeholder.remarks')"
maxlength="100" maxlength="100"
show-word-limit show-word-limit
resize="none" resize="none"
@ -27,8 +27,8 @@
</el-form> </el-form>
</div> </div>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button :disabled="submitLoading" @click="handleClose()">关闭</el-button> <el-button :disabled="submitLoading" @click="handleClose()">{{ $t('pages.teamBill.action.close') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">保存</el-button> <el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">{{ $t('pages.teamBill.action.save') }}</el-button>
</div> </div>
</div> </div>
</el-drawer> </el-drawer>
@ -73,7 +73,7 @@ export default {
methods: { methods: {
handleClose() { handleClose() {
if (this.submitLoading) { if (this.submitLoading) {
this.$opsMessage.warn('正在提交!') this.$opsMessage.warn(this.$t('pages.teamBill.message.submitting'))
return return
} }
this.$emit('close') this.$emit('close')

View File

@ -10,17 +10,17 @@
custom-class="drawer-auto-layout" custom-class="drawer-auto-layout"
> >
<div slot="title" class="flex-l"> <div slot="title" class="flex-l">
<sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;结算账单 <el-button :loading="calculatorLoading" type="text" @click="reloadCalculator"><i v-if="!calculatorLoading" class="el-icon-refresh cursor-pointer" /></el-button> <sys-origin-icon :icon="row.sysOrigin" size="18px" />&nbsp;{{ $t('pages.teamBill.settleDrawer.title') }} <el-button :loading="calculatorLoading" type="text" @click="reloadCalculator"><i v-if="!calculatorLoading" class="el-icon-refresh cursor-pointer" /></el-button>
</div> </div>
<div class="team-bill-settle"> <div class="team-bill-settle">
<div class="drawer-form"> <div class="drawer-form">
<!-- <div v-if="row.details"> --> <!-- <div v-if="row.details"> -->
<div class="blockquote">政策计算 <div class="blockquote">{{ $t('pages.teamBill.settleDrawer.policyCalculation') }}
<el-tooltip class="item" effect="dark"> <el-tooltip class="item" effect="dark">
<div slot="content"> <div slot="content">
<p>* 根据选择 区域+政策 计算团队成员工资情况</p> <p>{{ $t('pages.teamBill.settleDrawer.policyTips.calculate') }}</p>
<p>* 哪些用会被计算到工作人数中? <br> &nbsp;&nbsp;&nbsp;&nbsp; 在线/房间流水/发送礼物/收礼物 都将会记录到工作账单中</p> <p>{{ $t('pages.teamBill.settleDrawer.policyTips.workMembers') }}</p>
<p>* 政策根据什么计算的? <br> &nbsp;&nbsp;&nbsp;&nbsp; 根据选择的 区域+政策 政策 数据中的接受礼物作为 目标 进行计算</p> <p>{{ $t('pages.teamBill.settleDrawer.policyTips.policyBasis') }}</p>
</div> </div>
<i class="el-icon-info" /> <i class="el-icon-info" />
</el-tooltip> </el-tooltip>
@ -28,68 +28,64 @@
<div class="content"> <div class="content">
<div class="flex-b bill-row"> <div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis"> <div class="left bill-col nowrap-ellipsis">
工作人数: {{ calculatorRes.workMembers }} {{ $t('pages.teamBill.label.workMembers') }}: {{ calculatorRes.workMembers }}
</div> </div>
<div class="right bill-col nowrap-ellipsis"> <div class="right bill-col nowrap-ellipsis">
完成人数: {{ calculatorRes.finishMembers }} {{ $t('pages.teamBill.label.finishMembers') }}: {{ calculatorRes.finishMembers }}
</div> </div>
</div> </div>
<div class="flex-b bill-row"> <div class="flex-b bill-row">
<div class="left bill-col nowrap-ellipsis"> <div class="left bill-col nowrap-ellipsis">
成员工资$: {{ calculatorRes.memberSalary }} {{ $t('pages.teamBill.label.memberSalaryUsd') }}: {{ calculatorRes.memberSalary }}
</div> </div>
<div class="right bill-col nowrap-ellipsis"> <div class="right bill-col nowrap-ellipsis">
团长工资$: {{ calculatorRes.ownSalary }} {{ $t('pages.teamBill.label.agentSalaryUsd') }}: {{ calculatorRes.ownSalary }}
</div> </div>
</div> </div>
<div class="flex-b bill-row"> <div class="flex-b bill-row">
<div class="right bill-col nowrap-ellipsis"> <div class="right bill-col nowrap-ellipsis">
合计工资$: {{ calculatorRes.totalSalary }} {{ $t('pages.teamBill.label.totalSalaryUsd') }}: {{ calculatorRes.totalSalary }}
</div> </div>
</div> </div>
<!-- </div> --> <!-- </div> -->
</div> </div>
<div class="blockquote">结算 <div class="blockquote">{{ $t('pages.teamBill.settleDrawer.settlement') }}
<el-tooltip class="item" effect="dark"> <el-tooltip class="item" effect="dark">
<div slot="content"> <div slot="content">
<p>* 区域: 选择本次团队结算区域, 切换区域将会对应影响到 本次结算 政策</p> <p>{{ $t('pages.teamBill.settleDrawer.settleTips.region') }}</p>
<p>* 政策: 团队结算对应的政策</p> <p>{{ $t('pages.teamBill.settleDrawer.settleTips.policy') }}</p>
<p>* 收款: 结算到用户的银行卡信息, 结算人员注意跟转账凭证截图中的对应起来</p> <p>{{ $t('pages.teamBill.settleDrawer.settleTips.payee') }}</p>
<p>* 类型: 本次账单结算类型 <p>{{ $t('pages.teamBill.settleDrawer.settleTips.type') }}</p>
<br>&nbsp;&nbsp;&nbsp;&nbsp; 美元: 发送美元 <p>{{ $t('pages.teamBill.settleDrawer.settleTips.voucher') }}</p>
<br>&nbsp;&nbsp;&nbsp;&nbsp; 金币: 结算人员将对应的工资折算金币, 需要输入金币数量(结算系统不会自动发送金币) <p>{{ $t('pages.teamBill.settleDrawer.settleTips.remarks') }}</p>
<br>&nbsp;&nbsp;&nbsp;&nbsp; 美元+金币: 结算人员将部分工资折算成金币 + 部分美元 (线下协调: 主播看到的还是他的实际工资, 代理看到的是更详细的: 金币 + 美元)
</p>
<p>* 转账凭证: 结算人员发送金币/美元 后的记录凭证截图</p>
<p>* 备注: 本次账单备注, 对外显示</p>
</div> </div>
<i class="el-icon-info" /> <i class="el-icon-info" />
</el-tooltip> </el-tooltip>
</div> </div>
<el-form ref="form" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;"> <el-form ref="form" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;">
<el-form-item prop="region" label="区域"> <el-form-item prop="region" :label="$t('pages.teamBill.label.region')">
<select-system-region <select-system-region
ref="regionSelectPolicy" ref="regionSelectPolicy"
v-model="form.region" v-model="form.region"
:sys-origin="row.sysOrigin" :sys-origin="row.sysOrigin"
placeholder="请选择区域" :placeholder="$t('pages.teamBill.placeholder.selectRegion')"
:disabled="calculatorLoading" :disabled="calculatorLoading"
@change="changeRegion" @change="changeRegion"
/> />
</el-form-item> </el-form-item>
<el-form-item prop="policyId" label="政策"> <el-form-item prop="policyId" :label="$t('pages.teamBill.label.policy')">
<policy-select-sys-region <policy-select-sys-region
ref="PolicySelectedSysRegion" ref="PolicySelectedSysRegion"
v-model="form.policyId" v-model="form.policyId"
:sys-origin="nativeRow.sysOrigin" :sys-origin="nativeRow.sysOrigin"
:region="region" :region="region"
placeholder="请选择政策" :placeholder="$t('pages.teamBill.placeholder.selectPolicy')"
:disabled="calculatorLoading" :disabled="calculatorLoading"
@change="cahngePolicy" @change="cahngePolicy"
/> />
@ -105,31 +101,31 @@
/> />
</el-form-item> --> </el-form-item> -->
<el-form-item prop="settleType" label="类型"> <el-form-item prop="settleType" :label="$t('pages.teamBill.label.type')">
<el-select <el-select
v-model="form.settleType" v-model="form.settleType"
placeholder="请选择结算类型" :placeholder="$t('pages.teamBill.placeholder.selectSettleType')"
style="width: 100%;" style="width: 100%;"
> >
<el-option <el-option
v-for="(item, index) in teamBillSettleTypes" v-for="(item, index) in teamBillSettleTypes"
:key="index" :key="index"
:label="item.name" :label="teamBillSettleTypeName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item v-if="form.settleType === 'GOLD' || form.settleType === 'MONEY_GOLD'" prop="goldQuantity" label="金币"> <el-form-item v-if="form.settleType === 'GOLD' || form.settleType === 'MONEY_GOLD'" prop="goldQuantity" :label="$t('pages.teamBill.label.gold')">
<el-input v-model="form.goldQuantity" v-number placeholder="请输入金币数量,系统不会自动发送" /> <el-input v-model="form.goldQuantity" v-number :placeholder="$t('pages.teamBill.placeholder.goldQuantity')" />
</el-form-item> </el-form-item>
<el-form-item v-if="form.settleType === 'MONEY_GOLD'" prop="salaryQuantity" label="工资$"> <el-form-item v-if="form.settleType === 'MONEY_GOLD'" prop="salaryQuantity" :label="$t('pages.teamBill.label.salaryUsd')">
<el-input v-model="form.salaryQuantity" v-double placeholder="请输入工资$" /> <el-input v-model="form.salaryQuantity" v-double :placeholder="$t('pages.teamBill.placeholder.salaryQuantity')" />
</el-form-item> </el-form-item>
<el-form-item prop="tmpExistsCertificate" label="凭证上传"> <el-form-item prop="tmpExistsCertificate" :label="$t('pages.teamBill.label.voucherUpload')">
<el-row> <el-row>
<el-col :span="8"> <el-col :span="8">
<upload-image <upload-image
@ -152,11 +148,11 @@
</el-row> </el-row>
</el-form-item> </el-form-item>
<el-form-item label="备注"> <el-form-item :label="$t('pages.teamBill.label.remarks')">
<el-input <el-input
v-model="form.remarks" v-model="form.remarks"
type="textarea" type="textarea"
placeholder="请输入备注" :placeholder="$t('pages.teamBill.placeholder.remarks')"
maxlength="100" maxlength="100"
show-word-limit show-word-limit
resize="none" resize="none"
@ -167,8 +163,8 @@
</div> </div>
<div v-if="!calculatorLoading" class="drawer-footer"> <div v-if="!calculatorLoading" class="drawer-footer">
<el-button :disabled="submitLoading" @click="handleClose()">关闭</el-button> <el-button :disabled="submitLoading" @click="handleClose()">{{ $t('pages.teamBill.action.close') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">保存</el-button> <el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">{{ $t('pages.teamBill.action.save') }}</el-button>
</div> </div>
</div> </div>
</el-drawer> </el-drawer>
@ -194,7 +190,7 @@ export default {
}, },
data() { data() {
const commonRules = [ const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' } { required: true, message: this.$t('pages.teamBill.validation.requiredField'), trigger: 'blur' }
] ]
return { return {
calculatorLoading: false, calculatorLoading: false,
@ -238,7 +234,7 @@ export default {
goldQuantity: commonRules, goldQuantity: commonRules,
salaryQuantity: commonRules, salaryQuantity: commonRules,
tmpExistsCertificate: [ tmpExistsCertificate: [
{ required: true, message: '最少上传1张凭证', trigger: 'blur' } { required: true, message: this.$t('pages.teamBill.validation.uploadVoucherFirst'), trigger: 'blur' }
] ]
}, },
nativeRow: {} nativeRow: {}
@ -268,6 +264,9 @@ export default {
} }
}, },
methods: { methods: {
teamBillSettleTypeName(type) {
return this.$t(`pages.teamBill.settleType.${type}`)
},
changeRegion(id, val) { changeRegion(id, val) {
this.region = id this.region = id
this.$refs.PolicySelectedSysRegion.clearValue() this.$refs.PolicySelectedSysRegion.clearValue()
@ -276,7 +275,7 @@ export default {
}, },
handleClose() { handleClose() {
if (this.submitLoading) { if (this.submitLoading) {
this.$opsMessage.warn('正在提交!') this.$opsMessage.warn(this.$t('pages.teamBill.message.submitting'))
return return
} }
this.$emit('close') this.$emit('close')
@ -291,7 +290,7 @@ export default {
submit() { submit() {
const that = this const that = this
if (that.calculatorLoading) { if (that.calculatorLoading) {
this.$opsMessage.warn('正在计算政策工资, 请稍等!') this.$opsMessage.warn(this.$t('pages.teamBill.message.calculatingSalary'))
return return
} }

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="team-status-drawer"> <div class="team-status-drawer">
<el-drawer <el-drawer
title="状态变更" :title="$t('pages.teamBill.statusDrawer.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -13,11 +13,11 @@
<div class="team-status"> <div class="team-status">
<div class="drawer-form"> <div class="drawer-form">
<el-form ref="form" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;"> <el-form ref="form" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;">
<el-form-item prop="remarks" label="备注"> <el-form-item prop="remarks" :label="$t('pages.teamBill.label.remarks')">
<el-input <el-input
v-model="form.remarks" v-model="form.remarks"
type="textarea" type="textarea"
placeholder="请输入备注" :placeholder="$t('pages.teamBill.placeholder.remarks')"
maxlength="100" maxlength="100"
show-word-limit show-word-limit
resize="none" resize="none"
@ -27,8 +27,8 @@
</el-form> </el-form>
</div> </div>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button :disabled="submitLoading" @click="handleClose()">关闭</el-button> <el-button :disabled="submitLoading" @click="handleClose()">{{ $t('pages.teamBill.action.close') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">保存</el-button> <el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">{{ $t('pages.teamBill.action.save') }}</el-button>
</div> </div>
</div> </div>
</el-drawer> </el-drawer>
@ -82,7 +82,7 @@ export default {
methods: { methods: {
handleClose() { handleClose() {
if (this.submitLoading) { if (this.submitLoading) {
this.$opsMessage.warn('正在提交!') this.$opsMessage.warn(this.$t('pages.teamBill.message.submitting'))
return return
} }
this.$emit('close') this.$emit('close')

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="bind-team-drawer"> <div class="bind-team-drawer">
<el-drawer <el-drawer
title="绑定BD" :title="$t('pages.teamList.bindBd.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -15,13 +15,13 @@
<div class="drawer-form"> <div class="drawer-form">
<el-form ref="form" :model="form" :rules="formRules" label-width="80px"> <el-form ref="form" :model="form" :rules="formRules" label-width="80px">
<el-form-item prop="bdUserId" label="BD"> <el-form-item prop="bdUserId" label="BD">
<account-input v-model="form.bdUserId" :sys-origin="sysOrigin" placeholder="请输入BD账号" /> <account-input v-model="form.bdUserId" :sys-origin="sysOrigin" :placeholder="$t('pages.teamList.bindBd.bdAccount')" />
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button @click="handleClose()">关闭</el-button> <el-button @click="handleClose()">{{ $t('pages.teamList.action.close') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submitForm">保存</el-button> <el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submitForm">{{ $t('pages.teamList.action.save') }}</el-button>
</div> </div>
</div> </div>
</el-drawer> </el-drawer>
@ -44,7 +44,7 @@ export default {
}, },
data() { data() {
const commonRules = [ const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' } { required: true, message: this.$t('pages.teamList.validation.requiredField'), trigger: 'blur' }
] ]
return { return {
billCyclePolicyTypes, billCyclePolicyTypes,
@ -61,7 +61,7 @@ export default {
}, },
computed: { computed: {
textOptTitle() { textOptTitle() {
return '绑定BD' return this.$t('pages.teamList.bindBd.title')
} }
}, },
watch: { watch: {
@ -77,7 +77,7 @@ export default {
methods: { methods: {
handleClose() { handleClose() {
if (this.submitLoading) { if (this.submitLoading) {
this.$opsMessage.warn('正在提交!') this.$opsMessage.warn(this.$t('pages.teamList.message.submitting'))
return return
} }
this.$emit('close') this.$emit('close')

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<div v-if="isQueryPermissions"> <div v-if="isQueryPermissions">
<!-- 搜索栏 --> <!-- Filters -->
<div class="filter-container"> <div class="filter-container">
<div class="filter-item" style="width: 120px;"> <div class="filter-item" style="width: 120px;">
<sys-origin-permission-select <sys-origin-permission-select
@ -17,7 +17,7 @@
v-model="listQuery.region" v-model="listQuery.region"
:sys-origin="listQuery.sysOrigin" :sys-origin="listQuery.sysOrigin"
clearable clearable
placeholder="区域" :placeholder="$t('pages.teamList.filter.region')"
@change="changeRegionSelectPolicy" @change="changeRegionSelectPolicy"
/> />
</div> </div>
@ -25,14 +25,14 @@
<div class="filter-item" style="width: 120px;"> <div class="filter-item" style="width: 120px;">
<el-select <el-select
v-model="listQuery.status" v-model="listQuery.status"
placeholder="状态" :placeholder="$t('pages.teamList.filter.status')"
clearable clearable
@change="handleSearch" @change="handleSearch"
> >
<el-option <el-option
v-for="(item, index) in teamStatus" v-for="(item, index) in teamStatus"
:key="index" :key="index"
:label="item.name" :label="getTeamStatusName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
@ -42,14 +42,14 @@
<account-input <account-input
v-model="listQuery.ownUserId" v-model="listQuery.ownUserId"
:sys-origin="listQuery.sysOrigin" :sys-origin="listQuery.sysOrigin"
placeholder="代理ID" :placeholder="$t('pages.teamList.filter.agentId')"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
<el-input <el-input
v-model="listQuery.memberQuantityRange" v-model="listQuery.memberQuantityRange"
placeholder="开始~结束成员数量" :placeholder="$t('pages.teamList.filter.memberQuantityRange')"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
@ -59,16 +59,16 @@
value-format="timestamp" value-format="timestamp"
type="datetimerange" type="datetimerange"
:picker-options="pickerOptions" :picker-options="pickerOptions"
range-separator="" :range-separator="$t('pages.teamList.filter.dateRangeSeparator')"
start-placeholder="开始日期开始" :start-placeholder="$t('pages.teamList.filter.startDate')"
end-placeholder="结束日期结束" :end-placeholder="$t('pages.teamList.filter.endDate')"
/> />
</div> </div>
<el-select <el-select
v-if="backUserConditionVisible" v-if="backUserConditionVisible"
v-model="listQuery.createUser" v-model="listQuery.createUser"
v-loading="listMemberLoading" v-loading="listMemberLoading"
placeholder="后台成员" :placeholder="$t('pages.teamList.filter.backendMember')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
clearable clearable
@ -88,7 +88,7 @@
icon="el-icon-search" icon="el-icon-search"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t("pages.teamList.action.search") }}
</el-button> </el-button>
<el-button <el-button
v-if="buttonPermissions.includes('team:list:add')" v-if="buttonPermissions.includes('team:list:add')"
@ -97,7 +97,7 @@
icon="el-icon-edit" icon="el-icon-edit"
@click="teamCreateVisible = true" @click="teamCreateVisible = true"
> >
新增 {{ $t("pages.teamList.action.add") }}
</el-button> </el-button>
<el-button <el-button
v-if=" v-if="
@ -111,11 +111,11 @@
:disabled="statusChangeLoading" :disabled="statusChangeLoading"
@click="clickCloseTeamBatch" @click="clickCloseTeamBatch"
> >
删除 {{ $t("pages.teamList.action.delete") }}
</el-button> </el-button>
</div> </div>
<!-- 表单 --> <!-- Table -->
<el-table <el-table
ref="teamTable" ref="teamTable"
v-loading="listLoading" v-loading="listLoading"
@ -128,7 +128,7 @@
<el-table-column type="index" width="50" label="No" /> <el-table-column type="index" width="50" label="No" />
<el-table-column type="selection" width="50" show-overflow-tooltip /> <el-table-column type="selection" width="50" show-overflow-tooltip />
<el-table-column <el-table-column
label="代理" :label="$t('pages.teamList.table.agent')"
align="left" align="left"
min-width="220" min-width="220"
show-overflow-tooltip show-overflow-tooltip
@ -150,31 +150,31 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="信息" :label="$t('pages.teamList.table.info')"
align="left" align="left"
show-overflow-tooltip show-overflow-tooltip
min-width="150" min-width="150"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
成员: {{ $t("pages.teamList.table.member") }}:
{{ (scope.row.teamProfile.counter || {}).memberQuantity }}/{{ {{ (scope.row.teamProfile.counter || {}).memberQuantity }}/{{
(scope.row.teamProfile.setting || {}).maxMember (scope.row.teamProfile.setting || {}).maxMember
}} }}
</div> </div>
<div> <div>
状态: {{ $t("pages.teamList.table.status") }}:
<el-tag <el-tag
v-if="scope.row.teamProfile.status === 'AVAILABLE'" v-if="scope.row.teamProfile.status === 'AVAILABLE'"
size="mini" size="mini"
type="success" type="success"
>正常</el-tag >{{ getTeamStatusName("AVAILABLE") }}</el-tag
> >
<el-tag <el-tag
v-if="scope.row.teamProfile.status === 'CLOSE'" v-if="scope.row.teamProfile.status === 'CLOSE'"
size="mini" size="mini"
type="danger" type="danger"
>关闭</el-tag >{{ getTeamStatusName("CLOSE") }}</el-tag
> >
</div> </div>
</template> </template>
@ -185,14 +185,14 @@
show-overflow-tooltip show-overflow-tooltip
min-width="100" min-width="100"
prop="regionName" prop="regionName"
label="区域" :label="$t('pages.teamList.table.region')"
/> />
<el-table-column <el-table-column
align="left" align="left"
show-overflow-tooltip show-overflow-tooltip
min-width="80" min-width="80"
label="备注" :label="$t('pages.teamList.table.remark')"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
@ -204,7 +204,7 @@
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="创建人" :label="$t('pages.teamList.table.createdBy')"
align="left" align="left"
show-overflow-tooltip show-overflow-tooltip
min-width="220" min-width="220"
@ -226,7 +226,7 @@
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="修改人" :label="$t('pages.teamList.table.updatedBy')"
align="left" align="left"
show-overflow-tooltip show-overflow-tooltip
min-width="220" min-width="220"
@ -248,19 +248,19 @@
</el-table-column> </el-table-column>
<el-table-column <el-table-column
label="时间" :label="$t('pages.teamList.table.time')"
align="center" align="center"
show-overflow-tooltip show-overflow-tooltip
min-width="220" min-width="220"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<div>创建: {{ scope.row.teamProfile.createTime | dateFormat }}</div> <div>{{ $t("pages.teamList.table.createdAt") }}: {{ scope.row.teamProfile.createTime | dateFormat }}</div>
<div>修改: {{ scope.row.teamProfile.updateTime | dateFormat }}</div> <div>{{ $t("pages.teamList.table.updatedAt") }}: {{ scope.row.teamProfile.updateTime | dateFormat }}</div>
</template> </template>
</el-table-column> </el-table-column>
<!-- 操作 --> <!-- Actions -->
<el-table-column fixed="right" label="操作" align="center" width="100"> <el-table-column fixed="right" :label="$t('pages.teamList.table.actions')" align="center" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<el-dropdown> <el-dropdown>
<span class="el-dropdown-link"> <span class="el-dropdown-link">
@ -269,64 +269,64 @@
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item <el-dropdown-item
@click.native="clickQueryTeamDetails(scope.row)" @click.native="clickQueryTeamDetails(scope.row)"
>资料详情</el-dropdown-item >{{ $t("pages.teamList.action.details") }}</el-dropdown-item
> >
<el-dropdown-item <el-dropdown-item
v-if="buttonPermissions.includes('team:list:edit')" v-if="buttonPermissions.includes('team:list:edit')"
@click.native="editTeamProfile(scope.row)" @click.native="editTeamProfile(scope.row)"
>修改资料</el-dropdown-item >{{ $t("pages.teamList.action.editProfile") }}</el-dropdown-item
> >
<el-dropdown-item <el-dropdown-item
v-if="buttonPermissions.includes('team:list:bind:bd')" v-if="buttonPermissions.includes('team:list:bind:bd')"
@click.native="clickBindBd(scope.row)" @click.native="clickBindBd(scope.row)"
>绑定BD</el-dropdown-item >{{ $t("pages.teamList.action.bindBd") }}</el-dropdown-item
> >
<el-dropdown-item <el-dropdown-item
v-if="buttonPermissions.includes('team:list:edit')" v-if="buttonPermissions.includes('team:list:edit')"
@click.native="editTeamRemark(scope.row)" @click.native="editTeamRemark(scope.row)"
>备注信息</el-dropdown-item >{{ $t("pages.teamList.action.remarks") }}</el-dropdown-item
> >
<el-dropdown-item <el-dropdown-item
v-if="buttonPermissions.includes('team:list:edit')" v-if="buttonPermissions.includes('team:list:edit')"
@click.native="editTeamContact(scope.row)" @click.native="editTeamContact(scope.row)"
>联系方式</el-dropdown-item >{{ $t("pages.teamList.action.contact") }}</el-dropdown-item
> >
<!-- <el-dropdown-item :disabled="statusChangeLoading" @click.native="clickChangeTeamStatus(scope.row)">状态变更</el-dropdown-item> --> <!-- <el-dropdown-item :disabled="statusChangeLoading" @click.native="clickChangeTeamStatus(scope.row)">Status Change</el-dropdown-item> -->
<el-dropdown-item <el-dropdown-item
v-if="buttonPermissions.includes('team:list:send:notice')" v-if="buttonPermissions.includes('team:list:send:notice')"
@click.native="handleNoticeSend(scope.row)" @click.native="handleNoticeSend(scope.row)"
>发送通知</el-dropdown-item >{{ $t("pages.teamList.action.sendNotice") }}</el-dropdown-item
> >
<el-dropdown-item <el-dropdown-item
v-if=" v-if="
buttonPermissions.includes('team:list:query:send:notice') buttonPermissions.includes('team:list:query:send:notice')
" "
@click.native="handleNoticeList(scope.row)" @click.native="handleNoticeList(scope.row)"
>通知记录</el-dropdown-item >{{ $t("pages.teamList.action.noticeRecords") }}</el-dropdown-item
> >
<!-- <el-dropdown-item>账单信息-未实现</el-dropdown-item> --> <!-- <el-dropdown-item>Bill Info - not implemented</el-dropdown-item> -->
<el-dropdown-item <el-dropdown-item
v-if="buttonPermissions.includes('team:list:query:apply')" v-if="buttonPermissions.includes('team:list:query:apply')"
@click.native="handleApplicationProcess(scope.row)" @click.native="handleApplicationProcess(scope.row)"
>团队申请</el-dropdown-item >{{ $t("pages.teamList.action.teamApplications") }}</el-dropdown-item
> >
<!-- <el-dropdown-item v-if="buttonPermissions.includes('team:list:query:approval')" @click.native="handleApplicationProcessApprova(scope.row)">审核日志</el-dropdown-item> --> <!-- <el-dropdown-item v-if="buttonPermissions.includes('team:list:query:approval')" @click.native="handleApplicationProcessApprova(scope.row)">Approval Logs</el-dropdown-item> -->
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 加载更多 --> <!-- Load more -->
<div v-if="listQuery.lastId" class="load-more"> <div v-if="listQuery.lastId" class="load-more">
<span v-if="notData">已加载全部</span> <span v-if="notData">{{ $t("pages.teamList.action.allLoaded") }}</span>
<el-button <el-button
v-else v-else
size="mini" size="mini"
:disabled="loadMoreLoading" :disabled="loadMoreLoading"
:loading="loadMoreLoading" :loading="loadMoreLoading"
@click="clickLoadMore" @click="clickLoadMore"
>加载更多</el-button >{{ $t("pages.teamList.action.loadMore") }}</el-button
> >
</div> </div>
@ -337,7 +337,7 @@
@close="teamCreateVisible = false" @close="teamCreateVisible = false"
/> />
<!-- 修改资料组件 --> <!-- Edit profile drawer -->
<team-edit <team-edit
v-if="teamEditVisible" v-if="teamEditVisible"
:profile="thatRow.teamProfile" :profile="thatRow.teamProfile"
@ -417,11 +417,11 @@
v-else v-else
v-loading.lock="listLoading" v-loading.lock="listLoading"
element-loading-background="#FFFFFF" element-loading-background="#FFFFFF"
element-loading-text="权限验证中..." :element-loading-text="$t('pages.teamList.permission.validating')"
style="text-align: center;" style="text-align: center;"
> >
抱歉您无权查看请联系管理员开通查看权限 {{ $t("pages.teamList.permission.deniedPrefix") }}
主播中心/代理列表:(team:list:query:all/team:list:query:self) {{ $t("pages.teamList.permission.deniedCode") }}
</div> </div>
</div> </div>
</template> </template>
@ -602,7 +602,7 @@ export default {
clickCloseTeamBatch() { clickCloseTeamBatch() {
const that = this; const that = this;
if (this.statusChangeLoading) { if (this.statusChangeLoading) {
this.$opsMessage.warn("正在提交中!"); this.$opsMessage.warn(this.$t("pages.teamList.message.submitting"));
return; return;
} }
that.changeTeamIds = that.selectTableRow.map(item => item.teamProfile.id); that.changeTeamIds = that.selectTableRow.map(item => item.teamProfile.id);
@ -610,11 +610,11 @@ export default {
// that.teamStatusVisible = true // that.teamStatusVisible = true
that that
.$confirm( .$confirm(
"系统将移除团队所有数据, 操作不可逆!!!! (主播工作/账单/团队信息/团队成员/BD关系等所有)", this.$t("pages.teamList.confirm.deleteMessage"),
"提示", this.$t("pages.teamList.confirm.deleteTitle"),
{ {
confirmButtonText: "确定", confirmButtonText: this.$t("pages.teamList.action.confirm"),
cancelButtonText: "取消", cancelButtonText: this.$t("pages.teamList.action.cancel"),
type: "warning" type: "warning"
} }
) )
@ -649,7 +649,7 @@ export default {
this.teamDetailsDrawerVisible = true; this.teamDetailsDrawerVisible = true;
}, },
// // Edit profile
editTeamProfile(row) { editTeamProfile(row) {
this.thatRow = row; this.thatRow = row;
this.teamEditVisible = true; this.teamEditVisible = true;
@ -715,7 +715,7 @@ export default {
}, },
clickChangeTeamStatus(row) { clickChangeTeamStatus(row) {
if (this.statusChangeLoading) { if (this.statusChangeLoading) {
this.$opsMessage.warn("正在提交中!"); this.$opsMessage.warn(this.$t("pages.teamList.message.submitting"));
return; return;
} }
this.thatRow = row; this.thatRow = row;
@ -750,6 +750,9 @@ export default {
.catch(er => { .catch(er => {
that.listMemberLoading = false; that.listMemberLoading = false;
}); });
},
getTeamStatusName(status) {
return this.$t(`pages.teamList.statusMap.${status}`);
} }
} }
}; };

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="team-application-process-list"> <div class="team-application-process-list">
<el-drawer <el-drawer
title="申请团队成员列表" :title="$t('pages.teamList.applicationProcess.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -13,7 +13,7 @@
<div class="filter-container" style="margin: 10px;"> <div class="filter-container" style="margin: 10px;">
<el-select <el-select
v-model="listQuery.status" v-model="listQuery.status"
placeholder="审核状态" :placeholder="$t('pages.teamList.applicationProcess.status')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -21,13 +21,13 @@
<el-option <el-option
v-for="(item, index) in teamApplicationProcessStatusList" v-for="(item, index) in teamApplicationProcessStatusList"
:key="index" :key="index"
:label="item.name" :label="getProcessStatusName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
<el-select <el-select
v-model="listQuery.reason" v-model="listQuery.reason"
placeholder="原因" :placeholder="$t('pages.teamList.applicationProcess.reason')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -35,7 +35,7 @@
<el-option <el-option
v-for="(item, index) in teamReasons" v-for="(item, index) in teamReasons"
:key="index" :key="index"
:label="item.name" :label="getReasonName(item.value)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
@ -44,33 +44,33 @@
type="primary" type="primary"
@click="handleSearch" @click="handleSearch"
> >
查询 {{ $t('pages.teamList.action.query') }}
</el-button> </el-button>
</div> </div>
<div v-loading="listLoading"> <div v-loading="listLoading">
<el-row v-for="(item, index) in list" :key="index"> <el-row v-for="(item, index) in list" :key="index">
<el-card style="margin: 10px;"> <el-card style="margin: 10px;">
<div> <div>
<el-tag>申请类型: {{ item.reason == 'JOIN' ? '加入' : '退出' }}</el-tag> <el-tag>{{ $t('pages.teamList.applicationProcess.applicationType') }}: {{ getReasonName(item.reason) }}</el-tag>
<el-tag v-if="item.status === 'WAIT'" type="warning">审核状态: 待审核</el-tag> <el-tag v-if="item.status === 'WAIT'" type="warning">{{ $t('pages.teamList.applicationProcess.reviewStatus') }}: {{ getProcessStatusName(item.status) }}</el-tag>
<el-tag v-if="item.status === 'AGREE'" type="success">审核状态: 同意</el-tag> <el-tag v-if="item.status === 'AGREE'" type="success">{{ $t('pages.teamList.applicationProcess.reviewStatus') }}: {{ getProcessStatusName(item.status) }}</el-tag>
<el-tag v-if="item.status === 'REJECT'" type="danger">审核状态: 驳回</el-tag> <el-tag v-if="item.status === 'REJECT'" type="danger">{{ $t('pages.teamList.applicationProcess.reviewStatus') }}: {{ getProcessStatusName(item.status) }}</el-tag>
</div> </div>
<div class="bottom clearfix"> <div class="bottom clearfix">
<el-tag v-if="item.createUserOrigin == 1 && item.createSysUser != null" type="info">创建人: <span style="color: black;">{{ item.createSysUser.nickname }}</span> {{ item.createTime }}</el-tag> <el-tag v-if="item.createUserOrigin == 1 && item.createSysUser != null" type="info">{{ $t('pages.teamList.applicationProcess.createdBy') }}: <span style="color: black;">{{ item.createSysUser.nickname }}</span> {{ item.createTime }}</el-tag>
<el-tag v-if="item.createUserOrigin == 0 && item.createUserProfile != null" type="info" @click.native="queryUserDetails(item.createUserProfile.id)">创建人: <span style="color: black;">{{ item.createUserProfile.userNickname }}</span> {{ item.createTime }}</el-tag> <el-tag v-if="item.createUserOrigin == 0 && item.createUserProfile != null" type="info" @click.native="queryUserDetails(item.createUserProfile.id)">{{ $t('pages.teamList.applicationProcess.createdBy') }}: <span style="color: black;">{{ item.createUserProfile.userNickname }}</span> {{ item.createTime }}</el-tag>
<el-tag v-if="item.updateUserOrigin == 1 && item.updateSysUser != null" type="info">修改人: <span style="color: black;">{{ item.updateSysUser.nickname }}</span> {{ item.updateTime }}</el-tag> <el-tag v-if="item.updateUserOrigin == 1 && item.updateSysUser != null" type="info">{{ $t('pages.teamList.applicationProcess.updatedBy') }}: <span style="color: black;">{{ item.updateSysUser.nickname }}</span> {{ item.updateTime }}</el-tag>
<el-tag v-if="item.updateUserOrigin == 0 && item.updateUserProfile != null" type="info" @click.native="queryUserDetails(item.updateUserProfile.id)">修改人: <span style="color: black;">{{ item.updateUserProfile.userNickname }}</span> {{ item.updateTime }}</el-tag> <el-tag v-if="item.updateUserOrigin == 0 && item.updateUserProfile != null" type="info" @click.native="queryUserDetails(item.updateUserProfile.id)">{{ $t('pages.teamList.applicationProcess.updatedBy') }}: <span style="color: black;">{{ item.updateUserProfile.userNickname }}</span> {{ item.updateTime }}</el-tag>
</div> </div>
<!-- <div v-if="item.status === 'WAIT'" class="clearfix"> <!-- <div v-if="item.status === 'WAIT'" class="clearfix">
<el-button type="text" @click.native="handleStatus(item.id, 'AGREE')">同意</el-button> <el-button type="text" @click.native="handleStatus(item.id, 'AGREE')">Agree</el-button>
<el-button type="text" @click.native="handleStatus(item.id, 'REJECT')">拒绝</el-button> <el-button type="text" @click.native="handleStatus(item.id, 'REJECT')">Reject</el-button>
</div> --> </div> -->
</el-card> </el-card>
</el-row> </el-row>
<div v-if="list && list.length > 0" style="text-align: center; margin-top:20px;"> <div v-if="list && list.length > 0" style="text-align: center; margin-top:20px;">
<el-button v-if="!notMore " size="mini" :disabled="listLoading" @click="clickLoadMore">加载更多</el-button> <el-button v-if="!notMore " size="mini" :disabled="listLoading" @click="clickLoadMore">{{ $t('pages.teamList.action.loadMore') }}</el-button>
<span v-else>已加载全部</span> <span v-else>{{ $t('pages.teamList.action.allLoaded') }}</span>
</div> </div>
</div> </div>
@ -162,6 +162,12 @@ export default {
}, },
clickLoadMore() { clickLoadMore() {
this.renderData() this.renderData()
},
getProcessStatusName(status) {
return this.$t(`pages.teamList.processStatusMap.${status}`)
},
getReasonName(reason) {
return this.$t(`pages.teamList.reasonMap.${reason}`)
} }
} }
} }

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="team-contact-drawer"> <div class="team-contact-drawer">
<el-drawer <el-drawer
title="联系方式" :title="$t('pages.teamList.contact.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -12,7 +12,7 @@
> >
<div class="team-contact"> <div class="team-contact">
<div class="drawer-form"> <div class="drawer-form">
<p v-if="!contacts || contacts.length === 0">点击下方按钮添加 联系方式</p> <p v-if="!contacts || contacts.length === 0">{{ $t('pages.teamList.contact.emptyTip') }}</p>
<el-timeline v-else :reverse="true"> <el-timeline v-else :reverse="true">
<el-timeline-item <el-timeline-item
v-for="(item, index) in contacts" v-for="(item, index) in contacts"
@ -23,23 +23,23 @@
<div class="contact"> <div class="contact">
<p> {{ item.createBackUserName }} <i class="el-icon-delete font-danger cursor-pointer" @click="clickDelContact(item, index)" /></p> <p> {{ item.createBackUserName }} <i class="el-icon-delete font-danger cursor-pointer" @click="clickDelContact(item, index)" /></p>
<div> <div>
<p>类型: {{ contactTypeMap[item.type].name }}</p> <p>{{ $t('pages.teamList.contact.type') }}: {{ contactTypeMap[item.type].name }}</p>
<p>联系: {{ item.contact }}</p> <p>{{ $t('pages.teamList.contact.contact') }}: {{ item.contact }}</p>
<p v-if="item.remarks">备注: {{ item.remarks }}</p> <p v-if="item.remarks">{{ $t('pages.teamList.contact.remark') }}: {{ item.remarks }}</p>
</div> </div>
</div> </div>
</el-timeline-item> </el-timeline-item>
</el-timeline> </el-timeline>
</div> </div>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button @click="handleClose()">关闭</el-button> <el-button @click="handleClose()">{{ $t('pages.teamList.action.close') }}</el-button>
<el-button type="primary" @click="(contactVisible=true)">新增</el-button> <el-button type="primary" @click="(contactVisible=true)">{{ $t('pages.teamList.action.add') }}</el-button>
</div> </div>
</div> </div>
</el-drawer> </el-drawer>
<el-dialog <el-dialog
title="备注" :title="$t('pages.teamList.contact.dialogTitle')"
:visible.sync="contactVisible" :visible.sync="contactVisible"
:modal-append-to-body="true" :modal-append-to-body="true"
:append-to-body="true" :append-to-body="true"
@ -47,19 +47,19 @@
:before-close="handleCloseContactFrom" :before-close="handleCloseContactFrom"
> >
<el-form ref="formContact" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;"> <el-form ref="formContact" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;">
<el-form-item prop="type" label="类型"> <el-form-item prop="type" :label="$t('pages.teamList.contact.type')">
<el-select v-model="form.type" placeholder="选择类型" style="width: 100%;"> <el-select v-model="form.type" :placeholder="$t('pages.teamList.contact.selectType')" style="width: 100%;">
<el-option v-for="(item, index) in contactTypes" :key="index" :label="item.name" :value="item.value" /> <el-option v-for="(item, index) in contactTypes" :key="index" :label="item.name" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="contact" label="联系"> <el-form-item prop="contact" :label="$t('pages.teamList.contact.contact')">
<el-input v-model="form.contact" placeholder="请输入联系方式" maxlength="100" show-word-limit /> <el-input v-model="form.contact" :placeholder="$t('pages.teamList.contact.contactPlaceholder')" maxlength="100" show-word-limit />
</el-form-item> </el-form-item>
<el-form-item prop="remarks" label="备注"> <el-form-item prop="remarks" :label="$t('pages.teamList.contact.remark')">
<el-input <el-input
v-model="form.remarks" v-model="form.remarks"
type="textarea" type="textarea"
placeholder="请输入备注" :placeholder="$t('pages.teamList.contact.remarkPlaceholder')"
maxlength="100" maxlength="100"
show-word-limit show-word-limit
resize="none" resize="none"
@ -68,8 +68,8 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button :disabled="submitLoading" @click="contactVisible = false"> </el-button> <el-button :disabled="submitLoading" @click="contactVisible = false">{{ $t('pages.teamList.action.cancel') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submitAddContact"> </el-button> <el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submitAddContact">{{ $t('pages.teamList.action.confirm') }}</el-button>
</span> </span>
</el-dialog> </el-dialog>
</div> </div>
@ -103,10 +103,10 @@ export default {
}, },
formRules: { formRules: {
type: [ type: [
{ required: true, message: '必填字段不可为空', trigger: 'blur' } { required: true, message: this.$t('pages.teamList.validation.requiredField'), trigger: 'blur' }
], ],
contact: [ contact: [
{ required: true, message: '必填字段不可为空', trigger: 'blur' } { required: true, message: this.$t('pages.teamList.validation.requiredField'), trigger: 'blur' }
] ]
}, },
delForm: { delForm: {
@ -132,7 +132,7 @@ export default {
methods: { methods: {
handleClose() { handleClose() {
if (this.submitLoading) { if (this.submitLoading) {
this.$opsMessage.warn('正在提交!') this.$opsMessage.warn(this.$t('pages.teamList.message.submitting'))
return return
} }
this.$emit('close') this.$emit('close')

View File

@ -9,15 +9,15 @@
:append-to-body="true" :append-to-body="true"
custom-class="drawer-auto-layout" custom-class="drawer-auto-layout"
> >
<!-- 标题 --> <!-- Title -->
<div slot="title" class="flex-l"> <div slot="title" class="flex-l">
<sys-origin-icon :icon="profile.sysOrigin" size="18px" />&nbsp;团队资料 <sys-origin-icon :icon="profile.sysOrigin" size="18px" />&nbsp;{{ $t('pages.teamList.edit.title') }}
</div> </div>
<div class="edit-team"> <div class="edit-team">
<div class="drawer-form"> <div class="drawer-form">
<el-alert <el-alert
v-if="tmpRegion !== form.region && form.id !== ''" v-if="tmpRegion !== form.region && form.id !== ''"
title="!!注意: 【变更代理团队区域】将清空该代理名下所有主播目标,请谨慎操作" :title="$t('pages.teamList.edit.regionChangeWarning')"
type="warning" type="warning"
effect="dark" effect="dark"
:closable="false" :closable="false"
@ -29,25 +29,25 @@
:rules="formRules" :rules="formRules"
label-width="80px" label-width="80px"
> >
<!-- 区域 --> <!-- Region -->
<el-form-item prop="region" label="区域"> <el-form-item prop="region" :label="$t('pages.teamList.edit.region')">
<select-system-region <select-system-region
ref="regionSelectPolicy" ref="regionSelectPolicy"
v-model="form.region" v-model="form.region"
:sys-origin="profile.sysOrigin" :sys-origin="profile.sysOrigin"
clearable clearable
placeholder="区域" :placeholder="$t('pages.teamList.edit.region')"
@change="changeRegionSelectPolicy" @change="changeRegionSelectPolicy"
/> />
</el-form-item> </el-form-item>
<!-- 昵称 --> <!-- Nickname -->
<!-- <el-form-item prop="nickname" label="昵称"> <!-- <el-form-item prop="nickname" label="Nickname">
<el-input v-model="form.nickname" placeholder="请输入团队昵称" maxlength="24" show-word-limit /> <el-input v-model="form.nickname" placeholder="Enter team nickname" maxlength="24" show-word-limit />
</el-form-item> --> </el-form-item> -->
<!-- 封面 --> <!-- Cover -->
<!-- <el-form-item label="封面"> <!-- <el-form-item label="Cover">
<el-form-item prop="cover"> <el-form-item prop="cover">
<upload-image <upload-image
v-model="form.avatar" v-model="form.avatar"
@ -56,8 +56,8 @@
</el-form-item> </el-form-item>
</el-form-item> --> </el-form-item> -->
<!-- 国家 --> <!-- Country -->
<el-form-item label="国家" prop="country.countryId"> <el-form-item :label="$t('pages.teamList.edit.country')" prop="country.countryId">
<contry-select <contry-select
v-model="form.country.countryId" v-model="form.country.countryId"
@change="contrySelectChange" @change="contrySelectChange"
@ -65,23 +65,23 @@
</el-form-item> </el-form-item>
<div style="padding: 10px 0px;"> <div style="padding: 10px 0px;">
<!-- 小标题 --> <!-- Section title -->
<el-divider content-position="left">设置信息</el-divider> <el-divider content-position="left">{{ $t('pages.teamList.edit.settingInfo') }}</el-divider>
<!-- 成员数量 --> <!-- Member quantity -->
<el-form-item prop="setting.maxMember" label="成员数量"> <el-form-item prop="setting.maxMember" :label="$t('pages.teamList.edit.memberQuantity')">
<el-input <el-input
v-model="form.setting.maxMember" v-model="form.setting.maxMember"
placeholder="最大成员数量" :placeholder="$t('pages.teamList.edit.maxMember')"
maxlength="100" maxlength="100"
show-word-limit show-word-limit
/> />
</el-form-item> </el-form-item>
<!-- 开关代理接收主播工资 --> <!-- Switch: agent receives host salary -->
<el-form-item <el-form-item
prop="setting.hostSalaryToAgent" prop="setting.hostSalaryToAgent"
label="代理接收主播工资" :label="$t('pages.teamList.edit.hostSalaryToAgent')"
> >
<el-switch <el-switch
v-model="form.setting.hostSalaryToAgent" v-model="form.setting.hostSalaryToAgent"
@ -90,8 +90,8 @@
/> />
</el-form-item> </el-form-item>
<!-- 开关允许提现 --> <!-- Switch: withdrawal enabled -->
<el-form-item prop="withdrawalEnabled" label="允许提现"> <el-form-item prop="withdrawalEnabled" :label="$t('pages.teamList.edit.withdrawalEnabled')">
<el-switch <el-switch
v-model="form.withdrawalEnabled" v-model="form.withdrawalEnabled"
:active-value="true" :active-value="true"
@ -103,14 +103,14 @@
</div> </div>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button :disabled="submitLoading" @click="handleClose()" <el-button :disabled="submitLoading" @click="handleClose()"
>取消</el-button >{{ $t('pages.teamList.action.cancel') }}</el-button
> >
<el-button <el-button
type="primary" type="primary"
:disabled="submitLoading" :disabled="submitLoading"
:loading="submitLoading" :loading="submitLoading"
@click="submitForm()" @click="submitForm()"
>保存</el-button >{{ $t('pages.teamList.action.save') }}</el-button
> >
</div> </div>
</div> </div>
@ -135,7 +135,7 @@ export default {
}, },
data() { data() {
const commonRules = [ const commonRules = [
{ required: true, message: "必填字段不可为空", trigger: "blur" } { required: true, message: this.$t("pages.teamList.validation.requiredField"), trigger: "blur" }
]; ];
return { return {
billCyclePolicyTypes, billCyclePolicyTypes,
@ -189,7 +189,7 @@ export default {
methods: { methods: {
handleClose() { handleClose() {
if (this.submitLoading) { if (this.submitLoading) {
this.$opsMessage.warn("正在提交!"); this.$opsMessage.warn(this.$t("pages.teamList.message.submitting"));
return; return;
} }
this.$emit("close"); this.$emit("close");
@ -231,11 +231,11 @@ export default {
that that
.$confirm( .$confirm(
"变更代理团队区域将清空该代理名下所有主播目标,你确定继续吗?", this.$t("pages.teamList.confirm.changeRegionMessage"),
"提示", this.$t("pages.teamList.confirm.deleteTitle"),
{ {
confirmButtonText: "确定", confirmButtonText: this.$t("pages.teamList.action.confirm"),
cancelButtonText: "取消", cancelButtonText: this.$t("pages.teamList.action.cancel"),
type: "warning" type: "warning"
} }
) )
@ -259,7 +259,7 @@ export default {
.catch(() => {}); .catch(() => {});
// <el-alert // <el-alert
// :v-if="tmpRegion !== form.region" // :v-if="tmpRegion !== form.region"
// title=",?" // title="Changing the agent region will clear all host targets. Continue?"
// type="warning" // type="warning"
// effect="dark" // effect="dark"
// :closable="false" // :closable="false"

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="team-notice-list"> <div class="team-notice-list">
<el-drawer <el-drawer
title="团队通知记录" :title="$t('pages.teamList.noticeList.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -14,8 +14,8 @@
<el-row v-for="(item, index) in list" :key="index"> <el-row v-for="(item, index) in list" :key="index">
<el-card style="margin: 20px;"> <el-card style="margin: 20px;">
<div style="padding: 0px; word-wrap: break-word;"> <div style="padding: 0px; word-wrap: break-word;">
<div><span style="font-weight: 600;color:#FF9326">标题: </span>{{ item.title }}</div> <div><span style="font-weight: 600;color:#FF9326">{{ $t('pages.teamList.noticeList.titleLabel') }}: </span>{{ item.title }}</div>
<div style="margin-top: 10px;"><span style="font-weight: 600;color:#FF9326">内容: </span>{{ item.content }} <div style="margin-top: 10px;"><span style="font-weight: 600;color:#FF9326">{{ $t('pages.teamList.noticeList.contentLabel') }}: </span>{{ item.content }}
<el-image <el-image
v-if="item.cover" v-if="item.cover"
class="image" class="image"
@ -24,8 +24,8 @@
/> />
</div> </div>
<div class="bottom clearfix"> <div class="bottom clearfix">
<time class="time">发送人: {{ item.createUser.nickname }} / {{ item.createTime }}</time> <time class="time">{{ $t('pages.teamList.noticeList.sender') }}: {{ item.createUser.nickname }} / {{ item.createTime }}</time>
<el-button type="text" class="button" @click.native="handleDelete(item)">删除</el-button> <el-button type="text" class="button" @click.native="handleDelete(item)">{{ $t('pages.teamList.action.delete') }}</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>
@ -67,12 +67,12 @@ export default {
}, },
handleDelete(row) { handleDelete(row) {
const that = this const that = this
that.$confirm('确认删除吗?', '提示', { that.$confirm(this.$t('pages.teamList.confirm.confirmDeleteNotice'), this.$t('pages.teamList.confirm.deleteTitle'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
that.listLoading = true that.listLoading = true
deleteTeamNoticeById(row.id).then((res) => { deleteTeamNoticeById(row.id).then((res) => {
// // Filter out the deleted notice locally.
that.list = that.list.filter(function(obj) { that.list = that.list.filter(function(obj) {
return obj.id !== row.id return obj.id !== row.id
}) })

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="team-notice-send"> <div class="team-notice-send">
<el-drawer <el-drawer
title="发送团队通知" :title="$t('pages.teamList.noticeSend.title')"
:visible="true" :visible="true"
:modal-append-to-body="true" :modal-append-to-body="true"
:append-to-body="true" :append-to-body="true"
@ -18,31 +18,31 @@
label-width="70px" label-width="70px"
style="width: 450px; margin-left:50px;" style="width: 450px; margin-left:50px;"
> >
<el-form-item label="标题" prop="title"> <el-form-item :label="$t('pages.teamList.noticeSend.titleLabel')" prop="title">
<el-input <el-input
v-model.trim="dataForm.title" v-model.trim="dataForm.title"
placeholder="标题" :placeholder="$t('pages.teamList.noticeSend.titleLabel')"
maxlength="60" maxlength="60"
show-word-limit show-word-limit
/> />
</el-form-item> </el-form-item>
<el-form-item label="内容" prop="content"> <el-form-item :label="$t('pages.teamList.noticeSend.content')" prop="content">
<el-input <el-input
v-model.trim="dataForm.content" v-model.trim="dataForm.content"
placeholder="内容" :placeholder="$t('pages.teamList.noticeSend.content')"
type="textarea" type="textarea"
:rows="5" :rows="5"
maxlength="200" maxlength="200"
show-word-limit show-word-limit
/> />
</el-form-item> </el-form-item>
<el-form-item label="链接"> <el-form-item :label="$t('pages.teamList.noticeSend.link')">
<el-input <el-input
v-model.trim="dataForm.link" v-model.trim="dataForm.link"
placeholder="链接" :placeholder="$t('pages.teamList.noticeSend.link')"
/> />
</el-form-item> </el-form-item>
<el-form-item label="封面"> <el-form-item :label="$t('pages.teamList.noticeSend.cover')">
<el-form-item> <el-form-item>
<upload-image <upload-image
v-model="dataForm.cover" v-model="dataForm.cover"
@ -53,14 +53,14 @@
</el-form> </el-form>
<div slot="footer" class="dialog-footer" style="text-align: center;"> <div slot="footer" class="dialog-footer" style="text-align: center;">
<el-button @click="handleClose"> <el-button @click="handleClose">
取消 {{ $t('pages.teamList.action.cancel') }}
</el-button> </el-button>
<el-button <el-button
v-loading="submitLoading" v-loading="submitLoading"
type="primary" type="primary"
@click="handleSubmit()" @click="handleSubmit()"
> >
提交 {{ $t('pages.teamList.action.submit') }}
</el-button> </el-button>
</div> </div>
</div> </div>
@ -92,10 +92,10 @@ export default {
submitLoading: false, submitLoading: false,
rules: { rules: {
title: [ title: [
{ required: true, message: '请输入标题', trigger: 'blur' } { required: true, message: this.$t('pages.teamList.validation.titleRequired'), trigger: 'blur' }
], ],
content: [ content: [
{ required: true, message: '请输入内容', trigger: 'blur' } { required: true, message: this.$t('pages.teamList.validation.contentRequired'), trigger: 'blur' }
] ]
}, },
dataForm: { dataForm: {
@ -113,7 +113,7 @@ export default {
that.$refs.dataForm.validate(valid => { that.$refs.dataForm.validate(valid => {
if (valid) { if (valid) {
that.dataForm.teamId = that.teamId that.dataForm.teamId = that.teamId
that.$confirm('确认发送通知吗?', '提示', { that.$confirm(this.$t('pages.teamList.confirm.sendNotice'), this.$t('pages.teamList.confirm.deleteTitle'), {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
that.submitLoading = true that.submitLoading = true

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="team-remark-drawer"> <div class="team-remark-drawer">
<el-drawer <el-drawer
title="备注" :title="$t('pages.teamList.remark.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -12,7 +12,7 @@
> >
<div class="team-remark"> <div class="team-remark">
<div class="drawer-form"> <div class="drawer-form">
<p v-if="!remarks || remarks.length === 0">点击下方按钮添加 备注</p> <p v-if="!remarks || remarks.length === 0">{{ $t('pages.teamList.remark.emptyTip') }}</p>
<el-timeline v-else :reverse="true"> <el-timeline v-else :reverse="true">
<el-timeline-item <el-timeline-item
v-for="(item, index) in remarks" v-for="(item, index) in remarks"
@ -29,14 +29,14 @@
</div> </div>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button @click="handleClose()">关闭</el-button> <el-button @click="handleClose()">{{ $t('pages.teamList.action.close') }}</el-button>
<el-button type="primary" @click="clickAddRemarks">新增</el-button> <el-button type="primary" @click="clickAddRemarks">{{ $t('pages.teamList.action.add') }}</el-button>
</div> </div>
</div> </div>
</el-drawer> </el-drawer>
<el-dialog <el-dialog
title="备注" :title="$t('pages.teamList.remark.title')"
:visible.sync="remarkVisible" :visible.sync="remarkVisible"
:modal-append-to-body="true" :modal-append-to-body="true"
:append-to-body="true" :append-to-body="true"
@ -48,7 +48,7 @@
<el-input <el-input
v-model="form.remarks" v-model="form.remarks"
type="textarea" type="textarea"
placeholder="请输入备注" :placeholder="$t('pages.teamList.remark.placeholder')"
maxlength="100" maxlength="100"
show-word-limit show-word-limit
resize="none" resize="none"
@ -57,8 +57,8 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<span slot="footer" class="dialog-footer"> <span slot="footer" class="dialog-footer">
<el-button :disabled="submitLoading" @click="remarkVisible = false"> </el-button> <el-button :disabled="submitLoading" @click="remarkVisible = false">{{ $t('pages.teamList.action.cancel') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submitAddRemarks"> </el-button> <el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submitAddRemarks">{{ $t('pages.teamList.action.confirm') }}</el-button>
</span> </span>
</el-dialog> </el-dialog>
</div> </div>
@ -86,7 +86,7 @@ export default {
}, },
formRules: { formRules: {
remarks: [ remarks: [
{ required: true, message: '必填字段不可为空', trigger: 'blur' } { required: true, message: this.$t('pages.teamList.validation.requiredField'), trigger: 'blur' }
] ]
}, },
delForm: { delForm: {
@ -112,7 +112,7 @@ export default {
methods: { methods: {
handleClose() { handleClose() {
if (this.submitLoading) { if (this.submitLoading) {
this.$opsMessage.warn('正在提交!') this.$opsMessage.warn(this.$t('pages.teamList.message.submitting'))
return return
} }
this.$emit('close') this.$emit('close')
@ -152,7 +152,7 @@ export default {
}, },
clickAddRemarks() { clickAddRemarks() {
if (this.remarks && this.remarks.length >= 20) { if (this.remarks && this.remarks.length >= 20) {
this.$opsMessage.warn('最多添加20条备注, 清删除不必要的备注后重新添加') this.$opsMessage.warn(this.$t('pages.teamList.message.maxRemarks'))
return return
} }
this.remarkVisible = true this.remarkVisible = true

View File

@ -1,8 +1,8 @@
<template> <template>
<!-- 状态变更废弃, 不保留数据; 将团队全部删除清理;--> <!-- Deprecated status change: closing clears all team data. -->
<div class="team-status-drawer"> <div class="team-status-drawer">
<el-drawer <el-drawer
title="状态变更" :title="$t('pages.teamList.teamStatus.title')"
:visible="true" :visible="true"
:before-close="handleClose" :before-close="handleClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -15,22 +15,22 @@
<div class="drawer-form"> <div class="drawer-form">
<el-alert <el-alert
v-if="form.status === 'CLOSE'" v-if="form.status === 'CLOSE'"
title="关闭系统将移除团队所有数据, 操作不可逆!!!! (主播工作/账单/团队信息/团队成员/BD关系等所有)" :title="$t('pages.teamList.teamStatus.warning')"
type="error" type="error"
:closable="false" :closable="false"
/> />
<el-form ref="form" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;"> <el-form ref="form" :model="form" :rules="formRules" label-width="80px" style="margin-right: 15px;">
<el-form-item prop="status" label="状态"> <el-form-item prop="status" :label="$t('pages.teamList.teamStatus.status')">
<el-radio-group v-model="form.status"> <el-radio-group v-model="form.status">
<el-radio label="CLOSE">关闭</el-radio> <el-radio label="CLOSE">{{ $t('pages.teamList.teamStatus.close') }}</el-radio>
<el-radio label="AVAILABLE">启动</el-radio> <el-radio label="AVAILABLE">{{ $t('pages.teamList.teamStatus.available') }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item prop="remarks" label="备注"> <el-form-item prop="remarks" :label="$t('pages.teamList.teamStatus.remarks')">
<el-input <el-input
v-model="form.remarks" v-model="form.remarks"
type="textarea" type="textarea"
placeholder="请输入备注" :placeholder="$t('pages.teamList.remark.placeholder')"
maxlength="100" maxlength="100"
show-word-limit show-word-limit
resize="none" resize="none"
@ -40,8 +40,8 @@
</el-form> </el-form>
</div> </div>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button :disabled="submitLoading" @click="handleClose()">关闭</el-button> <el-button :disabled="submitLoading" @click="handleClose()">{{ $t('pages.teamList.action.close') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">保存</el-button> <el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submit">{{ $t('pages.teamList.action.save') }}</el-button>
</div> </div>
</div> </div>
</el-drawer> </el-drawer>
@ -95,7 +95,7 @@ export default {
methods: { methods: {
handleClose() { handleClose() {
if (this.submitLoading) { if (this.submitLoading) {
this.$opsMessage.warn('正在提交!') this.$opsMessage.warn(this.$t('pages.teamList.message.submitting'))
return return
} }
this.$emit('close') this.$emit('close')

View File

@ -10,25 +10,25 @@
custom-class="drawer-auto-layout" custom-class="drawer-auto-layout"
> >
<div slot="title" class="flex-l"> <div slot="title" class="flex-l">
<sys-origin-icon :icon="profile.sysOrigin" size="18px" />&nbsp;更换团长 <sys-origin-icon :icon="profile.sysOrigin" size="18px" />&nbsp;{{ $t('pages.teamList.switchOwn.title') }}
</div> </div>
<div class="edit-team"> <div class="edit-team">
<el-alert <el-alert
title="历史团队如果存在工作数据将会被清理!!! 团队未解散BD关系将继续维持" :title="$t('pages.teamList.switchOwn.warning')"
type="info" type="info"
:closable="false" :closable="false"
style="margin-bottom: 10px;" style="margin-bottom: 10px;"
/> />
<div class="drawer-form"> <div class="drawer-form">
<el-form ref="form" :model="form" :rules="formRules" label-width="80px"> <el-form ref="form" :model="form" :rules="formRules" label-width="80px">
<el-form-item prop="ownUserId" label="代理"> <el-form-item prop="ownUserId" :label="$t('pages.teamList.switchOwn.agent')">
<account-input v-model="form.ownUserId" :sys-origin="profile.sysOrigin" placeholder="请输入代理ID" /> <account-input v-model="form.ownUserId" :sys-origin="profile.sysOrigin" :placeholder="$t('pages.teamList.switchOwn.agentPlaceholder')" />
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button :disabled="submitLoading" @click="handleClose()">取消</el-button> <el-button :disabled="submitLoading" @click="handleClose()">{{ $t('pages.teamList.action.cancel') }}</el-button>
<el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submitForm()">保存</el-button> <el-button type="primary" :disabled="submitLoading" :loading="submitLoading" @click="submitForm()">{{ $t('pages.teamList.action.save') }}</el-button>
</div> </div>
</div> </div>
</el-drawer> </el-drawer>
@ -49,7 +49,7 @@ export default {
}, },
data() { data() {
const commonRules = [ const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' } { required: true, message: this.$t('pages.teamList.validation.requiredField'), trigger: 'blur' }
] ]
return { return {
submitLoading: false, submitLoading: false,
@ -78,7 +78,7 @@ export default {
methods: { methods: {
handleClose() { handleClose() {
if (this.submitLoading) { if (this.submitLoading) {
this.$opsMessage.warn('正在提交!') this.$opsMessage.warn(this.$t('pages.teamList.message.submitting'))
return return
} }
this.$emit('close') this.$emit('close')

View File

@ -2,7 +2,7 @@
<div class="app-container"> <div class="app-container">
<div class="filter-container"> <div class="filter-container">
<div class="filter-item"> <div class="filter-item">
<div><account-input v-model="listQuery.userId" placeholder="用户id" type="USER" :sys-origin="listQuery.sysOrigin" /></div> <div><account-input v-model="listQuery.userId" :placeholder="$t('pages.userDiamondBalance.filter.userId')" type="USER" :sys-origin="listQuery.sysOrigin" /></div>
</div> </div>
<el-button <el-button
class="filter-item" class="filter-item"
@ -10,7 +10,7 @@
icon="el-icon-search" icon="el-icon-search"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.userDiamondBalance.action.search') }}
</el-button> </el-button>
</div> </div>
@ -21,15 +21,15 @@
fit fit
highlight-current-row highlight-current-row
> >
<el-table-column label="用户" align="center" min-width="100"> <el-table-column :label="$t('pages.userDiamondBalance.table.user')" align="center" min-width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.userProfile" :query-details="true" /> <user-table-exhibit :user-profile="scope.row.userProfile" :query-details="true" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="balance" label="余额" align="center" min-width="100" /> <el-table-column prop="balance" :label="$t('pages.userDiamondBalance.table.balance')" align="center" min-width="120" />
<el-table-column <el-table-column
prop="createTime" prop="createTime"
label="创建时间" :label="$t('pages.userDiamondBalance.table.createdAt')"
align="center" align="center"
width="200" width="200"
> >

View File

@ -3,7 +3,7 @@
<div class="filter-container"> <div class="filter-container">
<el-select <el-select
v-model="listQuery.sysOrigin" v-model="listQuery.sysOrigin"
placeholder="系统" :placeholder="$t('pages.userDiamondRunWater.filter.system')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="changeSysOrigin" @change="changeSysOrigin"
@ -19,25 +19,25 @@
</el-option> </el-option>
</el-select> </el-select>
<div class="filter-item"> <div class="filter-item">
<div><account-input v-model="listQuery.userId" placeholder="用户id" type="USER" :sys-origin="listQuery.sysOrigin" /></div> <div><account-input v-model="listQuery.userId" :placeholder="$t('pages.userDiamondRunWater.filter.userId')" type="USER" :sys-origin="listQuery.sysOrigin" /></div>
</div> </div>
<el-select <el-select
v-model="listQuery.type" v-model="listQuery.type"
placeholder="类型" :placeholder="$t('pages.userDiamondRunWater.filter.type')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
clearable clearable
@change="handleSearch" @change="handleSearch"
> >
<el-option label="收入" :value="false" /> <el-option :label="$t('pages.userDiamondRunWater.type.income')" :value="false" />
<el-option label="支出" :value="true" /> <el-option :label="$t('pages.userDiamondRunWater.type.expense')" :value="true" />
</el-select> </el-select>
<div class="filter-item"> <div class="filter-item">
<el-autocomplete <el-autocomplete
v-model="listQuery.origin" v-model="listQuery.origin"
popper-class="my-autocomplete" popper-class="my-autocomplete"
:fetch-suggestions="querySearch" :fetch-suggestions="querySearch"
placeholder="请输入或选择内容" :placeholder="$t('pages.userDiamondRunWater.filter.origin')"
clearable clearable
@select="handleSelect" @select="handleSelect"
@clear="handleSelect" @clear="handleSelect"
@ -47,7 +47,7 @@
class="el-icon-edit el-input__icon" class="el-icon-edit el-input__icon"
/> />
<template slot-scope="{ item }"> <template slot-scope="{ item }">
<span :label="item.name">{{ item.name }}</span> <span :label="getDiamondOriginName(item)">{{ getDiamondOriginName(item) }}</span>
<div :key="item.value" :value="item.value" style="font-size:12px; color:#d8d0d0">{{ item.value }}</div> <div :key="item.value" :value="item.value" style="font-size:12px; color:#d8d0d0">{{ item.value }}</div>
</template> </template>
</el-autocomplete> </el-autocomplete>
@ -58,7 +58,7 @@
icon="el-icon-search" icon="el-icon-search"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.userDiamondRunWater.action.search') }}
</el-button> </el-button>
</div> </div>
@ -69,20 +69,20 @@
fit fit
highlight-current-row highlight-current-row
> >
<el-table-column label="用户" align="center" min-width="100"> <el-table-column :label="$t('pages.userDiamondRunWater.table.user')" align="center" min-width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<user-table-exhibit :user-profile="scope.row.userProfile" :query-details="true" /> <user-table-exhibit :user-profile="scope.row.userProfile" :query-details="true" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="balance" label="钻石余额" align="center" min-width="100" /> <el-table-column prop="balance" :label="$t('pages.userDiamondRunWater.table.diamondBalance')" align="center" min-width="120" />
<el-table-column prop="quantity" label="钻石" align="center" min-width="100" /> <el-table-column prop="quantity" :label="$t('pages.userDiamondRunWater.table.diamond')" align="center" min-width="100" />
<el-table-column prop="origin" label="来源" align="center" min-width="100" /> <el-table-column prop="origin" :label="$t('pages.userDiamondRunWater.table.source')" align="center" min-width="120" />
<el-table-column prop="originDesc" label="来源描述" align="center" min-width="100" /> <el-table-column prop="originDesc" :label="$t('pages.userDiamondRunWater.table.sourceDescription')" align="center" min-width="150" />
<el-table-column prop="typeDesc" label="类型" align="center" min-width="100" /> <el-table-column prop="typeDesc" :label="$t('pages.userDiamondRunWater.table.type')" align="center" min-width="100" />
<el-table-column prop="remarks" label="备注" align="center" min-width="100" /> <el-table-column prop="remarks" :label="$t('pages.userDiamondRunWater.table.remarks')" align="center" min-width="120" />
<el-table-column <el-table-column
prop="createTime" prop="createTime"
label="创建时间" :label="$t('pages.userDiamondRunWater.table.createdAt')"
align="center" align="center"
width="200" width="200"
> >
@ -187,6 +187,13 @@ export default {
var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants
cb(results) cb(results)
}, },
getDiamondOriginName(origin) {
const value = origin && origin.value ? origin.value : origin
const fallback = origin && origin.name ? origin.name : value
const key = `pages.userDiamondRunWater.origin.${value}`
const label = this.$t(key)
return label === key ? fallback : label
},
createFilter(queryString) { createFilter(queryString) {
return (restaurant) => { return (restaurant) => {
return (restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) >= 0) || (restaurant.name.toLowerCase().indexOf(queryString.toLowerCase()) >= 0) return (restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) >= 0) || (restaurant.name.toLowerCase().indexOf(queryString.toLowerCase()) >= 0)

View File

@ -3,7 +3,7 @@
<div class="filter-container"> <div class="filter-container">
<el-select <el-select
v-model="listQuery.sysOrigin" v-model="listQuery.sysOrigin"
placeholder="系统" :placeholder="$t('pages.userFreightInfoList.filter.system')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -26,19 +26,19 @@
<account-input <account-input
v-model="listQuery.userId" v-model="listQuery.userId"
:sys-origin="listQuery.sysOrigin" :sys-origin="listQuery.sysOrigin"
placeholder="发送用户" :placeholder="$t('pages.userFreightInfoList.filter.sender')"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
<account-input <account-input
v-model="listQuery.acceptUserId" v-model="listQuery.acceptUserId"
:sys-origin="listQuery.sysOrigin" :sys-origin="listQuery.sysOrigin"
placeholder="接收用户" :placeholder="$t('pages.userFreightInfoList.filter.receiver')"
/> />
</div> </div>
<el-select <el-select
v-model="listQuery.origin" v-model="listQuery.origin"
placeholder="来源" :placeholder="$t('pages.userFreightInfoList.filter.origin')"
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@change="handleSearch" @change="handleSearch"
@ -46,7 +46,7 @@
<el-option <el-option
v-for="item in freightBalanceOrigin" v-for="item in freightBalanceOrigin"
:key="item.value" :key="item.value"
:label="item.name" :label="getFreightBalanceOriginName(item)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
@ -57,9 +57,9 @@
value-format="timestamp" value-format="timestamp"
type="datetimerange" type="datetimerange"
:picker-options="pickerOptions" :picker-options="pickerOptions"
range-separator="" :range-separator="$t('pages.userFreightInfoList.date.rangeSeparator')"
start-placeholder="日期开始" :start-placeholder="$t('pages.userFreightInfoList.date.start')"
end-placeholder="日期结束" :end-placeholder="$t('pages.userFreightInfoList.date.end')"
/> />
</div> </div>
<el-button <el-button
@ -69,7 +69,7 @@
:disabled="searchDisabled" :disabled="searchDisabled"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.userFreightInfoList.action.search') }}
</el-button> </el-button>
<el-button <el-button
v-if="buttonPermissions.includes('user:table:freightwarter:export')" v-if="buttonPermissions.includes('user:table:freightwarter:export')"
@ -78,7 +78,7 @@
icon="el-icon-download" icon="el-icon-download"
@click="exprotOrder" @click="exprotOrder"
> >
导出 {{ $t('pages.userFreightInfoList.action.export') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table
@ -88,7 +88,7 @@
fit fit
highlight-current-row highlight-current-row
> >
<el-table-column prop="sysOrigin" label="系统" align="center" width="80"> <el-table-column prop="sysOrigin" :label="$t('pages.userFreightInfoList.table.system')" align="center" width="80">
<template slot-scope="scope"> <template slot-scope="scope">
<sys-origin-icon <sys-origin-icon
:icon="scope.row.sysOrigin" :icon="scope.row.sysOrigin"
@ -96,7 +96,7 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="用户" align="center" min-width="240"> <el-table-column :label="$t('pages.userFreightInfoList.table.user')" align="center" min-width="240">
<template slot-scope="scope"> <template slot-scope="scope">
<user-table-exhibit <user-table-exhibit
:user-profile="scope.row.userBaseInfo" :user-profile="scope.row.userBaseInfo"
@ -105,7 +105,7 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="接收人" align="center" min-width="240"> <el-table-column :label="$t('pages.userFreightInfoList.table.receiver')" align="center" min-width="240">
<template slot-scope="scope"> <template slot-scope="scope">
<user-table-exhibit <user-table-exhibit
:user-profile="scope.row.acceptUser" :user-profile="scope.row.acceptUser"
@ -113,15 +113,15 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="类型" align="center" width="60"> <el-table-column :label="$t('pages.userFreightInfoList.table.type')" align="center" min-width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
<span v-if="scope.row.type === 0">收入</span> <span v-if="scope.row.type === 0">{{ $t('pages.userFreightInfoList.type.income') }}</span>
<span v-if="scope.row.type === 1">支出</span> <span v-if="scope.row.type === 1">{{ $t('pages.userFreightInfoList.type.expense') }}</span>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="数量" align="center" min-width="100"> <el-table-column :label="$t('pages.userFreightInfoList.table.quantity')" align="center" min-width="100">
<template slot-scope="scope"> <template slot-scope="scope">
<div> <div>
<span <span
@ -134,25 +134,25 @@
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="balance" prop="balance"
label="余额" :label="$t('pages.userFreightInfoList.table.balance')"
align="center" align="center"
min-width="100" min-width="100"
/> />
<el-table-column <el-table-column
prop="originName" prop="originName"
label="来源" :label="$t('pages.userFreightInfoList.table.origin')"
align="center" align="center"
min-width="100" min-width="100"
/> />
<el-table-column <el-table-column
prop="remark" prop="remark"
label="备注" :label="$t('pages.userFreightInfoList.table.remark')"
align="center" align="center"
min-width="200" min-width="200"
/> />
<el-table-column <el-table-column
prop="createTime" prop="createTime"
label="创建时间" :label="$t('pages.userFreightInfoList.table.createdAt')"
align="center" align="center"
width="200" width="200"
> >
@ -170,7 +170,7 @@
/> />
<el-drawer <el-drawer
title="导出条件" :title="$t('pages.userFreightInfoList.exportDialog.title')"
:visible="exportConditionVisible" :visible="exportConditionVisible"
:before-close="exportConditionClose" :before-close="exportConditionClose"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -188,10 +188,10 @@
label-position="left" label-position="left"
label-width="70px" label-width="70px"
> >
<el-form-item label="系统" prop="sysOrigin"> <el-form-item :label="$t('pages.userFreightInfoList.exportDialog.system')" prop="sysOrigin">
<el-select <el-select
v-model="exportQuery.sysOrigin" v-model="exportQuery.sysOrigin"
placeholder="系统" :placeholder="$t('pages.userFreightInfoList.exportDialog.system')"
style="width: 100%;" style="width: 100%;"
class="filter-item" class="filter-item"
> >
@ -213,25 +213,25 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="月份" prop="monthDate"> <el-form-item :label="$t('pages.userFreightInfoList.exportDialog.month')" prop="monthDate">
<el-date-picker <el-date-picker
v-model="exportQuery.monthDate" v-model="exportQuery.monthDate"
type="month" type="month"
value-format="yyyyMM" value-format="yyyyMM"
placeholder="选择月" :placeholder="$t('pages.userFreightInfoList.exportDialog.selectMonth')"
style="width: 100%;" style="width: 100%;"
/> />
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<div class="drawer-footer"> <div class="drawer-footer">
<el-button @click="exportConditionClose()">关闭</el-button> <el-button @click="exportConditionClose()">{{ $t('pages.userFreightInfoList.action.close') }}</el-button>
<el-button <el-button
type="primary" type="primary"
:disabled="exportLoading" :disabled="exportLoading"
:loading="exportLoading" :loading="exportLoading"
@click="exportConditionSubmit()" @click="exportConditionSubmit()"
>导出</el-button> >{{ $t('pages.userFreightInfoList.action.export') }}</el-button>
</div> </div>
</div> </div>
</el-drawer> </el-drawer>
@ -255,7 +255,7 @@ export default {
}, },
data() { data() {
const commonRules = [ const commonRules = [
{ required: true, message: '必填字段不可为空', trigger: 'blur' } { required: true, message: this.$t('pages.userFreightInfoList.validation.requiredField'), trigger: 'blur' }
] ]
return { return {
list: [], list: [],
@ -341,9 +341,16 @@ export default {
handleSearch() { handleSearch() {
this.renderData(true) this.renderData(true)
}, },
getFreightBalanceOriginName(origin) {
const value = origin && origin.value ? origin.value : origin
const fallback = origin && origin.name ? origin.name : value
const key = `pages.userFreightInfoList.origin.${value}`
const label = this.$t(key)
return label === key ? fallback : label
},
exportConditionClose() { exportConditionClose() {
if (this.exportLoading) { if (this.exportLoading) {
this.$opsMessage.warn('正在执行导出, 请稍等~') this.$opsMessage.warn(this.$t('pages.userFreightInfoList.message.exporting'))
return return
} }
this.exportConditionVisible = false this.exportConditionVisible = false
@ -369,7 +376,7 @@ export default {
}) })
.catch(er => { .catch(er => {
that.exportLoading = false that.exportLoading = false
this.$opsMessage.fail('下载失败!') this.$opsMessage.fail(this.$t('pages.userFreightInfoList.message.downloadFailed'))
}) })
}) })
} }

View File

@ -7,7 +7,7 @@
v-model="listQuery.userId" v-model="listQuery.userId"
:sys-origin="listQuery.sysOrigin" :sys-origin="listQuery.sysOrigin"
class="filter-item" class="filter-item"
placeholder="用户ID" :placeholder="$t('pages.integralStream.filter.userId')"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
@ -16,14 +16,14 @@
value-format="timestamp" value-format="timestamp"
:picker-options="pickerOptions" :picker-options="pickerOptions"
type="datetimerange" type="datetimerange"
range-separator="" :range-separator="$t('pages.integralStream.date.rangeSeparator')"
start-placeholder="开始日期" :start-placeholder="$t('pages.integralStream.date.start')"
end-placeholder="结束日期" :end-placeholder="$t('pages.integralStream.date.end')"
/> />
</div> </div>
<el-select <el-select
v-model="listQuery.origin" v-model="listQuery.origin"
placeholder="积分来源" :placeholder="$t('pages.integralStream.filter.origin')"
clearable clearable
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@ -31,7 +31,7 @@
<el-option <el-option
v-for="item in videoOrigin" v-for="item in videoOrigin"
:key="item.value" :key="item.value"
:label="item.name" :label="getVideoOriginName(item)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
@ -43,7 +43,7 @@
:disabled="searchDisabled" :disabled="searchDisabled"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.integralStream.action.search') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table
@ -53,7 +53,7 @@
fit fit
highlight-current-row highlight-current-row
> >
<el-table-column label="昵称" align="center"> <el-table-column :label="$t('pages.integralStream.table.nickname')" align="center" min-width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<el-link <el-link
v-if="scope.row.userBaseInfo && scope.row.userBaseInfo.userNickname" v-if="scope.row.userBaseInfo && scope.row.userBaseInfo.userNickname"
@ -63,16 +63,16 @@
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="title" label="来源对象" align="center" /> <el-table-column prop="title" :label="$t('pages.integralStream.table.sourceObject')" align="center" min-width="140" />
<el-table-column prop="originName" label="积分来源" align="center" /> <el-table-column prop="originName" :label="$t('pages.integralStream.table.pointsOrigin')" align="center" min-width="140" />
<el-table-column prop="quantity" label="获得积分" align="center"> <el-table-column prop="quantity" :label="$t('pages.integralStream.table.points')" align="center" min-width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<div :class="{ 'font-danger': scope.row.type === 0 }"> <div :class="{ 'font-danger': scope.row.type === 0 }">
{{ scope.row.type === 0 ? "+" : "-" }}{{ scope.row.quantity || 0 }} {{ scope.row.type === 0 ? "+" : "-" }}{{ scope.row.quantity || 0 }}
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createTime" label="创建时间" align="center"> <el-table-column prop="createTime" :label="$t('pages.integralStream.table.createdAt')" align="center" min-width="160">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.createTime | dateFormat }} {{ scope.row.createTime | dateFormat }}
</template> </template>
@ -164,6 +164,13 @@ export default {
this.searchLoading = true; this.searchLoading = true;
this.renderData(); this.renderData();
}, },
getVideoOriginName(origin) {
const value = origin && origin.value ? origin.value : origin;
const fallback = origin && origin.name ? origin.name : value;
const key = `pages.integralStream.origin.${value}`;
const label = this.$t(key);
return label === key ? fallback : label;
},
queryUserDetails(id) { queryUserDetails(id) {
this.userDeatilsDrawerVisible = true; this.userDeatilsDrawerVisible = true;
this.thatSelectedUserId = id; this.thatSelectedUserId = id;

View File

@ -4,7 +4,7 @@
<el-tab-pane <el-tab-pane
v-for="item in tables" v-for="item in tables"
:key="item.name" :key="item.name"
:label="item.title" :label="$t(item.titleKey)"
:name="item.component" :name="item.component"
/> />
<component :is="activeName" /> <component :is="activeName" />
@ -25,11 +25,11 @@ export default {
activeName: "IntegralStreamTimelyPreview", activeName: "IntegralStreamTimelyPreview",
tables: [ tables: [
{ {
title: "积分流水", titleKey: "pages.integralStream.tab.current",
component: "IntegralStreamTimelyPreview" component: "IntegralStreamTimelyPreview"
} /* , } /* ,
{ {
title: '历史积分流水', titleKey: 'pages.integralStream.tab.history',
component: 'IntegralStreamHistoryTimelyPreview' component: 'IntegralStreamHistoryTimelyPreview'
} */ } */
] ]

View File

@ -6,7 +6,7 @@
<account-input <account-input
v-model="listQuery.userId" v-model="listQuery.userId"
:sys-origin="listQuery.sysOrigin" :sys-origin="listQuery.sysOrigin"
placeholder="用户ID" :placeholder="$t('pages.integralStream.filter.userId')"
/> />
</div> </div>
<div class="filter-item"> <div class="filter-item">
@ -15,14 +15,14 @@
value-format="timestamp" value-format="timestamp"
:picker-options="pickerOptions" :picker-options="pickerOptions"
type="datetimerange" type="datetimerange"
range-separator="" :range-separator="$t('pages.integralStream.date.rangeSeparator')"
start-placeholder="开始日期" :start-placeholder="$t('pages.integralStream.date.start')"
end-placeholder="结束日期" :end-placeholder="$t('pages.integralStream.date.end')"
/> />
</div> </div>
<el-select <el-select
v-model="listQuery.origin" v-model="listQuery.origin"
placeholder="积分来源" :placeholder="$t('pages.integralStream.filter.origin')"
clearable clearable
style="width: 120px" style="width: 120px"
class="filter-item" class="filter-item"
@ -30,7 +30,7 @@
<el-option <el-option
v-for="item in videoOrigin" v-for="item in videoOrigin"
:key="item.value" :key="item.value"
:label="item.name" :label="getVideoOriginName(item)"
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
@ -42,11 +42,11 @@
:disabled="searchDisabled" :disabled="searchDisabled"
@click="handleSearch" @click="handleSearch"
> >
搜索 {{ $t('pages.integralStream.action.search') }}
</el-button> </el-button>
</div> </div>
<el-alert title="注意" type="warning" :closable="false"> <el-alert :title="$t('pages.integralStream.alert.title')" type="warning" :closable="false">
数据只会保留30天 {{ $t('pages.integralStream.alert.retention') }}
</el-alert> </el-alert>
<el-table <el-table
v-loading="listLoading" v-loading="listLoading"
@ -55,7 +55,7 @@
fit fit
highlight-current-row highlight-current-row
> >
<el-table-column label="昵称" align="center"> <el-table-column :label="$t('pages.integralStream.table.nickname')" align="center" min-width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<el-link <el-link
v-if="scope.row.userBaseInfo && scope.row.userBaseInfo.userNickname" v-if="scope.row.userBaseInfo && scope.row.userBaseInfo.userNickname"
@ -65,16 +65,16 @@
</el-link> </el-link>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="title" label="来源对象" align="center" /> <el-table-column prop="title" :label="$t('pages.integralStream.table.sourceObject')" align="center" min-width="140" />
<el-table-column prop="originName" label="积分来源" align="center" /> <el-table-column prop="originName" :label="$t('pages.integralStream.table.pointsOrigin')" align="center" min-width="140" />
<el-table-column prop="quantity" label="获得积分" align="center"> <el-table-column prop="quantity" :label="$t('pages.integralStream.table.points')" align="center" min-width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<div :class="{ 'font-danger': scope.row.type === 0 }"> <div :class="{ 'font-danger': scope.row.type === 0 }">
{{ scope.row.type === 0 ? "+" : "-" }}{{ scope.row.quantity || 0 }} {{ scope.row.type === 0 ? "+" : "-" }}{{ scope.row.quantity || 0 }}
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createTime" label="创建时间" align="center"> <el-table-column prop="createTime" :label="$t('pages.integralStream.table.createdAt')" align="center" min-width="160">
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.createTime | dateFormat }} {{ scope.row.createTime | dateFormat }}
</template> </template>
@ -166,6 +166,13 @@ export default {
this.searchLoading = true this.searchLoading = true
this.renderData() this.renderData()
}, },
getVideoOriginName(origin) {
const value = origin && origin.value ? origin.value : origin
const fallback = origin && origin.name ? origin.name : value
const key = `pages.integralStream.origin.${value}`
const label = this.$t(key)
return label === key ? fallback : label
},
queryUserDetails(id) { queryUserDetails(id) {
this.userDeatilsDrawerVisible = true this.userDeatilsDrawerVisible = true
this.thatSelectedUserId = id this.thatSelectedUserId = id