菜鸟前端 cursor 全栈开发 app 的踩坑分享(四、配置后端Firebase,前后端闭环)

菜鸟前端 cursor 全栈开发 app 的踩坑分享(四、配置后端Firebase,前后端闭环)

一、Firebase新建项目

1. 控制台新建项目
2. 项目内新建应用
这一步是为了获取真实配置,放在FirebaseOptions文件中

我目前用Chrome 浏览器运行 Flutter 项目,所以先新建web端

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
3. 新建数据库
  • 新建库,数据库位置选择相近的地理位置就可以
  • 修改数据库规则

以测试模式开始

在这里插入图片描述
为了数据安全,数据库的规则只能写入数据,但无法加载和展示已添加的记录,为了在测试阶段能正常读,临时修改规则为允许所有读写(仅用于测试,上线前务必改回)
rules_version ='2';service cloud.firestore { match /databases/{database}/documents { match /{document=**}{ allow read, write: iftrue;}}}
在这里插入图片描述

二、配置Firebase并关联项目

在上一章已经完成了 Flutter 前端项目的搭建,现在要把「后端逻辑」整合到项目中,同时关联 Firebase 控制台的项目,核心思路是:Flutter 项目中集成 Firebase SDK → 编写后端逻辑(Firebase 云函数 / 数据库操作)→ 统一管理在 Cursor 中。
1. 安装 Firebase CLI(本地操作 Firebase 的工具)
  • 终端执行以下命令安装 Firebase CLI(需先安装 Node.js,若未安装先执行 winget install OpenJS.NodeJS
npminstall -g firebase-tools 

验证安装:执行 firebase --version,能显示版本号即成功。

在这里插入图片描述
2. 登录 Firebase
如果你也科学上网,登录前的两个步骤非常重要:
  • 在终端中设置临时环境变量,让 Firebase CLI 正确走代理:
sethttp_proxy=http://127.0.0.1:18081 sethttps_proxy=http://127.0.0.1:18081 setNODE_TLS_REJECT_UNAUTHORIZED=0
18081的位置填入本机端口
  • 终端执行新登录命令:
正常这里执行firebase login,但开启代理后,本地回调链路被代理阻断,所以更改命令:
firebase login --no-localhost 

把code码复制到终端,搞定

在这里插入图片描述

在弹出的谷歌窗口中登录cli,复制终端中的链接在谷歌打开

在这里插入图片描述
3. 关联项目这个步骤要尽快做,授权超时需要重新登陆
  • 登录后,在 Flutter 项目根目录执行命令
Flutter项目根目录不仅能放前端代码,也能作为Firebase后端代码的管理日录,这是Firebase推荐的「前后端代码一体化管理」方式
firebase init 
选择要初始化的功能:按空格选中 Firestore(数据库)、Functions(云函数,后端代码)、Hosting(可选,部署用);
选择 Firebase 项目:找到并选中 MyLearningApp(控制台新建的项目);
其他选项:全部选默认(按回车即可),无需自定义。
4. 关联授权Git仓库
  • 授权仓库
  • push代码到远端仓库
# 1. 初始化本地 Git 仓库(如果还没初始化)git init # 2. 关联新的 GitHub 远程仓库(替换成你复制的新仓库地址)git remote add origin https://github.com/M233333223/my-learning-app.git # 3. 把 Firebase 初始化生成的所有文件加入暂存区gitadd.# 4. 提交文件(备注信息可自定义)git commit -m "Initial commit: Flutter + Firebase configuration"#5. 创建主分支git checkout -b main # 6. 推送代码到新仓库的 main 分支(第一次推送加 -u 关联分支)git push -u origin main 
  • 验证部署效果,终端运行
flutter build web --release firebase deploy 

三、在 Cursor 中创建 Firebase 后端代码

1. 编写 Firestore 数据库操作
  • 打开 pubspec.yaml,在 dependencies 中添加:
dependencies:flutter:sdk: flutter dio: ^5.4.3+1 firebase_core: ^3.4.1 # Firebase 核心依赖(必须)cloud_firestore: ^5.3.1 # Firestore 数据库依赖
  • 执行命令安装依赖
flutter pub get 
  • 初始化 Firebase 并编写数据库操作代码
在 lib/ 下新建 utils/firebase_service.dart(后端逻辑工具类),粘贴以下代码:
此处的options中配置需要回到第一步中,复制控制台中的真实数据替换到代码中
import'package:firebase_core/firebase_core.dart';import'package:cloud_firestore/cloud_firestore.dart';import'package:flutter/foundation.dart';// 初始化 Firebase(App 启动时调用)Future<void>initFirebase()async{try{awaitFirebase.initializeApp(// 若本地未自动生成配置文件,需从 Firebase 控制台复制你的配置 options:constFirebaseOptions( apiKey:"你的 API Key",// 从 Firebase 控制台 → 项目设置 → 通用 → Web 应用获取 authDomain:"mylearningapp.firebaseapp.com",// 替换为你的项目域名 projectId:"mylearningapp",// 替换为你的项目 ID(控制台项目设置中看) storageBucket:"mylearningapp.appspot.com", messagingSenderId:"你的 Sender ID", appId:"你的 App ID",),);if(kDebugMode){print("Firebase 初始化成功!关联项目:MyLearningApp");}}catch(e){if(kDebugMode){print("Firebase 初始化失败:$e");}}}// Firestore 数据库操作示例(增删改查)classFirestoreService{// 1. 添加数据(比如保存学习记录)Future<void>addLearningRecord(String title,String content)async{try{awaitFirebaseFirestore.instance .collection("learning_records")// 集合名(类似数据库表名).add({"title": title,"content": content,"create_time":Timestamp.now(),// 时间戳});if(kDebugMode){print("学习记录添加成功!");}}catch(e){if(kDebugMode){print("添加失败:$e");}}}// 2. 获取所有学习记录Stream<QuerySnapshot>getLearningRecords(){returnFirebaseFirestore.instance .collection("learning_records").orderBy("create_time", descending:true).snapshots();// 实时监听数据变化}// 3. 删除学习记录Future<void>deleteLearningRecord(String docId)async{try{awaitFirebaseFirestore.instance .collection("learning_records").doc(docId).delete();if(kDebugMode){print("记录删除成功!");}}catch(e){if(kDebugMode){print("删除失败:$e");}}}}

四、demo页面测试接口

1. 写一个简易页面
  • 修改 lib/main.dart 文件
import'package:flutter/material.dart';import'package:cloud_firestore/cloud_firestore.dart';import'utils/firebase_service.dart';voidmain()async{WidgetsFlutterBinding.ensureInitialized();awaitinitFirebase();// 初始化 Firebase(已替换真实配置)runApp(constMyApp());}classMyAppextendsStatelessWidget{constMyApp({super.key});@overrideWidgetbuild(BuildContext context){returnMaterialApp( title:'MyLearningApp', theme:ThemeData(primarySwatch:Colors.blue), home:constLearningRecordPage(),// 跳转到测试页面);}}// 测试页面:包含添加/展示学习记录的功能classLearningRecordPageextendsStatefulWidget{constLearningRecordPage({super.key});@overrideState<LearningRecordPage>createState()=>_LearningRecordPageState();}class _LearningRecordPageState extendsState<LearningRecordPage>{finalFirestoreService _firestoreService =FirestoreService();finalTextEditingController _titleController =TextEditingController();finalTextEditingController _contentController =TextEditingController();// 点击按钮添加学习记录void_addRecord(){String title = _titleController.text.trim();String content = _contentController.text.trim();if(title.isNotEmpty){ _firestoreService.addLearningRecord(title, content);// 清空输入框 _titleController.clear(); _contentController.clear();// 提示添加成功ScaffoldMessenger.of(context).showSnackBar(constSnackBar(content:Text('学习记录添加成功!')),);}else{ScaffoldMessenger.of(context).showSnackBar(constSnackBar(content:Text('标题不能为空!')),);}}@overrideWidgetbuild(BuildContext context){returnScaffold( appBar:AppBar(title:constText('MyLearningApp 测试')), body:Padding( padding:constEdgeInsets.all(16.0), child:Column( children:[// 输入框:填写学习记录标题和内容TextField( controller: _titleController, decoration:constInputDecoration( labelText:'学习记录标题', hintText:'比如:Flutter 集成 Firebase', border:OutlineInputBorder(),),),constSizedBox(height:10),TextField( controller: _contentController, maxLines:3, decoration:constInputDecoration( labelText:'学习记录内容', hintText:'比如:完成了 Firebase 初始化', border:OutlineInputBorder(),),),constSizedBox(height:20),// 添加记录按钮ElevatedButton( onPressed: _addRecord, child:constText('添加学习记录'), style:ElevatedButton.styleFrom( minimumSize:constSize(double.infinity,50),),),constSizedBox(height:20),constText('已添加的学习记录:', style:TextStyle(fontSize:16, fontWeight:FontWeight.bold)),constSizedBox(height:10),// 实时展示数据库中的学习记录Expanded( child:StreamBuilder<QuerySnapshot>( stream: _firestoreService.getLearningRecords(),// 监听数据库变化 builder:(context, snapshot){// 处理加载/错误状态if(snapshot.connectionState ==ConnectionState.waiting){returnconstCenter(child:CircularProgressIndicator());}if(snapshot.hasError){returnCenter(child:Text('加载失败:${snapshot.error}'));}// 获取数据列表final records = snapshot.data?.docs ??[];if(records.isEmpty){returnconstCenter(child:Text('暂无学习记录,点击按钮添加吧!'));}// 展示记录列表returnListView.builder( itemCount: records.length, itemBuilder:(context, index){var record = records[index];Map<String,dynamic> data = record.data()asMap<String,dynamic>;returnListTile( title:Text(data['title']??'无标题'), subtitle:Column( crossAxisAlignment:CrossAxisAlignment.start, children:[Text(data['content']??'无内容'),Text('添加时间:${(data['create_time'] as Timestamp).toDate().toString()}', style:constTextStyle(fontSize:12, color:Colors.grey),),],), trailing:IconButton( icon:constIcon(Icons.delete, color:Colors.red), onPressed:(){// 删除记录 _firestoreService.deleteLearningRecord(record.id);},),);},);},),),],),),);}}
  • 运行项目
flutter run -d chrome 
页面功能正常,接口跑通
在这里插入图片描述
Firebase控制台可以看到操作数据,撒花~~
不用手动启动服务,不用手动建库建表,对于一个新手来说,这一刻才体会到Firebase太香了
在这里插入图片描述

Read more

桌面级AI神器,本地大模型助手安装、配置与应用

桌面级AI神器,本地大模型助手安装、配置与应用

🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、前言:为什么需要 Chatbox 1、ChatGPT 很强,但在线服务的局限性(联网、隐私) 2、Chatbox的定位:本地、安全、轻量的多模型工具箱 二、Chatbox介绍 1、Chatbox 开源地址 2、支持的模型接口(OpenAI、Gemini、Claude、Localhost 等) 3、支持联网搜索 4、全平台支持(电脑端、⼿机端) 三、Chatbox 安装 1、PC端(Windows) 2、移动端(Android)

Stitch——Google热门的免费AI UI设计工具

Stitch——Google热门的免费AI UI设计工具

Google Stitch是谷歌在2025年I/O大会上推出的一款AI驱动的UI设计工具。它能根据文字描述或草图快速生成网页和移动端界面,并导出可用于开发的前端代码,并且可以直接与另一个前端AI编码工具AI Studio直接联动,将生成的UI发给AI Studio进行开发。 访问方式与要求: 1. 通过访问官网(stitch.withgoogle.com),使用谷歌账户登录即可开始使用。 2. Google Stitch并不支持全部地区,如vpn设置为中国香港也无法访问,美国地区可以使用。 使用流程: 第一步:进入官网并完成登录: 第二步:选择合适的模型: 1. 默认选择的是3 Flash,使用Gemini 3.0 Flash,生成速度较快。 2. 3 Pro模式下,优先保障高质量与推理能力,速度缓与3 Flash。 3. Redesign模式使用Nano Banana Pro重新设计现有项目,需要添加屏幕截图。 4. Ideate模式下,支持提出问题并寻找解决方案。 第三步:选择移动端或Web端并添加描述:

龙虾(OpenClaw)搭配本地千问模型(零token成本)实现电脑AI助理

龙虾(OpenClaw)搭配本地千问模型(零token成本)实现电脑AI助理

前言:现在AI助手遍地都是,但要么是云端服务要花token钱,要么是功能单一只能聊天,想找一个“不花钱、能干活、保隐私”的电脑AI助理,简直比登天!直到我发现了一个神仙组合——龙虾AI(OpenClaw)+ 本地千问模型,完美解决所有痛点:零token成本、全程本地运行、能接管电脑干活,无论是办公摸鱼还是高效产出,都能轻松拿捏。 本文是纯新手向原创实操教程,全程手把手,从工具认知、环境准备,到龙虾与本地千问的联动配置,再到实战场景演示,每一步都标清重点、避开坑点,不用懂复杂代码,不用花一分钱,普通人跟着走,10分钟就能拥有专属本地AI电脑助理,从此告别云端token焦虑和隐私泄露风险! 一、先搞懂:为什么是“龙虾+本地千问”?核心优势碾压同类组合 在开始操作前,先跟大家说清楚两个核心工具的作用,以及为什么它们搭配起来是“王炸”——毕竟市面上AI工具那么多,选对组合才能少走弯路,真正实现“零成本、高效率”。 1. 两个核心工具,

把 OpenClaw 从局域网“解放”出来:一招实现随时随地访问你的本地 AI

把 OpenClaw 从局域网“解放”出来:一招实现随时随地访问你的本地 AI

文章目录 * 把 OpenClaw 从局域网“解放”出来:一招实现随时随地访问你的本地 AI * 前言 * 1 OpenClaw和cpolar是什么? * 1.1 OpenClaw:能装进自家电脑的 AI 大脑 * 1.2 cpolar:打破局域网限制的“任意门” * 2 下载安装cpolar * 2.1 下载cpolar * 2.3 注册及登录cpolar web ui管理界面 * 3 OpenClaw + cpolar的 N 种打开方式 * 3.1 查看家里Nas中的电影资源 * 3.2 写一个小游戏网站并分享给朋友 * 3.3 在外远程控制家里的电脑 * 4 穿透OpenClaw以支持公网访问 * 5 固定二级子域名方式