refactor(frontend): 统一当前登录用户 ID 获取入口

- 新增 getCurrentUserId 到 utils/auth
- 替换 IM、CRM、BPM、MES、Mall 等模块中直接读取 userStore.getUser.id 的写法
- 移除 IM 内部 currentUser 工具依赖,统一从全局 auth 工具获取当前用户编号
- 保留 userStore 对昵称、头像、部门等非 ID 字段的读取
im
YunaiV 2026-05-28 23:38:46 +08:00
parent 763e11eb78
commit 89a49cf19c
50 changed files with 104 additions and 126 deletions

View File

@ -2,7 +2,7 @@ import request from '@/config/axios'
import { isEmpty } from '@/utils/is'
import { ApiSelectProps } from '@/components/FormCreate/src/type'
import { jsonParse } from '@/utils'
import { useUserStoreWithOut } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
export const useApiSelect = (option: ApiSelectProps) => {
return defineComponent({
@ -99,9 +99,7 @@ export const useApiSelect = (option: ApiSelectProps) => {
}
// 获取当前用户 ID
const userStore = useUserStoreWithOut()
const user = userStore.getUser
const currentUserId = user?.id
const currentUserId = getCurrentUserId()
if (currentUserId) {
// 根据多选/单选模式设置默认值
const defaultValue = props.multiple ? [currentUserId] : currentUserId

View File

@ -37,6 +37,12 @@ export const formatToken = (token: string): string => {
}
// ========== 账号相关 ==========
/** 获取当前登录用户编号 */
export const getCurrentUserId = (): number => {
const user = wsCache.get(CACHE_KEY.USER)?.user
return Number(user?.id) || 0
}
export type LoginFormType = {
tenantName: string
username: string

View File

@ -284,7 +284,7 @@ import * as FormApi from '@/api/bpm/form'
import { setConfAndFields2 } from '@/utils/formCreate'
import { BpmModelFormType } from '@/utils/constants'
import { checkPermi } from '@/utils/permission'
import { useUserStoreWithOut } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { useAppStore } from '@/store/modules/app'
import { cloneDeep, isEqual } from 'lodash-es'
import { useDebounceFn } from '@vueuse/core'
@ -333,7 +333,6 @@ const emit = defineEmits(['success'])
const message = useMessage() //
const { t } = useI18n() //
const { push } = useRouter() //
const userStore = useUserStoreWithOut() //
const isDark = computed(() => useAppStore().getIsDark) //
const router = useRouter() //
@ -501,7 +500,7 @@ const handleFormDetail = async (row: any) => {
/** 判断是否可以操作 */
const isManagerUser = (row: any) => {
const userId = userStore.getUser.id
const userId = getCurrentUserId()
return row.managerUserIds && row.managerUserIds.includes(userId)
}

View File

@ -88,7 +88,7 @@
import { useRoute, useRouter } from 'vue-router'
import { useMessage } from '@/hooks/web/useMessage'
import { useTagsViewStore } from '@/store/modules/tagsView'
import { useUserStoreWithOut } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import * as ModelApi from '@/api/bpm/model'
import * as FormApi from '@/api/bpm/form'
import { CategoryApi, CategoryVO } from '@/api/bpm/category'
@ -107,7 +107,6 @@ const { delView } = useTagsViewStore() // 视图操作
const tagsView = useTagsView()
const route = useRoute()
const message = useMessage()
const userStore = useUserStoreWithOut()
//
const basicInfoRef = ref()
@ -237,7 +236,7 @@ const initData = async () => {
} else {
//
formData.value.startUserType = 0 //
formData.value.managerUserIds.push(userStore.getUser.id)
formData.value.managerUserIds.push(getCurrentUserId())
}
//

View File

@ -513,7 +513,7 @@
<SignDialog ref="signRef" @success="handleSignFinish" />
</template>
<script lang="ts" setup>
import { useUserStoreWithOut } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { setConfAndFields2 } from '@/utils/formCreate'
import * as TaskApi from '@/api/bpm/task'
import * as ProcessInstanceApi from '@/api/bpm/processInstance'
@ -535,7 +535,7 @@ defineOptions({ name: 'ProcessInstanceBtnContainer' })
const router = useRouter() //
const message = useMessage() //
const userId = useUserStoreWithOut().getUser.id //
const userId = getCurrentUserId() //
const emit = defineEmits(['success']) // success
const props = defineProps<{

View File

@ -140,7 +140,7 @@ import * as BusinessApi from '@/api/crm/business'
import * as BusinessStatusApi from '@/api/crm/business/status'
import * as CustomerApi from '@/api/crm/customer'
import * as UserApi from '@/api/system/user'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import BusinessProductForm from './components/BusinessProductForm.vue'
import { erpPriceMultiply, erpPriceInputFormatter } from '@/utils'
@ -233,7 +233,7 @@ const open = async (type: string, id?: number, customerId?: number, contactId?:
userOptions.value = await UserApi.getSimpleUserList()
//
if (formType.value === 'create') {
formData.value.ownerUserId = useUserStore().getUser.id
formData.value.ownerUserId = getCurrentUserId()
}
}
defineExpose({ open }) // open

View File

@ -150,7 +150,7 @@ import * as ClueApi from '@/api/crm/clue'
import * as AreaApi from '@/api/system/area'
import { defaultProps } from '@/utils/tree'
import * as UserApi from '@/api/system/user'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
const { t } = useI18n() //
const message = useMessage() //
@ -205,7 +205,7 @@ const open = async (type: string, id?: number) => {
userOptions.value = await UserApi.getSimpleUserList()
//
if (formType.value === 'create') {
formData.value.ownerUserId = useUserStore().getUser.id
formData.value.ownerUserId = getCurrentUserId()
}
}
defineExpose({ open }) // open

View File

@ -177,7 +177,7 @@ import * as UserApi from '@/api/system/user'
import * as CustomerApi from '@/api/crm/customer'
import * as AreaApi from '@/api/system/area'
import { defaultProps } from '@/utils/tree'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
const { t } = useI18n() //
const message = useMessage() //
@ -252,7 +252,7 @@ const open = async (type: string, id?: number, customerId?: number, businessId?:
userOptions.value = await UserApi.getSimpleUserList()
//
if (formType.value === 'create') {
formData.value.ownerUserId = useUserStore().getUser.id
formData.value.ownerUserId = getCurrentUserId()
}
}
defineExpose({ open }) // open

View File

@ -200,7 +200,7 @@ import * as UserApi from '@/api/system/user'
import * as ContactApi from '@/api/crm/contact'
import * as BusinessApi from '@/api/crm/business'
import { erpPriceMultiply, erpPriceInputFormatter } from '@/utils'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import ContractProductForm from '@/views/crm/contract/components/ContractProductForm.vue'
const { t } = useI18n() //
@ -284,7 +284,7 @@ const open = async (type: string, id?: number) => {
userOptions.value = await UserApi.getSimpleUserList()
//
if (formType.value === 'create') {
formData.value.ownerUserId = useUserStore().getUser.id
formData.value.ownerUserId = getCurrentUserId()
}
//
contactList.value = await ContactApi.getSimpleContactList()

View File

@ -150,7 +150,7 @@ import * as CustomerApi from '@/api/crm/customer'
import * as AreaApi from '@/api/system/area'
import { defaultProps } from '@/utils/tree'
import * as UserApi from '@/api/system/user'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
const { t } = useI18n() //
const message = useMessage() //
@ -205,7 +205,7 @@ const open = async (type: string, id?: number) => {
userOptions.value = await UserApi.getSimpleUserList()
//
if (formType.value === 'create') {
formData.value.ownerUserId = useUserStore().getUser.id
formData.value.ownerUserId = getCurrentUserId()
}
}
defineExpose({ open }) // open

View File

@ -54,7 +54,7 @@ import * as CustomerApi from '@/api/crm/customer'
import download from '@/utils/download'
import type { UploadUserFile } from 'element-plus'
import * as UserApi from '@/api/system/user'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
defineOptions({ name: 'CrmCustomerImportForm' })
@ -74,7 +74,7 @@ const open = async () => {
await resetForm()
//
userOptions.value = await UserApi.getSimpleUserList()
ownerUserId.value = useUserStore().getUser.id
ownerUserId.value = getCurrentUserId()
}
defineExpose({ open }) // open

View File

@ -46,7 +46,7 @@
import { dateFormatter } from '@/utils/formatTime'
import { ElTable } from 'element-plus'
import * as PermissionApi from '@/api/crm/permission'
import { useUserStoreWithOut } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import CrmPermissionForm from './PermissionForm.vue'
import { DICT_TYPE } from '@/utils/dict'
@ -64,7 +64,6 @@ const list = ref<PermissionApi.PermissionVO[]>([]) // 列表的数据
const formData = ref({
ownerUserId: 0
})
const userStore = useUserStoreWithOut() //
/** 查询列表 */
const getList = async () => {
@ -75,13 +74,14 @@ const getList = async () => {
bizId: props.bizId
})
list.value = data
const currentUserId = getCurrentUserId()
const permission = list.value.find(
(item) =>
item.userId === userStore.getUser.id &&
item.userId === currentUserId &&
item.level === PermissionApi.PermissionLevelEnum.OWNER
)
if (permission) {
formData.value.ownerUserId = userStore.getUser.id
formData.value.ownerUserId = currentUserId
}
} finally {
loading.value = false
@ -150,7 +150,7 @@ watch(
)
validateOwnerUser.value = false
validateWrite.value = false
const userId = userStore.getUser?.id
const userId = getCurrentUserId()
list.value
.filter((item) => item.userId === userId)
.forEach((item) => {
@ -176,15 +176,16 @@ const emits = defineEmits<{
}>()
/** 退出团队 */
const handleQuit = async () => {
const currentUserId = getCurrentUserId()
const permission = list.value.find(
(item) =>
item.userId === userStore.getUser.id && item.level === PermissionApi.PermissionLevelEnum.OWNER
item.userId === currentUserId && item.level === PermissionApi.PermissionLevelEnum.OWNER
)
if (permission) {
message.warning('负责人不能退出团队!')
return
}
const userPermission = list.value.find((item) => item.userId === userStore.getUser.id)
const userPermission = list.value.find((item) => item.userId === currentUserId)
if (!userPermission) {
return
}

View File

@ -103,7 +103,7 @@ import * as ProductApi from '@/api/crm/product'
import * as ProductCategoryApi from '@/api/crm/product/category'
import { defaultProps, handleTree } from '@/utils/tree'
import { getSimpleUserList, UserVO } from '@/api/system/user'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
defineOptions({ name: 'CrmProductForm' })
@ -114,7 +114,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const userId = useUserStore().getUser.id //
const userId = getCurrentUserId() //
const formData = ref({
id: undefined,
name: undefined,

View File

@ -150,7 +150,7 @@ import { ReceivableVO } from '@/api/crm/receivable'
import * as UserApi from '@/api/system/user'
import * as CustomerApi from '@/api/crm/customer'
import * as ContractApi from '@/api/crm/contract'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
const { t } = useI18n() //
@ -200,7 +200,7 @@ const open = async (
customerList.value = await CustomerApi.getCustomerSimpleList()
//
if (formType.value === 'create') {
formData.value.ownerUserId = useUserStore().getUser.id
formData.value.ownerUserId = getCurrentUserId()
}
//
if (receivablePlan) {

View File

@ -135,7 +135,7 @@ import * as ReceivablePlanApi from '@/api/crm/receivable/plan'
import * as UserApi from '@/api/system/user'
import * as CustomerApi from '@/api/crm/customer'
import * as ContractApi from '@/api/crm/contract'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { cloneDeep } from 'lodash-es'
@ -182,7 +182,7 @@ const open = async (type: string, id?: number, customerId?: number, contractId?:
customerList.value = await CustomerApi.getCustomerSimpleList()
//
if (formType.value === 'create') {
formData.value.ownerUserId = useUserStore().getUser.id
formData.value.ownerUserId = getCurrentUserId()
}
// customerId contractId
if (customerId) {

View File

@ -134,7 +134,7 @@ import { useUserStore } from '@/store/modules/user'
import UserAvatar from '../user/UserAvatar.vue'
import { useFriendStore } from '../../store/friendStore'
import { getCurrentUserId } from '../../../utils/user'
import { getCurrentUserId } from '@/utils/auth'
import { ImFriendAddSource } from '../../../utils/constants'
import { getGenderColor, getGenderIcon } from '../../../utils/user'
import { getSimpleUserListByNickname, type UserVO } from '@/api/system/user'

View File

@ -49,7 +49,7 @@ import { computed, ref, watch } from 'vue'
import GroupAvatar from './GroupAvatar.vue'
import GroupMemberGrid from './GroupMemberGrid.vue'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { CommonStatusEnum } from '@/utils/constants'
import { useFriendStore } from '../../store/friendStore'
import { useGroupStore } from '../../store/groupStore'
@ -70,7 +70,6 @@ const emit = defineEmits<{
apply: [group: GroupLite]
}>()
const userStore = useUserStore()
const groupStore = useGroupStore()
const friendStore = useFriendStore()
@ -91,7 +90,7 @@ const isMember = computed(() => {
return false
}
if (cached.membersLoaded && cached.members) {
const myId = Number(userStore.getUser?.id) || 0
const myId = getCurrentUserId()
return cached.members.some(
(m) => m.userId === myId && m.status === CommonStatusEnum.ENABLE
)

View File

@ -37,7 +37,7 @@ import { CommonStatusEnum } from '@/utils/constants'
import { inviteGroupMember } from '@/api/im/group/member'
import { useFriendStore } from '../../store/friendStore'
import { useGroupStore } from '../../store/groupStore'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { ImGroupMemberRole } from '@/views/im/utils/constants'
import { GROUP_MAX_MEMBER } from '@/views/im/utils/config'
import FriendPickerPanel from '../picker/FriendPickerPanel.vue'
@ -53,7 +53,6 @@ const emit = defineEmits<{
const message = useMessage()
const friendStore = useFriendStore()
const groupStore = useGroupStore()
const userStore = useUserStore()
const visible = ref(false)
const submitting = ref(false)
@ -99,7 +98,7 @@ const willGoApproval = computed(() => {
if (!group?.joinApproval) {
return false
}
const myId = Number(userStore.getUser?.id) || 0
const myId = getCurrentUserId()
if (!myId) {
return false
}

View File

@ -77,7 +77,7 @@ import {
ImConversationType
} from '@/views/im/utils/constants'
import { RTC_NO_ANSWER_CALL_CHECK_INTERVAL_MS } from '@/views/im/utils/config'
import { getCurrentUserId } from '@/views/im/utils/user'
import { getCurrentUserId } from '@/utils/auth'
import { getSenderAvatar, getSenderDisplayName } from '@/views/im/utils/user'
import { Track } from 'livekit-client'
import RtcCallInviting from './RtcCallInviting.vue'

View File

@ -28,7 +28,7 @@
<script lang="ts" setup>
import { computed, ref } from 'vue'
import { useGroupStore } from '../../store/groupStore'
import { getCurrentUserId } from '@/views/im/utils/user'
import { getCurrentUserId } from '@/utils/auth'
import GroupMemberPickerPanel from '../picker/GroupMemberPickerPanel.vue'
import type { GroupMemberLite } from '../group/GroupMember.vue'

View File

@ -70,7 +70,7 @@ import { useRtcStore } from '../../store/rtcStore'
import { useGroupCallMembers } from '../../composables/useGroupCallMembers'
import { joinCall, getActiveCall } from '@/api/im/rtc'
import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import { getCurrentUserId } from '@/views/im/utils/user'
import { getCurrentUserId } from '@/utils/auth'
const props = defineProps<{
groupId: number

View File

@ -31,7 +31,7 @@
import { computed, onMounted, onUnmounted } from 'vue'
import { useRouter } from 'vue-router'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { useImUiStore } from '../../store/uiStore'
import { useConversationStore } from '../../store/conversationStore'
import { useFriendStore } from '../../store/friendStore'
@ -44,14 +44,13 @@ defineOptions({ name: 'ImUserInfoCard' })
const uiStore = useImUiStore()
const conversationStore = useConversationStore()
const friendStore = useFriendStore()
const userStore = useUserStore()
const router = useRouter()
const card = computed(() => uiStore.userInfoCard)
const user = computed(() => card.value.user)
const isSelf = computed(() => {
const myId = Number(userStore.getUser?.id) || 0
const myId = getCurrentUserId()
return !!user.value?.id && user.value.id === myId
})
const isActiveFriend = computed(() => {

View File

@ -1,5 +1,5 @@
import { updateFile } from '@/api/infra/file'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { useMessage } from '@/hooks/web/useMessage'
import { isOpenableUrl } from '@/utils/url'
@ -157,7 +157,6 @@ export function ensureMediaSizeWithinLimit(
export const useMediaUploader = () => {
const conversationStore = useConversationStore()
const messageStore = useMessageStore()
const userStore = useUserStore()
const muteOverlay = useMuteOverlay()
const message = useMessage()
const { sendRaw } = useMessageSender()
@ -193,7 +192,7 @@ export const useMediaUploader = () => {
content: opts.buildContent(blobUrl),
status: ImMessageStatus.SENDING,
sendTime: Date.now(),
senderId: Number(userStore.getUser?.id) || 0,
senderId: getCurrentUserId(),
targetId: conversation.targetId,
selfSend: true,
uploadProgress: 0,

View File

@ -32,7 +32,7 @@ import {
} from '../../utils/config'
import { buildChannelConversationStub } from '../../utils/channel'
import { generateClientMessageId, getPrivateMessagePeerId } from '../../utils/message'
import { getCurrentUserId } from '../../utils/user'
import { getCurrentUserId } from '@/utils/auth'
import type { Message } from '../types'
/**

View File

@ -23,7 +23,7 @@ import { ImMessageType, ImMessageStatus, ImConversationType } from '../../utils/
import { MESSAGE_PRIVATE_READ_ENABLED, MESSAGE_GROUP_READ_ENABLED } from '../../utils/config'
import { getClientConversationId } from '../../utils/db'
import type { Conversation, Message } from '../types'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
/** 非文本消息的扩展选项(通用) */
interface SendExtOptions {
@ -60,7 +60,6 @@ interface SendExtOptions {
export const useMessageSender = () => {
const conversationStore = useConversationStore()
const messageStore = useMessageStore()
const userStore = useUserStore()
/** 构造本地乐观消息对象 */
const buildLocalMessage = (opts: {
@ -76,7 +75,7 @@ export const useMessageSender = () => {
content: opts.content,
status: ImMessageStatus.SENDING,
sendTime: Date.now(),
senderId: Number(userStore.getUser?.id) || 0,
senderId: getCurrentUserId(),
targetId: opts.targetId,
selfSend: true,
atUserIds: opts.atUserIds

View File

@ -1,6 +1,6 @@
import { computed, onScopeDispose, ref, type ComputedRef } from 'vue'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { useConversationStore } from '../store/conversationStore'
import { useGroupStore } from '../store/groupStore'
import { ImConversationType, ImGroupMemberRole } from '../../utils/constants'
@ -47,7 +47,6 @@ function unsubscribeNowTick(): void {
export function useMuteOverlay(): ComputedRef<MuteOverlayInfo | null> {
const conversationStore = useConversationStore()
const groupStore = useGroupStore()
const userStore = useUserStore()
// 订阅模块级 tickscope 销毁时反订阅,最后一个订阅者退场后 timer 也跟着清
subscribeNowTick()
@ -62,7 +61,7 @@ export function useMuteOverlay(): ComputedRef<MuteOverlayInfo | null> {
if (!group) {
return null
}
const myId = Number(userStore.getUser?.id) || 0
const myId = getCurrentUserId()
// 群封禁:管理后台操作,所有人不可发送
if (group.banned) {
return { text: '该群已被管理员封禁,无法发送消息', icon: 'ant-design:stop-outlined' }

View File

@ -88,7 +88,7 @@ import { ElMessageBox } from 'element-plus'
import UserAvatar from '../../components/user/UserAvatar.vue'
import UserInfo from '../../components/user/UserInfo.vue'
import { useFriendStore } from '../../store/friendStore'
import { getCurrentUserId } from '../../../utils/user'
import { getCurrentUserId } from '@/utils/auth'
import { ImFriendRequestHandleResult } from '../../../utils/constants'
import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import type { FriendRequest, User } from '../../types'

View File

@ -79,7 +79,7 @@ import { computed, ref } from 'vue'
import Icon from '@/components/Icon/src/Icon.vue'
import UserAvatar from '../../components/user/UserAvatar.vue'
import { useFriendStore } from '../../store/friendStore'
import { getCurrentUserId } from '../../../utils/user'
import { getCurrentUserId } from '@/utils/auth'
import { DICT_TYPE, getDictLabel } from '@/utils/dict'
import type { FriendRequest } from '../../types'

View File

@ -391,7 +391,7 @@ import { computed, ref, watch } from 'vue'
import Icon from '@/components/Icon/src/Icon.vue'
import { useMessage } from '@/hooks/web/useMessage'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { CommonStatusEnum } from '@/utils/constants'
import {
updateGroup,
@ -436,7 +436,6 @@ const emit = defineEmits<{
'open-history': [] // "" MessageHistory
}>()
const userStore = useUserStore()
const conversationStore = useConversationStore()
const groupStore = useGroupStore()
const message = useMessage()
@ -461,7 +460,7 @@ function handleOpenInvite() {
inviteDialogRef.value?.open({ groupId: props.group.id })
}
const myId = computed(() => Number(userStore.getUser?.id) || 0)
const myId = computed(() => getCurrentUserId())
const isOwner = computed(() => props.group != null && props.group.ownerId === myId.value)
/** 当前用户在群里的角色(来自 props.members 的 me 行);用于判定是否可移出他人 */
const myRole = computed(() => props.members.find((m) => m.userId === myId.value)?.role)

View File

@ -65,7 +65,7 @@ import { computed, ref, useTemplateRef, watch } from 'vue'
import { ElScrollbar } from 'element-plus'
import Icon from '@/components/Icon/src/Icon.vue'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { CommonStatusEnum } from '@/utils/constants'
import { IM_AT_ALL_NICKNAME, IM_AT_ALL_USER_ID } from '@/views/im/utils/constants'
import GroupMember, { type GroupMemberLite } from '../../../../components/group/GroupMember.vue'
@ -92,12 +92,11 @@ const emit = defineEmits<{
select: [member: GroupMemberLite]
}>()
const userStore = useUserStore()
const scrollRef = useTemplateRef<InstanceType<typeof ElScrollbar>>('scrollRef')
const activeIdx = ref(0)
/** 当前登录用户 id成员列表过滤掉自己 */
const selfUserId = computed(() => Number(userStore.getUser?.id) || 0)
const selfUserId = computed(() => getCurrentUserId())
/**
* 虚拟"所有人"群主 / 管理员canAtAll=true+ 关键字命中"所有人"前缀时存在

View File

@ -169,7 +169,7 @@ import { useGroupStore } from '@/views/im/home/store/groupStore'
import { useFriendStore } from '@/views/im/home/store/friendStore'
import { getMemberDisplayName } from '@/views/im/utils/user'
import { useMessage } from '@/hooks/web/useMessage'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { useMessageSender } from '@/views/im/home/composables/useMessageSender'
import {
ensureMediaSizeWithinLimit,
@ -199,7 +199,6 @@ defineOptions({ name: 'ImMessageInput' })
const conversationStore = useConversationStore()
const groupStore = useGroupStore()
const friendStore = useFriendStore()
const userStore = useUserStore()
const message = useMessage()
const { send, sendRaw } = useMessageSender()
const {
@ -654,7 +653,7 @@ const canAtAll = computed<boolean>(() => {
if (!group) {
return false
}
const myId = Number(userStore.getUser?.id) || 0
const myId = getCurrentUserId()
if (!myId) {
return false
}

View File

@ -81,7 +81,7 @@ import { ImConversationType, ImGroupMemberRole } from '@/views/im/utils/constant
import { unpinGroupMessage as apiUnpinGroupMessage } from '@/api/im/group'
import { getSenderDisplayName } from '@/views/im/utils/user'
import { resolveConversationLastContent } from '@/views/im/utils/conversation'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { useGroupStore } from '../../../../store/groupStore'
import type { Message } from '../../../../types'
@ -97,7 +97,6 @@ const emit = defineEmits<{
locate: [messageId: number]
}>()
const userStore = useUserStore()
const groupStore = useGroupStore()
const message = useMessage()
@ -124,7 +123,7 @@ const latest = computed(() => pinnedMessages.value[pinnedMessages.value.length -
/** 当前用户是否群主 / 管理员(决定是否显示「移除」入口) */
const canManage = computed(() => {
const myId = Number(userStore.getUser?.id) || 0
const myId = getCurrentUserId()
const role = group.value?.members?.find((m) => m.userId === myId)?.role
return role === ImGroupMemberRole.OWNER || role === ImGroupMemberRole.ADMIN
})

View File

@ -34,7 +34,7 @@
<script lang="ts" setup>
import { computed, ref } from 'vue'
import Icon from '@/components/Icon/src/Icon.vue'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { ImGroupMemberRole } from '@/views/im/utils/constants'
import { useGroupStore } from '../../../../store/groupStore'
@ -47,7 +47,6 @@ const props = defineProps<{
groupId: number
}>()
const userStore = useUserStore()
const groupStore = useGroupStore()
const groupRequestStore = useGroupRequestStore()
@ -64,7 +63,7 @@ const group = computed(() => groupStore.getGroup(props.groupId))
/** 当前用户在群里的角色;优先用 group.members懒加载未到时回退到 ownerUserId 直判 */
const myRole = computed(() => {
const myId = Number(userStore.getUser?.id) || 0
const myId = getCurrentUserId()
if (group.value?.ownerUserId === myId) {
return ImGroupMemberRole.OWNER
}

View File

@ -38,7 +38,7 @@
:class="{ 'flex-row-reverse': message.selfSend }"
>
<UserAvatar
:id="message.selfSend ? userStore.getUser?.id : message.senderId"
:id="message.selfSend ? getCurrentUserId() : message.senderId"
:name="senderRealNickname"
:url="message.selfSend ? userStore.getUser?.avatar : senderAvatar"
:size="36"
@ -95,7 +95,7 @@
<!-- 头像点击弹 UserInfoCard UserAvatar 内部承接频道素材消息不显示头像 -->
<UserAvatar
v-if="!isMaterial"
:id="message.selfSend ? userStore.getUser?.id : message.senderId"
:id="message.selfSend ? getCurrentUserId() : message.senderId"
:name="senderRealNickname"
:url="message.selfSend ? userStore.getUser?.avatar : senderAvatar"
:size="36"
@ -232,6 +232,7 @@ import {
import { buildRecallTipSegments } from '@/views/im/utils/conversation'
import { formatTimeTip } from '@/views/im/utils/time'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { useConversationStore } from '../../../../store/conversationStore'
import { useGroupStore } from '../../../../store/groupStore'
import { useFriendStore } from '../../../../store/friendStore'
@ -573,7 +574,7 @@ const groupMembersForReadStatus = computed<GroupMemberLite[]>(() => {
/** 是否 @我(群消息展示小徽标) */
const isAtMe = computed(() => {
const myId = Number(userStore.getUser?.id) || 0
const myId = getCurrentUserId()
if (!myId) {
return false
}
@ -804,7 +805,7 @@ const currentGroup = computed(() => {
/** 当前用户在该群里的角色;私聊或非群成员 → undefined */
const myGroupRole = computed(() => {
const myId = Number(userStore.getUser?.id) || 0
const myId = getCurrentUserId()
return currentGroup.value?.members?.find((m) => m.userId === myId)?.role
})

View File

@ -72,7 +72,7 @@ export const useChannelStore = defineStore('imChannelStore', {
}
},
/** 用最新的频道信息覆盖已有 CHANNEL 会话的 name / avatarconversationStore 持久化的旧占位被刷掉 */
/** 用最新的频道信息覆盖已有 CHANNEL 会话的 name / avatar */
syncChannelConversationMetadata() {
const conversationStore = useConversationStore()
const indexed = new Map(this.channels.map((c) => [c.id, c]))
@ -84,12 +84,10 @@ export const useChannelStore = defineStore('imChannelStore', {
if (!channel) {
return
}
if (channel.name) {
conversation.name = channel.name
}
if (channel.avatar) {
conversation.avatar = channel.avatar
}
conversationStore.updateConversation(ImConversationType.CHANNEL, conversation.targetId, {
name: channel.name,
avatar: channel.avatar
})
})
},

View File

@ -5,7 +5,7 @@ import { store } from '@/store'
import { CONVERSATION_RECENT_FORWARD_MAX } from '../../utils/config'
import { ImConversationType } from '../../utils/constants'
import { getClientConversationId, getDb, StorageKeys, type DbTransaction } from '../../utils/db'
import { getCurrentUserId } from '../../utils/user'
import { getCurrentUserId } from '@/utils/auth'
import { useMessageStore } from './messageStore'
import type { Conversation, ConversationDO } from '../types'

View File

@ -24,7 +24,7 @@ import { useConversationStore } from './conversationStore'
import { ImConversationType, ImFriendRequestHandleResult } from '../../utils/constants'
import { FRIEND_REQUEST_PAGE_SIZE } from '../../utils/config'
import { getDb } from '../../utils/db'
import { getCurrentUserId } from '../../utils/user'
import { getCurrentUserId } from '@/utils/auth'
import { getFriendDisplayName } from '../../utils/user'
import type { Friend, FriendDO, FriendLite, FriendRequest, FriendRequestDO } from '../types'

View File

@ -22,7 +22,7 @@ import {
} from '../../utils/constants'
import { CommonStatusEnum } from '@/utils/constants'
import { getDb } from '../../utils/db'
import { getCurrentUserId } from '../../utils/user'
import { getCurrentUserId } from '@/utils/auth'
import { getGroupDisplayName } from '../../utils/user'
import { type GroupNotificationPayload } from '../../utils/message'
import type { Group, GroupDO, GroupMember, GroupMemberDO, Message } from '../types'

View File

@ -25,7 +25,7 @@ import {
revokeBlobUrlsInContent
} from '../../utils/message'
import { resolveConversationLastContent } from '../../utils/conversation'
import { getCurrentUserId } from '../../utils/user'
import { getCurrentUserId } from '@/utils/auth'
import { tryGetSenderDisplayName } from '../../utils/user'
import { useGroupStore } from './groupStore'
import { useConversationStore } from './conversationStore'

View File

@ -10,7 +10,7 @@ import {
type ImRtcParticipantStatusValue,
type ImRtcCallStageValue
} from '../../utils/constants'
import { getCurrentUserId } from '../../utils/user'
import { getCurrentUserId } from '@/utils/auth'
import { useFriendStore } from './friendStore'
import { useGroupStore } from './groupStore'

View File

@ -1,7 +1,6 @@
import { defineStore, acceptHMRUpdate } from 'pinia'
import { store } from '@/store'
import { getRefreshToken } from '@/utils/auth'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId, getRefreshToken } from '@/utils/auth'
import {
ImWebSocketMessageType,
@ -476,9 +475,8 @@ export const useImWebSocketStore = defineStore('imWebSocketStore', {
*/
handlePrivateMessage(websocketMessage: ImPrivateMessageDTO) {
const conversationStore = useConversationStore()
const userStore = useUserStore()
const friendStore = useFriendStore()
const currentUserId = Number(userStore.getUser?.id) || 0
const currentUserId = getCurrentUserId()
// 0. 防御层senderId / receiverId 均不含当前用户的私聊帧直接丢弃,避免后端路由 / 多端串号污染会话
// FRIEND_* 等系统通知也走这条通道,但 fromUserId=senderId、toUserId=receiverId 仍是当前用户视角)
@ -603,9 +601,8 @@ export const useImWebSocketStore = defineStore('imWebSocketStore', {
*/
handleGroupMessage(websocketMessage: ImGroupMessageDTO) {
const conversationStore = useConversationStore()
const userStore = useUserStore()
const groupStore = useGroupStore()
const currentUserId = Number(userStore.getUser?.id) || 0
const currentUserId = getCurrentUserId()
const selfSend = websocketMessage.senderId === currentUserId
// 0. 防御层:定向群消息 receiverUserIds 非空且未包含当前用户时丢弃
@ -723,8 +720,7 @@ export const useImWebSocketStore = defineStore('imWebSocketStore', {
* becomeFriends payloadpayload.friendUserId toUserId sender / receiver
*/
computeFriendPeerId(frame: ImPrivateMessageDTO): number {
const userStore = useUserStore()
const currentUserId = Number(userStore.getUser?.id) || 0
const currentUserId = getCurrentUserId()
return getPrivateMessagePeerId(frame, currentUserId)
},

View File

@ -1,6 +1,6 @@
import { toRaw } from 'vue'
import { getCurrentUserId } from './user'
import { getCurrentUserId } from '@/utils/auth'
import { ImConversationType } from './constants'
import type { MessageDO, SettingDO } from '../home/types'

View File

@ -6,7 +6,7 @@ import {
ImMessageType,
type ImConversationTypeValue
} from './constants'
import { getCurrentUserId } from './user'
import { getCurrentUserId } from '@/utils/auth'
import { formatCallDuration } from './time'
import { useFriendStore } from '../home/store/friendStore'
import { useGroupStore } from '../home/store/groupStore'

View File

@ -11,7 +11,6 @@
import { countBy } from 'lodash-es'
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
import { useUserStore } from '@/store/modules/user'
import { SystemUserSexEnum } from '@/utils/constants'
import {
@ -20,6 +19,7 @@ import {
IM_AT_ALL_NICKNAME,
IM_AT_ALL_USER_ID
} from './constants'
import { getCurrentUserId } from '@/utils/auth'
import { type MentionCandidate } from './message'
import { useConversationStore } from '../home/store/conversationStore'
import { useFriendStore } from '../home/store/friendStore'
@ -31,13 +31,6 @@ import type { Conversation, Friend, Group, User } from '../home/types'
// MessageBubble 的 textSegments 才不会跟着无谓重算
const EMPTY_MENTIONS: MentionCandidate[] = []
/** 取当前登录用户编号 */
export function getCurrentUserId(): number {
const { wsCache } = useCache()
const user = wsCache.get(CACHE_KEY.USER)?.user
return Number(user?.id) || 0
}
/**
* >
*

View File

@ -228,7 +228,7 @@ import { TradeOrderSummaryRespVO } from '@/api/mall/trade/order'
import { DeliveryPickUpStoreVO } from '@/api/mall/trade/delivery/pickUpStore'
import OrderPickUpForm from '@/views/mall/trade/order/form/OrderPickUpForm.vue'
import { ref, onMounted } from 'vue'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
const message = useMessage() //
const port = ref('')
@ -319,7 +319,7 @@ const pickUpStoreList = ref<DeliveryPickUpStoreVO[]>([])
const getPickUpStoreList = async () => {
pickUpStoreList.value = await PickUpStoreApi.getSimpleDeliveryPickUpStoreList()
//
const userId = useUserStore().getUser.id
const userId = getCurrentUserId()
pickUpStoreList.value = pickUpStoreList.value.filter((item) =>
item.verifyUserIds?.includes(userId)
)

View File

@ -76,7 +76,7 @@ import DvMachinerySelect from '@/views/mes/dv/machinery/components/DvMachinerySe
import DvCheckPlanSelect from '@/views/mes/dv/checkplan/components/DvCheckPlanSelect.vue'
import UserSelectV2 from '@/views/system/user/components/UserSelectV2.vue'
import MaintenRecordLineList from './MaintenRecordLineList.vue'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import {
MesDvMaintenRecordStatusEnum,
MesDvSubjectTypeEnum,
@ -88,7 +88,6 @@ const emit = defineEmits(['success'])
const message = useMessage() //
const { t } = useI18n() //
const userStore = useUserStore()
const dialogVisible = ref(false) //
const formLoading = ref(false) //
@ -135,7 +134,7 @@ const open = async (type: string, id?: number) => {
}
//
if (type === 'create') {
formData.value.userId = userStore.getUser.id
formData.value.userId = getCurrentUserId()
}
//
originalFormData.value = JSON.stringify(formData.value)

View File

@ -118,7 +118,7 @@
import { ProAndonRecordApi } from '@/api/mes/pro/andon/record'
import { ProAndonConfigVO } from '@/api/mes/pro/andon/config'
import { DICT_TYPE } from '@/utils/dict'
import { useUserStoreWithOut } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import { formatDate } from '@/utils/formatTime'
import { MesProAndonStatusEnum, MesProWorkOrderStatusEnum } from '@/views/mes/utils/constants'
import MdWorkstationSelect from '@/views/mes/md/workstation/components/MdWorkstationSelect.vue'
@ -148,7 +148,6 @@ const createRules = reactive({
workstationId: [{ required: true, message: '工作站不能为空', trigger: 'change' }],
configId: [{ required: true, message: '呼叫原因不能为空', trigger: 'change' }]
})
const userStore = useUserStoreWithOut()
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
@ -157,7 +156,7 @@ const open = async (type: string, id?: number) => {
resetForm()
if (type === 'create') {
//
formData.value.userId = userStore.getUser?.id
formData.value.userId = getCurrentUserId()
} else {
// /
formLoading.value = true
@ -169,7 +168,7 @@ const open = async (type: string, id?: number) => {
formData.value.handleTime = formatDate(new Date())
}
if (!formData.value.handlerUserId) {
formData.value.handlerUserId = userStore.getUser?.id
formData.value.handlerUserId = getCurrentUserId()
}
}
} finally {

View File

@ -298,7 +298,7 @@ import MdWorkstationSelect from '@/views/mes/md/workstation/components/MdWorksta
import UserSelectV2 from '@/views/system/user/components/UserSelectV2.vue'
import ItemConsumeList from './ItemConsumeList.vue'
import ProductProduceList from './ProductProduceList.vue'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
import {
MesAutoCodeRuleCode,
MesProFeedbackStatusEnum,
@ -484,7 +484,7 @@ const open = async (type: string, id?: number) => {
}
} else {
//
formData.value.feedbackUserId = useUserStore().getUser.id
formData.value.feedbackUserId = getCurrentUserId()
formData.value.feedbackTime = new Date()
//
await generateCode()

View File

@ -212,13 +212,13 @@ import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
import UserSelectV2 from '@/views/system/user/components/UserSelectV2.vue'
import FeedbackForm from './FeedbackForm.vue'
import { MesProFeedbackStatusEnum } from '@/views/mes/utils/constants'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
defineOptions({ name: 'MesProFeedback' })
const message = useMessage() //
const { t } = useI18n() //
const currentUserId = useUserStore().getUser.id // ID
const currentUserId = getCurrentUserId() // ID
const loading = ref(true) //
const list = ref<ProFeedbackVO[]>([]) //

View File

@ -163,7 +163,7 @@ import {
MesWmStockTakingTypeEnum,
MesWmStockTakingTaskStatusEnum
} from '@/views/mes/utils/constants'
import { useUserStore } from '@/store/modules/user'
import { getCurrentUserId } from '@/utils/auth'
defineOptions({ name: 'StockTakingForm' })
@ -258,7 +258,7 @@ const open = async (type: string, id?: number) => {
}
} else {
//
formData.value.userId = useUserStore().getUser.id
formData.value.userId = getCurrentUserId()
}
//
originalFormData.value = JSON.stringify(formData.value)