Files
leaudit-platform-frontend/app/utils/mobile-detect.server.ts
T
LiangShiyong 66d2f7cef4 1.添加移动端用户的检测工具类,移动端用户只能访问对话页面。
2.评查点列表添加文档属性类型字段。
3.优化dify的对话侧边栏的显示效果。
4.评查点规则添加使用文档属性类型的输入框。添加多实体开关的操作开关。
2025-12-30 18:35:48 +08:00

107 lines
2.4 KiB
TypeScript

/**
* 移动端检测工具函数(服务端)
* 通过 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 + '/')
);
}