053-678

Which are the two prerequisites before setting up Flashback Data Archive? (Choose two.)
A.Flash recovery area must be defined
B.Undo retention guarantee must be enabled.
C.Database must be running in archivelog mode.
D.Automatic undo management must be enabled.
E.The tablespace in which the Flashback Data Archive is created must have automatic segment space Management (ASSM).

此题的考点是 开启闪回数据归档的前提条件。
使用 CREATE FLASHBACK ARCHIVE 创建闪回数据归档需要指定:
1.闪回数据归档的名称
2. 闪回数据归档使用表空间的名称
3.在第一个表空间能使用的最大的空间大小,默认是无限制,除非第一个表空间也是无限制,否会出现
ORA-55621 错误
4.保留时间
5.11.2.0.4 可以使用 OPTIMIZE DATA,默认是 no OPTIMIZE DATA
闪回数据归档不是基于 undo 的,会将 undo 的数据,记录数据到表空间,所以不用配置 undo 保留担保,并且于归档与否无关,BC 错
A 明显错误,归档并不是存放在闪回恢复目录中,是存放在数据库表空间里。
D 正确,如果不启用自动段管理 AUM,在为一个表开启闪回数据归档的时候会出现 ORA-55614 错误。
E.正确,使用的表空间必须自动管理(ASSM 表空间)默认创建的表空间都是自动段管理的。
注:只有 sysdba 权限的用户才能制定 默认的闪回数据归档

转载于:https://www.cnblogs.com/Babylon/p/7839913.html

2025-09-02 12:50:44.729 678-713 USBOfflineUpdater com.kotei.overseas.navi I message: 拷贝 KVM_Navi_EU_148_1.zip: 220.0MB/3.0GB progress:10.42 2025-09-02 12:50:45.818 678-713 USBOfflineUpdater com.kotei.overseas.navi I message: 拷贝 KVM_Navi_EU_148_1.zip: 320.0MB/3.0GB progress:10.6 2025-09-02 12:50:46.825 678-713 USBOfflineUpdater com.kotei.overseas.navi I message: 拷贝 KVM_Navi_EU_148_1.zip: 420.0MB/3.0GB progress:10.79 2025-09-02 12:50:47.050 678-678 VRI[MainAc...y]@44606a7 com.kotei.overseas.navi I ViewPostIme pointer 0 2025-09-02 12:50:47.053 678-678 VRI[MainAc...y]@44606a7 com.kotei.overseas.navi I call setFrameRateCategory for touch hint category=high hint, reason=touch, vri=VRI[MainActivity]@44606a7 2025-09-02 12:50:47.088 678-678 VRI[MainAc...y]@44606a7 com.kotei.overseas.navi I onDisplayChanged oldDisplayState=2 newDisplayState=2 2025-09-02 12:50:47.176 678-678 VRI[MainAc...y]@44606a7 com.kotei.overseas.navi I ViewPostIme pointer 1 2025-09-02 12:50:47.177 678-678 USBOfflineUpdater com.kotei.overseas.navi I 触发取消按钮 2025-09-02 12:50:47.184 678-678 USBOfflineUpdater com.kotei.overseas.navi I 进入取消按钮对应回滚流程 2025-09-02 12:50:47.191 678-713 USBOfflineUpdater com.kotei.overseas.navi I resultCode: 8 message:用户取消更新 2025-09-02 12:50:47.191 678-713 USBOfflineUpdater com.kotei.overseas.navi I resultCode: 8 message:用户取消更新 2025-09-02 12:50:47.191 1360-3659 WindowManager system_server V Relayout Window{3c36352 u0 com.kotei.overseas.navi/com.kotei.overseas.navi.base.MainActivity}: viewVisibility=0 req=1920x1200 ty=1 d0 2025-09-02 12:50:47.191 678-678 BLASTBufferQueue_Java com.kotei.overseas.navi I update, w= 1920 h= 1200 mName = VRI[MainActivity]@44606a7 mNativeObject= 0xb400007ba47ef700 sc.mNativeObject= 0xb400007b43c3b8c0 format= -3 caller= android.view.ViewRootImpl.updateBlastSurfaceIfNeeded:3386 android.view.ViewRootImpl.relayoutWindow:11361 android.view.ViewRootImpl.performTraversals:4544 android.view.ViewRootImpl.doTraversal:3708 android.view.ViewRootImpl$TraversalRunnable.run:12542 android.view.Choreographer$CallbackRecord.run:1751 2025-09-02 12:50:47.191 678-678 VRI[MainAc...y]@44606a7 com.kotei.overseas.navi I Relayout returned: old=(0,0,1920,1200) new=(0,0,1920,1200) relayoutAsync=true req=(1920,1200)0 dur=0 res=0x0 s={true 0xb400007b444ec000} ch=false seqId=0 2025-09-02 12:50:47.192 678-678 VRI[MainAc...y]@44606a7 com.kotei.overseas.navi I registerCallbackForPendingTransactions 2025-09-02 12:50:47.196 678-903 VRI[MainAc...y]@44606a7 com.kotei.overseas.navi I mWNT: t=0xb400007ac991be80 mBlastBufferQueue=0xb400007ba47ef700 fn= 816 HdrRenderState mRenderHdrSdrRatio=1.0 caller= android.view.ViewRootImpl$9.onFrameDraw:6276 android.view.ViewRootImpl$3.onFrameDraw:2440 android.view.ThreadedRenderer$1.onFrameDraw:761 2025-09-02 12:50:49.537 678-1511 USBOfflineUpdater com.kotei.overseas.navi W handFailure is running 已经完成备份的文件夹路径: /data/user/0/com.kotei.overseas.navi/cache/backupAlready 2025-09-02 12:50:49.537 678-1511 USBOfflineUpdater com.kotei.overseas.navi W 更新失败,正在回滚数据,回滚目录: /data/user/0/com.kotei.overseas.navi/cache/backupAlready 2025-09-02 12:50:49.537 678-1517 USBOfflineUpdater com.kotei.overseas.navi W performRollback IS RUNNING 2025-09-02 12:50:49.538 678-1517 USBOfflineUpdater com.kotei.overseas.navi W 检查storage目录是否可写:true 2025-09-02 12:50:49.611 678-1517 USBOfflineUpdater com.kotei.overseas.navi W 准备执行:singlecopydirectory.copyDirectoryWithProgress 2025-09-02 12:50:50.176 678-678 VRI[MainAc...y]@44606a7 com.kotei.overseas.navi I call setFrameRateCategory for touch hint category=no preference, reason=boost timeout, vri=VRI[MainActivity]@44606a7 2025-09-02 12:50:51.429 678-678 VRI[MainAc...y]@44606a7 com.kotei.overseas.navi I onDisplayChanged oldDisplayState=2 newDisplayState=2 2025-09-02 12:50:52.562 678-678 VRI[MainAc...y]@44606a7 com.kotei.overseas.navi I onDisplayChanged oldDisplayState=2 newDisplayState=2 2025-09-02 12:50:57.489 678-678 VRI[MainAc...y]@44606a7 com.kotei.overseas.navi I onDisplayChanged oldDisplayState=2 newDisplayState=2 package com.kotei.overseas.navi.update; import static com.kotei.overseas.navi.security.DecryptUtil.dataVerification; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.AsyncTask; import android.os.Handler; import android.os.Looper; import android.util.Log; import androidx.annotation.NonNull; import com.here.sdk.core.engine.SDKNativeEngine; import com.here.sdk.maploader.MapDownloader; import com.here.sdk.maploader.MapDownloaderConstructionCallback; import com.kotei.overseas.navi.business.data.MapDataController; import com.kotei.overseas.navi.security.DecryptUtil; import com.kotei.overseas.navi.security.DfCert; import java.io.File; import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Pattern; import java.util.stream.Stream; /** * USB离线更新系统 */ public class USBOfflineUpdater { private static final String TAG = "USBOfflineUpdater"; // 状态码定义 /** * 操作成功 */ public static final int SUCCESS = 0; /** * 错误:未检测到USB设备 */ public static final int ERROR_NO_USB = 1; /** * 错误:未找到升级包文件 */ public static final int ERROR_NO_UPDATE_PACKAGE = 2; /** * 错误:电池电量不足(低于安全阈值) */ public static final int ERROR_BATTERY_LOW = 3; /** * 错误:存储空间不足 */ public static final int ERROR_STORAGE_INSUFFICIENT = 4; /** * 错误:系统正在执行其他升级任务 */ public static final int ERROR_UPDATE_IN_PROGRESS = 5; /** * 错误:文件复制失败(检查存储权限或磁盘状态) */ public static final int ERROR_COPY_FAILED = 6; /** * 错误:升级包解压失败(文件可能损坏) */ public static final int ERROR_EXTRACT_FAILED = 7; /** * 错误:用户手动取消操作 */ public static final int ERROR_USER_CANCELED = 8; /** * 错误:未预期的系统异常 */ public static final int ERROR_UNEXPECTED = 9; /** * 错误:升级过程中USB设备被移除 */ public static final int ERROR_USB_REMOVED = 10; /** * 错误:车辆档位未处于停车挡(P档) */ public static final int ERROR_VEHICLE_SHIFTED = 11; /** * 错误:电池电量极低(无法维持升级过程) */ public static final int ERROR_BATTERY_TOO_LOW = 12; /** * 错误:文件校验失败(MD5/SHA256校验不匹配) */ public static final int ERROR_FILE_VERIFY_FAILED = 13; /** * 错误:文件解密或验签失败 */ public static final int ERROR_DECRYPT_OR_SIGN_FAILED = 14; // 更新阶段定义 /** * 空闲状态(未开始升级) */ private static final int PHASE_IDLE = 0; /** * 设备检测阶段(检查USB/存储设备) */ private static final int PHASE_DETECTING = 1; /** * 升级包校验阶段(验证完整性/签名) */ private static final int PHASE_CHECKING = 2; /** * 系统备份阶段(备份当前系统数据) */ private static final int PHASE_BACKUP = 3; /** * 文件复制阶段(写入升级包到临时分区) */ private static final int PHASE_COPYING = 4; /** * 解压阶段(解压升级包内容) */ private static final int PHASE_EXTRACTING = 5; /** * 清理阶段(删除临时文件) */ private static final int PHASE_CLEANUP = 6; /** * 回滚阶段(升级失败时恢复备份) */ private static final int PHASE_ROLLBACK = 7; public static final int ERROR_PHASE_ROLLBACK = 101; // 权重分配比例 private static final float BACKUP_WEIGHT = 0.1f; // 备份阶段权重10% private static final float PACKAGE_COPY_WEIGHT = 0.29f; // 升级包拷贝阶段权重29% private static final float PACKAGE_VERIFY_WEIGHT = 0.31f; // 升级包解密验签阶段权重31% private static final float PACKAGE_EXTRACT_WEIGHT = 0.29f; // 升级包解压阶段权重29% private static final float VERIFICATION_WEIGHT = 0.01f; // 校验阶段权重1% // 声明 mProgress 为实例变量(非静态) private float mProgress = 0; // 当前进度值(0~1) private static USBOfflineUpdater instance; private final Context context; private UpdateTask currentTask; private UpdateListener updateListener; private SDKNativeEngine sdkNativeEngine; private MapDataController mapDataController; // 目录配置 private File usbRoot; private File cacheDir; private File storageDir;// private File backupDir; // private File backupAlreadyDir; // 更新控制 public boolean isPaused = false; public boolean isCancelled = false; public final AtomicInteger currentPhase = new AtomicInteger(PHASE_IDLE); // 错误信息 private String lastErrorMessage = ""; // 电量阈值 private static final int MIN_BATTERY_LEVEL = 30; // 最低电量百分比 private static final int MIN_BATTERY_LEVEL_CRITICAL = 15; // 严重低电量 //升级包格式 private static final String FILE_NAME_PATTERN = "^KVM_Navi_EU_" + "(?<version>\\d{1,3})" // 版本号(1-3位数字) + "_" + "(?<serial>\\d{1,2})" // 1-2位数字编号 + "(\\.\\w+)?$"; // 可选的文件扩展名 // 进度计算相关变量(新增) private long totalUpdateSize = 0; // 所有升级包总大小 private long UpdateSize = 0; // 当前升级包大小 private long currentCopiedBytes = 0; // 当前已拷贝字节数 private long currentVerifiedBytes = 0; // 当前已验签字节数 private long currentExtractedBytes = 0; // 当前已解压字节数 private long backupSize = 0; // 备份数据大小 private long storageSize = 0; private int currentPackageIndex = 0; // 当前处理的升级包索引 private int totalPackageCount = 0; // 总升级包数量 // 用于跟踪回滚状态 public boolean isRollingBack = false; public long rollbackTotalSize = 0; public long rollbackProcessedSize = 0; public boolean ishandleFailure = false; // USB监听器 private final BroadcastReceiver usbReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) { //zwxtest // File usbPath = new File(intent.getData().getPath()); File usbPath = new File("/data/data/com.kotei.overseas.navi/files"); if (usbPath.exists() && usbPath.canRead()) { usbRoot = usbPath; Log.i(TAG, "USB mounted: " + usbRoot.getAbsolutePath()); } } else if (Intent.ACTION_MEDIA_EJECT.equals(action) || Intent.ACTION_MEDIA_UNMOUNTED.equals(action)) { if (currentTask != null && currentPhase.get() > PHASE_CHECKING) { cancelUpdate(ERROR_USB_REMOVED, "USB设备被移除"); } usbRoot = null; Log.e(TAG, "USB removed"); } } }; // // 车辆状态监听器(模拟) private final BroadcastReceiver vehicleReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if ("com.example.ACTION_SHIFT_CHANGE".equals(intent.getAction())) { String shift = intent.getStringExtra("shift"); if (!"P".equals(shift) && currentPhase.get() > PHASE_CHECKING) { // cancelUpdate(ERROR_VEHICLE_SHIFTED, "车辆已退出P挡"); } } } }; // 单例模式 public static synchronized USBOfflineUpdater getInstance(Context context) { if (instance == null) { instance = new USBOfflineUpdater(context); } return instance; } public static synchronized USBOfflineUpdater getInstance() { return instance; } private USBOfflineUpdater(Context context) { this.context = context.getApplicationContext(); // 初始化SDK sdkNativeEngine = SDKNativeEngine.getSharedInstance(); mapDataController = MapDataController.getInstance(); try { DfCert.getInstance().getService(); } catch (Exception e) { Log.e(TAG, "Exception:" + e.toString()); } //zwx 执行顺序? // 初始化目录(默认值) Log.i(TAG, "zwx:=== 启动目录初始化 ===" ); cacheDir = this.context.getCacheDir(); storageDir = new File(sdkNativeEngine.getOptions().persistentMapStoragePath); // ✅ 初始化 backupDir backupDir = new File(cacheDir, "backup"); // ✅ 基于 cacheDir 固定路径 backupAlreadyDir = new File(cacheDir, "backupAlready"); // 注册USB监听器 IntentFilter usbFilter = new IntentFilter(); usbFilter.addAction(Intent.ACTION_MEDIA_MOUNTED); usbFilter.addAction(Intent.ACTION_MEDIA_EJECT); usbFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); usbFilter.addDataScheme("file"); context.registerReceiver(usbReceiver, usbFilter); // 注册车辆状态监听器(模拟) IntentFilter vehicleFilter = new IntentFilter("com.example.ACTION_SHIFT_CHANGE"); context.registerReceiver(vehicleReceiver, vehicleFilter); //清除数据存储目录下的预留数据 removeLegacy(); } public void initialization(UpdateListener listener) { isRollingBack = false; this.updateListener = listener; Thread USBOfflineUpdaterInitialization = new Thread(new Runnable() { @Override public void run() { // 启动时检查恢复 checkRecoveryOnStartup(); } }); USBOfflineUpdaterInitialization.setName("USBOfflineUpdaterInitialization"); USBOfflineUpdaterInitialization.start(); } // 动态设置目录 public void setDirectories(File usbRoot, File cacheDir, File storageDir) { if (usbRoot != null) { this.usbRoot = usbRoot; } if (cacheDir != null) { this.cacheDir = cacheDir; } if (storageDir != null) { this.storageDir = storageDir; } } /** * 检测升级包 * * @return 状态码 (SUCCESS 或错误码) */ public int detectUpdatePackages() { //zwxtest // 1. 检测USB是否插入 File usbPath = new File("/data/data/com.kotei.overseas.navi/files"); if (usbPath.exists() && usbPath.canRead()) { usbRoot = usbPath; Log.i(TAG, "USB mounted: " + usbRoot.getAbsolutePath()); } //zwxtest if (usbRoot == null || !usbRoot.exists() || !usbRoot.isDirectory()) { return ERROR_NO_USB; } File[] tempPackages = usbRoot.listFiles(); // 2. 查找升级包 (命名格式: update_v{版本号}_{日期}.zip) File[] packages = usbRoot.listFiles(file -> file.isFile() && file.getName().matches(FILE_NAME_PATTERN) ); return (packages != null && packages.length > 0) ? SUCCESS : ERROR_NO_UPDATE_PACKAGE; } /** * 环境检测 * * @return 状态码 (SUCCESS 或错误码) */ public int checkEnvironment() { // 1. 检测电量 int batteryLevel = PowerUtils.getBatteryLevel(context); if (batteryLevel < MIN_BATTERY_LEVEL) { return batteryLevel < MIN_BATTERY_LEVEL_CRITICAL ? ERROR_BATTERY_TOO_LOW : ERROR_BATTERY_LOW; } // 2. 检测缓存空间 (需大于15GB) long requiredSpace = 15L * 1024 * 1024 * 1024; // 15GB long availableSpace = StorageUtils.getAvailableSpace(cacheDir); if (availableSpace < requiredSpace) { Log.e(TAG, "缓存空间剩余:【" + availableSpace + "】"); return ERROR_STORAGE_INSUFFICIENT; } return SUCCESS; } /** * 判读是否正在进行离线更新 */ public boolean isOfflineUpdate() { return currentTask != null && !currentTask.isCancelled(); } /** * 开始更新 */ public void startUpdate(UpdateListener listener) { Log.i(TAG,"检查是否处于回滚状态:"+ishandleFailure); this.updateListener = listener; if (ishandleFailure && backupAlreadyDir.exists()) { new Handler(Looper.getMainLooper()).post(() -> { if (updateListener != null) { // 显示回滚阶段和进度 float progress = (float) (rollbackProcessedSize * 100) / rollbackTotalSize; progress = Math.round(progress * 100) / 100.0f; // 保留两位小数 updateListener.onProgress(PHASE_ROLLBACK, progress, "正在回滚数据..."); } }); return; } int result = checkEnvironment(); if (result != SUCCESS) { notifyListener(result, "环境检测不合格"); return; } if (isRollingBack) { notifyListener(ERROR_UPDATE_IN_PROGRESS, "正在进行数据回滚"); return; } if (isOfflineUpdate()) { notifyListener(ERROR_UPDATE_IN_PROGRESS, "已有更新任务正在进行"); return; } Log.i(TAG, "检测到更新任务触发,开始进行地图更新"); // 计算总工作量(新增) calculateTotalWorkload();//p3-2 notifyProgress("开始进行更新"); this.updateListener = listener;//zwx-恢复 currentTask = new UpdateTask(); currentTask.execute(); } // 计算总工作量(新增) private void calculateTotalWorkload() { totalUpdateSize = 0; File[] packages = getUpdatePackages(); totalPackageCount = packages != null ? packages.length : 0; if (packages != null) { for (File pkg : packages) { totalUpdateSize += pkg.length(); } } // backupSize = estimateBackupSize();//zwx backupSize = FileUtils.getDirectorySize(storageDir); Log.i(TAG, "总工作量计算: 升级包数量=" + totalPackageCount + ", 升级包大小=" + formatSize(totalUpdateSize) + ", 备份大小=" + formatSize(backupSize)); } // // 估算备份大小方法(避免返回0导致除0错误) // private long estimateBackupSize() { // long storageSize = FileUtils.getDirectorySize(storageDir); // long size = (long) (storageSize * 1.2); // return size > 0 ? size : 1; // 确保不为0 // } // 获取更新包(新增) private File[] getUpdatePackages() { if (usbRoot == null) return new File[0]; return usbRoot.listFiles(file -> file.isFile() && file.getName().matches(FILE_NAME_PATTERN) ); } // 格式化文件大小(新增) private String formatSize(long size) { if (size < 1024) return size + "B"; else if (size < 1024 * 1024) return String.format("%.1fKB", size / 1024.0); else if (size < 1024 * 1024 * 1024) return String.format("%.1fMB", size / (1024.0 * 1024)); else return String.format("%.1fGB", size / (1024.0 * 1024 * 1024)); } /** * 暂停更新 */ public void pauseUpdate() { isPaused = true; notifyProgress("更新已暂停"); } /** * 恢复更新 */ public void resumeUpdate() { isPaused = false; notifyProgress("更新已恢复"); } /** * 取消更新 */ public void cancelUpdate() { cancelUpdate(ERROR_USER_CANCELED, "用户取消更新"); } // private void cancelUpdate(int errorCode, String message) { // isCancelled = true; // lastErrorMessage = message; // notifyListener(errorCode, message); // } public void cancelUpdate(int errorCode, String message) { Log.i(TAG,"触发取消按钮"); isCancelled = true; lastErrorMessage = message; //zwx-focus-p3-回滚触发了计算总进度 if (currentTask != null) { currentTask.cancel(true); // 请求中断线程 } //p7 // notifyListener(errorCode, message); if (!ishandleFailure && backupAlreadyDir.exists()) { Log.i(TAG,"进入取消按钮对应回滚流程"); // handleFailure(ERROR_USER_CANCELED);//p4-3 //p6 // new Handler(Looper.getMainLooper()).post(() -> { // if (!ishandleFailure && backupAlreadyDir.exists()) { // handleFailure(ERROR_USER_CANCELED); // } // }); new Thread(() -> { Thread.interrupted(); // 清除中断标志 if (!ishandleFailure && backupAlreadyDir.exists()) { handleFailure(ERROR_USER_CANCELED); } }).start(); } notifyListener(errorCode, message);//p7 } // 进度通知 // private void notifyProgress(String message) { // new Handler(Looper.getMainLooper()).post(() -> { // if (updateListener != null) { // // 计算当前总进度(修改) // float progress = calculateOverallProgress(); // updateListener.onProgress(currentPhase.get(), progress, message); // } // }); // } //p3-4-回滚使用自定义进度计算 private void notifyProgress(String message) { new Handler(Looper.getMainLooper()).post(() -> { if (updateListener != null) { float progress; if (isRollingBack) { float progress_orin = (float) (rollbackProcessedSize * 100) / rollbackTotalSize; progress = Math.round(progress_orin * 100) / 100.0f; } else { progress = calculateOverallProgress(); } updateListener.onProgress(currentPhase.get(), progress, message); } }); } private float calculateOverallProgress() { // if (isRollingBack) { // // 回滚阶段:直接计算回滚进度 // if (rollbackTotalSize > 0) { // mProgress = 99; // return mProgress; // } // return 0; // } // if (totalPackageCount == 0 && currentPhase.get() != PHASE_ROLLBACK) { // throw new IllegalStateException("totalPackageCount should not be 0 here!"); // }//p3-3 if (totalPackageCount == 0 && currentPhase.get() != PHASE_ROLLBACK) return 0; // 每个包的总权重(拷贝+验签+解压) float packageTotalWeight = PACKAGE_COPY_WEIGHT + PACKAGE_VERIFY_WEIGHT + PACKAGE_EXTRACT_WEIGHT; //再次确认totalPackageCount是否等于0 if (totalPackageCount == 0) { throw new IllegalStateException("totalPackageCount should not be 0 here!"); } // 每个包的阶段权重 float packageCopyWeight = PACKAGE_COPY_WEIGHT / totalPackageCount; float packageVerifyWeight = PACKAGE_VERIFY_WEIGHT / totalPackageCount; float packageExtractWeight = PACKAGE_EXTRACT_WEIGHT / totalPackageCount; switch (currentPhase.get()) { case PHASE_BACKUP: if(backupSize > 0) { mProgress = BACKUP_WEIGHT * (currentCopiedBytes / (float) backupSize); }else{ mProgress = BACKUP_WEIGHT; } if(mProgress > BACKUP_WEIGHT) { mProgress = BACKUP_WEIGHT; } break; case PHASE_COPYING: // 基础:备份 + 已完成包的完整进度 float copyBase = BACKUP_WEIGHT + (packageTotalWeight * currentPackageIndex) / totalPackageCount; // 增量:当前包拷贝进度 float copyProgress = currentCopiedBytes / (float) UpdateSize; mProgress = copyBase + packageCopyWeight * copyProgress; break; case PHASE_CHECKING: // 基础:备份 + 已完成包的完整进度 + 当前包拷贝完成 float verifyBase = BACKUP_WEIGHT + (packageTotalWeight * currentPackageIndex) / totalPackageCount + packageCopyWeight; // 增量:当前包验签进度 float verifyProgress = currentVerifiedBytes / (float) UpdateSize; mProgress = verifyBase + packageVerifyWeight * verifyProgress; break; case PHASE_EXTRACTING: // 修复:添加当前包验签完成 float extractBase = BACKUP_WEIGHT + (packageTotalWeight * currentPackageIndex) / totalPackageCount + packageCopyWeight + packageVerifyWeight; // 添加这行 // 增量:当前包解压进度 float extractProgress = currentExtractedBytes / (float) UpdateSize; mProgress = extractBase + packageExtractWeight * extractProgress; break; case PHASE_DETECTING: mProgress = BACKUP_WEIGHT + packageTotalWeight + VERIFICATION_WEIGHT * (currentVerifiedBytes / (float) totalUpdateSize); break; case PHASE_CLEANUP: // case PHASE_ROLLBACK: // mProgress = 0.99f; // p3-5 break; } return Math.min(Math.round(mProgress * 10000) / 100.00f, 100.00f); } // 结果通知 private void notifyListener(int resultCode, String message) { new Handler(Looper.getMainLooper()).post(() -> { if (updateListener != null) { updateListener.onResult(resultCode, message); } }); } // 获取当前进度百分比 private int getCurrentProgress() { // 此处可添加子任务进度计算 return (int) mProgress; } // ================== 核心更新逻辑 ================== private class UpdateTask extends AsyncTask<Void, Void, Integer> { // private File backupFile;//zwx-s private File[] updatePackages; @Override protected void onPreExecute() { currentPhase.set(PHASE_DETECTING); isCancelled = false; isPaused = false; currentCopiedBytes = 0; currentExtractedBytes = 0; mProgress = 0; // 重置进度为0 } @Override protected Integer doInBackground(Void... voids) { try { // 阶段1: 备份数据 currentPhase.set(PHASE_BACKUP); notifyProgress("开始备份数据..."); backupDir = new File(cacheDir, "backup"); Log.i(TAG, "初始化备份目录为:" + backupDir.getAbsolutePath());//ZWX if (backupDir.exists()) { if (!FileUtils.deleteRecursive(backupDir)) { throw new IOException("删除备份文件失败: " + backupDir.getAbsolutePath()); } } if (!backupDir.mkdirs()) { throw new IOException("创建备份目录失败: " + backupDir.getAbsolutePath()); } // 计算实际备份大小 Log.i(TAG, "核对实际需要备份的数据大小"); // backupSize = estimateBackupSize(); backupSize = FileUtils.getDirectorySize(storageDir); Log.i(TAG, "需要备份的数据大小:[" + formatSize(backupSize) + "]"); Log.i(TAG, "storage目录为:" + storageDir.getAbsolutePath());//ZWX if (backupSize > 0) { Log.i(TAG, "开始进行数据备份"); try { // 执行目录复制 if (!singlecopydirectory.copyDirectoryWithProgress(storageDir, backupDir, (copied, total) -> { currentCopiedBytes = copied; notifyProgress("备份中: " + formatSize(copied) + "/" + formatSize(total)); })) { throw new IOException("备份失败: " + storageDir.getAbsolutePath() + " -> " + backupDir.getAbsolutePath()); } notifyProgress("数据备份完成");//P4 if (!backupDir.renameTo(backupAlreadyDir)) { throw new IOException("重命名备份目录失败: " + backupDir.getAbsolutePath() + " -> " + backupAlreadyDir.getAbsolutePath()); } Log.i(TAG, "重命名备份目录成功"); } catch (Exception e) { Log.e(TAG, "备份过程中发生错误", e); // 可选:尝试二次备份或记录日志,这里直接抛出错误 return ERROR_COPY_FAILED; } } else { // 无数据需要备份,直接标记完成 Log.i(TAG, "无备份数据,直接进行数据更新"); currentCopiedBytes = 1; backupSize = 1; notifyProgress("无数据需要备份"); } // 检查是否被取消(场景1) if (isCancelled) { return ERROR_USER_CANCELED; } //zwx-end // 阶段2: 处理升级包 //p5:更新前清理压缩包 if (storageDir.exists() && storageDir.isDirectory()) { if (!singlecopydirectory.clearDirectoryContentsOnly(storageDir.toPath())) { throw new IOException("无法清空目标目录: " + storageDir.getAbsolutePath()); } } updatePackages = getUpdatePackages(); Log.i(TAG, "开始处理升级包【拷贝、解密验签、解压】"); for (currentPackageIndex = 0; currentPackageIndex < updatePackages.length; currentPackageIndex++) { if (isCancelled) return ERROR_USER_CANCELED; // 处理暂停状态 while (isPaused) { Thread.sleep(500); } File packageFile = updatePackages[currentPackageIndex]; UpdateSize = updatePackages[currentPackageIndex].length(); String packageName = packageFile.getName(); long packageSize = packageFile.length(); // 备份完成后重置拷贝计数器 currentCopiedBytes = 0; // 阶段3: 拷贝升级包 currentPhase.set(PHASE_COPYING); File destFile = new File(storageDir, packageName); // 拷贝时更新进度(修改) boolean copyResult = FileUtils.copyFileWithProgress( packageFile, destFile, (copied, total) -> { currentCopiedBytes = copied; notifyProgress(String.format("拷贝 %s: %s/%s", packageName, formatSize(copied), formatSize(total))); } ); if (!copyResult) { lastErrorMessage = "拷贝失败: " + packageName; return ERROR_COPY_FAILED; } // 阶段4:解密验签 currentPhase.set(PHASE_CHECKING); currentVerifiedBytes = 0; // 重置验签计数器 // 创建进度回调适配器 DecryptUtil.ProgressCallback decryptCallback = new DecryptUtil.ProgressCallback() { @Override public void onProgress(long processed, long total) { // 直接更新验签进度计数器 currentVerifiedBytes = processed; // 触发进度通知 notifyProgress(String.format("解密验签 %s: %s/%s", packageName, formatSize(processed), formatSize(total))); } }; // 执行解密验签(传入回调) if (!dataVerification(destFile.getAbsolutePath(), decryptCallback)) { if (!isCancelled) { return ERROR_DECRYPT_OR_SIGN_FAILED; } } // 确保进度设置为100% currentVerifiedBytes = UpdateSize; // 阶段5: 解压升级包 currentPhase.set(PHASE_EXTRACTING); // 修复:重置解压计数器 currentExtractedBytes = 0; // 重置计数器 notifyProgress("解压升级包: " + packageName); // 解压时更新进度(修改) boolean extractResult = FileUtils.extractZipWithProgress( destFile, storageDir, (extracted, total) -> { currentExtractedBytes = extracted; notifyProgress(String.format("解压 %s: %s/%s", packageName, formatSize(extracted), formatSize(total))); } ); if (!extractResult) { lastErrorMessage = "解压失败: " + packageName; return ERROR_EXTRACT_FAILED; } // 删除已解压的升级包以节省空间 if (!destFile.delete()) { Log.w(TAG, "删除升级包失败: " + destFile.getName()); } // 更新解压进度(完成当前包) currentExtractedBytes += packageSize; } if (!mapDataController.checkInstallationStatus()) { notifyProgress("校验失败"); return ERROR_FILE_VERIFY_FAILED; } else { notifyProgress("校验成功"); } // MapDownloader.fromEngineAsync(sdkNativeEngine, new MapDownloaderConstructionCallback() { // @Override // public void onMapDownloaderConstructedCompleted(@NonNull MapDownloader downloader) { // Log.i(TAG, "数据同步成功"); // } // }); // 阶段5: 清理工作 currentPhase.set(PHASE_CLEANUP); notifyProgress("清理缓存..."); if (backupDir.exists() && !FileUtils.deleteRecursive(backupDir)) { Log.w(TAG, "删除备份文件失败"); } // 最终进度设为100% notifyProgress("更新完成"); return SUCCESS; } catch (InterruptedException e) { // 场景1:备份未完成时被取消 // if (backupDir != null && backupDir.exists()) { //// backupFile.delete(); // if (!FileUtils.deleteRecursive(backupDir)) { // Log.w(TAG, "删除备份文件失败: " + backupDir.getAbsolutePath()); // } // } lastErrorMessage = "更新任务被中断"; return ERROR_USER_CANCELED; } catch (Exception e) { lastErrorMessage = "未知错误: " + e.getMessage(); Log.e(TAG, "更新失败", e); return ERROR_UNEXPECTED; } } @Override protected void onPostExecute(Integer resultCode) { if (resultCode == SUCCESS) { if (backupAlreadyDir != null && backupAlreadyDir.exists()) { Log.w(TAG, "开始删除备份文件: " + backupAlreadyDir.getAbsolutePath()); if (!FileUtils.deleteRecursive(backupAlreadyDir)) { Log.w(TAG, "删除备份文件失败: " + backupAlreadyDir.getAbsolutePath()); } } notifyListener(SUCCESS, "更新成功,请重启车机"); currentPhase.set(PHASE_IDLE); currentTask = null; } else { if (!ishandleFailure && backupAlreadyDir.exists()) { handleFailure(resultCode);//p4-1 } } } } // ================== 启动时恢复检查 ================== private void checkRecoveryOnStartup() { // File backupFile = findLatestBackupFile(); Log.i(TAG, "=== 启动时恢复检查 ===" ); // storageSize = FileUtils.getDirectorySize(storageDir); // backupAlreadyDir = //backAlreadysize if (backupDir != null && backupDir.exists()) { // 场景1:存在未完成的备份目录(backup) Log.w(TAG, "检测到残留备份目录: " + backupDir.getAbsolutePath() + ",该目录将被删除"); // 删除未完成的备份目录 if (!FileUtils.deleteRecursive(backupDir)) { Log.e(TAG, "无法删除未完成的备份目录: " + backupDir.getAbsolutePath()); } } if (!ishandleFailure && backupAlreadyDir.exists()) { handleFailure(ERROR_PHASE_ROLLBACK);//p4 } notifyProgress("数据恢复完成"); this.updateListener = null; } private void checkStoragePerformance() { long writeSpeed = StorageUtils.measureWriteSpeed(storageDir); Log.d(TAG, "存储写入速度: " + formatSize(writeSpeed) + "/s"); if (writeSpeed < 50 * 1024 * 1024) { // 低于 50MB/s Log.w(TAG, "检测到低速存储设备,还原操作可能较慢"); } } //p3-7 p4-2 protected void handleFailure(Integer resultCode) { if (ishandleFailure) { Log.w(TAG, "handFailure is already running, skip duplicate call"); return; } if (Thread.currentThread().isInterrupted() && !isCancelled) { Log.e(TAG, "线程中断,拷贝终止"); } ishandleFailure = true; isRollingBack = true; rollbackTotalSize = FileUtils.getDirectorySize(backupAlreadyDir); Log.w(TAG, "handFailure is running " + "已经完成备份的文件夹路径: " + backupAlreadyDir.getAbsolutePath()); if (backupDir != null && backupDir.exists()) { // 场景1:存在未完成的备份目录(backup) Log.w(TAG, "检测到残留备份目录: " + backupDir.getAbsolutePath() + ",该目录将被删除"); // 删除未完成的备份目录 if (!FileUtils.deleteRecursive(backupDir)) { Log.e(TAG, "无法删除未完成的备份目录: " + backupDir.getAbsolutePath()); } } if (backupAlreadyDir != null && backupAlreadyDir.exists()) { // 场景2:进入回滚流程 currentPhase.set(PHASE_ROLLBACK); // 先发送回滚进度通知(99%) notifyProgress("更新失败,正在回滚数据..."); Log.w(TAG, "更新失败,正在回滚数据,回滚目录: " + backupAlreadyDir.getAbsolutePath()); // 启动回滚线程 new Thread(() -> { try { // 执行回滚 if (performRollback(backupAlreadyDir)) { if (backupAlreadyDir.exists() && !FileUtils.deleteRecursive(backupAlreadyDir)) { Log.w(TAG, "删除备份文件失败: " + backupAlreadyDir.getAbsolutePath()); } } } finally { // 回滚完成后删除备份 // backupFile.delete(); if (!isCancelled) { // 回滚完成后发送最终结果 notifyListener(resultCode, getErrorMessage(resultCode)); } // 重置状态 ishandleFailure = false; currentPhase.set(PHASE_IDLE); currentTask = null; isRollingBack = false; } }).start(); } else { // 场景1:没有备份文件,直接报告错误 notifyListener(resultCode, lastErrorMessage); currentPhase.set(PHASE_IDLE); currentTask = null; } } //p3-6 private boolean performRollback(File backupAlreadyDir) { Log.w(TAG, "performRollback IS RUNNING "); try { // 设置回滚标志 // 获取备份大小 if (rollbackTotalSize <= 0) { throw new IOException("备份目录为空或不可读: " + backupAlreadyDir.getAbsolutePath()); } // 设置回滚总大小 rollbackProcessedSize = 0; if (!storageDir.canWrite()) { throw new IOException("目标目录不可写: " + storageDir.getAbsolutePath()); } Log.w(TAG, "检查storage目录是否可写:"+storageDir.canWrite()); // 删除当前升级后的数据 p3.4:回滚前置步骤删除失败->更改删除方法 if (storageDir.exists() && storageDir.isDirectory()) { if (!singlecopydirectory.clearDirectoryContentsOnly(storageDir.toPath())) { throw new IOException("无法清空目标目录: " + storageDir.getAbsolutePath()); } } // 开始恢复备份 notifyProgress("开始恢复备份..."); // 执行目录复制并监听进度 Log.w(TAG, "准备执行:singlecopydirectory.copyDirectoryWithProgress"); //p7 boolean success = singlecopydirectory.copyDirectoryWithProgress(backupAlreadyDir, storageDir, (copied, total) -> { rollbackProcessedSize = copied; rollbackTotalSize = total; new Handler(Looper.getMainLooper()).post(() -> { notifyProgress("恢复中: " + formatSize(copied) + "/" + formatSize(total)); }); }); if (!success) { throw new IOException("恢复备份失败"); } ishandleFailure = false; // 回滚完成 notifyProgress("数据恢复完成"); return true; } catch (Exception e) { Log.e(TAG, "回滚过程中发生错误", e); return false; } } // 释放资源 public void release() { try { context.unregisterReceiver(usbReceiver); context.unregisterReceiver(vehicleReceiver); } catch (Exception e) { Log.w(TAG, "释放资源时出错", e); } } // ================== 接口定义 ================== public interface UpdateListener { void onProgress(int phase, float progress, String message); void onResult(int resultCode, String message); } public interface ProgressCallback { void onProgress(long progress, long total) throws InterruptedException; } public File getUsbRoot() { return usbRoot; } public File getCacheDir() { return cacheDir; } public File getStorageDir() { return storageDir; } public String getErrorMessage(int code) { return switch (code) { case ERROR_NO_USB -> "未检测到USB设备,请检查连接状态或更换接口"; case ERROR_NO_UPDATE_PACKAGE -> "升级包文件缺失,请确认存储路径"; case ERROR_BATTERY_LOW -> "电池电量不足(需≥20%)"; case ERROR_STORAGE_INSUFFICIENT -> "存储空间不足(需预留20gb以上)"; case ERROR_UPDATE_IN_PROGRESS -> "系统正在执行其他升级任务"; case ERROR_COPY_FAILED -> "文件复制失败,请检查存储权限"; case ERROR_EXTRACT_FAILED -> "升级包解压失败(可能文件损坏)"; case ERROR_USER_CANCELED -> "用户已取消升级操作"; case ERROR_UNEXPECTED -> "发生未预期的系统异常"; case ERROR_USB_REMOVED -> "升级过程中USB设备被移除"; case ERROR_VEHICLE_SHIFTED -> "请将车辆档位切换至P档"; case ERROR_BATTERY_TOO_LOW -> "电池电量极低(需≥10%)"; case ERROR_FILE_VERIFY_FAILED -> "文件校验失败(MD5/SHA256不匹配)"; case ERROR_DECRYPT_OR_SIGN_FAILED -> "文件解密/验签失败"; case ERROR_PHASE_ROLLBACK -> "回滚成功"; default -> "未知错误导致更新失败"; }; } void removeLegacy() { if (storageDir == null || !storageDir.exists() || !storageDir.isDirectory()) { return; } Pattern pattern = Pattern.compile(FILE_NAME_PATTERN); File[] files = storageDir.listFiles(); if (files == null) return; for (File file : files) { if (file.isFile() && pattern.matcher(file.getName()).matches()) { // 删除匹配的文件 try { Files.deleteIfExists(file.toPath()); } catch (IOException | SecurityException e) { // 处理异常(记录日志等) } } } // 删除sign文件夹(如果存在) Path signDir = Paths.get(storageDir.getAbsolutePath(), "sign"); if (Files.exists(signDir)) { try { // 递归删除整个目录 deleteDirectoryRecursively(signDir); } catch (IOException | SecurityException e) { // 处理异常 } } } private void deleteDirectoryRecursively(Path path) throws IOException { if (Files.isDirectory(path)) { // 使用 try-with-resources 确保 Stream 关闭 try (Stream<Path> children = Files.list(path)) { children.forEach(child -> { try { deleteDirectoryRecursively(child); } catch (IOException e) { // 处理子项删除异常 throw new UncheckedIOException(e); // 转换为 RuntimeException 以便在 Stream 中抛出 } }); } catch (UncheckedIOException e) { // 重新抛出原始 IOException throw e.getCause(); } } // 删除空目录或文件 Files.deleteIfExists(path); } }
09-03
2025-05-29 16:48:55.354 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/index.html", parameters={} 2025-05-29 16:48:55.372 DEBUG 2708 --- [nio-8080-exec-5] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.400 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.441 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/fonts/font-awesome-4.7.0/css/font-awesome.min.css", parameters={} 2025-05-29 16:48:55.442 DEBUG 2708 --- [nio-8080-exec-6] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.450 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.453 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/css/main.css", parameters={} 2025-05-29 16:48:55.455 DEBUG 2708 --- [nio-8080-exec-6] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.457 DEBUG 2708 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/css/util.css", parameters={} 2025-05-29 16:48:55.459 DEBUG 2708 --- [nio-8080-exec-7] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.459 DEBUG 2708 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/css/index2.css", parameters={} 2025-05-29 16:48:55.460 DEBUG 2708 --- [nio-8080-exec-9] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.461 DEBUG 2708 --- [nio-8080-exec-8] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/jsyilai.js", parameters={} 2025-05-29 16:48:55.462 DEBUG 2708 --- [nio-8080-exec-8] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.462 DEBUG 2708 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.465 DEBUG 2708 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/jquery-3.2.1.min.js", parameters={} 2025-05-29 16:48:55.465 DEBUG 2708 --- [nio-8080-exec-9] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.466 DEBUG 2708 --- [nio-8080-exec-8] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.473 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.506 DEBUG 2708 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.509 DEBUG 2708 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.619 DEBUG 2708 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/main/index.html", parameters={} 2025-05-29 16:48:55.621 DEBUG 2708 --- [nio-8080-exec-2] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.625 DEBUG 2708 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.678 DEBUG 2708 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/main.js?1748508535614&_=1748508535584", parameters={masked} 2025-05-29 16:48:55.681 DEBUG 2708 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.696 DEBUG 2708 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.711 DEBUG 2708 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/index.js?1748508535617&_=1748508535585", parameters={masked} 2025-05-29 16:48:55.711 DEBUG 2708 --- [nio-8080-exec-4] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.714 DEBUG 2708 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.769 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/main/bootstrap-3.3.7-dist/js/MyTable.js", parameters={} 2025-05-29 16:48:55.772 DEBUG 2708 --- [nio-8080-exec-5] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.783 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.846 DEBUG 2708 --- [nio-8080-exec-8] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/check-session", parameters={} 2025-05-29 16:48:55.851 DEBUG 2708 --- [nio-8080-exec-8] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.kucun.Config.SecurityConfig$SessionCheckController#checkSession(HttpServletRequest) 2025-05-29 16:48:55.903 DEBUG 2708 --- [nio-8080-exec-8] o.s.w.s.m.m.a.HttpEntityMethodProcessor : No match for [*/*], supported: [] 2025-05-29 16:48:55.904 DEBUG 2708 --- [nio-8080-exec-8] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.053 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/login.html", parameters={} 2025-05-29 16:48:56.054 DEBUG 2708 --- [nio-8080-exec-6] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.057 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.177 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/fonts/font-awesome-4.7.0/css/font-awesome.min.css", parameters={} 2025-05-29 16:48:56.178 DEBUG 2708 --- [io-8080-exec-10] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.188 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.190 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/css/util.css", parameters={} 2025-05-29 16:48:56.190 DEBUG 2708 --- [io-8080-exec-10] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.204 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.206 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/css/main.css", parameters={} 2025-05-29 16:48:56.206 DEBUG 2708 --- [io-8080-exec-10] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.208 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.210 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/jquery-3.2.1.min.js", parameters={} 2025-05-29 16:48:56.210 DEBUG 2708 --- [io-8080-exec-10] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.218 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.220 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/jsyilai.js", parameters={} 2025-05-29 16:48:56.221 DEBUG 2708 --- [io-8080-exec-10] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.224 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.345 DEBUG 2708 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/images/bg-01.jpg", parameters={} 2025-05-29 16:48:56.347 DEBUG 2708 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.351 DEBUG 2708 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.367 DEBUG 2708 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/main.js?1748508536335&_=1748508536268", parameters={masked} 2025-05-29 16:48:56.368 DEBUG 2708 --- [nio-8080-exec-4] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.374 DEBUG 2708 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.509 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/login.js?1748508536338&_=1748508536269", parameters={masked} 2025-05-29 16:48:56.510 DEBUG 2708 --- [nio-8080-exec-5] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.512 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : Completed 200 OK
05-30
package com.kucun.Config; import java.io.IOException; import java.io.InputStream; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.json.Json; import javax.servlet.Filter; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.databind.ObjectMapper; import com.kucun.Config.user.CustomUserDetails; // 2. 基础安全配置 @Configuration @EnableWebSecurity // 启用Web安全功能 public class SecurityConfig extends WebSecurityConfigurerAdapter{ @Override public void configure(WebSecurity web) { web.ignoring().antMatchers("/check-session"); } // 添加自定义Controller @RestController public static class SessionCheckController { @GetMapping("/check-session") public ResponseEntity<?> checkSession(HttpServletRequest request) { return request.getSession(false) != null ? ResponseEntity.ok().build() : ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } } /** * 核心安全过滤器链配置 * @param http HTTP安全构建器 * @return 安全过滤器链 * @throws Exception 配置异常 * * █ 配置逻辑说明: * 1. authorizeHttpRequests: 定义访问控制规则 * 2. formLogin: 配置表单登录 * 3. logout: 配置注销行为 * 4. exceptionHandling: 处理权限异常[^3] */ // 修正后的配置方法 @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.ALWAYS) .invalidSessionUrl("/login.html?session=invalid") .maximumSessions(1) .maxSessionsPreventsLogin(false) .and() .and() .addFilterBefore(jsonAuthFilter(), UsernamePasswordAuthenticationFilter.class) // 关键配置 .authorizeRequests() .antMatchers("/login.html", "/users/login").permitAll() .antMatchers("/js/**", "/css/**", "/fonts/**", "/images/**","/check-session","/main/bootstrap-3.3.7-dist/**").permitAll() .antMatchers("/users/guanli/**").hasAuthority("ROLE_ADMIN") .anyRequest().authenticated() .and() .formLogin().disable() // .loginPage("/login.html") // .loginProcessingUrl("/users/login") // // .successHandler(ajaxAuthenticationSuccessHandler()) // 自定义成功处理器 // .failureHandler(ajaxAuthenticationFailureHandler()) // 自定义失败处理器 // .defaultSuccessUrl("/index.html") // .failureUrl("/login.html?error=true") // .usernameParameter("andy") // 修改用户名参数名 // .passwordParameter("pass") // 修改密码参数名 // .and() .logout() .logoutUrl("/logout") .logoutSuccessUrl("/login.html") .and() .csrf() .ignoringAntMatchers("/users/login") .and() .headers() .frameOptions().sameOrigin() .and() .exceptionHandling() .accessDeniedHandler(accessDeniedHandler()); // 统一使用Handler } // 返回JSON格式的成功响应 @Bean public AuthenticationSuccessHandler ajaxAuthenticationSuccessHandler() { return (request, response, authentication) -> { // 强制创建服务端会话 request.getSession(true); String contextPath = request.getContextPath(); HttpSession session = request.getSession(true); Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setPath(contextPath.isEmpty() ? "/" : contextPath + "/"); cookie.setMaxAge(1800); // 30分钟 response.addCookie(cookie); //构建安全响应数据 Map<String, Object> responseData = new HashMap<>(); responseData.put("sessionId", request.getSession().getId()); responseData.put("userInfo",Collections.unmodifiableMap(new HashMap<String, Object>() {/** * */ private static final long serialVersionUID = 1L; { put("Name", ((CustomUserDetails)authentication.getPrincipal()).getName()); put("role", ((CustomUserDetails)authentication.getPrincipal()).getRole()); }})); // 统一返回JSON格式 response.setContentType(MediaType.APPLICATION_JSON_VALUE); // new ObjectMapper().writeValue(response.getWriter(), responseData); response.setContentType(MediaType.APPLICATION_JSON_VALUE); CustomUserDetails userDetails = (CustomUserDetails) authentication.getPrincipal(); response.setStatus(HttpStatus.OK.value()); System.out.println(authentication.getPrincipal()+""+authentication.getName()); if (request.getHeader("X-Requested-With") == null) { // 非AJAX请求 response.sendRedirect("/index.html"); } else { //String re=userDetails.getUser().toString() new ObjectMapper().writeValue(response.getWriter(), userDetails.getUser() ); } }; } // 返回401状态码和错误信息 @Bean public AuthenticationFailureHandler ajaxAuthenticationFailureHandler() { return (request, response, exception) -> { if (request.getHeader("X-Requested-With") == null) { response.sendRedirect("/login.html?error=true"); } else { response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.getWriter().write("{\"error\":\"Authentication failed\"}"); } }; } // 处理未认证请求 @Bean public AuthenticationEntryPoint ajaxAuthenticationEntryPoint() { return (request, response, exception) -> { if (request.getHeader("X-Requested-With") == null) { response.sendRedirect("/login.html?error=true"); } else { response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.getWriter().write("{\"error\":\"Authentication failed\"}"); } }; } @Bean public JsonUsernamePasswordAuthenticationFilter jsonAuthFilter() throws Exception { JsonUsernamePasswordAuthenticationFilter filter = new JsonUsernamePasswordAuthenticationFilter(); filter.setAuthenticationManager(authenticationManagerBean()); filter.setUsernameParameter("andy"); // 设置自定义参数名 filter.setPasswordParameter("pass"); filter.setFilterProcessesUrl("/users/login"); filter.setAuthenticationSuccessHandler(ajaxAuthenticationSuccessHandler()); filter.setAuthenticationFailureHandler(ajaxAuthenticationFailureHandler()); return filter; } /** * 密码编码器(必须配置) * 使用BCrypt强哈希算法加密 */ @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public AccessDeniedHandler accessDeniedHandler() { System.out.println("0000"); return (request, response, ex) -> { if (!response.isCommitted()) { response.sendRedirect("/error/403"); } }; } } class JsonUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { System.out.println("收到认证请求,路径:" + request.getRequestURI()); System.out.println("请求方法:" + request.getMethod()); System.out.println("Content-Type:" + request.getContentType()); if (request.getContentType() != null && request.getContentType().startsWith(MediaType.APPLICATION_JSON_VALUE)) { try (InputStream is = request.getInputStream()) { Map<String, String> authMap = objectMapper.readValue(is, Map.class); String username = authMap.getOrDefault(getUsernameParameter(), ""); String password = authMap.getOrDefault(getPasswordParameter(), ""); // 调试日志 System.out.println("Authentication attempt with: " + username+'_'+ password); UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); setDetails(request, authRequest); return this.getAuthenticationManager().authenticate(authRequest); } catch (IOException e) { throw new AuthenticationServiceException("认证请求解析失败", e); } } Authentication aut= super.attemptAuthentication(request, response); System.out.println("结果:"+aut.isAuthenticated()); return aut; } } package com.kucun.Config.Role; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.json.Json; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.stereotype.Component; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; /** * 权限转化 * @author Administrator * */ @Component public class RoleConverter { private static final Map<Integer, String> ROLE_MAP = new HashMap<>(); @PostConstruct public void init() { ROLE_MAP.put(0, "ROLE_ADMIN"); ROLE_MAP.put(1, "ROLE_USER"); ROLE_MAP.put(2, "ROLE_MANAGER"); ROLE_MAP.put(3, "ROLE_AUDITOR"); } public List<GrantedAuthority> convert(int roleCode) { ObjectMapper mapper = new ObjectMapper(); try { System.out.println(mapper.writeValueAsString(Collections.singletonList( new SimpleGrantedAuthority(ROLE_MAP.getOrDefault(roleCode, "ROLE_GUEST")))).toString());//输出[{"authority":"ROLE_ADMIN"}] } catch (JsonProcessingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return Collections.singletonList( new SimpleGrantedAuthority(ROLE_MAP.getOrDefault(roleCode, "ROLE_GUEST")) ); } } function https(url,data,fu){ $.ajax({ contentType:"application/json", url: url, // 假设后端 API 地址 method: "POST", data: JSON.stringify(data), type: "json", success:fu, error: function (e) { console.error(e) alert("请求失败,请稍后再试!"+e); } }); } function checkLoginStatus() { if (window.location.href.includes('/login.html')) return; const username = localStorage.getItem("name"); if (!username) { window.location.href = '/KuCun2/login.html'; alert("meijin") return; } // 检查会话是否有效 fetch('/KuCun2/check-session', { headers: { "X-Requested-With": "XMLHttpRequest", // 显式添加头 "Content-Type": "application/json" }, credentials: 'include' // 强制携带 Cookie }).then(response => { if (!response.ok) { localStorage.removeItem("name"); alert("meijin2") window.location.href = '/KuCun2/login.html'; alert("meijin3") } }); } function deepMergeArrays(frontend, backend) { const resultMap = new Map(); // 遍历前端数据并存入 Map 中以便快速查找 frontend.forEach(item => resultMap.set(item.id, { ...item })); // 遍历后端数据并与前端数据进行合并 backend.forEach(item => { if (resultMap.has(item.id)) { // 如果存在相同 ID,则合并两者的内容 resultMap.set( item.id, Object.assign(resultMap.get(item.id), item) ); } else { // 如果不存在相同 ID,则新增该条目 resultMap.set(item.id, { ...item }); } }); // 将最终结果转回数组形式 return Array.from(resultMap.values()); } (function ($){ // 页面加载时检查登录状态 checkLoginStatus(); })(jQuery); function removeSpecificCharactersAndConvertToNumber(str, charsToRemove) { const regex = new RegExp(`[${charsToRemove}]`, 'g'); // 创建用于匹配指定字符的正则表达式 const cleanedStr = str.replace(regex, ''); // 移除指定字符 const numberValue = parseFloat(cleanedStr); // 转换为浮点数 return isNaN(numberValue) ? null : numberValue; // 如果无法解析,则返回 null } /// <reference path="jquery.d.ts" /> // $(document).ready(function(){ // $("#submit").click(function(){ // // // $.ajax({ // url:"../users/login", // async:false, // data:JSON.stringify({ // andy:$("#andy").val(), // pass:$("#pass").val(), // name:$("#name").val()}), // type:"post", // contentType:"application/json", // success:function(e){ // alert(e) // } // }); // // // }); // }) (function ($) { "use strict"; /*================================================================== [ Focus Contact2 ]*/ $('.input100').each(function () { $(this).on('blur', function () { if ($(this).val().trim() != "") { $(this).addClass('has-val'); } else { $(this).removeClass('has-val'); } }) }) /*================================================================== [ Validate ]*/ var input = $('.validate-input .input100'); $('.validate-form').on('submit', function (e) { e.preventDefault(); var check = true; for (var i = 0; i < input.length; i++) { if (validate(input[i]) == false) { showValidate(input[i]); check = false; } } if(check) login(input); return check; }); $('.validate-form .input100').each(function () { $(this).focus(function () { hideValidate(this); }); }); function validate(input) { if ($(input).attr('type') == 'email' || $(input).attr('name') == 'email') { if ($(input).val().trim().match(/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{1,5}|[0-9]{1,3})(\]?)$/) == null) { return false; } } else { if ($(input).val().trim() == '') { return false; } } } function showValidate(input) { var thisAlert = $(input).parent(); alert(input) $(thisAlert).addClass('alert-validate'); } function hideValidate(input) { var thisAlert = $(input).parent(); $(thisAlert).removeClass('alert-validate'); } // 登录按钮点击事件 function login(datas) { var data={} datas.each(function(a,element){ alert() data[$(element).attr('name')]=$(element).val() }) //var data={ andy,pass } // 模拟 AJAX 请求 https("/KuCun2/users/login",data,function (response) { alert("1"); if (response.name) { localStorage.setItem("name", response.name); // 保存用户名到本地存储 localStorage.setItem("role", response.role); // 保存权限到本地存储 alert( response) //window.location.href = '/KuCun2/index.html'; } else { alert("登录失败,请检查用户名和密码!"); } }) }; // 注销按钮点击事件 $("#logout-btn").click(function () { localStorage.removeItem("name"); // 清除本地存储中的用户名 checkLoginStatus(); // 更新登录状态 }); })(jQuery);2025-05-29 16:48:55.354 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/index.html", parameters={} 2025-05-29 16:48:55.372 DEBUG 2708 --- [nio-8080-exec-5] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.400 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.441 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/fonts/font-awesome-4.7.0/css/font-awesome.min.css", parameters={} 2025-05-29 16:48:55.442 DEBUG 2708 --- [nio-8080-exec-6] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.450 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.453 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/css/main.css", parameters={} 2025-05-29 16:48:55.455 DEBUG 2708 --- [nio-8080-exec-6] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.457 DEBUG 2708 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/css/util.css", parameters={} 2025-05-29 16:48:55.459 DEBUG 2708 --- [nio-8080-exec-7] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.459 DEBUG 2708 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/css/index2.css", parameters={} 2025-05-29 16:48:55.460 DEBUG 2708 --- [nio-8080-exec-9] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.461 DEBUG 2708 --- [nio-8080-exec-8] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/jsyilai.js", parameters={} 2025-05-29 16:48:55.462 DEBUG 2708 --- [nio-8080-exec-8] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.462 DEBUG 2708 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.465 DEBUG 2708 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/jquery-3.2.1.min.js", parameters={} 2025-05-29 16:48:55.465 DEBUG 2708 --- [nio-8080-exec-9] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.466 DEBUG 2708 --- [nio-8080-exec-8] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.473 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.506 DEBUG 2708 --- [nio-8080-exec-7] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.509 DEBUG 2708 --- [nio-8080-exec-9] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.619 DEBUG 2708 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/main/index.html", parameters={} 2025-05-29 16:48:55.621 DEBUG 2708 --- [nio-8080-exec-2] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.625 DEBUG 2708 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.678 DEBUG 2708 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/main.js?1748508535614&_=1748508535584", parameters={masked} 2025-05-29 16:48:55.681 DEBUG 2708 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.696 DEBUG 2708 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.711 DEBUG 2708 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/index.js?1748508535617&_=1748508535585", parameters={masked} 2025-05-29 16:48:55.711 DEBUG 2708 --- [nio-8080-exec-4] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.714 DEBUG 2708 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.769 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/main/bootstrap-3.3.7-dist/js/MyTable.js", parameters={} 2025-05-29 16:48:55.772 DEBUG 2708 --- [nio-8080-exec-5] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:55.783 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:55.846 DEBUG 2708 --- [nio-8080-exec-8] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/check-session", parameters={} 2025-05-29 16:48:55.851 DEBUG 2708 --- [nio-8080-exec-8] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.kucun.Config.SecurityConfig$SessionCheckController#checkSession(HttpServletRequest) 2025-05-29 16:48:55.903 DEBUG 2708 --- [nio-8080-exec-8] o.s.w.s.m.m.a.HttpEntityMethodProcessor : No match for [*/*], supported: [] 2025-05-29 16:48:55.904 DEBUG 2708 --- [nio-8080-exec-8] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.053 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/login.html", parameters={} 2025-05-29 16:48:56.054 DEBUG 2708 --- [nio-8080-exec-6] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.057 DEBUG 2708 --- [nio-8080-exec-6] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.177 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/fonts/font-awesome-4.7.0/css/font-awesome.min.css", parameters={} 2025-05-29 16:48:56.178 DEBUG 2708 --- [io-8080-exec-10] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.188 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.190 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/css/util.css", parameters={} 2025-05-29 16:48:56.190 DEBUG 2708 --- [io-8080-exec-10] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.204 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.206 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/css/main.css", parameters={} 2025-05-29 16:48:56.206 DEBUG 2708 --- [io-8080-exec-10] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.208 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.210 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/jquery-3.2.1.min.js", parameters={} 2025-05-29 16:48:56.210 DEBUG 2708 --- [io-8080-exec-10] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.218 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.220 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/jsyilai.js", parameters={} 2025-05-29 16:48:56.221 DEBUG 2708 --- [io-8080-exec-10] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.224 DEBUG 2708 --- [io-8080-exec-10] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.345 DEBUG 2708 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/images/bg-01.jpg", parameters={} 2025-05-29 16:48:56.347 DEBUG 2708 --- [nio-8080-exec-3] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.351 DEBUG 2708 --- [nio-8080-exec-3] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.367 DEBUG 2708 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/main.js?1748508536335&_=1748508536268", parameters={masked} 2025-05-29 16:48:56.368 DEBUG 2708 --- [nio-8080-exec-4] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.374 DEBUG 2708 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet : Completed 200 OK 2025-05-29 16:48:56.509 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : GET "/KuCun2/js/login.js?1748508536338&_=1748508536269", parameters={masked} 2025-05-29 16:48:56.510 DEBUG 2708 --- [nio-8080-exec-5] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/jsp/"] 2025-05-29 16:48:56.512 DEBUG 2708 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet : Completed 200 OK
05-30
2025-09-30 12:45:12,562 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:12,689 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:12,800 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:12,951 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:13,072 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:13,171 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:13,298 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:13,408 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:13,439 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:13,497 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:13,586 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:13,698 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:13,793 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:13,898 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:13,997 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:14,092 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:14,180 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:14,301 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:14,400 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:14,490 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:14,586 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:14,678 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:14,785 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:14,887 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:14,980 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:15,083 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:15,172 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:15,261 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:15,398 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:15,440 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:15,555 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:15,661 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:15,761 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:15,860 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:15,959 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:16,047 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:16,146 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:16,249 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:16,337 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:16,454 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:16,566 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:16,692 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:16,793 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:16,889 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:17,009 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:17,099 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:17,202 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:17,297 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:17,415 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:17,441 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:17,518 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:17,643 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:17,792 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:17,907 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:18,015 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:18,110 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:18,212 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:18,297 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:18,391 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:18,498 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:18,622 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:18,718 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:18,831 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:18,932 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:19,021 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:19,127 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:19,446 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:21,453 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:21,516 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:21,669 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:21,776 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:21,890 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:22,017 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:22,114 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:22,209 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:22,296 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:22,390 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:22,486 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:22,584 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:22,698 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:22,802 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:22,908 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:23,012 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:23,144 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:23,256 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:23,344 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:23,435 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:23,455 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:23,534 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:23,629 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:23,721 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:23,822 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:23,910 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:24,001 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:24,095 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:24,194 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:24,280 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:24,372 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:24,483 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:24,585 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:24,705 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:24,795 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:24,882 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:24,972 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:25,064 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:25,169 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:25,273 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:25,381 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:25,470 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:25,565 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:25,772 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:26,008 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:26,172 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:26,310 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:26,461 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:26,582 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:26,689 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:26,839 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:26,943 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:27,070 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:27,177 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:27,275 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:27,370 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:27,475 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:27,496 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:27,613 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:27,724 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:27,824 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:27,915 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:28,025 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:28,164 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:28,268 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:28,377 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:28,472 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:28,565 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:28,657 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:28,779 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:28,874 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:28,973 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:29,067 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:29,170 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:29,272 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:29,380 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:29,468 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:29,486 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:29,557 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:29,643 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:29,733 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:29,825 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:29,925 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:30,027 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:30,119 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:30,223 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:30,318 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:30,419 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:30,519 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:30,616 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:30,710 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:30,847 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:31,041 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:31,127 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:31,220 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:31,303 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:31,409 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:31,490 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:31,510 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:31,599 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:31,704 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:31,795 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:31,887 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:32,006 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:32,097 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:32,199 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:32,311 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:32,408 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:32,501 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:32,612 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:32,706 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:32,799 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:32,897 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:32,988 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:33,071 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:33,157 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:33,267 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:33,363 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:33,468 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:33,498 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:33,562 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:33,668 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:33,777 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:33,899 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:33,995 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:34,127 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:34,229 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:34,319 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:34,409 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:34,527 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:34,612 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:35,511 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:37,014 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:37,114 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:37,211 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:37,309 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:37,462 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:37,520 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:37,593 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:37,703 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:37,806 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:37,918 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:38,041 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:38,151 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:38,239 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:38,341 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:38,425 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:38,535 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:38,647 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:38,737 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:38,837 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:38,940 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:39,043 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:39,143 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:39,241 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:39,336 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:39,449 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:39,525 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:39,550 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:39,643 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:39,733 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:39,842 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:39,943 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:40,035 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:40,133 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:40,228 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:40,327 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:40,419 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:40,515 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:40,602 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:40,728 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:40,842 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:40,930 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:41,031 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:41,130 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:41,213 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:41,314 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:41,402 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:41,515 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:41,540 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:41,611 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:41,710 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:41,803 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:41,902 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:42,021 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:42,111 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:42,196 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:42,293 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:42,403 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:42,496 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:42,599 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:42,687 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:42,777 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:42,866 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:42,973 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:43,078 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:43,163 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:43,286 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:43,387 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:43,477 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:43,550 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:43,579 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:43,686 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:43,807 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:43,900 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:44,030 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:44,131 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:44,257 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:44,366 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:44,451 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:44,543 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:44,630 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:44,739 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:44,825 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:44,968 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:45,074 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:45,160 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:45,256 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:45,344 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:45,441 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:45,541 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:45,563 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:45,635 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:45,731 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:45,832 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:45,938 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:46,028 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:46,127 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:46,224 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:46,322 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:46,424 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:46,529 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:46,625 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:46,718 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:46,826 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:46,932 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:47,038 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:47,127 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:47,216 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:47,300 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:47,399 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:47,500 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:47,565 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:47,590 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:47,683 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:47,783 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:47,905 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:48,008 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:48,117 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:48,199 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:48,285 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:48,374 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:48,488 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:48,592 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:48,694 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:48,800 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:48,960 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:49,096 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:49,194 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:49,289 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:49,384 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:49,484 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:49,568 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:49,570 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:49,654 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:49,751 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:49,848 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:49,937 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:50,039 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:50,135 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:50,224 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:50,329 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:50,427 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:50,522 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:50,618 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:50,719 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:50,836 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:50,965 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:51,070 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:51,163 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:51,261 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:51,358 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:51,485 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:51,580 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:51,583 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:51,666 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:51,754 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:51,838 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:51,928 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:52,020 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:53,596 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:54,427 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:54,546 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:54,653 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:54,768 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:54,869 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:54,973 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:55,147 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:55,263 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:55,359 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:55,460 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:55,563 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:55,611 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:55,717 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:56,171 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:56,305 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:56,410 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:56,561 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:56,675 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:56,791 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:56,885 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:56,989 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:57,130 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:57,247 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:45:57,626 - WARNING - 等待帧超时,队列为空 2025-09-30 12:45:59,629 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:00,368 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:00,475 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:00,598 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:00,750 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:00,888 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:01,052 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:01,189 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:01,344 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:01,475 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:01,643 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:03,653 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:04,132 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:04,253 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:04,363 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:04,489 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:04,577 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:04,674 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:04,766 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:04,861 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:04,957 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:05,048 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:05,188 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:05,289 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:05,384 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:05,501 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:05,640 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:05,664 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:05,756 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:05,877 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:05,973 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:06,085 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:06,180 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:06,272 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:06,369 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:06,468 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:06,629 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:06,733 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:06,822 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:06,917 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:07,008 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:07,093 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:07,205 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:07,303 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:07,391 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:07,495 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:07,609 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:07,679 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:07,692 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:07,781 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:07,883 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:08,003 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:08,094 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:08,189 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:08,280 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:08,376 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:08,484 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:08,581 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:08,718 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:08,847 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:08,949 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:09,051 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:09,154 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:09,245 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:09,343 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:09,443 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:09,528 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:09,619 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:09,694 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:09,713 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:09,802 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:09,898 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:10,000 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:10,104 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:10,199 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:10,306 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:10,405 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:10,509 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:10,603 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:10,706 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:10,827 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:10,918 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:11,006 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:11,101 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:11,193 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:11,282 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:11,381 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:11,477 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:11,566 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:11,655 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:11,697 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:11,744 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:11,837 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:11,963 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:12,090 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:12,193 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:12,290 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:12,377 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:12,506 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:12,616 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:12,718 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:12,816 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:12,908 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:13,001 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:13,097 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:13,200 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:13,293 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:13,400 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:13,557 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:13,677 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:13,701 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:13,776 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:13,869 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:13,961 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:14,058 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:14,200 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:14,298 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:14,411 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:14,506 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:14,616 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:14,718 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:14,807 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:14,903 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:14,992 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:15,087 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:15,178 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:15,283 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:15,373 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:15,488 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:15,582 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:15,677 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:15,713 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:15,775 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:15,906 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:16,018 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:16,138 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:16,240 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:16,344 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:16,455 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:16,569 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:16,682 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:16,765 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:16,887 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:16,976 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:17,068 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:17,167 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:17,303 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:17,397 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:17,488 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:17,615 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:17,711 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:17,723 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:17,822 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:17,931 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:18,035 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:18,128 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:18,230 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:18,327 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:18,420 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:18,510 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:18,621 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:18,725 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:18,863 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:18,970 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:19,063 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:19,150 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:19,241 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:19,337 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:19,423 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:19,511 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:19,608 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:19,738 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:19,750 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:19,839 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:19,935 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:20,039 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:20,129 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:20,228 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:20,328 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:20,417 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:20,515 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:20,626 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:20,719 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:20,807 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:20,895 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:20,988 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:21,078 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:21,193 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:21,290 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:21,747 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:23,761 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:23,761 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:23,868 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:23,965 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:24,053 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:24,173 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:24,297 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:24,399 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:24,506 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:24,602 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:24,746 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:25,765 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:27,128 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:27,228 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:27,318 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:27,418 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:27,520 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:27,618 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:27,732 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:27,771 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:27,836 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:27,927 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:28,031 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:28,115 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:28,218 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:28,311 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:28,406 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:28,510 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:28,606 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:28,737 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:28,848 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:28,971 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:29,091 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:29,190 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:29,280 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:29,383 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:29,483 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:29,575 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:29,671 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:29,773 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:29,785 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:29,882 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:29,981 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:30,076 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:30,183 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:30,296 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:30,385 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:30,472 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:30,586 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:30,686 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:30,786 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:30,891 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:30,992 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:31,085 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:31,183 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:31,281 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:31,386 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:31,527 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:31,633 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:31,732 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:31,790 - WARNING - 等待帧超时,队列为空 2025-09-30 12:46:31,833 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:31,926 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:32,027 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:32,151 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:32,260 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:32,362 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:32,471 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:32,568 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:32,671 - WARNING - 接收到不完整帧,可能分辨率变化 2025-09-30 12:46:33,802 - WARNING - 等待帧超时,队列为空
10-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值