VideoAgentTrek Screen Filter数据库集成:过滤记录存储与审计日志系统设计

news2026/3/16 23:10:55
VideoAgentTrek Screen Filter数据库集成过滤记录存储与审计日志系统设计最近和几个做内容安全的朋友聊天他们都在头疼同一个问题用AI工具做视频内容过滤效果是有了但怎么把每次过滤的结果都清清楚楚地记下来方便以后查账、做审计这确实是个挺实际的需求。比如哪天需要回溯为什么某个视频被拦截了或者要统计一周内发现了多少违规内容如果数据没存好那就只能抓瞎。今天咱们就来聊聊怎么给VideoAgentTrek Screen Filter这个工具搭一个靠谱的“小账本”。这个账本不仅能存下每次过滤的详细记录比如哪个视频、哪一帧有问题、谁操作的、什么时候发生的还能让你通过一个简单的后台页面随时查、随时看、随时导出报表。这样一来不管是内部审查还是应对外部检查都能做到心里有数有据可查。1. 为什么需要数据库和审计日志你可能觉得过滤工具能实时把违规内容找出来不就行了干嘛还要费劲存到数据库里这里面的门道主要在于“可追溯”和“可管理”。想象一下你运营一个视频平台每天有海量内容上传。AI过滤系统自动屏蔽了一些视频。第二天有创作者申诉说自己的视频被误判了。你怎么处理如果没有记录你根本不知道系统当时“看到”了什么依据什么规则做出的判断。有了详细的日志你就能调出当时的截图、触发规则、置信度分数快速复核给用户一个明确的解释。再比如从管理角度老板可能想知道“过去一个月我们的主要风险点是什么是暴力内容多还是违规广告多” 或者安全团队需要定期生成合规报告。这些需求都依赖于一个结构化的、能持久保存的数据存储系统而不是散落在各个服务器日志文件里的碎片信息。所以给Screen Filter加上数据库集成核心价值就两点一是责任可追溯每一条处理记录都有据可查二是运营可分析能基于历史数据洞察风险趋势优化过滤策略。2. 设计你的“过滤记录账本”数据库表结构设计数据库就像设计一个档案柜的文件夹结构。我们要把一次过滤行为拆解成几个核心部分每个部分存到不同的“文件夹”数据表里并且建立好它们之间的联系。这里我们以最常用的MySQL为例来设计。主要会涉及三张核心表2.1 核心表过滤任务记录 (filter_jobs)这张表记录每一次过滤任务的元信息是总的“任务单”。CREATE TABLE filter_jobs ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键任务ID, job_id VARCHAR(64) NOT NULL UNIQUE COMMENT 业务唯一任务ID可用于外部关联, video_id VARCHAR(255) NOT NULL COMMENT 被处理的视频唯一标识, video_name VARCHAR(500) COMMENT 视频名称, source_url TEXT COMMENT 视频源地址, operator_id VARCHAR(128) COMMENT 操作人ID, operator_name VARCHAR(255) COMMENT 操作人姓名, status ENUM(pending, processing, completed, failed) DEFAULT pending COMMENT 任务状态, filter_policy TEXT COMMENT 本次过滤使用的策略或规则集JSON格式, total_frames INT DEFAULT 0 COMMENT 视频总帧数, processed_frames INT DEFAULT 0 COMMENT 已处理帧数, start_time DATETIME(3) COMMENT 任务开始时间精确到毫秒, end_time DATETIME(3) COMMENT 任务结束时间, created_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT 记录创建时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT过滤任务主表; -- 为常用查询字段创建索引加快查询速度 CREATE INDEX idx_video_id ON filter_jobs(video_id); CREATE INDEX idx_operator_id ON filter_jobs(operator_id); CREATE INDEX idx_status ON filter_jobs(status); CREATE INDEX idx_created_at ON filter_jobs(created_at);设计思路job_id是业务层面的唯一标识比如可以用UUID生成方便和你自己的业务系统对接。status字段让你能跟踪任务生命周期是排队中、处理中、已完成还是失败了。filter_policy用JSON格式存储当时使用的具体规则这样即使未来规则变了也能知道历史任务用的是哪套规则。时间戳都精确到毫秒对于高并发场景下的排序和问题排查很有帮助。2.2 核心表敏感帧检测记录 (filter_results)这是最关键的“明细账”记录每一帧里具体发现了什么问题。CREATE TABLE filter_results ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键, job_id VARCHAR(64) NOT NULL COMMENT 关联的任务ID, frame_index INT NOT NULL COMMENT 视频中的帧序号, frame_timestamp DECIMAL(10, 3) COMMENT 帧对应的时间戳秒含小数, detection_label VARCHAR(100) NOT NULL COMMENT 检测出的标签如“violence”, “nudity”, confidence DECIMAL(5, 4) NOT NULL COMMENT 置信度分数0-1之间, risk_level ENUM(low, medium, high, critical) COMMENT 风险等级, snapshot_path VARCHAR(1000) COMMENT 问题帧截图存储路径可选, metadata JSON COMMENT 其他元数据如边界框坐标、模型版本等JSON格式, created_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT 记录创建时间, FOREIGN KEY fk_job_id (job_id) REFERENCES filter_jobs(job_id) ON DELETE CASCADE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT敏感帧检测结果明细表; -- 索引设计 CREATE INDEX idx_job_id ON filter_results(job_id); CREATE INDEX idx_detection_label ON filter_results(detection_label); CREATE INDEX idx_risk_level ON filter_level(risk_level); CREATE INDEX idx_created_at ON filter_results(created_at);设计思路通过job_id外键关联到主任务确保数据一致性。detection_label和confidence是核心告诉你AI认为这是什么问题以及它有多确信。risk_level是一个简化字段你可以根据置信度和标签自定义规则来赋值比如置信度0.9的“violence”标记为critical方便后续按风险等级快速筛选。metadata字段非常灵活可以存下模型输出的原始数据比如识别框的位置(bbox)、用的哪个模型版本为未来的深度分析留出空间。2.3 辅助表审计日志 (audit_logs)这张表记录所有重要的系统操作尤其是人工干预行为是“操作日志”。CREATE TABLE audit_logs ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 主键, user_id VARCHAR(128) COMMENT 操作用户ID, user_name VARCHAR(255) COMMENT 操作用户名, action VARCHAR(50) NOT NULL COMMENT 操作类型如“REVIEW_PASS”, “REVIEW_BLOCK”, “RULE_UPDATE”, target_type VARCHAR(50) COMMENT 操作对象类型如“video”, “job”, “rule”, target_id VARCHAR(255) COMMENT 操作对象ID, details TEXT COMMENT 操作详情或理由, ip_address VARCHAR(45) COMMENT 操作IP地址, user_agent TEXT COMMENT 用户浏览器或客户端标识, created_at DATETIME(3) DEFAULT CURRENT_TIMESTAMP(3) COMMENT 操作时间 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT系统操作审计日志表; CREATE INDEX idx_user_id ON audit_logs(user_id); CREATE INDEX idx_action ON audit_logs(action); CREATE INDEX idx_created_at ON audit_logs(created_at); CREATE INDEX idx_target ON audit_logs(target_type, target_id);设计思路记录“谁”、“在什么时候”、“对什么”、“做了什么”。这是满足合规审计要求的黄金法则。比如审核人员推翻了AI的判断手动通过了一个被拦截的视频这个REVIEW_PASS动作及其理由(details)就必须记录下来。记录IP和User-Agent有助于在发生安全事件时进行溯源。3. 让数据自动入账编写数据入库逻辑表设计好了下一步就是让VideoAgentTrek Screen Filter在处理视频时自动把结果写到数据库里。我们需要在过滤逻辑的关键节点插入“写数据库”的代码。假设你用的是Python并且已经有了一个基本的过滤流程。下面是一个简化的集成示例import pymysql from datetime import datetime import uuid import json from contextlib import contextmanager # 数据库连接配置建议从环境变量或配置文件中读取 DB_CONFIG { host: localhost, user: your_username, password: your_password, database: content_filter_db, charset: utf8mb4 } class FilterResultDBWriter: 负责将过滤结果写入数据库的类 def __init__(self): self.connection None contextmanager def get_cursor(self): 获取数据库连接的上下文管理器确保连接正确关闭 conn pymysql.connect(**DB_CONFIG) cursor conn.cursor() try: yield cursor conn.commit() except Exception as e: conn.rollback() raise e finally: cursor.close() conn.close() def create_filter_job(self, video_id, video_name, operator_id, filter_policy): 创建一个新的过滤任务记录 job_id str(uuid.uuid4()) # 生成唯一任务ID start_time datetime.now() with self.get_cursor() as cursor: sql INSERT INTO filter_jobs (job_id, video_id, video_name, operator_id, status, filter_policy, start_time) VALUES (%s, %s, %s, %s, processing, %s, %s) cursor.execute(sql, (job_id, video_id, video_name, operator_id, json.dumps(filter_policy), start_time)) print(f[DB] 创建过滤任务成功Job ID: {job_id}) return job_id def save_detection_result(self, job_id, frame_result): 保存单帧的检测结果 # frame_result 是一个字典包含frame_index, label, confidence等信息 with self.get_cursor() as cursor: sql INSERT INTO filter_results (job_id, frame_index, detection_label, confidence, risk_level, metadata) VALUES (%s, %s, %s, %s, %s, %s) # 根据置信度计算风险等级示例逻辑 risk self._calculate_risk_level(frame_result[label], frame_result[confidence]) cursor.execute(sql, ( job_id, frame_result[frame_index], frame_result[label], float(frame_result[confidence]), risk, json.dumps(frame_result.get(metadata, {})) # 存为JSON )) def _calculate_risk_level(self, label, confidence): 简单的风险等级计算逻辑可根据业务规则自定义 if confidence 0.9: return critical elif confidence 0.7: return high elif confidence 0.5: return medium else: return low def update_job_status(self, job_id, status, total_framesNone, processed_framesNone): 更新任务状态和进度 update_fields [status %s] params [status] if total_frames is not None: update_fields.append(total_frames %s) params.append(total_frames) if processed_frames is not None: update_fields.append(processed_frames %s) params.append(processed_frames) if status completed or status failed: update_fields.append(end_time %s) params.append(datetime.now()) with self.get_cursor() as cursor: sql fUPDATE filter_jobs SET {, .join(update_fields)} WHERE job_id %s params.append(job_id) cursor.execute(sql, params) print(f[DB] 更新任务 {job_id} 状态为: {status}) def log_audit_action(self, user_id, action, target_type, target_id, details, request_infoNone): 记录一条审计日志 with self.get_cursor() as cursor: sql INSERT INTO audit_logs (user_id, action, target_type, target_id, details, ip_address, user_agent) VALUES (%s, %s, %s, %s, %s, %s, %s) ip request_info.get(ip) if request_info else None ua request_info.get(user_agent) if request_info else None cursor.execute(sql, (user_id, action, target_type, target_id, details, ip, ua)) # 在你的主过滤流程中集成 def main_filter_process(video_path, operator_id): db_writer FilterResultDBWriter() # 1. 创建任务记录 job_id db_writer.create_filter_job( video_idvideo_12345, video_name示例视频.mp4, operator_idoperator_id, filter_policy{version: 1.0, rules: [violence, nudity]} ) try: # 2. 模拟视频处理和分析过程 total_frames 1000 db_writer.update_job_status(job_id, processing, total_framestotal_frames) for frame_idx in range(total_frames): # 这里是调用VideoAgentTrek Screen Filter分析每一帧的伪代码 # detection_result screen_filter.analyze_frame(frame) # 假设我们得到了一个模拟结果 simulated_result { frame_index: frame_idx, label: violence if frame_idx % 100 0 else safe, # 模拟每100帧有一个违规 confidence: 0.95 if frame_idx % 100 0 else 0.1, metadata: {model_version: v2.1} } # 只保存被标记为有问题的帧节省空间 if simulated_result[label] ! safe: db_writer.save_detection_result(job_id, simulated_result) # 更新处理进度 if frame_idx % 100 0: db_writer.update_job_status(job_id, processing, processed_framesframe_idx) # 3. 任务完成 db_writer.update_job_status(job_id, completed, processed_framestotal_frames) print(过滤任务完成数据已保存。) except Exception as e: # 4. 任务失败 db_writer.update_job_status(job_id, failed) print(f过滤任务失败: {e}) raise # 模拟一次人工审核通过的操作 def manual_review_approve(user_id, job_id, reason, request): db_writer FilterResultDBWriter() db_writer.log_audit_action( user_iduser_id, actionREVIEW_PASS, target_typejob, target_idjob_id, detailsf人工复核通过。理由{reason}, request_info{ip: request.remote_addr, user_agent: request.user_agent} ) print(审计日志已记录。)这段代码提供了一个清晰的骨架。FilterResultDBWriter类封装了所有数据库操作你的主程序只需要在关键节点调用对应的方法即可。这样做的好处是业务逻辑和数据持久化逻辑分离代码更清晰也更容易做单元测试。4. 搭建你的“查账后台”简易日志管理系统数据存进去了最后一步就是让人能方便地查看和管理。我们用一个简单的Web后台来实现。这里用Flask框架快速演示你可以根据喜好换成Django、FastAPI或其他技术。# app.py - 一个简单的Flask后台管理应用 from flask import Flask, render_template, request, jsonify, send_file import pymysql from datetime import datetime, timedelta import csv from io import StringIO import json app Flask(__name__) app.config[DB_CONFIG] { /* 你的数据库配置 */ } def get_db_connection(): return pymysql.connect(**app.config[DB_CONFIG]) app.route(/) def index(): 后台管理首页 return render_template(dashboard.html) app.route(/api/jobs) def list_jobs(): API分页查询过滤任务列表 page int(request.args.get(page, 1)) size int(request.args.get(size, 20)) video_id request.args.get(video_id, ) operator request.args.get(operator, ) status request.args.get(status, ) start_date request.args.get(start_date, ) end_date request.args.get(end_date, ) offset (page - 1) * size query_params [] where_clauses [] if video_id: where_clauses.append(video_id LIKE %s) query_params.append(f%{video_id}%) if operator: where_clauses.append(operator_name LIKE %s) query_params.append(f%{operator}%) if status: where_clauses.append(status %s) query_params.append(status) if start_date: where_clauses.append(created_at %s) query_params.append(start_date) if end_date: where_clauses.append(created_at %s) query_params.append(end_date) where_sql AND .join(where_clauses) if where_clauses else 11 conn get_db_connection() try: with conn.cursor(pymysql.cursors.DictCursor) as cursor: # 查询数据 sql f SELECT id, job_id, video_id, video_name, operator_name, status, total_frames, processed_frames, start_time, end_time, created_at FROM filter_jobs WHERE {where_sql} ORDER BY created_at DESC LIMIT %s OFFSET %s query_params.extend([size, offset]) cursor.execute(sql, query_params) jobs cursor.fetchall() # 查询总数 count_sql fSELECT COUNT(*) as total FROM filter_jobs WHERE {where_sql} cursor.execute(count_sql, query_params[:-2]) # 去掉LIMIT的参数 total cursor.fetchone()[total] return jsonify({code: 0, data: jobs, total: total}) finally: conn.close() app.route(/api/job/job_id/details) def get_job_details(job_id): API获取单个任务的详细结果包括敏感帧列表 conn get_db_connection() try: with conn.cursor(pymysql.cursors.DictCursor) as cursor: # 获取任务基本信息 cursor.execute(SELECT * FROM filter_jobs WHERE job_id %s, (job_id,)) job_info cursor.fetchone() if not job_info: return jsonify({code: 404, msg: 任务不存在}) # 获取该任务的敏感帧结果 cursor.execute( SELECT frame_index, frame_timestamp, detection_label, confidence, risk_level, created_at FROM filter_results WHERE job_id %s ORDER BY frame_index , (job_id,)) frames cursor.fetchall() # 按标签统计 cursor.execute( SELECT detection_label, COUNT(*) as count, AVG(confidence) as avg_confidence FROM filter_results WHERE job_id %s GROUP BY detection_label , (job_id,)) stats cursor.fetchall() job_info[detection_frames] frames job_info[statistics] stats return jsonify({code: 0, data: job_info}) finally: conn.close() app.route(/api/stats/daily) def get_daily_stats(): API获取近期的每日统计用于仪表盘图表 days int(request.args.get(days, 7)) conn get_db_connection() try: with conn.cursor(pymysql.cursors.DictCursor) as cursor: sql SELECT DATE(created_at) as date, COUNT(*) as total_jobs, SUM(CASE WHEN status completed THEN 1 ELSE 0 END) as completed_jobs, SUM(CASE WHEN status failed THEN 1 ELSE 0 END) as failed_jobs, (SELECT COUNT(DISTINCT job_id) FROM filter_results WHERE DATE(created_at) DATE(filter_jobs.created_at)) as jobs_with_issues FROM filter_jobs WHERE created_at DATE_SUB(NOW(), INTERVAL %s DAY) GROUP BY DATE(created_at) ORDER BY date cursor.execute(sql, (days,)) daily_data cursor.fetchall() # 风险标签分布 label_sql SELECT detection_label, COUNT(*) as count FROM filter_results WHERE created_at DATE_SUB(NOW(), INTERVAL %s DAY) GROUP BY detection_label ORDER BY count DESC LIMIT 10 cursor.execute(label_sql, (days,)) label_dist cursor.fetchall() return jsonify({ code: 0, daily_trend: daily_data, label_distribution: label_dist }) finally: conn.close() app.route(/api/export/csv) def export_to_csv(): 导出指定时间段的过滤结果到CSV start_date request.args.get(start_date) end_date request.args.get(end_date) if not start_date or not end_date: return jsonify({code: 400, msg: 请指定开始和结束日期}) conn get_db_connection() try: with conn.cursor(pymysql.cursors.DictCursor) as cursor: sql SELECT j.job_id, j.video_id, j.video_name, j.operator_name, j.status, j.start_time, j.end_time, r.frame_index, r.detection_label, r.confidence, r.risk_level, r.created_at FROM filter_jobs j LEFT JOIN filter_results r ON j.job_id r.job_id WHERE j.created_at BETWEEN %s AND %s ORDER BY j.created_at DESC, r.frame_index cursor.execute(sql, (start_date, end_date)) rows cursor.fetchall() # 生成CSV output StringIO() writer csv.DictWriter(output, fieldnamesrows[0].keys() if rows else []) writer.writeheader() writer.writerows(rows) csv_data output.getvalue() output.close() # 返回CSV文件下载 from io import BytesIO mem BytesIO() mem.write(csv_data.encode(utf-8-sig)) # 支持Excel中文 mem.seek(0) filename ffilter_logs_{start_date}_to_{end_date}.csv return send_file(mem, as_attachmentTrue, download_namefilename, mimetypetext/csv) finally: conn.close() if __name__ __main__: app.run(debugTrue)对应的需要一个简单的前端页面templates/dashboard.html来展示这里用一点简单的HTML和JavaScript示意!DOCTYPE html html head title过滤日志审计后台/title script srchttps://cdn.jsdelivr.net/npm/chart.js/script style body { font-family: sans-serif; margin: 20px; } .filter-box { background: #f5f5f5; padding: 15px; margin-bottom: 20px; border-radius: 5px; } table { width: 100%; border-collapse: collapse; margin-top: 10px; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #4CAF50; color: white; } .low-risk { background-color: #d4edda; } .medium-risk { background-color: #fff3cd; } .high-risk { background-color: #f8d7da; } /style /head body h1视频过滤审计日志系统/h1 div classfilter-box h3数据概览近7天/h3 div canvas iddailyChart width400 height200/canvas /div div idlabelStats/div /div div classfilter-box h3任务查询/h3 div input typetext idvideoId placeholder视频ID input typetext idoperator placeholder操作人 select idstatus option value全部状态/option option valuecompleted已完成/option option valuefailed失败/option /select button onclickloadJobs()查询/button button onclickexportLogs()导出CSV/button /div div idjobTable/div div idpagination/div /div div iddetailPanel styledisplay:none; h3任务详情/h3 div idjobDetail/div button onclickcloseDetail()关闭/button /div script // 加载图表和数据 function loadDashboard() { fetch(/api/stats/daily?days7) .then(r r.json()) .then(data { // 渲染图表... console.log(仪表盘数据:, data); // 渲染标签分布 document.getElementById(labelStats).innerHTML data.label_distribution.map(l ${l.detection_label}: ${l.count}次).join( | ); }); } function loadJobs(page1) { const params new URLSearchParams({ page, size: 20, video_id: document.getElementById(videoId).value, operator: document.getElementById(operator).value, status: document.getElementById(status).value }); fetch(/api/jobs?${params}) .then(r r.json()) .then(data { // 渲染表格... let html tabletrth任务ID/thth视频/thth操作人/thth状态/thth开始时间/thth操作/th/tr; data.data.forEach(job { html tr td${job.job_id}/td td${job.video_name}/td td${job.operator_name}/td td${job.status}/td td${new Date(job.start_time).toLocaleString()}/td tdbutton onclickviewDetail(${job.job_id})查看详情/button/td /tr; }); html /table; document.getElementById(jobTable).innerHTML html; // 渲染分页... }); } function viewDetail(jobId) { fetch(/api/job/${jobId}/details) .then(r r.json()) .then(data { // 渲染详情面板... document.getElementById(detailPanel).style.display block; let detailHtml h4任务信息/h4pre${JSON.stringify(data.data, null, 2)}/pre; document.getElementById(jobDetail).innerHTML detailHtml; }); } function exportLogs() { const start prompt(请输入开始日期 (YYYY-MM-DD):); const end prompt(请输入结束日期 (YYYY-MM-DD):); if(start end) { window.open(/api/export/csv?start_date${start}end_date${end}); } } // 初始化 loadDashboard(); loadJobs(); /script /body /html这个后台虽然简单但具备了核心功能仪表盘查看整体数据趋势表格查询和筛选具体任务详情页查看每次过滤的敏感帧明细以及数据导出功能。你可以在此基础上增加用户权限管理、更复杂的图表分析、批量操作等功能让它更贴合你的实际业务。5. 总结整套方案走下来其实思路很清晰先设计好存数据的“柜子”数据库表然后在过滤流程里把关键信息“放进去”数据入库最后做个“查看窗口”后台管理系统。对于大多数需要合规审计的场景这个框架已经能解决八成的问题了。实际部署时你可能会遇到数据量大的情况这时候可以考虑给created_at这类时间字段加索引或者对历史数据进行归档。如果团队规模大操作日志audit_logs会变得非常重要它是厘清责任的关键。前端界面也可以做得更友好比如加入时间范围选择器、风险等级颜色标识、甚至直接预览问题帧截图。最重要的是这个系统让你对AI过滤的过程从“黑盒”变成了“白盒”。每一次拦截、每一个判断都有迹可循既能用于内部优化算法也能在需要时对外提供透明的解释。如果你正在为内容审核的合规性发愁不妨从搭建这样一个基础的日志审计系统开始。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2417458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…