实战丨快速搭建实时 Todo List 应用
技术背景
借助云开发数据库的实时推送能力和云开发官方出品的前后端一体化部署工具CloudBase Framework,可以轻松搭建一个完整应用。
效果展示

示例地址:http://cloud.qinmudi.cn/watch-todolist
项目开发
1.开发前准备
1.1 腾讯云 CloudBase 的按量计费环境
我们要部署静态网站,因此,需要提前准备按量计费环境。
1.2 项目创建
使用 CloudBase Framework 创建一个 vue 应用。
具体操作,参见:如何用 Cloudbase Framework 部署一个 Vue 项目?
2.项目开发
2.1 创建数据库集合
两种创建方式,任选。
2.1.1 手动创建
打开云开发控制台,手动创建 watch-todos 集合

2.1.2 插件方式创建
配置 cloudbaserc.json
{
"envId": "your envId",
"framework": {
"plugins": {
"client": {
"use": "@cloudbase/framework-plugin-website",
"inputs": {
"buildCommand": "npm run build",
"outputPath": "dist",
"cloudPath": "/watch-todolist"
}
},
"database": {
"use": "@cloudbase/framework-plugin-database",
"inputs": {
"collections": [
{
"collectionName": "watch-todos"
}
]
}
}
}
}
}
请注意 database 部分的配置。
这里,"database"是自定义的名称,你可以配置成任何你喜欢的名字~
之后,在 package.json 中,相应配置部署的 script 脚本即可。
比如,我们这里配置了:
{
"scripts": {
"deploy:database": "cloudbase framework:deploy database"
}
}
配置完成后,执行:
yarn deploy:database
or
npm run deploy:database
进行部署,云数据库中,就会自动生成 watch-todos 集合。
2.2 tcb-js-sdk 引入
yarn add tcb-js-sdk
or
npm install tcb-js-sdk
2.3 创建 tcb 接入层
2.3.1 用户登录与数据库实例获取
【注】
获取数据库实例,必须先进行登录授权,否则无法获取。
为了便于演示,这里采用匿名登录方式。
具体实现如下:
【step1】云开发控制台开启匿名登录:

【step2】tcb/index.js
import tcb from 'tcb-js-sdk';
import $config from '../../cloudbaserc';
// 初始化
const app = tcb.init({
env: $config.envId,
});
const auth = app.auth();
let db = null;
async function login() {
await auth.signInAnonymously();
// 匿名登录成功检测登录状态isAnonymous字段为true
const loginState = await auth.getLoginState();
console.log(loginState.isAnonymousAuth); // true
return app.database();
}
function getDB() {
if (!db) {
db = login();
}
return db;
}
export default getDB;
2.3.2 增删改查逻辑开发
tcb/service.js
import $getDB from './index';
// 正确数据
const data = {
code: 0,
data: null,
msg: 'success',
};
// 操作失败数据
function getFailData(msg) {
return {
code: -1000,
data: null,
msg,
};
}
// 发生错误数据
function getErrorData(err) {
return {
code: -4000,
data: null,
msg: err.message,
};
}
// 数据库集合获取
async function getCollection() {
const db = await $getDB();
return db.collection('watch-todos');
}
// 增加
async function addItem(params) {
const addRes = Object.assign({}, data);
try {
const myCollection = await getCollection();
const res = await myCollection.add(params);
// 如果插入出错
if (!res.id) {
return getFailData('add fail');
}
} catch (e) {
return getErrorData(e);
}
return addRes;
}
// 删除
async function deleteItem({ _id }) {
const deleteRes = Object.assign({}, data);
try {
const myCollection = await getCollection();
const res = await myCollection.doc(_id).remove();
// 如果没有成功删除
if (res.deleted === 0) {
return getFailData('delete fail');
}
} catch (e) {
return getErrorData(e);
}
return deleteRes;
}
// 修改
async function updateItem(params) {
const updateRes = Object.assign({}, data);
const { _id, checked, color, starred, text } = params;
try {
const myCollection = await getCollection();
const res = await myCollection.doc(_id).update({
checked,
color,
starred,
text,
});
// 如果没有成功更新
if (res.updated === 0) {
return getFailData('update fail');
}
} catch (e) {
return getErrorData(e);
}
return updateRes;
}
// 查询
async function getList() {
const listRes = Object.assign({}, data);
try {
const myCollection = await getCollection();
const dbData = await myCollection.get();
listRes.data = {
page: 1,
limit: 10,
total: 100,
list: dbData.data,
};
} catch (e) {
return getErrorData(e);
}
return listRes;
}
export default {
addItem,
deleteItem,
updateItem,
getList,
};
2.4 页面注册 watcher 实时监听
这是 demo 中的 App.vue
import $getDB from './tcb';
import $service from './tcb/service';
methods: {
// 拉取数据列表
async getList() {
const res = await $service.getList();
if (res && res.code === 0) {
this.todoList = [...res.data.list];
}
},
// 注册数据库变动的实时监听
async registerTcbWatcher() {
const getList = this.getList;
const db = await $getDB();
this.watcher = db
.collection('watch-todos')
.where({
// query...
})
.watch({
onChange(snapshot) {
console.log('snapshot', snapshot);
getList();
},
onError(err) {
console.error('the watch closed because of error', err);
},
});
},
},
created() {
this.registerTcbWatcher();
},
destroyed() {
// 关闭数据库变动的实时监听
this.watcher.close();
},
2.5 页面样式美化 + cloudfunctions 文件夹删除(我们没有使用到云函数)
2.6 本地预览
yarn dev
or
npm run dev
访问 http://localhost:8080/watch-todolist
项目部署与访问
3.项目部署
3.1 配置 cloudbaserc.json
1)配置 envId(要使用按量计费环境,因为我们要部署的是一个静态网站)
2)删除 server 相关配置(删不删都行,删掉减少冗余)
3)配置你自己的 cloudPath(这里以 /watch-todolist 为例)
{
"envId": "your envId",
"framework": {
"name": "vue",
"plugins": {
"client": {
"use": "@cloudbase/framework-plugin-website",
"inputs": {
"buildCommand": "npm run build",
"outputPath": "dist",
"cloudPath": "/watch-todolist"
}
}
}
}
}
3.2 执行部署
yarn deploy
4.项目访问
根据你的配置,访问:
http://your_domain/your_path
查看我们的示例,访问:
http://cloud.qinmudi.cn/watch-todolist
打开两个窗口,同时访问。
一个窗口进行增删改操作,另一窗口观察效果~
附:示例代码的本地运行与上线部署
1.示例源码地址
https://github.com/oteam-sources/watch-todolist.git
2.本地预览
2.1 git clone
git clone https://github.com/oteam-sources/watch-todolist.git
2.2 配置 cloudbaserc.json
配置自己的 envId。
2.3 部署 database
yarn deploy:database
2.4 本地启动
yarn dev
or
npm run dev
2.5 本地预览
浏览器访问:http://localhost:8080/watch-todolist/
3.一键部署我们的示例:
3.1 执行部署
yarn deploy
or
npm run deploy
3.2 线上预览
浏览器访问

预览部署后的示例
以上,来自 CloudBase Framework Oteam 团队。
欢迎更多的小伙伴加入,共建社区生态~
Github 开源地址
https://github.com/TencentCloudBase/cloudbase-framework
实战丨快速搭建实时 Todo List 应用的更多相关文章
- Telegraf+InfluxDB+Grafana快速搭建实时监控系统 监控postgresql
Telegraf+InfluxDB+Grafana快速搭建实时监控系统 监控postgresql
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-2.快速搭建SpringBoot项目,采用IDEA
笔记 2.快速搭建SpringBoot项目,采用IDEA 简介:使用SpringBoot start在线生成项目基本框架并导入到IDEA中 参考资料: IDEA使用文档 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-1.快速搭建SpringBoot项目,采用Eclipse
笔记 1.快速搭建SpringBoot项目,采用Eclipse 简介:使用SpringBoot start在线生成项目基本框架并导入到eclipse中 1.站点地址:http://start. ...
- 用Kibana和logstash快速搭建实时日志查询、收集与分析系统
Logstash是一个完全开源的工具,他可以对你的日志进行收集.分析,并将其存储供以后使用(如,搜索),您可以使用它.说到搜索,logstash带有一个web界面,搜索和展示所有日志. kibana ...
- Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建
前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战.写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有 ...
- Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(三)--前后端环境配置
前言 之前都是介绍一些基础知识,在这一节,我们就要开始实战coding了.正所谓磨刀不误砍柴工,准备工作显得尤为重要.很多demo只是追求效果的实现,并不注重整个demo的架构性.从我个人的角度看来, ...
- Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)--MongoDB入门
前言 本文并不是网上流传的多少天学会MongoDB那种全面的教程,而意在总结这几天使用MongoDB的心得,给出一个完整的Node+Express+MongoDB+Socket.io搭建实时聊天应用实 ...
- Gerrit代码审计系统实战-Gerrit 2.15.14版本快速搭建
Gerrit代码审计系统实战-Gerrit 2.15.14版本快速搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Gerrit版本选择 1>.查看Gerrit官网 ...
- go micro实战01:快速搭建服务
背景 go-micro给我们提供了一个非常便捷的方式来快速搭建微服务,而且并不需要提前系统了解micro,下面用一个简单的示例来快速实现一个服务. 创建Proto文件 因为我们要做微服务,那么就一定有 ...
随机推荐
- 关于Object.defineProperty
讲解大致会根据下图展开 本文部分参考了书籍<你不知道的javascript>上卷 对象的定义与赋值 经常使用的定义与赋值方法obj.prop =value或者obj['prop'] ...
- solr8.4.1开发测试环境的简单应用
服务器部署 官网地址 https://lucene.apache.org/solr/ 从官网下载http:/ /mirror.bit.edu.cn/apache/lucene/solr/8.4. ...
- STL源码剖析:迭代器
准备知识 什么是迭代器? 迭代器是链接容器和算法的桥梁,所有的算法都通过迭代器操作容器中的数据 迭代器是一种智能指针,最重要的操作符重载就是operator*,operator-> 迭代器的实现 ...
- CODING DevOps + Nginx-ingress 实现自动化灰度发布
作者:王炜,CODING DevOps 后端开发工程师,拥有多年研发经验,云原生.DevOps.Kubernetes 资深爱好者,Servicemesher 服务网格中文社区成员.获得 Kuberne ...
- 何时/如何使用 Vue3 render 函数
什么是 DOM? 如果我们把这个 HTML 加载到浏览器中,浏览器创建这些节点,用来显示网页.所以这个HTML映射到一系列DOM节点,然后我们可以使用JavaScript进行操作.例如: let it ...
- Repeating Decimals UVA - 202---求循环部分
原题链接:https://vjudge.net/problem/UVA-202 题意:求一个数除以一个数商,如果有重复的数字(循环小数),输出,如果没有,输出前50位. 题解:这个题一开始考虑的是一个 ...
- xctf-pwn pwn200
刚看完题目觉得和前面的level3差不多,只是没有给libc而已... 看完大佬的exp之后整个人都不好了.....果然我还是太菜了 32位开了NX sub_8048484,read函数,明显的栈溢出 ...
- 一个使用android相机的例子,二维码必须用相机
https://blog.csdn.net/feiduclear_up/article/details/51968975
- python(xlsxwriter模块使用)
XlsxWriter简介XlsxWriter是一个Python模块,可用于在Excel 2007+ XLSX文件中写入多个工作表的文本,数字,公式和超链接.它支持格式化等功能.可到官网了解更多详情,官 ...
- CentOS6.5安装Oracle11g
安装前必读: 1. 安装Oracle的虚拟机需要固定IP. 2. 注意安装过程中root用户与oracle用户的切换(su root/su oracle) 3. 环境变量 ...