微信小程序:跨页面数据修改全攻略

news2025/1/16 11:55:35

一、引言

在微信小程序开发中,常常会遇到需要在不同页面之间修改数据的情况。比如在商品详情页添加商品到购物车后,购物车页面需要实时更新商品数量和总价;在用户设置页面修改了个人信息,首页的用户信息展示区域也需要同步更新。这种跨页面的数据修改操作,对于提升用户体验、保证小程序功能的完整性和连贯性至关重要。但由于微信小程序的页面架构和数据管理机制,实现起来并非一蹴而就。今天,我就来给大家分享一下微信小程序中修改其他页面数据的多种方法,希望能帮助各位开发者解决在实际项目中遇到的相关难题。

二、常见数据修改需求场景

2.1 页面返回时的数据同步

在许多小程序中,用户在详情页进行编辑操作后返回列表页,需要列表页的数据实时更新。例如一个新闻资讯小程序,用户在新闻详情页对某条新闻进行了点赞或收藏操作,当点击返回按钮回到新闻列表页时,列表页中该新闻的点赞数和收藏状态应该及时更新,以反映用户的最新操作。若不进行数据同步更新,用户会看到点赞数与实际操作不符的情况,这将严重影响用户体验,使其对小程序的交互性和数据准确性产生质疑。 再比如一个待办事项小程序,用户在事项详情页标记事项为已完成,返回列表页时,已完成的事项应该从列表中移除或者标记为已完成状态。

2.2 不同业务流程中的数据更新

以电商小程序为例,在商品浏览、加入购物车、结算付款这一业务流程中,不同页面的数据需要实时更新。用户在商品列表页将商品加入购物车后,购物车页面的商品数量和总价需要实时更新;在结算页面,当用户修改商品数量或选择使用优惠券时,订单总价和应付金额也需要实时更新。如果这些数据不能及时同步更新,可能会导致用户对商品价格和订单信息产生误解,甚至可能引发交易纠纷 。又比如在一个旅游预订小程序中,用户在选择旅游线路页面选择了一条线路后,跳转到预订信息填写页面,此时预订信息页面需要实时获取并显示所选线路的相关信息,如线路名称、价格、行程安排等;当用户在预订信息填写页面修改预订人数时,价格也需要相应地实时更新。

三、使用本地缓存修改数据

3.1 wx.setStorage () 和 wx.getStorage () 方法详解

在微信小程序中,wx.setStorage() 用于将数据存储在本地缓存中,它是一个异步接口。其参数为一个对象,该对象包含 key 和 data 两个必填字段,key 是用于标识数据的字符串,data 则是要存储的数据,可以是字符串、数字、对象、数组等多种类型。例如:

wx.setStorage({

key: 'userInfo',

data: {

name: '张三',

age: 25

},

success: function (res) {

console.log('数据存储成功');

},

fail: function (err) {

console.error('数据存储失败', err);

},

complete: function () {

console.log('存储操作完成');

}

});

在上述代码中,将包含用户信息的对象存储到本地缓存中,key 为 userInfo。当存储成功时,会在控制台输出 “数据存储成功”;若失败,则输出错误信息;无论成功与否,都会执行 complete 回调函数。

wx.getStorage() 用于从本地缓存中获取指定 key 对应的数据,同样是异步接口。它的参数也是一个对象,必填字段为 key,用于指定要获取数据的标识。例如:

wx.getStorage({

key: 'userInfo',

success: function (res) {

console.log('获取到的数据为', res.data);

},

fail: function (err) {

console.error('数据获取失败', err);

},

complete: function () {

console.log('获取操作完成');

}

});

这段代码尝试从本地缓存中获取 key 为 userInfo 的数据,成功时在控制台输出获取到的数据,失败时输出错误信息,最后执行 complete 回调函数。

此外,微信小程序还提供了同步版本的方法 wx.setStorageSync() wx.getStorageSync()。它们的功能与异步版本类似,但同步方法会阻塞当前线程,直到操作完成。例如:

try {

wx.setStorageSync('userInfo', {

name: '李四',

age: 30

});

var userInfo = wx.getStorageSync('userInfo');

console.log('同步获取到的数据为', userInfo);

} catch (e) {

console.error('同步操作失败', e);

}

在这个例子中,使用同步方法存储和获取数据,并通过 try...catch 语句捕获可能出现的错误 。

3.2 代码示例演示

假设有两个页面,page1 和 page2。在 page1 页面中,有一个按钮,点击按钮后将数据存储到本地缓存;在 page2 页面加载时,从本地缓存中获取数据并展示。

page1 页面的 wxml 文件代码如下:

<view class="container">

<button bindtap="saveData">保存数据</button>

</view>

page1 页面的 js 文件代码如下:

Page({

saveData: function () {

wx.setStorageSync('message', '这是从page1保存的数据');

wx.showToast({

title: '数据保存成功',

icon:'success'

});

}

});

在上述代码中,点击按钮触发 saveData 方法,该方法使用 wx.setStorageSync 将字符串数据存储到本地缓存,key 为 message,并弹出提示框告知用户数据保存成功。

page2 页面的 js 文件代码如下:

Page({
  onLoad: function () {
    try {
      var data = wx.getStorageSync('message');
      this.setData({
        message: data
      });
    } catch (e) {
      console.error('数据获取失败', e);
    }
  }
});

page2 页面的 wxml 文件代码如下:

<view class="container">

<text>{{message}}</text>

</view>

在 page2 页面的 onLoad 生命周期函数中,使用 wx.getStorageSync 尝试从本地缓存中获取 key 为 message 的数据。若获取成功,则将数据设置到页面的 data 中,通过 wxml 文件展示在页面上;若获取失败,则在控制台输出错误信息。

3.3 适用场景与局限性分析

适用场景

  • 用户偏好设置:例如用户设置的主题颜色、字体大小等个性化信息,可以使用本地缓存存储。当用户下次打开小程序时,直接从本地缓存中获取这些设置,快速应用到界面上,无需再次向服务器请求。
  • 临时数据存储:对于一些在小程序运行过程中产生的临时数据,如用户在某个页面填写的表单数据,在提交之前可以先存储在本地缓存中。这样即使用户中途切换页面或关闭小程序后重新打开,数据依然存在,不会丢失。
  • 减少网络请求:对于一些不经常变化的数据,如小程序的配置信息、静态数据等,可以在首次获取后存储在本地缓存中。后续再次需要这些数据时,直接从本地缓存读取,减少网络请求次数,提高小程序的加载速度和响应性能。

局限性

  • 存储容量限制:每个微信小程序的本地缓存空间上限为 10MB。如果存储的数据量过大,可能会导致存储失败,或者需要频繁清理缓存以释放空间。例如,不能将大量的图片、音频等文件存储在本地缓存中。
  • 数据一致性问题:本地缓存的数据与服务器端的数据可能存在不一致的情况。如果服务器端的数据发生了更新,而小程序没有及时同步,用户在本地获取到的可能是旧数据。例如,商品的价格、库存等信息在服务器端更新后,小程序需要通过一定的机制(如定期检查更新、用户手动刷新等)来保证本地缓存数据的一致性。
  • 安全性问题:本地缓存的数据存储在用户设备上,相对容易被获取和篡改。因此,不适合存储敏感信息,如用户的密码、支付凭证等。如果需要存储一些敏感信息,应该进行加密处理后再存储到本地缓存中,并且在使用时进行严格的验证和加密传输 。

四、运用 app.js 全局变量

4.1 全局变量的定义与调用

在微信小程序中,我们可以在 app.js 文件中定义全局变量。通过 App() 函数的 globalData 属性来实现,例如:

App({

globalData: {

userInfo: null,

cartList: []

},

onLaunch: function () {

// 小程序初始化时的逻辑

}

});

在上述代码中,在 globalData 对象中定义了 userInfo 和 cartList 两个全局变量,分别用于存储用户信息和购物车列表数据 。

在其他页面中调用全局变量时,需要先获取 app 实例,然后通过实例访问 globalData 属性。例如,在某个页面的 js 文件中:

const app = getApp();

Page({

onLoad: function () {

console.log(app.globalData.userInfo);

console.log(app.globalData.cartList);

}

});

在 onLoad 生命周期函数中,首先获取 app 实例,然后可以打印出全局变量 userInfo 和 cartList 的值。这样就实现了在页面中调用全局变量 。

4.2 以实际案例展示数据修改过程

假设有一个电商小程序,有商品详情页 productDetail 和购物车页面 cart。在商品详情页点击 “加入购物车” 按钮时,将商品信息添加到全局的购物车列表中,并在购物车页面实时显示更新后的购物车数据。

商品详情页 productDetail 的 wxml 文件代码如下:

<view class="container">

<view class="product-info">

<text>{{product.name}}</text>

<text>{{product.price}}</text>

</view>

<button bindtap="addToCart">加入购物车</button>

</view>

商品详情页 productDetail 的 js 文件代码如下:

const app = getApp();

Page({

data: {

product: {

name: '商品1',

price: 19.9

}

},

addToCart: function () {

const product = this.data.product;

if (!app.globalData.cartList.some(item => item.name === product.name)) {

app.globalData.cartList.push(product);

}

wx.showToast({

title: '已加入购物车',

icon:'success'

});

}

});

在上述代码中,当点击 “加入购物车” 按钮时,触发 addToCart 方法。该方法首先获取当前页面的商品数据,然后检查全局购物车列表 cartList 中是否已存在该商品。如果不存在,则将商品添加到 cartList 中,并弹出提示框告知用户已加入购物车 。

购物车页面 cart 的 js 文件代码如下:

const app = getApp();

Page({

onLoad: function () {

this.setData({

cartList: app.globalData.cartList

});

}

});

购物车页面 cart 的 wxml 文件代码如下:

<view class="container">

<view wx:for="{{cartList}}" wx:key="index">

<text>{{item.name}}</text>

<text>{{item.price}}</text>

</view>

</view>

在购物车页面的 onLoad 生命周期函数中,将全局购物车列表 cartList 的数据设置到页面的 data 中,通过 wxml 文件展示在页面上,实现了购物车数据的实时更新 。

4.3 优势与潜在问题探讨

优势

  • 便捷的数据共享:全局变量可以在小程序的任何页面中方便地访问和修改,实现不同页面之间的数据共享。对于一些需要在多个页面中频繁使用的数据,如用户登录状态、用户信息等,使用全局变量可以避免在每个页面中重复获取和传递数据,提高开发效率和代码的简洁性 。
  • 实时数据更新:当在一个页面中修改了全局变量的值,其他页面可以立即获取到更新后的数据,无需进行额外的通信或刷新操作。这对于需要实时同步数据的场景,如购物车数量的实时更新、用户设置的实时生效等,非常实用,可以提供良好的用户体验 。

潜在问题

  • 内存占用:全局变量在小程序的整个生命周期内都会存在,占用一定的内存空间。如果定义了过多或过大的全局变量,可能会导致小程序的内存占用过高,影响性能,甚至出现卡顿或闪退的情况。特别是在一些内存较小的设备上,这种问题可能会更加明显 。
  • 数据一致性难以维护:由于任何页面都可以修改全局变量的值,可能会导致数据一致性难以维护。如果在多个页面中对全局变量进行了不同的修改,可能会出现数据混乱或错误的情况。例如,在一个页面中删除了全局变量中的某个数据,但其他页面没有及时同步,可能会导致后续操作出现问题 。
  • 代码可读性和可维护性降低:过多地使用全局变量可能会使代码的逻辑变得复杂,难以理解和维护。当需要查找某个全局变量的修改位置或跟踪数据的流向时,可能会比较困难,尤其是在大型项目中,这种问题会更加突出 。

五、巧用页面栈实现数据修改

5.1 深入理解页面栈

微信小程序的页面栈是管理页面层级关系的关键数据结构。它以栈的形式组织页面,遵循后进先出原则。当用户打开新页面时,新页面入栈成为栈顶元素;关闭页面时,该页面出栈。可以通过 getCurrentPages() 函数获取当前页面栈,返回的是一个数组,数组第一个元素为首页,最后一个元素是当前页面。例如,在一个具有首页 index、详情页 detail 和编辑页 edit 的小程序中,从首页跳转到详情页再到编辑页,此时通过 getCurrentPages() 获取的数组依次包含 index、detail、edit 页面对象。这一结构为我们在不同页面间进行数据交互提供了基础。

5.2 页面栈操作核心代码解析

假设我们有两个页面,page1 和 page2,page1 通过 wx.navigateTo 跳转到 page2。在 page2 中修改 page1 数据的核心代码如下:

Page({

modifyData: function () {

const pages = getCurrentPages();

const prevPage = pages[pages.length - 2];

prevPage.setData({

// 这里修改page1需要更新的数据

dataToUpdate: '新的数据'

});

wx.navigateBack();

}

});

在上述代码中,首先通过 getCurrentPages() 获取当前页面栈数组,然后根据数组长度获取 page1 的实例 prevPage。接着,使用 prevPage.setData() 方法修改 page1 中的数据,最后通过 wx.navigateBack() 返回 page1,此时 page1 展示的数据已被更新 。

5.3 结合实例说明完整流程

以一个简单的待办事项小程序为例,有事项列表页 listPage 和事项编辑页 editPage。在 listPage 中展示待办事项列表,点击某一事项进入 editPage 进行编辑。

listPage 的 wxml 文件部分代码如下:

<view class="list">

<view wx:for="{{todoList}}" wx:key="index">

<text>{{item.content}}</text>

<navigator url="/pages/editPage/editPage?id={{index}}" open-type="navigate">编辑</navigator>

</view>

</view>

listPage 的 js 文件代码如下:

Page({

data: {

todoList: [

{ content: '事项1' },

{ content: '事项2' }

]

}

});

在 editPage 中,编辑完成后点击保存按钮,修改 listPage 中对应事项的数据。editPage 的 wxml 文件部分代码如下:

<view class="edit-container">

<input type="text" value="{{editedContent}}" bindinput="handleInput"/>

<button bindtap="saveEdit">保存</button>

</view>

editPage 的 js 文件代码如下:

Page({

data: {

editedContent: ''

},

onLoad: function (options) {

const index = options.id;

const pages = getCurrentPages();

const listPage = pages[pages.length - 2];

const item = listPage.data.todoList[index];

this.setData({

editedContent: item.content

});

},

handleInput: function (e) {

this.setData({

editedContent: e.detail.value

});

},

saveEdit: function () {

const pages = getCurrentPages();

const listPage = pages[pages.length - 2];

const index = this.data.index;

listPage.setData({

['todoList[' + index + '].content']: this.data.editedContent

});

wx.navigateBack();

}

});

在这个例子中,在 editPage 的 onLoad 生命周期函数中,获取 listPage 中对应事项的内容并展示在输入框中。编辑完成点击保存按钮后,通过页面栈获取 listPage 实例,修改对应事项的内容,最后返回 listPage,用户即可看到更新后的事项内容 。

六、三种方法的综合对比

6.1 性能方面对比

  • 本地缓存:由于数据存储在本地设备,读取和写入操作相对快速,无需网络请求,在一定程度上能提升小程序的响应速度。但频繁的读写操作可能会影响设备的存储性能,且如果存储的数据量过大,会占用较多的本地存储空间,可能导致小程序运行缓慢 。例如,当本地缓存中存储了大量图片的路径信息,每次启动小程序都需要读取这些信息,会增加小程序的启动时间。
  • 全局变量:数据存储在内存中,访问速度极快,能实现数据的实时更新。但如前文所述,过多或过大的全局变量会占用大量内存,可能导致小程序在运行过程中出现卡顿甚至闪退现象。特别是在一些低端设备上,内存资源有限,这种问题可能更为突出。比如,一个小程序定义了多个大型数组作为全局变量,用于存储大量的商品信息,在运行时可能会因为内存不足而出现异常 。
  • 页面栈:通过直接操作页面栈来修改数据,不需要额外的存储开销,性能相对较高。但它的操作相对复杂,尤其是在页面层级较深或页面跳转逻辑复杂的情况下,获取和操作页面栈可能会出现错误,影响小程序的稳定性 。例如,在一个具有多层嵌套页面跳转的小程序中,使用页面栈修改数据时,如果计算页面栈索引出现错误,可能会导致修改的数据并非预期页面的数据 。

6.2 代码复杂度对比

  • 本地缓存:使用 wx.setStorage() 和 wx.getStorage() 等方法,代码实现相对简单,容易理解和掌握。只需要明确存储的 key 和对应的数据即可。但在管理大量数据时,需要合理规划 key 的命名,以避免冲突和混乱。例如,在一个具有多种用户设置数据的小程序中,需要为不同的设置项定义清晰且唯一的 key,如 themeColor、fontSize 等 。
  • 全局变量:在 app.js 中定义全局变量后,在其他页面调用和修改都较为方便,代码简洁明了。但需要注意全局变量的命名规范,避免与其他变量冲突。同时,由于全局变量的全局性,在修改数据时需要谨慎,防止对其他依赖该变量的页面产生意外影响。例如,在一个多模块的小程序中,不同模块都可能访问和修改全局变量 userInfo,如果在某个模块中不小心修改了 userInfo 的结构,可能会导致其他模块出现数据错误 。
  • 页面栈:操作页面栈需要对小程序的页面层级关系有清晰的理解,代码实现相对复杂。需要准确获取目标页面的实例,并通过 setData() 方法修改数据。在处理复杂的页面跳转逻辑时,代码的逻辑判断和索引计算可能会变得繁琐。例如,在一个具有多个页面跳转分支的小程序中,根据不同的跳转路径获取正确的页面栈索引并修改数据,需要编写较多的条件判断语句 。

6.3 适用场景总结

  • 本地缓存:适合存储一些相对稳定、不经常变化且对实时性要求不高的数据,如用户的个性化设置、小程序的配置信息等。同时,对于一些临时数据的存储,如用户在填写表单过程中的暂存数据,本地缓存也是一个不错的选择 。例如,一个阅读类小程序,可以将用户设置的字体大小、阅读背景颜色等信息存储在本地缓存中,用户下次打开小程序时直接读取这些设置,无需重新设置 。
  • 全局变量:适用于需要在多个页面之间频繁共享和实时更新的数据,如用户的登录状态、购物车信息等。通过全局变量,能够方便地实现不同页面之间的数据同步,提供良好的用户体验 。例如,在一个电商小程序中,购物车的商品列表和总价等信息可以存储在全局变量中,当用户在商品详情页添加商品到购物车时,购物车页面能够实时显示更新后的信息 。
  • 页面栈:主要用于在有明确页面层级关系和数据传递需求的场景中,特别是在页面返回时需要更新上一个页面数据的情况。例如,在一个待办事项小程序中,用户在事项编辑页面修改事项内容后返回事项列表页面,通过页面栈可以直接更新列表页面中对应事项的内容 。

在微信小程序开发中,选择合适的方法来修改其他页面的数据至关重要。我们需要根据具体的业务需求、性能要求和代码复杂度等因素,综合考虑选择最适合的方法,以确保小程序的高效运行和良好的用户体验 。

七、实际开发中的注意事项

7.1 数据一致性维护

在微信小程序跨页面修改数据时,维护数据一致性至关重要。以电商小程序为例,当用户在商品详情页将商品添加到购物车后,不仅购物车页面要显示商品数量和总价的更新,在订单结算页面,相关商品信息也应保持一致。若数据不一致,可能导致用户在结算时发现价格或商品数量与预期不符,进而影响用户对小程序的信任,甚至放弃购买 。

为确保数据一致性,可采用以下方法:

  • 数据同步机制:在修改数据后,及时通过网络请求将数据同步到服务器端,并在其他页面加载时从服务器获取最新数据。例如,在用户对商品进行添加、删除或修改操作后,小程序立即向服务器发送请求更新数据库,同时在购物车、订单等相关页面的onLoad生命周期函数中,向服务器请求最新的购物车数据 。
  • 版本控制:为数据添加版本号,每次数据更新时版本号递增。在获取数据时,对比版本号,若版本不一致,则重新获取最新数据。例如,服务器端存储的购物车数据带有版本号v1,当购物车数据发生变化时,版本号更新为v2。小程序在获取购物车数据时,先检查本地缓存中的版本号,若与服务器端不一致,就重新从服务器获取数据 。

7.2 避免页面状态混乱

操作页面栈时,若不注意可能会引发页面状态错误。例如,在多层页面跳转后,错误地修改了页面栈中的某个页面实例,可能导致页面返回时出现异常,如数据显示错误、页面布局混乱等 。

为避免这种情况,应遵循以下原则:

  • 遵循页面栈操作规范:严格按照微信小程序官方文档中关于页面栈的操作方法进行开发。在使用getCurrentPages()获取页面栈时,准确计算目标页面的索引,避免因索引错误而修改了错误的页面数据 。
  • 页面状态重置:在页面跳转或返回时,对页面状态进行必要的重置。例如,在从编辑页面返回列表页面时,将编辑页面中临时存储的数据清空,防止对列表页面的数据展示产生干扰 。

7.3 优化建议

在跨页面数据修改时,可从以下方面优化代码和性能:

  • 代码优化
    • 减少不必要的数据传递:避免在页面跳转时传递大量冗余数据,只传递必要的数据。例如,在从商品列表页跳转到商品详情页时,只传递商品的唯一标识(如商品 ID),而不是整个商品对象 。
    • 模块化代码:将数据修改的逻辑封装成独立的函数或模块,提高代码的复用性和可维护性。例如,将本地缓存数据的读取和写入操作封装成一个cacheUtil模块,在需要使用本地缓存的页面中引入该模块,调用相应的方法 。
  • 性能优化
    • 缓存策略:合理利用缓存,减少数据获取的时间。对于不经常变化的数据,如小程序的配置信息、商品分类等,可在首次获取后进行缓存,后续直接从缓存中读取 。
    • 异步操作:对于耗时的操作,如网络请求、数据存储等,采用异步方式进行,避免阻塞主线程,提高小程序的响应速度。例如,在使用wx.setStorage()存储数据时,利用其异步特性,在存储操作进行的同时,用户可以继续进行其他操作,而不会感觉到小程序卡顿 。

八、总结

本文详细介绍了微信小程序中修改其他页面数据的三种常用方法。通过本地缓存,利用wx.setStorage()和wx.getStorage()等方法,实现数据在本地设备的存储与读取,适用于存储相对稳定且对实时性要求不高的数据,但存在存储容量限制、数据一致性和安全性问题;运用app.js全局变量,在globalData中定义变量,方便在各页面间共享和实时更新数据,不过要注意内存占用、数据一致性维护以及对代码可读性和可维护性的影响;巧用页面栈,借助getCurrentPages()获取页面栈,直接操作目标页面实例修改数据,常用于有明确页面层级关系和数据传递需求的场景,但操作复杂,需谨慎处理页面栈索引 。

 

 

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

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

相关文章

寒假第一次牛客周赛 Round 76回顾

AC数&#xff1a;2&#xff08;A、C&#xff09; B 思路&#xff1a; 等价于求&#xff1a; 数量最多的字符 #include<stdio.h> int main() {int n,num;int a[26]{0};//用于存储字母 a 到 z 的出现次数。scanf("%d",&n);char s[n];scanf("%s",s)…

【 PID 算法 】PID 算法基础

一、简介 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&#xff09;、Differential&#xff08;微分&#xff09;的缩写。也就是说&#xff0c;PID算法是结合这三种环节在一起的。粘一下百度百科中的东西吧。 顾名思义&#xff0c;…

Ubuntu打开文件夹不显示文件

1.情况介绍 使用ubuntu打开文件夹不显示文件夹里面的内容&#xff0c;而是直接打开了资源查看器。 2.解决办法 命令行安装nautilus sudo apt-get install nautilus

java.text.SimpleDateFormat (日期)

前言&#xff1a; 小编最近让流感折磨的快嘎啦&#xff0c; 呜呜呜&#xff0c;拖更了俩天&#xff0c; 从明天开始我们继续日更&#xff01;&#xff01;&#xff01;&#xff01; 我们一直都是以这样的形式&#xff0c;让新手小白轻松理解复杂晦涩的概念&#xff0c; 把Ja…

游戏市场成果及趋势

2024 年的游戏行业发展情况如何&#xff1f;这是一个既关系到开发商&#xff0c;又关系到玩家的问题&#xff0c;而市场分析师可以为我们揭晓答案。下面&#xff0c;就让我们来看看分析师给出的结论以及他们对未来趋势的预测。 玩家 自 2021 年起&#xff0c;全球平均游戏时间…

Java版-oracle数据库连接测试工具-Maven配置JDBC

一、目标: 1)数据迁移方案,原RAC,新RAC 2)关闭原RAC环境,修改新RAC环境的IP=原RAC环境的IP,优点:所有的应用端不用修改数据库连接字符串。 3)测试工具目标: 3.1 Java程序,运行后cmd窗口, 3.2 链接原RAC数据库IP,每2秒查询并显示数据; 3.3 关闭/断掉原RAC服务器,…

微信小程序实现个人中心页面

文章目录 1. 官方文档教程2. 编写静态页面3. 关于作者其它项目视频教程介绍 1. 官方文档教程 https://developers.weixin.qq.com/miniprogram/dev/framework/ 2. 编写静态页面 mine.wxml布局文件 <!--index.wxml--> <navigation-bar title"个人中心" ba…

数据结构-ArrayLIst-一起探索顺序表的底层实现

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好&#xff0c;我们今天来学习java数据结构的第一章ArrayList&#xff08;顺序表&#xff09; 1.ArrayList的概念 那小伙伴就要问了线性表到…

Unity2017 控制.abc格式的三维动画播放

首先需要导入插件Alembic&#xff0c;否则导入abc动画&#xff0c;Unity是不会识别的。 Unity2017版本及以下直接从我这儿下载&#xff1a;https://download.csdn.net/download/qq_41603955/90272382 高版本Unity&#xff0c;请移步AssetStore商店搜找。 导入abc之后&#x…

docker虚拟机平台未启用问题

在终端中输入如下代码&#xff0c;重启电脑即可 Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform 对于Docker Desktop - Unexpected WSL error问题 参考链接 解决WSL2与docker冲突问题

软件设计大致步骤

由于近期在做软件架构设计&#xff0c;这里总结下大致的设计流程 软件设计流程 1 首先要先写系统架构图&#xff0c;将该功能在整个系统的位置以及和大致的内部模块划分 2 然后写内部的结构图&#xff0c;讲内部的各个子系统&#xff0c;模块&#xff0c;组件之间的关系和调用…

EasyLine(v2.0)自制光谱、曲线处理软件

前言&#xff1a;因为这次更新对软件的整体变动较大&#xff0c;所以就没有取版本v1.1&#xff0c;而是直接使用v2.0版本。然后上一版的讲解也不是很清楚&#xff0c;这次也做重点讲解一下。 自制光谱、曲线处理软件-EasyLine 软件的安装软件的使用总体介绍文件格式处理的使用 …

赛灵思(Xilinx)公司Artix-7系列FPGA

苦难从不值得歌颂&#xff0c;在苦难中萃取的坚韧才值得珍视&#xff1b; 痛苦同样不必美化&#xff0c;从痛苦中开掘出希望才是壮举。 没有人是绝对意义的主角&#xff0c; 但每个人又都是自己生活剧本里的英雄。滑雪&#xff0c;是姿态优雅的“贴地飞行”&#xff0c;也有着成…

晨辉面试抽签和评分管理系统之八:随机编排考生的面试批次(以教师资格考试面试为例)

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

LeetCode热题100(三十四) —— 23.合并K个升序链表

LeetCode热题100&#xff08;三十四&#xff09; —— 23.合并K个升序链表 题目描述代码实现思路一&#xff1a;选择排序(199ms)思路二&#xff1a;归并排序(2ms) 思路解析 你好&#xff0c;我是杨十一&#xff0c;一名热爱健身的程序员在Coding的征程中&#xff0c;不断探索与…

深入理解 ECMAScript 2024 新特性:字符串 isWellFormed 方法

ECMAScript 2024 引入了一个新的字符串实例方法&#xff1a;String.prototype.isWellFormed。这一新增功能是为了帮助开发者更容易地验证字符串是否为有效的 Unicode 文本。本文将详细介绍这一方法的使用场景、实现原理及其在实际应用中的价值。 String.prototype.isWellFormed…

Springboot和Es整合

说明&#xff1a;本文章主要是简单整合和简单增删改查。 1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

阀井可燃气体监测仪,开启地下管网安全新篇章-旭华智能

在城市的脉络中&#xff0c;地下管网犹如隐秘的动脉&#xff0c;支撑着现代生活的运转。而在这庞大网络的关键节点上&#xff0c;阀井扮演着不可或缺的角色。然而&#xff0c;由于其密闭性和复杂性&#xff0c;阀井内部一旦发生可燃气体泄漏&#xff0c;将对公共安全构成严重威…

C#中通道(Channels)的应用之(生产者-消费者模式)

一.生产者-消费者模式概述 生产者-消费者模式是一种经典的设计模式&#xff0c;它将数据的生成&#xff08;生产者&#xff09;和处理&#xff08;消费者&#xff09;分离到不同的模块或线程中。这种模式的核心在于一个共享的缓冲区&#xff0c;生产者将数据放入缓冲区&#x…

4.寻找两个正序数组的中位数--力扣

给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.00000 解释&…