This commit is contained in:
zhx 2026-06-29 10:23:11 +08:00
parent 75dd8d7920
commit dc26c48c0f
2 changed files with 117 additions and 28 deletions

View File

@ -560,6 +560,7 @@
new URLSearchParams(window.location.search).get( new URLSearchParams(window.location.search).get(
'tab' 'tab'
) || 'honors', ) || 'honors',
targetUserID: normalizedQueryUserID(),
loading: false, loading: false,
toastTimer: 0, toastTimer: 0,
profile: null, profile: null,
@ -596,6 +597,30 @@
function validTab(value) { function validTab(value) {
return tabs[value] ? value : 'honors'; return tabs[value] ? value : 'honors';
} }
function normalizedQueryUserID() {
var value = String(
new URLSearchParams(window.location.search).get(
'user_id'
) || ''
).trim();
return /^\d+$/.test(value) && Number(value) > 0
? value
: '';
}
function hasAccessToken() {
return !!(
window.HyAppAPI &&
window.HyAppAPI.getAccessToken &&
window.HyAppAPI.getAccessToken()
);
}
function canLoadAchievements() {
return !!(
window.HyAppAPI &&
window.HyAppAPI.achievement &&
(state.targetUserID || hasAccessToken())
);
}
function showToast(message) { function showToast(message) {
var toast = byId('toast'); var toast = byId('toast');
toast.textContent = message; toast.textContent = message;
@ -947,18 +972,22 @@
} }
function achievementQuery(name, page) { function achievementQuery(name, page) {
var cfg = tabs[name] || tabs.honors; var cfg = tabs[name] || tabs.honors;
return { var query = {
collection_type: cfg.collection_type, collection_type: cfg.collection_type,
collection_id: cfg.collection_id || '', collection_id: cfg.collection_id || '',
page: page, page: page,
page_size: 60, page_size: 60,
}; };
if (state.targetUserID) query.user_id = state.targetUserID;
return query;
} }
function fetchAchievementList(name, page, acc) { function fetchAchievementList(name, page, acc) {
var nextPage = page || 1; var nextPage = page || 1;
var items = acc || []; var items = acc || [];
return window.HyAppAPI.achievement return window.HyAppAPI.achievement
.list(achievementQuery(name, nextPage)) .list(achievementQuery(name, nextPage), {
skipAuth: !!state.targetUserID,
})
.then(function (data) { .then(function (data) {
var current = normalizeAchievements(data); var current = normalizeAchievements(data);
var merged = items.concat(current); var merged = items.concat(current);
@ -985,11 +1014,7 @@
} }
render(); render();
if (state.loaded[state.tab]) return Promise.resolve(); if (state.loaded[state.tab]) return Promise.resolve();
if ( if (!canLoadAchievements()) {
!window.HyAppAPI ||
!window.HyAppAPI.achievement ||
!window.HyAppAPI.getAccessToken()
) {
state.loaded[state.tab] = true; state.loaded[state.tab] = true;
render(); render();
return Promise.resolve(); return Promise.resolve();
@ -1016,11 +1041,51 @@
} }
function loadUserProfile() { function loadUserProfile() {
var tasks = []; var tasks = [];
var hasToken = var hasToken = hasAccessToken();
if (
state.targetUserID &&
window.HyAppAPI && window.HyAppAPI &&
window.HyAppAPI.getAccessToken && window.HyAppAPI.user
window.HyAppAPI.getAccessToken(); ) {
if (window.HyAppParams && window.HyAppParams.loadUser) { if (window.HyAppAPI.user.profile) {
tasks.push(
window.HyAppAPI.user
.profile(state.targetUserID, {
skipAuth: true,
})
.then(function (data) {
state.profile = profileSource(data);
renderHeader();
return data;
})
.catch(function () {
return null;
})
);
}
if (window.HyAppAPI.user.appearance) {
tasks.push(
window.HyAppAPI.user
.appearance(state.targetUserID, {
skipAuth: true,
})
.then(function (data) {
state.appearance =
normalizeAppearance(data);
renderHeader();
return data;
})
.catch(function () {
state.appearance = {};
renderHeader();
return null;
})
);
}
} else if (
window.HyAppParams &&
window.HyAppParams.loadUser
) {
tasks.push( tasks.push(
window.HyAppParams.loadUser() window.HyAppParams.loadUser()
.then(function (current) { .then(function (current) {
@ -1034,6 +1099,7 @@
); );
} }
if ( if (
!state.targetUserID &&
hasToken && hasToken &&
window.HyAppAPI.user && window.HyAppAPI.user &&
window.HyAppAPI.user.appearance window.HyAppAPI.user.appearance
@ -1064,11 +1130,7 @@
var active = state.tab; var active = state.tab;
var other = active === 'honors' ? 'event' : 'honors'; var other = active === 'honors' ? 'event' : 'honors';
if (state.loaded[other]) return Promise.resolve(); if (state.loaded[other]) return Promise.resolve();
if ( if (!canLoadAchievements()) {
!window.HyAppAPI ||
!window.HyAppAPI.achievement ||
!window.HyAppAPI.getAccessToken()
) {
state.loaded[other] = true; state.loaded[other] = true;
renderHeader(); renderHeader();
return Promise.resolve(); return Promise.resolve();

View File

@ -453,7 +453,7 @@ var default_api = 'https://api.global-interaction.com/';
); );
var token = getAccessToken(); var token = getAccessToken();
var url = buildURL(path, opts.query); var url = buildURL(path, opts.query);
if (token) headers.Authorization = 'Bearer ' + token; if (token && !opts.skipAuth) headers.Authorization = 'Bearer ' + token;
headers['X-App-Code'] = requestAppCode(); headers['X-App-Code'] = requestAppCode();
if (!shouldPersist() && isSameOriginURL(url)) if (!shouldPersist() && isSameOriginURL(url))
headers['Cache-Control'] = 'no-cache'; headers['Cache-Control'] = 'no-cache';
@ -501,8 +501,29 @@ var default_api = 'https://api.global-interaction.com/';
overview: function () { overview: function () {
return request('/api/v1/users/me/overview', { method: 'GET' }); return request('/api/v1/users/me/overview', { method: 'GET' });
}, },
appearance: function () { profile: function (userID, options) {
return request('/api/v1/users/me/appearance', { method: 'GET' }); var id = String(userID || '').trim();
var opts = options || {};
if (!id) return Promise.reject(new Error('user_id is required'));
return request(
'/api/v1/users/by-id/' + encodeURIComponent(id) + '/profile',
{
method: 'GET',
skipAuth: !!opts.skipAuth,
}
);
},
appearance: function (userID, options) {
var id = String(userID || '').trim();
var opts = options || {};
return request(
id
? '/api/v1/users/by-id/' +
encodeURIComponent(id) +
'/appearance'
: '/api/v1/users/me/appearance',
{ method: 'GET', skipAuth: !!opts.skipAuth }
);
}, },
hostIdentity: function () { hostIdentity: function () {
return request('/api/v1/users/me/host-identity', { return request('/api/v1/users/me/host-identity', {
@ -1060,14 +1081,18 @@ var default_api = 'https://api.global-interaction.com/';
}, },
options: function (displayUserID, extra) { options: function (displayUserID, extra) {
if (isConfiguredWebPay()) { if (isConfiguredWebPay()) {
var query = Object.assign(aslanUserQuery(displayUserID, extra), { var query = Object.assign(
payCountryId: aslanUserQuery(displayUserID, extra),
extra && (extra.pay_country_id || extra.payCountryId), {
countryCode: payCountryId:
extra && (extra.country_code || extra.countryCode), extra &&
regionId: extra && (extra.region_id || extra.regionId), (extra.pay_country_id || extra.payCountryId),
userId: extra && (extra.user_id || extra.userId), countryCode:
}); extra && (extra.country_code || extra.countryCode),
regionId: extra && (extra.region_id || extra.regionId),
userId: extra && (extra.user_id || extra.userId),
}
);
return request( return request(
appEndpoint('options', '/order/web/pay/h5/options'), appEndpoint('options', '/order/web/pay/h5/options'),
{ {
@ -1496,10 +1521,12 @@ var default_api = 'https://api.global-interaction.com/';
// 成就页只读当前用户的 App 成就和徽章展示资料认证、app_code、env、错误 envelope 仍由 request 统一处理。 // 成就页只读当前用户的 App 成就和徽章展示资料认证、app_code、env、错误 envelope 仍由 request 统一处理。
// collection_type 由页面按 tab 传入,避免 H5 自己拼接不同业务集合导致后端筛选语义漂移。 // collection_type 由页面按 tab 传入,避免 H5 自己拼接不同业务集合导致后端筛选语义漂移。
var achievementAPI = { var achievementAPI = {
list: function (query) { list: function (query, options) {
var opts = options || {};
return request('/api/v1/achievements', { return request('/api/v1/achievements', {
method: 'GET', method: 'GET',
query: query || {}, query: query || {},
skipAuth: !!opts.skipAuth,
}); });
}, },
badges: function () { badges: function () {