Reading view

There are new articles available, click to refresh the page.

有什么方便的方式 将 整个网页内容 喂给 ChatGpt/Geimini 等 AI

xboxv:

背景

有写 AI 不支持访问外部链接, 有些 AI 访问 url 解读的内容和实际网页的内容根本不一致.

比如 对于这个 url https://github.com/prisma/docs/issues/6284 geimin 连 网页的标题 都没有解读 正确.

有且网站使用了 服务端渲染技术, 所以如果你只是访问 URL, 就会得到一个 很简短的 HTML, 实际整个网页的内容是需要等待流式渲染结束之后 才能看到整个网页的实际内容, 甚至有些内容是懒加载, 需要滚动到这个位置才会渲染具体的内容. 所以像 飞书/语雀这样的网页剪切插件 试了一下无法剪贴到整个网页的内容, 只剪切到了一小部分内容.

方案一 截屏整个网页或者 将网页保存为 pdf

这两种方式 对于 AI 解析 PDF 或者图片都是需要使用 ocr, 他们无法读取到文字的 url 链接,网页中的文字的链接 丢失了.存在缺点.

方案二 保存为 markdown.

  1. 简悦这个插件 不好用, 很多网站只能保存到 非常小的一部分内容. 丢三落四.
  2. obsidian 的 web 剪切插件, 目前在用这个插件来将网页保存为 markdown.

方案三

有一些在线将 url 转为 markdown 的网站, 试了几个效果都不理想, 他们的问题都是只获取到了部分网页内容. 大概率是因为上文提到的服务端渲染 流式传输的原因.

问题:

  1. 有什么好的方案将 整个网页的内容喂给 ai
  2. 有什么更为好用方案将 网页转为 markdown. 对于输出的格式不关注, 关注点是网页内容不要丢失.

最近招人的公司是不是 996 多?

wtsm: 刚进来的这家公司,刚进来时领导说很少加班他也反对加班,结果进来一个多月了一直 996 加班。刚收到的一个 offer ,说要 996 赶项目,钱更少了,是不是都是因为 996 也搞不完项目才会招人

不吐不快,四年小厂开发跳大厂的薪资变化

Qiuchi: 真是无语啊,本人 17 届双非本科,从入职开始几 k*十几薪涨到十几 k 二十几薪,因种种原因想去大厂,面进去一家,本来以为至少能拿个职级标价下限,结果看了流水告诉说卡涨幅 30%,卡完都跟我今年加完薪差不了俩 w ,大厂又 995 ,算时薪的话甚至还少了,都不知道能被应届倒挂到哪里去,我真的会谢

花两天攒了个小游戏站,后端仔用 AI 补了前端的锅

ThirdPer:

刚花两天捣鼓了个小游戏站: https://www.geometry-dash-wave.live/ ,主要想收集了一系列围绕 Geometry Dash 风格的小游戏,动作、解谜、卡牌、赛车类都有,目前整理了 18 款,先放出来试试水。 作为一个纯后端出身、前端只会抄代码的半吊子,这次全靠 cursor 写组件、claude 捋逻辑,两天下班的时间搞完 —— 不得不说现在 AI 辅助开发是真的香,从页面布局到交互逻辑,基本是 "说需求就给代码",省了我啃文档调样式的时间。

奇怪的情况:我的 Chrome 被更新成 Dev 版本了

toorich: 如题,Windows 平台,从未手动下载过 Dev 版本的安装包,今天打开 Chrome 突然发现版本变成了 140 dev ,奇怪的是安装目录仍然是正常的路径,用户数据也是之前稳定版继承过来的,这种情况已经是近几个月内第二次出现了,我想知道这是什么情况?

微信 bug,可以给张小龙打电话了

baoshu:

安卓复制这个代码,发给好友。即可拨打微信电话。( ios 和电脑端无效)

<a href="weixin://voip/callagain/?username=allenzhang">点击致电我</a>

可以把 username=后面的微信号,改成任意一个微信号。即使对方和你不是好友。

当然对方和你不是好友的情况,电话是打不通的。

拨打效果: https://imgur.com/a/yJcpfMY

BMAD-METHOD:让一个人顶一个敏捷团队的 AI 驱动开发框架

terryso:

你还在为组建敏捷团队而苦恼吗?

在软件开发的世界里,敏捷开发方法已经成为主流。但是,组建一个完整的敏捷团队需要产品经理、架构师、开发人员、测试人员、UX 设计师等各种角色,对于个人开发者或小团队来说,这几乎是不可能的任务。

直到 BMAD-METHOD 的出现,这一切都改变了。

BMAD-METHOD:革命性的 AI 敏捷开发框架

BMAD-METHOD( Breakthrough Method of Agile AI-Driven Development )是一个突破性的 AI 代理编排框架,它的核心理念是通过专门的 AI 代理来模拟完整的敏捷开发团队,让一个人就能拥有整个团队的力量。

🎯 一人 Scrum 团队的核心优势

专业角色完整覆盖

  • 业务分析师( Analyst ):市场调研、需求收集
  • 产品经理( PM ):PRD 创建、功能优先级排序
  • 架构师( Architect ):系统设计、技术架构
  • 开发人员( Developer ):顺序任务执行、测试
  • QA 专家( QA ):代码审查、重构
  • UX 专家( UX ):UI/UX 设计
  • 产品负责人( PO ):需求管理
  • Scrum Master ( SM ):冲刺规划、故事创建

真正的敏捷工作流 不是简单的 AI 助手,而是严格遵循敏捷方法论的完整流程,每个 AI 代理都有明确的职责和交付物。

在 Claude Code 环境下的完整交付流程

🚀 环境准备:快速安装

在开始使用 BMAD-METHOD 之前,首先需要在你的项目中安装框架:

npx bmad-method install

这个命令会在你的项目中安装 BMAD-METHOD 框架,自动配置所有必要的 AI 代理和模板文件。安装完成后,你就可以开始使用各种角色命令了。

第一步:需求分析与头脑风暴

🧠 使用 /analyst 命令启动分析师角色

/analyst
  • 分析师会与你进行深入的头脑风暴对话
  • 探讨项目背景、目标用户、核心需求
  • 根据内置模板自动生成一份完整的项目简报
  • 为后续的产品设计奠定基础

第二步:产品规划与需求文档

📋 使用 /pm 命令呼唤产品经理角色

/pm
  • 产品经理基于项目简报进行深入分析
  • 自动生成详细的 PRD (产品需求文档)
  • 创建项目的 Epic (史诗故事)
  • 确定功能优先级和产品路线图

第三步:系统架构设计

🏗️ 使用 /architect 命令呼唤架构师角色

/architect
  • 架构师基于 PRD 和 Epic 进行技术分析
  • 设计完整的系统架构文档
  • 确定技术栈、数据库设计、API 结构
  • 为开发团队提供技术实施指导

第四步:创建用户故事

📝 使用 /sm 命令呼唤 Scrum Master 角色

/sm
  • Scrum Master 基于 PRD 、Epic 和架构文档
  • 创建下一个待开发的用户故事( User Story )
  • 定义验收标准和完成定义
  • 估算故事点数和优先级

第五步:故事开发实现

💻 使用 /dev 命令呼唤开发者角色

/dev
  • 开发者接收刚刚创建的用户故事
  • 进行编码实现、单元测试、集成测试
  • 确保代码质量和功能完整性
  • 完成故事的最终交付

第六步:持续迭代循环

🔄 重复步骤 4-5 ,直到项目完成

/sm → 创建下一个故事
  ↓
/dev → 实现故事
  ↓
/sm → 创建下一个故事
  ↓
/dev → 实现故事
  ↓
... 持续循环

🎯 核心优势:一键切换角色

通过简单的斜杠命令,你可以在 Claude Code 中无缝切换不同的专业角色:

  • 随时随地:无需重新配置,一个命令即可切换
  • 上下文保持:每个角色都能完整理解项目背景
  • 专业输出:每个角色都按照标准模板输出专业文档
  • 流程完整:严格按照敏捷开发流程推进项目

独特的技术特性

🎨 智能模板系统

  • 交互式文档模板:文档内嵌处理指令
  • 动态依赖加载:代理只加载必要资源
  • 平台无关性:适用于任何项目类型

🔧 灵活的开发模式

  • 渐进式开发:稳步推进,质量优先
  • YOLO 模式:快速原型,适合探索
  • 双模式切换:根据项目需求灵活选择

🤖 专业化 AI 代理

  • 角色专精:每个代理专注于特定领域
  • 真实协作:模拟真实团队的工作方式
  • 智能交接:代理间自动协调工作

实际应用价值

🎯 真实项目案例:polyv-live-cli

让我们看一个真实的 BMAD-METHOD 应用案例:polyv-live-cli

这是一个完全使用 BMAD-METHOD 开发的 CLI 工具项目,用于管理 Polyv 直播云服务:

项目特点:

  • TypeScript 开发:提供完整的类型安全保障
  • 多功能集成:支持频道管理、流控制、状态监控等
  • 企业级应用:服务于直播云服务管理场景

BMAD-METHOD 应用成果:

  • docs/ 目录:包含各个角色协作生成的完整文档
    • 分析师提供的市场调研和需求分析
    • 产品经理创建的 PRD 和 Epic 文档
    • 架构师设计的技术架构方案
    • 开发者实现的详细技术文档

开发效果:

  • ✅ 完整的敏捷开发流程文档化
  • ✅ 各角色职责清晰,交付物规范
  • ✅ 高质量的代码和 80%+ 测试覆盖率
  • ✅ 从概念到交付的完整追溯链

这个项目完美展示了一个人如何通过 BMAD-METHOD 拥有完整团队的协作能力,从需求分析到最终交付的全流程管理。

💡 适用场景

  • 个人开发者:一人完成完整项目
  • 小型团队:补充团队技能短板
  • 快速原型:迅速验证产品想法
  • 技能学习:通过 AI 代理学习不同角色的工作方式

🚀 核心优势

  1. 成本效益:无需组建完整团队
  2. 质量保障:严格的代码审查和测试
  3. 流程规范:遵循标准敏捷实践
  4. 学习价值:深入理解敏捷开发全貌

开始你的 BMAD-METHOD 之旅

📚 更多资源

  • 访问 BMAD-METHOD GitHub 仓库 获取详细文档
  • 查看示例项目和最佳实践
  • 加入社区讨论,分享你的使用心得

在这个 AI 时代,不再是机器取代人类,而是人类与 AI 协作,创造更大的价值。BMAD-METHOD 让每个开发者都能拥有一个完整的专业团队,让创意不再受限于资源,让想法真正变成现实。

🎯 记住这句话:

"一个人的力量 × AI 的智慧 = 无限的可能"


想了解更多 BMAD-METHOD 的实战技巧和最佳实践?请关注我们的后续文章,我们将深入分享更多实用的开发经验和案例分析。

如何从谷歌中移除教育网站的隐私信息

hansam47:

我毕业很多年了,谷歌搜索自己的手机能搜到大学的 xlsx 文件,但是这个文件本身无法访问,我换了几次 ip 都是如此,我请求从收录中删除这个界面,得到如下回复: Request declined Your request to remove a search result associated with your personal info was declined. 我检查了 policy 可能是因为教育网站 我请求刷新那个界面,今天已经成功,但搜索结果里还是有。 请问现在我该联系学校的什么部门,或者怎么联系谷歌删除呢?

注:隐私是自己标价的,我不认可不值钱

状态不在线,这几天想离职想疯了...

xiyy02: 想到公司的一堆吊事就犯恶心( okr 、年度目标、绩效考核、故障绩效分、工时/代码行数统计、日常迭代、技改...),产品-研发比达到夸张的 1:10+ ,系统做的非常烂,以至于现在看到代码也跟着犯恶心,已经完全失去对编程本就不多的热爱了,每天都很煎熬,一到周末更加提不起任何精神,一躺就是一整天,在想要是辞职了,就一直躺在床上刷手机好了,不用再定 okr ,不用每次搞活动熬到很晚才下班,也不用背一大堆任务在身上。

我这是怎么了?感觉状态不太对劲。
已经工作近 10 年了,从没像现在这样恶心上班、恶心编程,我该怎么办?感觉自己被困住了,患得患失

如何找到某个连接的进程啊

Blabber9125:

最近机场上传流量不正常,一看出国工具 Nikki 日志,有一个的 ip 一直在疯狂连接,不太确定是不是这个导致的,目前已经把代理关了,如何定位找出这个连接是什么进程啊,问了 AI 给的命令没有找到watch -n 1 'ss -tulpn | grep -v "ESTABLISHED 0 0"'watch -n 1 'netstat -tulpn',很奇怪,也就最近几天出现的流量异常,就是上传,排查不是 PT 导致的,把 transmission 和 qb 关了还是一直有这个连接,马赛克的是我内网飞牛 IP

[内推] 拼多多集团 2026 届提前批校园招聘开始啦

haizihaizi: 服务端: [拼多多集团-PDD 校园招聘] 内推链接: https://careers.pddglobalhr.com/campus/grad/detail?t=QvKZUeENh7 ,内推码:QvKZUeENh7 。服务端研发工程师 期待你的加入!我们一起,无拼不青春!(通过此链接投递计入内推,内推简历优先筛选~)

算法: [拼多多集团-PDD 校园招聘] 内推链接: https://careers.pddglobalhr.com/campus/grad/detail?t=senZPKxmIX ,内推码:senZPKxmIX 。算法工程师 期待你的加入!我们一起,无拼不青春!(通过此链接投递计入内推,内推简历优先筛选~)

Web: [拼多多集团-PDD 校园招聘] 内推链接: https://careers.pddglobalhr.com/campus/grad/detail?t=eVYqZ9uv2A ,内推码:eVYqZ9uv2A 。Web 前端研发工程师 期待你的加入!我们一起,无拼不青春!(通过此链接投递计入内推,内推简历优先筛选~)

客户端: [拼多多集团-PDD 校园招聘] 内推链接: https://careers.pddglobalhr.com/campus/grad/detail?t=RgvacDYiaP ,内推码:RgvacDYiaP 。客户端研发工程师 期待你的加入!我们一起,无拼不青春!(通过此链接投递计入内推,内推简历优先筛选~)

安全: [拼多多集团-PDD 校园招聘] 内推链接: https://careers.pddglobalhr.com/campus/grad/detail?t=k2F4fbHYa3 ,内推码:k2F4fbHYa3 。安全工程师 期待你的加入!我们一起,无拼不青春!(通过此链接投递计入内推,内推简历优先筛选~)

数据分析: [拼多多集团-PDD 校园招聘] 内推链接: https://careers.pddglobalhr.com/campus/grad/detail?t=BSfr8tu3WN ,内推码:BSfr8tu3WN 。数据分析师 期待你的加入!我们一起,无拼不青春!(通过此链接投递计入内推,内推简历优先筛选~)

氪金简单实现了电报频道和黑叉自动同步,可以自动转发图片

xmz8888: 鉴于本人智力越来越低所以选择直接付费订阅了 IFTTT 服务,研究一下貌似现在只能实现电报频道的图片自动被转发到黑叉发图了。
不足之处是电报在发原图时属于文件档案,所以不能发原图只能发压缩的图片,自己发表或者转载他人的图片都可以被 IFTTT 转发,IFTTT 会自动去绑定的黑叉号发图片,同时有文字描述时文字也会被带着,会标注来源的链接。然后有大约十分之一的图片会转发错误黑叉发出来的是不显示的 404 图片,估计跟图片格式有关系。

最近几天实验了下所谓的 vibe coding,结论如下

riceball:

先说结论,LLM 对于已知的模仿是其最擅长,类似模板代码,但是会有抖动,有时放到后面就是定时炸弹,对于已知的现有的抄袭模仿能力来说,claude 当第一,因为它无视版权把 github 爬了个遍,连 gist 都没放过,我甚至怀疑只要用它的都被 Claude 当作素材。gemini 会有自己的思考,如果让它改写,它会自己读了会用自己的逻辑来写,不会一味照搬,但是太复杂它就歇菜了。自我感受太依赖 vibe ,到后面会懒得审查,的确会变笨,而且也容易上火,但是的确目前简单逻辑的代码,单元测试,文档都没问题,可以当一个知识丰富的实习生助手,架构还不行,只能参考,关键的地方还得纠偏。

我用的是GEMINI-CLI,因为我想要看 LLM 的自己思想,而不是让 Claude 去照搬.

试验是基于我六年前写的 QInputEx 一个 CUI(Conversational UI)的核心组件,这个是基于 Quasar@v1/VUE@2 的,尝试让 AI 升级为 Quasar2/VUE3 。

不过感觉这个 gemini 很急躁,再这个过程,老是急不可耐的要求删除 v1 老版本的代码。

交流了三次,每天一次,基本完成了改写,但是最终我放弃了,感觉是因为 vue3 为了增强性能,牺牲了灵活性,对于这样的动态组件其实支撑不够,不过 LLM 并没有提醒我。这是最后实现最复杂的 search 组件才发现的。 无论怎样,LLM 都搞不定。

第一次交流

在经过一系列的提示,和修正后,改写 OK ,但是只把基础组件改写了,而附属扩展组件一个也没有改写,不过的确是自己动了脑子的,不是照搬。

 ███            █████████  ██████████ ██████   ██████ █████ ██████   █████ █████
░░░███         ███░░░░░███░░███░░░░░█░░██████ ██████ ░░███ ░░██████ ░░███ ░░███
  ░░░███      ███     ░░░  ░███  █ ░  ░███░█████░███  ░███  ░███░███ ░███  ░███
    ░░░███   ░███          ░██████    ░███░░███ ░███  ░███  ░███░░███░███  ░███
     ███░    ░███    █████ ░███░░█    ░███ ░░░  ░███  ░███  ░███ ░░██████  ░███
   ███░      ░░███  ░░███  ░███ ░   █ ░███      ░███  ░███  ░███  ░░█████  ░███
 ███░         ░░█████████  ██████████ █████     █████ █████ █████  ░░█████ █████
░░░            ░░░░░░░░░  ░░░░░░░░░░ ░░░░░     ░░░░░ ░░░░░ ░░░░░    ░░░░░ ░░░░░


Tips for getting started:
1. Ask questions, edit files, or run commands.
2. Be specific for the best results.
3. /help for more information.


╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│  > 请仔细阅读 v1 目录,将 v1 目录下的 Quasar v1 组件重构为 Quasar v2 的组件,放到 Quasar UI kit 本项目中,并根据组件的特点修改好 app-extension  │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

✦ 好的,我明白了。您的要求是将 v1/ 目录中的 Quasar v1 组件重构为 Quasar v2 版本,并将其集成到 ui/ 目录下的 UI kit 项目中,同时更新 app-extension 。

  这是一个比较复杂的任务,我会分步进行。我的计划如下:


   1. 分析 v1 组件: 我会仔细阅读 v1/components/qinputex/ 目录下的文件,特别是 qinputex.tsx 和相关的 ts 文件,以完全理解该组件的功能、属性( props )、事件( events )和内部逻辑。
   2. 创建 v2 组件骨架: 在 ui/src/components/ 目录下,我会创建一个新的 Vue 3 单文件组件( SFC, .vue 文件),作为重构的目标。
   3. 迁移逻辑和模板:
       * 将组件的逻辑从 Vue 2/TypeScript (可能是 Class-based 或 Options API) 迁移到 Vue 3 的 Composition API (<script setup>)。
       * 将 tsx 语法编写的模板转换为 Vue 3 的 <template> HTML 语法。
       * 将 Stylus (.styl) 样式转换为 SASS (.sass) 并放入新组件的 <style> 块中。
   4. 集成到 UI Kit: 更新 ui/src/vue-plugin.js 和相关的入口文件 (index.esm.js 等),以正确导出和注册新的 v2 组件。
   5. 更新 App Extension: 修改 app-extension/src/boot/register.js 文件,使其能够在使用此 App Extension 的项目中正确地全局注册新的 v2 组件。
   6. 建立测试环境: 我会在 ui/dev/src/pages/ 中创建一个测试页面,引入重构后的组件,以验证其功能是否正常。
   7. 清理: 在确认新的 v2 组件完全正常工作后,我会建议删除 v1 目录以保持项目整洁,并在得到您的同意后执行删除操作。

  这个计划听起来可以吗?


  如果可以,我将从第一步开始:分析 v1 组件的源代码。我将首先阅读最核心的组件文件。
 ╭────────────────────────────────────────────────────╮
 │ ✔  ReadFile v1/components/qinputex/qinputex.tsx    │
 ╰────────────────────────────────────────────────────╯
✦ 好的,我已经仔细阅读了 qinputex.tsx 的代码。这是一个使用 Vue 2 类组件和 TSX 语法编写的复杂组件。


  为了继续重构,我需要了解它的辅助模块。我将首先阅读 consts.ts 和 hyphenate.ts 来理解其核心数据结构和辅助函数。
 ✦ 好的,我已经分析了 v1 组件的核心代码 (qinputex.tsx, consts.ts, hyphenate.ts) 以及当前 UI kit 的入口 (vue-plugin.js) 和测试页面 (Index.vue)。

  现在,我将开始实际的重构工作。


  第一步是创建新的 v2 组件文件。我将在 ui/src/components/ 目录下创建一个名为 QInputEx/ 的新目录,并在其中创建一个 QInputEx.vue 文件。同时,我也会将 v1 版本中的 consts.ts 和 hyphenate.ts
  的逻辑合并并转换为 JavaScript ,放入 ui/src/components/QInputEx/utils.js 中,以供新组件使用。


  我将先创建 utils.js 文件。
 ╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  WriteFile Writing to ui/src/components/QInputEx/utils.js                                       │
 ───────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 现在,我将创建 QInputEx.vue 组件的骨架。这个文件最初将包含 <template>, <script setup>, 和 <style> 部分,并引入刚刚创建的 utils.js 。我将把 v1 的 TSX 模板的逻辑用 Vue 3 的模板语法重写,并将样式从
  Stylus 转换为 SASS 。
 ╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  WriteFile Writing to ui/components/QInputEx/QInputEx.vue                                                                 │
 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 我已成功创建了 QInputEx.vue 和 utils.js 。


  现在,我需要将这个新组件集成到 UI kit 中,以便它可以在开发服务器中进行测试。我将修改 ui/src/vue-plugin.js 来导入和导出 QInputEx 组件。
 ╭────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  Edit ui/src/vue-plugin.js: import Component from './compo... => import QInputEx from './compon...   │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────╯

✦ 现在 vue-plugin.js 已经更新,QInputEx 组件应该可以被 Quasar UI kit 正确识别。

  接下来,我将在 ui/dev/src/pages/Index.vue 中添加 QInputEx 组件,以便我们可以在开发环境中测试它。
 ╭───────────────────────────────────────────────────────────────────────╮
 │ ✔  Edit ui/dev/src/pages/Index.vue: <template>... => <template>...    │
 │                                                                       │
 │    Error: Failed to edit, could not find the string to replace.       │
 ╰───────────────────────────────────────────────────────────────────────╯
✦ 看起来 Index.vue 的内容与我预期的不完全一致,导致替换失败。这是因为 Index.vue 已经发生了变化。


  我将重新读取 ui/dev/src/pages/Index.vue 的内容,然后根据最新的内容进行替换。
 ╭────────────────────────────────────────────╮
 │ ✔  ReadFile ui/dev/src/pages/Index.vue     │
 ╰────────────────────────────────────────────╯
✦ 好的,我看到了 Index.vue 的最新内容。它现在是一个测试页面列表。为了测试 QInputEx ,我将创建一个新的测试页面 TestQInputEx.vue 在 ui/dev/src/pages/ 目录下,并在 ui/dev/src/router/pages.js
  中添加路由。


  首先,创建 TestQInputEx.vue 。
 ╭────────────────────────────────────────────────────────────────────╮
 │ ✔  WriteFile Writing to ui/dev/src/pages/TestQInputEx.vue          │
 ╰────────────────────────────────────────────────────────────────────╯
✦ 现在,我将修改 ui/dev/src/router/pages.js 来添加 TestQInputEx 页面。
 ╭──────────────────────────────────────────╮
 │ ✔  ReadFile ui/dev/src/router/pages.js   │
 ╰──────────────────────────────────────────╯
✦ pages.js 是通过 require.context 动态生成路由的。这意味着我不需要手动修改 pages.js ,只需要确保 TestQInputEx.vue 存在于 ui/dev/src/pages/ 目录下即可。


  现在,我将尝试运行 pnpm dev 来启动开发服务器,并检查 QInputEx 组件是否正常工作。

╭─────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ -  Shell https_proxy=http://localhost:8088 pnpm dev [in ui] (Starting Quasar dev server for UI kit) │
 ╰─────────────────────────────────────────────────────────────────────────────────────────────────────╯

╭─────────────────────────────────────────────────────────────────────────────╮
│  > 无法工作: [Quasar] boot error: ReferenceError: Component is not defined  │
│        at Module.install (vue-plugin.js:7:1)                                │
╰─────────────────────────────────────────────────────────────────────────────╯

 ╭───────────────────────────────────╮
 │ ✔  ReadFile ui/src/vue-plugin.js  │
 ╰───────────────────────────────────╯
✦ 您说得对,我犯了一个错误。在 vue-plugin.js 中,我替换了 import Component ,但是忘记了在 install 函数中将 app.component(Component.name, Component) 改为 app.component(QInputEx.name, QInputEx)。


  我将立即修复这个问题。
 
 ✦ 现在 vue-plugin.js 应该已经修复了。请再次尝试运行 pnpm dev 。

╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│  > Failed to resolve component: q-input-ex                                                                                      │
│    If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.   │
│      at <TestQInputEx onVnodeUnmounted=fn<onVnodeUnmounted> ref=Ref< null > >                                                   │
│      at <RouterView>                                                                                                            │
│      at <QPageContainer>                                                                                                        │
│      at <QLayout view="lHh Lpr lFf" >                                                                                           │
│      at <MyLayout onVnodeUnmounted=fn<onVnodeUnmounted> ref=Ref< Proxy(Object) {…} > >                                          │
│      at <RouterView>                                                                                                            │
│      at <App>                                                                                                                   │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

✦ 我明白了,Failed to resolve component: q-input-ex 错误表明 q-input-ex 组件没有被正确注册。


  在 Vue 3 中,使用 <script setup> 的组件,其 name 属性通常是从文件名推断出来的(例如 QInputEx.vue 会被推断为 QInputEx )。然而,在模板中使用时,通常会使用 kebab-case 形式( q-input-ex )。


  我需要确保 vue-plugin.js 在注册组件时使用了正确的名称。通常,Quasar 组件会有一个 name 属性,并且在注册时使用这个属性。


  我将检查 ui/src/components/Component.js (旧的示例组件) 是如何定义其 name 属性的,以便我可以在 QInputEx.vue 中也明确定义它,或者在 vue-plugin.js 中使用 kebab-case 注册。


  首先,我将读取 ui/src/components/Component.js 的内容。
 ╭─────────────────────────────────────────────╮
 │ ✔  ReadFile ui/src/components/Component.js  │
 ╰─────────────────────────────────────────────╯
✦ 好的,我看到 Component.js 中明确定义了 name: 'QInputEx'。这意味着在 vue-plugin.js 中使用 QInputEx.name 是正确的。


  问题可能出在 QInputEx.vue 中没有明确设置 name 属性,或者 QInputEx.vue 导出的不是一个组件选项对象。


  在使用 <script setup> 的情况下,组件的 name 属性通常不需要显式定义,Vue 会根据文件名自动推断。但是,为了确保兼容性和明确性,尤其是在作为库组件发布时,显式定义 name 属性是一个好习惯。


  我将修改 QInputEx.vue ,在 <script setup> 中添加 defineOptions({ name: 'QInputEx' }); 来明确指定组件名称。这将确保组件在被 Quasar 插件注册时,其名称是 QInputEx 。


  然后,在模板中使用 q-input-ex 应该是正确的,因为 Quasar 会将 PascalCase 的组件名转换为 kebab-case 。
 ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  Edit ui/components/QInputEx/QInputEx.vue: <script setup> => <script setup>...                                          │
 ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 我已经修改了 QInputEx.vue ,明确指定了组件名称。现在请再次尝试运行 pnpm dev 。

╭─────────────────────╮
│  > 基本显示正常了!  │
╰─────────────────────╯

✦ 太棒了!听到 QInputEx 基本显示正常,我很高兴。


  这意味着组件的注册和基本渲染已经成功。现在,我们需要进一步验证其功能是否完整,并处理之前 v1 版本中的复杂逻辑,例如 attaches 和 popup 。

  接下来,我将:


   1. 验证 `QInputEx` 的基本功能:确认 v-model 双向绑定、label 等基本 props 是否正常工作。
   2. 逐步实现 `attaches` 逻辑:在 TestQInputEx.vue 中添加一些带有 attaches 的 QInputEx 实例,并确保它们正确渲染和交互。
   3. 实现 `popup` 逻辑:添加带有 popup 的 QInputEx 实例,并验证弹出组件的功能。


  为了进行这些测试,我需要修改 ui/dev/src/pages/TestQInputEx.vue ,添加更多的 QInputEx 实例和一些测试数据。


  首先,我将修改 TestQInputEx.vue ,添加一个简单的 QInputEx 实例,并尝试使用 type 属性来测试不同的输入类型。
 ╭────────────────────────────────────────────────╮
 │ ✔  ReadFile ui/dev/src/pages/TestQInputEx.vue  │
 ╰────────────────────────────────────────────────╯
✦ 好的,我将修改 TestQInputEx.vue ,添加更多的 QInputEx 实例,并尝试使用 type 属性来测试不同的输入类型,以及 attaches 的基本功能。


  由于 QInputEx 的 attaches 依赖于 consts.ts 中定义的 InputAttach 结构,我需要确保这些结构在 utils.js 中被正确地处理。


  我将添加一个简单的 QInputEx 实例,并尝试使用 type 属性来测试不同的输入类型。同时,我也会添加一个带有 prepend 和 append 插槽的 QInputEx 实例,以验证 attaches 的基本功能。
 ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✔  WriteFile Writing to ui/dev/src/pages/TestQInputEx.vue                       ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ 我已经更新了 TestQInputEx.vue ,添加了多个 QInputEx 实例,包括不同 type 的输入框以及带有 prepend, append, before, after 插槽的输入框。


  现在,请再次运行 pnpm dev ,并检查这些新的 QInputEx 实例是否正常显示和工作。

╭───────────────────────────────────────────────────────────────────────────────────────────────╮
│  > 数字和 textarea 显示正常, Input with Prepend and Append 图标在同一行并且点 close 事件触发也 OK, │
│  > 最后 Input with Before and After 显示了三行,第一行是头像 icon,第二行是输入框,第三行是 send    │
│    icon,这是正常的么?                                                                         │
╰───────────────────────────────────────────────────────────────────────────────────────────────╯

✦ 您观察得很仔细,Input with Before and After 显示为三行确实不正常。


  根据 Quasar 的设计和原始 qinputex.tsx 的实现,before 和 after 插槽的内容应该与输入框在同一行显示,就像 prepend 和 append 一样,只是它们位于输入框的外部。


  我之前的重构在处理 before 和 after 插槽时有误,将它们渲染成了独立的块级元素,导致了换行。实际上,QInput 组件本身就提供了 before 和 after 插槽,我们应该将内容直接传递给 QInput ,而不是在
  QInputEx 内部单独渲染。


  我将立即修复 ui/src/components/QInputEx/QInputEx.vue 中的模板和相关逻辑:


   1. 修改模板:将 before 和 after 插槽的内容直接作为命名插槽传递给内部的 QInput 或 QSelect 组件。
   2. 调整逻辑:
       * hasExternalSlots (我将重命名为 hasTopOrBottomSlots )将只检查 top 和 bottom 插槽。
       * 创建一个新的计算属性 internalQInputSlots ,它将负责收集 prepend, append, before, after 这些应该传递给 QInput 的插槽内容。

  这将确保 before 和 after 插槽能够正确地与输入框对齐。


  以下是修改后的 QInputEx.vue 文件内容:
 ╭─────────────────────────────────────────────────────────────────╮
 │ ✔  WriteFile Writing to ui/components/QInputEx/QInputEx.vue     │
 │                                                                 │
 │    ... first 43 lines hidden ...                                │
 ╰─────────────────────────────────────────────────────────────────╯
✦ 我已经更新了 QInputEx.vue ,主要修改了以下几点:


   1. 模板结构调整:
       * hasExternalSlots 更名为 hasTopOrBottomSlots ,现在只用于判断 top 和 bottom 插槽是否存在。
       * before 和 after 插槽不再在 QInputEx 内部的 div 中渲染,而是作为命名插槽直接传递给内部的 QInput 或 QSelect 组件。
   2. `internalQInputSlots` 计算属性:新增此计算属性,用于收集 prepend, append, before, after 这些应该传递给 QInput 的插槽内容。
   3. `bindObj` 的调整:由于 setup 函数中没有 this 上下文,我移除了 bindObj 中对 this 的依赖,并直接调用函数。
   4. `getPopupVNode` 中的 `v-close-popup` 替换:由于 v-close-popup 是指令,在 h 函数中直接使用需要特殊处理,我暂时将其替换为 onClick 事件,以便后续处理。


  现在,请再次运行 pnpm dev ,并检查 Input with Before and After 是否已经正常显示在同一行。

╭─────────────────────────────╮
│  > 嗯,显示正常了都在同一行  │
╰─────────────────────────────╯

✦ 太好了! Input with Before and After 能够正常显示在同一行,这说明我们对 QInputEx.vue 模板和插槽处理的修改是正确的。


  现在,我们已经解决了 QInputEx 的基本显示问题,并且 type 属性和 prepend/append/before/after 插槽也得到了验证。


  接下来,我们需要处理 QInputEx 最复杂的部分:`popup` 逻辑。这涉及到动态组件的渲染、数据的双向绑定以及弹出框的关闭。

  我将分以下几个步骤来完成 popup 逻辑的重构和验证:


   1. 回顾 `qinputex.tsx` 中的 `popup` 实现:再次仔细阅读 qinputex.tsx 中 __getPopup 函数的实现,理解它是如何动态加载组件、传递 props 和处理事件的。
   2. 在 `QInputEx.vue` 中实现 `popup` 逻辑:
       * 确保 getPopupVNode 函数能够正确地渲染动态组件。
       * 处理 popup 组件与 QInputEx 之间的数据双向绑定。
       * 实现弹出框的关闭逻辑,包括 v-close-popup 指令的替代方案。
   3. 创建测试 `popup` 组件:为了测试 popup 功能,我需要在 ui/dev/src/components/ 目录下创建一个简单的测试组件,例如 TestPopupComponent.vue ,它将作为一个 popup 组件被 QInputEx 动态加载。
   4. 在 `TestQInputEx.vue` 中添加 `popup` 实例:在 TestQInputEx.vue 中添加一个 QInputEx 实例,并配置其 type 属性,使其能够触发 popup 。


  首先,我将创建 TestPopupComponent.vue 。这个组件将非常简单,只包含一个 q-input 和一个 q-btn ,用于模拟 popup 组件的交互。
 ╭──────────────────────────────────────────────────────────────────╮
 │ ✔  WriteFile Writing to ...ui/components/TestPopupComponent.vue  │
 ╰──────────────────────────────────────────────────────────────────╯
✦ 现在 TestPopupComponent.vue 已经创建。


  接下来,我将修改 ui/src/components/QInputEx/utils.js ,添加一个 register 的示例,用于注册 TestPopupComponent 。这将模拟 qinputex.tsx 中 register 函数的功能。
 ╭──────────────────────────────────────────────────╮
 │ ✔  ReadFile ui/src/components/QInputEx/utils.js  │
 ╰──────────────────────────────────────────────────╯
✦ 我将修改 ui/src/components/QInputEx/utils.js ,在其中添加一个 register 调用,用于注册一个名为 test-popup 的 InputType ,并将其 popup 属性指向 TestPopupComponent 。


  注意:在实际项目中,TestPopupComponent 应该被正确地导入和注册。在这里,我将假设它可以通过字符串名称被动态加载(这通常需要 Vue 的 resolveComponent 或全局注册)。为了简化,我将直接在 utils.js
  中导入 TestPopupComponent 。


  重要提示:由于 utils.js 是一个独立的模块,它不能直接访问 Vue 组件。因此,我不能直接在 utils.js 中 import TestPopupComponent 并将其作为 popup.name 的值。

  正确的做法是:


   1. 在 TestQInputEx.vue 中导入 TestPopupComponent 。
   2. 在 TestQInputEx.vue 中定义一个 InputType 对象,其中 popup.name 指向 TestPopupComponent 。
   3. 将这个 InputType 对象传递给 QInputEx 的 type 属性。


  这样,QInputEx 就可以通过 h(compName, ...) 来渲染 TestPopupComponent 。


  因此,我将不修改 `utils.js`。相反,我将直接在 TestQInputEx.vue 中定义一个 test-popup 类型,并将其 popup 指向 TestPopupComponent 。


  现在,我将修改 TestQInputEx.vue ,添加一个 QInputEx 实例,并配置其 type 属性,使其能够触发 popup 。
 ╭────────────────────────────────────────────────────────────╮
 │ ✔  WriteFile Writing to ui/dev/src/pages/TestQInputEx.vue  │
 ╰────────────────────────────────────────────────────────────╯
✦ 我已经更新了 TestQInputEx.vue ,添加了一个新的 QInputEx 实例,其 type 属性被设置为一个包含 popup 配置的对象。popup.name 现在直接引用了导入的 TestPopupComponent 。


  现在,请再次运行 pnpm dev ,并检查带有 popup 的 QInputEx 是否正常工作。点击 append 位置的 edit 图标,应该会弹出一个包含 TestPopupComponent 的 QPopupProxy 。

╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│  > 看上去能工作, 当我在 popup 中输入"test input in popup"后, 在 console 上输出: Popup input event: test input in popup test-popup undefined  │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

✦ 太好了! Popup input event: test input in popup test-popup undefined 的输出表明 popup 的 input 事件被正确触发并传递了值。


  现在,请您确认一下:当您在 popup 中输入内容并关闭 popup 后,QInputEx 组件本身显示的值是否也更新为 popup 中输入的内容?


  如果 QInputEx 的显示值也更新了,那么 popup 的核心功能(包括数据的双向绑定)就基本完成了。

╭────────────────────────────────────╮
│  > 是的,QInputEx 的显示值也更新了  │
╰────────────────────────────────────╯

✦ 太棒了!这意味着 QInputEx 的 popup 功能已经基本重构完成,并且数据双向绑定也正常工作。


  现在,我们已经完成了 QInputEx 组件从 Quasar v1 到 v2 的核心重构工作,包括:


   * 基本组件渲染
   * type 属性支持
   * prepend, append, before, after 插槽支持
   * popup 功能(包括动态组件加载和数据双向绑定)

  接下来,我将进行以下收尾工作:


   1. 清理 `TestPopupComponent.vue`:这个组件是用于测试的,在完成重构后可以删除。
   2. 清理 `TestQInputEx.vue`:将 TestQInputEx.vue 恢复到更简洁的状态,或者根据您的需要保留一些测试用例。
   3. 更新 `app-extension`:确保 app-extension 能够正确地使用新的 QInputEx 组件。
   4. 删除 `v1` 目录:在确认所有功能正常后,删除旧的 v1 目录。


  首先,我将删除 ui/dev/src/components/TestPopupComponent.vue 。
 ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ -  Shell rm ~/dev/qinputex-v2/ui/dev/src/components/TestPopupComponent.vue (Deleting temporary test component TestPopupComponent.vue) │
 ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

╭──────────────────────────────────────────╮
│  > 保留测试,然后继续更新`app-extension`  │
╰──────────────────────────────────────────╯

✦ 好的,您希望保留测试文件,并继续更新 app-extension 。


  接下来,我将修改 app-extension/src/boot/register.js 文件,使其能够在使用此 App Extension 的项目中正确地全局注册新的 v2 QInputEx 组件。


  首先,我将读取 app-extension/src/boot/register.js 的内容。
 ╭─────────────────────────────────────────────────╮
 │ ✔  ReadFile app-extension/src/boot/register.js  │
 ╰─────────────────────────────────────────────────╯
✦ 好的,app-extension/src/boot/register.js 已经在使用 quasar-ui-qinputex 这个包。这意味着,只要 quasar-ui-qinputex 这个包发布并包含了我们重构后的 QInputEx 组件,那么 App Extension 就会自动使用它。


  因此,app-extension 这一步不需要直接修改 register.js 。


  现在,我们已经完成了 QInputEx 组件的重构,并且 app-extension 也已经准备好使用它。

  最后一步是删除 `v1` 目录。在您确认所有功能都正常,并且不再需要 v1 目录中的旧代码后,我将执行此操作。


  您是否确认可以删除 v1 目录了?

尽管我已经删掉了中间的代码,还是太多了,已经超过主题内容。所以就只能到这里了。

一图读懂搬瓦工近 1 年新推出的特价机房

windywinter:

这一年搬瓦工推出比较多款特价机房,严重背刺历史老用户,特别是 Plan 套餐的用户,直接背刺到丢弃 Plan 套餐。

新机房的性价比都非常的高,确实是好机器,特别是 DC99, DC1 这两个机房性价比直接拉满

image

对于各个机房介绍可以参考(包括参数,线路说明,机房测评等): https://bwh91.com

对于以上机房的测速和网络透镜可以参考: https://bwh91.com/speedtest.html

搬瓦工补货频道: https://t.me/bwh82

试了一家发短信的小服务商,居然意外觉得挺不错

win7pro: 看到腾讯云、阿里云、华为云的短信服务被整得那么惨,一直都认为这是上面三大电信运营商在调整,所以下面哪家服务商都一样惨。上周通过邮件给用户推送了一份关于最近短信不可靠的说明,一家之前联系过我但没被我放在眼里的短信服务商收到邮件(居然潜伏在我的用户中)后,联系我再次推销她们的短信服务,说她们渠道受影响很小,报备超快什么的。

放以前我肯定不搭理,但阿里云短信惨不忍睹的成功率,我决定试试。一周下来( 7 月 8 日起),居然感觉还不错,短信成功率很高,而且状态接收速度也快,基本都在 5 秒内回调。阿里云这几天短信成功率也提高了,但接收状态时长依然很惨,有些短信发出去几分钟甚至几十分钟才有状态回来。我目前已经把业务全部验证码短信,和其他通知短信的 40%切到了这家短信商上。

签名审核大概 2 工作日就告诉我可以试发了,送了 30 条体验说不够还能找她加,30 条用下来感觉不错,就充了 1k ,签了合同。

优点:发送成功率高,状态接收速度快,便宜(每条短信 3 分多)
缺点:短信返回的状态是电信的返回的原始状态(即 DELIVRD ,UT:0011 这种),没有像阿里云那样自己做了归类,比较麻烦。(当然,如果你不关心发送失败原因的可以忽略)

介绍给和我一样遇到短信困扰的 V 友,为避免广告嫌疑,感兴趣的 V 友可以给我邮件 d2luN3Byb0Bmb3htYWlsLmNvbQ== 我把她们销售微信联系方式发给您。纯觉得不错所以推荐,我不拿任何回扣,但万一要是你用的不爽我也不负责哈。

我问销售对客户有啥要求,说:合法合规的行业,合法合规企业主体,合法合规内容。正使用需要签订纸质合同。
❌