前端本地存储方案-localForage

news2024/9/22 1:40:45

1 前言

前端有多种本地存储方案可供选择,以下是其中一些常见的方案:

  1. Cookie:Cookie是一种小型的文本文件,可以在浏览器中存储少量数据。Cookie通常用于存储会话信息或用户偏好设置等数据(只能存储少量数据)。
  2. Web Storage:Web Storage是HTML5引入的API,包括localStorage和sessionStorage。这两种存储方式都可以在浏览器中存储大量数据,并且数据可以跨页面和会话保持不变(虽然比cookie多,但是同样有上限(5M)左右)。
  3. IndexedDB:IndexedDB是一种高级的客户端存储API,可以在浏览器中存储大量结构化数据。IndexedDB支持事务和索引等高级功能,并且可以在离线状态下使用(api多且繁琐,存储量大、高版本浏览器兼容性较好)。
  4. Web SQL Database:Web SQL Database是一种基于SQL的客户端存储API,已经被废弃。虽然Web SQL Database已经不再被推荐使用,但在某些情况下仍然可以考虑使用(使用简单,存储量大,兼容性差)。
  5. File API:File API是HTML5引入的API,可以让浏览器访问用户的本地文件系统。File API可以用于读取和写入本地文件,也可以用于将数据保存到本地文件中(访问用户本地文件系统存在安全性问题、兼容性差、读取和写入大型文件可能会导致浏览器崩溃或变得缓慢)。

这些本地存储方案各有优缺点,没有一种方案可以完全取代其他方案,有没有一种能够集合这多种方式, 遵循“渐进增强”或“优雅降级”的原则的方案呢(在现代浏览器中使用最新的本地存储技术,并在旧浏览器中回退到较旧的技术,确保应用程序在不同浏览器和平台上的兼容性)。是有的

pouchdblocalForage 都是前端本地存储的库,它们都支持多种存储后端,并提供了一致的API来存储和检索数据,这些库都遵循“渐进增强”或“优雅降级”的原则。

localForage

优点:

    • 使用异步API封装了Web Storage、IndexedDB和WebSQL的库,提供了简单易用的方法来存储和检索数据。
    • 可以在不同浏览器和平台上提供一致的API。
    • API 相对简单,易于上手。

缺点:

    • 不支持复制和同步功能。
    • 不支持内存存储后端。

使用场景:

    • 对性能要求较高的应用程序。
    • 不需要在多个客户端之间同步数据的应用程序。
    • 对API易用性有较高要求的应用程序

pouchdb

优点:

    • 支持多种存储后端,包括IndexedDB、WebSQL、LevelDB和内存等。
    • 提供了复制和同步功能,使得多个客户端之间可以共享数据。
    • 可以在浏览器和Node.js环境中使用。

缺点:

    • API 相对较复杂,需要一定的学习成本。
    • 在处理大量数据时可能会导致性能问题。

使用场景:

    • 需要在多个客户端之间同步数据的应用程序。
    • 需要使用多种存储后端的应用程序。
    • 对性能要求不是特别高的应用程序。

基于localForage功能强大、易于使用、跨浏览器和平台支持的特点,本文基于localForage进行介绍

2 localForage

localForage 是一个 JavaScript 库,通过简单类似 localStorage API 的异步存储来改进你的 Web 应用程序的离线体验。它能存储多种类型的数据,而不仅仅是字符串。

官方提供了中文文档

2.1 兼容性

localForage 有一个优雅降级策略,若浏览器不支持 IndexedDB 或 WebSQL,则使用 localStorage。在所有主流浏览器中都可用:Chrome,Firefox,IE 和 Safari(包括 Safari Mobile)。下面是 indexDB、web sql、localStorage 的一个浏览器支持情况,可以发现,兼容性方面loaclForage基本上满足99%需求

2.2 存储量

localForage 的存储量取决于所使用的存储后端。localForage 支持多种存储后端,包括 Web Storage、IndexedDB 和 WebSQL,每种存储后端的存储容量不同。

Web Storage 存储后端通常具有较小的存储容量限制,通常为 5-10 MB。IndexedDB 和 WebSQL 存储后端通常具有更大的存储容量限制,可以存储数百 MB 或更多的数据。

需要注意的是,存储容量限制也取决于浏览器和操作系统。例如,移动设备上的浏览器通常具有更小的存储容量限制,因为它们的存储空间有限。

总之,localForage 的存储量取决于所使用的存储后端和浏览器/操作系统的限制

2.3 使用

解决了兼容性和存储量的点,来看看localforage的基础用法

2.3.1 安装

# 通过 npm 安装:
npm install localforage
# 或通过 bower:
<script src="localforage.js"></script>
<script>console.log('localforage is: ', localforage);</script>

2.3.2 增删查改

获取存储

getItem(key, successCallback)

从仓库中获取 key 对应的值并将结果提供给回调函数。如果 key 不存在,getItem() 将返回 null

localforage.getItem('somekey').then(function(value) {
    // 当离线仓库中的值被载入时,此处代码运行
    console.log(value);
}).catch(function(err) {
    // 当出错时,此处代码运行
    console.log(err);
});

// 回调版本:
localforage.getItem('somekey', function(err, value) {
    // 当离线仓库中的值被载入时,此处代码运行
    console.log(value);
});

💡

当存储 undefined 时, getItem() 也会返回 null。由于 localStorage 限制,同时出于兼容性的原因 localForage 无法存储 undefined

设置存储

setItem(key, value, successCallback)

将数据保存到离线仓库。你可以存储如下类型的 JavaScript 对象:

  • Array
  • ArrayBuffer
  • Blob
  • Float32Array
  • Float64Array
  • Int8Array
  • Int16Array
  • Int32Array
  • Number
  • Object
  • Uint8Array
  • Uint8ClampedArray
  • Uint16Array
  • Uint32Array
  • String
localforage.setItem('somekey', 'some value').then(function (value) {
    // 当值被存储后,可执行其他操作
    console.log(value);
}).catch(function(err) {
    // 当出错时,此处代码运行
    console.log(err);
});

// 不同于 localStorage,你可以存储非字符串类型
localforage.setItem('my array', [1, 2, 'three']).then(function(value) {
    // 如下输出 `1`
    console.log(value[0]);
}).catch(function(err) {
    // 当出错时,此处代码运行
    console.log(err);
});

// 你甚至可以存储 AJAX 响应返回的二进制数据
req = new XMLHttpRequest();
req.open('GET', '/photo.jpg', true);
req.responseType = 'arraybuffer';

req.addEventListener('readystatechange', function() {
    if (req.readyState === 4) { // readyState 完成
        localforage.setItem('photo', req.response).then(function(image) {
            // 如下为一个合法的 <img> 标签的 blob URI
            var blob = new Blob([image]);
            var imageURI = window.URL.createObjectURL(blob);
        }).catch(function(err) {
          // 当出错时,此处代码运行
          console.log(err);
        });
    }
});

🔔

当使用 localStorage 和 WebSQL 作为后端时,二进制数据在保存(和检索)之前会被序列化。在保存二进制数据时,序列化会导致大小增大。

删除存储

removeItem(key, successCallback)

从离线仓库中删除 key 对应的值。

localforage.removeItem('somekey').then(function() {
    // 当值被移除后,此处代码运行
    console.log('Key is cleared!');
}).catch(function(err) {
    // 当出错时,此处代码运行
    console.log(err);
});

清空存储

clear(successCallback)

从数据库中删除所有的 key,重置数据库。

localforage.clear() 将会删除离线仓库中的所有值。谨慎使用此方法。

localforage.clear().then(function() {
    // 当数据库被全部删除后,此处代码运行
    console.log('Database is now empty.');
}).catch(function(err) {
    // 当出错时,此处代码运行
    console.log(err);
});

2.3.3 其他方法

可参考 官方文档

获取离线仓库中的 key 的数量

length(successCallback)

获取离线仓库中的 key 的数量(即数据仓库的“长度”)

localforage.length().then(function(numberOfKeys) {
    // 输出数据库的大小
    console.log(numberOfKeys);
}).catch(function(err) {
    // 当出错时,此处代码运行
    console.log(err);
});

根据 key 的索引获取其名

key(keyIndex, successCallback)

根据 key 的索引获取其名

localforage.key(2).then(function(keyName) {
    // key 名
    console.log(keyName);
}).catch(function(err) {
    // 当出错时,此处代码运行
    console.log(err);
});

获取数据仓库中所有的 key

keys(successCallback)

获取数据仓库中所有的 key。

localforage.keys().then(function(keys) {
    // 包含所有 key 名的数组
    console.log(keys);
}).catch(function(err) {
    // 当出错时,此处代码运行
    console.log(err);
});

迭代数据仓库中的所有 value/key 键值对

iterate(iteratorCallback, successCallback)

迭代数据仓库中的所有 value/key 键值对。

iteratorCallback 在每一个键值对上都会调用一次,其参数如下: 1. value 为值 2. key 为键名 3. iterationNumber 为迭代索引 - 数字

// 同样的代码,但使用 ES6 Promises
localforage.iterate(function(value, key, iterationNumber) {
    // 此回调函数将对所有 key/value 键值对运行
    console.log([key, value]);
}).then(function() {
    console.log('Iteration has completed');
}).catch(function(err) {
    // 当出错时,此处代码运行
    console.log(err);
});

// 提前退出迭代:
localforage.iterate(function(value, key, iterationNumber) {
    if (iterationNumber < 3) {
        console.log([key, value]);
    } else {
        return [key, value];
    }
}).then(function(result) {
    console.log('Iteration has completed, last iterated pair:');
    console.log(result);
}).catch(function(err) {
    // 当出错时,此处代码运行
    console.log(err);
});

📌

通过在 iteratorCallback 回调函数中返回一个非 undefined 的值,能提前退出 iterateiteratorCallback 的返回值即作为整个迭代的结果,将被传入 successCallback

这意味着如果你使用的是 CoffeeScript,那么你需要手动执行一个不带内容的 return 语句才能继续迭代所有的 key/value 键值对。

2.3.4 初始化配置

选择特定存储引擎

setDriver(driverName)

setDriver([driverName, nextDriverName])

若可用,强制设置特定的驱动。

默认情况下,localForage 按照以下顺序选择数据仓库的后端驱动:

  1. IndexedDB
  2. WebSQL
  3. localStorage

如果你想强制使用特定的驱动,可以使用 setDriver(),参数为以下的某一个或多个:

  • localforage.INDEXEDDB
  • localforage.WEBSQL
  • localforage.LOCALSTORAGE
// 强制设置 localStorage 为后端的驱动
localforage.setDriver(localforage.LOCALSTORAGE);

// 列出可选的驱动,以优先级排序
localforage.setDriver([localforage.WEBSQL, localforage.INDEXEDDB]);

🔔

通过使用 localforage.setDriver() 方法,可以选择要在其中存储数据的特定存储引擎。如果你尝试加载的后端驱动在浏览器上不可用,localForage 将使用以前使用的后端驱动中的一个。这意味着如果你试图强制 Gecko 浏览器使用 WebSQL,则会失败并继续使用 IndexedDB。

数据库配置

config(options)

设置 localForage 选项。在调用 localForage 必先调用它,但可以在 localForage 被加载后调用。使用此方法设置的任何配置值都将保留,即使在驱动更改后,所以你也可以先调用 config() 再次调用 setDriver()。以下配置值可以设置:

driver

要使用的首选驱动。与上面的 setDriver 的值格式相同。

默认值:[localforage.INDEXEDDB, localforage.WEBSQL, localforage.LOCALSTORAGE]

name

数据库的名称。可能会在在数据库的提示中会出现。一般使用你的应用程序的名字。在 localStorage 中,它作为存储在 localStorage 中的所有 key 的前缀。

默认值:'localforage'

size

数据库的大小(以字节为单位)。现在只用于WebSQL。 默认值:4980736

storeName

数据仓库的名称。在 IndexedDB 中为 dataStore,在 WebSQL 中为数据库 key/value 键值表的名称。仅含字母和数字和下划线。任何非字母和数字字符都将转换为下划线。

默认值:'keyvaluepairs'

version

数据库的版本。将来可用于升级; 目前未使用。

默认值:1.0

description

数据库的描述,一般是提供给开发者的。

默认值:''

// 将数据库从 “localforage” 重命名为 “Hipster PDA App”
localforage.config({
    name: 'Hipster PDA App'
});

// 将强制使用 localStorage 作为存储驱动,即使其他驱动可用。
// 可用配置代替 `setDriver()`。
localforage.config({
    driver: localforage.LOCALSTORAGE,
    name: 'I-heart-localStorage'
});

// 配置不同的驱动优先级
localforage.config({
    driver: [localforage.WEBSQL,
             localforage.INDEXEDDB,
             localforage.LOCALSTORAGE],
    name: 'WebSQL-Rox'
});

📌

与大多数 localForage API 不同,该 config 方法是同步的。

2.3.5 自定义驱动

你需要确保接受一个 callback 参数,并且将同样的几个参数传递给回调函数,类似默认驱动那样。同时你还需要 resolve 或 reject Promise。通过 默认驱动 可了解如何实现自定义的驱动。

自定义实现可包含一个 _support 属性,该属性为布尔值(true / false) ,或者返回一个 Promise,该 Promise 的结果为布尔值。如果省略 _support,则默认值是 true 。你用它来标识当前的浏览器支持你自定义的驱动。

// 此处为驱动的实现
var myCustomDriver = {
    _driver: 'customDriverUniqueName',
    _initStorage: function(options) {
        // 在此处自定义实现...
    },
    clear: function(callback) {
        // 在此处自定义实现...
    },
    getItem: function(key, callback) {
        // 在此处自定义实现...
    },
    key: function(n, callback) {
        // 在此处自定义实现...
    },
    keys: function(callback) {
        // 在此处自定义实现...
    },
    length: function(callback) {
        // 在此处自定义实现...
    },
    removeItem: function(key, callback) {
        // 在此处自定义实现...
    },
    setItem: function(key, value, callback) {
        // 在此处自定义实现...
    }
}

// 为 localForage 添加驱动。
localforage.defineDriver(myCustomDriver);

💡

你在任何一个 localForage 实例上添加驱动实现后,则该驱动可用于页面内的所有 localForage 实例。

返回正在使用的驱动的名称

driver()

返回正在使用的驱动的名称,在异步的驱动初始化过程中(详情参阅 ready)为 null,若初始化未能找到可用的驱动也为 null

localforage.driver();
// "asyncStorage"

如果驱动在初始化过程中或之后出错,localForage 将试着使用下一个驱动。由加载 localForage 时的默认驱动顺序或传递给 setDriver() 的驱动顺序决定。

异步驱动程序初始化过程是否已完成

ready() 提供了一种方法来确定异步驱动程序初始化过程是否已完成,localForage 会对所有数据 API 方法的调用进行缓冲排序。当我们需要知道 localForage 当前正在使用的是哪一个驱动时,此方法会非常有用。

localforage.ready().then(function() {
    // 当 localforage 将指定驱动初始化完成时,此处代码运行
    console.log(localforage.driver()); // LocalStorage
}).catch(function (e) {
    console.log(e); // `No available storage method found.`
    // 当没有可用的驱动时,`ready()` 将会失败
});

浏览器是否支持 driverName

supports(driverName)

返回一个布尔值,表示浏览器是否支持 driverName

localforage.supports(localforage.INDEXEDDB);
// true

2.3.6多实例

可以创建多个 localForage 实例,且能指向不同数据仓库。所有 config 中的配置选项都可用。

createInstance

创建并返回一个 localForage 的新实例。每个实例对象都有独立的数据库,而不会影响到其他实例。

var store = localforage.createInstance({
  name: "nameHere"
});

var otherStore = localforage.createInstance({
  name: "otherName"
});

// 设置某个数据仓库 key 的值不会影响到另一个数据仓库
store.setItem("key", "value");
otherStore.setItem("key", "value2");

dropInstance

调用时,若不传参,将删除当前实例的 “数据仓库” 。

调用时,若参数为一个指定了 namestoreName 属性的对象,会删除指定的 “数据仓库”。

调用时,若参数为一个仅指定了 name 属性的对象,将删除指定的 “数据库”(及其所有数据仓库)。

localforage.dropInstance().then(function() {
  console.log('Dropped the store of the current instance').
});

localforage.dropInstance({
  name: "otherName",
  storeName: "otherStore"
}).then(function() {
  console.log('Dropped otherStore').
});

localforage.dropInstance({
  name: "otherName"
}).then(function() {
  console.log('Dropped otherName database').
});

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

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

相关文章

动态规划-数字三角形模型

title: 数字三角形模型 date: 2023-05-10 14:26:11 categories: Algorithm动态规划 tags:动态规划数字三角形 数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可…

Cy5.5-聚乙二醇-羟基;PEG2000;Cy5.5-PEG-OH结构式以及相关信息介绍

中文名称Cy5.5-聚乙二醇-羟基 英文名称Cy5.5-PEG-OH 性状&#xff1a;蓝色或深蓝色固体或粘性液体&#xff0c;取决于分子量 溶剂&#xff1a;溶于水、氯仿、DMSO等常规性有机溶剂 激发/发射波长&#xff1a;655nm/678nm 分子量PEG:1k、2k、3.4k、5k其他分子量可以制定 分…

vue3 - 实现文字横向滚动 / 垂直翻滚功能组件,类似喇叭广告、公告、跑马灯的文字滚动效果(详细组件源码与注释,一键复制开箱即用!)

效果图 在 vue3.js 项目中,完成了文字横向 / 纵向自动重复滚动效果组件,支持设置滚动区域宽高、背景色、展示条数、滚动间隔、横向纵向-方向切换等等,丝滑流畅! 无任何第三方插件依赖,详细的示例及注释,轻松一键复制组件源码开箱即用! 第一步 创建文字滚动组件TextSc…

22年山东省B-2网页渗透测试

首先这道题目就是ip/1找flag的题目,所以我们直接来看环境: 这个题目直接使用抓包 修改头部即可拿到flag 我们接着看一道题目: 这道题目

输入url后,到页面展示出来

目录 1、用户在浏览器中输入url地址 2、缓存解析 3、浏览器进行DNS解析域名得到服务器ip地址 4、TCP三次握手建立客户端和服务器的连接 5、客户端发送HTTP请求获取服务器端的静态资源 6、服务器发送HTTP响应报文给客户端&#xff0c;客户端获取到页面静态资源 7、TCP四次…

探索文本生成世界:原理、技术与应用

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

4.进阶篇

目录 一、按照测试对象划分 1.界面测试&#xff08;UI测试&#xff09; 界面测试的常见错误&#xff1a; 2.可靠性测试 3.容错性测试 4.文档测试 5.兼容性测试 6.易用性 7.安装卸载测试 8.安全性测试 9.性能测试 10.内存泄漏 二、按照是否查看代码 1.黑盒测试 2.…

Dubbo源码解析一Dubbo SPI

Dubbo SPI 概述节点角色说明1. JDK SPI1.1 JDK SPI使用1.2 JDK SPI加载过程1.3 JDK SPI优缺点1.3.1 优点1.3.2 缺点 2. Dubbo中的SPI2.1 概述2.2 入门案例2.3 源码分析2.3.1 依赖注入2.3.2 动态增强2.3.2.1 装饰者模式2.3.2.2 Dubbo中的AOP 2.3.3 动态编译2.3.3.1 SPI中的自适应…

【数据结构】- 几个步骤教你认识并实现一个链表之带头(哨兵位)双向循环链表(中)

文章目录 前言&#x1f31f;一、带头双向循环链表&#x1f30f;1.1头删&#xff1a;&#x1f4ab;1.1.1代码&#xff1a;&#x1f4ab;1.1.2流程图&#xff1a; &#x1f30f;1.2尾删&#xff1a;&#x1f4ab;1.2.1代码&#xff1a;&#x1f4ab;1.2.2流程图&#xff1a; &…

5. Mysql索引优化实战二

MySQL性能调优 1. 分页查询优化1.1 根据自增且连续的主键排序的分页查询1.2 根据非主键字段排序的分页查询 2. Join关联查询优化 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 本节课内容&#xff1a; 1…

HTTP第七讲——HTTP报文

报文结构 拿 TCP 报文来举例&#xff0c;它在实际要传输的数据之前附加了一个 20 字节的头部数据&#xff0c;存储 TCP 协议必须的额外信息&#xff0c;例如发送方的端口号、接收方的端口号、包序号、标志位等等。 有了这个附加的 TCP 头&#xff0c;数据包才能够正确传输&…

HTML 基础知识

HTML基础知识 1. VSCode的安装与配置 下载地址 https://code.visualstudio.com/ 安装插件 Live Server Auto Rename Tag 自动格式化 点击 settings&#xff0c;然后输入format&#xff0c;然后勾选上 Format On Save。 2. HTML 基础标签 2.1 文件结构 快捷键&#xff1…

安卓实现左侧列表选择项点击,右侧fragment切换

安卓实现左侧列表选择项点击&#xff0c;右侧fragment切换 问题背景 安卓日常开发中&#xff0c;有时候需要开发页面中&#xff0c;显示左侧会列表选择项&#xff0c;点击不同的选项后右侧切换fragment显示&#xff0c;本文将介绍实现的一个思路。 问题分析 要实现的效果如…

前端三剑客 HTML+CSS+JS

文章目录 一、HTML1.1 基础标签1.2 列表1.3 表格1.4 表单 二、CSS2.1 引入方式2.2 CSS 选择器2.2.1 基本选择器2.2.2 组合选择器 2.3 常用属性2.3.1 背景2.3.2 文本2.3.3 字体2.3.4 display元素类型2.3.5 浮动2.3.6 盒子模型 三、JavaScript3.1 引入方式3.2 数据类型3.2.1 数组…

tomcat集群下的session共享和负载均衡

环境 操作系统&#xff1a;windows tomcat1&#xff1a;Apache Tomcat/7.0.52&#xff08;8085&#xff09; tomcat2&#xff1a;Apache Tomcat/7.0.52&#xff08;8086&#xff09; jre&#xff1a;1.7.0_80 nginx&#xff1a;nginx-1.20.1&#xff08;8070&#xff09; redis…

cmd@快捷键方式@静默执行命令@修复桌面空白快捷方式图标

文章目录 ref前言快捷方式执行命令行或打开文件eg:直接打开某个文件 创建快捷方式eg:快捷方式运行命令 修复快捷方式图标空白问题逐个修复批量修复一次性操作:逐步操作 执行效果第三方工具修复 ref How can I execute a Windows command line in background? - Super Userstb…

2022年5个不寻常的Web3预测

正如埃隆马斯克所说&#xff0c;“最有趣的结果是最有可能的”。所以&#xff0c;这是我对web3的5个不同寻常的预测&#xff0c;下面我将详细介绍我是如何得出这些想法的&#xff1a; 口袋妖怪训练师将是一份全职工作有人会使用JPEG支持的贷款购买房屋(IRL)DAO将收购一家上市公…

并发编程11:Synchronized与锁升级

文章目录 11.1 面试题11.2 Synchronized的性能变化11.3 Synchronized锁种类及升级步骤11.3.1 多线程访问情况11.3.2 升级流程11.3.3 无锁11.3.4 偏锁11.3.5 轻锁11.3.6 重锁11.3.7 小总结 11.4 JIT编译器对锁的优化11.4.1 JIT11.4.2 锁消除11.4.3 锁粗化 11.5 小总结 11.1 面试…

电影《银河护卫队3》观后感

上周看了电影《银河护卫队3》&#xff0c;本部电影&#xff0c;主要是围绕着主角团队中的一个队员展开叙事的&#xff0c;在团队中&#xff0c;这名队员叫“火箭”&#xff0c;是一只经过基因改造过的浣熊。 当初进行改造的团队&#xff0c;是一家拥有基因改造技术的团队&…

基于SpringBoot, Vue实现的校园二手书交易系统

背景 在Internet高速发展的今天&#xff0c;计算机的应用几乎完全覆盖我们生活的各个领域&#xff0c;互联网在经济&#xff0c;生活等方面有着举足轻重的地位&#xff0c;成为人们资源共享&#xff0c;信息快速传递的重要渠道。在中国&#xff0c;网上管理的兴起也同时飞速发…