front/src/utils/jwt.ts
zzh c6a4484448 feat: 查价价卡展示贸易条款与产品分组,并优化 H5/登录与顾问体验
销售产品可配置 DDP/DDU;查价返回分组与贸易条款并展示在价卡上。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-30 11:48:36 +08:00

46 lines
1.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { OmsLoginType } from '@/api/rbac'
/** 解析 JWT payload(不做签名校验,仅读取客户端声明) */
export function parseJwtPayload(token: string): Record<string, unknown> | null {
const raw = token.startsWith('Bearer ') ? token.slice(7) : token
const parts = raw.split('.')
if (parts.length < 2) return null
try {
const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/')
const padded = base64 + '='.repeat((4 - (base64.length % 4)) % 4)
const json = decodeURIComponent(
atob(padded)
.split('')
.map((c) => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`)
.join('')
)
return JSON.parse(json) as Record<string, unknown>
} catch {
return null
}
}
/** 从 access token 读取 RBAC mapId(user.userid,对应 t_customer.UserId) */
export function getMapIdFromAccessToken(token?: string | null): number | null {
if (!token) return null
const payload = parseJwtPayload(token)
if (!payload) return null
const raw = payload.mapId ?? payload.MapId
if (raw == null || raw === '') return null
const n = Number(raw)
return Number.isFinite(n) && n > 0 ? n : null
}
/** 从 access token 读取登录主体(claim: loginType,0=管理端 1=客户) */
export function getLoginTypeFromAccessToken(token?: string | null): OmsLoginType | null {
if (!token) return null
const payload = parseJwtPayload(token)
if (!payload) return null
const raw = payload.loginType ?? payload.LoginType
if (raw == null || raw === '') return null
const n = Number(raw)
if (n === OmsLoginType.Customer) return OmsLoginType.Customer
if (n === OmsLoginType.User) return OmsLoginType.User
return null
}