错误处理

This commit is contained in:
tianfeng 2025-08-21 16:30:38 +08:00
parent 243a8e32e4
commit a556577599
8 changed files with 107 additions and 28 deletions

View File

@ -3,8 +3,8 @@ VITE_NODE_ENV=development
VITE_API_BASE_URL=https://api.likeichat.com
VITE_APP_TITLE=Likei H5 (Development)
# 普通用户
VITE_USER_AUTH=EB4BAD4C6439CF503B16267C712F5AB6.djIlM0ExOTU3MzQ1MzEyOTYxNTI3ODA5JTNBTElLRUklM0ExNzU4Mjc4MDEzNzQ0JTNBMTc1NTY4NjAxMzc0NA==
# 普通用户 8826602
#VITE_USER_AUTH=EB4BAD4C6439CF503B16267C712F5AB6.djIlM0ExOTU3MzQ1MzEyOTYxNTI3ODA5JTNBTElLRUklM0ExNzU4Mjc4MDEzNzQ0JTNBMTc1NTY4NjAxMzc0NA==
# 代理用户 8826603
# VITE_USER_AUTH=747E27BE38B21A129CE41BB1F80EA924.djIlM0ExOTU3MzU2MTM4NTIzMDY2MzY5JTNBTElLRUklM0ExNzU4MDk3MDg4NDA0JTNBMTc1NTUwNTA4ODQwNA==
VITE_USER_AUTH=747E27BE38B21A129CE41BB1F80EA924.djIlM0ExOTU3MzU2MTM4NTIzMDY2MzY5JTNBTElLRUklM0ExNzU4MDk3MDg4NDA0JTNBMTc1NTUwNTA4ODQwNA==

View File

@ -20,10 +20,10 @@ export const getTeamMembers = async (teamId) => {
* @param {string} memberId - 成员ID
* @returns {Promise}
*/
export const deleteMember = async (memberId) => {
export const deleteMember = async (ids) => {
try {
const response = await post('/team-member/client/removeMemberTeam', {
memberId: memberId
ids: ids
})
return response
} catch (error) {

View File

@ -29,7 +29,7 @@ export function userBankCheckTransfer() {
* @returns {Promise} 返回用户角色和权限信息
*/
export function userSalaryCheckExchange() {
return get('/wallet/salary-diamond/check/exchange-gold')
return get('/wallet/bank/check/exchange-gold')
}
// 获取用户银行卡余额-兑换金币

View File

@ -7,7 +7,13 @@
<div class="user-card">
<div class="user-info">
<div class="avatar">
<span>{{ userInfo.name.charAt(0) }}</span>
<img
v-if="userInfo.userAvatar"
:src="userInfo.userAvatar"
:alt="userInfo.name"
@error="handleImageError"
/>
<span v-else class="avatar-placeholder">{{ getAvatarPlaceholder() }}</span>
</div>
<div class="user-details">
<h3>{{ userInfo.name }}</h3>
@ -155,8 +161,8 @@ import { ref, reactive, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import MobileHeader from '../components/MobileHeader.vue'
import { get } from '../utils/http.js'
import {getBankBalance} from "@/api/wallet.js";
import {getTeamId} from "@/utils/userStore.js";
import {getBankBalance, getTeamEntry} from "@/api/wallet.js";
import {getTeamId, setUserInfo} from "@/utils/userStore.js";
import {showError} from "@/utils/toast.js";
const router = useRouter()
@ -179,6 +185,7 @@ const salaryInfo = reactive({
//
const userInfo = reactive({
userAvatar: '',
name: 'User1',
id: '1234567890'
})
@ -251,6 +258,17 @@ const fetchTeamMemberCount = async () => {
}
}
const fetchTeamEntry = async () => {
const response = await getTeamEntry()
const member = response.body.memberProfile
if (member) {
//
userInfo.name = member.userNickname
userInfo.id = member.account
userInfo.userAvatar = member.userAvatar
}
}
//
const fetchBankBalance = async () => {
@ -271,8 +289,23 @@ const fetchBankBalance = async () => {
}
}
//
const handleImageError = (event) => {
// userAvatar
userInfo.userAvatar = ''
}
//
const getAvatarPlaceholder = () => {
if (userInfo.name && userInfo.name.length > 0) {
return userInfo.name.charAt(0).toUpperCase()
}
return 'U' // 'U'
}
//
onMounted(() => {
fetchTeamEntry()
fetchTeamMemberCount()
fetchBankBalance()
})
@ -316,6 +349,21 @@ onMounted(() => {
font-size: 20px;
font-weight: 600;
margin-right: 12px;
overflow: hidden;
position: relative;
}
.avatar img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 25px;
}
.avatar .avatar-placeholder {
color: white;
font-size: 20px;
font-weight: 600;
}
.user-details {

View File

@ -53,7 +53,7 @@ import { ref, reactive, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import MobileHeader from '../components/MobileHeader.vue'
import { getBankBalance, userSalaryCheckExchange, userBankExchangeGold } from '../api/wallet.js'
import { showError } from "@/utils/toast.js";
import {showError, showWarning} from "@/utils/toast.js";
const router = useRouter()
@ -126,7 +126,7 @@ const checkUserRole = async () => {
//
if (error.errorCode === 1083) {
// NOT_OPEN_ERROR
showError('Exchange function is not available')
showWarning('Exchange NOT_OPEN_ERROR')
} else if (error.message && error.message.includes('HTTP Error: 406')) {
// 406 Not Acceptable
showError('The server cannot produce a response matching the list of acceptable values defined in the request headers')
@ -211,8 +211,8 @@ const selectCoin = (coin) => {
//
onMounted(() => {
fetchBankBalance()
checkUserRole()
fetchBankBalance()
})
</script>

View File

@ -15,16 +15,17 @@
<div class="user-info">
<div class="avatar">
<span>{{ (userInfo.userNickname || userInfo.name).charAt(0) }}</span>
<img
v-if="userInfo.userAvatar"
:src="userInfo.userAvatar"
:alt="userInfo.name"
@error="handleImageError"
/>
<span v-else class="avatar-placeholder">{{ getAvatarPlaceholder() }}</span>
</div>
<div class="user-details">
<h3>{{ userInfo.userNickname || userInfo.name }}</h3>
<p>ID: {{ userInfo.account || userInfo.id }}</p>
<!-- 显示系统信息 -->
<p v-if="headerInfo.sysOrigin" class="system-info">
{{ headerInfo.sysOrigin }}
<span v-if="headerInfo.appVersion"> v{{ headerInfo.appVersion }}</span>
</p>
</div>
<button class="notification-btn" @click="goToNotification">
<span></span>
@ -250,6 +251,7 @@ const fetchWorkStatistics = async () => {
const userInfo = reactive({
name: 'User1',
id: '1234567890',
userAvatar: '',
userNickname: 'User1',
account: '1234567890'
})
@ -303,6 +305,7 @@ const fetchTeamEntry = async () => {
//
userInfo.userNickname = response.body.memberProfile.userNickname
userInfo.account = response.body.memberProfile.account
userInfo.userAvatar = response.body.memberProfile.userAvatar
}
// ID
@ -380,6 +383,19 @@ const checkUserIdentity = async (userId) => {
}
}
//
const handleImageError = (event) => {
// userAvatar
userInfo.userAvatar = ''
}
//
const getAvatarPlaceholder = () => {
if (userInfo.name && userInfo.name.length > 0) {
return userInfo.name.charAt(0).toUpperCase()
}
return 'U' // 'U'
}
const exchangeGoldCoins = () => {
router.push('/exchange-gold-coins')
@ -484,6 +500,21 @@ onMounted(async () => {
font-size: 20px;
font-weight: 600;
margin-right: 12px;
overflow: hidden;
position: relative;
}
.avatar img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 25px;
}
.avatar .avatar-placeholder {
color: white;
font-size: 20px;
font-weight: 600;
}
.user-details {

View File

@ -54,7 +54,7 @@ import MobileHeader from '../components/MobileHeader.vue'
import { getApplyRecord } from '../api/teamBill.js'
import { processUserApply } from '../api/wallet.js'
import {getTeamId} from "@/utils/userStore.js";
import {showError} from "@/utils/toast.js";
import {showError, showSuccess, showWarning} from "@/utils/toast.js";
const router = useRouter()
const loading = ref(false)
@ -111,18 +111,18 @@ const handleAgree = async (message) => {
})
if (response.status) {
showError(`已同意 ${message.name} 的申请`)
showSuccess(`Approved ${message.name}'s application`)
//
const index = messages.value.findIndex(m => m.id === message.id)
if (index > -1) {
messages.value.splice(index, 1)
}
} else {
showError('操作失败,请重试')
showError('Operation failed, please try again')
}
} catch (error) {
console.error('同意申请失败:', error)
showError('操作失败,请重试')
showError('Operation failed, please try again')
}
}
@ -135,18 +135,18 @@ const handleRefuse = async (message) => {
})
if (response.status) {
showError(`已拒绝 ${message.name} 的申请`)
showWarning(`Rejected ${message.name}'s application`)
//
const index = messages.value.findIndex(m => m.id === message.id)
if (index > -1) {
messages.value.splice(index, 1)
}
} else {
showError('操作失败,请重试')
showError('Operation failed, please try again')
}
} catch (error) {
console.error('拒绝申请失败:', error)
showError('操作失败,请重试')
showError('Operation failed, please try again')
}
}

View File

@ -32,14 +32,14 @@
</div>
</div>
<button
<!-- <button
class="delete-btn"
@click="handleDeleteMember(member)"
:disabled="deletingMemberId === member.id"
>
<span v-if="deletingMemberId === member.id"></span>
<span v-else>🗑</span>
</button>
</button>-->
</div>
</div>
@ -147,7 +147,7 @@ const confirmDelete = async () => {
deletingMemberId.value = memberToDelete.value.id
// API
await deleteMemberApi(memberToDelete.value.id)
await deleteMemberApi([memberToDelete.value.id])
//
const index = members.value.findIndex(m => m.id === memberToDelete.value.id)