feat(更新接口): bd和bdleader的操作金额页,针对兑换和转账功能,设置了pinia持久化身份,更新了接口。并给搜索页设置返回状态

This commit is contained in:
hzj 2025-11-18 19:47:24 +08:00
parent 3c48826050
commit 1474182404
10 changed files with 111 additions and 59 deletions

View File

@ -21,6 +21,7 @@
"@vueuse/core": "^13.9.0",
"airwallex-payment-elements": "^1.131.0",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.7.1",
"vant": "^4.9.21",
"vue": "^3.5.18",
"vue-i18n": "^11.1.12",

View File

@ -368,3 +368,25 @@ export const apiGetBankBalance = async (salaryType) => {
throw error
}
}
// 转账到金币
export const apiTransfer = async (data) => {
try {
const response = await post('/wallet/salary-account/transferGold', data)
return response
} catch (error) {
console.error('Failed to fetch transfer Gold:', error)
throw error
}
}
// 兑换金币
export const apiExchange = async (data) => {
try {
const response = await post('/wallet/salary-account/exchange/gold', data)
return response
} catch (error) {
console.error('Failed to fetch exchange Gold:', error)
throw error
}
}

View File

@ -153,7 +153,7 @@
"please_select_coin_amount": "Please select a coin amount first",
"insufficient_balance": "Insufficient balance. Your current balance is ${balance}, but you need $${price} to exchange.",
"confirm_exchange_coins": "Do you want to exchange coins for $${price}?",
"exchange_success": "Successfully exchanged coins for $${price}",
"exchange_success": "Successfully exchanged coins for ${price}",
"exchange_failed": "Exchange failed, please try again later.",
"exchange_error_occurred": "An error occurred during the exchange process. Please try again later.",
@ -161,8 +161,8 @@
"please_select_payee": "Please select a payee first",
"enter_payment_password": "Please enter your payment password:",
"payment_password_required": "Payment password is required",
"transfer_success": "Successfully transferred $${price} to ${name}",
"transfer_failed": "Failed to transfer $${price}",
"transfer_success": "Successfully transferred ${price} to {name}",
"transfer_failed": "Failed to transfer ${price}",
"payment_password_error": "Payment password error",
"transfer_error": "Transfer failed, please try again later",

View File

@ -161,7 +161,7 @@
"please_select_payee": "请选择收款人",
"enter_payment_password": "请输入支付密码:",
"payment_password_required": "需要支付密码",
"transfer_success": "成功转账${price}美元给${name}",
"transfer_success": "成功转账${price}美元给{name}",
"transfer_failed": "转账${price}美元失败",
"payment_password_error": "支付密码错误",
"transfer_error": "转账失败,请稍后重试",

View File

@ -3,6 +3,7 @@ import { logEnvInfo } from './utils/env.js'
import { versionChecker } from './utils/versionChecker.js'
import { smartImage } from './directives/smartImage.js'
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import { createApp } from 'vue'
import i18n, { initI18n } from './locales/i18n'
@ -19,6 +20,8 @@ versionChecker.checkVersion()
// 初始化权限系统
console.debug('🔐 Permission system initialized')
const pinia = createPinia()
pinia.use(piniaPluginPersistedstate) //将插件添加到 pinia 实例上
const app = createApp(App)
// 注册智能图片指令

15
src/stores/identity.js Normal file
View File

@ -0,0 +1,15 @@
import { defineStore } from 'pinia'
export const useIdentityStore = defineStore('identity', {
state: () => ({
identity: '',
}),
actions: {
setIdentity(identity) {
this.identity = identity
},
},
persist: true,
})

View File

@ -738,29 +738,33 @@
</template>
<script setup>
import { useI18n } from 'vue-i18n'
import { ref, reactive, onMounted, onUnmounted, computed } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import GeneralHeader from '@/components/GeneralHeader.vue'
import { getSelectedPayee, clearSelectedPayee } from '@/utils/payeeStore.js'
import { showError, showSuccess } from '@/utils/toast.js'
import { getUserId } from '@/utils/userStore.js'
import { useI18n } from 'vue-i18n'
import { setDocumentDirection } from '@/locales/i18n'
import { useIdentityStore } from '@/stores/identity.js'
import {
getBankBalance,
userBankTransfer,
userSalaryCheckExchange,
userBankExchangeGold,
apiExchange, //
apiTransfer, //
getBankCardList, //使
getWithdrawInfoList, //
withdrawApply, //
} from '@/api/wallet.js'
import { getSelectedPayee, clearSelectedPayee } from '@/utils/payeeStore.js'
import { showError, showSuccess } from '@/utils/toast.js'
import GeneralHeader from '@/components/GeneralHeader.vue'
import maskLayer from '@/components/MaskLayer.vue'
import { getUserId } from '@/utils/userStore.js'
import { setDocumentDirection } from '@/locales/i18n'
const { t, locale } = useI18n()
const router = useRouter()
const route = useRoute()
const identityStore = useIdentityStore()
//
locale.value && setDocumentDirection(locale.value)
@ -987,14 +991,21 @@ const transfer = async () => {
const selectedCoinData = coinOptions.find((coin) => coin.id === selectedCoin.value)
console.log('当前身份:', identityStore.identity)
const transferData = {
amount: selectedCoinData.price,
acceptUserId: selectedPayee.id,
acceptMethod: 'BANK_TRANSFER',
salaryType:
identityStore.identity == 'BD_LEADER'
? 'BD_LEADER_SALARY'
: identityStore.identity == 'BD'
? 'BD_SALARY'
: '',
}
try {
const response = await userBankTransfer(transferData)
const response = await apiTransfer(transferData)
if (response.status) {
showSuccess(
t('transfer_success', { price: selectedCoinData.price, name: selectedPayee.name })
@ -1021,12 +1032,18 @@ const handleExchange = async () => {
(option) => option.id === selectedExchangeOption.value
)
console.log('当前身份:', identityStore.identity)
try {
//
const response = await userBankExchangeGold({
coinId: selectedOption.id,
const response = await apiExchange({
amount: selectedOption.cash,
price: selectedOption.cash,
salaryType:
identityStore.identity == 'BD_LEADER'
? 'BD_LEADER_SALARY'
: identityStore.identity == 'BD'
? 'BD_SALARY'
: '',
})
if (response.status === true || response.errorCode === 0) {

View File

@ -448,6 +448,7 @@ import { usePageInitializationWithConfig } from '@/utils/pageConfig.js'
import { isInApp } from '@/utils/appBridge.js'
import { clearSelectedPayee } from '@/utils/payeeStore.js'
import { setDocumentDirection } from '@/locales/i18n'
import { useIdentityStore } from '@/stores/identity.js'
import { getBdMemberBillList, getBdHistory, getBdHistoryMore } from '@/api/bdCenter.js'
import { apiGetBankBalance } from '@/api/wallet.js'
@ -459,11 +460,12 @@ import historySalary from '@/components/historySalary.vue'
const { t, locale } = useI18n()
const router = useRouter()
const identityStore = useIdentityStore()
//
locale.value && setDocumentDirection(locale.value)
//
const teamMemberCount = ref(0)
const showHistory = ref(false) //
const showMore = ref(false) //
@ -506,38 +508,24 @@ const goToInviteAgency = () => {
router.push('/invite-agency')
}
//
const exchangeGoldCoins = () => {
router.push('/exchange-gold-coins')
}
//
const transfer = () => {
router.push('/transfer')
}
//
const getBankBalance = async () => {
const res = await apiGetBankBalance('BD_SALARY')
if (res.status && res.body) {
//
salaryInfo.value = res.body || {}
}
}
const { appConnected, userInfo, handleImageError, getAvatarPlaceholder } =
usePageInitializationWithConfig('BD_CENTER', {
needsTeamInfo: true,
needsBankBalance: false,
onDataLoaded: () => {},
})
const { appConnected, userInfo } = usePageInitializationWithConfig('BD_CENTER', {
needsTeamInfo: true,
needsBankBalance: false,
onDataLoaded: () => {},
})
// BD
const apiGetBdMemberBillList = async () => {
const res = await getBdMemberBillList('BD')
if (res.status && res.body) {
//
// console.log('BD member bill list:', res.body)
BDData.value = res.body || {}
}
}
@ -546,8 +534,6 @@ const apiGetBdMemberBillList = async () => {
const apiGetBdHistory = async () => {
const res = await getBdHistory()
if (res.status && res.body) {
//
console.log('BD History:', res.body)
BDSalary.value = res.body || {}
}
}
@ -556,8 +542,6 @@ const apiGetBdHistory = async () => {
const showReportDetail = async (billBelong) => {
const res = await getBdHistoryMore(billBelong)
if (res.status && res.body) {
//
console.log('BD History More:', res.body)
BDSalaryMore.value = res.body || {}
showHistory.value = false
@ -567,7 +551,6 @@ const showReportDetail = async (billBelong) => {
//
const initData = async () => {
//
apiGetBdMemberBillList() //BD
apiGetBdHistory() //BD
getBankBalance() //
@ -576,6 +559,7 @@ const initData = async () => {
onMounted(() => {
clearSelectedPayee() //
initData()
identityStore.setIdentity('BD')
})
</script>

View File

@ -718,6 +718,7 @@ import { useRouter } from 'vue-router'
import { isInApp } from '@/utils/appBridge.js'
import { clearSelectedPayee } from '@/utils/payeeStore.js'
import { usePageInitializationWithConfig } from '@/utils/pageConfig.js'
import { useIdentityStore } from '@/stores/identity.js'
import { getBdMemberBillList, getBdHistory, getBdHistoryMore } from '@/api/bdCenter.js'
import { getBdLeaderHistory, getBdLeaderHistoryMore } from '@/api/bdLeaderCenter'
@ -730,6 +731,8 @@ import historySalary from '@/components/historySalary.vue'
const { t, locale } = useI18n()
const router = useRouter()
const identityStore = useIdentityStore()
//
locale.value && setDocumentDirection(locale.value)
@ -830,8 +833,6 @@ const goToInviteBD = () => {
const apiGetBdMemberBillList = async () => {
const res = await getBdMemberBillList('BD')
if (res.status && res.body) {
//
// console.log('BD member bill list:', res.body)
BDData.value = res.body || {}
}
}
@ -840,8 +841,6 @@ const apiGetBdMemberBillList = async () => {
const apiGetBdLeaderMemberBillList = async () => {
const res = await getBdMemberBillList('BDLEADER')
if (res.status && res.body) {
//
// console.log('BD member bill list:', res.body)
BDLeaderData.value = res.body || {}
}
}
@ -850,8 +849,6 @@ const apiGetBdLeaderMemberBillList = async () => {
const apiGetBdHistory = async () => {
const res = await getBdHistory()
if (res.status && res.body) {
//
console.log('BD History:', res.body)
BDSalary.value = res.body || {}
}
}
@ -860,8 +857,6 @@ const apiGetBdHistory = async () => {
const apiGetBdLeaderHistory = async () => {
const res = await getBdLeaderHistory()
if (res.status && res.body) {
//
console.log('BD History:', res.body)
BDLeaderSalary.value = res.body || {}
}
}
@ -870,17 +865,15 @@ const apiGetBdLeaderHistory = async () => {
const getBankBalance = async () => {
const res = await apiGetBankBalance('BD_LEADER_SALARY')
if (res.status && res.body) {
//
salaryInfo.value = res.body || {}
}
}
const { appConnected, userInfo, handleImageError, getAvatarPlaceholder } =
usePageInitializationWithConfig('BD_LEADER_CENTER', {
needsTeamInfo: true,
needsBankBalance: false,
onDataLoaded: () => {},
})
const { appConnected, userInfo } = usePageInitializationWithConfig('BD_LEADER_CENTER', {
needsTeamInfo: true,
needsBankBalance: false,
onDataLoaded: () => {},
})
//
const initData = () => {
@ -894,6 +887,7 @@ const initData = () => {
onMounted(() => {
clearSelectedPayee()
initData() //
identityStore.setIdentity('BD_LEADER')
})
</script>

View File

@ -221,7 +221,7 @@
</template>
<script setup>
import { ref, computed, onMounted, watch } from 'vue'
import { ref, computed, onMounted, watch, nextTick } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
import GeneralHeader from '@/components/GeneralHeader.vue'
@ -355,6 +355,22 @@ const Confirm = () => {
//
setSelectedPayee({ ...selectedUser.value })
router.go(-1)
// availableIncome
if (route.query) {
console.log('route.query:', route.query)
// 使 nextTick
nextTick(() => {
// 使 replace
router.replace({
path: route.query.from,
query: {
activeAction: route.query.activeAction,
},
})
})
}
}
watch(