菜鸟前端 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 随身带!OpenClaw+cpolar 外网访问完整教程

私人 AI 随身带!OpenClaw+cpolar 外网访问完整教程

前言 在人人都用 AI 的时代,拥有一台完全私有、本地运行、数据不泄露的私人 AI,已经成为很多人的刚需。OpenClaw 就是这样一款宝藏工具,可绝大多数人都用错了方式 —— 只把它放在家里电脑上,出门就用不了。结果就是:部署时兴致勃勃,用几天后慢慢闲置,明明花了时间搭建,却没能发挥一半价值。我自己踩过这个坑,也试过各种办法突破局域网限制,要么配置复杂,要么不稳定,直到遇见 cpolar。它能轻松把本地服务映射到公网,安全加密、多平台兼容、新手友好。把 OpenClaw 和 cpolar 组合在一起,就等于把私人 AI 装进口袋,上班、出差、旅行,只要有网就能用。这篇文章不讲难懂原理,只给可直接复制的操作,带你从零完成外网访问,让私人 AI 真正随身带、随时用。 1 OpenClaw和cpolar是什么?

IntelliJ IDEA AI Assistant 携带OpenCode保姆级安装教程来了

IntelliJ IDEA AI Assistant 携带OpenCode保姆级安装教程来了

01 引言 AI Assistant 是 JetBrains 官方推出的 AI 驱动插件,专为软件开发设计。但是之前由于需要订阅才能使用,安装了之后又卸载了。 上一节简单介绍了一下IDEA 2026.1的简单功能,没有实际使用AI Assistant推出的ACP自定义模型。本节将通过安装opencode了解其使用过程。 02 安装 安装上一节已经介绍了,这里不在赘述。但是在安装过程中可能会出现一些问题。 2.1 安装后无法使用 明显显示已经安安装好了,几乎秒级安装,怎么感觉都有点离谱。 但是在对话框无法使用,无法发出信息,也没有选择模型的地方。 其实这个时候是后台在下载opencode的安装包,只不过界面没有明确的提示。可能由于网络原因下载失败,导致对话框无法使用。如果有网络原因,也可以从GitHub手动下载。 真正下载完成之后保存的位置: C:\Users\{user.name}\AppData\Local\JetBrains\acp-agents\.downloads\opencode 重启IDEA编辑器,

亚马逊云科技 EC2 部署 Dify,集成 Amazon Bedrock 构建生成式 AI 应用

亚马逊云科技 EC2 部署 Dify,集成 Amazon Bedrock 构建生成式 AI 应用

亚马逊云科技 EC2 部署 Dify,集成 Amazon Bedrock 构建生成式 AI 应用 文章目录 * 亚马逊云科技 EC2 部署 Dify,集成 Amazon Bedrock 构建生成式 AI 应用 * 前言 * 前提准备:亚马逊云科技注册流程 * Step.1 登录官网 * Step.2 选择账户计划 * Step.3 填写联系人信息 * Step.4 绑定信息 * Step.5 电话验证 * Step.6 售后支持 * Dify 集成 Amazon Bedrock 构建生成式 AI 应用 * Amazon

2025 AI数据准备:EasyLink让多模态非结构化数据处理变简单

2025 AI数据准备:EasyLink让多模态非结构化数据处理变简单

一、前言 在数据驱动的时代,企业每天被PDF、财报、合同、研究报告等海量文档所淹没。这些非结构化的多模态数据中蕴藏着关键业务洞察,却因格式复杂、版式多样、信息分散,成为难以开采的暗数据。研究人员仍需逐页翻查论文,分析师依旧通宵解析百页报表——传统处理方式不仅效率低下,更在规模面前显得无力。 随着大模型的普及,许多人期待它能自动化解这一困境。然而现实却揭示出一个严峻挑战:即使是当前最先进的视觉大模型,在面对复杂版式文档、混排图表与密集文本时,其识别准确率仍与专业非结构化数据处理工具存在显著差距。 一项全面测评显示,通过在多个OCR方法中探索中小模型的参数量、计算量、数据量对于精度的影响,成功证明了OCR领域在这三个维度存在Power-Law规律。 这些研究成果表明,OCR技术在提升多模态大模型性能方面发挥着关键作用,尤其是在处理复杂的视觉问答任务时。我们的工作不仅推动了OCR技术的发展,也为多模态大模型的应用提供了新的视角。 正式研究人员的不断努力,EasyLink团队致力于从数据源头破解这一难题。通过行业领先的智能文档解析与图表理解技术,为多模态大模型提供清洁、结构化