From a04b27b0c3498497ba8fb82e7ba69b6588973a17 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Thu, 14 Aug 2025 23:35:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/teamBill.js | 322 +++++++++++ src/api/wallet.js | 25 +- src/components/team/TeamBillMore.vue | 532 ++++++++++++++++++ src/router/index.js | 6 +- src/utils/http.js | 3 +- src/views/AgencyCenterView.vue | 39 +- src/views/ApplyView.vue | 788 +++++++++++++++++++++++++-- src/views/ExchangeGoldCoinsView.vue | 149 +++-- src/views/HostCenterView.vue | 35 +- src/views/PlatformPolicyView.vue | 298 ++++++++-- src/views/TeamBillView.vue | 654 ++++++++++------------ src/views/TeamMemberView.vue | 572 +++++++++---------- src/views/TransferView.vue | 53 +- 13 files changed, 2677 insertions(+), 799 deletions(-) create mode 100644 src/api/teamBill.js create mode 100644 src/components/team/TeamBillMore.vue diff --git a/src/api/teamBill.js b/src/api/teamBill.js new file mode 100644 index 0000000..3cd655a --- /dev/null +++ b/src/api/teamBill.js @@ -0,0 +1,322 @@ +import { get, post } from '../utils/http.js' + +/** + * 获取团队成员列表 + * @param {string} teamId - 团队ID + * @returns {Promise} + */ +export const getTeamMembers = async (teamId) => { + try { + const response = await get(`/team/members?id=${teamId}`) + return response + } catch (error) { + console.error('Failed to fetch team members:', error) + throw error + } +} + +/** + * 删除团队成员 + * @param {string} memberId - 成员ID + * @returns {Promise} + */ +export const deleteMember = async (memberId) => { + try { + const response = await post('/team/member/remove', { + memberId: memberId + }) + return response + } catch (error) { + console.error('Failed to delete member:', error) + throw error + } +} + +/** + * 获取团队发布的政策 + * @param {string} teamId - 团队ID + * @returns {Promise} + */ +export const getTeamReleasePolicy = async (teamId) => { + try { + const response = await get(`/team/release/policy?id=${teamId}`) + return response + } catch (error) { + console.error('Failed to fetch team release policy:', error) + throw error + } +} + +/** + * 获取用户等待申请的团队信息 + * @returns {Promise} + */ +export const getUserSendJoinWaitApplyTeamProfile = async () => { + try { + const response = await get('/team/wait-apply/profile') + return response + } catch (error) { + console.error('Failed to get user wait apply team profile:', error) + throw error + } +} + +/** + * 搜索团队信息 + * @param {string} account - 团队账户 + * @returns {Promise} + */ +export const searchTeamByAccount = async (account) => { + try { + const response = await get(`/team/search-account?account=${account}`) + return response + } catch (error) { + console.error('Failed to search team by account:', error) + throw error + } +} + +/** + * 提交团队申请 + * @param {string} teamId - 团队ID + * @returns {Promise} + */ +export const sendTeamApplyJoin = async (teamId) => { + try { + const response = await post('/team/user/apply', { + teamId, + reason: 'JOIN' + }) + return response + } catch (error) { + console.error('Failed to send team apply join:', error) + throw error + } +} + +/** + * 取消加入申请 + * @param {string} messageId - 申请消息ID + * @returns {Promise} + */ +export const cancelJoinApplyById = async (messageId) => { + try { + const response = await post('/team/user/join-apply-cancel', { + id: messageId + }) + return response + } catch (error) { + console.error('Failed to cancel join apply:', error) + throw error + } +} + +/** + * 获取邀请消息列表 + * @returns {Promise} + */ +export const getInviteMessageList = async () => { + try { + const response = await get('/anchor-agent/invite/message') + return response + } catch (error) { + console.error('Failed to get invite message list:', error) + throw error + } +} + +/** + * 处理邀请消息 + * @param {object} data - 处理数据 {id, status, contact} + * @returns {Promise} + */ +export const processInviteMessage = async (data) => { + try { + const response = await post('/anchor-agent/invite/process', data) + return response + } catch (error) { + console.error('Failed to process invite message:', error) + throw error + } +} + +/** + * 获取团队成员工作报告 + * @param {string} userId - 用户ID + * @returns {Promise} + */ +export const getTeamMemberWork = async (userId) => { + try { + const response = await get(`/team/member-work?userId=${userId}`) + return response + } catch (error) { + console.error('Failed to fetch team member work:', error) + throw error + } +} + +/** + * 格式化显示状态 + * @param {string} status - 状态值 + * @returns {object} 包含显示文本和样式类的对象 + */ +export const formatBillStatus = (status) => { + const statusMap = { + 'UNPAID': { + text: 'In Progress', + class: 'in-progress', + color: '#3B82F6' + }, + 'HANG_UP': { + text: 'Pending', + class: 'pending', + color: '#EF4444' + }, + 'PAID': { + text: 'Completed', + class: 'completed', + color: '#10B981' + }, + 'SETTLED': { + text: 'Settled', + class: 'settled', + color: '#059669' + } + } + + return statusMap[status] || { + text: status, + class: 'unknown', + color: '#666' + } +} + +/** + * 格式化时间显示 + * @param {number|string} minutes - 分钟数 + * @returns {string} 格式化的时间字符串 + */ +export const formatOnlineTime = (minutes) => { + if (!minutes || minutes === '0') return '0h' + const numMinutes = parseInt(minutes) + const hours = Math.floor(numMinutes / 60) + const mins = numMinutes % 60 + if (hours > 0) { + return mins > 0 ? `${hours}h ${mins}m` : `${hours}h` + } + return `${mins}m` +} + +/** + * 格式化礼物价值显示 + * @param {string|number} value - 礼物价值 + * @returns {string} 格式化的价值字符串 + */ +export const formatGiftValue = (value) => { + if (!value || value === '0') return '$0' + + // 如果已经是格式化的字符串,直接返回 + if (typeof value === 'string' && value.includes('K')) { + return `$${value}` + } + + const numValue = parseFloat(value) + if (isNaN(numValue)) return '$0' + + if (numValue >= 1000000) { + return `$${(numValue / 1000000).toFixed(1)}M` + } else if (numValue >= 1000) { + return `$${(numValue / 1000).toFixed(1)}K` + } + return `$${numValue.toFixed(0)}` +} + +/** + * 格式化钻石价值显示 + * @param {string|number} value - 钻石价值 + * @returns {string} 格式化的钻石价值字符串 + */ +export const formatDiamondValue = (value) => { + if (!value || value === '0') return '0' + const numValue = parseInt(value) + if (isNaN(numValue)) return '0' + + if (numValue >= 1000000) { + return `${(numValue / 1000000).toFixed(1)}M` + } else if (numValue >= 1000) { + return `${(numValue / 1000).toFixed(1)}K` + } + return numValue.toLocaleString() +} + +/** + * 格式化日期显示 + * @param {number} dateNumber - 日期数字格式 (如: 20250808) + * @returns {string} 格式化的日期字符串 + */ +export const formatDateDisplay = (dateNumber) => { + if (!dateNumber) return '' + const dateStr = dateNumber.toString() + if (dateStr.length !== 8) return dateStr + + const year = dateStr.substring(0, 4) + const month = dateStr.substring(4, 6) + const day = dateStr.substring(6, 8) + return `${month}/${day}/${year}` +} + +/** + * 格式化账户显示 + * @param {object} memberProfile - 成员资料对象 + * @returns {string} 格式化的账户字符串 + */ +export const formatAccount = (memberProfile) => { + if (!memberProfile) return '' + + // 如果有特殊ID,优先显示特殊ID + if (memberProfile.ownSpecialId && memberProfile.ownSpecialId.account) { + return memberProfile.ownSpecialId.account + } + + // 否则显示普通账户 + return memberProfile.account || '' +} + +/** + * 检查是否可以领取道具奖励 + * @param {object} item - 账单项目 + * @returns {boolean} 是否可以领取奖励 + */ +export const canReceivePropsReward = (item) => { + if (item.status !== 'SETTLED') { + return false + } + + if (!item.target || !item.target.settlementResult) { + return false + } + + const propsRewards = item.target.settlementResult.propsRewards + if (!propsRewards || propsRewards.length <= 0) { + return false + } + + return true +} + +/** + * 领取政策道具奖励 + * @param {string} targetId - 目标ID + * @returns {Promise} + */ +export const receivePolicyPropsReward = async (targetId) => { + try { + const response = await post('/team/policy-props-reward', { + id: targetId + }) + return response + } catch (error) { + console.error('Failed to receive policy props reward:', error) + throw error + } +} diff --git a/src/api/wallet.js b/src/api/wallet.js index 4885200..dc680de 100644 --- a/src/api/wallet.js +++ b/src/api/wallet.js @@ -1,11 +1,11 @@ -import { get } from '../utils/http.js' +import {get, post} from '../utils/http.js' /** * 获取钱包流水详情 * @returns {Promise} 返回流水详情数据 */ export function getWalletDetails() { - return get('/wallet/salary-diamond/balance/water/details') + return get('/wallet/bank/balance/water/details') } /** @@ -24,6 +24,25 @@ export function userBankCheckTransfer() { return get('/wallet/bank/check/transfer') } +/** + * 验证兑换金币限制 + * @returns {Promise} 返回用户角色和权限信息 + */ +export function userSalaryCheckExchange() { + return get('/wallet/salary-diamond/check/exchange-gold') +} + +// 获取用户银行卡余额-兑换金币 +export function userBankExchangeGold(data) { + return post('/wallet/bank/exchange/gold', data) +} + +// 用户银行卡余额-转账 +export function userBankTransfer(data) { + return post('/wallet/bank/transfer', data) +} + + /** * 搜索用户资料 * @param {string} type - 用户类型 (AGENT/BD/ANCHOR) @@ -46,7 +65,7 @@ export function formatDateTime(timestamp) { const day = String(date.getDate()).padStart(2, '0') const hours = String(date.getHours()).padStart(2, '0') const minutes = String(date.getMinutes()).padStart(2, '0') - + return `${day}/${month}/${year} ${hours}:${minutes}` } diff --git a/src/components/team/TeamBillMore.vue b/src/components/team/TeamBillMore.vue new file mode 100644 index 0000000..8d8623a --- /dev/null +++ b/src/components/team/TeamBillMore.vue @@ -0,0 +1,532 @@ + + + + + diff --git a/src/router/index.js b/src/router/index.js index ba2d127..2ddc611 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -29,11 +29,7 @@ const router = createRouter({ name: 'host-setting', component: () => import('../views/HostSettingView.vue'), }, - { - path: '/history-salary', - name: 'history-salary', - component: () => import('../views/HistorySalaryView.vue'), - }, + { path: '/transfer', name: 'transfer', diff --git a/src/utils/http.js b/src/utils/http.js index c9e08b4..2749b3f 100644 --- a/src/utils/http.js +++ b/src/utils/http.js @@ -3,7 +3,7 @@ const API_BASE_URL = 'https://api.likeichat.com' // 公共请求头配置 const COMMON_HEADERS = { - 'authorization': 'Bearer 1850459451220E4F1FABF65F36A43E76.djIlM0ExOTU0MDU5NzkzOTYzMzkzMDI1JTNBTElLRUklM0ExNzU3NjQ4ODMwMjM3JTNBMTc1NTA1NjgzMDIzNw==', + 'authorization': 'Bearer F77126B08E13987C3AD88B6015C5B777.djIlM0ExOTU0MDU5NzkzOTYzMzkzMDI1JTNBTElLRUklM0ExNzU3NzYzODU5NzE1JTNBMTc1NTE3MTg1OTcxNQ==', 'req-app-intel': 'version=1.0.0;build=1;model=SM-G9550;sysVersion=9;channel=Google', 'req-client': 'Android', 'req-imei': '8fa54d728ab449e04f9292329ed44bda', @@ -32,6 +32,7 @@ export async function request(url, options = {}) { const config = { method, headers: { + 'Content-Type': 'application/json', ...COMMON_HEADERS, ...headers }, diff --git a/src/views/AgencyCenterView.vue b/src/views/AgencyCenterView.vue index 5b958a7..8bf1333 100644 --- a/src/views/AgencyCenterView.vue +++ b/src/views/AgencyCenterView.vue @@ -139,7 +139,11 @@
- Team Member ({{ teamMemberCount }}) + + Team Member + (Loading...) + ({{ teamMemberCount }}) + >
@@ -159,9 +163,10 @@ diff --git a/src/views/ExchangeGoldCoinsView.vue b/src/views/ExchangeGoldCoinsView.vue index e3c006e..56c4302 100644 --- a/src/views/ExchangeGoldCoinsView.vue +++ b/src/views/ExchangeGoldCoinsView.vue @@ -20,11 +20,11 @@

Exchange Gold Coins

- +
-
- + +
+
+
+ Avatar + {{ memberProfile.countryCode }} +
+
+
{{ memberProfile.userNickname }}
+
ID: {{ memberProfile.account }}
+
{{ memberProfile.accountStatusName }}
+
-
${{ historyIncome }}
Work report: + +
+ + +
+
+

Loading...

-
+
- {{ bill.period }} - - {{ bill.statusText }} + {{ bill.billTitle }} + + {{ getStatusText(bill.status) }}
-
-
- Host Salary: - {{ bill.hostSalary }} -
-
- Agent Salary: - {{ bill.agentSalary }} -
+
+ Gift Value: + {{ formatGiftValue(bill.target?.acceptGiftValue) }}
-
- Total: - {{ bill.total }} +
+ Online Time: + {{ formatOnlineTime(bill.target?.onlineTime) }} +
+ +
+ Diamond: + {{ formatDiamondValue(bill.target?.acceptDiamondValue) }} +
+ +
+ Effective Days: + {{ bill.target?.effectiveDay || 0 }}
@@ -56,20 +73,26 @@
+ + +
+
📋
+

No data available

+
- -