PocketBase 做一个本地低代码后台:手机表单和文件上传跑通后,用 cpolar 给产品临时验收
PocketBase 做一个本地低代码后台手机表单和文件上传跑通后用 cpolar 给产品临时验收有些 Demo 不值得起一套 Spring Boot Vue也不想为了一个临时表单去申请 SaaS。我的做法更粗暴PocketBase 单文件启动本机把 collection、字段、上传和权限跑通再用 cpolar 给产品一个临时 HTTPS 地址让他直接拿手机验收。这篇只做一件事把 PocketBase 当成一个本地低代码后台跑通新增、查询、文件上传和基础权限。验收结束就关隧道不把本机长期挂到公网。这类场景PocketBase 很合适PocketBase 本质上是一个单文件后端自带 SQLite、Admin UI、Auth、Collection、REST API、文件存储。它不像 NocoDB 那样主打表格协作也不是 Appsmith 那种内部工具面板更不是 Directus CMS。我最喜欢它的一点是本地原型特别快。比如要给产品验收一个“线索收集表”字段里有姓名、手机号、备注、附件截图。正常写后端要建项目、连库、写接口、处理上传、配权限PocketBase 里点几个字段接口和上传就出来了。这篇用 macOS/Linux 命令演示Windows 也一样下载对应压缩包后执行pocketbase.exe serve即可。端口使用 PocketBase 默认的8090cpolar 只转发这个端口。下载并启动 PocketBase先新建一个演示目录避免把它和别的项目混在一起mkdir -p ~/demo/pb-feedback cd ~/demo/pb-feedback到 PocketBase 官网下载对应系统的 release 包。macOS Apple Silicon 可以用类似下面的方式版本号按官网最新稳定版替换curl -L -o pocketbase.zip \ https://github.com/pocketbase/pocketbase/releases/download/v0.23.12/pocketbase_0.23.12_darwin_arm64.zip unzip pocketbase.zip chmod x pocketbaseLinux x64 可以换成curl -L -o pocketbase.zip \ https://github.com/pocketbase/pocketbase/releases/download/v0.23.12/pocketbase_0.23.12_linux_amd64.zip unzip pocketbase.zip chmod x pocketbase启动服务./pocketbase serve --http127.0.0.1:8090我这里故意绑定127.0.0.1意思是只允许本机访问。后面要给外部手机验收也通过 cpolar 转发这个本地端口而不是让 PocketBase 直接监听0.0.0.0。启动后终端会看到类似地址Server started at http://127.0.0.1:8090 REST API: http://127.0.0.1:8090/api/ Admin UI: http://127.0.0.1:8090/_/浏览器打开http://127.0.0.1:8090/_/第一次进入会要求创建 Admin。这里用一个只给本次演示使用的邮箱和强密码别用生产密码也别把密码写进聊天群。建一个 feedback collection进入 Admin 后左侧选择 Collections新建一个feedbackcollection。类型选 Base collection 就够了它适合公开表单、匿名反馈、测试数据这类场景。字段我建议这样建字段名类型说明nameText提交人姓名设为必填phoneText手机号或测试联系方式演示环境用假数据messageText反馈内容设为必填attachmentFile上传截图或附件允许 1 个文件statusSelect状态选项为 new、reviewed默认 newattachment字段可以限制文件类型比如只允许image/png,image/jpeg,application/pdf文件大小也建议限制一下例如 5MB。Demo 阶段别让别人随手传几十 MB 的视频把本机磁盘打满。status字段用于后续内部处理不建议让手机表单提交时随便改。我们可以在前端不传它PocketBase 使用默认值new。配基础权限别一上来全放开PocketBase 每个 collection 都有 API Rules。为了让产品手机端能匿名新增和查询演示数据可以先配成下面这样规则配置List/Search rule空字符串View rule空字符串Create rule空字符串Update rulerequest.auth.id ! Delete rulerequest.auth.id ! 这里的“空字符串”不是随便写一个空格而是规则输入框留空。它表示允许公开访问该动作。这样配置后未登录用户可以新增、列表查询、查看详情但不能更新和删除。对临时验收来说这个边界比较清楚产品能在手机上提交、刷新看到结果但不会误删数据。如果你的验收数据不允许公开查询那就把 List/View 也改成需要登录或者单独建一个测试账号。本文为了让手机验收链路最短采用公开读写新增的 Demo 配置但只放测试数据。血泪教训不要为了省事把所有规则都留空。Create 可以开放Update/Delete 不要开放。否则别人拿到地址后可以直接改掉或删掉你的测试记录。用 REST API 先跑通新增在做 H5 页面前先用 curl 验证 API。新增一条不带文件的数据curl -X POST http://127.0.0.1:8090/api/collections/feedback/records \ -H Content-Type: application/json \ -d { name: 测试用户A, phone: 13800000000, message: 手机端表单基础字段验收, status: new }返回里会有id、created、updated等字段。再查列表curl http://127.0.0.1:8090/api/collections/feedback/records?sort-created如果能看到刚才的数据collection 和基础权限就通了。再试一下文件上传。准备一张测试图比如test.png然后执行curl -X POST http://127.0.0.1:8090/api/collections/feedback/records \ -F name测试用户B \ -F phone13900000000 \ -F message带附件上传的反馈 \ -F statusnew \ -F attachment./test.pngPocketBase 的文件字段走multipart/form-data。上传成功后记录里会出现attachment文件名。文件访问路径一般是这种格式/api/files/feedback/{recordId}/{filename}在 Admin UI 里点开这条记录也能看到上传文件。这一步很关键别跳过。很多 Demo 现场翻车不是接口没通而是文件字段类型、大小限制或权限没提前测。写一个最小 H5 表单只用 API 验收不够产品一般还是希望拿手机点一下。所以我们写一个最小index.html直接放在本地目录里打开即可。新建文件cat index.html EOF !doctype html html langzh-CN head meta charsetutf-8 / meta nameviewport contentwidthdevice-width, initial-scale1 / titlePocketBase 手机反馈验收/title style body { font-family: -apple-system, BlinkMacSystemFont, sans-serif; padding: 20px; max-width: 680px; margin: auto; } label { display: block; margin-top: 14px; font-weight: 600; } input, textarea, button { width: 100%; box-sizing: border-box; margin-top: 6px; padding: 10px; font-size: 16px; } textarea { min-height: 100px; } button { margin-top: 18px; border: 0; border-radius: 8px; background: #111827; color: white; } .item { border: 1px solid #ddd; border-radius: 8px; padding: 12px; margin-top: 12px; } .muted { color: #666; font-size: 13px; } /style /head body h2PocketBase 反馈表单验收/h2 form idform label姓名/label input namename required placeholder测试用户A / label手机号/label input namephone placeholder13800000000 / label反馈内容/label textarea namemessage required placeholder这里填写测试反馈/textarea label附件截图/label input nameattachment typefile acceptimage/png,image/jpeg,application/pdf / button typesubmit提交反馈/button /form h3最新提交/h3 div idlist classmuted加载中.../div script const PB_BASE location.origin.includes(8090) ? http://127.0.0.1:8090 : location.origin; async function loadList() { const res await fetch(${PB_BASE}/api/collections/feedback/records?sort-createdperPage10); const data await res.json(); const list document.querySelector(#list); list.innerHTML ; for (const row of data.items || []) { const fileUrl row.attachment ? ${PB_BASE}/api/files/feedback/${row.id}/${row.attachment} : ; const div document.createElement(div); div.className item; div.innerHTML strong${row.name || 匿名}/strong div${row.message || }/div div classmuted${row.phone || } ${row.created}/div ${fileUrl ? diva href${fileUrl} target_blank查看附件/a/div : } ; list.appendChild(div); } } document.querySelector(#form).addEventListener(submit, async (e) { e.preventDefault(); const fd new FormData(e.target); fd.append(status, new); const res await fetch(${PB_BASE}/api/collections/feedback/records, { method: POST, body: fd }); if (!res.ok) { alert(提交失败 await res.text()); return; } e.target.reset(); await loadList(); alert(提交成功); }); loadList(); /script /body /html EOF这里有个小设计如果页面是通过http://127.0.0.1:8090或 cpolar 入口访问就让 API 走同源地址。这样手机打开 cpolar 的 HTTPS 地址时请求也会打到同一个 PocketBase 服务不需要额外配置前端服务器。要让 PocketBase 托管这个 HTML可以把它放进pb_public目录mkdir -p pb_public mv index.html pb_public/index.htmlPocketBase 会把pb_public作为静态目录。现在本机打开http://127.0.0.1:8090/你应该能看到表单。提交一条带图片的数据再刷新列表能看到新增记录和附件链接。用 cpolar 开一个临时 HTTPS 入口本地链路通了再给产品或测试同事一个手机可访问地址。安装并登录 cpolar 后执行cpolar http 8090终端会输出一个 HTTPS 地址形如https://xxxx.cpolar.top把这个地址发给产品让他用手机浏览器打开https://xxxx.cpolar.top/验收清单建议直接写清楚别让对方自由发挥打开手机表单页面新增一条反馈上传一张截图或 PDF刷新后能看到最新记录点开附件可以预览或下载尝试修改/删除记录应该不允许Admin UI 只由开发本人本机使用不给外部人员账号。如果产品要看后台记录建议你共享屏幕或导出测试数据不要把 Admin 账号直接发出去。临时验收看的是链路不是把管理权限交出去。验收时最容易忽略的权限问题我建议你专门测一下 Update/Delete。PocketBase 的 REST API 路径很直白别人拿到记录 ID 后可以尝试请求curl -X PATCH http://127.0.0.1:8090/api/collections/feedback/records/RECORD_ID \ -H Content-Type: application/json \ -d {message:我试图修改这条记录}如果规则配置正确未登录请求会被拒绝。删除也是一样curl -X DELETE http://127.0.0.1:8090/api/collections/feedback/records/RECORD_ID这一步不是找麻烦而是防止“链接发出去之后测试数据被别人改掉”。Demo 可以简单但权限边界不能糊。如果你需要让产品登录后才能查看列表可以用 PocketBase 的 Auth collection 建一个测试用户再把 List/View rule 改成request.auth.id ! 对应前端再加登录接口。本文为了控制篇幅不展开完整登录页。真实项目里我更推荐把查询和管理动作收回到登录态下只把 Create 暂时开放。安全边界要提前说清楚这类本地临时验收最怕两件事一是把生产数据拿来演示二是把本机不该暴露的东西顺手暴露出去。我的底线是下面这些只使用测试数据不放真实手机号、客户资料、合同、身份证、内部截图cpolar 只转发8090这个 PocketBase Web/API 端口不暴露宿主机目录、SQLite 数据库文件、pb_data、服务器 shell不暴露 Admin 密码不把 Admin 账号发给外部验收人员不开放 MySQL、Redis、SSH、Docker 面板等其他开发端口验收结束马上关闭 cpolar 进程长期环境要改成正式鉴权、正式域名、HTTPS 证书、权限策略、备份和日志审计。PocketBase 的数据默认在当前目录的pb_data里。这个目录不要拿来做静态文件目录也不要通过其他文件服务暴露出去。SQLite 文件不是给别人下载的Admin 密码也不是验收材料。关闭临时入口很简单在运行 cpolar 的终端按Ctrl CPocketBase 也可以按Ctrl C停掉。验收结束后如果不再需要这批数据可以整个演示目录打包归档或删除。写在最后PocketBase 适合解决一种很具体的问题我现在就需要一个能新增、能查、能上传文件、能用 REST API 对接的小后端而且希望今天就给产品在手机上验收。它不是万能低代码平台也不应该被拿来绕过正式后端设计。但在原型、内测、表单、文件上传 Demo 这些场景里单文件启动、Admin UI 配 collection、REST API 直接可用确实很省时间。我的建议是本地开发大胆用临时验收短时开生产上线认真收口。只要边界守住PocketBase cpolar 这个组合会非常顺手。

相关新闻

高级RAG技术:工业级检索增强生成实战解析

高级RAG技术:工业级检索增强生成实战解析

1. 项目概述:当RAG遇上工业级需求在构建生产级AI应用时,基础的检索增强生成(RAG)框架往往面临三大挑战:冗余信息干扰回答质量、检索结果排序不合理、单一检索路径导致召回不足。这正是我们引入LangChain4j高级RAG技术栈…

2026/7/25 10:22:56阅读更多 →
AI+OCR技术实现智能名片识别与管理

AI+OCR技术实现智能名片识别与管理

1. 项目概述:当纸质名片遇上AI识别 每次展会或商务会议结束后,我的西装口袋里总会塞满各种纸质名片。这些五颜六色的小卡片最终归宿往往是办公桌抽屉的某个角落,等到真正需要联系时,要么找不到,要么发现信息早已过期。…

2026/7/25 10:22:56阅读更多 →
MySQL DELETE操作后磁盘空间不释放的原理与解决方案

MySQL DELETE操作后磁盘空间不释放的原理与解决方案

MySQL的DELETE操作在日常数据库维护中非常常见,但很多开发者发现执行DELETE后磁盘空间并没有立即释放,这个问题在面试中也经常被问到。今天我们就来彻底解析MySQL DELETE操作背后的存储机制,以及为什么删除数据后磁盘空间不释放。 1. MySQL…

2026/7/25 10:22:56阅读更多 →
利用Taotoken的模型广场为特定任务选择性价比最优的大模型

利用Taotoken的模型广场为特定任务选择性价比最优的大模型

利用Taotoken的模型广场为特定任务选择性价比最优的大模型 当你面对一个具体的AI任务,例如需要生成一份会议纪要的摘要,或是为一段复杂逻辑编写Python代码,直接选用哪个大模型往往令人犹豫。不同厂商的模型在能力、定价和响应风格上各有侧重…

2026/7/25 11:47:13阅读更多 →
2026年武装OpenAI Codex CLI:10个核心技能提升AI编码生产力

2026年武装OpenAI Codex CLI:10个核心技能提升AI编码生产力

最近在团队里推广 OpenAI Codex CLI 时,发现很多同事安装完就直接开用,结果在复杂任务中频繁遇到效率瓶颈、方向跑偏甚至安全风险。这让我意识到,一个强大的 AI 编码助手,其上限不仅取决于模型本身,更取决于你如何“武装”它。就像给一个顶级程序员配备了趁手的 IDE、强大…

2026/7/25 11:47:13阅读更多 →
SubtitleEdit 终极指南:免费开源字幕编辑软件从入门到精通

SubtitleEdit 终极指南:免费开源字幕编辑软件从入门到精通

SubtitleEdit 终极指南:免费开源字幕编辑软件从入门到精通 【免费下载链接】subtitleedit the subtitle editor :) 项目地址: https://gitcode.com/gh_mirrors/su/subtitleedit 你是否曾为视频字幕制作而烦恼?面对不同格式的字幕文件、音画不同步…

2026/7/25 11:47:13阅读更多 →
YOLOv8工业级应用:VisionForgeSDK实战与优化

YOLOv8工业级应用:VisionForgeSDK实战与优化

1. 项目概述 VisionForgeSDK是一款基于YOLOv8目标检测算法构建的计算机视觉开发工具包。作为新一代AI视觉检测解决方案,它主要面向工业质检、安防监控、智能零售等需要实时目标检测的场景。相比传统视觉方案,这套SDK在检测精度、推理速度和易用性方面都有…

2026/7/25 11:47:13阅读更多 →
UE4.27安卓打包全流程实战:从环境配置到疑难排错

UE4.27安卓打包全流程实战:从环境配置到疑难排错

1. 项目概述:UE4.27安卓打包的“最后一公里”挑战 如果你是一名使用虚幻引擎4.27进行移动端开发的从业者,那么从编辑器里那个光鲜亮丽的预览画面,到最终在安卓设备上成功运行的APK安装包,这中间的路程,往往比你想象的要…

2026/7/25 11:47:13阅读更多 →
YOLOv5主干网络替换为MSPANet的实践与优化

YOLOv5主干网络替换为MSPANet的实践与优化

1. 项目背景与核心价值 在目标检测领域,YOLO系列算法因其出色的实时性和准确性一直备受关注。而主干网络作为特征提取的核心部件,其性能直接决定了整个检测系统的上限。MSPANet(Multi-Scale Pyramid Attention Network)作为EAAI 2…

2026/7/25 11:45:13阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 1:01:14阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 1:01:14阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/25 1:01:14阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →