实战丨快速搭建实时 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文件 因为我们要做微服务,那么就一定有 ...
随机推荐
- Python Ethical Hacking - Persistence(2)
Polish the Python code by adding the become_persistent function. #!/usr/bin/env python import json i ...
- P1092 虫食算(洛谷)
今天做了一道题,我之前吹牛的时候曾经说:“这个题我觉得深搜剪枝一下就可以了.”. 我觉得我之前说的没错“这个题深搜剪枝亿下,再加点玄学就可以了!” 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子 ...
- Guava集合--新集合类型
Guava引入了很多JDK没有的.但我们发现明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契约 ...
- NVIDIA GPU Pascal架构简述
NVIDIA GPU Pascal架构简述 本文摘抄自英伟达Pascal架构官方白皮书:https://www.nvidia.com/en-us/data-center/resources/pasca ...
- 我和ABP vNext 的故事
Abp VNext是Abp的.NET Core 版本,但它不仅仅只是代码重写了.Abp团队在过去多年社区和商业版本的反馈上做了很多的改进.包括性能.底层的框架设计,它融合了更多优雅的设计实践.不管你是 ...
- 3.新手建站教程系列之认识WordPress和第一篇文章
上一期咱已经把本地环境和wp网站给搭建出来了,接下来就是来认识这个程序了.进入网站后台,地址为你的网址/wp-admin 后台名字叫做仪表盘,首页是一个信息合集区域,上面会显示有多少文章,多少页面以及 ...
- nginx 日志功能详解
nginx 日志功能 在 nginx 中有两种日志: access_log:访问日志,通过访问日志可以获取用户的IP.请求处理的时间.浏览器信息等 error_log:错误日志,记录了访问出错的信息, ...
- menu目录下的navigation.xml
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http:// ...
- Btree索引和Hash索引
B-Tree 索引 BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符, ...
- this指向面试题两则
面试题1 let len = 10; function fn() { console.info(this.len) } fn(); // A let Person = { len: 5, say: f ...