Vue+Threejs实现3D温度气流仿真

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目利用Vue.js和Three.js技术栈,创建了3D实时温度气流仿真效果,主要应用于展示空调等设备的运行效果,提供互动视觉体验。Vue.js负责页面路由、状态管理和用户交互,而Three.js用于3D场景的创建和动态效果展示。该项目可能涉及热力学和流体力学原理,通过粒子系统或流线算法在3D环境中模拟温度和气流变化。同时,为保证性能,开发者采用了Web Workers技术。整个项目充分展示了Web前端技术在3D图形和物理模拟方面的应用。 Web 前端 Vue+Threejs 3D 实时温度气流仿真效果

1. Vue.js和Three.js技术应用

Vue.js作为一个现代的JavaScript框架,以其简洁的API和灵活的架构成为了构建用户界面的首选工具。它支持组件化开发,能够轻松实现数据的双向绑定,极大提高了Web开发的效率和可维护性。

而Three.js则是一个轻量级的3D库,它封装了WebGL的复杂性,让开发者能够用简单的JavaScript代码创建和显示3D图形。Three.js提供了丰富的功能,从场景构建、光源设置到材质、动画和相机控制等,几乎涵盖了3D视觉所需的所有基础要素。

在实现Web前端3D实时温度气流仿真效果的过程中,Vue.js与Three.js的结合使用成为了许多开发者的首选方案。开发者可以利用Vue.js来管理用户界面和数据流,利用Three.js来处理3D视觉渲染,二者相辅相成。下一章节我们将具体探索如何在实践中运用这两种技术来构建3D场景。

2. 3D场景动态温度气流模拟

温度场和气流场的构建

在Web前端3D实时仿真中,准确地模拟温度场和气流场是至关重要的。为了构建一个合理的温度气流模型,我们首先要理解基本的物理原理:热力学和流体力学。在实际应用中,温度场可以通过一系列静态或动态数据点来表示,例如,通过服务器收集的气象数据或者通过实时传感器收集的数据。

构建温度场和气流场需要考虑以下几个步骤:

  1. 数据收集 :首先需要收集相关的气象数据或实时监测数据。这些数据可能包括温度、湿度、风速和风向等。
  2. 数据处理 :处理这些数据以适应三维空间模型,通常需要将数据点插值到三维网格上,生成连续的温度和气流分布。
  3. 构建模型 :将处理好的数据映射到三维模型上,创建温度场和气流场模型。这可以使用Three.js中的贴图(Texture)或顶点着色器(Vertex Shader)来实现。
  4. 可视化 :最后一步是将这个模型可视化,这通常是通过着色器和Three.js场景渲染技术来完成的。

以下是使用Three.js构建一个简单温度场模型的示例代码:

// 示例:使用Three.js创建一个球体代表温度场模型
const scene = new THREE.Scene();
const geometry = new THREE.SphereGeometry(5, 32, 32);
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const sphere = new THREE.Mesh(geometry, material);
scene.add(sphere);

数据的获取和处理

在构建温度气流模型时,数据的获取和处理是基础。这些数据需要是准确的,并且与现实世界的现象相匹配。例如,可以使用JavaScript从服务器获取API数据,并通过一些前端库如axios或fetch进行异步请求:

// 使用axios异步获取温度数据
axios.get('***')
    .then(function (response) {
        // 处理温度数据并将其应用到3D场景模型中
        updateTemperature(response.data.observations[0].temp.value);
    })
    .catch(function (error) {
        console.log(error);
    });

在这一步,还可以使用一些数学方法和算法进行数据插值和平滑,例如三线性插值,它能将离散的数据点插值到连续的三维空间中。

动态效果的实现方法

动态效果是实时仿真中非常重要的一个环节,它可以让场景看起来更逼真。在实现动态效果时,可以使用WebGL着色器来动态更新模型。通过在顶点着色器和片元着色器中编写代码,可以根据时间变量或其他条件动态更新模型的视觉表现。

// 示例:片元着色器代码片段,用于根据温度数据改变颜色
varying vec3 vColor;
void main() {
    gl_FragColor = vec4(vColor, 1.0);
    // 根据温度值动态调整颜色
    float temp = someTemperatureData;
    gl_FragColor = vec4(mix(gl_FragColor.rgb, vec3(1.0, 0.0, 0.0), temp / 100.0), 1.0);
}

此外,还可以使用帧动画的方法实现动态效果,如通过不断更新模型的位置或旋转角度,模拟气流运动。

总结

本章深入探讨了在Web前端3D场景中动态模拟温度气流效果的各个方面,从温度场和气流场的构建、数据获取和处理到动态效果的实现方法。通过使用Three.js和WebGL等工具,可以有效地将这些概念和技术应用到实践中,创造出真实感强的3D温度气流模拟。本章中提供的代码示例和逻辑分析进一步帮助开发者理解如何将这些技术应用于自己的项目中。下一章,我们将探讨用户交互式视觉体验的增强方法。

3. 用户交互式视觉体验

在Web前端实现的3D实时温度气流仿真中,用户交互是一个非常重要的部分。它不仅仅是为了满足用户的操作需求,而且对于提升用户体验、增强视觉反馈以及实现信息的有效传达起到了至关重要的作用。下面,我们将深入探讨如何通过用户交互来增强视觉体验。

交互设计原则

在进行用户交互设计时,遵循一些核心原则是非常重要的。这些原则能够指导我们创建出既直观又高效的交互方式,让用户体验更加顺畅。

一致性

在设计交互时,应保持界面元素和交互模式的一致性。用户在使用过程中,能够通过已知的交互方式来预测新的交互结果,这将大大减少学习成本和操作错误的可能性。

反馈

用户界面应提供及时、清晰的反馈。当用户进行任何操作时,系统都应通过视觉或听觉的方式给出明确的响应,让用户明白自己的操作是否成功执行,以及执行后的结果。

直观性

交互设计应该直观,即用户应该能够不通过阅读帮助文档就能理解如何与界面进行交互。直观的设计可以让用户快速上手,并减少误操作。

可访问性

设计时应考虑所有用户,包括残障用户。确保界面元素可以被不同能力水平的用户访问和操作,这包括颜色对比度、键盘导航、屏幕阅读器支持等方面。

视觉反馈设计

视觉反馈是交互设计中的一个关键部分。它能够给用户操作带来直接的视觉体验,帮助用户理解自己的操作是如何影响界面的。

色彩和光影

色彩的运用对提升视觉体验至关重要。在温度气流仿真中,可以使用不同颜色来表示不同温度区间的气流,利用光影效果来强调气流的方向和强度。

动画效果

适当的动画效果可以让界面元素的交互行为更加自然。例如,当用户切换不同的温度或气流显示模式时,可以使用平滑的过渡效果来展示变化过程,这不仅可以提供视觉上的享受,还可以让用户更好地理解信息。

音频反馈

在某些情况下,音频反馈也是增强用户体验的有效手段。例如,气流声音的强度和频率可以根据气流速度的不同而变化,为用户提供另一种形式的感官反馈。

交互事件的处理

交互事件处理是实现用户与仿真界面互动的直接手段。下面,我们通过一个简单的示例来说明如何处理用户的鼠标事件,以便更好地控制3D场景中的视觉体验。

鼠标滚轮缩放

用户常常使用鼠标滚轮来缩放3D场景。为了实现这一功能,我们可以监听 wheel 事件,并根据滚轮的移动距离来调整视图的缩放级别。

// 监听鼠标滚轮事件
document.addEventListener('wheel', function(e) {
    e.preventDefault(); // 阻止默认行为

    // 计算缩放比例
    const scaleFactor = e.deltaY < 0 ? 1.1 : 0.9;
    // 更新视图缩放
    camera.zoom *= scaleFactor;
    camera.updateProjectionMatrix();
});

鼠标点击和拖拽

用户可能想要旋转3D场景,这时可以通过监听鼠标点击和拖拽事件来实现。以下是一个简单的实现示例:

// 监听鼠标按下事件
document.addEventListener('mousedown', function(e) {
    if (e.button === 0) { // 左键按下
        // 开始旋转
        rotating = true;
    }
}, false);

// 监听鼠标移动事件
document.addEventListener('mousemove', function(e) {
    if (rotating) {
        // 根据鼠标移动计算旋转角度
        const deltaX = e.clientX - mouseX;
        const deltaY = e.clientY - mouseY;
        // 更新相机位置
        camera.rotation.y += deltaX * 0.01;
        camera.rotation.x += deltaY * 0.01;
        camera.updateMatrixWorld();
    }
    mouseX = e.clientX;
    mouseY = e.clientY;
}, false);

// 监听鼠标释放事件
document.addEventListener('mouseup', function(e) {
    if (e.button === 0) {
        // 结束旋转
        rotating = false;
    }
}, false);

在这个示例中,我们首先监听了鼠标按下事件以开始旋转,然后监听了鼠标移动事件来根据鼠标位置更新相机的旋转角度,并最终监听了鼠标释放事件以结束旋转。这种处理方式可以给用户提供流畅的交互体验。

代码逻辑分析与参数说明

在上面的代码块中,我们处理了三个主要的鼠标事件: mousedown mousemove mouseup 。这是基于Web API实现的常用交互模式。

  • mousedown 事件用于检测用户是否按下鼠标左键,如果是,则设置 rotating 标志为 true ,表示开始旋转操作。
  • mousemove 事件用于在用户拖拽鼠标时更新相机的旋转角度。这里利用了 clientX clientY 属性来获取鼠标在页面中的当前位置,并计算其与初始位置之间的变化量。根据这个变化量来更新相机的旋转角度 camera.rotation.y camera.rotation.x
  • mouseup 事件用于检测用户是否释放了鼠标左键,如果是,则设置 rotating 标志为 false ,表示结束旋转操作。

这样的一套交互逻辑能够实现3D场景中的自由旋转功能,使得用户能够从不同的角度观察到温度气流的动态变化。

总结来说,通过合理的交互设计原则和视觉反馈设计,结合精心处理的交互事件,我们可以极大地提升Web前端3D实时温度气流仿真效果的用户体验。这些方法在实际应用中不仅增加了界面的可用性,也使得技术更加人性化和易于理解。

4. 粒子系统和流线算法在3D中的应用

粒子系统在3D场景中的设计与实现

粒子系统的基本原理

粒子系统是一种通过大量小型独立单元(粒子)的集合来模拟自然现象的技术。粒子可以表示雪花、火星、烟雾、火光等各种自然界中的细小事物,从而创造出复杂的效果。在3D仿真中,粒子系统尤其适用于创建动态的、非静态的视觉效果,如动态的火焰、云彩、雨滴和爆炸等。

粒子的属性与生成

每个粒子通常具备位置、速度、颜色、大小和生命周期等属性。在3D场景中生成粒子时,需要考虑初始状态和其随时间变化的规律。粒子的属性变化通常通过着色器(如WebGL中的GLSL着色器)来编程实现,以便在GPU上进行高效计算。

实现粒子系统的关键步骤

在Three.js框架中实现粒子系统通常包含以下关键步骤: 1. 创建粒子材质和几何体。 2. 初始化粒子属性。 3. 实现粒子的生命周期管理。 4. 更新粒子的位置、颜色等属性,进行渲染。 5. 处理粒子与场景中其他物体的交互。

代码解析:实现基本粒子系统

下面的代码展示了如何使用Three.js创建一个简单的粒子系统:

// 创建粒子材质
const particleMaterial = new THREE.PointsMaterial({
    color: 0xffffff, // 粒子颜色
    size: 0.1, // 粒子大小
    blending: THREE.AdditiveBlending, // 混合模式
    transparent: true // 透明度
});

// 创建粒子几何体,这里使用球体分布
const particleGeometry = new THREE.SphereGeometry(5, 32, 32);
const particleCount = 500;
const positions = new Float32Array(particleCount * 3);
for (let i = 0; i < particleCount; i++) {
    const i3 = i * 3;
    positions[i3 + 0] = Math.random() * 100 - 50; // x
    positions[i3 + 1] = Math.random() * 100 - 50; // y
    positions[i3 + 2] = Math.random() * 100 - 50; // z
}

particleGeometry.addAttribute('position', new THREE.BufferAttribute(positions, 3));

// 创建粒子系统
const particleSystem = new THREE.Points(particleGeometry, particleMaterial);

// 将粒子系统添加到场景中
scene.add(particleSystem);

在此段代码中,我们首先创建了一个点材质(PointsMaterial),设置了粒子的颜色、大小以及混合模式。接着,我们构建了一个球体几何体来存放粒子的位置信息,然后生成了500个随机位置的粒子。最后,将这些粒子加入到一个 Points 对象中,并将其添加到场景中。

性能优化建议

在实现粒子系统时,特别在粒子数量较多的情况下,性能优化是必须要考虑的问题。优化措施包括但不限于: 1. 粒子批处理渲染,使用 Points 对象而非逐个渲染粒子。 2. 粒子对象池技术,重用已经不再可见的粒子。 3. 控制粒子的可见数量,避免超出视口范围的粒子渲染。 4. 使用WebGL级别的性能优化,如开启GPU的深度测试。

流线算法在3D场景中的选择与优化

流线算法的理论基础

流线算法是用于绘制流场中流体流动轨迹的技术。在3D场景中,流线可以帮助我们可视化温度气流的动态变化。流线是空间中的一条曲线,曲线上的每一点切线方向与流体在该点的速度方向一致。

流线算法的实现方法

实现流线算法一般包括以下步骤: 1. 定义流场,包括速度场的表达式。 2. 从流场中的特定点出发,计算微小步长内的粒子运动。 3. 通过迭代或积分方法,连接各点形成连续的流线。 4. 将流线数据用于渲染,通常采用 Line LineSegments 对象。

代码解析:流线算法的简化实现

以下是使用Three.js实现流线算法的一个简化示例:

// 假设已经有了速度场的计算方法
function getVelocityAtPoint(point) {
    // 这里是根据流场定义返回速度向量的方法
}

// 创建流线
function createStreamline(startPoint, steps) {
    let position = new THREE.Vector3(startPoint[0], startPoint[1], startPoint[2]);
    let streamline = new THREE.LineCurve3(position.clone(), position.clone());

    for (let i = 0; i < steps; i++) {
        let velocity = getVelocityAtPoint([position.x, position.y, position.z]);
        position.add(velocity.clone().multiplyScalar(0.1)); // 0.1是步长
        streamline.getPointAt((i + 1) / steps, streamline.arcLengths[i + 1]);
    }

    return streamline;
}

// 假设在某个特定区域生成10条流线
for (let i = 0; i < 10; i++) {
    let startPoints = generateRandomStartPoints(); // 生成起始点
    startPoints.forEach(startPoint => {
        let streamline = createStreamline(startPoint, 100); // 步数为100
        let lineGeometry = new THREE.BufferGeometry().setFromPoints(streamline.getPoints());
        let lineMaterial = new THREE.LineBasicMaterial({ color: 0x00ff00 });
        let line = new THREE.Line(lineGeometry, lineMaterial);
        scene.add(line);
    });
}

在这段代码中,我们首先定义了 getVelocityAtPoint 函数来模拟速度场的计算,然后定义了 createStreamline 函数来生成单条流线。接着,我们在一个特定区域内生成了多个流线的起始点,并对每个点调用 createStreamline 函数生成流线。最后,我们将每条流线转换为Three.js的 Line 对象并添加到场景中。

优化流线算法

流线算法在性能优化方面的主要考虑是减少计算复杂度和提高渲染效率: 1. 使用有效的数值积分方法来减少计算步长和提升计算精度之间的平衡。 2. 利用GPU加速流线的计算和渲染。 3. 只在视口附近渲染流线,或者根据距离采用不同的渲染细节。 4. 对流线进行层次细节(LOD)处理,对于远离视点的流线,使用较低精度或较少的流线表示。

通过上述方法,粒子系统和流线算法可以在3D场景中实现高效的动态效果和逼真的视觉仿真。在下一章节中,我们将探讨热力学和流体力学原理在3D仿真中的应用。

5. 热力学和流体力学原理的应用

热力学与流体力学基础

热力学基础和应用

在讨论热力学原理在3D温度气流仿真中的应用之前,我们首先需要理解一些基本的热力学概念。热力学是研究能量转换和物质状态变化的科学,它涵盖了几个基本定律。例如,第一定律(能量守恒定律)表明能量不能被创造或销毁,只能从一种形式转换为另一种形式。在3D温度气流仿真中,这意味着任何温度变化必须伴随着能量的转移。

温度场的理论模型

温度场可以被定义为物理空间中各点温度的分布。在3D仿真中,温度场通常是通过偏微分方程(PDEs)来模拟的,其中最常见的是热传导方程。该方程描述了热量如何在材料中传播:

\frac{\partial T}{\partial t} = \alpha \nabla^2 T

其中,(T) 表示温度,(t) 表示时间,(\alpha) 是材料的热扩散率,(\nabla^2) 是拉普拉斯算子。这个方程展示了温度随时间和空间的变化。

流体力学基础和应用

流体力学研究的是流体(液体和气体)的运动和力效应。在3D仿真中,流体力学通常涉及计算流体动力学(CFD),这是一种利用数值分析和算法解决流体流动问题的方法。

气流场的理论模型

气流场描述了在某一区域中空气流动的速度和方向。在模拟气流场时,常用的模型之一是纳维-斯托克斯方程。这是一个复杂的偏微分方程组,用于描述流体的速度场随时间和空间的变化情况。纳维-斯托克斯方程的一般形式为:

\rho \left(\frac{\partial \mathbf{v}}{\partial t} + \mathbf{v} \cdot \nabla \mathbf{v}\right) = -\nabla p + \mu \nabla^2 \mathbf{v} + \mathbf{f}

其中,(\mathbf{v}) 是速度向量,(\rho) 是密度,(p) 是压力,(\mu) 是动力粘度,(\mathbf{f}) 是体积力(如重力)。

仿真数据计算方法

温度场的仿真数据计算

在3D温度气流仿真中,温度场的仿真数据计算依赖于边界条件和初始条件。例如,要考虑热源的位置、散热条件、材料属性等因素。温度场的仿真通常需要迭代方法来求解热传导方程,比如显式或隐式有限差分法。

有限差分法(Finite Difference Method, FDM)

有限差分法是一种数值解法,它将连续的温度场离散化为网格点上的值。每个网格点上的温度值是通过计算相邻点的差分来近似求解的。示例代码片段如下:

# 假设一个二维网格表示温度场,下面的代码片段展示了如何计算下一个时间步的温度分布
for i in range(1, nx - 1):
    for j in range(1, ny - 1):
        T_new[i, j] = T[i, j] + alpha * (dt / dx**2 * (T[i+1, j] - 2*T[i, j] + T[i-1, j]) +
                                          dt / dy**2 * (T[i, j+1] - 2*T[i, j] + T[i, j-1]))

在这里, nx ny 分别是网格在x和y方向上的节点数, dx dy 是网格在两个方向上的步长, alpha 是热扩散率, dt 是时间步长, T 是当前温度分布, T_new 是更新后的温度分布。

气流场的仿真数据计算

与温度场类似,气流场的仿真数据计算也需要考虑边界条件和初始条件,通常会涉及到更复杂的纳维-斯托克斯方程。同样地,计算方法通常采用数值解法如有限体积法(Finite Volume Method, FVM)或有限元法(Finite Element Method, FEM)。

热力学和流体力学的集成

热流耦合问题

在实际的3D仿真中,热力学和流体力学往往不是孤立的,而是一个耦合问题。例如,气流场的温度变化会直接影响气流速度,而气流速度的变化又会对温度场产生影响。因此,我们需要解决如何将两者耦合起来,确保仿真能够准确反映现实世界中的复杂相互作用。

耦合仿真的挑战

耦合仿真涉及到解决两个或多个相互依赖的物理场。这种仿真通常要求高精度和高计算能力,因为需要同时求解多个PDE。通常情况下,耦合仿真需要特殊的算法和软件来处理这种复杂的相互作用。

耦合仿真的技术路线

为了实现热流耦合仿真,我们通常采用多物理场求解器(如COMSOL Multiphysics)。多物理场求解器允许定义并求解多个物理场(如温度场、速度场)之间的相互作用。以下是一些基本的步骤:

  1. 定义物理场:在求解器中创建温度场和速度场。
  2. 定义耦合:通过温度场和速度场之间的交互项来定义耦合效应。
  3. 设置边界条件和初始条件:根据实际情况设置恰当的边界条件和初始条件。
  4. 网格划分:对求解域进行适当的网格划分。
  5. 求解:计算求解器直到收敛,得到温度场和速度场的稳定分布。

在本章节中,我们详细讨论了热力学和流体力学原理在3D温度气流仿真中的应用。我们深入探讨了温度场和气流场的理论模型,并且讨论了仿真数据的计算方法。最后,我们解释了热流耦合问题的挑战和实现耦合仿真的技术路线。通过这些内容,我们为理解和实现3D温度气流仿真打下了坚实的理论基础。

6. 性能优化措施(Web Workers技术)

在构建复杂和数据密集型的Web前端3D实时温度气流仿真应用时,性能优化是一个不可或缺的环节。本章节将重点介绍Web Workers技术如何帮助我们实现性能优化,进而提升用户体验。

Web Workers的原理和优势

Web Workers提供了一种方式,允许我们在浏览器的后台线程中运行JavaScript代码,而不会阻塞用户界面(UI)的响应。这对于处理耗时的计算任务,比如温度气流数据的处理和渲染,是非常有用的。

工作原理

Web Workers通过以下方式工作: - 创建 Worker : 通过构造函数 new Worker('worker.js') 创建一个新的Web Worker实例,并指定一个JavaScript文件来运行。 - 传递消息 : Worker与主线程之间通过发送和接收消息进行通信。使用 postMessage() 方法发送数据,并通过 onmessage 事件处理接收到的消息。 - 终止 Worker : 当不再需要时,可以使用 terminate() 方法停止Worker运行。

优势

使用Web Workers的主要优势包括: - 并行处理 : 允许同时进行多种计算任务,而不会互相影响,从而提高效率。 - 提升用户体验 : 大量计算或数据处理不会导致UI冻结,保持应用流畅。 - 资源共享 : 可以利用 SharedWorker 实现多个标签页或窗口共享同一个Web Worker。

实现方法

创建和使用Web Workers

要实现性能优化,首先需要在合适的地方创建和使用Web Workers。

  1. 创建Worker : 在主线程中创建一个Web Worker实例。 javascript var myWorker = new Worker('worker.js');

  2. 发送消息 : 向Worker发送要处理的数据。 javascript myWorker.postMessage(data);

  3. 接收消息 : 在主线程中处理Worker返回的结果。 javascript myWorker.onmessage = function(e) { console.log('Result: ' + e.data); };

  4. 终止Worker : 当数据处理完成或不再需要时终止Worker。 javascript myWorker.terminate();

实际应用案例

在温度气流仿真应用中,我们可以使用Web Workers来处理复杂的数学运算和数据集合并行化。比如,我们可以将温度数据的解析和预处理放在一个Worker中进行。

// 在主线程中
var worker = new Worker('temperatureWorker.js');
worker.postMessage(temperatureData);
worker.onmessage = function(e) {
    updateTemperatureVisualization(e.data);
};
// temperatureWorker.js
onmessage = function(e) {
    const data = e.data;
    const processedData = processTemperatureData(data);
    postMessage(processedData);
};

function processTemperatureData(data) {
    // 处理温度数据的逻辑
    return processedData;
}

性能优化策略

Web Workers不仅可以用来处理计算密集型任务,还可以进行数据预取和缓存,减少主线程的工作负载。

  1. 数据预处理 : 在Worker中进行数据的预处理,然后将结果发送给主线程。
  2. 并行数据加载 : 多个Worker同时加载不同的数据集,之后再进行合并。
  3. 动态加载 : 根据用户交互动态加载或卸载Worker,减少不必要的资源消耗。

小结

Web Workers技术为前端开发者提供了一种强大的工具,可以显著提高应用性能,特别是针对数据密集型和计算密集型任务。通过合理地将任务分配给Worker,我们能够有效地利用多核处理器的优势,改善用户体验。在实现时,我们应该根据实际需求和任务特性来选择合适的优化策略,确保Web Workers在提升性能方面发挥最大效用。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目利用Vue.js和Three.js技术栈,创建了3D实时温度气流仿真效果,主要应用于展示空调等设备的运行效果,提供互动视觉体验。Vue.js负责页面路由、状态管理和用户交互,而Three.js用于3D场景的创建和动态效果展示。该项目可能涉及热力学和流体力学原理,通过粒子系统或流线算法在3D环境中模拟温度和气流变化。同时,为保证性能,开发者采用了Web Workers技术。整个项目充分展示了Web前端技术在3D图形和物理模拟方面的应用。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值