实战丨快速搭建实时 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文件 因为我们要做微服务,那么就一定有 ...
随机推荐
- SQL语句中带有EXISTS谓词的子查询的理解与使用
EXISTS:代表存在量词. 在SQL中,把具有全称量词的谓词查询问题转换成等价的存在量词的谓词查询予以实现. 如有三个表,Student(Sno,Sname),Course(Cno,Cname),S ...
- 中科大数分教材:用阶乘倒数和计算e值的误差和e是无理数的证明,用到误差计算
\(e=lim_{n \to \infty}e_{n}(1+\frac{1}{n})^n\\\) \(=\lim_{n \to \infty}(\frac{1}{0!}+\frac{1}{1!}+\f ...
- raw目录的位置是D:\android_projects\qrscan\app\src\main\res\raw
D:\android_projects\qrscan\app\src\main\res\raw 这里可以放数据库文件和音频文件 文件名为sp.mp3 引用方法: MediaPlayer mp = Me ...
- lua中单引号和双引号和/的输出的问题
lua单引号和双引号的问题 lua 中的 单引号 与 双引号 (" " 与 '') Lua除支持双引号("")表示字符串外, 也支持用单引号('') 注意: 如 ...
- Lua学习入门(基本数据类型)
数据类型 Lua 中有 8 个基本类型分别为:nil.boolean.number.string.userdata.function.thread 和 table. 数据类型 描述 nil 这个最简单 ...
- vue“欺骗”ueditor,实现图片上传
一.环境介绍 @vue/cli 4.3.1 webpack 4.43.0 ueditor1.4.3.3 jsp版 二.springboot集成ueditor,实现分布式图片上传 参考我的另一篇博客,& ...
- PHP mysqli_refresh() 函数
定义和用法 mysqli_refresh() 函数刷新表或缓存,或者重置复制服务器信息.高佣联盟 www.cgewang.com 语法 mysqli_refresh(connection,option ...
- PDOStatement::bindValue
PDOStatement::bindValue — 把一个值绑定到一个参数(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 bool PDOStateme ...
- luogu P2304 [NOI2015]小园丁与老司机 dp 上下界网络流
LINK:小园丁与老司机 苦心人 天不负 卧薪尝胆 三千越甲可吞吴 AC的刹那 真的是泪目啊 很久以前就写了 当时记得特别清楚 写到肚子疼.. 调到胳膊疼.. ex到根不不想看的程度. 当时wa了 一 ...
- SET DYNAMICS 365 COLORS AND LOGO USING THEMES
https://carldesouza.com/dynamics-365-colors-logo-themes/ BEFORE WE START, I NEED YOUR HELP. I AM SPE ...