优化:UI和日志
This commit is contained in:
parent
95d20a9bb1
commit
6b12938c89
@ -112,27 +112,34 @@ export class UserSdk {
|
|||||||
// 拼接 Token
|
// 拼接 Token
|
||||||
const separator = baseUrl.includes('?') ? '&' : '?';
|
const separator = baseUrl.includes('?') ? '&' : '?';
|
||||||
this.url = `${baseUrl}${separator}token=${this.token}`;
|
this.url = `${baseUrl}${separator}token=${this.token}`;
|
||||||
|
|
||||||
|
console.log('[UserSdk] 初始化:', {
|
||||||
|
url: this.url.replace(/token=[^&]+/, 'token=***'),
|
||||||
|
autoReconnect: this.autoReconnect,
|
||||||
|
reconnectInterval: this.reconnectInterval,
|
||||||
|
maxReconnectAttempts: this.maxReconnectAttempts,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// 连接
|
// 连接
|
||||||
public connect() {
|
public connect() {
|
||||||
if (this.ws) {
|
if (this.ws) {
|
||||||
console.warn("UserSdk: WebSocket already connected or connecting");
|
console.warn('[UserSdk] 已连接或正在连接,跳过');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
console.log(`UserSdk: Connecting to ${this.url}...`);
|
console.log('[UserSdk] 正在连接...', this.url.replace(/token=[^&]+/, 'token=***'));
|
||||||
this.ws = new WebSocket(this.url);
|
this.ws = new WebSocket(this.url);
|
||||||
|
|
||||||
this.ws.onopen = (event: Event) => {
|
this.ws.onopen = (event: Event) => {
|
||||||
console.log("UserSdk: Connected");
|
console.log('[UserSdk] 已连接');
|
||||||
this.reconnectAttempts = 0;
|
this.reconnectAttempts = 0;
|
||||||
this.listeners.connect.forEach(cb => cb(event));
|
this.listeners.connect.forEach(cb => cb(event));
|
||||||
};
|
};
|
||||||
|
|
||||||
this.ws.onclose = (event: CloseEvent) => {
|
this.ws.onclose = (event: CloseEvent) => {
|
||||||
console.log(`UserSdk: Disconnected (Code: ${event.code})`);
|
console.log('[UserSdk] 已断开', { code: event.code, reason: event.reason, wasClean: event.wasClean });
|
||||||
this.ws = null;
|
this.ws = null;
|
||||||
this.listeners.disconnect.forEach(cb => cb(event));
|
this.listeners.disconnect.forEach(cb => cb(event));
|
||||||
|
|
||||||
@ -142,7 +149,7 @@ export class UserSdk {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this.ws.onerror = (event: Event) => {
|
this.ws.onerror = (event: Event) => {
|
||||||
console.error("UserSdk: Error", event);
|
console.error('[UserSdk] WebSocket 错误', event);
|
||||||
this.listeners.error.forEach(cb => cb(event));
|
this.listeners.error.forEach(cb => cb(event));
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -152,18 +159,19 @@ export class UserSdk {
|
|||||||
const msg = JSON.parse(raw) as UserMsg;
|
const msg = JSON.parse(raw) as UserMsg;
|
||||||
this.handleMessage(msg);
|
this.handleMessage(msg);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("UserSdk: Failed to parse message", event.data);
|
console.error('[UserSdk] 消息解析失败', event.data, e);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("UserSdk: Connection failed", e);
|
console.error('[UserSdk] 连接失败', e);
|
||||||
if (this.autoReconnect) this.handleReconnect();
|
if (this.autoReconnect) this.handleReconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 断开连接
|
// 断开连接
|
||||||
public disconnect() {
|
public disconnect() {
|
||||||
|
console.log('[UserSdk] 主动断开连接');
|
||||||
this.isExplicitClose = true;
|
this.isExplicitClose = true;
|
||||||
if (this.ws) {
|
if (this.ws) {
|
||||||
this.ws.close();
|
this.ws.close();
|
||||||
@ -175,31 +183,35 @@ export class UserSdk {
|
|||||||
private handleMessage(msg: UserMsg) {
|
private handleMessage(msg: UserMsg) {
|
||||||
switch (msg.type) {
|
switch (msg.type) {
|
||||||
case 'welcome':
|
case 'welcome':
|
||||||
|
console.log('[UserSdk] 收到 welcome', msg.msg ?? msg);
|
||||||
this.listeners.welcome.forEach(cb => cb(msg));
|
this.listeners.welcome.forEach(cb => cb(msg));
|
||||||
break;
|
break;
|
||||||
case 'order_update':
|
case 'order_update':
|
||||||
|
console.log('[UserSdk] 收到 order_update', msg.data);
|
||||||
this.listeners.order.forEach(cb => cb(msg.data));
|
this.listeners.order.forEach(cb => cb(msg.data));
|
||||||
break;
|
break;
|
||||||
case 'position_update':
|
case 'position_update':
|
||||||
|
console.log('[UserSdk] 收到 position_update', msg.data);
|
||||||
this.listeners.position.forEach(cb => cb(msg.data));
|
this.listeners.position.forEach(cb => cb(msg.data));
|
||||||
break;
|
break;
|
||||||
case 'balance_update':
|
case 'balance_update':
|
||||||
|
console.log('[UserSdk] 收到 balance_update', msg.data);
|
||||||
this.listeners.balance.forEach(cb => cb(msg.data));
|
this.listeners.balance.forEach(cb => cb(msg.data));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
console.warn("UserSdk: Unknown message type", msg);
|
console.warn('[UserSdk] 未知消息类型', msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 重连逻辑
|
// 重连逻辑
|
||||||
private handleReconnect() {
|
private handleReconnect() {
|
||||||
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
|
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
|
||||||
console.error("UserSdk: Max reconnect attempts reached");
|
console.error('[UserSdk] 已达最大重连次数', this.maxReconnectAttempts);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.reconnectAttempts++;
|
this.reconnectAttempts++;
|
||||||
console.log(`UserSdk: Reconnecting in ${this.reconnectInterval}ms (Attempt ${this.reconnectAttempts})...`);
|
console.log('[UserSdk] 重连中...', { attempt: this.reconnectAttempts, max: this.maxReconnectAttempts, delayMs: this.reconnectInterval });
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.connect();
|
this.connect();
|
||||||
}, this.reconnectInterval);
|
}, this.reconnectInterval);
|
||||||
|
|||||||
@ -230,7 +230,6 @@ export async function getPmTagMain(): Promise<CategoryTreeResponse> {
|
|||||||
const res = await get<{ code: number; data: GetPmTagCatalogData; msg: string }>(
|
const res = await get<{ code: number; data: GetPmTagCatalogData; msg: string }>(
|
||||||
'/pmTagCatalog/getPmTagCatalogPublic'
|
'/pmTagCatalog/getPmTagCatalogPublic'
|
||||||
)
|
)
|
||||||
console.log('[getPmTagCatalogPublic] 原始响应:', JSON.stringify(res, null, 2))
|
|
||||||
let raw: PmTagCatalogItem[] = []
|
let raw: PmTagCatalogItem[] = []
|
||||||
const d = res.data
|
const d = res.data
|
||||||
if (d && typeof d === 'object' && !Array.isArray(d)) {
|
if (d && typeof d === 'object' && !Array.isArray(d)) {
|
||||||
|
|||||||
@ -1684,7 +1684,6 @@ const showDepositForBuy = computed(() => !canAffordBuy.value)
|
|||||||
|
|
||||||
/** Buy 模式且余额不足时显示 Deposit,否则显示 Buy Yes/No */
|
/** Buy 模式且余额不足时显示 Deposit,否则显示 Buy Yes/No */
|
||||||
const deposit = () => {
|
const deposit = () => {
|
||||||
console.log('Depositing amount:', amount.value)
|
|
||||||
// 实际应用中,这里应该调用存款API
|
// 实际应用中,这里应该调用存款API
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1731,7 +1730,6 @@ async function submitOrder() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
const uid = userStore?.user?.ID ?? 0
|
const uid = userStore?.user?.ID ?? 0
|
||||||
console.log('[submitOrder] 用户信息: user=', userStore.user, 'uid=', uid)
|
|
||||||
const userIdNum =
|
const userIdNum =
|
||||||
typeof uid === 'number'
|
typeof uid === 'number'
|
||||||
? uid
|
? uid
|
||||||
@ -1739,7 +1737,6 @@ async function submitOrder() {
|
|||||||
? parseInt(String(uid), 10)
|
? parseInt(String(uid), 10)
|
||||||
: 0
|
: 0
|
||||||
if (!Number.isFinite(userIdNum) || userIdNum <= 0) {
|
if (!Number.isFinite(userIdNum) || userIdNum <= 0) {
|
||||||
console.warn('[submitOrder] 用户信息异常: user=', userStore.user, 'uid=', uid)
|
|
||||||
orderError.value = t('trade.userError')
|
orderError.value = t('trade.userError')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -194,9 +194,6 @@ async function submitWithdraw() {
|
|||||||
submitting.value = true
|
submitting.value = true
|
||||||
try {
|
try {
|
||||||
await new Promise((r) => setTimeout(r, 800))
|
await new Promise((r) => setTimeout(r, 800))
|
||||||
const dest =
|
|
||||||
destinationType.value === 'wallet' ? connectedAddress.value : customAddress.value.trim()
|
|
||||||
console.log('Withdraw', { amount: amount.value, network: selectedNetwork.value, to: dest })
|
|
||||||
emit('success')
|
emit('success')
|
||||||
close()
|
close()
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@ -75,12 +75,8 @@ export const useUserStore = defineStore('user', () => {
|
|||||||
balance.value = formatUsdcBalance(String(avail))
|
balance.value = formatUsdcBalance(String(avail))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
sdk.onConnect(() => {
|
sdk.onConnect(() => {})
|
||||||
console.log('[UserStore] UserSocket 已连接')
|
sdk.onDisconnect(() => {})
|
||||||
})
|
|
||||||
sdk.onDisconnect(() => {
|
|
||||||
console.log('[UserStore] UserSocket 已断开')
|
|
||||||
})
|
|
||||||
sdk.onError((e) => {
|
sdk.onError((e) => {
|
||||||
console.error('[UserStore] UserSocket 错误:', e)
|
console.error('[UserStore] UserSocket 错误:', e)
|
||||||
})
|
})
|
||||||
@ -161,7 +157,6 @@ export const useUserStore = defineStore('user', () => {
|
|||||||
if (!headers) return
|
if (!headers) return
|
||||||
try {
|
try {
|
||||||
const res = await getUserInfo(headers)
|
const res = await getUserInfo(headers)
|
||||||
console.log('[fetchUserInfo] 接口响应:', JSON.stringify(res, null, 2))
|
|
||||||
const data = res.data as Record<string, unknown> | undefined
|
const data = res.data as Record<string, unknown> | undefined
|
||||||
// 接口返回 data.userInfo 或 data.user,取实际用户对象;若仍含 userInfo 则再取一层
|
// 接口返回 data.userInfo 或 data.user,取实际用户对象;若仍含 userInfo 则再取一层
|
||||||
let u = (data?.userInfo ?? data?.user ?? data) as Record<string, unknown>
|
let u = (data?.userInfo ?? data?.user ?? data) as Record<string, unknown>
|
||||||
|
|||||||
@ -348,11 +348,15 @@ function generateDataForMarket(baseChance: number, range: string): [number, numb
|
|||||||
|
|
||||||
function generateAllData(): ChartSeriesItem[] {
|
function generateAllData(): ChartSeriesItem[] {
|
||||||
const range = selectedTimeRange.value
|
const range = selectedTimeRange.value
|
||||||
return markets.value.map((market) => {
|
const list = markets.value
|
||||||
|
return list.map((market, i) => {
|
||||||
const chance = marketChance(market)
|
const chance = marketChance(market)
|
||||||
const name = (market.question || 'Market').slice(0, 32)
|
const base = (market.question || 'Market').slice(0, 32)
|
||||||
|
const baseName = base + (base.length >= 32 ? '…' : '')
|
||||||
|
// 确保图例 name 唯一,否则 ECharts 会合并导致左右切换箭头不显示
|
||||||
|
const name = list.length > 1 ? `${baseName} (${i + 1}/${list.length})` : baseName
|
||||||
return {
|
return {
|
||||||
name: name + (name.length >= 32 ? '…' : ''),
|
name,
|
||||||
data: generateDataForMarket(chance || 20, range),
|
data: generateDataForMarket(chance || 20, range),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -432,7 +436,7 @@ function buildOption(seriesArr: ChartSeriesItem[], containerWidth?: number) {
|
|||||||
itemGap: 12,
|
itemGap: 12,
|
||||||
},
|
},
|
||||||
grid: {
|
grid: {
|
||||||
left: 16,
|
left: 8,
|
||||||
right: 48,
|
right: 48,
|
||||||
top: 40,
|
top: 40,
|
||||||
bottom: isMobile ? 44 : 28,
|
bottom: isMobile ? 44 : 28,
|
||||||
@ -458,6 +462,15 @@ function initChart() {
|
|||||||
chartInstance = echarts.init(chartContainerRef.value)
|
chartInstance = echarts.init(chartContainerRef.value)
|
||||||
const w = chartContainerRef.value.clientWidth
|
const w = chartContainerRef.value.clientWidth
|
||||||
chartInstance.setOption(buildOption(chartData.value, w))
|
chartInstance.setOption(buildOption(chartData.value, w))
|
||||||
|
|
||||||
|
// 数据打印,便于分析
|
||||||
|
console.log('[EventMarkets] 数据分析:', {
|
||||||
|
marketsCount: markets.value.length,
|
||||||
|
chartSeriesCount: chartData.value.length,
|
||||||
|
containerWidth: w,
|
||||||
|
legendData: chartData.value.map((s) => ({ name: s.name, nameLen: s.name.length, points: s.data.length })),
|
||||||
|
eventDetail: eventDetail.value ? { title: eventDetail.value.title, id: eventDetail.value.ID } : null,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateChartData() {
|
function updateChartData() {
|
||||||
@ -556,7 +569,6 @@ function onTradeSubmit(payload: {
|
|||||||
marketId?: string
|
marketId?: string
|
||||||
}) {
|
}) {
|
||||||
// 可在此调用下单 API,payload 含 marketId(当前市场)
|
// 可在此调用下单 API,payload 含 marketId(当前市场)
|
||||||
console.log('Trade submit', payload)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const toastStore = useToastStore()
|
const toastStore = useToastStore()
|
||||||
|
|||||||
@ -612,7 +612,6 @@ async function loadEvents(page: number, append: boolean, keyword?: string) {
|
|||||||
})
|
})
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (!append) eventList.value = []
|
if (!append) eventList.value = []
|
||||||
console.warn('getPmEventList failed', e)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -64,7 +64,6 @@ const connectWithWallet = async () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const walletAddress = accounts[0]
|
const walletAddress = accounts[0]
|
||||||
console.log('Connected to wallet with account:', walletAddress)
|
|
||||||
|
|
||||||
if (!walletAddress || !/^0x[0-9a-fA-F]{40}$/.test(walletAddress)) {
|
if (!walletAddress || !/^0x[0-9a-fA-F]{40}$/.test(walletAddress)) {
|
||||||
throw new Error('Invalid wallet address format. Please check your wallet connection.')
|
throw new Error('Invalid wallet address format. Please check your wallet connection.')
|
||||||
|
|||||||
@ -296,6 +296,23 @@ async function loadEventDetail() {
|
|||||||
})
|
})
|
||||||
if (res.code === 0 || res.code === 200) {
|
if (res.code === 0 || res.code === 200) {
|
||||||
eventDetail.value = res.data ?? null
|
eventDetail.value = res.data ?? null
|
||||||
|
// 单个市场详情数据打印,便于分析
|
||||||
|
const ev = eventDetail.value
|
||||||
|
console.log('[TradeDetail] 单个市场详情:', {
|
||||||
|
id: ev?.ID ?? ev?.id,
|
||||||
|
title: ev?.title,
|
||||||
|
slug: ev?.slug,
|
||||||
|
volume: ev?.volume,
|
||||||
|
endDate: ev?.endDate,
|
||||||
|
marketsCount: ev?.markets?.length ?? 0,
|
||||||
|
firstMarket: ev?.markets?.[0]
|
||||||
|
? {
|
||||||
|
question: ev.markets[0].question,
|
||||||
|
outcomePrices: ev.markets[0].outcomePrices,
|
||||||
|
marketId: ev.markets[0].marketId,
|
||||||
|
}
|
||||||
|
: null,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
detailError.value = res.msg || t('error.loadFailed')
|
detailError.value = res.msg || t('error.loadFailed')
|
||||||
eventDetail.value = null
|
eventDetail.value = null
|
||||||
@ -791,7 +808,7 @@ function buildOption(chartData: [number, number][], containerWidth?: number) {
|
|||||||
axisPointer: { animation: false },
|
axisPointer: { animation: false },
|
||||||
},
|
},
|
||||||
grid: {
|
grid: {
|
||||||
left: 48,
|
left: 8,
|
||||||
right: 48,
|
right: 48,
|
||||||
top: 16,
|
top: 16,
|
||||||
bottom: isMobile ? 44 : 28,
|
bottom: isMobile ? 44 : 28,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user