/** * 移动端检测工具函数(服务端) * 通过 User-Agent 判断设备类型 */ // 移动端 User-Agent 关键词 const MOBILE_UA_KEYWORDS = [ 'Mobile', 'Android', 'iPhone', 'iPad', 'iPod', 'BlackBerry', 'Windows Phone', 'Opera Mini', 'IEMobile', 'webOS', 'Kindle', 'Silk', 'UCBrowser', 'MiuiBrowser', 'HuaweiBrowser', 'VivoBrowser', 'OppoBrowser' ]; // 平板设备关键词(可能需要区分对待) const TABLET_UA_KEYWORDS = [ 'iPad', 'Tablet', 'PlayBook', 'Silk' ]; /** * 检测请求是否来自移动端设备 * @param request - HTTP 请求对象 * @returns true 表示移动端设备(包括平板) */ export function isMobileDevice(request: Request): boolean { const userAgent = request.headers.get('User-Agent') || ''; // 检查是否包含移动端关键词 return MOBILE_UA_KEYWORDS.some(keyword => userAgent.toLowerCase().includes(keyword.toLowerCase()) ); } /** * 检测请求是否来自平板设备 * @param request - HTTP 请求对象 * @returns true 表示平板设备 */ export function isTabletDevice(request: Request): boolean { const userAgent = request.headers.get('User-Agent') || ''; return TABLET_UA_KEYWORDS.some(keyword => userAgent.toLowerCase().includes(keyword.toLowerCase()) ); } /** * 检测请求是否来自手机设备(排除平板) * @param request - HTTP 请求对象 * @returns true 表示手机设备 */ export function isPhoneDevice(request: Request): boolean { return isMobileDevice(request) && !isTabletDevice(request); } /** * 获取设备类型 * @param request - HTTP 请求对象 * @returns 'mobile' | 'tablet' | 'desktop' */ export function getDeviceType(request: Request): 'mobile' | 'tablet' | 'desktop' { if (isTabletDevice(request)) { return 'tablet'; } if (isMobileDevice(request)) { return 'mobile'; } return 'desktop'; } // 移动端用户专属的聊天页面路径 export const MOBILE_CHAT_PATH = '/chat-with-llm/chat'; // 移动端允许访问的路径(白名单) export const MOBILE_ALLOWED_PATHS = [ '/chat-with-llm/chat', '/login', '/callback', '/favicon.ico' ]; /** * 检查路径是否为移动端允许访问的路径 * @param pathname - 当前访问的路径 * @returns true 表示允许访问 */ export function isMobileAllowedPath(pathname: string): boolean { return MOBILE_ALLOWED_PATHS.some(path => pathname === path || pathname.startsWith(path + '/') ); }