自从一年前发布了Vuejs小书的电子书,也有些日子没有碰过它们了,现在因为项目的缘故,需要使用JavaScript全栈开发。所以,我得把这个全栈环境搭建起来。

整个系列,是会采用我的一贯风格,就是不疾不徐,娓娓道来,学习完毕,你可以掌握我提到的全系列的知识,并且得到一个可以直接拷贝的代码模板,并把它用到你的项目中。

完成操练下来,得半小时到一个小时吧。腾出你的时间再来学习。

前端的复杂度

很多人是看不起JavaScript开发的。这玩意不就是玩具嘛,一些脚本和标签而已。说这话的时候,他们可能是就翘起二郎腿的,或者抱着膀子的。

然而,前端因为还在快速发展,因此很多东西在变,构造环境的选择比较多,技术种类也不少,很多事情得自己做。因此它其实并不比那么简单的。这篇文章的图,可以窥视到前端复杂的一角了。Modern Frontend Developer in 2018。

我看了不少资料,很多都是讲解这张图中的一个技术,讲解全栈的肯定是有的,但是往往过于复杂。本文试图通过一组文章,把JavaScript的全栈开发做一个全景的展示,力图使用一个案例,全须全尾的贯穿整个系列,便于初学者对技术的急速理解。

大纲

所以,文章会包括这些:

  1. 使用Vuejs脚手架,快速搭建一个CRD用户界面。会使用vuex管理状态,使用vue-router管理路由。
  2. 使用Mongodb存储和提供后端CRD服务。
  3. 使用Nodejs搭建后端CRD服务。
  4. 使用Fecth|Axios访问后端CRD服务
  5. 使用bulfy的美化组件的方法
  6. 整合全栈服务

其中的CRD指的是Create、Read、Delete。针对的数据对象,就是一个Todo对象,看起来是这样的:

{id:1,subject:"Loving"}

如果是多个数据对象,看起来是这样的:


[{id:1,subject:"Loving"},{id:1,subject:"Writing"},{id:1,subject:"Preying"}
]

这个看起来很简单平实的JS对象,会在一组组函数、模块和对象之间流动,甚至跨越网络边界,从内存到硬盘。它会被存储在Mongodb内,也会从Mongodb提取出来,在用户界面、HTTP客户端,HTTP服务器传递。

整个App看起来就是一台机器,可以说代码在运转这个机器,但是也不妨说是数据在驱动这个它。

使用Vuejs脚手架,快速搭建Todo App界面

我们给自己命题,做一个TODO应用,它看起来是这样的:

用户可以看到一个编辑框,和一个清单。

  1. 在编辑框内加入新的todo项目,按回车即可加入到列表
  2. 列表内每个项目有一个按钮,点击按钮,可以删除当前项目

环境要求

说起来搭建JS全栈开发环境,涉及到的东西真的不少。大的选择是这样的:

  1. 前端采用Vuejs
  2. 后端采用Nodejs
  3. 存储使用Mongodb。

大的选择定了,小的配套也就跟着来,前端配套的话需要一系列的技术,特别是前端,对应着Vuejs,配套管理路由、状态、组件的都有相应的技术手段。自己搭配的话,还是非常麻烦的。

幸好Vuejs还有一个前端脚手架工具vue-cli,它可以把以上的组件整合起来到一个工程内。一个最为基础的vue-cli工程脚手架的创建,现在得需要160M左右的空间占用。在我的电脑和网络情况下,需要2分半的时间才会完成。

前端 Vuejs

  1. vue-router,前端路由管理
  2. vuex,前端数据管理,专业一点的说法,就是状态管理,这些数据,可能是属性,数组,对象等等,可以跨组件访问,而不像是data函数那样提供的数据只能被本组件访问,可以想到,稍微大一点的前端工程都必须前端状态管理的。
  3. axios,前端HTTP访问,以promise的形式,封装了类似fetch,AJAX的能力
  4. buefy,前端微型框架,可以使用自定义标签使用自定义组件,并且CSS框架为Bulma
  5. Bulma,尽管使用了微框架,只是让对CSS framework的了解降到最低,但是不是说就不需要了解了。还是得学习的。Bulma相对于老牌的Bootstrap,是不需要依赖于JS框架,也没有任何JS代码,因此可以和任何一框架很好的结合,比如这里的Vuejs。这就是我选择它的原因

后端 cli-service

为了给前端开发提供工具链和开发便利性,我们常常需要webpack&babel。有了它们,就可以使用ES6的语法,以及代码更新后自动刷新等。这些都是非常便利的特性,用了就离不开的。有了vue-cli,对webpack&babel的了解可以降到最低,但是也不能不学,稍微需要一些定制的配置,也是必须要掌握的,起码得知道如何启动一个开发服务器,已经发布build,还有把前端服务经过proxyChain跳转到后端服务去等等。所幸是在这个教程内,你不需要学习太多就可以把案例跑起来。

App Server + Mongodb

接下来看后端,一般习惯就是使用Nodejs+Express.js的搭配。这个没有多少说的,都是老东西了。为了访问Mongodb,也需要一套框架,基于Callback的,或者基于Promise+Await+Async的,也是需要选择的。

为了便于理解,我会用一个最小的案例完成整个开发过程,就是案例在现实中并不存在,但是也是有用的,就是你可以当它们是模板,直接拷贝代码,然后填充你的内容。天下代码一大抄嘛,没有什么不对的,毕竟这些写代码是最快的。这个案例的数据模型就是对一个{id,name}的对象进行CRD(创建删除列表)。

安装运行环境

安装环境相对简单,特别是如果使用Mac OS X的话。有一些工具链可以帮助快速搭建环境。当然Windows也并不多麻烦就是了,它常常提供的是一个安装程序,大部分时间,你需要的就是点击下一步。

这里以MAC为例,讲解安装。

mongodb

安装和运行Mongodb Daemon:


brew install mongodb
mongodb

访问验证,首先执行Mongodb Shell:


mongo

输入命令,查询数据库清单:


> show dbs
local           0.000GB

能够看到这些信息,说明mongodb安装成功。

Node.js

安装并验证:


$brew install nodejs
$node -v
10.7.0

能够看到这些信息,说明Node.js安装成功。

开始前端编码

安装编码环境

首先安装vue-cli,方法和一般的NPM模块一样的,我们安装的版本是3.0:


npm i @vue/cli 

查看版本:


vue -V
3.0.0

看到如下信息,说明成功。然后创建App的脚手架代码:


vue create todoapp

注意,在此创建过程中,命令行会指示你做出选择,我们会选择Manual select feature,然后选择router和vuex,其他不选。然后并执行此代码:


cd todoapp
npm run serve

可以在浏览器中访问localhost:8080看到Vue的启动画面。说明创建脚手架成功。

此时,vue-cli已经帮助安装了vuex和router的模块依赖。本节一次性的安装全部剩余的全部NPM依赖,免得以后用一个安装一个,麻烦而且啰嗦。

npm install buefy --save
npm install axios --save 

buefy是一个基于Bulma的Vuejs用户界面组件库。这次的UI的CSS方案,使用Bulma,Vuejs如果想要以定制组件的形式去使用它的话,那么需要安装Buefy模块。实际上,我研究过Bulma和Bootstrap,还写了一本免费的电子书,我觉得Bulma相对于Bootstrap的优势在于1.不依赖任何JS框架2.用户接口设计更加简明。这就是我现在选择使用Bulma的原因。

Axios是一个封装了HTTPClient的库,提供了promise接口。我们使用它访问后端的HTTP Server的数据。之前提到的数据对象,就是由Axios提取到客户端,也会是通过Axios把数据对象提交到服务器的。

前端编码

首先,我们从状态开始。我们之前提到的Vuex,是Vuejs管理状态的官方插件。所谓的状态,就是应用程序的数据对象们。也就是我们提到的Todo对象和Todo对象集合。我们在App用户界面上看到的很多数据都是来自于状态对象。状态对象在src/store.js。不仅仅是的应用状态信息,还有和对这些的操作函数。既然需要一个todo项目清单,因此应该加入如下代码:


import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const defaultTodo = [{id:1,subject:'Eating'},{id:2,subject:'Loving'},{id:3,subject:'Preying'},]
function indexById(todos,id){for (var i = 0; i < todos.length; i++) {if (id == todos[i].id)return i}return -1
}
import axios from 'axios'
export default new Vuex.Store({state: {msg:'Todo App',todos:defaultTodo},mutations: {add(state,subject){var todo = {id:subject,subject:subject}state.todos.push(todo)},remove(state,id){state.todos.splice(indexById(state.todos,id),1)},reload(state){state.todos = defaultTodo}},actions: {add: (context, link) => {context.commit("add", link)},remove: (context, link) => {context.commit("remove", link)},reload: (context) => {context.commit("reload")}}
})

其中的state.todos属性,就是我们的主要的数据对象了。state.msg这是提供了一个App的标题字符串。mutations属性内是对数据修改提供的方法,比如

  1. 我们需要添加一个todo,使用add()方法,相应的
  2. 删除一个todo,使用remove()方法
  3. 刷新一个todo列表,就会使用load()方法

有时候,对数据的修改可能是比较消耗时间的,因此为了避免阻塞客户端的主线程,这个对象也提供了异步的方法,actions对象内就是对应修改操作的异步方法,这里的方法功能上和mutations一致,但是是异步的。Vuex提供了类似:


context.commit()

的语法,提供和actions和mutations方法的对接。第一个参数是mutations的方法名称,之后的参数最为mutations方法的参数传递给mutations方法。

特别说下,mutations内的add()方法,其中用户界面会提供一个Todo.subject属性,而ID是需要自动生成的,我们这里临时使用subject的值作为id,就是一个偷懒,只要subject不要输入重复,也暂时可以蒙混过关。因为知道本项目内的后台存储会采用Mongodb,在Mongodb内插入一个新的对象后,会自动生成一个ID,我们的Todo对象的id会采用这个ID。这里就没有必要自己生成了。

在src/views/home.vue内,粘贴为如下代码:


<template><div class="home"><h1>{{msg}}</h1><NewTodo></NewTodo><TodoList></TodoList></div>
</template>
<script>
import NewTodo from '@/components/NewTodo.vue'
import TodoList from '@/components/TodoList.vue'
import {mapState,mapActions} from 'vuex'
export default {name: 'home',computed:mapState(['todos','msg']),components: {TodoList,NewTodo},data(){return{newtodo:''}},methods:{...mapActions(['remove','add']),add1:function(){this.add(this.newtodo)this.newtodo = ''}}
}
</script>

...mapState,mapActions的解说。

就是说,我们这个Todo App划分为为两个组件,其中一个组件负责显示编辑框,并接受回车事件,把新的Todo项目加入到应用状态内。另外一个组件负责显示全部Todo项目,并接受删除事件,删除指定的Todo项目。它们分别是NewTodo组件和TodoList组件:


<NewTodo></NewTodo>
<TodoList></TodoList>

这两个组件的代码实现,分别在文件src/components/NewTodo.vuesrc/components/TodoList.vue内。NewTodo代码:


<template><div class="home"><form @submit.prevent="add1"><input type="text" name="newTodo" placeholder="new todo" v-model="newtodo"></form></div>
</template>
<script>
import {mapState,mapActions} from 'vuex'
export default {name: 'newtodo',computed:mapState(['todos','msg']),data(){return{newtodo:''}},methods:{...mapActions(['add']),add1:function(){this.add(this.newtodo)this.newtodo = ''}}
}
</script>

TodoList代码:


<template><div class="hello"><ul><li v-for="(todo,index) in todos" v-bind:key="todo.id">{{todo.subject}}<button @click="remove(todo.id)" class="rm">remove</button></li></ul></div>
</template>
<script>
import {mapState,mapActions} from 'vuex'
export default {name: 'todolist',computed:mapState(['todos','msg']),components: {},methods:{...mapActions(['remove','reload'])},mounted(){this.reload()}
}
</script>
<style scoped>
</style>

在src/main.js文件内,添加如下代码,引入Buefy:


import Buefy from 'buefy'
import 'buefy/lib/buefy.css'
Vue.use(Buefy)

现在可以使用Buefy组件了。我们可以把NewTodo组件内的标准的input变成组件化的input,把标签换成b-input即可。代码如下:


<b-input type="text" name="newTodo" placeholder="new todo" v-model="newtodo"></b-input>

现在看浏览器,input变成了比较有吸引力的Bulma风格的控件了。
访问网络使用axios。需要首先找到src/home.vue在代码的开头部分引用此库:


import axios from 'axios'

在Vue单页组件内使用此库了。比如在src/home.vue内代码对象中加入新方法:


mounted(){var url  = 'https://api.coindesk.com/v1/bpi/currentprice.json'axios ({url:url,method: 'get',}).then( res => {console.log(res.data.chartName)} ).catch( err => cosole.error(err))
}

我们来看看适应效果。启动cli-service:


npm run serve

然后打开浏览器,输入地址localhost:8080,如果可以在浏览器内看到我们期望的用户界面,并且都可以看到console打印了Bitcoin,那么就说明用户界面代码和初步的访问HTTP网络的axios代码以及状态管理功能都是成功了的。

后端编码

现在,我们已经可以看到UI了,但是用户界面内的数据来自于客户端,而不是来自于服务器。我们的数据当然应该来源于服务器的了。因此我们需要启动给一个自己的服务器,这个服务器可以接受客户在界面上录入的新的Todo对象,也可以提供后端数据库内的Todo清单。

为了测试的目的,常常需要准备一个todo应用的后台JSON服务,可以通过HTTP方式,提供todo项目的增加删除修改和查询。

这样的服务器,使用了nodejs作为服务器端,并且使用了两个node模块,可以使用npm安装它们:

npm install express body-parser

body-parser是一个中间件,可以解析请求内容并把解析结果放到req.body属性内。最常见的做法就是解析json内容。

代码如下(文件名为:jsonserver.js):

var express = require('express');var app = express();var path = require('path')var bodyParser = require('body-parser')app.use(bodyParser.json())var todos = []var public = path.join(__dirname, '/')app.use('/',express.static(public))const defaultTodo = [{id:1,subject:'Eating'},{id:2,subject:'Loving'},{id:3,subject:'Preying'},]function rs(){todos = defaultTodo}function indexById(id){for (var i = 0; i < todos.length; i++) {if (id ==todos[i].id)return i}return -1}rs()app.delete('/api/todo/:id', function (req, res) {var userkey = +req.params.idtodos.splice(indexById(userkey),1)res.end( JSON.stringify(todos));rs()})app.get('/api/todos', function (req, res) {res.end( JSON.stringify(todos));})app.post('/api/todo', function (req, res) {todos.push(req.body)res.end(JSON.stringify(todos))rs()})var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("listening at http://%s:%s", host, port)})

可以使用命令执行:

node jsonserver.js

Curl命令验证

可以通过curl命令验证服务的有效性:

  1. GET操作

$curl http://localhost:8081/todo/1$curl http://localhost:8081/todos
  • DELETE操作

  • $ curl -X "DELETE" http://localhost:8081/api/todo/1
  • POST操作

  • 
    $curl -X POST  -H "Content-Type: application/json" -d '{"subject":"s4"}' http://localhost:8081/api/todo

    前端HTML验证

    创建一个index.html文件,并放置到和jsonserver.js代码同一目录,代码如下:

    
    <a href='/todos'>todos</a>
    <a href='/todo/1'>todo/1</a>
    <button onclick='remove()'>remove 1</button>
    <button onclick='create()'>create</button>
    <script>function remove(){fetch ('/api/todo/1',{method: 'DELETE',}).then( res => console.log(res.json())).catch( err => cosole.error(err))}function create(){fetch ('/api/todo',{method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({id: "4", subject: "s4"})}).then( res => console.log(res.json())).catch( err => cosole.error(err))}
    </script>

    可以提供创建,删除,列表的测试,其中部分结果在console内显示。

    说起来,JS访问HTTP的库真的是不少,这里 提到的库都有9种。其中的fetch api使用起来非常的简洁趁手,可是它不支持IE。如果你需要支持IE的话,使用Axios更好。这就是为什么Vuejs官方推荐Axios的原因吧:

    
    The Fetch API is a powerful native API for these types of requests. You may have heard that one of the benefits of the Fetch API is that you don’t need to load an external resource in order to use it, which is true! Except… that it’s not fully supported yet, so you will still need to use a polyfill. There are also some gotchas when working with this API, which is why many prefer to use axios for now. This may very well change in the future though.

    axios访问方法

    相比fetch,使用axios必须依赖于外部文件。为了方便,我们直接使用unpkg网站提供的库文件。

    axios的语法和fetch的大同小异,看着也是比较简洁美观的。以下代码,把create和remove函数的内部实现换掉,其他不变。

    
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <a href='/todos'>todos</a>
    <a href='/todo/1'>todo/1</a>
    <button onclick='remove()'>remove 1</button>
    <button onclick='create()'>create</button>
    <script>function remove(){axios ({url:'/api/todo/1',method: 'DELETE',}).then( res => console.log(res.json())).catch( err => cosole.error(err))}function create(){axios ({method: 'POST',url:'/api/todo',headers: {'Content-Type': 'application/json'},data: JSON.stringify({subject: "s4"})}).then( res => console.log(res.json())).catch( err => cosole.error(err))}
    </script>

    现在,后端也是可以跑起来了的。

    整合:前端后端

    建立cli-service到App Server的通道

    每次执行命令:npm run serve,都会启动vue定制脚手架的服务器代码,它会提供不少方便开发的特性。但是我希望一部分URL可以转发到我自己的服务器内。比如把所有的/api打头的URL全部转过来。只要在工程根目录内加入此文件vue.config.js,录入如下内容:

    
    module.exports = {devServer: {proxy: {"/api": {target: "http://localhost:8181",secure: false}}}
    };

    我们自己的测试服务器在这里:

    
    var http = require('http');
    http.createServer(function (req, res) {res.write('Hello World!'); res.end(); 
    }).listen(8181); 

    我们的定制服务器,就可以监听8181的本地机器端口,等待客户端的匹配的URL转发过来,并转发我们服务器的响应代码到客户端。

    但是正常开发过程中,是需要自己的服务器端代码的,如何在利用Vue脚手架服务器的方便性的基础上,加入自己的代码呢。做法是另外做一个定制的服务器,然后让vue定制脚手架的服务器转发URL到此服务器。

    为了测试的目的,我们把函数mounted修改为:

    
    mounted(){var url  = '/api/1'axios ({url:url,method: 'get',}).then( res => {console.log(res.data)} ).catch( err => console.error(err))
    }

    即可看到浏览器console内打印Hello World!

    整合前端到后端

    我们已经通过配置,要求cli-service转移全部api打头的URL到App Server。只要在工程根目录内加入此文件vue.config.js,录入如下内容:

    
    module.exports = {devServer: {proxy: {"/api/*": {target: "http://localhost:8181/api",secure: false}}}
    };

    现在,我们可以修改前端的Axios使用代码,分别替代前端代码的数据装入、数据删除、数据添加的代码,让这些代码可以支持网络操作。为了避免网络操作代码和业务逻辑代码混合在一起,我决定包装三个网络操作函数,并把它们放置到src/store.js文件内:

    import axios from 'axios'
    function httpadd(subject,cb){axios ({method: 'POST',url:'/api/todo',headers:[{'Content-Type':'application/json'}],data: {subject:subject}}).then( res => cb(res.data)).catch( err => console.error(err))
    }
    function httpremove(id,cb){axios ({url:'/api/todo/'+id,method: 'delete',}).then( res => {cb()}).catch( err => console.error(err))
    }
    function httpreload(cb){axios ({url:'/api/todos',method: 'get',}).then( res => {cb(res.data)}).catch( err => console.error(err))
    }

    分别完成添加、删除、查找的任务,当完成工作后,都会调用一个callback函数,在此函数内,可以消费访问网络后得到的响应数据。

    然后把文件内src/store.js的mutations对象改成如下代码:

    mutations: {add(state,subject){httpadd(subject,function(todo){state.todos.push(todo)})},remove(state,id){httpremove(id,function(){state.todos.splice(indexById(state.todos,id),1)  })},reload(state){httpreload(function(todos){// console.log(todos)state.todos = todos})// state.todos = defaultTodo}
    },

    最后,在TodoList内加入一个新函数,并通过mapActions引入src/store.js的load()函数到当前对象内:

    methods:{...mapActions(['remove','load'])},mounted(){this.load()}

    以便在启动后调用this.load()装入它。

    整合:后端和数据库

    要完成后端到数据库的整合,需要做如下的修改:

    1. 原本在后端App Server内Todo数据数组,现在应该从Mongodb获得
    2. 原本在添加Todo对象的时候只是添加到AppServer对象内,现在需要同时写入Mongodb
    3. 原本在删除时只是从数组删除,现在需要同时在Mongodb内删除

    因此,现在我们需要添加三个函数,分别做针对Mongodb的获取清单、添加和删除的工作:

    
    var mongo = require('mongodb')
    function insertDoc(subject,callback){const connectionString = 'mongodb://localhost:27017';(async () => {const client = await MongoClient.connect(connectionString,{ useNewUrlParser: true });const dbo = client.db('todos');try {var res = await dbo.collection('todo').insertOne({subject:subject})callback(undefined,res.insertedId)}catch(err){callback(err)}finally {client.close();}})().catch(err => console.error(err));
    }
    function deleteDoc(_id,callback){const MongoClient = mongo.MongoClient;const connectionString = 'mongodb://localhost:27017';(async () => {const client = await MongoClient.connect(connectionString,{ useNewUrlParser: true });const dbo = client.db('todos');try {var myquery = {_id:new mongo.ObjectID(_id)}var r = await dbo.collection("todo").deleteMany(myquery)}catch(err){callback(err)}finally {client.close();callback()}})().catch(err => console.error(err));
    }
    function allDoc(callback){const MongoClient = mongo.MongoClient;const connectionString = 'mongodb://localhost:27017';(async () => {const client = await MongoClient.connect(connectionString,{ useNewUrlParser: true });const dbo = client.db('todos');try {var r = await dbo.collection("todo").find().toArray()var ts = []for (var i = 0; i < r.length; i++) {ts.push({id:r[i]._id,subject:r[i].subject})}callback(undefined,ts)}catch(err){callback(err)}finally {client.close();}})().catch(err => console.error(err));
    }

    这三个函数的功能和使用方法如下:

    1. 函数allDoc会从Mongodb内获取全部todo集合,并通过callback传递这个集合给调用者函数。
    2. 函数deleteDoc会从Mongodb内删除指定id的todo条目,完成删除后,通过callback通知调用者。
    3. 函数deleteDoc会向Mongodb内添加一个todo条目,完成添加后,通过callback通知调用者,并传递新的todo对象给调用者。

    这里的代码本身并不复杂,但是因为涉及到如何访问Mongodb,因此涉及到比较多的概念,这里不做具体的解释,你可以先把它们用起来。如果完成了本教程后,希望对Mongodb的访问做具体了解的话,可以查看后文附录的“Mongodb快速参考”。

    并且和App Server对应的代码接驳,把原来的路由代码替换如下:

    
    app.delete('/api/todo/:id', function (req, res) {var userkey = req.params.iddeleteDoc(userkey,function(){todos.splice(indexById(userkey),1)res.end( JSON.stringify(todos));})
    })
    app.get('/api/todos', function (req, res) {allDoc(function(err,todos){res.end( JSON.stringify(todos));  })
    })
    app.post('/api/todo', function (req, res) {insertDoc(req.body.subject,function(err,_id){var obj ={id:_id,subject:req.body.subject}todos.push(obj)res.end(JSON.stringify(obj))rs()})
    })

    Mongodb快速参考

    本文会把一个对象todo对象(有属性{id,name})存储到Mongodb,做查询删除的测试(Create Remove Delete = CRD)。这个测试包括使用Mongodb Shell,使用CallBack古典风格的访问代码,以及使用Await/Async的现代风格的代码。完成这个这个验证后,就可以掌握最初步的Mongodb了。

    我使用的Nodejs是10.7 。操作系统环境为Mac OS X High Sierra。

    准备环境

    安装和运行Mongodb Daemon

    
    brew install mongodb
    mongodb

    访问验证

    首先执行Mongodb Shell:

    
    mongo

    输入命令,查询数据库清单:

    
    > show dbs
    local           0.000GB

    创建一个数据库

    
    use todos

    (若database不存在,则会创建一个,此时若不做任何操作直接退出,则MongoDB会删除该数据库)

    
    db.todos.insert({id:1,name:"reco"})
    db.todos.insert({id:2,name:"rita"})

    查询 :

    
    db.todos.find(){ "_id" : ObjectId("5b727c0846b6c71a98d3af52"), "id" : 1, "name" : "reco" }
    { "_id" : ObjectId("5b727c7046b6c71a98d3af53"), "id" : 2, "name" : "reta" }

    删除记录:

    
    db.todo.remove({id:1})

    删除数据库

    
    db.todo.drop()

    使用nodejs方式访问Mongodb

    使用nodejs执行类似Shell对对象的CRD,代码如下:

    
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/todos";
    MongoClient.connect(url, function(err, db) {if (err) throw err;console.log("Database created!");var dbo = db.db("todos");// var myobj = { id: 1, name: "reco" };// dbo.collection("todo").insertOne(myobj, function(err, res) {//   if (err) throw err;//   console.log("1 document inserted");//   db.close();// });var myobj = [{ id: 1, name: 'reco'},{ id: 2, name: 'rita'},];dbo.collection("todo").insertMany(myobj, function(err, res) {if (err) throw err;console.log("Number of documents inserted: " + res.insertedCount);dbo.collection("todo").find({}).toArray(function(err, result) {if (err) throw err;console.log(result);var myquery = { id: 1 };dbo.collection("todo").deleteMany(myquery, function(err, obj) {if (err) throw err;console.log("document deleted");db.close();});});    });
    })

    代码非常简单,无需更多解释。此代码使用了mongodb模块,需要首先安装:

    npm init -y
    npm i mongodb --save

    然后使用node index.js运行即可看到效果:

    
    Database created!
    Number of documents inserted: 2
    [ { _id: 5b72ab9e3245f169ef5f43d2, id: 1, name: 'reco' },{ _id: 5b72ab9e3245f169ef5f43d3, id: 2, name: 'rita' } ]
    document deleted

    利用高级异步特性

    使用Await/Async特性,可以有效的减少代码中的回调地狱现象。同样的功能,可以使用这样的代码:

    
    const MongoClient = require('mongodb').MongoClient;
    const connectionString = 'mongodb://localhost:27017';
    (async () => {const client = await MongoClient.connect(connectionString,{ useNewUrlParser: true });const dbo = client.db('todos');try {var res = await dbo.collection('todo').insertMany([{id:1,name:"reco"}, {id:2,name:"rita"}]);console.log("Number of documents inserted: " + res.insertedCount);var r = await dbo.collection("todo").find().toArray()console.log(r);var myquery = { id: 1 };var r = await dbo.collection("todo").deleteMany(myquery)console.log("document deleted");}finally {client.close();}
    })().catch(err => console.error(err));

    执行此代码,输出如下:

    
    Number of documents inserted: 2
    [ { _id: 5b72ae8a1c674a6ac1c5aa6e, id: 1, name: 'reco' },{ _id: 5b72ae8a1c674a6ac1c5aa6f, id: 2, name: 'rita' } ]
    document deleted

    Vuejs快速参考

    Vuejs本身要学的还真不少,这也是我会编写一本书来介绍它的原因。但是说到入门的话,我倒是写过一篇简单的介绍文章。不妨去阅读看看。

    上面的文章,也就对Vuejs了解个大概,提起一个兴趣。如果真的想要学习Vuejs的话,还是得看书的。这里也放一个我的书的广告,欢迎参阅。

    购买

    问题索引

    麻雀虽小五脏俱全,虽然是一个小小的示例的应用,但是每样技术也都需要用到,遇到的技术问题也是要一个个的解决的。这里列出我遇到的问题,作为索引,也算记录我在写作过程中解决的问题,也可以作为你学习完毕后的一个查漏补缺的索引,在这里重新看到问题,然后使用代码验证自己对问题的理解和学习。

    1. 使用Nodejs如何搭建一个RESTFUL的服务?
    • 如何把cli-service中来自客户端但是需要去应用服务器的URL访问转移到应用服务器?
    • 如何解析前端提交的Json?
    • 如何打包Json到响应内?
    • 如何创建一个唯一的ID?本来是用于创建一个唯一ID,这样就不必使用MongoDB生成的ObjectID了,因此插入效率会更高。但是,最后还是按惯例采用了Mongo的了。
    1. 如何加入新的单页组件?
    • 在哪里插入获取服务端数据的代码?
    1. 如何使用Buefy?
    • 在Vuejs应用中内使用Buefy?
    • 在Vuejs单页组件内使用Buefy?
    • 如何关闭input的自动完成特性?这个自动完成每次当你输入的时候,都会显示一个曾经的输入的列表,真的很烦。
    1. 如何在组件之间共享状态?
    • 为何需要共享前端状态?
    • 如何区别使用同步和异步状态操作?
    • 如何映射状态操作到组件内,以方便组件对方法的调用?
    1. 如何访问Mongo?
    • 如何安装Mongo,并快速验证Mongo?
    • 如何命令行插入、删除、列表一个Collection?
    • 有哪些访问Mongo的Nodejs库,差别在哪里?
    • 如何使用Await风格的代码做插入删除和列表?
    • 如何获取插入项目后的项目ID?
    • 如何使用ObjectId查询对应的项目?
    1. 如何访问网络,包括curl、axios、fetch等几种方法?
    • 如何提交Get请求?
    • 如何提交Put请求?
    • 如何在Body内提交json?
    • 如何指定请求头内容类型为json?
    • 如何获取响应中的Json数据?

    参考文章

    这个App虽然很小,但是并非一次写成的,我之前已经完成了若干个更加细小的、特定方面的文章,也写了一些代码。当然外部参考肯定也是不少,特别是Medium和Stack Overflow网站,对我支持很多。这里列出关键的一些参考文章。

    1. 这里会使用vuex管理状态,之前有写过文章,到底Vuex是什么,阅读量和评价还不少呢。当然,我举例的案例,有些勉强,为了用而用,实际案例并不需要Vuex,使用组件内状态即可。
    2. 使用Mongodb存储和提供后端CRD服务
    3. 使用Nodejs搭建{id,name}的对象的后端CRD服务。计划参考之前我自己的2篇文章和一个SO关于如何在AJAX内创建PUT请求的问答
    • 准备 JSON 服务器并访问它
    • vuejs api server开发小抄
    • Axios PUT request to serveraxios-put-request-to-server
    1. 使用Fecth|Axios访问后端CRD服务。此文章列举了几种访问网络库的方法,给了我一个全局的视野,因此我很受益于它。[Fetch vs. Axios.js for making http requests

    ](https://medium.com/@thejasonf...

    1. 使用buefy的美化组件的方法。这个很小众了,因此就只能看看官方文档了。

    来源:https://segmentfault.com/a/1190000016101940

    查看全文
    如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

    相关文章

    1. 分享一波关于Java学习视频教程资源干货~

      java全基础 Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的…...

      2024/4/24 13:28:13
    2. Node+H5实现大文件分片上传(有源码)

      话前 上传大文件上传的教程网上很多, 但是大部分没给出一个比较完整的出来, 这个博客给出的是前后端一套完整的解决方案, 其中前端没有使用第三方上传库, 希望能帮到有同样需求的朋友们. 大文件分片上传的好处在这里就不用多说了, 之前不管是上传单文件还是分片文件上传都是依靠…...

      2024/4/24 13:28:12
    3. 2019最新前端妙味课堂Vip教程(完整)

      课程目录:秒味课堂VIP全套视频 Angularjs秒味课堂VIP全套视频 git与github秒味课堂VIP全套视频 Node.js妙味课堂VIP全套视频 Bootstrap框架妙味课堂VIP全套视频 React框架妙味课堂VIP全套视频 前端初窥篇妙味课堂VIP全套视频 小试牛刀篇妙味课堂VIP全套视频 渐入佳境篇妙味课堂…...

      2024/4/24 13:28:11
    4. VS 2017的下载和安装

      继 VS2015 版本后,微软又推出了功能更加强大的VS 2017。 Visual Studio 2017 不仅支持 C#、C++、Python、Visual Basic、Node.js、HTML、JavaScript 等各大编程语言,还能开发 iOS、Android 的移动平台应用,VS 2017 甚至还自带了 iOS 模拟器(之前为 MAC 独享的开发环境)。 …...

      2024/4/24 0:47:32
    5. 最新前端妙味课堂Vip全套

      课程目录: 秒味课堂VIP全套视频 Angularjs 秒味课堂VIP全套视频 git与github 秒味课堂VIP全套视频 Node.js 妙味课堂VIP全套视频 Bootstrap框架 妙味课堂VIP全套视频 React框架 妙味课堂VIP全套视频 前端初窥篇 妙味课堂VIP全套视频 小试牛刀篇 妙味课堂VIP全套视频 渐入佳境篇…...

      2024/4/24 13:28:10
    6. 最新前端妙味课堂Vip实战项目教程

      课程目录:秒味课堂VIP全套视频 Angularjs秒味课堂VIP全套视频 git与github秒味课堂VIP全套视频 Node.js妙味课堂VIP全套视频 Bootstrap框架妙味课堂VIP全套视频 React框架妙味课堂VIP全套视频 前端初窥篇妙味课堂VIP全套视频 小试牛刀篇妙味课堂VIP全套视频 渐入佳境篇妙味课堂…...

      2024/5/1 2:51:53
    7. 最新北风网 web全栈视频教程

      1-2初级教程 入门必备 - PS技法与切片技术 1-3初级教程 入门必备 - JavaScript快速上手 2-1中级教程 无上心法-CSS高级及兼容Hack技术 2-2中级教程 前端利器 - 实战Jquery Ajax技术 2-3中级教程 进阶之篇 - JavaScriptJQuery系列全程应用 2-4中级教程 前端综合项目实战 3-1高级…...

      2024/4/24 13:28:07
    8. 前端妙味课堂Vip教程

      课程目录: 秒味课堂VIP全套视频 Angularjs 秒味课堂VIP全套视频 git与github 秒味课堂VIP全套视频 Node.js 妙味课堂VIP全套视频 Bootstrap框架 妙味课堂VIP全套视频 React框架 妙味课堂VIP全套视频 前端初窥篇 妙味课堂VIP全套视频 小试牛刀篇 妙味课堂VIP全套视频 渐入佳境篇…...

      2024/4/24 13:28:06
    9. 创建第一个React项目

      一.环境准备:1.下载安装VSCode,Node.js,Yarn网址如下:1.VSCode:https://code.visualstudio.com/2.Node.js:https://nodejs.org/en/3.yarn:https://yarnpkg.com/en/docs/install 2.将npm镜像改为淘宝cnpm:1.得到原本的镜像地址:npm get registry> https://registry.npmj…...

      2024/5/5 3:57:32
    10. 用 npm script 打造超溜的前端工作流

      互联网大潮和前端社区的蓬勃发展让现代前端项目的复杂性比 5 年前翻了好多倍,前端工作流中也出现了越来越多工程化的环节,比如代码风格检查、自动化测试、自动化构建、自动化部署、服务监控、依赖管理等。大多数前端工程师的工作流可能都离不开 gulp、grunt、webpack 这样的重…...

      2024/4/24 13:28:05
    11. 最新《北风网web全栈教程 前端开发全套教程》

      教程目录: 1-1初级教程 入门必备 - 新手学HTML+CSS 1-2初级教程 入门必备 - PS技法与切片技术 1.熟悉Photoshop基本知识 2.Photoshop工具的使用 3.Photoshop网页切片与形成 4.Photoshop切片合成网页 1-3初级教程 入门必备 - JAVAscript快速上手 1.Javascript基本语…...

      2024/4/15 3:57:09
    12. 100多种免费资源来学习全栈Web开发

      一年半以前,我涉足Web开发。 这是一个有趣但充满挑战的旅程。 随着我知识的不断增长,我意识到自己在此过程中已经保存了许多免费信息。 我花了一段时间,但我终于完成了所有排序。 我的链接集中在JavaScript,React和Node.js。 它由文章,教程,课程,讨论帖子和课程组成。 …...

      2024/4/19 16:14:54
    13. 用于 Unity 和虚幻引擎的 Asm.js 与 WebGL

      用于 Unity 和虚幻引擎的 Asm.js 与 WebGL摘要:本文来自微软,是一个 web 开发系列文章的一部分。感谢你对实现了 SitePoint 的成员的支持。 Unity 以及 Epic 的虚幻引擎,是频繁被游戏开发者使用的中间件工具,并不被限于去创建被编译成作为可执行文件运行的应用程序。Unity …...

      2024/4/15 3:57:07
    14. 2019最新Node+TS+Koa+Vue 商城全栈(前后端)开发视频教程

      课程目录 ├─01、Node、TS、Koa商城全栈开发远程课介绍视频.mp4 ├─02、- Symbol与作用域(1).mp4 ├─03、- 解构赋值与扩展运算符(1).mp4 ├─04、- 字符串、数字与对象扩展(1).mp4 ├─05、- 迭代(1).mp4 ├─06、- 函数扩展(1).mp4 ├─07、- 箭头函数(1).mp4 ├─08、- 集…...

      2024/4/15 3:57:06
    15. 《VueCli3.0全栈项目-资金管理系统带权限》(完整版)

      简介 : 通过本系列课程,可以快速的掌握全栈开发流程, 包括node.js的接口搭建, vue前端项目的构建, element-ui视图的构建. 一套应有尽有的课程! 目录: 1、Vue全栈-最终成果展示.mp4 2、Node接口搭建-express搭建服务器.mp4 3、Node接口搭建-连接MongoDB数据库.mp4 4、…...

      2024/4/29 22:44:43
    16. 手把手教React Native实战之环境搭建

      React Native 的宗旨是,学习一次,高效编写跨平台原生应用。在Windows下搭建React Native Android开发环境1.安装jdk2.安装sdk 在墙的环境下,为了速度我选择了使用http://androiddevtools.cn/3.安装C++环境择Windows SDK、cygwin或mingw等其他C++环境。编译node.js的C++模块…...

      2024/4/27 23:28:08
    17. 视频教程-2019全新vue2.5项目实战全家桶单页面仿京东电商实战前端js教程-Vue

      2019全新vue2.5项目实战全家桶单页面仿京东电商实战前端js教程7年的开发架构经验,曾就职于国内一线互联网公司,开发工程师,现在是某创业公司技术负责人, 擅长语言有node/java/python,专注于服务端研发,人工智能相关领域, 熟悉分布式高可用系统的架构,大数据处理,微信开…...

      2024/4/19 14:06:45
    18. 【转】Angular.js VS. Ember.js:谁将成为Web开发的新宠?

      本文源自于Quora网站的一个问题,作者称最近一直在为一个新的Rails项目寻找一个JavaScript框架,通过筛选,最终纠结于 Angular.js和 Ember.js。这个问题获得了大量的关注,并吸引到这两个框架的开发者参与回答。如果你也纠结JavaScript框架的选择,那么本文对你来说也是一个非…...

      2024/4/28 13:56:59
    19. Web开发Koa2 框架从零开始打造网站实战视频教程

      第1章 2018 年的编程姿势 第2章 必会 ES6-7 语法特性与规范 第3章 层层学习 Koa 框架的 第4章 Koa2 与 Koa1 、Express 框架对比 第5章 从 0 开发一个电影预告片网站 第6章 利用爬虫搞定网站基础数据 第7章 彩蛋篇 - [高难度拔高干货] 深度理解 Node.js 异步 IO 模型 第8章 实战…...

      2024/4/24 13:28:06
    20. JavaScript - React经典教程系列-李游Leo-专题视频课程

      JavaScript - React经典教程系列—137人已学习 课程介绍 React.JS 是目前火的前端框架之一,是一个相对于别的框架更专注于view层的前端框架。 由于 React的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可…...

      2024/4/24 13:28:05

    最新文章

    1. 用 hdparm 释放 Linux 的力量

      1. 引言:hdparm 及其在 Linux 中的重要性 在探索 Linux 的深层次能力时,我们不得不谈到 hdparm 这一工具的重要性。hdparm 是一个针对 Linux 系统的磁盘工具,主要用于设置和查看 SATA 或 IDE 接口磁盘的参数。对于追求高性能和细致优化的我们…...

      2024/5/5 20:13:31
    2. 梯度消失和梯度爆炸的一些处理方法

      在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

      2024/3/20 10:50:27
    3. PCF8591(ADDA转换芯片)

      工具 1.Proteus 8 仿真器 2.keil 5 编辑器 原理图 讲解 PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行IC总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接…...

      2024/5/5 1:29:42
    4. K8S容器空间不足问题分析和解决

      如上图,今天测试环境的K8S平台出现了一个问题,其中的一个容器报错:Free disk space below threshold. Available: 3223552 bytes (threshold: 10485760B),意思服务器硬盘空间不够了。这个问题怎么产生的,又怎么解决的呢…...

      2024/5/4 14:52:56
    5. 蓝桥杯加训

      1.两只塔姆沃斯牛&#xff08;模拟&#xff09; 思路&#xff1a;人和牛都记录三个数据&#xff0c;当前坐标和走的方向&#xff0c;如果人和牛的坐标和方向走重复了&#xff0c;那就说明一直在绕圈圈&#xff0c;无解 #include<iostream> using namespace std; const i…...

      2024/5/3 9:22:44
    6. 【外汇早评】美通胀数据走低,美元调整

      原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

      2024/5/4 23:54:56
    7. 【原油贵金属周评】原油多头拥挤,价格调整

      原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

      2024/5/4 23:54:56
    8. 【外汇周评】靓丽非农不及疲软通胀影响

      原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

      2024/5/4 23:54:56
    9. 【原油贵金属早评】库存继续增加,油价收跌

      原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

      2024/5/4 23:55:17
    10. 【外汇早评】日本央行会议纪要不改日元强势

      原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

      2024/5/4 23:54:56
    11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

      原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

      2024/5/4 23:55:05
    12. 【外汇早评】美欲与伊朗重谈协议

      原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

      2024/5/4 23:54:56
    13. 【原油贵金属早评】波动率飙升,市场情绪动荡

      原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

      2024/5/4 23:55:16
    14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

      原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

      2024/5/4 23:54:56
    15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

      原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

      2024/5/4 18:20:48
    16. 【外汇早评】美伊僵持,风险情绪继续升温

      原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

      2024/5/4 23:54:56
    17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

      原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

      2024/5/4 23:55:17
    18. 氧生福地 玩美北湖(上)——为时光守候两千年

      原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

      2024/5/4 23:55:06
    19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

      原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

      2024/5/4 23:54:56
    20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

      原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

      2024/5/4 23:55:06
    21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

      原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

      2024/5/5 8:13:33
    22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

      原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

      2024/5/4 23:55:16
    23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

      原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

      2024/5/4 23:54:58
    24. 广州械字号面膜生产厂家OEM/ODM4项须知!

      原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

      2024/5/4 23:55:01
    25. 械字号医用眼膜缓解用眼过度到底有无作用?

      原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

      2024/5/4 23:54:56
    26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

      解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

      2022/11/19 21:17:18
    27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

      %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

      2022/11/19 21:17:16
    28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

      win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

      2022/11/19 21:17:15
    29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

      有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

      2022/11/19 21:17:14
    30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

      置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

      2022/11/19 21:17:13
    31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

      Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

      2022/11/19 21:17:12
    32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

      有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

      2022/11/19 21:17:11
    33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

      今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

      2022/11/19 21:17:10
    34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

      只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

      2022/11/19 21:17:09
    35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

      原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

      2022/11/19 21:17:08
    36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

      关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

      2022/11/19 21:17:05
    37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

      钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

      2022/11/19 21:17:05
    38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

      前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

      2022/11/19 21:17:04
    39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

      本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

      2022/11/19 21:17:03
    40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

      许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

      2022/11/19 21:17:02
    41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

      配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

      2022/11/19 21:17:01
    42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

      不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

      2022/11/19 21:17:00
    43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

      当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

      2022/11/19 21:16:59
    44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

      我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

      2022/11/19 21:16:58
    45. 如何在iPhone上关闭“请勿打扰”

      Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

      2022/11/19 21:16:57