Files
ops2/frontend/ops_vue_js/src/stores/users.js
T
2026-04-14 12:23:47 +08:00

56 lines
1.6 KiB
JavaScript

//用于保存其他用户的信息
import { defineStore } from 'pinia'
import { ref } from 'vue'
import { usersApi } from '@/api/users';
const usersInfo = ref([]);
// 正在请求中的 userID 集合,避免重复发请求
const pendingFetch = new Set();
export const useUsersStore = defineStore('users', () => {
function getUserFromUserID(userID) {
return usersInfo.value?.find(item => item.UserID === userID) ?? null
}
function fetchUser(userID) {
if (pendingFetch.has(userID)) return
pendingFetch.add(userID)
usersApi.getUserInfoFromUserID(userID).then((r) => {
if (r.errCode == 0 && r.raw.err_code == 0 && r.raw.return?.userinfo) {
// 防止并发写入重复数据
if (!usersInfo.value.find(item => item.UserID === userID)) {
usersInfo.value.push(r.raw.return.userinfo)
}
}
}).finally(() => {
pendingFetch.delete(userID)
})
}
function getUsernameFromUserID(userID) {
const target = getUserFromUserID(userID)
if (target) {
return target.Username
}
fetchUser(userID)
return "..."
}
function getAvatarUrlFromUserID(userID) {
const target = getUserFromUserID(userID)
if (target?.AvatarPath) {
return `/api/static/avatar/${target.AvatarPath}`
}
// 触发加载(如果还没加载过)
fetchUser(userID)
return `/ava.svg`
}
return {
usersInfo, getUsernameFromUserID, getAvatarUrlFromUserID,
}
})