如何在 web 應用中使用資料庫 隨著雲時代的到來,雲開發有著獨特的優勢相對於傳統開發,從資料庫而言,cloudbase 提供的雲資料庫真的很方便,本文就以一個簡單的 todolist 小例子來講解一下如何在 web 應用中使用雲開發資料庫 構建簡單的界面 下麵的這個 todolist 只要包括的功 ...
如何在 web 應用中使用資料庫
隨著雲時代的到來,雲開發有著獨特的優勢相對於傳統開發,從資料庫而言,cloudbase 提供的雲資料庫真的很方便,本文就以一個簡單的 todolist 小例子來講解一下如何在 web 應用中使用雲開發資料庫
構建簡單的界面
下麵的這個 todolist 只要包括的功能有:增加事情,刪除事情,修改事情的完成狀態,以及查詢事情,所有的操作都是基於雲資料庫的
該界面的構建主要用到了 Vue 和 bootstrap。使用 Vue 雙向數據綁定可以更方便的操作數據,使用 bootstrap 來構建好看的界面
界面構建代碼如下:
<div id="app">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">web應用中使用資料庫</h3>
</div>
<div class="panel-body form-inline">
<label>
Name:
<input type="text" class="form-control" v-model="name" />
</label>
<input
type="button"
value="添加"
class="btn btn-primary"
@click="add()"
/>
<label>
搜索名稱關鍵字:
<input type="text" class="form-control" v-model="keywords" />
</label>
<input
type="button"
value="查找"
class="btn btn-primary"
@click="search(keywords)"
/>
</div>
</div>
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>things</th>
<th>delete</th>
<th>finsih</th>
</tr>
</thead>
<tbody>
<tr v-for="item in list" :key="item._id">
<td :class="[item.complete?'active':'']" v-text="item.name"></td>
<td>
<a href="" @click.prevent="del(item._id)">刪除</a>
</td>
<td>
<a href="" @click.prevent="complete(item._id,item.complete)"
>{{item.complete?'取消完成':'已完成'}}</a
>
</td>
</tr>
</tbody>
</table>
</div>
記得引入第三方文件
<script src="./lib/vue-2.4.0.js"></script>
<script src="https://imgcache.qq.com/qcloud/tcbjs/1.3.5/tcb.js"></script>
<link rel="stylesheet" href="./lib/bootstrap-3.3.7.css" />
其中第二個就是與雲開發相關的第三方文件了
說明:這裡的 vue 和 bootstrap 文件可以通過 npm 自行下載
開通雲開發環境
進入控制台在雲產品一欄中找到:雲開發->雲開發cloudbase,然後點擊新建環境,填寫基本信息向下麵這樣,然後點擊立即開通
環境初始化需要一段時間,初始化完成後就可以點擊進入,會看到如下界面
我們要用的就是左側的資料庫功能,點擊資料庫並創建所要使用的todo集合
至此,環境開通完成,下麵開始寫代碼
配置 web 應用
要想在 web 應用中使用雲資料庫,首先應該進行一些基本的配置,代碼如下
const app = tcb.init({
env: "你的環境id",
});
app
.auth()
.signInAnonymously()
.then(() => {
// alert("登錄雲開發成功!");
});
const db = app.database();
const collection = db.collection("todo");
上面操作實現了將你的 web 應用與你的雲開發環境關聯,並確定要連接的資料庫集合,也就是上面所創建的 todo集合
從資料庫中獲取數據
mounted() {
console.log("mounted");
collection.get().then((res) => {
// console.log(res)
this.list = res.data;
});
},
在頁面載入完成時獲取資料庫中所有數據,然後用 vue 的數據綁定渲染到頁面上
在資料庫中進行查詢
search(keywords) {
console.log(keywords);
collection
.where({
name: {
$regex: keywords + ".*",
},
})
.get()
.then((res) => {
console.log(res);
this.list = res.data;
});
},
上面的代碼實現了從資料庫中通過關鍵字查詢 name 這個屬性的值,來改變要渲染的數據,這裡用到了正則匹配來進行模糊查詢
向資料庫中增加數據
add() {
collection
.add({
name: this.name,
complete: false,
})
.then((res) => {
this.name = "";
});
collection.get().then((res) => {
this.list = res.data;
this.search("")
});
},
這段代碼實現了向資料庫中添加一條數據,添加的欄位中,名字從用戶輸入中獲取,完成情況預設為未完成,並且在添加完成後重新獲取所數據,並調用 search 方法來讓頁面的數據實時的變化,進行添加操作雲資料庫還會預設添加_id 和_openid 屬性
實現刪除數據
del(id) {
console.log(id);
collection
.doc(id)
.remove()
.then((res) => {
console.log(res);
});
collection.get().then((res) => {
this.list = res.data;
this.search("")
});
},
上面的代碼是實現了根據數據的_id 通過傳參的方式從資料庫中刪除一條數據,並即時的展現在頁面上
改變完成狀態
complete(id,complete){
console.log(id)
comolete = !complete
collection
.doc(id)
.update({
complete:comolete
})
collection.get().then((res) => {
// console.log(res)
this.list = res.data;
this.search("")
});
}
最後一個功能,通過點擊來改變單條數據的 complete 屬性值來改變完成狀態,並讓 thing 對應不同的樣式
部署該應用
既然這樣一個應用寫好了,那我們能不能利用雲開發cloudbase的靜態網網站托管功能來部署我們應用呢?答案是可以的,點擊左側的靜態網站托管,並點擊開始使用,然後等待期初始化完成
初始化完成後,我們將剛剛所寫的代碼和所需要的依賴文件上傳到靜態網站托管,向下麵這樣
然後點擊上面的基礎配置就可以看見功能變數名稱信息處有一個預設功能變數名稱,點擊該預設功能變數名稱,就可以訪問到剛剛所寫的應用了
完整代碼
最後附上完整的代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<script src="./lib/vue-2.4.0.js"></script>
<script src="https://imgcache.qq.com/qcloud/tcbjs/1.3.5/tcb.js"></script>
<link rel="stylesheet" href="./lib/bootstrap-3.3.7.css" />
<style>
.active {
text-decoration: line-through;
color: blueviolet;
}
</style>
</head>
<body>
<div id="app">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">web應用中使用資料庫</h3>
</div>
<div class="panel-body form-inline">
<label>
Thing:
<input type="text" class="form-control" v-model="name" />
</label>
<input
type="button"
value="添加"
class="btn btn-primary"
@click="add()"
/>
<label>
搜索名稱關鍵字:
<input type="text" class="form-control" v-model="keywords" />
</label>
<input
type="button"
value="查找"
class="btn btn-primary"
@click="search(keywords)"
/>
</div>
</div>
<table class="table table-bordered table-hover table-striped">
<thead>
<tr>
<th>things</th>
<th>delete</th>
<th>finsih</th>
</tr>
</thead>
<tbody>
<tr v-for="item in list" :key="item._id">
<td :class="[item.complete?'active':'']" v-text="item.name"></td>
<td>
<a href="" @click.prevent="del(item._id)">刪除</a>
</td>
<td>
<a href="" @click.prevent="complete(item._id,item.complete)"
>{{item.complete?'取消完成':'已完成'}}</a
>
</td>
</tr>
</tbody>
</table>
</div>
<script>
const app = tcb.init({
env: "xxx",
});
app
.auth()
.signInAnonymously()
.then(() => {
// alert("登錄雲開發成功!");
});
const db = app.database();
const collection = db.collection("todo");
var vm = new Vue({
el: "#app",
data: {
name: "",
keywords: "",
list: [],
},
update() {
this.search("");
},
mounted() {
console.log("mounted");
collection.get().then((res) => {
// console.log(res)
this.list = res.data;
});
},
methods: {
add() {
collection
.add({
name: this.name,
complete: false,
})
.then((res) => {
this.name = "";
});
collection.get().then((res) => {
this.list = res.data;
this.search("");
});
},
del(id) {
console.log(id);
collection
.doc(id)
.remove()
.then((res) => {
console.log(res);
});
collection.get().then((res) => {
this.list = res.data;
this.search("");
});
},
search(keywords) {
console.log(keywords);
collection
.where({
name: {
$regex: keywords + ".*",
},
})
.get()
.then((res) => {
console.log(res);
this.list = res.data;
});
},
complete(id, complete) {
console.log(id);
comolete = !complete;
collection.doc(id).update({
complete: comolete,
});
collection.get().then((res) => {
// console.log(res)
this.list = res.data;
this.search("");
});
},
},
});
</script>
</body>
</html>