基于MemFire Cloud创建Posts社交网络论坛应用实战

MemFireDB,带你体验不一样的云端飞翔。

MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专注于编写前端应用程序代码,加速WEB或APP应用开发。

本篇文章将会教大家手把手使用MemFire Cloud做一个Posts社交网络论坛应用。我们基于Posts社交网络论坛应用做了一个详细的教程,来讲一讲在通过MemFire Cloud开发Posts社交网络论坛应用的开发步骤及注意事项,希望能真正解决用户使用MemFire Cloud过程中遇到的问题和提供一些应用实现的小技巧。

开发前需要知道的一些事

应用介绍

一个开放的社交网络论坛,任何人都可以在这里分享他们的想法和意见。

应用基础

Posts社交网络论坛是基于supabase官网的一个todo-list应用示例为基础,在这个基础上进行修改,删除,增加一些代码逻辑及功能的应用。

开发条件

您需要对vue3及ts有一定的了解;

您需要对sql语法有一定的了解;

开发依赖

“@supabase/supabase-js”: “^1.1.2”

“vue”: “^3.0.0”

“node.js”:“14.19.0”

“npm”:“6.14.16”

1.准备工作

创建应用

登录https://cloud.memfiredb.com创建应用,打开应用后,查看并获取服务地址以及token信息

创建应用的一步很关键,我们的posts应用就是通过在这里创建的应用来获得数据库、云存储等一系列资源,并将获得该应用专属的API访问链接和访问密钥,用户可以轻松的与以上资源进行交互。想知道关于应用更详细的内容请查看文档

进入应用,我们在这里可以看到,Anon public是客户端API密钥。它允许“匿名访问”您的数据库,直到用户登录。登录后,密钥将切换到用户自己的登录令牌。这将为数据启用行级安全性。

注意:service_role secret可以绕过任何安全策略完全访问您的数据。这些密钥必须保密,并且要在服务器环境中使用,绝不能在客户端或浏览器上使用。

在后续示例代码中,需要提供supabaseUrl和supabaseKey。

supabaseUrl就是上图的网址链接,supabaseKey就是Anon API秘钥
想知道关于应用的连接更详细的内容请查看文档

下载代码

todo-list模板代码(需要下载,选择项目为supabase /examples/vue3-ts-todo-list):

git clone https://gitee.com/memfiredb/supabase

Posts最终代码

git clone https://github.com/LucaRao/memfire-post.git

2.修改项目名称

将项目名vue3-ts-todo-list改为Posts

3.配置访问密钥

每个Supabase项目都有一个独特的API URL。您的 API 在一个 API 网关的保护下,每次请求都需要一个 API 密钥。

将上一步中获取的anon public和网址分别设置到supabaseUrl和supabaseKey中

(1)将根目录下的.env.local.example改为.env.local

(2)supabaseUrl和supabaseKey分别赋值给VUE_APP_SUPABASE_URL和VUE_APP_SUPABASE_KEY

4.表结构初始化

接下来我们需要创建数据表,posts表是用来存储用户论坛评论的数据,likes表用来存储用户点赞的某条评论的数据。

数据表结构

posts(论坛评论列表)

名称类型描述
idin8主键,自增,每条评论的唯一标识ID
tasktext评论
emailtext用户名
created_attimestamptz日期,可为空

likes(点赞表)

名称类型描述
idint8主键,自增,每条评论的唯一标识ID
email_nametext用户名
post_idint8每条评论的唯一id
created_attimestamptz日期,可为空

sql初始化语句

drop table if EXISTS public.posts;
drop table if EXISTS public.likes;create table public.posts (id bigint generated by default as identity primary key,email varchar(255),task text check (char_length(task) > 3),created_at timestamp with time zone default timezone('utc'::text, now()) not null
);create table public.likes (id bigint generated by default as identity primary key,email varchar(255),post_id int not null ,created_at timestamp with time zone default timezone('utc'::text, now()) not null
);

5.注册登录功能

运行项目

npm install

npm run serve

注册、登录、退出登录等功能在vue3-todo-list里已经实现,我们不必再次写一遍,也不需要修改文件里面的代码。

原理

打开Posts/src/compinents/Auth.vue

应用的登录、注册、退出登录的逻辑和页面在这里。登录、注册、退出登录都是通过引入的Posts/src/vuetils/useAuth.ts文件里面的相应功能的api来进行交互的,supabase官网提供的todo-list应用的demo已经在useAuth.ts文件里给我们写好了这些功能的接口。

在Posts/src/vuetils/useAuth.ts文件中看到,在引入supabase依赖之后,我们的登录、注册等功能的api都是由supabase规定的api名称,比如登录叫supabase.auth.signIn,注册叫supabase.auth.signUp。具体查看文档

我们来创建一个用户并且尝试登录

控制台显示注册并登录成功,并且已经将我们的用户信息存入了userSession中

6.实现发布评论功能

(1)修改数据类型(ts语法用到数据类型校验)

打开Posts/src/types/global.ts修改为

declare interface Credentials {email?: string | undefinedpassword?: string | undefinedprovider?: 'bitbucket' | 'github' | 'gitlab' | 'google' | undefined
}declare interface Todo {id?: numberemail?: stringtask: stringinserted_at?: string
}

(2)编写页面逻辑

  1. 打开Posts/src/compinents/TodoList.vue

2.修改页面样式,用户名这里我们使用邮箱“@”符号之前的字符串。

修改template页面为

<template><div class="w-full"><h2 class="mb-12 font-bold text-3xl">Write a new post</h2><h2 class="mb-12 font-bold text-2xl">welcome {{userSession.user.email.substring(0,userSession.user.email.indexOf('@'))}}!</h2><div class="flex gap-2 my-2"><inputv-model="task"class="rounded w-full p-2"type="text"placeholder="What do you need to?"/><button @click="insertTask" class="btn-black">Publish</button></div><div class="bg-white shadow overflow-hidden rounded-md" style="height: 300px;overflow-y: scroll;"><ul v-for="(todo, index) in allTodos" :key="index"><suspense><Todo :todo="todo" /></suspense></ul></div></div>
</template>

3.在该页面搜索insertTask方法,这是发布的按钮,将发布论坛评论方法的参数改为email和task

const todo = await addTodo({ email: userSession.value.user.email, task: task.value, })

下图就是登录后修改的posts首页

页面引入的Posts/src/vuetils/useTodo.ts文件是用来请求posts列表数据和新增一条post相应功能交互的api的方法

打开Posts/src/vuetils/useTodo.ts文件

由于我们修改了表名称,但是逻辑并没有修改,只需要替换查询表名,所以我们将fetchTodos方法里面的查询posts列表语法修改为

const { data: todos, error } = await supabase.from('posts').select('*').order('id')

同上,我们将addTodo里面的新增post语法改为

const { data, error } = await supabase.from('posts').insert(todo).single()

现在我们在页面插入一条数据,观察控制台的network的接口请求情况,显示插入成功

7.渲染评论列表和点赞功能

打开Posts/src/components/Todo.vue页面,我们要先把页面样式做以下修改

Template

<template><liclass="blockcursor-pointerhover:bg-gray-200focus:outline-none focus:bg-gray-200transitionduration-150ease-in-outborder-style1"><div class="flex items-center px-4 py-4 sm:px-6"><div class="min-w-0 flex-1 flex items-center"><div class="text-sm leading-5 font-medium truncate t-s">{{ todo.task }}</div></div><button @click="toggleLike" class="w-4 h-4 ml-2  hover:border-black rounded"><svgv-if="like"xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="24px"height="24px"preserveAspectRatio="xMidYMid meet"viewBox="0 0 256 256"><pathd="M236.023 92c0 30.565-17.713 62.005-52.648 93.446a317.34 317.34 0 0 1-51.442 37.534a8 8 0 0 1-7.819 0c-4.25-2.38-104.09-59.117-104.09-130.98a60.02 60.02 0 0 1 108-36.04a60.02 60.02 0 0 1 108 36.04z"fill="currentColor"></path></svg><svgv-elsexmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="24px"height="24px"preserveAspectRatio="xMidYMid meet"viewBox="0 0 256 256"><pathd="M128.018 228a11.995 11.995 0 0 1-5.864-1.53C117.82 224.043 16.018 166.18 16.018 92a64.028 64.028 0 0 1 112-42.378a64.028 64.028 0 0 1 112 42.378c0 74.18-101.803 132.043-106.137 134.47a11.995 11.995 0 0 1-5.863 1.53zm-48-176a40.046 40.046 0 0 0-40 40c0 51.222 67.445 97.186 88 110c20.554-12.814 88-58.778 88-110a40.009 40.009 0 0 0-76.928-15.408a12 12 0 0 1-22.145 0A39.923 39.923 0 0 0 80.018 52z"fill="currentColor"></path></svg></button></div><div class="flex items-center px-4 py-4 sm:px-6 t-m">{{todo.email.substring(0, todo.email.indexOf('@'))}}</div></li>
</template>

Css

<style lang="css" scoped>
.border-style1 {border: 1px solid #d5d0d0;margin: 20px 15px;border-radius: 10px;
}
.t-s {font-size: 14px;font-weight: bold;
}
.t-m {font-size: 13px;font-weight: normal;margin-top: -20px;
}
</style>

在Todo.vue列表组件中,我们需要展示所有用户的评论、用户名、当前用户是否点赞,列表的数据我们已经在TodoList.vue的fetchTodos方法中拿到,并且传递给了Todo.vue子组件。接下来我们编写点赞接口的逻辑。

刷新点赞方法

原理:likes表里面包含所有当前用户的点赞数据,是通过当前用户的用户名email与遍历当前一条数据的post的id与likes表里面的email_name和post_id是否匹配进行查询,这是一个组件的循环遍历查询,每查一次,看是否查到数据,查到数据则表示该用户给当前的评论点了赞,即为带有当前用户点赞的数据,有的话将当前一条数据的like改为有数据即为true,爱心点亮

步骤

1.在Todo.vue引入文件

import { defineComponent, ref } from ‘vue’

import { supabase } from ‘@/lib/supabase’

import { userSession } from ‘@/vuetils/useAuth’

2.将Todo.vue逻辑代码都清空,加上下面的刷新点赞的方法

const fecthLike = async () => {const { data } = await supabase.from('likes').select('*').match({post_id: props.todo.id,email_name: userSession?.value?.user?.email || '',})if(data?.length){like.value = data[0]} else {like.value = null}}

切换点赞的方法

每次切换完都要刷新一下点赞

原理

点赞就在likes表里添加一条用户用户名email_name和post_id的数据,取消点赞就删除此条数据

3.增加以下代码

const toggleLike = async () => {if (like.value) {await supabase.from('likes').delete().match({post_id: props.todo.id,email_name: userSession?.value?.user?.email || '',})} else {await supabase.from('likes').insert({post_id: props.todo.id,email_name: userSession?.value?.user?.email,}).single()}fecthLike()}

Todo.vue完整代码

<template><liclass="blockcursor-pointerhover:bg-gray-200focus:outline-none focus:bg-gray-200transitionduration-150ease-in-outborder-style1"><div class="flex items-center px-4 py-4 sm:px-6"><div class="min-w-0 flex-1 flex items-center"><div class="text-sm leading-5 font-medium truncate t-s">{{ todo.task }}</div></div><button @click="toggleLike" class="w-4 h-4 ml-2  hover:border-black rounded"><svgv-if="like"xmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="24px"height="24px"preserveAspectRatio="xMidYMid meet"viewBox="0 0 256 256"><pathd="M236.023 92c0 30.565-17.713 62.005-52.648 93.446a317.34 317.34 0 0 1-51.442 37.534a8 8 0 0 1-7.819 0c-4.25-2.38-104.09-59.117-104.09-130.98a60.02 60.02 0 0 1 108-36.04a60.02 60.02 0 0 1 108 36.04z"fill="currentColor"></path></svg><svgv-elsexmlns="http://www.w3.org/2000/svg"xmlns:xlink="http://www.w3.org/1999/xlink"width="24px"height="24px"preserveAspectRatio="xMidYMid meet"viewBox="0 0 256 256"><pathd="M128.018 228a11.995 11.995 0 0 1-5.864-1.53C117.82 224.043 16.018 166.18 16.018 92a64.028 64.028 0 0 1 112-42.378a64.028 64.028 0 0 1 112 42.378c0 74.18-101.803 132.043-106.137 134.47a11.995 11.995 0 0 1-5.863 1.53zm-48-176a40.046 40.046 0 0 0-40 40c0 51.222 67.445 97.186 88 110c20.554-12.814 88-58.778 88-110a40.009 40.009 0 0 0-76.928-15.408a12 12 0 0 1-22.145 0A39.923 39.923 0 0 0 80.018 52z"fill="currentColor"></path></svg></button></div><div class="flex items-center px-4 py-4 sm:px-6 t-m">{{todo.email.substring(0, todo.email.indexOf('@'))}}</div></li>
</template><script lang="ts">
import { defineComponent, PropType, ref } from 'vue'
import { supabase } from '@/lib/supabase'
import { userSession } from '@/vuetils/useAuth'export default defineComponent({name: 'Todo',props: {todo: {type: Object,required: true,},},setup(props) {const like = ref<undefined | null>(undefined)const fecthLike = async () => {const { data } = await supabase.from('likes').select('*').match({post_id: props.todo.id,email_name: userSession?.value?.user?.email || '',})if(data?.length){like.value = data[0]} else {like.value = null}}fecthLike()// Removes todo from supbase and also from app stateconst toggleLike = async () => {if (like.value) {await supabase.from('likes').delete().match({post_id: props.todo.id,email_name: userSession?.value?.user?.email || '',})} else {await supabase.from('likes').insert({post_id: props.todo.id,email_name: userSession?.value?.user?.email,}).single()}fecthLike()}return { toggleLike, userSession,like,fecthLike }},})
</script><style lang="css" scoped>
.border-style1 {border: 1px solid #d5d0d0;margin: 20px 15px;border-radius: 10px;
}
.t-s {font-size: 14px;font-weight: bold;
}
.t-m {font-size: 13px;font-weight: normal;margin-top: -20px;
}
</style>

小技巧:
具体的增删改查的语法可以参考文档

重启一下项目,登录后我们来新增一条数据,新增成功,点赞也成功了!

简单的post应用即完成!

写在结尾的话

以上就是基于一个教程示例对MemFire Cloud的使用和反馈的一些看法,如果在开发中遇到问题,可以参考上面的完整代码项目比对,希望对大家有所帮助。

视频详解地址:https://www.bilibili.com/video/BV1cZ4y1Y7AW?spm_id_from=333.999.0.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/68749.html

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

相关文章

百度网盘加速|火狐插件global speed挂了?不用担心有新方法

考研党去考了个期末考试&#xff0c;回来继续看百度网盘就发现之前的插件用不起来了&#xff0c;心里拔凉拔凉的&#xff0c;赶快上网搜罗各种方法期待奇迹出现。 那就浅浅的解决一下问题吧&#xff01;&#xff08;忙着期末周&#xff0c;写的略微粗糙~&#xff09; 百度网盘…

【游戏逆向】老飞飞怀恋魅力爱玩等老飞飞瞬移分析代码

【游戏逆向】老飞飞怀恋魅力爱玩等老飞飞瞬移分析代码 在游戏中&#xff0c;每个人物都有一个坐标。x坐标和y坐标。老飞飞也一样&#xff0c;可能有些朋友用ce找到当前的人物坐标。然后修改坐标就能达到瞬移到效果。不过有些老飞飞是无法实现的。只要瞬移就会掉客户端。今天就…

【网站加速器】浏览器一键加速神器SpeedyFox

你好呀&#xff01;我是小易同学&#xff0c;一名普通的不能再普通的学习者。 写文章是为了记录自己的学习过程&#xff0c;同时也希望能帮助到需要的人。 如果我的文章对您有帮助&#xff0c;请不要忘记关注我哦&#x1f970; 一、介绍 SpeedyFox可以对Chrome浏览器、Edge、火…

Aeraki Mesh 正式成为CNCF沙箱项目,腾讯云携手合作伙伴加速服务网格成熟商用

作者&#xff1a;腾讯云高级工程师 赵化冰 刚刚获悉&#xff0c;由腾讯云主导&#xff0c;联合百度、灵雀云、腾讯音乐、滴滴、政采网等多家合作伙伴发起的服务网格开源项目 Aeraki Mesh 通过了全球顶级开源基金会云原生计算基金会&#xff08;CNCF&#xff09;技术监督委员会…

一文纵览Umi‘s Friends生态,GameFi浪潮的变革者

以“P2E”为特性的 GameFi&#xff0c;代表着游戏时代的新盈利模式&#xff0c;它将 NFT 或其他形式的代币化资产作为游戏内容&#xff0c;游戏内资产的寿命会&#xff0c;则随着这些资产继续存在于玩家的钱包中而延长&#xff08;即便游戏关闭&#xff09;&#xff0c;资产的互…

一个骨灰级玩家的游戏加速器使用心得分享

骨灰级玩家可能算不上&#xff0c;但绝对算得上是一个stream的忠实玩家。虽然不能像大部分玩家一样天天吃鸡&#xff0c;但是作为一个stream的忠实玩家&#xff0c;也会经常玩《CSGO》、《全境封锁》、《GAT5》之类的游戏。在steam上也前前后后大概买了六七款游戏。 玩单机游戏…

高校如何学习思政课程?关键技术是这个

高校多方位多角度动态的进行质量监控&#xff0c;不断促进思政课程转变教学理念、改革教学方法&#xff0c;提高思政课的针对性、吸引力和感染力。 思政课程是高校落实立德树人根本任务&#xff0c;推进三全育人纵深发展的关键环节&#xff0c;与作为立德树人关键课程的思政课同…

AI in Finance<量化交易人工智能金融投资>(上)

投资有风险&#xff0c;操作需谨慎&#xff01;&#xff01;&#xff01;&#xff01; 本文为个人笔记&#xff0c;请审核通过&#xff0c;谢谢 不管多么优秀的统计模型都有局限&#xff0c;风险控制永远都要放到第一位&#xff01; 分散化不要把鸡蛋放在一个篮子里&#xff0…

chatgpt赋能python:Python考试怎么办?一份高效备考指南

Python考试怎么办&#xff1f;一份高效备考指南 作为一名有10年Python编程经验的工程师&#xff0c;笔者认为在备考Python考试时需要注意以下几点&#xff1a; 1. 了解考试内容和考试形式 在备考时需要明确Python考试的大致内容和考试形式。Python考试通常包含Python基础语法…

chatgpt赋能python:Python考级指南:如何成功通过Python等级认证考试

Python考级指南&#xff1a;如何成功通过Python等级认证考试 Python是一门非常流行的编程语言&#xff0c;尤其在数据分析、人工智能和机器学习领域中非常受欢迎。Python的高级特性、易读性和可扩展性&#xff0c;使其成为越来越多企业和组织中必不可少的一部分。因此&#xf…

chatgpt赋能python:Python怎么考?全面解析Python相关考试内容及考试技巧

Python怎么考&#xff1f;全面解析Python相关考试内容及考试技巧 Python是一种高级编程语言&#xff0c;广泛应用于人工智能、数据分析、Web应用程序和游戏等领域。因此&#xff0c;Python也成为互联网公司招聘的热门技能之一。但是&#xff0c;如何有效地备考Python相关考试&…

《Web应用技术》期末复习(END)

说明&#xff1a;不知道是哪位兄台在群里说了一句&#xff0c;整的我压力山大。这是我个人的期末复习梳理&#xff0c;自己使用并且提供给几位有需要的朋友使用&#xff0c;并不确定期末考试考不考这些。请大家视情况查看和使用&#xff0c;如果有错误&#xff0c;也欢迎大家找…

刘赖简介——同泰国医馆专家介绍

刘赖&#xff0c;1961年出生&#xff0c;毕业于成都中医药大学&#xff0c;后就职于河北省华北油田总医院&#xff0c;主治医师。现任同泰国医馆咨询专家。 从事中医临床工作32年&#xff0c;精于中医内科、皮肤科&#xff0c;擅长于治疗男性性功能减弱和女性内分泌失调导致的…

选品推荐|shopee|lazada泰国热销的5大品类

泰国电商市场最热卖品类都有哪些? 2021年跟着Shopee. Lazada出海东南亚,跨境卖家应重点关注的市场之一便是泰国:泰国电商增长潜力巨大,至2025年将达130亿美金,在东南亚排名第三;Shopee Lazada跨境泰国站在机器翻译、SLS LGS及运营支持方面深耕已久,效能全面提升,2021年…

泰国地图高清中文版 电子版​

泰国地图高清中文版 电子版 软件大小&#xff1a;1.19MB 软件语言&#xff1a;简体中文 软件类别&#xff1a;图像浏览 软件授权&#xff1a;官方版 更新时间&#xff1a;2015-01-28 应用平台&#xff1a;/Win8/Win7/WinXP 泰国地图高清中文版完整的介绍了泰国的国土&#xff0…

泰国TISI标志LOGO

PCN 提供文章 The Product certification schemes of TISI Consists of 2 Types with different certification marks. TISI 的产品认证方案包括两种不同的认证标志 Voluntray Certification markmandatory certification mark 自愿性认证标志和强制性认证标志。 备注:所谓的…

Chrome浏览器扩展的写法

Chrome浏览器扩展写法 1.写在前面2.前言2.1. 什么是Chrome插件2.2. 学习Chrome插件开发有什么意义2.3. 为什么是Chrome插件而不是Firefox插件 3.开发与调试4. 核心介绍4.1. manifest.jsonbackgroundevent-pagespopupinjected-scripthomepage_url 5.Chrome插件的8种展示形式5.1 …

chatgpt赋能python:Python怎么横着输出?

Python怎么横着输出&#xff1f; 如果你是一名有10年Python编程经验的工程师&#xff0c;你一定已经经历过许多项目&#xff0c;很可能你曾经需要对代码进行一些横向格式化或输出。Python作为一种高级编程语言&#xff0c;有各种各样的技巧和技能。在本文中&#xff0c;我们将…

面板回归分析操作步骤

面板数据&#xff08;panel data&#xff09;是指不同对象在不同时间上的指标数据。目前面板数据被广泛地应用于经济研究中。本文简单介绍下&#xff0c;使用SPSSAU进行面板数据回归分析步骤。 一、数据格式 下图中&#xff0c;展示的就是一个面板数据的例子。数据为9个地区20…

利用python进行回归分析

通常大家会认为曲线拟合和回归分析类似&#xff0c;但其实回归分析中是包含曲线拟合的。拟合是研究因变量和自变量的函数关系的。而回归是研究随机变量间的相关关系的。拟合侧重于调整参数&#xff0c;使得与给出的数据相符合。而回归则是侧重于研究变量的关系&#xff0c;对拟…