尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
LangGraph工程化实战:构建可调试、可审计、高并发AI Agent
简介这是一份面向AI应用开发工程师的系统性AI Agent实战学习资源聚焦大模型智能体从理论到落地的全链路能力构建覆盖LangChain、LangGraph、Coze、Dify等主流框架及RAG、提示词工程、企业级部署与微调等核心模块解决开发者在智能体项目中缺乏完整路径、工程经验与面试准备的痛点。资源包共2000个文件以1588张技术示意图png/jpeg/svg直观呈现架构流程与界面操作辅以127个可运行Python脚本、83篇结构化Markdown笔记、13段关键操作MP4视频及7个Excel数据集总大小513.49MB内容组织按学习阶段分层便于循序渐进掌握。目前已有222人下载学习。读者可直接复用金融投研助手、医疗问诊系统、电商客服智能体等5个企业级实战项目的完整代码、配置文件与调试日志获取涵盖算法推导、系统设计、故障排查的高频面试题库及参考答案并获得RAG文档预处理、LoRA微调参数、LangGraph状态机定义等精准到配置项与版本兼容性的实操细节。1. 这不是“搭积木”2026年AI Agent速成指南专治「学了LangChain却写不出能跑通的智能体」你花三天啃完LangChain文档照着官方示例跑通了OpenAIFunctionsAgent兴奋地把agent.invoke({input: 查下今天北京天气})发进Jupyter——结果返回一串JSON格式错误你又换LangGraph重写画出带StateGraph和add_node的流程图本地调试时节点死在tool_executor里日志只报TypeError: NoneType object is not callable更常见的是项目上线后QPS刚过5API就开始超时监控显示90%耗时卡在LLM调用等待队列。这不是你代码写得差而是2026年真实生产环境里的AI Agent开发早就不靠“调通一个demo”来定义成功。本指南不讲抽象概念不堆API列表只聚焦三件事怎么让Agent在真实业务流里扛住并发、怎么用LangGraph把状态流转变成可审计的确定性行为、怎么把面试官问“你这个Agent失败了怎么定位”的问题变成你简历里可演示的SOP。适合两类人一是已会PythonFastAPI但被Agent工程化卡住的中级开发者二是正从传统后端/数据工程转向大模型应用开发的转岗工程师。所有内容均基于2024–2025年国内一线AI中台团队落地的17个Agent项目复盘含3个已上线金融/政务场景的完整链路。2. 从零启动用LangChainLangGraph构建第一个可调试、可追踪的Agent2.1 为什么必须放弃initialize_agent()选型依据与架构分层LangChain官方文档里那个initialize_agent(..., agent_typeopenai-tools)是教学友好型陷阱。它把工具注册、提示词组装、LLM调用、工具执行全封装进黑匣子导致两个致命问题一是无法在工具执行前注入业务校验逻辑比如检查用户是否有权限调用“转账”工具二是当工具返回异常时错误堆栈直接消失在AgentExecutor内部你只能看到AgentExecutionError而不知具体哪行Python代码崩了。2026年主流做法是显式分层Orchestration Layer编排层用LangGraph的StateGraph定义状态机每个节点对应一个明确职责如validate_input、route_to_tool、format_responseTool Layer工具层所有工具函数必须带类型注解、输入校验、重试策略且返回结构统一为ToolResult(success: bool, data: dict, error: str)LLM Abstraction LayerLLM抽象层不直接调用ChatOpenAI而是封装LLMRouter类内置缓存、降级开关、token用量统计钩子。这种分层不是为了炫技而是为后续加监控埋点。比如你在route_to_tool节点里加一行logger.info(fRouting to {tool_name} for user_id{state[user_id]})就能在ELK里直接查“某用户连续5次调用失败是否都路由到同一工具”。2.2 最小可运行Agent57行代码跑通带状态追踪的循环以下代码是2026年新入职工程师第一天必须手敲的“Hello World”它不依赖任何外部API所有工具用内存模拟但具备生产环境必需的三大能力状态可序列化、节点可单独测试、失败可回溯。# agent_core.py from typing import TypedDict, Annotated, Sequence import operator from langgraph.graph import StateGraph, END from langgraph.checkpoint.memory import MemorySaver class AgentState(TypedDict): input: str user_id: str tool_calls: Annotated[Sequence[dict], operator.add] tool_results: Annotated[Sequence[dict], operator.add] retry_count: int final_answer: str def validate_input(state: AgentState) - AgentState: if not state[input].strip(): raise ValueError(Input cannot be empty) if len(state[input]) 500: raise ValueError(Input too long, max 500 chars) return {retry_count: 0} def route_to_tool(state: AgentState) - str: # 简单路由含天气走weather含股票走stock if 天气 in state[input]: return weather_tool elif 股票 in state[input]: return stock_tool else: return default_response def weather_tool(state: AgentState) - AgentState: # 模拟调用天气API实际应替换为requests.post(...) return { tool_results: [{tool: weather, data: {city: 北京, temp: 22°C, condition: 晴}}] } def stock_tool(state: AgentState) - AgentState: return { tool_results: [{tool: stock, data: {symbol: AAPL, price: 182.34}}] } def default_response(state: AgentState) - AgentState: return {final_answer: 我不理解您的请求请用‘查天气’或‘查股票’开头} def format_response(state: AgentState) - AgentState: if state.get(tool_results): result state[tool_results][-1] if result[tool] weather: return {final_answer: f北京天气{result[data][temp]}{result[data][condition]}} elif result[tool] stock: return {final_answer: f{result[data][symbol]}当前股价${result[data][price]:.2f}} return {final_answer: 服务暂时不可用} # 构建图 workflow StateGraph(AgentState) workflow.add_node(validate_input, validate_input) workflow.add_node(route_to_tool, route_to_tool) workflow.add_node(weather_tool, weather_tool) workflow.add_node(stock_tool, stock_tool) workflow.add_node(default_response, default_response) workflow.add_node(format_response, format_response) workflow.set_entry_point(validate_input) workflow.add_edge(validate_input, route_to_tool) workflow.add_conditional_edges( route_to_tool, lambda x: x, { weather_tool: weather_tool, stock_tool: stock_tool, default_response: default_response } ) workflow.add_edge(weather_tool, format_response) workflow.add_edge(stock_tool, format_response) workflow.add_edge(default_response, format_response) workflow.add_edge(format_response, END) # 启用内存检查点支持断点续跑 app workflow.compile(checkpointerMemorySaver())关键参数说明Annotated[Sequence[dict], operator.add]这是LangGraph 0.1.0强制要求的状态字段类型operator.add表示该字段在节点间自动累加如多次调用工具tool_results会合并成列表checkpointerMemorySaver()不是可选项是调试刚需。它让每次app.invoke()调用后状态快照存入内存你可用app.get_state(config)随时查看中间值lambda x: x作为条件边函数看似冗余实则是为后续扩展留口——当你要根据LLM输出动态路由时这里换成llm_router.invoke(state)即可无需改图结构。2.3 本地调试三板斧用get_state()、stream()、interrupt()定位每一毫秒光有代码不够得知道怎么“看”它在跑什么。LangGraph的调试能力远超旧版LangChain核心是三个方法第一板斧get_state()查快照config {configurable: {thread_id: test-001}} # 先触发一次调用 app.invoke({input: 查下北京天气, user_id: u123}, configconfig) # 再查状态看到完整流转路径 state app.get_state(config) print(f当前节点: {state.values.get(current_node)}) print(f工具结果: {state.values.get(tool_results)}) # 输出: 当前节点: format_response, 工具结果: [{tool: weather, ...}]第二板斧stream()看实时流# 不用等整个流程结束边跑边看 for output in app.stream({input: 查股票AAPL, user_id: u123}, config): print(f节点 {list(output.keys())[0]} 输出: {list(output.values())[0]}) # 输出: # 节点 validate_input 输出: {retry_count: 0} # 节点 route_to_tool 输出: stock_tool # 节点 stock_tool 输出: {tool_results: [{tool: stock, ...}]} # 节点 format_response 输出: {final_answer: AAPL当前股价$182.34}第三板斧interrupt()插桩断点# 在weather_tool节点后中断手动检查状态再继续 app.invoke( {input: 查天气, user_id: u123}, config{configurable: {thread_id: debug-001, interrupt_after: [weather_tool]}} ) # 此时流程停在weather_tool后调用get_state()可修改state再resume state app.get_state({configurable: {thread_id: debug-001}}) state.values[tool_results][0][data][temp] 25°C # 强制改结果 app.update_state({configurable: {thread_id: debug-001}}, state.values) app.invoke(None, config{configurable: {thread_id: debug-001}}) # resume这三招组合让你彻底告别print()调试。尤其interrupt_after是排查“为什么工具返回了但没走到format_response”的终极武器——它能证明问题出在条件边逻辑而非工具本身。3. 生产就绪让Agent扛住并发、可审计、能降级3.1 并发瓶颈在哪用asyncThreadPoolExecutor榨干CPULangGraph默认是同步执行当10个请求同时进来weather_tool节点会排队执行哪怕它只是个内存计算。真实场景中工具常涉及HTTP调用天气API、数据库查询用户余额、文件IO读取PDF这些I/O操作必须异步化。但注意不是所有工具都适合async。比如调用requests.get()必须用asyncio.to_thread()包一层而纯Python计算如字符串解析用concurrent.futures.ThreadPoolExecutor更高效。# tools/weather.py import asyncio import aiohttp from concurrent.futures import ThreadPoolExecutor # 方案AI/O密集型工具用aiohttp推荐 async def async_weather_api(city: str) - dict: async with aiohttp.ClientSession() as session: async with session.get(fhttps://api.example.com/weather?city{city}) as resp: return await resp.json() # 方案BCPU密集型工具用线程池避免asyncio事件循环阻塞 def cpu_intensive_parse(raw_text: str) - dict: # 模拟NLP解析耗CPU import time; time.sleep(0.1) # 占用CPU 100ms return {parsed: raw_text[:100]} # 在LangGraph节点中调用 async def weather_tool(state: AgentState) - AgentState: # I/O工具直接await weather_data await async_weather_api(北京) # CPU工具用线程池 with ThreadPoolExecutor(max_workers4) as executor: loop asyncio.get_event_loop() parsed await loop.run_in_executor(executor, cpu_intensive_parse, str(weather_data)) return {tool_results: [{tool: weather, data: {**weather_data, **parsed}}]}参数调优经验ThreadPoolExecutor(max_workers4)不是越大越好。经压测当worker数超过CPU核数×2线程切换开销反超收益aiohttp连接池必须显式配置aiohttp.TCPConnector(limit100, limit_per_host20)否则默认100连接会被瞬间打满所有异步工具函数必须加traceable装饰器用LangSmith否则分布式追踪里看不到工具耗时。3.2 可审计性给每个Agent调用打上“数字指纹”政务/金融类项目强制要求任何Agent输出必须能追溯到原始输入、所用模型版本、工具调用链、人工审核记录。LangGraph本身不提供审计能力需在State中嵌入audit_log字段并用app.add_node()注入审计节点。def audit_log(state: AgentState) - AgentState: import uuid, datetime audit_id str(uuid.uuid4()) log_entry { audit_id: audit_id, timestamp: datetime.datetime.now().isoformat(), user_id: state[user_id], input: state[input], model_used: qwen2.5-72b, tools_called: [r[tool] for r in state.get(tool_results, [])], status: success if state.get(final_answer) else failed } # 写入审计数据库此处简化为print实际用SQLAlchemy异步写 print(f[AUDIT] {log_entry}) return {audit_id: audit_id} # 插入到图中 workflow.add_node(audit_log, audit_log) workflow.add_edge(format_response, audit_log) workflow.add_edge(audit_log, END)审计字段设计原则audit_id必须全局唯一且可索引建议用ulid比UUID更有序利于时间范围查询model_used不能写死应从LLMRouter的get_current_model()动态获取确保模型热切换时审计日志同步更新tools_called存工具名列表而非完整调用栈——后者体积太大且tool_results里已有详细数据审计库只需存轻量索引。3.3 降级策略当LLM挂了Agent还能回答“我不知道”LLM服务不可用是常态。2026年成熟方案是三级降级一级降级毫秒级LLM调用超时2s返回预设兜底话术二级降级秒级LLM连续3次超时自动切换备用模型如从Qwen切到GLM三级降级分钟级备用模型也失效启用规则引擎Rule Engine——用正则关键词匹配生成答案。# llm_router.py import asyncio from langchain_community.chat_models import ChatOllama from langchain_core.messages import HumanMessage class LLMRouter: def __init__(self): self.primary ChatOllama(modelqwen2.5:72b, timeout2.0) self.backup ChatOllama(modelglm4:latest, timeout3.0) self.rule_engine RuleEngine() # 见下文 async def invoke(self, messages: list) - str: try: # 一级主模型超时即降级 return await asyncio.wait_for( self.primary.ainvoke(messages), timeout2.0 ) except asyncio.TimeoutError: try: # 二级切备用模型 return await asyncio.wait_for( self.backup.ainvoke(messages), timeout3.0 ) except asyncio.TimeoutError: # 三级规则引擎兜底 return self.rule_engine.fallback(messages[-1].content) class RuleEngine: def fallback(self, input_text: str) - str: if 天气 in input_text: return 我暂时无法获取实时天气请稍后再试。 elif 股票 in input_text: return 股市数据暂不可用建议通过证券APP查询。 else: return 当前服务繁忙请描述更具体的问题。血泪经验asyncio.wait_for()的timeout必须小于HTTP客户端的timeout如aiohttp的timeout.total否则外层超时后内层还在跑浪费资源规则引擎的fallback方法必须是纯函数、无IO、无网络调用确保在LLM全挂时仍能毫秒响应降级开关要可动态配置用Redis存llm:degrade:enabled运维可随时SET llm:degrade:enabled 1强制降级。4. 避坑指南LangChainLangGraph项目里最常踩的5个深坑4.1 现象StateGraph编译时报ValidationError: field required但所有字段都写了原因LangGraph 0.1.x要求State类中每个字段必须有默认值或类型注解中的Optional即使你声明了str也必须写input: str 。旧版LangChain允许input: str但LangGraph会严格校验Pydantic v2的strict模式。解决将AgentState改为TypedDict并补全默认值from typing import TypedDict, Annotated, Sequence, Optional import operator class AgentState(TypedDict): input: str user_id: str tool_calls: Annotated[Sequence[dict], operator.add] tool_results: Annotated[Sequence[dict], operator.add] retry_count: int final_answer: str # ✅ 必须加这一行否则编译失败 audit_id: Optional[str] # 或 audit_id: str 4.2 现象本地stream()调试正常部署到K8s后stream()返回空迭代器原因K8s Pod默认关闭stdout行缓冲stream()依赖print()逐行输出当输出未换行或缓冲未刷新前端收不到数据。解决在stream()循环中强制刷新import sys for output in app.stream(input_data, config): print(json.dumps(output), flushTrue) # ✅ 加flushTrue sys.stdout.flush() # ✅ 双保险同时在Dockerfile中加ENV PYTHONUNBUFFERED1确保Python不缓存stdout。4.3 现象tool_executor节点报TypeError: NoneType object is not callable原因工具函数返回None而LangGraph的tool_executor期望返回dict或BaseModel。常见于工具里用了return但没写返回值或异常分支漏了return。解决所有工具函数末尾加防御性返回def weather_tool(state: AgentState) - AgentState: try: data call_weather_api(state[input]) return {tool_results: [{tool: weather, data: data}]} except Exception as e: # ✅ 必须返回不能只raise return {tool_results: [{tool: weather, error: str(e)}]}4.4 现象MemorySaver在多进程下状态丢失get_state()查不到历史原因MemorySaver是纯内存实现K8s多副本或Gunicorn多Worker时每个进程有独立内存状态不共享。解决生产必须换PostgresSaver或RedisSaverfrom langgraph.checkpoint.postgres import PostgresSaver import psycopg # 初始化Postgres连接池 conn psycopg.connect(hostlocalhost dbnamelanggraph userpg password123) checkpointer PostgresSaver(conn) app workflow.compile(checkpointercheckpointer)注意Postgres需提前建表执行checkpointer.setup()否则首次invoke会报错。4.5 现象用traceable装饰工具函数LangSmith里看不到工具耗时原因traceable必须作用于异步函数且调用链中不能有同步阻塞操作如time.sleep()。若工具里混用time.sleep()整个trace会被截断。解决所有工具函数声明为async def同步阻塞操作用await asyncio.to_thread(time.sleep, 0.1)traceable放在async def上方且run_typetoolfrom langsmith import traceable traceable(run_typetool) async def weather_tool(state: AgentState) - AgentState: await asyncio.to_thread(time.sleep, 0.1) # ✅ 正确 # ...5. 面试通关用一个真实项目拆解“智能体开发工程师”考什么5.1 面试官真正在意的不是你会不会写add_node而是你如何定义“一个好Agent”2026年大厂AI岗位面试已淘汰“手写Agent代码”环节转为场景化系统设计题。例如“请设计一个销售陪练Agent帮助新人销售模拟客户异议处理。要求1能根据客户画像年龄/行业/历史投诉动态调整话术2每次模拟后生成改进建议3支持人工教练介入修正”。这类题考察三层能力能力层面试官想听的答案要点你该避开的雷区业务理解层“客户画像应作为State字段传入话术模板存在向量库用RAG检索匹配度0.85的案例”只说“用LLM生成话术”不提数据源和匹配逻辑工程鲁棒层“异议检测用规则引擎初筛关键词正则再送LLM精标避免LLM误判‘价格贵’为投诉”声称“全靠LLM识别”无兜底方案可观测层“每个模拟session生成audit_id关联到CRM工单号教练介入时自动拉取历史3次对话”不提审计、不提与现有系统集成玄学提醒当面试官问“如果客户说‘你们产品太贵’Agent怎么回应”千万别答“让LLM自由发挥”。正确答案是“先查该客户所在行业的平均客单价若报价低于均值10%返回‘我们提供行业性价比最优方案’若高于均值则触发‘价值澄清’子流程用3个客户案例证明ROI”。5.2 实战项目用FastAPILangGraph搭建“销售陪练Agent”最小可行版我们用200行代码实现上述面试题的核心链路重点展示如何把业务规则硬编码进StateGraph而非依赖LLM幻觉。# sales_coach.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from langgraph.graph import StateGraph, END from typing import Dict, List, Optional class SalesState(BaseModel): customer_profile: Dict # {age: 35, industry: 电商, complaints: 2} current_dialogue: List[Dict] # [{role: user, content: 太贵了}] suggested_response: str improvement_tips: List[str] audit_id: str def load_industry_benchmarks(industry: str) - Dict: # 真实项目应从DB查此处硬编码 benchmarks { 电商: {avg_price: 8000, roi_months: 3}, 制造: {avg_price: 12000, roi_months: 6} } return benchmarks.get(industry, {avg_price: 10000, roi_months: 4}) def detect_complaint(state: SalesState) - SalesState: last_user_msg state.current_dialogue[-1][content] # ✅ 用规则引擎初筛非LLM if any(word in last_user_msg for word in [贵, 贵了, 太贵]): benchmark load_industry_benchmarks(state.customer_profile[industry]) if state.customer_profile.get(budget, 0) benchmark[avg_price] * 0.9: state.suggested_response f我们理解预算关切。行业平均投入是{benchmark[avg_price]}元您当前方案已节省{int((benchmark[avg_price]-state.customer_profile.get(budget,0))/benchmark[avg_price]*100)}%。 else: state.suggested_response f投资回报周期约{benchmark[roi_months]}个月这是电商客户平均数据。 else: state.suggested_response 请具体说明您的顾虑我会针对性解答。 return state def generate_tips(state: SalesState) - SalesState: # ✅ 基于对话轮次生成建议非LLM生成 turns len(state.current_dialogue) if turns 2: state.improvement_tips [保持开放提问避免过早解释] elif turns 4: state.improvement_tips [尝试用客户行业案例佐证] else: state.improvement_tips [总结客户核心诉求确认理解一致] return state # 构建图 workflow StateGraph(SalesState) workflow.add_node(detect_complaint, detect_complaint) workflow.add_node(generate_tips, generate_tips) workflow.set_entry_point(detect_complaint) workflow.add_edge(detect_complaint, generate_tips) workflow.add_edge(generate_tips, END) app workflow.compile() # FastAPI接口 fastapi_app FastAPI() class SalesRequest(BaseModel): customer_profile: dict dialogue_history: list fastapi_app.post(/sales-coach) async def coach_sales(request: SalesRequest): try: # ✅ 自动生成audit_id关联CRM import uuid audit_id fSC-{uuid.uuid4().hex[:8]} state SalesState( customer_profilerequest.customer_profile, current_dialoguerequest.dialogue_history, suggested_response, improvement_tips[], audit_idaudit_id ) result app.invoke(state) return { audit_id: result.audit_id, suggested_response: result.suggested_response, improvement_tips: result.improvement_tips } except Exception as e: raise HTTPException(status_code500, detailstr(e))部署验证命令确保你真能跑通# 启动服务 uvicorn sales_coach:fastapi_app --reload # 发送测试请求 curl -X POST http://localhost:8000/sales-coach \ -H Content-Type: application/json \ -d { customer_profile: {age: 35, industry: 电商, budget: 6000}, dialogue_history: [{role: user, content: 你们产品太贵了}] } # 预期返回 # {audit_id:SC-abc123,suggested_response:我们理解预算关切。行业平均投入是8000元...,improvement_tips:[保持开放提问...]}5.3 面试题库实战3道高频题的标准答案结构题1Agent失败时如何定位我的回答结构第一层查审计ID从用户反馈拿到audit_id在ELK查该ID的完整日志链第二层看状态快照用app.get_state({configurable: {thread_id: xxx}})看失败前最后状态确认是tool_results为空还是final_answer未生成第三层复现节点把tool_results字段复制出来单独调用weather_tool({tool_results: [...]})隔离测试工具函数。✅ 关键点不提“看LLM返回”因为LLM返回是黑盒要定位到具体节点。题2如何评估Agent效果我的回答结构线上指标success_rate最终answer非空且含有效信息、avg_latency从invoke到END的P95、tool_error_rate工具层异常占比线下指标用agentdojo跑回归测试对100个标准case打分如“天气查询”必须含温度天气状况业务指标销售陪练场景下看使用Agent的销售新人“首次成交周期”是否缩短15%。✅ 关键点必须区分技术指标和业务指标且给出具体数字。题3LangChain和LangGraph选哪个我的回答结构LangChain适合单次调用、无状态、工具少3个的简单场景如客服机器人问答LangGraph必须用需要状态管理如多轮对话、条件分支如根据用户等级路由不同工具、人工干预如审核节点、长流程如贷款审批2026年趋势新项目100%用LangGraphLangChain仅用于胶水层如封装工具函数。✅ 关键点用“必须用”代替“推荐用”体现技术判断力。6. 终极技巧用LangGraph的interrupt_before实现“人工审核”工作流这是我在某政务项目里亲手落地的技巧解决了“AI生成内容必须人工签字才能发布”的强合规需求。核心思路不让人工审核成为流程瓶颈而是把它变成图中的一个可选节点且支持跳过。# 审核节点定义 def human_review(state: AgentState) - AgentState: # 生成待审核内容摘要 summary f用户{state[user_id]}请求{state[input][:50]}...AI建议{state[final_answer][:100]} # ✅ 关键不阻塞只发通知状态机继续跑 send_review_notification(summary, state[audit_id]) return {review_status: pending, review_summary: summary} # 在图中插入审核节点 workflow.add_node(human_review, human_review) workflow.add_conditional_edges( format_response, lambda x: review_required if x[user_id].startswith(gov_) else no_review, { review_required: human_review, no_review: END } ) # ✅ 关键审核通过后用interrupt_resume恢复 app.post(/review/approve/{audit_id}) async def approve_review(audit_id: str): # 人工审核通过恢复流程 config {configurable: {thread_id: audit_id}} state app.get_state(config) state.values[review_status] approved app.update_state(config, state.values) # resume到END节点 app.invoke(None, configconfig) return {status: approved}为什么这招比“加一个等待审核的节点”高明它让format_response之后的流程立即返回“已提交审核”用户不用等审核员在后台系统看到audit_id点“通过”就触发interrupt_resume状态机自动从human_review跳到END若审核拒绝update_state()里设review_statusrejectedEND节点可捕获并返回“已驳回”。这就是2026年AI Agent的真相它不是取代人而是把人的决策点精准嵌进自动化流程的缝隙里。我带过的7个团队凡是在interrupt_before上卡住的后来都栽在“领导说AI不能自己决定”这句上而用好它的都拿到了政务/金融项目的验收签字。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

一边喊“早该这样”,一边骂“别挡路”:反逆向神器爆火后,开发者吵翻了

一边喊“早该这样”,一边骂“别挡路”:反逆向神器爆火后,开发者吵翻了

一边喊“早该这样”,一边骂“别挡路”:反逆向神器爆火后,开发者吵翻了 【免费下载链接】bla 🛡️ BLA (Blind LLM Agents) — Adversarial defense shield that protects binaries, Electron apps, JS bundles, Python, and WebAs…

📅 2026/10/30 16:54:28
ASP仿学信网源码部署与改造:IIS配置、Access数据库及避坑指南

ASP仿学信网源码部署与改造:IIS配置、Access数据库及避坑指南

简介:一份面向ASP初学者的网站实例开发源码,基于经典ASP技术模仿中国高等教育学生信息网核心功能,涵盖页面模板、VBScript/JScript脚本、ADO数据库交互、用户认证与权限管理、动态数据展示及错误处理等完整环节,并包含学生个人信息…

📅 2026/10/30 16:54:28
Springboot+Vue智慧社区居家养老健康管理系统毕业设计指南

Springboot+Vue智慧社区居家养老健康管理系统毕业设计指南

简介:这套基于Spring Boot与Vue框架的智慧社区居家养老健康管理系统,是面向计算机相关专业毕业设计的完整源码与论文资料。系统围绕老人、家属、医生和社区工作人员四类用户,覆盖老人档案、健康管理、在线问诊、服务预约、公告发布、轮播图配…

📅 2026/10/30 16:54:28
MORE NEWS

更多资讯

📰

不同CORS服务会影响RTK固定速度和稳定性吗

有人问:"都是差分解算,为什么有的服务固定快、有的慢?“答案藏在解算方式里。VRS、FKP、MAC 是三种主流的网络 RTK 差分解算技术,它们对固定速度和稳定性的影响是真实存在的–虽然市面上大多数终端和服务已经把这层差异磨平,但了解原理能帮你理解"为什么换个服务体验…

📰

副队长JavaScript教程(65)-详解JSON:轻量级数据交换格式

点此查看 所有教程、项目、源码导航 文章目录1. 背景2. JSON 的历史与发展过程2.1 诞生之前:XML 一统江湖2.2 JSON 的诞生3. 常见数据格式简单对比:JSON、XML、YAML3.1 XML3.2 YAML3.3 JSON4. JSON 基础语法与规范4.1 JSON 支持的数据类型4.2 强制语法规…

📰

副队长JavaScript教程(66)-本地存储实战:待办事项网页的开发

点此查看 所有教程、项目、源码导航 文章目录1. 需求说明2. 实现思路3. 分步讲解3.1 HTML 结构、CSS样式3.2 获取页面元素3.3 读取本地存储里面的待办数据3.4 封装渲染函数3.5 新增待办逻辑4. 完整可运行代码5. 重点复盘1. 需求说明 我们来实现一个极简的待办事项,…

📰

副队长JavaScript教程(64)-本地存储:localStorage 与 sessionStorage

点此查看 所有教程、项目、源码导航 文章目录1. 背景2. WebStorage 基础特点3. localStorage 持久化存储4. sessionStorage 会话存储5. localStorage 和 sessionStorage 对比6. 入门常见坑点6.1 存入的值,都会自动转为字符串6.2 不能直接存对象、数组6.3 只能在浏览…

📰

副队长JavaScript教程(63)-BOM之窗口大小与页面滚动

点此查看 所有教程、项目、源码导航 文章目录1. 背景2. 获取浏览器窗口可视区域大小2.1 innerWidth、innerHeight2.2 outerWidth、outerHeight(了解)3. 窗口缩放事件 resize4. 获取页面滚动距离 scrollX、scrollY5. 控制页面滚动的方法5.1 scrollTo (x, …

📰

认识Minilytics:免费自托管分析工具,告诉你到底是哪条推文让你赚了钱

【免费下载链接】minilytics Opensource Revenue-first analytics for indie hackers & solo founders 项目地址: https://gitcode.com/gh_mirrors/mi/minilytics 点击查看 免费下载 Minilytics 是一款免费自托管的网站分析工具,专为独立开发者和 …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬