菜鸟前端 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

GitHub Copilot:Python开发者的AI助手

GitHub Copilot:Python开发者的AI助手 前言 大家好,我是第一程序员(名字大,人很菜)。作为一个非科班转码、正在学习Rust和Python的萌新,最近我开始使用GitHub Copilot。今天我想分享一下GitHub Copilot如何成为Python开发者的AI助手。 一、GitHub Copilot简介 1.1 什么是GitHub Copilot * AI编程助手:由GitHub和OpenAI合作开发的AI编程助手 * 代码生成:根据上下文自动生成代码 * 智能建议:提供智能的代码建议 * 多语言支持:支持多种编程语言,包括Python 1.2 GitHub Copilot的工作原理 * 基于GPT模型:使用OpenAI的GPT模型 * 代码训练:在大量开源代码上训练 * 上下文理解:理解代码的上下文和意图 * 实时建议:在编写代码时实时提供建议 二、GitHub Copilot在Python开发中的应用 2.1 代码生成 示例1:生成函数

我用Openclaw + Claude搭了一套自动写作系统,每天省3小时

我用Openclaw + Claude搭了一套自动写作系统,每天省3小时

这是我目前最重要的一套AI工作流。从信息获取到发布,几乎不用手动完成。 一、为什么我要搭建这套系统? 信息过载的困境 如果你也在持续关注AI,应该会有同样的感受: 信息太多了。 每天打开 X、公众号、GitHub、技术社区,都会冒出大量新内容。 AI模型更新、工具更新、Agent框架、自动化方案…… 想跟上这些信息,本身就已经是一项工作。 手动写作的低效循环 更别说: * 整理信息 * 找选题 * 写文章 * 配图 * 发布到各个平台 如果全部手动完成,写作就会变成一件非常消耗精力的事。 我一度也在这种状态里: 想持续输出,但写作本身占用了太多时间。 一个关键问题 后来我开始思考一个问题: 如果写作这件事可以被"系统化",会发生什么? 于是,我不再把AI当成写作工具。 而是开始搭一套完整的 AI写作工作流。 二、思路转变:从优化写作到优化流程 大多数人的AI写作方式 大多数人使用AI写作,是这样:

AI无人机解锁电动自行车交通监管新路径,基于最新超图增强型自适应视觉感知YOLOv13全系列【n/s/l/x】参数模型开发构建AI无人机航拍巡检场景下电动车违规载人问题检测预警系统

AI无人机解锁电动自行车交通监管新路径,基于最新超图增强型自适应视觉感知YOLOv13全系列【n/s/l/x】参数模型开发构建AI无人机航拍巡检场景下电动车违规载人问题检测预警系统

在我国城市与乡村的大街小巷,电动自行车凭借轻便、快捷、经济的优势,成为大众出行的热门选择。然而,与之相伴的是电动自行车引发的交通事故数量居高不下,给社会和家庭蒙上了沉重的阴影。其中,单人电动车违规载人现象尤为突出,由于座位较短,载人骑行极大地增加了安全隐患,成为交通管理的一大难题。 传统监管:力不从心的困境 长期以来,电动自行车交通监管主要依赖交警现场执法。但这种方式存在明显局限性。交警的精力与时间有限,面对广阔的交通区域和庞大的电动自行车数量,难以做到全面覆盖与实时监管。而且,交警工作受时长和天气等因素制约,无法实现全天候、及时有效的管理。在早晚高峰时段,车流量大、路况复杂,违规行为频发,交警往往应接不暇,难以对每一起违规行为及时纠正,导致事故隐患长期存在。例如,在一些学校周边,放学时段电动自行车违规载人现象屡见不鲜,交警虽尽力管理,但仍有不少违规者趁乱逃脱监管,给学生的出行安全带来极大威胁。 科技赋能:无人机与AI的崛起 随着智能化技术的飞速发展,AI技术正广泛应用于传统行业,为提升效率和安全性注入新动力。在电动自行车交通监管领域,无人机技术的出现为解决传统监管难题带来

LLaMA Factory 从入门到精通,一篇讲完

LLaMA Factory 从入门到精通,一篇讲完

目录 一、LLaMA-Factory 简介 二、安装部署 三、数据微调 1、数据集的建立 2、数据集格式 3、模型参数 4、开始运行 5、导出模型 四、webui 评估预测与对话 导出 五、SFT 训练 命令行 六、LoRA 合并 合并 量化 七、推理 原始模型推理配置 微调模型推理配置 多模态模型 批量推理 八、评估 通用能力评估 NLG 评估 评估相关参数 一、LLaMA-Factory 简介 LLaMA Factory 是一个简单易用且高效的大型语言模型(Large