当前位置: 首页 > news >正文

【交通网络拓扑图实现原理深度解析】

交通网络拓扑图实现原理深度解析

简易demo地址

背景故事:交通网络调度可视化的演进

1. 项目背景

在现代城市轨道交通系统中,交通网络线路的可视化展示一直是一个重要而复杂的问题。传统的交通网络线路图往往采用静态图片方式展示,这种方式存在诸多限制:

  • 无法实时反映运营状态
  • 缺乏交互能力
  • 难以进行动态更新
  • 无法与调度系统集成

2. 业务需求

2.1 核心诉求

业务需求
实时性
交互性
可维护性
扩展性
实时显示车辆位置
线路状态更新
站点查询
线路高亮
便于更新维护
支持配置化
支持新线路添加
对接其他系统

2.2 具体场景

  1. 调度中心

    • 需要实时监控线路运营状态
    • 快速定位故障位置
    • 支持线路编辑和更新
  2. 乘客服务

    • 提供清晰的线路展示
    • 支持站点查询和路线规划
    • 展示实时运营信息
  3. 运维管理

    • 便于维护和更新线路信息
    • 支持多人协作编辑
    • 提供版本控制能力

3. 技术选型考虑

在选择技术方案时,我们考虑了多种可能:

  1. Canvas方案

    • 优点:性能好,适合大量动画
    • 缺点:交互处理复杂,开发效率低
  2. 图片+HTML方案

    • 优点:实现简单,开发快
    • 缺点:缺乏灵活性,性能受限
  3. SVG方案(最终选择)

    • 优点:
      • 矢量图形,缩放无损
      • 支持复杂交互
      • 可编程性强
    • 缺点:
      • 数据量较大
      • 需要预处理坐标

技术解析部分

1. 整体架构

渲染层
数据层
站名文字
站点圆点
连接线
站点坐标
线路信息
连接路径
JSON拓扑数据
Vue组件
SVG渲染层

2. 数据结构解析

就像搭建乐高一样,我们有三种基本"积木":

2.1 线路信息(相当于乐高底板)

{
    "lineCode": 1,
    "lineName": "交通网络1号线"
}

2.2 站点信息(相当于乐高积木块)

{
    "stop_id": 268036,
    "stop_name": "机场东",
    "cx": "519.999023",    // SVG中的X位置
    "cy": "428",          // SVG中的Y位置
    "transfer": true      // 是否是换乘站
}

2.3 连接信息(相当于乐高积木之间的连接)

{
    "link_id": 451,
    "from_stop_id": 268036,
    "end_stop_id": 268035,
    "path": "M521.75563 431.974152 L 521.75563 475.457352"
}

3. 渲染实现(就像画画一样)

从 index.vue 中可以看到三层渲染:

<SvgPanZoom>
    <svg>
        <!-- 第一层:画线 -->
        <!-- 第二层:画站点 -->
        <g v-for="item in stations">
            <!-- 普通站点:小圆点 -->
            <circle 
                :cx="item.cx" 
                :cy="item.cy"
                :r="item.station_id == overId ? 8 : 5"
            />
            <!-- 换乘站:大圆点 -->
            <template v-if="item.transfer">
                <!-- 特殊处理 -->
            </template>
        </g>
        <!-- 第三层:写站名 -->
        <text 
            :x="item.nameCx" 
            :y="item.nameCy">
            {{ item.stop_name }}
        </text>
    </svg>
</SvgPanZoom>

4. 数据转换过程(就像制作蛋糕的步骤)

预处理
计算位置
整理站点
建立关系
原料: JSON数据
和面: 数据预处理
烘焙: SVG转换
装饰: 渲染效果

5. 关键实现细节

5.1 站点定位(就像在地图上插旗子)

// 从JSON中读取预设的SVG坐标
const station = {
    cx: "519.999023",  // X位置
    cy: "428",         // Y位置
    nameCx: "538.999023", // 站名X位置
    nameCy: "433"      // 站名Y位置
};

5.2 线路连接(就像画连线游戏)

// SVG路径语法
// M = 移动画笔到起点
// L = 画直线到终点
const path = "M521.75563 431.974152 L 521.75563 475.457352";

6. 优缺点分析

优点:

  1. 性能好

    • 使用预计算的SVG坐标,像使用导航一样,路线已经规划好
    • 不需要实时计算位置
  2. 精确控制

    • 站点位置精确,像在图纸上画图一样
    • 线路走向可以完全控制
  3. 交互丰富

    • 支持缩放平移,像电子地图一样
    • 支持站点高亮、悬停效果

缺点:

  1. 维护成本高

    • 坐标需要手动计算,像手工绘图一样费时
    • 修改线路需要重新计算坐标
  2. 缺乏灵活性

    • 布局固定,不能自适应,像贴画一样位置固定
    • 难以动态添加新线路
  3. 数据量大

    • 每个站点都需要存储多个坐标
    • 路径数据很长

7. 实际应用场景

就像实际交通网络运营一样:

  1. 站点管理:像管理交通网络站一样管理节点
  2. 线路规划:像规划交通网络线路一样连接站点
  3. 换乘处理:像处理换乘站一样特殊标记

8. 改进建议

  1. 自动布局

    • 添加自动计算坐标的能力
    • 类似自动规划交通网络线路
  2. 响应式设计

    • 添加缩放适配
    • 像电子地图一样自适应屏幕
  3. 数据优化

    • 压缩路径数据
    • 使用相对坐标减少数据量

这种实现方式就像搭建一个微型交通网络沙盘,每个站点、每条线路都需要精确定位,虽然前期工作量大,但运行效果好,交互体验佳。

附录A:连线机制

重点分析站点ID系统和连线机制。

交通网络拓扑图连线机制深度解析

1. Station ID 系统设计

从数据中可以看到ID的编码规则:

{
    "stop_id": 268036,        // 基础站点ID
    "station_id": 1268036000, // 完整站点ID = 线路号(1) + 站点ID(268036) + 后缀(000)
    "line_id": 1             // 所属线路
}
ID构成
000
268036
1
完整station_id

2. 连线机制

2.1 连线数据结构

{
    "front": [  // 正向连接
        {
            "link_id": 451,
            "from_stop_id": 268036,  // 起始站
            "end_stop_id": 268035,   // 终点站
            "path": "M521.75563 431.974152 L 521.75563 475.457352"  // SVG路径
        }
    ],
    "reverse": [  // 反向连接
        // 相反方向的连接
    ]
}

2.2 连线过程

起始站(268036) SVG Path 终点站(268035) 1. 从起点坐标开始(M命令) 2. 画线到终点(L命令) 可能包含曲线(C命令) 起始站(268036) SVG Path 终点站(268035)

2.3 路径命令解析

// 示例路径
"M521.75563 431.974152 L 521.75563 475.457352"

// 分解说明
M521.75563 431.974152  // 移动到起点坐标(521.75563, 431.974152)
L 521.75563 475.457352 // 画直线到终点坐标(521.75563, 475.457352)

// 曲线示例
"C523.571213,616.015938 527.16276,622.202176 532.530273,627.462563"
// C命令后跟6个数字,表示两个控制点和终点坐标

3. 连线类型

连线类型
直线连接
曲线连接
折线连接
L命令
C命令
多段L命令

3.1 直线连接

{
    "path": "M521.75563 431.974152 L 521.75563 475.457352"
}

适用场景:南北方向或东西方向的简单连接

3.2 曲线连接

{
    "path": "M543.431694,638.108799 C545.167145,639.498135 548.75563,641.76009 548.75563,646.456066"
}

适用场景:转弯处或需要平滑过渡的地方

4. 连线实现细节

4.1 基础连线逻辑

// 伪代码展示连线过程
function connectStations(stations, links) {
    links.forEach(link => {
        const fromStation = stations.find(s => s.stop_id === link.from_stop_id);
        const toStation = stations.find(s => s.stop_id === link.end_stop_id);
        
        // 使用SVG path连接两站
        return `M${fromStation.cx},${fromStation.cy} L${toStation.cx},${toStation.cy}`;
    });
}

4.2 复杂路径处理

// 处理包含多个控制点的复杂路径
function createComplexPath(link) {
    const { path } = link;
    // path可能包含多段命令:
    // M(起点) + L/C(直线/曲线) + L/C(直线/曲线) ...
    return path;
}

5. 连线优化

5.1 性能优化

优化策略
路径缓存
分段渲染
视口裁剪
存储计算后的路径
分批次渲染长路径
只渲染可见部分

5.2 视觉优化

/* 线路样式优化 */
.metro-line {
    stroke-width: 4;      /* 线条粗细 */
    stroke-linecap: round; /* 线条端点圆润 */
    fill: none;           /* 不填充 */
}

6. 实际应用示例

6.1 基本连线

<template>
    <svg>
        <!-- 渲染所有连线 -->
        <path v-for="link in links"
              :d="link.path"
              :class="['metro-line', `line-${link.line_id}`]"
        />
        <!-- 渲染站点 -->
        <circle v-for="station in stations"
                :cx="station.cx"
                :cy="station.cy"
        />
    </svg>
</template>

6.2 动态连线效果

// 添加动画效果
const pathLength = path.getTotalLength();
path.style.strokeDasharray = pathLength;
path.style.strokeDashoffset = pathLength;

7. 连线系统的优缺点

优点:

  1. 精确控制

    • 通过预设路径实现精确的线路走向
    • 支持复杂的曲线和转角
  2. 双向支持

    • front/reverse 结构支持双向交通网络线路
    • 便于处理不同方向的视觉效果
  3. 灵活性

    • 支持直线、曲线、折线等多种连接方式
    • 可以处理复杂的交通网络线路布局

缺点:

  1. 数据冗余

    • 正反向路径都需要存储
    • 路径数据量大
  2. 维护难度

    • 手动编辑路径数据困难
    • 修改线路需要重新计算路径
  3. 缺乏自动化

    • 无法自动生成合适的连接路径
    • 依赖预设的路径数据

这种连线机制虽然实现较为复杂,但能够精确控制交通网络线路的视觉效果,适合实际交通网络线路图的展示需求。


附录B:SVG连线实现深度分析

1. SVG标签层级结构

<SvgPanZoom>
  <svg>
    <g> <!-- 最外层g: 用于整体分组和变换 -->
      <g> <!-- 线路层g: 用于管理线路 -->
        <path /> <!-- 线路路径 -->
      </g>
      <g> <!-- 站点层g: 用于管理站点 -->
        <!-- 站点渲染 -->
      </g>
    </g>
  </svg>
</SvgPanZoom>

1.1 为什么使用g标签?

  1. 分组管理
<g> <!-- 站点组 -->
  <text :class="['cls-station-name', clsTextScale]" /> <!-- 站名 -->
  <circle class="cls-station" /> <!-- 站点圆点 -->
</g>
  • g标签作为容器,可以统一管理站点及其文字
  • 可以统一应用变换(transform)
  • 便于整体控制显示/隐藏
  1. 层级管理
<g> <!-- 最外层容器 -->
  <g v-for="item in ..."> <!-- 遍历渲染 -->
    <!-- 内容 -->
  </g>
</g>
  • 便于管理渲染层级
  • 避免z-index混乱
  • 方便整体操作

2. 线路渲染实现

2.1 路径渲染

<path
  :d="link.path"
  :class="[
    'cls-line',
    { 'highlighted': isHighlightedLine(link) }
  ]"
  :style="{
    stroke: getLineColor(link),
    strokeWidth: getLineWidth(link)
  }"
/>

2.2 动态样式处理

// 线路颜色处理
function getLineColor(link) {
  // 根据线路ID获取颜色
  return MetroLineList[link.line_id]?.color || '#000';
}

// 高亮状态判断
function isHighlightedLine(link) {
  return props.highlightedLines.includes(link.line_id);
}

2.3 CSS样式定义

.cls-line {
  fill: none; /* 路径不填充 */
  stroke-linecap: round; /* 线段端点圆润 */
  transition: all 0.3s; /* 平滑过渡效果 */
}

.cls-line.highlighted {
  stroke-width: 6; /* 高亮时线条加粗 */
  filter: brightness(1.2); /* 高亮时增加亮度 */
}

3. 动态效果实现

线路状态
普通状态
高亮状态
虚线状态
正常粗细和颜色
加粗和高亮
虚线动画

3.1 高亮效果

<path
  :class="{
    'highlighted': isHighlightedLine(link),
    'dimmed': isDimmedLine(link)
  }"
/>

3.2 动画效果

@keyframes dashAnimation {
  from {
    stroke-dashoffset: 1000;
  }
  to {
    stroke-dashoffset: 0;
  }
}

.animated-line {
  stroke-dasharray: 5,5; /* 虚线效果 */
  animation: dashAnimation 20s linear infinite;
}

4. 交互处理

4.1 鼠标事件

<g
  @mouseover="handleStationOver(item)"
  @mouseout="handleStationOut"
  @click="handleStationClick(item)"
>
  <!-- 站点内容 -->
</g>

4.2 状态联动

// 站点悬停处理
function handleStationOver(station) {
  overId.value = station.station_id;
  // 更新相关线路状态
  updateConnectedLines(station);
}

5. 连线数据处理

5.1 路径数据结构

interface PathData {
  link_id: number;
  from_stop_id: number;
  end_stop_id: number;
  path: string; // SVG路径
  line_id: number;
}

5.2 路径生成示例

// 实际数据示例
const path = "M521.75563 431.974152 L 521.75563 475.457352";

// 分解说明
// M: 移动到起点 (521.75563, 431.974152)
// L: 画直线到 (521.75563, 475.457352)

6. 性能优化

6.1 计算缓存

// 使用computed缓存计算结果
const visibleStations = computed(() => {
  return stations.value.filter(station => 
    isInViewport(station)
  );
});

7. 实际应用示例

7.1 基础线路渲染

<template>
  <g class="metro-lines">
    <path
      v-for="link in lineLinks"
      :key="link.link_id"
      :d="link.path"
      :style="{
        stroke: getLineColor(link),
        strokeWidth: getLineWidth(link)
      }"
    />
  </g>
</template>

7.2 高亮效果

// 高亮相关线路
function highlightConnectedLines(station) {
  const connectedLines = station.lines || [];
  return {
    'highlighted': connectedLines.includes(currentLine.value),
    'dimmed': !connectedLines.includes(currentLine.value)
  };
}

这种实现方式的优点:

  1. 结构清晰,使用g标签进行合理分组
  2. 支持复杂的动态效果
  3. 性能优化合理
  4. 交互体验流畅

缺点:

  1. SVG路径数据庞大
  2. 动态效果依赖CSS动画
  3. 需要手动维护路径数据

通过这种方式,可以实现一个高性能、交互丰富的交通网络线路图展示系统。


附录C:交通网络拓扑图的双向线路

双向线路是交通网络拓扑图中的重要特性。接下来分析一下双向线路的实现原理和考虑因素。

1. 双向线路数据结构

从原始 index.vue 中可以看到,数据结构中有 front 和 reverse:

{
  "front": [  // 正向路径
    {
      "link_id": 451,
      "from_stop_id": 268036,
      "from_stop_name": "机场东",
      "end_stop_id": 268035,
      "end_stop_name": "后瑞",
      "line_id": 1,
      "path": "M521.75563 431.974152 L 521.75563 475.457352"
    }
  ],
  "reverse": [  // 反向路径
    {
      "link_id": 313,
      "from_stop_id": 268035,
      "from_stop_name": "后瑞",
      "end_stop_id": 268036,
      "end_stop_name": "机场东",
      "line_id": 1,
      "path": "M525.911789 475.457352 L 525.911789 431.974152"
    }
  ]
}

2. 实现原理

双向线路设计
数据层
视图层
交互层
正向路径数据
反向路径数据
路径渲染
动画效果
列车运行展示
路线高亮

2.1 双向路径实现

<template>
  <g class="metro-lines">
    <!-- 正向路径 -->
    <path
      v-for="link in frontLinks"
      :d="link.path"
      :class="['metro-line', 'front-line']"
      :style="getLineStyle(link)"
    />
    
    <!-- 反向路径 -->
    <path
      v-for="link in reverseLinks"
      :d="link.path"
      :class="['metro-line', 'reverse-line']"
      :style="getLineStyle(link)"
    />
  </g>
</template>

2.2 样式处理

.metro-line {
  fill: none;
  stroke-width: 4;
  stroke-linecap: round;
}

.front-line {
  stroke-dasharray: none;  /* 实线 */
}

.reverse-line {
  stroke-dasharray: none;  /* 实线 */
  /* 或使用虚线区分方向 */
  /* stroke-dasharray: 4,4; */
}

3. 设计考虑因素

3.1 为什么需要双向路径?

  1. 运营需求

    • 展示列车双向运行
    • 区分上下行方向
    • 显示不同方向的运营状态
  2. 可视化需求

    • 避免路径重叠
    • 清晰展示运行方向
    • 支持方向性动画
  3. 交互需求

    • 分别高亮不同方向
    • 独立控制各方向状态
    • 支持方向性查询

3.2 实现方案对比

双向实现方案
单路径+标记
双独立路径
动态路径
简单但功能受限
灵活但数据量大
复杂但效果好
  1. 单路径+方向标记
{
  path: "M520 430 L 520 480",
  direction: "both"
}

优点:

  • 数据量小
  • 实现简单

缺点:

  • 无法展示复杂运营状态
  • 动画效果受限
  1. 双独立路径(当前方案)
{
  front: { path: "M520 430 L 520 480" },
  reverse: { path: "M525 480 L 525 430" }
}

优点:

  • 完全独立控制
  • 支持复杂状态
  • 动画效果丰富

缺点:

  • 数据量较大
  • 维护成本高
  1. 动态计算路径
function generatePath(start, end, direction) {
  // 根据方向动态计算路径
}

优点:

  • 数据量小
  • 灵活性高

缺点:

  • 计算复杂
  • 性能开销大

4. 应用场景

4.1 运营监控

// 不同方向独立状态
const lineStatus = {
  front: {
    status: 'normal',
    speed: 'normal'
  },
  reverse: {
    status: 'delayed',
    speed: 'slow'
  }
}

4.2 列车动画

// 双向动画效果
.train-animation-forward {
  animation: moveForward 20s linear infinite;
}

.train-animation-reverse {
  animation: moveReverse 20s linear infinite;
}

4.3 路况展示

// 不同方向路况
const trafficStatus = {
  front: {
    congestion: 'heavy',
    delay: '10min'
  },
  reverse: {
    congestion: 'light',
    delay: '0min'
  }
}

5. 优化建议

  1. 数据优化
// 使用相对坐标减少数据量
const pathOffset = 4; // 双向偏移量
const reversePath = generateReversePath(frontPath, pathOffset);
  1. 渲染优化
// 按需渲染
const visiblePaths = computed(() => {
  return paths.filter(path => isInViewport(path));
});
  1. 交互优化
// 智能方向判断
function determineDirection(from, to) {
  return calculateOptimalDirection(from, to);
}

这种双向实现方式虽然数据量较大,但提供了最大的灵活性和控制力,适合复杂的交通网络线路展示系统。特别是在需要展示实时运营状态、支持动画效果、处理复杂交互时,这种方案的优势就很明显。


附录D:在双线线路中如何根据两个stopId(站点)查找对应的线段及区间

分析一下根据 stopId 查找和匹配线段的实现逻辑。

1. 线段查找机制

输入两个站点ID
查找连接关系
正向查找
反向查找
匹配link_id
高亮显示

2. 代码实现分析

2.1 基础数据结构

interface Link {
  link_id: number;
  from_stop_id: number;
  end_stop_id: number;
  path: string;
  line_id: number;
}

interface Station {
  stop_id: number;
  station_id: number;
  // ...其他属性
}

2.2 查找逻辑实现

// 根据起终点站查找连接线段
function findLinksByStops(fromStopId: number, toStopId: number) {
  // 1. 在正向连接中查找
  const frontLinks = metroData.front.filter(link => 
    (link.from_stop_id === fromStopId && link.end_stop_id === toStopId) ||
    (link.from_stop_id === toStopId && link.end_stop_id === fromStopId)
  );

  // 2. 在反向连接中查找
  const reverseLinks = metroData.reverse.filter(link => 
    (link.from_stop_id === fromStopId && link.end_stop_id === toStopId) ||
    (link.from_stop_id === toStopId && link.end_stop_id === fromStopId)
  );

  return {
    frontLinks,
    reverseLinks
  };
}

2.3 高亮实现

<template>
  <g class="metro-lines">
    <path
      v-for="link in links"
      :key="link.link_id"
      :d="link.path"
      :class="[
        'metro-line',
        {
          'highlighted': isHighlightedLink(link),
          'dimmed': isDimmedLink(link)
        }
      ]"
    />
  </g>
</template>

<script setup>
const props = defineProps({
  highlightedStops: {
    type: Array,
    default: () => []
  }
});

// 判断线段是否需要高亮
const isHighlightedLink = (link) => {
  if (props.highlightedStops.length !== 2) return false;
  
  const [fromStopId, toStopId] = props.highlightedStops;
  return (
    (link.from_stop_id === fromStopId && link.end_stop_id === toStopId) ||
    (link.from_stop_id === toStopId && link.end_stop_id === fromStopId)
  );
};
</script>

3. 实际应用场景

3.1 路径查询

// 查询两站点间的路径
function findPath(fromStopId: number, toStopId: number) {
  const links = findLinksByStops(fromStopId, toStopId);
  return {
    links,
    distance: calculateDistance(links),
    estimatedTime: calculateTime(links)
  };
}

3.2 实时监控

// 监控特定线段状态
function monitorLinkStatus(fromStopId: number, toStopId: number) {
  const links = findLinksByStops(fromStopId, toStopId);
  return {
    status: getLinkStatus(links),
    traffic: getTrafficInfo(links),
    trains: getRunningTrains(links)
  };
}

4. 优化实现

4.1 缓存优化

// 使用 Map 缓存查询结果
const linkCache = new Map();

function getCachedLinks(fromStopId: number, toStopId: number) {
  const key = `${fromStopId}-${toStopId}`;
  if (!linkCache.has(key)) {
    linkCache.set(key, findLinksByStops(fromStopId, toStopId));
  }
  return linkCache.get(key);
}

4.2 索引优化

// 建立站点-线段索引
const stationLinkIndex = new Map();

function buildStationLinkIndex(links) {
  links.forEach(link => {
    // 正向索引
    if (!stationLinkIndex.has(link.from_stop_id)) {
      stationLinkIndex.set(link.from_stop_id, new Set());
    }
    stationLinkIndex.get(link.from_stop_id).add(link);

    // 反向索引
    if (!stationLinkIndex.has(link.end_stop_id)) {
      stationLinkIndex.set(link.end_stop_id, new Set());
    }
    stationLinkIndex.get(link.end_stop_id).add(link);
  });
}

4.3 性能优化

// 快速查找实现
function findLinksOptimized(fromStopId: number, toStopId: number) {
  const fromLinks = stationLinkIndex.get(fromStopId) || new Set();
  return Array.from(fromLinks).filter(link => 
    link.end_stop_id === toStopId || link.from_stop_id === toStopId
  );
}

5. 实际使用示例

<!-- 父组件 -->
<template>
  <metro-map
    :highlighted-stops="[selectedFromStop, selectedToStop]"
    @path-found="handlePathFound"
  />
</template>

<script setup>
const selectedFromStop = ref(null);
const selectedToStop = ref(null);

// 处理路径查找结果
const handlePathFound = (pathInfo) => {
  const { links, distance, time } = pathInfo;
  // 更新UI显示
};

// 选择站点
const selectStation = (stopId) => {
  if (!selectedFromStop.value) {
    selectedFromStop.value = stopId;
  } else if (!selectedToStop.value) {
    selectedToStop.value = stopId;
    // 触发路径查找
    findPath(selectedFromStop.value, selectedToStop.value);
  }
};
</script>

6. 错误处理

function findLinksWithError(fromStopId: number, toStopId: number) {
  try {
    const links = findLinksByStops(fromStopId, toStopId);
    if (!links || links.length === 0) {
      throw new Error('No direct connection found');
    }
    return links;
  } catch (error) {
    console.error('Error finding links:', error);
    // 处理错误情况
    return null;
  }
}

这种实现方式的优点:

  1. 支持双向查找
  2. 性能优化(通过索引和缓存)
  3. 灵活的匹配机制
  4. 错误处理完善
  5. 可扩展性好

缺点:

  1. 初始化索引需要额外开销
  2. 缓存需要管理内存
  3. 复杂路径可能需要递归查找

这个实现适合交通网络线路这种相对固定的拓扑结构,能够快速响应路径查询和状态更新的需求。

相关文章:

  • 2.PSCAD是什么软件?
  • 中间件专栏之MySQL篇——MySQL的索引原理
  • 政务信息化项目审计全解析:核心重点与区域实践差异化破局
  • 有效的完全平方数
  • 基于微信小程序的竞赛报名系统设计与实现
  • 《C++ 构造、拷贝构造与析构函数:对象的诞生、克隆与消逝之旅》
  • x86寄存器(二):通用寄存器、指令指针寄存器和标志寄存器
  • 解决Selenium元素拖拽不生效Bug
  • open webui-二次开发-源码启动前后端工程-【超简洁步骤】
  • 利用MQ自动取消未支付超时订单最佳实践
  • 大模型最新面试题系列:训练篇之模型监控与调试
  • 静态时序分析:报告命令report_timing详解
  • C++中的.h文件一般是干什么的?
  • 数据结构–栈
  • Python中的常用库
  • RMAN备份bug-审计日志暴涨(select action from gv$session)
  • Qt添加MySql数据库驱动
  • PromQL计算gateway指标增量最佳实践及常见问题答疑
  • vue3基本功
  • Unity 小功能
  • 山西持续高温:阳城地表温度72.9℃破纪录,明日局部地区仍将超40℃
  • 钱进已任外交部新闻司副司长
  • 专访|金七猫奖得主:以非遗为舟,在现实题材中疗愈与成长
  • 上千螺母引发的枪支散件案:五金厂老板的儿子被诉,律师作无罪辩护
  • 一季度支持科技创新和制造业发展减税降费及退税4241亿元
  • 媒体报道一民企投资400万运营出租车4年未获批,广西隆林县回应