VUE+Supabase

AI时代,为什么我放弃Vue全家桶,选择了Next.js + Supabase 摘要: 从Vue全家桶转向Next.js+Supabase后,开发效率提升6倍。AI时代的技术选择标准已变,React/Next.js因训练数据更丰富成为AI友好型框架。Next.js 14+Supabase组合提供全栈解决方案,内置认证、类型安全与自动API,Vercel模板实现开箱即用。实测项目周期从12天缩短至2天,关键优势在于零后端配置、AI精准代码生成与模板起步。虽在复杂查询性能和高并发场景存在局限,但对中小型项目验证期极为友好。建议小型团队优先考虑开发效率,通过create-next-app模板 阅读详情

一、前期准备

1. 注册 Supabase 账号并创建项目

  1. 访问 Supabase 官网 注册账号(支持 GitHub / 邮箱登录)。
  2. 登录后点击 New Project,填写项目信息:
    • Project name:项目名称(如 vue-supabase-demo)
    • Database password:数据库密码(记住!后续连接需要)
    • Region:区域(选离你最近的,如 Asia Pacific (Singapore))
  3. 点击 Create Project,等待约 2 分钟项目初始化完成。

2. 获取 Supabase 项目密钥(关键!)

项目创建完成后,进入项目控制台 → 点击左侧 Settings → API,复制两个核心信息:

  • Project URL:项目接口地址(如 https://abc123.supabase.co)
  • anon public:匿名访问密钥(如 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...)

这两个信息用于前端连接 Supabase,后续会用到。

二、搭建 Vue 项目并集成 Supabase

1. 创建 Vue 3 项目(若已有项目可跳过)

打开终端,执行以下命令创建 Vite + Vue 项目:

# 创建项目

npm create vite@latest vue-supabase-demo -- --template vue

# 进入项目目录

cd vue-supabase-demo

# 安装依赖

npm install

2. 安装 Supabase Vue 客户端

Supabase 官方提供了 Vue 专属的客户端库 @supabase/supabase-js(Vue 3 兼容),安装命令:

npm install @supabase/supabase-js

3. 初始化 Supabase 客户端

为了方便全局使用,我们创建一个 Supabase 实例文件:

  1. 在 src 目录下创建 utils/supabase.js 文件;
  2. 粘贴以下代码(替换为你自己的 Project URL 和 anon public 密钥):
// src/utils/supabase.js
import { createClient } from '@supabase/supabase-js'

// 你的 Supabase 项目配置(替换成自己的!)
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL
const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY

// 创建 Supabase 客户端实例
export const supabase = createClient(supabaseUrl, supabaseAnonKey)
  1. 在项目根目录创建 .env 文件,存储环境变量(避免密钥硬编码):
# .env
VITE_SUPABASE_URL=你的 Project URL
VITE_SUPABASE_ANON_KEY=你的 anon public 密钥

4. 验证连接

在 src/App.vue 中引入 supabase 实例,测试是否连接成功:

<!-- src/App.vue -->
<script setup>
import { supabase } from './utils/supabase'

// 测试连接
const testConnection = async () => {
  const { data, error } = await supabase.from('test').select('*').limit(1)
  if (error) {
    console.log('连接成功(测试表不存在属于正常):', error.message)
  } else {
    console.log('连接成功,数据:', data)
  }
}

// 组件挂载时执行测试
testConnection()
</script>

<template>
  <h1>Vue + Supabase 测试</h1>
</template>

运行项目 npm run dev,打开浏览器控制台,若显示 连接成功 则说明集成完成!

三、核心功能实现(实战)

下面我们实现 3 个最常用的功能:用户认证(邮箱登录)、数据库 CRUD、文件存储,全程结合 Vue 3 的 Composition API。

1. 用户认证(邮箱 / 密码登录)

Supabase 内置了完整的用户认证系统,支持邮箱、OAuth(GitHub/Google)等,无需自己写后端逻辑。

步骤 1:启用 Supabase 认证功能
  1. 进入 Supabase 控制台 → 左侧 Authentication → Providers;
  2. 启用 Email 提供商(默认已启用),无需额外配置。
步骤 2:Vue 前端实现登录 / 注册 / 退出

创建 src/views/Auth.vue,实现完整的认证流程:

<!-- src/views/Auth.vue -->
<script setup>
import { ref } from 'vue'
import { supabase } from '@/utils/supabase'
import { useRouter } from 'vue-router'

const router = useRouter()

// 表单数据
const email = ref('')
const password = ref('')
const error = ref('')
const loading = ref(false)

// 注册用户
const signUp = async () => {
  try {
    loading.value = true
    error.value = ''
    // 调用 Supabase 注册接口(自动发送验证邮件)
    const { data, error: supabaseError } = await supabase.auth.signUp({
      email: email.value,
      password: password.value,
    })
    if (supabaseError) throw supabaseError
    alert('注册成功!请查收验证邮件~')
  } catch (err) {
    error.value = err.message
  } finally {
    loading.value = false
  }
}

// 登录用户
const signIn = async () => {
  try {
    loading.value = true
    error.value = ''
    // 调用 Supabase 登录接口
    const { data, error: supabaseError } = await supabase.auth.signInWithPassword({
      email: email.value,
      password: password.value,
    })
    if (supabaseError) throw supabaseError
    alert('登录成功!')
    router.push('/dashboard') // 登录成功跳转到仪表盘
  } catch (err) {
    error.value = err.message
  } finally {
    loading.value = false
  }
}

// 退出登录
const signOut = async () => {
  await supabase.auth.signOut()
  alert('退出成功!')
  router.push('/')
}
</script>

<template>
  <div class="auth-container">
    <h2>Vue + Supabase 认证</h2>
    <div class="form-group">
      <label>邮箱</label>
      <input
        type="email"
        v-model="email"
        placeholder="请输入邮箱"
        required
      />
    </div>
    <div class="form-group">
      <label>密码</label>
      <input
        type="password"
        v-model="password"
        placeholder="请输入密码(至少6位)"
        required
      />
    </div>
    <div class="error" v-if="error">{{ error }}</div>
    <button @click="signUp" :disabled="loading">注册</button>
    <button @click="signIn" :disabled="loading" style="margin-left: 10px;">登录</button>
    <button @click="signOut" style="margin-left: 10px;">退出</button>
  </div>
</template>

<style scoped>
.auth-container {
  max-width: 400px;
  margin: 50px auto;
  padding: 20px;
  border: 1px solid #eee;
  border-radius: 8px;
}
.form-group {
  margin-bottom: 15px;
}
input {
  width: 100%;
  padding: 8px;
  border: 1px solid #ddd;
  border-radius: 4px;
}
button {
  padding: 8px 16px;
  background: #2563eb;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
button:disabled {
  background: #94a3b8;
  cursor: not-allowed;
}
.error {
  color: #ef4444;
  margin: 10px 0;
}
</style>
步骤 3:监听用户登录状态(全局)

在 src/App.vue 中监听用户认证状态,实现 “登录后显示仪表盘,未登录显示登录页”:

<!-- src/App.vue -->
<script setup>
import { ref, onMounted } from 'vue'
import { supabase } from './utils/supabase'
import Auth from './views/Auth.vue'
import Dashboard from './views/Dashboard.vue'

const user = ref(null)

// 监听用户状态变化(登录/退出时触发)
onMounted(() => {
  // 获取当前登录用户
  user.value = supabase.auth.currentUser

  // 监听认证状态变化
  supabase.auth.onAuthStateChange((_event, session) => {
    user.value = session?.user || null
  })
})
</script>

<template>
  <div id="app">
    <h1>Vue + Supabase 全栈Demo</h1>
    <!-- 未登录显示登录页,已登录显示仪表盘 -->
    <Auth v-if="!user" />
    <Dashboard v-else />
  </div>
</template>

2. 数据库 CRUD(核心功能)

Supabase 内置 PostgreSQL 数据库,支持通过前端直接操作(无需后端接口),下面实现 “用户列表” 的增删改查。

步骤 1:创建数据库表(Supabase 控制台)
  1. 进入 Supabase 控制台 → 左侧 Database → Tables → Create a new table;
  2. 创建 users 表(自定义表名),添加以下字段:
    • id:主键(默认已创建,类型 uuid,自增);
    • name:字符串(必填,用户姓名);
    • age:整数(可选,用户年龄);
    • created_at:时间戳(默认已创建,记录创建时间);
  3. 点击 Save 保存表。
步骤 2:Vue 前端实现 CRUD(Dashboard.vue)

创建 src/views/Dashboard.vue,实现用户列表的增删改查:

<!-- src/views/Dashboard.vue -->
<script setup>
import { ref, onMounted } from 'vue'
import { supabase } from '@/utils/supabase'

// 数据状态
const users = ref([])
const newUser = ref({ name: '', age: '' }) // 新增用户表单
const editingUser = ref(null) // 编辑中的用户
const loading = ref(false)
const error = ref('')

// 1. 查询所有用户(读取)
const fetchUsers = async () => {
  try {
    loading.value = true
    error.value = ''
    // 调用 Supabase 查询接口:from(表名).select(字段)
    const { data, error: supabaseError } = await supabase
      .from('users')
      .select('*') // 查询所有字段
      .order('created_at', { ascending: false }) // 按创建时间倒序

    if (supabaseError) throw supabaseError
    users.value = data
  } catch (err) {
    error.value = err.message
  } finally {
    loading.value = false
  }
}

// 2. 新增用户(创建)
const addUser = async () => {
  if (!newUser.value.name) {
    error.value = '用户名不能为空!'
    return
  }
  try {
    loading.value = true
    error.value = ''
    // 调用 Supabase 插入接口:from(表名).insert(数据)
    const { data, error: supabaseError } = await supabase
      .from('users')
      .insert([newUser.value]) // 插入一条数据(数组形式支持批量插入)
      .select() // 插入后返回新增数据

    if (supabaseError) throw supabaseError
    users.value.unshift(data[0]) // 新增数据添加到列表头部
    newUser.value = { name: '', age: '' } // 重置表单
  } catch (err) {
    error.value = err.message
  } finally {
    loading.value = false
  }
}

// 3. 编辑用户(更新)
const updateUser = async () => {
  if (!editingUser.value.name) {
    error.value = '用户名不能为空!'
    return
  }
  try {
    loading.value = true
    error.value = ''
    // 调用 Supabase 更新接口:from(表名).update(数据).eq(条件)
    const { error: supabaseError } = await supabase
      .from('users')
      .update({ name: editingUser.value.name, age: editingUser.value.age })
      .eq('id', editingUser.value.id) // 按 id 匹配要更新的记录

    if (supabaseError) throw supabaseError
    // 更新列表中的数据
    const index = users.value.findIndex(u => u.id === editingUser.value.id)
    users.value[index] = { ...editingUser.value }
    editingUser.value = null // 退出编辑状态
  } catch (err) {
    error.value = err.message
  } finally {
    loading.value = false
  }
}

// 4. 删除用户(删除)
const deleteUser = async (userId) => {
  if (!confirm('确定要删除吗?')) return
  try {
    loading.value = true
    error.value = ''
    // 调用 Supabase 删除接口:from(表名).delete().eq(条件)
    const { error: supabaseError } = await supabase
      .from('users')
      .delete()
      .eq('id', userId) // 按 id 匹配要删除的记录

    if (supabaseError) throw supabaseError
    // 从列表中移除数据
    users.value = users.value.filter(u => u.id !== userId)
  } catch (err) {
    error.value = err.message
  } finally {
    loading.value = false
  }
}

// 组件挂载时查询所有用户
onMounted(() => {
  fetchUsers()
})
</script>

<template>
  <div class="dashboard">
    <h2>用户管理仪表盘(已登录:{{ user.email }})</h2>
    <button @click="supabase.auth.signOut()">退出登录</button>

    <!-- 新增用户表单 -->
    <div class="add-user">
      <h3>新增用户</h3>
      <input
        type="text"
        v-model="newUser.name"
        placeholder="输入姓名"
        :disabled="loading"
      />
      <input
        type="number"
        v-model="newUser.age"
        placeholder="输入年龄"
        :disabled="loading"
      />
      <button @click="addUser" :disabled="loading">添加</button>
    </div>

    <!-- 错误提示 -->
    <div class="error" v-if="error">{{ error }}</div>

    <!-- 用户列表 -->
    <div class="user-list" v-if="!loading">
      <h3>用户列表(共 {{ users.length }} 人)</h3>
      <table border="1" cellpadding="8" cellspacing="0">
        <thead>
          <tr>
            <th>ID</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>创建时间</th>
            <th>操作</th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="u in users" :key="u.id">
            <td>{{ u.id }}</td>
            <td>
              <input
                v-if="editingUser?.id === u.id"
                v-model="editingUser.name"
                type="text"
              />
              <span v-else>{{ u.name }}</span>
            </td>
            <td>
              <input
                v-if="editingUser?.id === u.id"
                v-model="editingUser.age"
                type="number"
              />
              <span v-else>{{ u.age || '无' }}</span>
            </td>
            <td>{{ new Date(u.created_at).toLocaleString() }}</td>
            <td>
              <button
                @click="editingUser = u"
                v-if="editingUser?.id !== u.id"
                :disabled="loading"
              >
                编辑
              </button>
              <button
                @click="updateUser()"
                v-if="editingUser?.id === u.id"
                :disabled="loading"
              >
                保存
              </button>
              <button
                @click="deleteUser(u.id)"
                style="background: #ef4444; margin-left: 5px;"
                :disabled="loading"
              >
                删除
              </button>
            </td>
          </tr>
        </tbody>
      </table>
    </div>
    <div v-else>加载中...</div>
  </div>
</template>

<style scoped>
.dashboard {
  max-width: 800px;
  margin: 20px auto;
  padding: 20px;
}
.add-user {
  margin: 20px 0;
  display: flex;
  gap: 10px;
  align-items: center;
}
.add-user input {
  padding: 8px;
  flex: 1;
  max-width: 200px;
}
.user-list table {
  width: 100%;
  border-collapse: collapse;
}
.user-list th, .user-list td {
  text-align: left;
}
button {
  padding: 6px 12px;
  background: #2563eb;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
button:disabled {
  background: #94a3b8;
  cursor: not-allowed;
}
.error {
  color: #ef4444;
  margin: 10px 0;
}
</style>

3. 文件存储(可选,如上传头像)

Supabase 提供文件存储服务,支持上传图片、文档等文件,下面实现 “上传用户头像” 功能。

步骤 1:创建存储桶(Supabase 控制台)
  1. 进入 Supabase 控制台 → 左侧 Storage → Create a bucket;
  2. 桶名称:avatars(存储用户头像);
  3. 权限:勾选 Public(公开访问,方便前端展示头像);
  4. 点击 Create 保存。
步骤 2:Vue 前端实现文件上传

在 Dashboard.vue 中添加头像上传功能(修改部分代码):

<!-- Dashboard.vue 新增/修改以下代码 -->
<script setup>
// 新增:文件上传相关
const avatarFile = ref(null) // 选中的文件
const avatarUrl = ref('') // 上传后的文件URL

// 上传头像
const uploadAvatar = async () => {
  if (!avatarFile.value) {
    error.value = '请选择文件!'
    return
  }
  try {
    loading.value = true
    error.value = ''
    // 文件名:使用当前时间戳 + 原文件名(避免重复)
    const fileName = `${Date.now()}-${avatarFile.value.name}`
    // 调用 Supabase 上传接口:storage.from(桶名).upload(文件路径, 文件)
    const { data, error: supabaseError } = await supabase.storage
      .from('avatars') // 桶名
      .upload(`public/${fileName}`, avatarFile.value, {
        cacheControl: '3600', // 缓存1小时
        upsert: false // 不覆盖已存在的文件
      })

    if (supabaseError) throw supabaseError
    // 获取上传后的文件公共URL
    const { data: urlData } = supabase.storage
      .from('avatars')
      .getPublicUrl(data.path) // data.path 是文件在桶中的路径

    avatarUrl.value = urlData.publicUrl
    alert('头像上传成功!')
  } catch (err) {
    error.value = err.message
  } finally {
    loading.value = false
  }
}
</script>

<template>
  <!-- 新增:头像上传区域 -->
  <div class="upload-avatar">
    <h3>上传头像</h3>
    <input type="file" accept="image/*" @change="avatarFile = $event.target.files[0]" />
    <button @click="uploadAvatar" :disabled="loading">上传</button>
    <div v-if="avatarUrl" style="margin-top: 10px;">
      <img :src="avatarUrl" alt="头像" style="width: 100px; height: 100px; object-fit: cover;" />
    </div>
  </div>
</template>

<style scoped>
/* 新增:上传区域样式 */
.upload-avatar {
  margin: 20px 0;
  padding: 10px;
  border: 1px dashed #ddd;
}
</style>

四、关键注意事项(避坑指南)

  1. 权限控制:

    • 匿名用户默认没有数据库 / 存储的操作权限!如果需要匿名用户操作,需在 Supabase 控制台 → Authentication → Policies 中添加权限策略(如允许匿名用户查询 users 表)。
    • 生产环境建议使用 “已登录用户” 权限(通过 auth.uid() 验证用户身份)。
  2. 环境变量:

    • Vue 3 + Vite 中,环境变量必须以 VITE_ 开头,否则无法在前端访问。
    • 不要将 service_role 密钥(管理员密钥)暴露在前端!前端只能用 anon public 密钥。
  3. 错误处理:

    • 所有 Supabase 接口都是异步的,必须用 try/catch 捕获错误(如网络错误、权限不足、数据格式错误)。
  4. 数据验证:

    • 前端需做基础数据验证(如必填字段、数据类型),后端可在 Supabase 控制台设置数据库约束(如非空、字段长度)。

五、扩展学习(后续可探索)

  1. OAuth 登录:Supabase 支持 GitHub、Google、Facebook 等 OAuth 登录,只需在控制台启用对应提供商,前端调用 supabase.auth.signInWithOAuth({ provider: 'github' }) 即可。
  2. 实时数据同步:Supabase 支持实时订阅数据库变化,通过 supabase.from('users').on('INSERT', (payload) => { ... }).subscribe() 实现 “别人新增用户,你的页面实时更新”。
  3. 行级安全策略(RLS):生产环境核心!通过 RLS 控制用户只能操作自己的数据(如用户只能修改自己创建的记录)。
  4. Supabase 函数:类似云函数,可在 Supabase 中编写 PostgreSQL 函数,实现复杂业务逻辑(如数据计算、第三方接口调用)。

总结

Vue + Supabase 是一套 “快速开发全栈应用” 的组合,核心优势是:

  • 前端用 Vue 3 写界面,简单高效;
  • 后端无需写代码,Supabase 提供数据库、认证、存储等一站式服务;
  • 开发速度快,适合原型开发、小型应用、个人项目。

按照上面的步骤,你已经实现了一个完整的全栈应用(认证 + 数据库 CRUD + 文件存储),可以在此基础上扩展更多功能!

从静态网页到动态网站:基于Vue.js与Supabase的班级同学录重构实践 在现代Web开发中,前后端分离架构与无服务器(Serverless)技术已成为构建动态、可扩展应用的主流范式。其核心原理在于将前端展示逻辑与后端数据服务解耦,前端通过API与云端服务通信,从而简化部署、降低运维成本并提升开发效率。这种架构的技术价值在于,开发者可以专注于业务逻辑与用户体验,而无需管理底层服务器基础设施。它尤其适用于中小型项目、内部工具或社区网站等场景,能以极低的成本实现快速上线与长期稳定运行。本文以重构一个班级同学录项目为例,具体展示了如何运用Vue.js前端框架与Supabase后端即服务 阅读详情

相关推荐

Windows 10错误代码解析与系统故障排除指南

操作系统错误代码是系统运行状态的直接反馈,Windows系统通过特定编码机制将故障信息转化为可识别的错误代码。从技术原理看,这些代码通常对应特定的异常处理流程,包括内存管理、驱动兼容性、文件系统等核心模块。理解错误代码对于系统维护具有重要价值,能快速定位问题根源,提高故障排除效率。在实际应用场景中,蓝屏错误(如0x0000007B)、系统升级失败(如0x80070002)和启动故障是最常见的三类问题。通过分析dump文件、使用WinDbg工具和系统内置诊断功能,可以有效解决大部分系统异常。特别是对于蓝屏错误

weixin_30516429的博客 298

全栈开发最优解:Vue + Vercel + Supabase 快速搭建入门

全栈快速开发文章会有一个todo的例子快速搭建项目,全程只需要点点,复制粘贴,耗时不过10min。

flybeta的博客 3829

玩转ubuntu18 --机器视觉方面(yolo算法识别及摄像头和cmake问题解决)

玩转ubuntu18 --机器视觉方面(yolo v3算法识别) 1.YOLO的简介 工作原理 先前的检测系统重新调整分类器或本地化器以执行检测。他们将模型应用于多个位置和比例尺的图像。图像的高分区域被视为检测。 我们使用完全不同的方法。我们将单个神经网络应用于整个图像。该网络将图像划分为区域,并预测每个区域的边界框和概率。这些边界框按预测概率加权。 我们的模型比基于分类器的系统具有几个优势。它在测试时间查看整个图像,因此其预测由图像中的全球上下文提供信息。它还通过单一网络评估进行预测,这与R-CNN等系统

qq_53951823的博客 1556

Vue与Supabase交互文档

Vue应用中使用Supabase的主要接口和用法概述。项目中可根据具体需求进行定制和封装。

weixin_44903776的博客 925

基于Yolo11的无人机小目标检测系统的设计与性能优化改进项目实现

该项目旨在开发一个基于YOLO11的无人机目标检测系统,能够实时识别并定位无人机拍摄过程中捕捉的小目标。考虑到无人机拍摄的目标通常较小,系统将采用特定的调优策略,以提高小目标的检测精度和召回率。

m0_73723097的博客 1205

【LLC快速上手系列】LLC轻载时,死区时间怎么调才对?别再傻傻乱搞了!

死区时间,就是指。如果你死区设得好,就能让开通前 ( V_DS to 0 ),完美实现!

weixin_43199439的博客 1856

基于vue3与supabase系统认证机制

系统采用 Supabase 作为认证和数据服务提供商,实现了完整的用户身份验证流程。系统使用基于 JWT (JSON Web Token) 的认证方式,提供了安全可靠的用户身份管理机制。

weixin_44903776的博客 1509

智能Agent如何重塑企业流程

在当今数字化时代,企业流程的效率和敏捷性至关重要。传统企业流程往往受限于人工操作,效率低下、成本高昂,难以适应快速变化的市场环境。智能Agent作为一种新兴技术,凭借其强大的智能化能力,正在逐渐改变企业流程的运作模式,为企业带来新的机遇和挑战。智能Agent是一种能够感知环境、自主决策、执行任务的软件实体。它可以模拟人类的智能行为,例如学习、推理、规划和沟通。通过将智能Agent嵌入到企业流程中,可以实现流程的自动化、优化和智能化,从而提高效率、降低成本、提升客户体验。8.1 研究成果总结。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 873

推荐使用:Nuxt Supabase - 构建高效能的Supabase驱动的Vue应用

推荐使用:Nuxt Supabase - 构建高效能的Supabase驱动的Vue应用 supabase Supabase module for Nuxt. 项目地址: https://gitcode.com/gh_mirrors/su/supabase ...

gitblog_00051的博客 623

程序员应用AI大模型创业实现财务自由的100种赚钱方案原理与实战指南

成功的 AI 创业者都遵循着 “技术 + 需求 + 变现” 的铁三角法则。记住:不是要做 “全能大模型”,而是成为某个垂直领域的 “AI 解决方案专家”。现在就开始行动:用周末 2 小时完成第一个 MVP,下周启动种子用户测试,三个月内找到可复制的盈利模式。当你实现第一个 10 万用户时,会发现财务自由的密码藏在持续迭代的每个 0.1 版本更新中。延伸思考:你的技术背景适合切入哪个细分领域?

AI天才研究院 1379

R语言线性混合模型(LMM)分析

它将数据表示为固定效应和随机效应的线性组合,其中固定效应表示总体均值的影响,随机效应表示个体间的随机差异。LMM的目标是通过最大似然估计或最小二乘估计来估计模型中的固定效应和随机效应的参数。LMM结合了固定效应和随机效应,能够同时考虑个体间和个体内的变异,并适用于具有相关性的数据。目前在使用LMM的R语言包中,较常用的是lme4和nlme包,它们提供了丰富的函数和工具来拟合和分析线性混合模型。面板数据分析:LMM适用于分析具有面板结构的数据,如经济学中的面板数据或教育研究中的学生评估数据。

走向CTO的路上... 2968

Supabase全面介绍与使用指南

Supabase 提供了一个开箱即用的后端解决方案,基于成熟的 PostgreSQL 数据库构建而成。与 Firebase 不同,Supabase 是完全开源的,开发者可以选择直接使用官方托管的服务,也可以自建部署,享受更高的灵活性与自由度。其目标是让前端开发者能够专注于业务逻辑,而无需担心后端服务器的部署与运维工作。Supabase 是一个以 PostgreSQL 为核心的开源 BaaS 平台,为开发者提供了一整套后端服务,包括身份验证、实时数据同步、文件存储和边缘函数等。

斯黄人民的博客 6390

1. SAP Business Application Studio 里创建一个基于 CAP 模型的最简单的 OData 服务

本文基于 SAP Cloud Application Programming 编程模型的 OData 服务开发教程的第一步,简述了 SAP Business Technology Platform 里 Business Application Studio 开发工具的打开方式,创建 Dev Space 以及 CAP 项目的创建步骤,以及如何通过 schema.cds 和 service.cds 分别创建 OData 模型和 OData 服务,最后通过 ports preview 打开 OData 服务预览页

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1797

Vue + Supabase 有关docker的使用说明

不用装 Docker,专注于 Vue + Supabase 的核心功能开发(认证、数据库 CRUD 等),按照上一篇教程一步步操作即可;Docker 的作用:解决环境统一、本地模拟服务、简化部署等问题,不是必需的;后续扩展:如果需要本地运行 Supabase 或部署项目,再学习 Docker 也完全来得及(那时你对项目已有一定理解,学习 Docker 会更有针对性)。

Java_GodZ的博客 800

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

vue3 TypeScript 与 Supabase 集成开发

类型安全保障编译时捕获错误,减少运行时异常IDE 提供智能提示和自动完成类型即文档,减少注释需求代码组织清晰关注点分离,职责明确逻辑复用,避免重复代码模块化结构便于团队协作业务逻辑扩展基于数据库类型扩展业务类型添加非数据库字段和计算属性处理复杂数据结构如树形组织全链路类型保障从数据库到 UI 的一致性保证API 请求和响应类型明确状态和组件的类型匹配适应变更的能力数据库变更时简单更新类型类型错误提前暴露潜在问题重构时可靠的类型检查支持。

weixin_44903776的博客 1093

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Dashibase Insert:基于Vue、Tailwind和Supabase的表单构建工具

Dashibase Insert:基于Vue、Tailwind和Supabase的表单构建工具 Dashibase Insert 是一个开源项目,旨在为 Supabase 用户提供一个类似Notion风格的表单构建器。该项目主要使用Vue.js、Tailwind CSS 和 Supabase 技术构建。 项目基础介绍 Dashibase Insert 的设计灵感来源于Notion和Tally,它允...

gitblog_00928的博客 724

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Supabase Ionic Vue 用户管理实战:魔法链接登录、个人资料与头像上传全流程

> 本文基于仓库示例 [ionic-vue-user-management/README.md](https://link.gitcode.com/i/c459f8a4b93cb62c15fa04a6c1b6510a) 编写,并结合 [示例源码](https://link.gitcode.com/i/0d0367d349895f852ee6bb77a8f85f89) 逐步拆解。目标读者是希望在 I

gitblog_00282的博客 465

前端秒变全栈:Vue3 + Supabase 三小时交付完整应用,后端一行不写

"我只写前端,后端怎么办?"这是无数 Vue 开发者在个人项目、独立出海、内部工具、黑客松 Demo 上反复撞见的墙。传统方案要么引入 Node 服务端把工程复杂度翻倍,要么使用云函数把逻辑拆得七零八落,要么退回 Firebase 接受锁死生态和 SQL 能力阉割。 Supabase 给出的答案是另一条路:**让 PostgreSQL 自己成为后端**。它把数据库、REST API、实时订阅、认

gitblog_00328的博客 27

前端秒变全栈:Vue3 遇上 Supabase,三小时交付完整应用,后端一行不用写

以前做一个小应用,最头疼的是什么?不是界面好不好看,而是"后端没人写"。数据库要建表、接口要设计、登录注册要搞验证码、文件上传要开存储……光是把这一堆"地基"打起来,两三个后端程序员加班一周都不一定收工。更别提小团队里,前端写页面的人,看着后端接口天天改来改去,恨不得原地改行。 可现在,网上越来越多的人在晒同一个操作:**一个只会写前端的程序员,用 Vue3 配上 Supabase,一个下午就交

gitblog_00519的博客 64

Vue3 + Supabase + AI SQL 做一个可二开的企业后台:车辆管理、TMS 运输系统都内置了

它最开始是一个基于 Vue 3、TypeScript、Element Plus 和 Supabase 的现代化后台管理模板,目标是让开发者可以更快搭建企业级管理系统:不用从登录、权限、菜单、表格、表单、字典、附件、主题配置这些基础能力重新开始。也就是说,它现在更像是一个“可直接二次开发的 Supabase 企业应用样板工程”。

qq_26690385的博客 314

基于 Supabase 与 Vue 3 构建用户管理应用:Magic Link 登录、数据库与头像存储全流程实战

VITE_SUPABASE_PUBLISHABLE_KEY=你的 Publishable Key ``` 两点需要注意: - 只有以 `VITE_` 前缀开头的变量才会被 Vite 暴露给客户端代码; - 这里使用的是 **Publishable Key(发布用公钥)而非 Service Role Key**——Service Role Key 可以绕过行级安全策略(RLS),绝不能出现在浏览

gitblog_00053的博客 450

使用Supabase的React Hook - use-supabase

使用Supabase的React Hook - use-supabase 1. 项目介绍 use-supabase 是一个简单的零依赖性包,它通过React Hook为您提供访问Supabase客户端的能力。Supabase是一个开源的替代方案,提供了PostgreSQL数据库、实时订阅、身份验证等功能,非常适合构建现代的全栈应用程序。 2. 项目快速启动 首先,您需要在项目中安装use-supa...

gitblog_00520的博客 391

Nuxt Supabase 模块使用教程

Nuxt Supabase 模块使用教程 1. 项目介绍 Nuxt Supabase 模块是一个为 Nuxt.js 框架设计的 Supabase 集成模块。Supabase 是一个开源的 Firebase 替代品,提供了一个基于 PostgreSQL 的数据库,支持实时数据同步、身份验证等功能。Nuxt Supabase 模块使得在 Nuxt.js 项目中集成 Supabase 变得更加简单和高效...

gitblog_00087的博客 1259

探索Dashibase Insert:打造Supabase上的Notion风格表单构建器

探索Dashibase Insert:打造Supabase上的Notion风格表单构建器 在数字化时代,高质量的表单设计是任何应用程序或网站不可或缺的一部分。今天,我们要向您介绍一款旨在改变游戏规则的开源工具——Dashibase Insert,它将Notion的魅力和易用性带入了Supabase的世界。 项目介绍 Dashibase Insert,一个灵感来源于Notion与Tally的创新之作...

gitblog_00053的博客 888

nuxt-supabase:为Nuxt应用提供Supabase数据库集成方案

nuxt-supabase:为Nuxt应用提供Supabase数据库集成方案 项目介绍 nuxt-supabase 是一个基于 Nuxt 框架的开源模块,它为开发者提供了一种简单便捷的方式,将 Supabase 数据库服务集成到 Nuxt 应用中。通过这个模块,你可以轻松地使用 Supabase 提供的实时数据库、认证、存储和其他功能,为你的应用添加数据管理功能。 项目技术分析 nuxt-supa...

gitblog_00005的博客 375

Dashibase: 超简易的Supabase用户仪表板搭建指南

Dashibase是一款专为Supabase用户设计的轻量级仪表板构建工具。它提供了一个简洁的方式来创建用户界面,包括但不限于美丽的预设主题(光明与黑暗模式)、CRUD操作界面(卡片和表格视图)、表单验证、优雅的登录与注册页面等。通过一个简单的JSON配置文件,开发者可以迅速定制自己的仪表板。该项目遵循GPL-3.0许可协议,鼓励社区参与贡献。 ## 2. 项目快速启动 ### 步骤一:克隆仓

gitblog_00988的博客 605
上一篇: 关于mapper查询数据库返回数据的思考
下一篇: Vue + Supabase 有关docker的使用说明
草根研究生
博客等级 码龄5年 12粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值