Initial commit: 91dj android client dev_1.0.0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
谢宇宁
2026-10-08 11:37:25 +07:00
co-authored by Claude Opus 5.5
commit 97dd6a739a
1262 changed files with 119813 additions and 0 deletions
@@ -0,0 +1,86 @@
// ignore: avoid_web_libraries_in_flutter
import 'dart:html' as html;
/// Web 端设备信息:浏览器无法稳定获取品牌/型号,系统名和版本从 UA 解析。
Future<void> initializeDeviceInfo() async {}
String getDeviceType() {
try {
final ua = html.window.navigator.userAgent;
if (ua.contains('iPhone') || ua.contains('iPad') || ua.contains('iPod')) {
return 'iOS';
}
if (ua.contains('Android')) return 'Android';
} catch (_) {}
return 'PC';
}
String getSystemName() => _osInfo().name;
String getSystemVersion() => _osInfo().version;
String getDeviceBrand() => '';
String getDeviceModel() => '';
String getUserAgent() {
try {
return html.window.navigator.userAgent;
} catch (_) {
return '';
}
}
_OsInfo _osInfo() {
try {
return _parseOsInfo(html.window.navigator.userAgent);
} catch (_) {
return const _OsInfo('', '');
}
}
_OsInfo _parseOsInfo(String ua) {
if (ua.contains('iPhone') || ua.contains('iPad') || ua.contains('iPod')) {
final match =
RegExp(r'(?:CPU (?:iPhone )?OS|iPhone OS) ([\d_]+)').firstMatch(ua);
if (match != null) {
return _OsInfo('iOS', _normalizeVersion(match.group(1)));
}
return const _OsInfo('iOS', '');
}
if (ua.contains('Android')) {
final match = RegExp(r'Android ([\d.]+)').firstMatch(ua);
if (match != null) return _OsInfo('Android', match.group(1) ?? '');
return const _OsInfo('Android', '');
}
final macMatch = RegExp(r'Mac OS X ([^;)]+)').firstMatch(ua);
if (macMatch != null) {
return _OsInfo('macOS', _normalizeVersion(macMatch.group(1)));
}
final windowsMatch = RegExp(r'Windows NT ([\d.]+)').firstMatch(ua);
if (windowsMatch != null) {
return _OsInfo('Windows', windowsMatch.group(1) ?? '');
}
final chromeOsMatch = RegExp(r'CrOS [^ ]+ ([\d.]+)').firstMatch(ua);
if (chromeOsMatch != null) {
return _OsInfo('ChromeOS', chromeOsMatch.group(1) ?? '');
}
if (ua.contains('Linux')) return const _OsInfo('Linux', '');
return const _OsInfo('', '');
}
String _normalizeVersion(String? version) {
return (version ?? '').replaceAll('_', '.').trim();
}
class _OsInfo {
final String name;
final String version;
const _OsInfo(this.name, this.version);
}