<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>大六茶</title><link>https://tealala.cn/</link><description>以前会点HTML+CSS的后端开发爱好者。</description><item><title>Playwright 介绍：现代浏览器自动化框架到底能做什么？</title><link>https://tealala.cn/?id=34</link><description>&lt;p&gt;最近经常有人把 &lt;strong&gt;Playwright&lt;/strong&gt; 写成“playweight”，但如果你关注的是浏览器自动化、端到端测试和网页操作，那么大概率想了解的其实就是 &lt;strong&gt;Playwright&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;简单说，Playwright 是一套现代浏览器自动化框架，适合做 &lt;strong&gt;Web 自动化测试&lt;/strong&gt;、&lt;strong&gt;跨浏览器验证&lt;/strong&gt;、&lt;strong&gt;页面抓取&lt;/strong&gt;，以及越来越常见的 &lt;strong&gt;AI 驱动网页操作&lt;/strong&gt;。&lt;/p&gt;

&lt;h2&gt;一、Playwright 是什么？&lt;/h2&gt;
&lt;p&gt;Playwright 由 Microsoft 推出，核心价值是：&lt;strong&gt;让开发者用代码稳定地驱动浏览器&lt;/strong&gt;。它支持 Chromium、Firefox、WebKit 三大浏览器引擎，因此不仅能验证“能不能跑”，还可以帮助团队验证“在不同浏览器下是不是都能正常跑”。&lt;/p&gt;

&lt;p&gt;它并不只是一个“点点点”的脚本工具，而是一套完整的浏览器自动化能力层。你可以用它打开页面、填写表单、点击按钮、上传文件、拦截网络请求、处理弹窗、截图、录视频、回放追踪，甚至直接把它接到测试流水线里做持续验证。&lt;/p&gt;

&lt;h2&gt;二、为什么这几年 Playwright 越来越火？&lt;/h2&gt;
&lt;p&gt;原因很直接：传统前端页面越来越复杂，单靠人工回归测试，成本太高、稳定性也不足。Playwright 解决的是“复杂页面如何被程序可靠操作”的问题。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;跨浏览器一致性更好&lt;/strong&gt;：一套脚本可以覆盖多个浏览器引擎。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对现代前端更友好&lt;/strong&gt;：面对异步渲染、单页应用、动态加载内容时，等待机制更成熟。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调试体验更强&lt;/strong&gt;：截图、录像、trace 等能力，对定位问题很有帮助。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;适合工程化接入&lt;/strong&gt;：可以放进 CI/CD，做自动回归和发布前校验。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;三、Playwright 能做什么？&lt;/h2&gt;
&lt;h3&gt;1. 端到端测试（E2E）&lt;/h3&gt;
&lt;p&gt;这是它最常见的场景。比如你有一个后台系统，登录、下单、支付、搜索、发帖、审批这些完整链路，都可以交给 Playwright 自动执行。它特别适合验证“从用户打开页面到完成关键操作”这一整条业务链。&lt;/p&gt;

&lt;h3&gt;2. 跨浏览器兼容性验证&lt;/h3&gt;
&lt;p&gt;很多问题只在某一个浏览器里出现。Playwright 能帮助团队用同一套脚本同时验证 Chromium、Firefox、WebKit，减少“我这里没问题，你那边有问题”的沟通成本。&lt;/p&gt;

&lt;h3&gt;3. 页面抓取与结构化操作&lt;/h3&gt;
&lt;p&gt;如果目标页面依赖 JavaScript 渲染，传统 HTTP 抓取往往拿不到最终内容。这时可以用 Playwright 真实加载页面，再读取 DOM、提取数据、截图或导出结果。&lt;/p&gt;

&lt;h3&gt;4. 作为 AI 浏览器操作底座&lt;/h3&gt;
&lt;p&gt;现在很多 AI Agent 想“像人一样”操作网页，本质上还是要调用浏览器自动化能力。Playwright 因为稳定、接口完整、生态成熟，已经成为很多 AI 网页执行链路中的关键组件。&lt;/p&gt;

&lt;h2&gt;四、Playwright 适合哪些人？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;前端工程师：想补齐自动化测试能力；&lt;/li&gt;
&lt;li&gt;测试工程师：想把回归测试从人工切到脚本；&lt;/li&gt;
&lt;li&gt;后端或全栈工程师：需要批量操作后台、采集页面数据；&lt;/li&gt;
&lt;li&gt;做 AI Agent 的团队：需要一个稳定的浏览器执行层。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你的工作里经常出现“这个动作能不能自动做掉”“这个页面能不能自动检查”“这个流程能不能批量跑”，那 Playwright 就非常值得上手。&lt;/p&gt;

&lt;h2&gt;五、Playwright 的优势和边界&lt;/h2&gt;
&lt;h3&gt;优势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;学习和落地成本相对可控；&lt;/li&gt;
&lt;li&gt;脚本表达能力强，适合真实业务页面；&lt;/li&gt;
&lt;li&gt;调试工具链完整，定位问题效率高；&lt;/li&gt;
&lt;li&gt;非常适合接入持续集成和自动化交付流程。&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;边界&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;如果页面有强对抗式风控、验证码、行为校验，自动化会明显变难；&lt;/li&gt;
&lt;li&gt;如果需求非常轻，只是简单抓静态 HTML，未必需要浏览器级工具；&lt;/li&gt;
&lt;li&gt;脚本再强，也不能替代对业务流程本身的理解。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;六、怎么开始学 Playwright？&lt;/h2&gt;
&lt;p&gt;一个比较务实的起点是：不要一上来就追求“大而全”，先拿自己最常操作的一个页面练手。比如登录、搜索、提交表单、发布内容、导出数据。把一个完整流程跑通，比看十篇教程更有效。&lt;/p&gt;

&lt;p&gt;从工程角度看，建议优先掌握三件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;元素定位是否稳定；&lt;/li&gt;
&lt;li&gt;等待机制是否合理；&lt;/li&gt;
&lt;li&gt;失败时能不能快速复盘。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;截至我当前本机环境实测，Playwright CLI 版本为 &lt;strong&gt;1.59.1&lt;/strong&gt;。这也说明它已经不仅仅是测试人员的工具，而是逐渐变成开发、测试、运维、AI 自动化都能共用的一层能力。&lt;/p&gt;

&lt;h2&gt;七、结语&lt;/h2&gt;
&lt;p&gt;如果你把 Playwright 只理解成“自动点网页的工具”，其实低估了它。更准确的说法是：&lt;strong&gt;它是一套把浏览器操作工程化、可复用化、可验证化的基础设施&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;对个人来说，它能帮你省时间；对团队来说，它能帮你降低回归成本；对 AI 应用来说，它能成为真正落地网页操作的执行层。&lt;/p&gt;

&lt;p&gt;所以，如果你最近正在研究浏览器自动化、自动测试，或者 AI Agent 如何真正去操作网页，Playwright 值得认真看一眼。&lt;/p&gt;</description><pubDate>Thu, 16 Apr 2026 10:15:38 +0800</pubDate></item><item><title>看人写了30年&amp;quot;代码&amp;quot;，今天我被“500个粉丝”难住了</title><link>https://tealala.cn/?id=32</link><description>&lt;p&gt;HI，老友！&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;在这个博客的一亩三分地里，咱们断断续续聊了很多年。从最早的拨号上网，到后来的移动互联，我这个在行业里“苟”了30年的老兵，一直习惯在这里碎碎念。
最近，我做了一个违背祖宗的决定（划掉）……我决定开一个微信公众号了。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;并不是博客不写了，而是我发现，在这个AI和新软件井喷的时代，我有很多短平快的好工具、很多让人“哇塞”的新发现，更适合在手机上第一时间分享给你们。
但是，现实给了我这个老兵一记响亮的耳光。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;微信公众号的认证有一个硬门槛：需要 500 个粉丝。
我想我听过 98 年的猫叫，砍过 01 年的传奇，用 FrontPage 拽过网页，甚至在大半夜定闹钟偷过菜……但我万万没想到，我竟然会被这 500 个粉丝难住了。
作为一个懂 HTML 的体面人，我不想去买僵尸粉。我觉得那样对不起我敲过的代码，更对不起还没关注我的你们。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;所以，我厚着脸皮发这篇博文，想请还在看博客的你，帮我也帮你自己一个忙：
请拿出手机，扫描下方的二维码，关注我的公众号：【吴金洲】。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;关注我，你将得到什么？
绝不讲深奥的大道理，只推荐让你“相见恨晚”的互联网神级软件。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;一个老“html程序员“的AI折腾笔记，带你优雅地偷懒。
随时可以找到我，咱们在微信里聊。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;扶我起来，我还能测！就差你了，老铁。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://tealala.cn/zb_users/upload/2025/11/202511261764096686151376.jpg&quot; alt=&quot;7957b29f9e6d734ac648706f1e088081.jpg&quot;/&gt;&lt;/p&gt;</description><pubDate>Wed, 26 Nov 2025 02:49:06 +0800</pubDate></item><item><title>绝大部分人没开始或者夭折</title><link>https://tealala.cn/?id=31</link><description>&lt;p&gt;软件是工具，不是目的。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;想赚钱首先就要摒弃程序思维，不要想着转行就是做某个领域的软件，早就不是外包做个滴滴就能起来的时代了，现在所看到的所有行业，基本都有无数人开发过各种软件，只是你不了解，或者软件并没什么用。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;如果是软件行业&lt;strong&gt;副业&lt;/strong&gt;，现在就两个：&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;一个是做独立产品，自己成立个能开发票的小公司，卖产品给公司。&lt;/p&gt;&lt;p&gt;一个是做流量起来了，然后卖课。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;方向就是这几个，几乎所有人都知道。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;区别在于很多人都试过，只有少数几个人能大成功，很多人可以小成功（&lt;span style=&quot;text-wrap-mode: wrap;&quot;&gt;这里的成功是指赚钱，大成功就是赚大钱，小成功就是赚小钱。&amp;nbsp;&lt;/span&gt;）&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;绝大部分人没开始或者夭折。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;所以需要的并不是干几年感悟来感悟去，是真的动手做起来，而且能立足开始赚钱....&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;不要让感悟只就是感悟，如果只是感悟，人一辈子都在感悟..比如我。嘿嘿。&lt;/p&gt;</description><pubDate>Mon, 17 Feb 2025 19:11:11 +0800</pubDate></item><item><title>还在傻傻的折腾半天 Ollama 安装 deepseek-r1？ServBay 1.9 一键安装各大模型</title><link>https://tealala.cn/?id=29</link><description>&lt;p style=&quot;margin: calc(var(--ds-md-zoom)*12px)0; font-size: 16.002px; line-height: var(--ds-md-line-height); color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; text-wrap-mode: wrap;&quot;&gt;还在为反复折腾 Ollama 安装命令、配置环境变量而头疼？&lt;strong&gt;ServBay 1.9&lt;/strong&gt;&amp;nbsp;的发布，彻底改变了本地 AI 模型部署的复杂流程。这款原本以“3分钟搭建 Web 开发环境”著称的工具，如今通过集成大模型管理功能，将一键式极简理念扩展至 AI 领域，成为开发者的全能助手。&lt;/p&gt;&lt;p style=&quot;margin: calc(var(--ds-md-zoom)*12px)0; font-size: 16.002px; line-height: var(--ds-md-line-height); color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; text-wrap-mode: wrap;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;h4 style=&quot;font-weight: var(--ds-font-weight-strong); font-size: 16.002px; line-height: var(--ds-md-line-height); margin: calc(var(--ds-md-zoom)*16px)0 calc(var(--ds-md-zoom)*12px)0; color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; text-wrap-mode: wrap;&quot;&gt;一、传统方式部署 DeepSeek-R1 的痛点&lt;/h4&gt;&lt;p style=&quot;margin: calc(var(--ds-md-zoom)*12px)0; font-size: 16.002px; line-height: var(--ds-md-line-height); color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; text-wrap-mode: wrap;&quot;&gt;以部署&amp;nbsp;&lt;strong&gt;DeepSeek-R1&lt;/strong&gt;&amp;nbsp;为例，传统流程需依赖 Ollama 工具，步骤繁琐：&lt;/p&gt;&lt;ol start=&quot;1&quot; style=&quot;margin: calc(var(--ds-md-zoom)*12px)0; padding-left: calc(var(--ds-md-zoom)*24px); color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 16.002px; text-wrap-mode: wrap;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;环境配置&lt;/strong&gt;：需手动安装 Ollama，调整模型存储路径（如修改 Windows 环境变量&amp;nbsp;&lt;code style=&quot;font-size: 0.875em; font-weight: var(--ds-font-weight-strong); font-family: var(--ds-font-family-code); border-radius: 4px; padding: 0.15rem 0.3rem;&quot;&gt;OLLAMA_MODELS&lt;/code&gt;），甚至需科学上网下载安装包；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;命令行操作&lt;/strong&gt;：通过&amp;nbsp;&lt;code style=&quot;font-size: 0.875em; font-weight: var(--ds-font-weight-strong); font-family: var(--ds-font-family-code); border-radius: 4px; padding: 0.15rem 0.3rem;&quot;&gt;ollama run deepseek-r1:8b&lt;/code&gt;&amp;nbsp;等命令下载模型，对新手极不友好；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;可视化界面依赖&lt;/strong&gt;：需额外安装 Chatbox 等工具，并配置 API 连接参数；&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;资源占用高&lt;/strong&gt;：模型运行需较高硬件配置（如 GPU 版本要求 RTX 2060 以上显卡），调试过程易因内存不足卡顿。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr style=&quot;height: 1px; margin: calc(var(--ds-md-zoom)*12px)0; background-image: ; background-position-x: ; background-position-y: ; background-size: ; background-repeat: ; background-attachment: ; background-origin: ; background-clip: ; border: none; color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 16.002px; text-wrap-mode: wrap;&quot;/&gt;&lt;h4 style=&quot;font-weight: var(--ds-font-weight-strong); font-size: 16.002px; line-height: var(--ds-md-line-height); margin: calc(var(--ds-md-zoom)*16px)0 calc(var(--ds-md-zoom)*12px)0; color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; text-wrap-mode: wrap;&quot;&gt;二、ServBay 1.9 的颠覆性革新&lt;/h4&gt;&lt;p style=&quot;margin: calc(var(--ds-md-zoom)*12px)0; font-size: 16.002px; line-height: var(--ds-md-line-height); color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; text-wrap-mode: wrap;&quot;&gt;&lt;strong&gt;ServBay 1.9&lt;/strong&gt;&amp;nbsp;将 AI 模型部署与开发环境管理深度融合，实现“开箱即用”：&lt;/p&gt;&lt;ol start=&quot;1&quot; style=&quot;margin: calc(var(--ds-md-zoom)*12px)0; padding-left: calc(var(--ds-md-zoom)*24px); color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 16.002px; text-wrap-mode: wrap;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;一键安装模型&lt;/strong&gt;&lt;br/&gt;内置模型库支持&amp;nbsp;&lt;strong&gt;DeepSeek-R1&lt;/strong&gt;、Llama 3 等主流大模型，用户仅需在图形界面勾选所需版本（如 1.5B、8B、671B），点击安装即可自动完成依赖配置与资源分配，无需手动输入命令。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;资源智能管理&lt;/strong&gt;&lt;br/&gt;结合容器化技术，动态分配 CPU/GPU 资源，优化显存占用。例如，运行 8B 模型时自动启用 GPU 加速，避免传统方式因配置不当导致的性能浪费。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;无缝集成开发环境&lt;/strong&gt;&lt;br/&gt;支持在本地 Web 服务中直接调用模型 API。例如，通过 ServBay 预装的 Node.js 环境快速搭建 GraphQL 服务，结合 Apollo Server 实现与大模型的交互，开发者可专注于业务逻辑而非环境调试。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;可视化监控与调试&lt;/strong&gt;&lt;br/&gt;提供实时资源监控面板，显示模型运行时的内存、显存及算力消耗，并内置日志分析工具，快速定位响应延迟或报错问题。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr style=&quot;height: 1px; margin: calc(var(--ds-md-zoom)*12px)0; background-image: ; background-position-x: ; background-position-y: ; background-size: ; background-repeat: ; background-attachment: ; background-origin: ; background-clip: ; border: none; color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 16.002px; text-wrap-mode: wrap;&quot;/&gt;&lt;h4 style=&quot;font-weight: var(--ds-font-weight-strong); font-size: 16.002px; line-height: var(--ds-md-line-height); margin: calc(var(--ds-md-zoom)*16px)0 calc(var(--ds-md-zoom)*12px)0; color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; text-wrap-mode: wrap;&quot;&gt;三、ServBay vs Ollama：效率与体验的全面碾压&lt;/h4&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr class=&quot;firstRow&quot;&gt;&lt;th style=&quot;color: rgb(var(--ds-rgb-label-1)); padding-left: 0px; border-bottom: 1px solid rgb(var(--ds-rgb-label-3)); border-top: 1px solid rgb(var(--ds-rgb-label-3)); text-align: left;&quot;&gt;&lt;strong&gt;对比维度&lt;/strong&gt;&lt;/th&gt;&lt;th style=&quot;color: rgb(var(--ds-rgb-label-1)); padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3)); border-top: 1px solid rgb(var(--ds-rgb-label-3)); text-align: left;&quot;&gt;&lt;strong&gt;Ollama 传统部署&lt;/strong&gt;&lt;/th&gt;&lt;th style=&quot;color: rgb(var(--ds-rgb-label-1)); padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3)); border-top: 1px solid rgb(var(--ds-rgb-label-3)); text-align: left;&quot;&gt;&lt;strong&gt;ServBay 1.9&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding-top: ; padding-right: ; padding-bottom: ; padding-left: 0px; border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;&lt;strong&gt;安装复杂度&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;需手动配置环境变量、依赖库&lt;/td&gt;&lt;td style=&quot;padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;全自动安装，无需额外操作&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding-top: ; padding-right: ; padding-bottom: ; padding-left: 0px; border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;&lt;strong&gt;资源管理&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;依赖命令行参数调整，易出错&lt;/td&gt;&lt;td style=&quot;padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;图形化资源分配，智能优化&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding-top: ; padding-right: ; padding-bottom: ; padding-left: 0px; border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;&lt;strong&gt;多模型支持&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;需逐一下载，版本切换繁琐&lt;/td&gt;&lt;td style=&quot;padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;统一管理界面，支持多版本共存与一键切换&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding-top: ; padding-right: ; padding-bottom: ; padding-left: 0px; border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;&lt;strong&gt;开发整合&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;需独立配置 API 网关&lt;/td&gt;&lt;td style=&quot;padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;内嵌反向代理，直接绑定域名与 SSL 证书&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;padding-top: ; padding-right: ; padding-bottom: ; padding-left: 0px; border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;&lt;strong&gt;硬件适配&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;GPU 加速需手动启用&lt;/td&gt;&lt;td style=&quot;padding: calc(var(--ds-md-zoom)*6px)calc(var(--ds-md-zoom)*12px); border-bottom: 1px solid rgb(var(--ds-rgb-label-3));&quot;&gt;自动检测硬件，动态启用加速&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;hr style=&quot;height: 1px; margin: calc(var(--ds-md-zoom)*12px)0; background-image: ; background-position-x: ; background-position-y: ; background-size: ; background-repeat: ; background-attachment: ; background-origin: ; background-clip: ; border: none; color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 16.002px; text-wrap-mode: wrap;&quot;/&gt;&lt;h4 style=&quot;font-weight: var(--ds-font-weight-strong); font-size: 16.002px; line-height: var(--ds-md-line-height); margin: calc(var(--ds-md-zoom)*16px)0 calc(var(--ds-md-zoom)*12px)0; color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; text-wrap-mode: wrap;&quot;&gt;四、应用场景：从开发到部署的全链路提效&lt;/h4&gt;&lt;ol start=&quot;1&quot; style=&quot;margin: calc(var(--ds-md-zoom)*12px)0; padding-left: calc(var(--ds-md-zoom)*24px); color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 16.002px; text-wrap-mode: wrap;&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;本地 AI 助手集成&lt;/strong&gt;&lt;br/&gt;结合 ServBay 的 PHP/Node.js 环境，开发者可快速搭建智能客服系统。例如，通过调用 DeepSeek-R1 的推理 API，实现用户问题的自动归类与解答，同时利用 ServBay 的 MySQL 数据库管理工具存储对话日志。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;私有化模型微调&lt;/strong&gt;&lt;br/&gt;支持导入自定义数据集，利用 ServBay 的 Docker 集成功能创建隔离训练环境，避免污染本地开发配置。完成后可直接将模型封装为服务，通过统一面板发布。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style=&quot;margin-top: 0px; font-size: var(--ds-md-font-size); line-height: var(--ds-md-line-height); margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;教育与实验&lt;/strong&gt;&lt;br/&gt;学生或研究者可一键部署不同规模的模型（如从 1.5B 到 671B），对比性能差异，而无需担心环境冲突或依赖缺失。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;hr style=&quot;height: 1px; margin: calc(var(--ds-md-zoom)*12px)0; background-image: ; background-position-x: ; background-position-y: ; background-size: ; background-repeat: ; background-attachment: ; background-origin: ; background-clip: ; border: none; color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 16.002px; text-wrap-mode: wrap;&quot;/&gt;&lt;h4 style=&quot;font-weight: var(--ds-font-weight-strong); font-size: 16.002px; line-height: var(--ds-md-line-height); margin: calc(var(--ds-md-zoom)*16px)0 calc(var(--ds-md-zoom)*12px)0; color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; text-wrap-mode: wrap;&quot;&gt;五、未来展望：AI 平民化的关键推手&lt;/h4&gt;&lt;p style=&quot;margin: calc(var(--ds-md-zoom)*12px)0; font-size: 16.002px; line-height: var(--ds-md-line-height); color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; text-wrap-mode: wrap;&quot;&gt;ServBay 的升级标志着开发工具正从“环境配置者”向“能力聚合者”进化。其价值不仅在于简化部署流程，更在于&lt;strong&gt;降低技术门槛&lt;/strong&gt;，让开发者专注于创新而非运维。随着多模态模型的支持扩展（如文生视频工具 Video Ocean 的集成），ServBay 有望成为连接开发、测试与 AI 应用的核心平台。&lt;/p&gt;&lt;hr style=&quot;height: 1px; margin: calc(var(--ds-md-zoom)*12px)0; background-image: ; background-position-x: ; background-position-y: ; background-size: ; background-repeat: ; background-attachment: ; background-origin: ; background-clip: ; border: none; color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; font-size: 16.002px; text-wrap-mode: wrap;&quot;/&gt;&lt;p style=&quot;font-size: 16.002px; line-height: var(--ds-md-line-height); color: rgb(64, 64, 64); font-family: Inter, system-ui, -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Noto Sans&amp;quot;, Ubuntu, Cantarell, &amp;quot;Helvetica Neue&amp;quot;, Oxygen, &amp;quot;Open Sans&amp;quot;, sans-serif; text-wrap-mode: wrap; margin-bottom: 0px !important;&quot;&gt;&lt;strong&gt;立即行动&lt;/strong&gt;：访问&amp;nbsp;ServBay 官网&amp;nbsp;下载 1.9 版本&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://tealala.cn/zb_users/upload/2025/02/202502161739686293920970.png&quot; alt=&quot;image.png&quot; width=&quot;600&quot; height=&quot;368&quot; style=&quot;width: 600px; height: 368px;&quot; border=&quot;0&quot; vspace=&quot;0&quot; title=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://tealala.cn/zb_users/upload/2025/02/202502161739686322312530.png&quot; alt=&quot;image.png&quot; width=&quot;600&quot; height=&quot;375&quot; style=&quot;width: 600px; height: 375px;&quot; border=&quot;0&quot; vspace=&quot;0&quot; title=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;官网链接：&lt;a href=&quot;https://www.servbay.com/&quot; target=&quot;_blank&quot;&gt;https://www.servbay.com/&lt;/a&gt;&lt;/p&gt;</description><pubDate>Sun, 16 Feb 2025 14:10:52 +0800</pubDate></item><item><title>PHP初级开发的一些心得。</title><link>https://tealala.cn/?id=28</link><description>&lt;p data-start=&quot;0&quot; data-end=&quot;107&quot;&gt;在项目的早期阶段，尤其是当你在进行快速开发和原型构建时，完全可以先专注于&lt;strong data-start=&quot;40&quot; data-end=&quot;48&quot;&gt;功能实现&lt;/strong&gt;和&lt;strong data-start=&quot;49&quot; data-end=&quot;55&quot;&gt;测试&lt;/strong&gt;，然后再去考虑复杂的&lt;strong data-start=&quot;65&quot; data-end=&quot;73&quot;&gt;数据关系&lt;/strong&gt;。这种方法实际上是非常常见的开发实践，尤其是在敏捷开发和快速迭代中。&lt;/p&gt;&lt;h3 data-start=&quot;109&quot; data-end=&quot;127&quot;&gt;为什么可以先不考虑数据关系？&lt;/h3&gt;&lt;ol data-start=&quot;129&quot; data-end=&quot;484&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p data-start=&quot;132&quot; data-end=&quot;146&quot;&gt;&lt;strong data-start=&quot;132&quot; data-end=&quot;145&quot;&gt;快速原型和功能验证&lt;/strong&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul data-start=&quot;150&quot; data-end=&quot;255&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;初期你可能只是想验证一个功能是否能够正常工作，而不需要一开始就设计复杂的数据关系。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;你可以先实现每个独立功能，确保它们能够在不考虑表之间关系的情况下正常运作。这有助于快速测试每个模块是否符合预期。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p data-start=&quot;260&quot; data-end=&quot;272&quot;&gt;&lt;strong data-start=&quot;260&quot; data-end=&quot;271&quot;&gt;逐步迭代和优化&lt;/strong&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul data-start=&quot;276&quot; data-end=&quot;385&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;随着项目逐步推进，你可以在测试过并确认每个功能正常后，再去关注&lt;strong data-start=&quot;309&quot; data-end=&quot;320&quot;&gt;系统整体的设计&lt;/strong&gt;和&lt;strong data-start=&quot;321&quot; data-end=&quot;332&quot;&gt;数据结构的优化&lt;/strong&gt;。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;你可以先让功能单独运行，等到实现了基本的功能和流程后，再返回去重新审视和设计数据之间的关联。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p data-start=&quot;390&quot; data-end=&quot;403&quot;&gt;&lt;strong data-start=&quot;390&quot; data-end=&quot;402&quot;&gt;灵活应对需求变化&lt;/strong&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul data-start=&quot;407&quot; data-end=&quot;484&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;需求和业务逻辑往往在开发过程中会有所变化，先不深入数据关系设计可以让你更加灵活地应对这些变化。等到功能较为稳定时，再根据新的需求来调整和完善数据结构。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;h3 data-start=&quot;486&quot; data-end=&quot;501&quot;&gt;如何实现这种开发方式？&lt;/h3&gt;&lt;ol data-start=&quot;503&quot; data-end=&quot;1051&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p data-start=&quot;506&quot; data-end=&quot;516&quot;&gt;&lt;strong data-start=&quot;506&quot; data-end=&quot;515&quot;&gt;模块化开发&lt;/strong&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul data-start=&quot;520&quot; data-end=&quot;623&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;每个功能都可以先独立开发，不考虑与其他功能的依赖关系。你可以把每个功能视为一个独立模块，专注于单一模块的实现。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;比如：你可以先实现&lt;strong data-start=&quot;592&quot; data-end=&quot;602&quot;&gt;文章发布功能&lt;/strong&gt;，独立地开发和测试它，确保文章能正常发布。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p data-start=&quot;628&quot; data-end=&quot;642&quot;&gt;&lt;strong data-start=&quot;628&quot; data-end=&quot;641&quot;&gt;使用简化的数据模型&lt;/strong&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul data-start=&quot;646&quot; data-end=&quot;781&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;初期你可以暂时忽略表之间复杂的关系，使用简单的数据表结构。例如，你可以用一个简单的 &lt;code data-start=&quot;690&quot; data-end=&quot;700&quot;&gt;articles&lt;/code&gt; 表来保存所有文章，而不需要考虑与其他表的关联。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;数据表之间的关系可以等到后期再补充。你可以先用&lt;strong data-start=&quot;753&quot; data-end=&quot;761&quot;&gt;简单字段&lt;/strong&gt;来实现基本功能，然后再逐步添加关联字段。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p data-start=&quot;786&quot; data-end=&quot;799&quot;&gt;&lt;strong data-start=&quot;786&quot; data-end=&quot;798&quot;&gt;代码中的假设关系&lt;/strong&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul data-start=&quot;803&quot; data-end=&quot;925&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;如果你的功能中某些操作需要跨表关联，可以先暂时忽略这些操作，假设数据会正常流动，等功能做完后再去设计真实的表关系。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;比如，你可以暂时不实现文章和用户的关联（例如，哪个用户发布了哪些文章），先让文章功能独立运作，后续再加上关联字段。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p data-start=&quot;930&quot; data-end=&quot;950&quot;&gt;&lt;strong data-start=&quot;930&quot; data-end=&quot;949&quot;&gt;通过接口或 mock 数据测试&lt;/strong&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul data-start=&quot;954&quot; data-end=&quot;1051&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;在你没有完全实现数据关系时，可以通过**模拟数据（mock data）**来测试功能，或者将数据接口和模型的逻辑先简单地用代码模拟出来，等到后期数据结构稳定后，再进行实际的数据库交互和关联。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;h3 data-start=&quot;1053&quot; data-end=&quot;1069&quot;&gt;后期的调整和数据关系设计&lt;/h3&gt;&lt;p data-start=&quot;1071&quot; data-end=&quot;1109&quot;&gt;一旦你完成了各个功能模块的开发和测试，可以再回过头来优化和设计表之间的关系：&lt;/p&gt;&lt;ol data-start=&quot;1111&quot; data-end=&quot;1385&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p data-start=&quot;1114&quot; data-end=&quot;1123&quot;&gt;&lt;strong data-start=&quot;1114&quot; data-end=&quot;1122&quot;&gt;设计关联&lt;/strong&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul data-start=&quot;1127&quot; data-end=&quot;1238&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;这时，你可以考虑通过&lt;strong data-start=&quot;1139&quot; data-end=&quot;1145&quot;&gt;外键&lt;/strong&gt;、&lt;strong data-start=&quot;1146&quot; data-end=&quot;1153&quot;&gt;多对多&lt;/strong&gt;、&lt;strong data-start=&quot;1154&quot; data-end=&quot;1161&quot;&gt;一对多&lt;/strong&gt;等方式来设计表之间的关联关系。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;比如，文章和用户之间可以通过 &lt;code data-start=&quot;1197&quot; data-end=&quot;1206&quot;&gt;user_id&lt;/code&gt; 来建立一对多关系，或者文章和标签之间通过中间表实现多对多关系。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p data-start=&quot;1243&quot; data-end=&quot;1255&quot;&gt;&lt;strong data-start=&quot;1243&quot; data-end=&quot;1254&quot;&gt;更新数据库结构&lt;/strong&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul data-start=&quot;1259&quot; data-end=&quot;1320&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;在设计好数据关系后，可以使用 Laravel 的 &lt;strong data-start=&quot;1286&quot; data-end=&quot;1292&quot;&gt;迁移&lt;/strong&gt; 功能来更新数据库结构，加入相应的外键、索引等。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;p data-start=&quot;1324&quot; data-end=&quot;1337&quot;&gt;&lt;strong data-start=&quot;1324&quot; data-end=&quot;1336&quot;&gt;重构模型和控制器&lt;/strong&gt;：&lt;/p&gt;&lt;/li&gt;&lt;ul data-start=&quot;1341&quot; data-end=&quot;1385&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;随着表结构的改变，你可能需要重构部分模型和控制器逻辑，使得数据关系能够顺利进行交互。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;h3 data-start=&quot;1387&quot; data-end=&quot;1393&quot;&gt;总结&lt;/h3&gt;&lt;p data-start=&quot;1395&quot; data-end=&quot;1507&quot; data-is-last-node=&quot;&quot;&gt;在项目初期，不必急于考虑复杂的&lt;strong data-start=&quot;1410&quot; data-end=&quot;1420&quot;&gt;数据关联关系&lt;/strong&gt;，可以先专注于功能的独立开发和测试。等到功能都基本稳定、需求明确时，再回头完善数据结构和表之间的关系。这种方式能够帮助你更快地推进项目进度，并且在后期有更大的灵活性进行调整。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 14 Feb 2025 01:53:22 +0800</pubDate></item><item><title>你我皆如此</title><link>https://tealala.cn/?id=27</link><description>&lt;p&gt;每个年龄都有他该做的事情，人教人百言无用事教人一次入心。&lt;/p&gt;</description><pubDate>Sun, 12 Jan 2025 00:12:29 +0800</pubDate></item><item><title>Cursor发来的邮箱验证邮件出现空白，怎么办？已解决。查看源码即可看到验证码。</title><link>https://tealala.cn/?id=26</link><description>&lt;p&gt;&lt;img class=&quot;ue-image&quot; src=&quot;https://tealala.cn/zb_users/upload/2024/11/202411211732176753197408.png&quot; title=&quot;WX20241121-161147@2x.png&quot; alt=&quot;WX20241121-161147@2x.png&quot; width=&quot;700&quot; height=&quot;355&quot; border=&quot;0&quot; vspace=&quot;0&quot; style=&quot;width: 700px; height: 355px;&quot;/&gt;&lt;/p&gt;</description><pubDate>Thu, 21 Nov 2024 16:12:10 +0800</pubDate></item><item><title>再过5天，40岁到了。</title><link>https://tealala.cn/?id=25</link><description>&lt;p&gt;减肥吧～&lt;/p&gt;</description><pubDate>Sun, 03 Nov 2024 02:28:56 +0800</pubDate></item><item><title>AI写代码的体验：真的不再需要程序员了吗？</title><link>https://tealala.cn/?id=24</link><description>&lt;p&gt;在过去的 2个月里，我体验了一把用AI写代码的“捷径”。作为一个有&amp;quot;编程背景&amp;quot;的人，哈哈，看到AI工具生成的代码让我感到既惊讶又兴奋。这不禁让我思考：如果AI可以完成日常的编码工作，那么未来的程序员还有多大价值？经过一番实际操作后，我有了一些心得，想在这里分享。&lt;/p&gt;&lt;h4&gt;1. &lt;strong&gt;AI真的让写代码更高效吗？&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;AI生成代码的效率确实惊人。在使用AI生成代码的过程中，我们不需要从零开始敲出一个函数或模块，它能够根据我们提供的需求，自动生成可行的代码片段。这在快速开发原型或解决重复性问题上，确实非常高效。比如，构建简单的CRUD操作，生成一些基础的API接口，AI可以轻松完成。在以往这些耗时耗力的基础工作上，AI确实节省了很多时间。&lt;/p&gt;&lt;p&gt;不过，这种效率也是有前提的：一方面，需要用户能清晰描述出需求，这要求一定的技术背景；另一方面，AI的代码生成基于现有的数据集和模型，它能应对的是“常规问题”，而在遇到特定业务逻辑或复杂功能时，它的表现就不如人意了。&lt;/p&gt;&lt;h4&gt;2. &lt;strong&gt;AI生成的代码质量如何？&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;虽然AI生成的代码往往是可用的，但不一定是最优的。AI在输出代码时，主要是“匹配”模式，而不是“理解”需求。这种代码更多是基于经验数据生成的拼接，有时缺少优化和细致的调试。举个例子，在处理性能关键的功能时，AI代码生成可能会遗漏掉一些优化细节或不够考虑效率问题。这样一来，虽然AI代码可以运行，但在真实业务场景下，可能并不够“耐用”。&lt;/p&gt;&lt;p&gt;这也让我意识到，编程不仅仅是生成代码，更是设计一种解决方案。代码只是载体，真正有价值的是架构思维和解决问题的能力。AI生成的代码要真正落地使用，依然需要人来判断、修改、优化和维护。&lt;/p&gt;&lt;h4&gt;3. &lt;strong&gt;AI无法取代的地方：全局视野和业务逻辑&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;AI的代码生成模式是“任务导向”的，即用户提问、AI输出；它关注的是局部问题的解决方案，但无法洞察系统的全局视野。程序员的价值之一，正是在于他们能从更宏观的角度设计整个系统架构，选择合适的技术栈，考虑系统的可扩展性和稳定性，确保各个模块之间无缝连接。而这些都需要对项目的深刻理解和对技术的深厚积累，AI暂时无法胜任。&lt;/p&gt;&lt;p&gt;特别是在业务逻辑复杂的项目中，比如涉及用户权限、数据安全、性能调优等问题时，程序员对业务需求的理解就显得尤为重要。AI目前很难在具体的业务场景中做出灵活的判断，因为它并不理解业务本身，它只是依赖数据生成代码。这一点对于开发人员来说是一个核心优势：我们可以根据具体业务调整代码，而不仅仅是执行一些通用的指令。&lt;/p&gt;&lt;h4&gt;4. &lt;strong&gt;与AI合作，而不是被取代&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;随着AI写代码越来越普及，我意识到它并不会让程序员“消失”，而是改变了程序员的工作模式。AI可以承担大量重复性的工作，解放程序员的生产力。我们可以将精力集中在更高层次的任务上，比如设计系统结构、分析业务需求、解决复杂问题等。这意味着我们要学会与AI合作，用AI工具提升效率，而不是害怕被取代。&lt;/p&gt;&lt;p&gt;未来的程序员需要的不仅是编码能力，还包括对AI工具的熟练使用，以及判断AI生成代码的能力。程序员的角色会更像是“设计师”和“监督者”，在项目中扮演策略性的角色，而不再只是代码的执行者。&lt;/p&gt;&lt;h4&gt;5. &lt;strong&gt;AI为程序员带来的机遇和挑战&lt;/strong&gt;&lt;/h4&gt;&lt;p&gt;AI写代码带来的不仅是挑战，也是机遇。随着AI技术的发展，程序员的门槛降低，更多人能够快速学习和使用代码，推动了编程教育的发展。但与此同时，编程工作的技术含量也在提升，对编程人员的要求不仅是编写代码，更是具备批判性思维和创新能力。&lt;/p&gt;&lt;p&gt;那些能够熟练掌握AI工具，快速适应AI新环境的程序员，将在未来更具竞争力。而且，AI的使用不仅帮助程序员，还会带动跨学科人才进入开发领域，例如产品经理、设计师等也可以通过AI实现基本的编码，这让团队的协作更加紧密。&lt;/p&gt;&lt;h4&gt;结语&lt;/h4&gt;&lt;p&gt;AI写代码的到来，无疑是开发者领域的一次革新。它改变了我们“写代码”的方式，让我们可以更高效地完成基础任务，同时让我们重新思考程序员的角色和价值。在这场变革中，程序员们要做的是拥抱变化，提升自己在架构设计、业务理解和系统优化等方面的能力。未来，我们将会见证AI与人类在编程中的深度合作，而那些能熟练运用AI、拥抱创新的程序员，将在这场变革中脱颖而出。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 02 Nov 2024 01:11:00 +0800</pubDate></item><item><title>“雪花算法”的偶遇～～passion！！！</title><link>https://tealala.cn/?id=23</link><description>&lt;p&gt;今晚和老周聊下项目的东西。。然后突然转到技术话题。。。聊到了分布式数据库唯一 id 如何解决的问题。。。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;从而延伸到了“雪花算法”。。。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;嘿！这玩意在 2020年京东买的一本书《算法图解》里看过。。然后一直不知道干嘛用的。。怎么用它。。好吧。。今晚解决了这个问题。。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;哈哈，为什么印象那么深。。因为他叫雪花算法。。雪花。。。居然和算法联系在一起。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;现在才明白推特为什么起这个名字！！！！&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;因为雪花，他X 的在哪下，都是唯一的！！！哈哈！！&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;https://img12.360buyimg.com/n1/jfs/t1/15242/10/20093/120139/650a860bF060e190a/3ecc56dedc83b160.jpg&quot; style=&quot;white-space: normal;&quot;/&gt;&lt;/p&gt;&lt;p&gt;忍住兴奋，毕竟大神能和我一个 HMLT 程序员（HTML 就是一门语言。咋滴！！）聊那么多，是那种很认真的聊。。这是他妈的很“叼”的啊！！！！感激！！！&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;路上，都是老师！！！&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;PS：这玩意是他做出来后，才知道有虚化算法。。这也是牛 B 啊！55555555555555 ！！！&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;passton！passton！passton！passton！passton！passton！passton！&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;年轻人！！passton！passton！passton！passton！passton！passton！passton！&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;我和老周都 50 了！！搞！！别怂！努力学习！！回报一定会来的！&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 24 Oct 2024 02:09:19 +0800</pubDate></item></channel></rss>