From 92aa365496c2f41b5f1184c4a5e471d7eb19cf6e Mon Sep 17 00:00:00 2001 From: renjianbo <18691577328@163.com> Date: Sun, 28 Jun 2026 15:54:37 +0800 Subject: [PATCH] chore: sync knowledge base updates - agent projects, docs reorg, daily cleanup Co-Authored-By: Claude Opus 4.6 --- .obsidian/app.json | 2 +- docs/Obsidian笔记体系/Daily/2024-06-01.md | 168 ---------- docs/Obsidian笔记体系/Daily/2024-06-02.md | 202 ------------ docs/Obsidian笔记体系/Daily/2026-01-13.md | 133 -------- docs/Obsidian笔记体系/Daily/2026-01-14.md | 131 -------- docs/Obsidian笔记体系/Daily/2026-01-15.md | 131 -------- docs/Obsidian笔记体系/Projects/agent/0618.md | 45 +++ .../Projects/agent/agent资料.md | 73 ++++- .../Projects/agent/下一步计划0505.md | 175 ----------- .../Projects/agent/下一步计划0613.md | 270 ++++++++++++++++ .../Projects/agent/未命名 1.md | 133 ++++++++ docs/Obsidian笔记体系/Projects/aitsc/wk1.md | 126 -------- docs/Obsidian笔记体系/Projects/aitsc/wk2.md | 227 -------------- docs/Obsidian笔记体系/Projects/aitsc/wk5.md | 296 ------------------ docs/Obsidian笔记体系/Projects/aitsc/wk6.md | 134 -------- docs/Obsidian笔记体系/Projects/aitsc/wk7.md | 145 --------- docs/Obsidian笔记体系/Projects/aitsc/wk8.md | 217 ------------- .../Obsidian笔记体系/Projects/aitsc/下任务.md | 9 - .../Projects/aitsc/项目资料.md | 50 +-- .../Projects/claude code/命令行工具.md | 32 ++ .../Projects/common/腾讯云服务器信息.md | 125 ++++++++ .../Projects/女童生长激素项目/项目概览.md | 107 +++++++ .../Projects/官网/公司官网.md | 1 + .../Projects/物业项目/物业项目资料.md | 1 + .../Projects/陪诊/修复计划0512.md | 170 ---------- .../Projects/陪诊/修复计划0610.md | 73 +++++ .../Projects/陪诊/瑞来健康项目资料.md | 12 +- .../images/Pasted image 20260524215622.png | Bin 0 -> 68200 bytes .../images/Pasted image 20260531234735.png | Bin 0 -> 63954 bytes docs/学习笔记/Java学习.md | 85 ----- docs/学习笔记/两份提示词对比.md | 45 --- docs/学习笔记/前端学习.md | 119 ------- 32 files changed, 900 insertions(+), 2537 deletions(-) delete mode 100644 docs/Obsidian笔记体系/Daily/2024-06-01.md delete mode 100644 docs/Obsidian笔记体系/Daily/2024-06-02.md delete mode 100644 docs/Obsidian笔记体系/Daily/2026-01-13.md delete mode 100644 docs/Obsidian笔记体系/Daily/2026-01-14.md delete mode 100644 docs/Obsidian笔记体系/Daily/2026-01-15.md create mode 100644 docs/Obsidian笔记体系/Projects/agent/0618.md delete mode 100644 docs/Obsidian笔记体系/Projects/agent/下一步计划0505.md create mode 100644 docs/Obsidian笔记体系/Projects/agent/下一步计划0613.md create mode 100644 docs/Obsidian笔记体系/Projects/agent/未命名 1.md delete mode 100644 docs/Obsidian笔记体系/Projects/aitsc/wk1.md delete mode 100644 docs/Obsidian笔记体系/Projects/aitsc/wk2.md delete mode 100644 docs/Obsidian笔记体系/Projects/aitsc/wk5.md delete mode 100644 docs/Obsidian笔记体系/Projects/aitsc/wk6.md delete mode 100644 docs/Obsidian笔记体系/Projects/aitsc/wk7.md delete mode 100644 docs/Obsidian笔记体系/Projects/aitsc/wk8.md delete mode 100644 docs/Obsidian笔记体系/Projects/aitsc/下任务.md create mode 100644 docs/Obsidian笔记体系/Projects/claude code/命令行工具.md create mode 100644 docs/Obsidian笔记体系/Projects/common/腾讯云服务器信息.md create mode 100644 docs/Obsidian笔记体系/Projects/女童生长激素项目/项目概览.md create mode 100644 docs/Obsidian笔记体系/Projects/官网/公司官网.md create mode 100644 docs/Obsidian笔记体系/Projects/物业项目/物业项目资料.md delete mode 100644 docs/Obsidian笔记体系/Projects/陪诊/修复计划0512.md create mode 100644 docs/Obsidian笔记体系/Projects/陪诊/修复计划0610.md create mode 100644 docs/assets/images/Pasted image 20260524215622.png create mode 100644 docs/assets/images/Pasted image 20260531234735.png delete mode 100644 docs/学习笔记/Java学习.md delete mode 100644 docs/学习笔记/两份提示词对比.md delete mode 100644 docs/学习笔记/前端学习.md diff --git a/.obsidian/app.json b/.obsidian/app.json index e0f0673..f2ec8c5 100644 --- a/.obsidian/app.json +++ b/.obsidian/app.json @@ -1,3 +1,3 @@ { "attachmentFolderPath": "docs/assets/images" -} +} \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Daily/2024-06-01.md b/docs/Obsidian笔记体系/Daily/2024-06-01.md deleted file mode 100644 index 9910006..0000000 --- a/docs/Obsidian笔记体系/Daily/2024-06-01.md +++ /dev/null @@ -1,168 +0,0 @@ -# 2024-06-01 - -## 基本信息 -- **日期**: 2024-06-01 -- **星期**: 星期六 -- **天气**: 晴 -- **心情**: 良好 - -## 今日计划 - -### 工作安排 -- [x] 完成系统服务定制开发 -- [x] 代码审查 -- [ ] 性能测试 - -### 学习计划 -- [x] 阅读Activity启动流程源码 -- [ ] 学习Binder机制 - -### 其他计划 -- [x] 整理项目文档 - -## 工作记录 - -### 已完成 -- ✅ 完成系统服务定制开发 - - 时间: 09:00 - 12:00 - - 内容: 完成了PackageManagerService的定制开发,增加了应用管理功能 - - 收获: 深入理解了PackageManagerService的工作机制 - -- ✅ 代码审查 - - 时间: 14:00 - 16:00 - - 内容: 审查了团队成员的代码,提出了改进建议 - - 收获: 通过代码审查学习到了不同的实现思路 - -- ✅ 阅读Activity启动流程源码 - - 时间: 16:00 - 18:00 - - 内容: 阅读了Activity启动流程的源码,理解了跨进程启动机制 - - 收获: 理解了Activity启动的完整流程,包括AMS、ApplicationThread等关键组件 - - 相关链接: [[02-Activity管理/Activity启动流程(跨进程)]] - -### 进行中 -- 🔄 性能测试 - - 开始时间: 18:00 - - 当前进度: 已完成启动时间测试,正在进行内存测试 - - 遇到的问题: 内存测试数据异常,需要进一步分析 - - 下一步计划: 分析内存测试数据,找出问题原因 - -### 待处理 -- ⏳ 学习Binder机制 - - 计划时间: 明天 - - 优先级: 中 - -## 学习记录 - -### 技术学习 -- **学习内容**: Activity启动流程源码分析 -- **学习时间**: 16:00 - 18:00 -- **学习方式**: 阅读源码 -- **关键收获**: - 1. Activity启动是跨进程的,应用进程通过Binder与AMS通信 - 2. 如果目标进程不存在,AMS会先创建进程,再启动Activity - 3. Activity的生命周期由AMS统一管理,通过ApplicationThread回调 -- **相关链接**: [[02-Activity管理/Activity启动流程(跨进程)]] - -### 源码阅读 -- **阅读模块**: ActivityManagerService -- **阅读时间**: 16:00 - 18:00 -- **关键理解**: - - AMS负责Activity的启动、生命周期管理 - - 通过Binder与应用进程通信 - - 管理Activity栈(Task、Stack) -- **疑问**: - - Activity栈的管理策略是什么? - - 如何优化Activity启动性能? -- **相关链接**: [[02-Activity管理/Activity栈管理(Task&Stack)]] - -### 问题解决 -- **问题描述**: 系统服务定制后,某些应用无法正常启动 -- **解决过程**: - 1. 查看日志,发现权限检查失败 - 2. 分析代码,发现权限检查逻辑有问题 - 3. 修复权限检查逻辑 -- **解决方案**: 修复了PackageManagerService中的权限检查逻辑 -- **经验总结**: 系统服务定制需要特别注意权限管理,不能影响应用的正常使用 -- **相关链接**: [[项目A-系统定制化/关键问题记录]] - -## 会议记录 - -### 项目进度会议 -- **时间**: 10:00 - 11:00 -- **主题**: 项目A进度讨论 -- **参与人**: 项目团队 -- **关键内容**: - - 讨论了项目进度 - - 确定了下一步工作计划 - - 分配了任务 -- **行动项**: - - [ ] 完成性能测试 - - [ ] 修复发现的问题 -- **相关链接**: [[项目A-系统定制化/README]] - -## 思考与总结 - -### 今日收获 -1. **技术收获**: 深入理解了Activity启动流程,对Android系统架构有了更清晰的认识 -2. **工作收获**: 完成了系统服务定制开发,积累了系统定制经验 -3. **学习收获**: 通过源码阅读,提升了代码理解能力 - -### 今日反思 -- **做得好的地方**: - - 按时完成了开发任务 - - 通过源码阅读加深了理解 - - 及时解决了遇到的问题 - -- **需要改进的地方**: - - 性能测试进度较慢,需要加快 - - 学习计划执行不够充分 - -- **改进计划**: - - 明天重点完成性能测试 - - 安排时间学习Binder机制 - -### 明日计划 -1. 完成性能测试,分析测试结果 -2. 修复发现的问题 -3. 学习Binder机制,阅读相关源码 - -## 技术笔记 - -### Activity启动流程 -- **内容**: Activity启动是跨进程的,涉及多个组件协作 -- **关键理解**: - - 应用进程通过Binder与AMS通信 - - AMS负责Activity的启动和生命周期管理 - - ApplicationThread作为Binder服务端,接收AMS的调用 -- **相关链接**: [[02-Activity管理/Activity启动流程(跨进程)]] - -### 系统服务定制 -- **内容**: 定制PackageManagerService,增加应用管理功能 -- **关键理解**: - - 系统服务定制需要深入理解源码 - - 需要注意权限管理,不能影响应用正常使用 - - 充分的测试很重要 -- **相关链接**: [[项目A-系统定制化/技术方案设计]] - -## 问题与疑问 - -### 问题1: Activity栈管理策略 -- **问题描述**: Activity栈的管理策略是什么?如何优化? -- **思考**: 需要阅读Activity栈管理相关源码 -- **待解决**: 明天阅读相关源码 - -### 问题2: 性能测试数据异常 -- **问题描述**: 内存测试数据异常,需要进一步分析 -- **思考**: 可能是测试方法有问题,或者系统确实存在内存问题 -- **待解决**: 明天分析测试数据,找出问题原因 - -## 相关链接 - -- [[项目A-系统定制化/README]] -- [[02-Activity管理/Activity启动流程(跨进程)]] -- [[05-进程与线程通信/Binder机制(内核到Java层)]] - -## 备注 - -- 今天工作状态良好,完成了主要任务 -- 需要加快性能测试进度 diff --git a/docs/Obsidian笔记体系/Daily/2024-06-02.md b/docs/Obsidian笔记体系/Daily/2024-06-02.md deleted file mode 100644 index e0a76ff..0000000 --- a/docs/Obsidian笔记体系/Daily/2024-06-02.md +++ /dev/null @@ -1,202 +0,0 @@ -# 2024-06-02 - -## 基本信息 -- **日期**: 2024-06-02 -- **星期**: 星期日 -- **天气**: 多云 -- **心情**: 良好 - -## 今日计划 - -### 工作安排 -- [x] 完成性能测试 -- [x] 分析测试结果 -- [x] 修复发现的问题 - -### 学习计划 -- [x] 学习Binder机制 -- [ ] 阅读Handler源码 - -### 其他计划 -- [x] 整理技术笔记 - -## 工作记录 - -### 已完成 -- ✅ 完成性能测试 - - 时间: 09:00 - 11:00 - - 内容: 完成了系统启动性能测试、内存性能测试、流畅度测试 - - 收获: 掌握了性能测试方法,了解了系统性能现状 - -- ✅ 分析测试结果 - - 时间: 11:00 - 13:00 - - 内容: 分析了性能测试数据,发现了几个性能瓶颈 - - 收获: 学会了使用Systrace分析性能问题 - - 相关链接: [[09-调试与工具链/Systrace_Perfetto全解读]] - -- ✅ 修复发现的问题 - - 时间: 14:00 - 17:00 - - 内容: 修复了内存泄漏问题,优化了启动流程 - - 收获: 提升了问题排查和解决能力 - -- ✅ 学习Binder机制 - - 时间: 17:00 - 19:00 - - 内容: 学习了Binder机制的原理和实现 - - 收获: 深入理解了Android进程间通信机制 - - 相关链接: [[05-进程与线程通信/Binder机制(内核到Java层)]] - -### 进行中 -- 🔄 阅读Handler源码 - - 开始时间: 19:00 - - 当前进度: 刚开始阅读 - - 遇到的问题: 源码较复杂,需要更多时间理解 - - 下一步计划: 明天继续阅读,整理笔记 - -### 待处理 -- ⏳ 整理技术笔记 - - 计划时间: 明天 - - 优先级: 低 - -## 学习记录 - -### 技术学习 -- **学习内容**: Binder机制原理和实现 -- **学习时间**: 17:00 - 19:00 -- **学习方式**: 阅读文档和源码 -- **关键收获**: - 1. Binder是Android系统进程间通信的核心机制 - 2. Binder使用驱动实现,支持跨进程调用 - 3. Binder使用引用计数管理对象生命周期 - 4. Binder的零拷贝机制提升了性能 -- **相关链接**: [[05-进程与线程通信/Binder机制(内核到Java层)]] - -### 源码阅读 -- **阅读模块**: Binder驱动 -- **阅读时间**: 17:00 - 19:00 -- **关键理解**: - - Binder驱动位于内核层,提供进程间通信能力 - - 使用mmap实现内存映射,实现零拷贝 - - 通过引用计数管理Binder对象生命周期 -- **疑问**: - - Binder的性能优化点有哪些? - - 如何调试Binder通信问题? -- **相关链接**: [[05-进程与线程通信/Binder机制(内核到Java层)]] - -### 问题解决 -- **问题描述**: 内存测试发现内存泄漏 -- **解决过程**: - 1. 使用LeakCanary检测内存泄漏 - 2. 分析泄漏路径,找到泄漏原因 - 3. 修复泄漏问题 -- **解决方案**: 修复了Handler持有Activity引用导致的内存泄漏 -- **经验总结**: - - 使用LeakCanary可以快速发现内存泄漏 - - Handler要使用静态内部类+WeakReference - - 及时释放资源很重要 -- **相关链接**: [[06-性能优化体系/内存优化(LeakCanary原理)]] - -## 会议记录 - -无 - -## 思考与总结 - -### 今日收获 -1. **技术收获**: 深入理解了Binder机制,对Android进程间通信有了清晰的认识 -2. **工作收获**: 完成了性能测试,发现并修复了问题,提升了系统性能 -3. **学习收获**: 通过问题解决,提升了问题排查和解决能力 - -### 今日反思 -- **做得好的地方**: - - 按时完成了性能测试 - - 及时修复了发现的问题 - - 通过学习和实践加深了理解 - -- **需要改进的地方**: - - Handler源码阅读进度较慢 - - 技术笔记整理不够及时 - -- **改进计划**: - - 明天完成Handler源码阅读 - - 及时整理技术笔记 - -### 明日计划 -1. 完成Handler源码阅读,整理笔记 -2. 继续优化系统性能 -3. 准备下周工作计划 - -## 技术笔记 - -### Binder机制 -- **内容**: Android进程间通信的核心机制 -- **关键理解**: - - Binder使用驱动实现跨进程调用 - - 通过mmap实现零拷贝,提升性能 - - 使用引用计数管理对象生命周期 -- **代码示例**: -```java -// Binder使用示例 -IBinder binder = ServiceManager.getService("service_name"); -IMyService service = IMyService.Stub.asInterface(binder); -service.doSomething(); -``` -- **相关链接**: [[05-进程与线程通信/Binder机制(内核到Java层)]] - -### 性能优化 -- **内容**: 系统性能测试和优化 -- **关键理解**: - - 使用Systrace可以系统化分析性能问题 - - 内存泄漏是性能问题的重要原因 - - 启动优化需要从多个方面考虑 -- **相关链接**: [[06-性能优化体系/启动优化方法论]] - -### 内存泄漏修复 -- **内容**: 修复Handler导致的内存泄漏 -- **关键理解**: - - Handler要使用静态内部类+WeakReference - - 及时释放资源,避免持有Context引用 - - 使用LeakCanary可以快速发现内存泄漏 -- **代码示例**: -```java -// 正确的Handler使用方式 -private static class MyHandler extends Handler { - private WeakReference mActivityRef; - - MyHandler(Activity activity) { - mActivityRef = new WeakReference<>(activity); - } - - @Override - public void handleMessage(Message msg) { - Activity activity = mActivityRef.get(); - if (activity != null) { - // 处理消息 - } - } -} -``` -- **相关链接**: [[06-性能优化体系/内存优化(LeakCanary原理)]] - -## 问题与疑问 - -### 问题1: Binder性能优化 -- **问题描述**: Binder的性能优化点有哪些? -- **思考**: 需要深入研究Binder的实现细节 -- **待解决**: 继续学习Binder相关文档 - -### 问题2: Handler源码理解 -- **问题描述**: Handler源码较复杂,需要更多时间理解 -- **思考**: 需要系统化阅读Handler相关源码 -- **待解决**: 明天继续阅读,整理笔记 - -## 相关链接 - -- [[05-进程与线程通信/Binder机制(内核到Java层)]] -- [[06-性能优化体系/内存优化(LeakCanary原理)]] -- [[09-调试与工具链/Systrace_Perfetto全解读]] - -## 备注 - -- 今天学习效果很好,对Binder机制有了深入理解 -- 性能测试发现了问题并及时修复,提升了系统性能 -- 需要加快Handler源码阅读进度 diff --git a/docs/Obsidian笔记体系/Daily/2026-01-13.md b/docs/Obsidian笔记体系/Daily/2026-01-13.md deleted file mode 100644 index 87fab0d..0000000 --- a/docs/Obsidian笔记体系/Daily/2026-01-13.md +++ /dev/null @@ -1,133 +0,0 @@ -## 基本信息 -- **日期**: 2026-01-13 -- **星期**: 星期二 -- **天气**: 晴 -- **心情**: 良好 - -## 今日计划 - -### 工作安排 -- [ ] 从正式环境切换到开发环境 -- [ ] 知你--会员功能 - -### 学习计划 -- [ ] 学习内容1 -- [ ] 学习内容2 - -### 其他计划 -- [ ] 其他事项1 - -## 工作记录 - -### 已完成 -- ✅ 从正式环境切换到开发环境 - - 时间: HH:MM - HH:MM - - 内容: http://101.43.95.130:8082/c/zhini_im/+/104 - - http://101.43.95.130:8082/c/zhini_im/+/105 - - 收获: - -- ✅ 知你--会员功能开发 - - 时间: HH:MM - HH:MM - - 内容: http://101.43.95.130:8082/c/zhini_im/+/106 - - 收获: - -### 进行中 -- 🔄 进行中事项1 - - 开始时间: HH:MM - - 当前进度: - - 遇到的问题: - - 下一步计划: - - 继续知你--会员功能开发 - -### 待处理 -- ⏳ 待处理事项1 - - 计划时间: HH:MM - - 优先级: 高/中/低 - -## 学习记录 - -### 技术学习 -- **学习内容**: -- **学习时间**: HH:MM - HH:MM -- **学习方式**: 阅读/实践/视频 -- **关键收获**: -- **相关链接**: [[相关文档]] - -### 源码阅读 -- **阅读模块**: -- **阅读时间**: HH:MM - HH:MM -- **关键理解**: -- **疑问**: -- **相关链接**: [[相关源码]] - -### 问题解决 -- **问题描述**: -- **解决过程**: -- **解决方案**: -- **经验总结**: -- **相关链接**: [[相关文档]] - -## 会议记录 - -### 会议1 -- **时间**: HH:MM - HH:MM -- **主题**: -- **参与人**: -- **关键内容**: -- **行动项**: -- **相关链接**: [[会议记录]] - -## 思考与总结 - -### 今日收获 -1. 收获1 -2. 收获2 -3. 收获3 - -### 今日反思 -- 做得好的地方: -- 需要改进的地方: -- 改进计划: - -### 明日计划 -1. 计划1 -2. 计划2 -3. 计划3 - -## 技术笔记 - -### 技术点1 -- **内容**: -- **代码示例**: -```java -// 代码示例 -``` - -- **关键理解**: -- **相关链接**: [[相关文档]] - -### 技术点2 -- **内容**: -- **关键理解**: - -## 问题与疑问 - -### 问题1 -- **问题描述**: -- **思考**: -- **待解决**: - -### 问题2 -- **问题描述**: -- **思考**: - -## 相关链接 - -- [[相关项目]] -- [[相关文档]] -- [[相关笔记]] - -## 备注 - -- 备注1 -- 备注2 diff --git a/docs/Obsidian笔记体系/Daily/2026-01-14.md b/docs/Obsidian笔记体系/Daily/2026-01-14.md deleted file mode 100644 index ce3c758..0000000 --- a/docs/Obsidian笔记体系/Daily/2026-01-14.md +++ /dev/null @@ -1,131 +0,0 @@ -## 基本信息 -- **日期**: 2026-01-14 -- **星期**: 星期三 -- **天气**: 晴 -- **心情**: 良好 - -## 今日计划 - -### 工作安排 -- [ ] 知你--会员功能 -- [ ] 知你--聊天会话界面跑马灯温馨提示 - -### 学习计划 -- [ ] 学习内容1 -- [ ] 学习内容2 - -### 其他计划 -- [ ] 其他事项1 - -## 工作记录 - -### 已完成 -- ✅ 知你--会员功能开发 - - 时间: HH:MM - HH:MM - - 内容: http://101.43.95.130:8082/c/zhini_im/+/106 - - 收获: - -- ✅ 知你--聊天会话界面跑马灯温馨提示 - - 时间: HH:MM - HH:MM - - 内容: http://101.43.95.130:8082/c/zhini_im/+/107 - - 收获: -### 进行中 -- 🔄 进行中事项1 - - 开始时间: HH:MM - - 当前进度: - - 遇到的问题: - - 下一步计划: - - 继续知你--会员功能开发 - -### 待处理 -- ⏳ 待处理事项1 - - 计划时间: HH:MM - - 优先级: 高/中/低 - -## 学习记录 - -### 技术学习 -- **学习内容**: -- **学习时间**: HH:MM - HH:MM -- **学习方式**: 阅读/实践/视频 -- **关键收获**: -- **相关链接**: [[相关文档]] - -### 源码阅读 -- **阅读模块**: -- **阅读时间**: HH:MM - HH:MM -- **关键理解**: -- **疑问**: -- **相关链接**: [[相关源码]] - -### 问题解决 -- **问题描述**: -- **解决过程**: -- **解决方案**: -- **经验总结**: -- **相关链接**: [[相关文档]] - -## 会议记录 - -### 会议1 -- **时间**: HH:MM - HH:MM -- **主题**: -- **参与人**: -- **关键内容**: -- **行动项**: -- **相关链接**: [[会议记录]] - -## 思考与总结 - -### 今日收获 -1. 收获1 -2. 收获2 -3. 收获3 - -### 今日反思 -- 做得好的地方: -- 需要改进的地方: -- 改进计划: - -### 明日计划 -1. 计划1 -2. 计划2 -3. 计划3 - -## 技术笔记 - -### 技术点1 -- **内容**: -- **代码示例**: -```java -// 代码示例 -``` - -- **关键理解**: -- **相关链接**: [[相关文档]] - -### 技术点2 -- **内容**: -- **关键理解**: - -## 问题与疑问 - -### 问题1 -- **问题描述**: -- **思考**: -- **待解决**: - -### 问题2 -- **问题描述**: -- **思考**: - -## 相关链接 - -- [[相关项目]] -- [[相关文档]] -- [[相关笔记]] - -## 备注 - -- 备注1 -- 备注2 diff --git a/docs/Obsidian笔记体系/Daily/2026-01-15.md b/docs/Obsidian笔记体系/Daily/2026-01-15.md deleted file mode 100644 index 30b39b7..0000000 --- a/docs/Obsidian笔记体系/Daily/2026-01-15.md +++ /dev/null @@ -1,131 +0,0 @@ -## 基本信息 -- **日期**: 2026-01-15 -- **星期**: 星期四 -- **天气**: 晴 -- **心情**: 良好 - -## 今日计划 - -### 工作安排 -- [ ] 知你--会员功能 -- [ ] 知你--聊天会话界面跑马灯温馨提示 - -### 学习计划 -- [ ] 学习内容1 -- [ ] 学习内容2 - -### 其他计划 -- [ ] 其他事项1 - -## 工作记录 - -### 已完成 -- ✅ 知你--会员功能开发 - - 时间: HH:MM - HH:MM - - 内容: http://101.43.95.130:8082/c/zhini_im/+/106 - - 收获: - -- ✅ 知你--聊天会话界面跑马灯温馨提示 - - 时间: HH:MM - HH:MM - - 内容: http://101.43.95.130:8082/c/zhini_im/+/107 - - 收获: -### 进行中 -- 🔄 进行中事项1 - - 开始时间: HH:MM - - 当前进度: - - 遇到的问题: - - 下一步计划: - - 继续知你--会员功能开发 - -### 待处理 -- ⏳ 待处理事项1 - - 计划时间: HH:MM - - 优先级: 高/中/低 - -## 学习记录 - -### 技术学习 -- **学习内容**: -- **学习时间**: HH:MM - HH:MM -- **学习方式**: 阅读/实践/视频 -- **关键收获**: -- **相关链接**: [[相关文档]] - -### 源码阅读 -- **阅读模块**: -- **阅读时间**: HH:MM - HH:MM -- **关键理解**: -- **疑问**: -- **相关链接**: [[相关源码]] - -### 问题解决 -- **问题描述**: -- **解决过程**: -- **解决方案**: -- **经验总结**: -- **相关链接**: [[相关文档]] - -## 会议记录 - -### 会议1 -- **时间**: HH:MM - HH:MM -- **主题**: -- **参与人**: -- **关键内容**: -- **行动项**: -- **相关链接**: [[会议记录]] - -## 思考与总结 - -### 今日收获 -1. 收获1 -2. 收获2 -3. 收获3 - -### 今日反思 -- 做得好的地方: -- 需要改进的地方: -- 改进计划: - -### 明日计划 -1. 计划1 -2. 计划2 -3. 计划3 - -## 技术笔记 - -### 技术点1 -- **内容**: -- **代码示例**: -```java -// 代码示例 -``` - -- **关键理解**: -- **相关链接**: [[相关文档]] - -### 技术点2 -- **内容**: -- **关键理解**: - -## 问题与疑问 - -### 问题1 -- **问题描述**: -- **思考**: -- **待解决**: - -### 问题2 -- **问题描述**: -- **思考**: - -## 相关链接 - -- [[相关项目]] -- [[相关文档]] -- [[相关笔记]] - -## 备注 - -- 备注1 -- 备注2 diff --git a/docs/Obsidian笔记体系/Projects/agent/0618.md b/docs/Obsidian笔记体系/Projects/agent/0618.md new file mode 100644 index 0000000..405ec36 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/agent/0618.md @@ -0,0 +1,45 @@ +改进优先级 + + ┌────────┬──────────────────────────────────────┬────────────────────────────────┐ + │ 优先级 │ 改进项 │ 效果 │ + ├────────┼──────────────────────────────────────┼────────────────────────────────┤ + │ P0 │ 增加 QA→Developer 反馈循环 │ 致命 bug 能在交付前修复 │ + ├────────┼──────────────────────────────────────┼────────────────────────────────┤ + │ P0 │ 修复 Planner 的 markdown→JSON 解析 │ 并行执行真正生效 │ + ├────────┼──────────────────────────────────────┼────────────────────────────────┤ + │ P1 │ 第一个 Agent 先读取目标项目代码 │ 产物能直接集成 │ + ├────────┼──────────────────────────────────────┼────────────────────────────────┤ + │ P1 │ 增加 Architect 角色 │ 方案设计阶段避免与现有架构冲突 │ + ├────────┼──────────────────────────────────────┼────────────────────────────────┤ + │ P2 │ Agent 间共享上下文(非仅传输出文本) │ Designer 能看到 PM 的详细分析 │ + ├────────┼──────────────────────────────────────┼────────────────────────────────┤ + │ P2 │ 支持多轮对话而非单次生成 │ 复杂任务可分步迭代 │ + + + + + + + + + + + + 如果你指的是跨阶段人工交互式追问(如:PM 输出计划后用户可修改确认再继续),当前代码中暂未找到该能力。需要我实现吗? + + + + + + + +改进建议 + + Developer 需要加强 Promise 理解 — Element Plus 的 validate() 返回 Promise 而非 reject-on-failure,两轮都栽在这里。建议在 developer system prompt 中加入常见框架 API + 的陷阱提示 + 启用 QA → Developer 修复循环 — QA 发现了所有问题但未触发修复。当前 MAX_FIX_ROUNDS=2 可能不足以覆盖。可考虑对 critical 级别 issue 强制执行至少一轮修复 + PM 应明确功能优先级 — 注册功能写了但 developer 没实现,PM 没有标注 "MUST HAVE",导致被偷懒跳过 + DevOps 需实际构建验证 — 缺少 vue-tsc --noEmit 和 vite build 的实际输出日志 + Architect 可进一步发挥 — 可以要求架构师输出更具体的 "现有代码质量评估",这样 PM 就不会规划超出实际需求的复杂功能 + + 总结:第三轮质量明显提升,修复 validateForm 后 Login.vue 可直接用于天工平台。Developer 的 Promise 处理是需要系统性修复的薄弱环节。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/agent/agent资料.md b/docs/Obsidian笔记体系/Projects/agent/agent资料.md index a974dc3..b533daa 100644 --- a/docs/Obsidian笔记体系/Projects/agent/agent资料.md +++ b/docs/Obsidian笔记体系/Projects/agent/agent资料.md @@ -80,5 +80,74 @@ D:\aaa\aiagent\上传git仓.md 上传git仓 4.项目熟悉D:\aaa\aiagent\docs\ 5.可以在git仓查看历史D:\aaa\aiagent\上传git仓.md -任务,生成一个家庭医生的agent -http://localhost:3001/agents \ No newline at end of file + + + +本地数据库:localhost root 3306端口 密码123456 + +云数据库: + 项目 │ 地址 │ + ├──────────┼─────────────────────────────────────────────────┤ + │ 主机 │ gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com │ + ├──────────┼─────────────────────────────────────────────────┤ + │ 端口 │ 24936 │ + ├──────────┼─────────────────────────────────────────────────┤ + │ 数据库 │ agent_db │ + ├──────────┼─────────────────────────────────────────────────┤ + │ 配置位置 │ D:\aaa\aiagent\backend\.env + + + + + +现有[天工智能体平台](http://localhost:3001/teams),里面有很多的虚拟团队,你可以调用他们来给我干活吗,你来当指挥,虚拟团队在干活中遇到的各种问题,报告给我来决定是不是要进行修复。 + + +你可以给系统应用测试团队下达: 测试Android客户端 D:\aaa\aiagent\android 的代码质量和潜在bug,让团队中每个agent都能扫描真实源码(可以参考设计文档),对标商业化产品,有哪些交互体验等等问题 + + +要求:当你发现问题后,停止任务,然后及时修改纠正,完成后继续指挥虚拟团队完成任务。 +目的:将虚拟团队打造成高效协作,可以高标准高质量完成任务的团队。 + + + + +你来当指挥,虚拟团队系统应用测试团队来干活 + 使用步骤 + + 1. 访问 http://localhost:3001/teams + 2. 点击 "系统应用测试团队" 按钮(黄色按钮) + 3. 6 个角色槽位自动填充完毕,团队名固定为"系统应用测试团队" + 4. 在底部输入框输入要测试的项目描述,例如: + ▎ 请深度测试 D:\aaa\aiagent\android 项目的功能完整性、交互体验、边界容错和性能瓶颈 + 5. 建议点击 "流式执行"(可实时看到每个 Agent 的思考/工具调用/输出) + + 执行流程 + + 阶段0: 系统架构师 + ├─ list_files 递归扫描目录 (depth 3-4) + ├─ project_scan 自动识别技术栈 + ├─ file_read 读取 5-7 个核心文件 (不超过10次) + └─ 输出: 架构上下文文档(技术栈/目录结构/核心模块/数据流/架构风险) + + 阶段1: 测试规划师 + ├─ 读取架构师文档 + ├─ file_read 自扫 3-5 个关键源文件 + └─ 输出: JSON 测试计划 (project_name + phases[4-6] + acceptance_criteria) + phases 支持 depends_on 实现并行执行 + + 阶段2-N: 各测试角色并行/顺序执行 + ├─ 功能测试员: 扫 5-6 个核心文件 → 输出 ≥12 个 bug (含文件路径+行号+修复代码) + ├─ 体验审核员: 扫 4-5 个 UI 文件 → 对比 ChatGPT/豆包 输出 UX 评审 + ├─ 边界探索员: 扫 5-6 文件 + 2-3 次 grep 查 !!、?.let、catch 等 → 边界用例报告 + └─ 性能评估员: 扫 5-6 文件 → 查 runBlocking、GlobalScope、callbackFlow 等反模式 + + 最终: 汇总全部报告 → 输出项目文件路径 + 文件清单 + + 关键设计 + + - 真实代码优先: 每个角色被强制要求 file_read 真实源文件(限制 4-7 次),禁止只看文档输出空泛结论 + - STOP-SCANNING 规则: 超过 10 次迭代仍未产出则强制写 file_write + - 架构师先行: 架构师扫描代码生成上下文文档,后续测试角色基于该文档 + 自己扫描开展工作 + - 并行支持: 测试规划师的 phases JSON 中的 depends_on 字段支持 DAG 并行(互不依赖的阶段同时执行) + - 产出文件: 所有测试报告写入 team_projects/{team_id}/{project_name}/ 目录 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/agent/下一步计划0505.md b/docs/Obsidian笔记体系/Projects/agent/下一步计划0505.md deleted file mode 100644 index b7082b4..0000000 --- a/docs/Obsidian笔记体系/Projects/agent/下一步计划0505.md +++ /dev/null @@ -1,175 +0,0 @@ - --- - 当前进度 - - ┌─────────┬────────────────────────────────────────┬─────────────────────────────┐ - │ 阶段 │ 内容 │ 状态 │ - ├─────────┼────────────────────────────────────────┼─────────────────────────────┤ - │ Phase 1 │ 输出质量验证 + 节点级自动重试 │ ✅ 完成 │ - ├─────────┼────────────────────────────────────────┼─────────────────────────────┤ - │ Phase 2 │ Orchestrator 入工作流 + 工具级人工审批 │ ✅ 完成 │ - ├─────────┼────────────────────────────────────────┼─────────────────────────────┤ - │ Phase 3 │ 并行执行 + 进度上报 + 结果缓存 │ ✅ 完成 (含 Bug #1-#5 修复) │ - ├─────────┼────────────────────────────────────────┼─────────────────────────────┤ - │ Phase 4 │ 降级回退 + 知识共享 + 异步执行 │ 待开发 │ - └─────────┴────────────────────────────────────────┴─────────────────────────────┘ - - --- - 下一步:第四阶段 — 容错与共享 - - 根据 解决缺失能力计划.md,最后 3 项: - - 4.1 降级/回退链 - - - AgentLLMConfig 加 fallback_llm 字段 - - 主模型挂了自动切备用模型 - - Agent 失败自动切 fallback_agent - - 4.2 Agent 间知识共享 - - - 新增 GlobalKnowledge 表 - - Agent 执行完自动提取知识写入全局池 - - 其他 Agent 初始化时检索全局知识 - - 4.3 Agent 异步执行 - - - execute_agent_task 当前是空壳占位符 - - 实现真正的 Celery 异步 Agent 执行 - - 定时调度能真正运行 Agent - - --- - 要开始做 Phase 4 吗? - -✻ Churned for 41s - -❯ 当前系统,还能做些什么需求,进一步提升呢 - - Read 2 files, listed 1 directory (ctrl+o to expand) - -● 让我全面梳理一下,结合已有规划文档和架构师/测试/产品经理视角。 - - --- - 当前系统还能做的需求全景 - - 一、已规划的 Phase 4(来自 解决缺失能力计划.md) - - ┌─────┬──────────────────┬─────────────────────────────────────────────────────┐ - │ # │ 需求 │ 说明 │ - ├─────┼──────────────────┼─────────────────────────────────────────────────────┤ - │ 4.1 │ 降级/回退链 │ 模型挂了自动切备用模型,Agent 失败切 fallback_agent │ - ├─────┼──────────────────┼─────────────────────────────────────────────────────┤ - │ 4.2 │ Agent 间知识共享 │ 打破记忆隔离,Agent A 学到的东西 Agent B 也能用 │ - ├─────┼──────────────────┼─────────────────────────────────────────────────────┤ - │ 4.3 │ Agent 异步执行 │ execute_agent_task 是空壳,定时调度无法真正异步执行 │ - └─────┴──────────────────┴─────────────────────────────────────────────────────┘ - - ▎ 这是最直接的下一步,按计划走。 - - --- - 二、监控告警前端(后端已完成,前端缺失) - - 后端 API 全部就绪,前端一个页面都没写: - - - 系统监控面板 — CPU/内存/磁盘/执行统计图表 - - 告警规则管理 — 规则 CRUD + 启用/禁用 - - 告警日志查看 — 告警历史 + 通知配置 - - ▎ 平台可观测性的最后一公里。 - - --- - 三、生产就绪(DevOps / 运维) - - ┌──────────────────────┬────────────────────────────────────────────┐ - │ 需求 │ 说明 │ - ├──────────────────────┼────────────────────────────────────────────┤ - │ Docker 生产环境配置 │ 目前只有 dev compose,缺 prod 配置 │ - ├──────────────────────┼────────────────────────────────────────────┤ - │ Prometheus + Grafana │ 指标收集 + 仪表板(业务指标 + 系统指标) │ - ├──────────────────────┼────────────────────────────────────────────┤ - │ ELK 日志聚合 │ 日志集中查询分析,替代目前本地 backend.log │ - ├──────────────────────┼────────────────────────────────────────────┤ - │ CI/CD 流水线 │ GitHub Actions:自动测试 → 构建 → 部署 │ - ├──────────────────────┼────────────────────────────────────────────┤ - │ API 限流 │ 防止滥用,保护后端 │ - ├──────────────────────┼────────────────────────────────────────────┤ - │ 密钥管理 │ 敏感信息加密存储,不用明文 .env │ - └──────────────────────┴────────────────────────────────────────────┘ - - --- - 四、用户体验增强 - - ┌────────────────┬─────────────────────────────────────────┐ - │ 需求 │ 说明 │ - ├────────────────┼─────────────────────────────────────────┤ - │ 工作流自动布局 │ 节点一键对齐,美观排列 │ - ├────────────────┼─────────────────────────────────────────┤ - │ 节点搜索/筛选 │ 复杂工作流快速定位节点 │ - ├────────────────┼─────────────────────────────────────────┤ - │ Agent 快速测试 │ 在配置页直接测试 Agent,不用跳到对话页 │ - ├────────────────┼─────────────────────────────────────────┤ - │ Agent 使用统计 │ 每个 Agent 的调用次数、成功率、平均耗时 │ - ├────────────────┼─────────────────────────────────────────┤ - │ 移动端适配 │ 至少执行状态查看、Agent 对话 │ - └────────────────┴─────────────────────────────────────────┘ - - --- - 五、高级功能(差异化竞争) - - ┌─────────────────┬───────────────────────────────────────────────┐ - │ 需求 │ 说明 │ - ├─────────────────┼───────────────────────────────────────────────┤ - │ 主控台/应用商店 │ 选模板 → 填参数 → 执行 → 看结果,面向业务用户 │ - ├─────────────────┼───────────────────────────────────────────────┤ - │ 统一 DSL │ 不同模板复用统一输入契约,一套输入驱动多模板 │ - ├─────────────────┼───────────────────────────────────────────────┤ - │ 成本预算治理 │ 按 Agent 设置 token/调用预算,超限熔断 │ - ├─────────────────┼───────────────────────────────────────────────┤ - │ 插件系统 │ 第三方开发自定义节点,插件市场上架 │ - ├─────────────────┼───────────────────────────────────────────────┤ - │ 多租户支持 │ SaaS 化,数据隔离 + 资源配额 │ - └─────────────────┴───────────────────────────────────────────────┘ - - --- - 六、质量保障 - - ┌────────────────┬───────────────────────────────────┐ - │ 需求 │ 说明 │ - ├────────────────┼───────────────────────────────────┤ - │ 单元测试覆盖率 │ 当前有框架但覆盖率低,目标 80%+ │ - ├────────────────┼───────────────────────────────────┤ - │ E2E 测试 │ Playwright 覆盖核心用户流程 │ - ├────────────────┼───────────────────────────────────┤ - │ 性能压测 │ Locust/k6 压测 API,找瓶颈 │ - ├────────────────┼───────────────────────────────────┤ - │ 安全扫描 │ OWASP ZAP + SQLMap + 依赖漏洞检查 │ - └────────────────┴───────────────────────────────────┘ - - --- - 七、Agent 能力边界拓展 - - ┌──────────────────┬───────────────────────────────────────────────┐ - │ 需求 │ 说明 │ - ├──────────────────┼───────────────────────────────────────────────┤ - │ 多模态 Agent │ 支持图片识别、语音输入(tessdata 目录已存在) │ - ├──────────────────┼───────────────────────────────────────────────┤ - │ Agent 协作工作台 │ 可视化编排多 Agent 协作流程 │ - ├──────────────────┼───────────────────────────────────────────────┤ - │ Agent 技能商店 │ Agent 发布到公共市场,共享复用 │ - └──────────────────┴───────────────────────────────────────────────┘ - - --- - 建议优先级 - - 第一优先(生产就绪):Phase 4 + 监控告警前端 + Docker 生产配置 - 第二优先(体验提升):工作流自动布局 + Agent 快速测试 + 主控台 - 第三优先(竞争壁垒):插件系统 + 多租户 + 统一 DSL - 第四优先(质量保障):测试覆盖率 + E2E + 性能压测 - - 总共约 20+ 个可做需求,看你想先往哪个方向发力?是按计划继续做 Phase 4,还是先补监控告警前端,还是往生产就绪方向走? - - - - - -将这些需求登记到工单平台(Gitea) D:\aaa\aiagent\docs\平台资料.md - -可参考D:\aaa\aiagent\docs\创建工单总结.md \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/agent/下一步计划0613.md b/docs/Obsidian笔记体系/Projects/agent/下一步计划0613.md new file mode 100644 index 0000000..b1a0cbe --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/agent/下一步计划0613.md @@ -0,0 +1,270 @@ + --- + 🔴 P0 — 对话自动压缩 (Tiered Auto-Compaction) + + 这个没做,豆包Pro 永远成不了真正好用的聊天助手。 + + Claude Code 有一个三级压缩体系: + + ┌───────────────────────┬───────────────────────┬─────────────────────────────────────────────────────────────────┬────────────────────────────────┐ + │ 级别 │ 触发条件 │ 机制 │ 效果 │ + ├───────────────────────┼───────────────────────┼─────────────────────────────────────────────────────────────────┼────────────────────────────────┤ + │ MicroCompact │ 每次对话前 │ 把旧工具结果(read/grep/search)替换为 [Old content cleared] 桩 │ 回收 30-50% token 不丢对话质量 │ + ├───────────────────────┼───────────────────────┼─────────────────────────────────────────────────────────────────┼────────────────────────────────┤ + │ SessionMemory Compact │ 距窗口上限 ~13K token │ 将旧对话总结为记忆条目注入系统提示词 │ 进一步压缩 │ + ├───────────────────────┼───────────────────────┼─────────────────────────────────────────────────────────────────┼────────────────────────────────┤ + │ Full Compact │ 以上都失败 │ 分叉一个新 Agent 对整个对话做摘要,替换旧消息 │ 最终兜底 │ + └───────────────────────┴───────────────────────┴─────────────────────────────────────────────────────────────────┴────────────────────────────────┘ + + 关键设计: + - reactiveCompact.ts — 捕捉 API 返回 413 prompt_too_long 后被动触发压缩 + - 熔断机制:连续压缩失败 3 次就停止,避免死循环 + - 分组 (grouping.ts) — 按 API 轮次找安全分割点,不切断中间的 tool call 序列 + + 对应豆包Pro:当前 memory_max_history=35 条消息硬截断,没有压缩机制。对话超过 35 轮就"失忆"。实现后对话可以无限延续。 + + --- + 🟡 P1 — 对话分支 (Conversation Branching) + + Claude Code 支持用户在任意时刻分叉对话: + + 当前对话 ──→ 分叉到新会话 ──→ 在新分支探索 + │ │ + └── 原会话保留,随时可恢复 ←───┘ + + 机制:复制 transcript 文件到新 UUID,保留 forkedFrom 溯源,自动命名防冲突("话题 (Branch)", "话题 (Branch 2)")。 + + 对应豆包Pro:用户说 "你给的方案A不错,但我还想看看方案B",可以分叉两条路同时探索,不丢失任何一边的上下文。这是真豆包都没有的能力。 + + --- + 🟡 P1 — 工具结果流式美化 (Streamlined Output) + + Claude Code 不会把原始工具 JSON 输出给用户看,而是做实时转译: + + // 原始:3个 Grep 结果 + 2个 FileRead 结果(几百行 JSON) + // 转译后:"Searched 3 patterns, read 2 files, wrote 1 file." + + // 原始:{"stdout": "...", "stderr": "", "returncode": 0} + // 转译后:"Code executed successfully → result: [1, 1, 2, 3, 6, 8, 10]" + + 核心文件:streamlinedTransform.ts、groupToolUses.ts、collapseReadSearch.ts + + 对应豆包Pro:当前工具调用过程以 JSON steps 返回,前端需要自己做美化。实现后用户看到的是自然语言描述而不是原始数据。 + + --- + 🟡 P2 — 系统提示词分层装配 + + Claude Code 的系统提示词不是一整块,而是 15+ 个可组合 Section: + + ┌─────────────────────────┐ + │ Cacheable (静态前缀) │ ← 可被 API prompt cache 命中 + │ ├─ session_guidance │ + │ ├─ memory │ + │ ├─ model_override │ + │ ├─ language │ + │ ├─ output_style │ + ├─────────────────────────┤ ← static/dynamic boundary + │ Volatile (动态后缀) │ ← 每轮重新计算 + │ ├─ tool_summaries │ + │ ├─ token_budget │ + │ ├─ mcp_instructions │ + │ └─ scratchpad │ + └─────────────────────────┘ + + 每个 Section 用 Promise.all 并行加载,支持 feature flag 控制显隐。 + + 对应豆包Pro:当前 system_prompt 是一个大字符串。改为分层后: + - 静态层(人格+能力描述)→ 缓存,不消耗每次 API 调用的 token + - 动态层(当前记忆+上下文摘要)→ 每轮重新注入 + - 按场景切换:闲聊模式精简 tools 描述,代码模式强化工具指令 + + --- + 🟢 P2 — Token 预算管理 + + Claude Code 有完整的 token 追踪链路: + + 当前 token 用量 / 模型窗口上限 / 剩余空间 / 预警阈值 + ↓ 接近上限 + 自动触发压缩 + ↓ 还是不够 + 提示用户 /compact + + 用户甚至可以输入 +500k 手动调整预算上限。 + + 对应豆包Pro:当前完全没有 token 计数,对话可能被静默截断。加入后可以在 UI 上显示用量条,接近上限时主动提醒或自动压缩。 + + --- + 🟢 P3 — Agent 蜂群 (Swarms) + + Claude Code 支持一个 Leader Agent 拉多个 Teammate 并行工作: + + 用户: "帮我做旅行计划、订机票、找酒店" + │ + Leader Agent + ┌────┼────┐ + ▼ ▼ ▼ + 规划 机票 酒店 ← 三个 Agent 并行,通过 mailbox 通信 + + 对应豆包Pro:复杂查询可以拆成子任务并行处理,大幅缩短响应时间。 + + --- + 总结:实施路线 + + P0 P1 P2 P3 + 对话压缩 分支+流美化 提示词装配 Swarms + Token预算 + ───●──────────────●────────────────●────────────────●──→ + 本周 下周 + + ┌──────┬────────────────────────────────────────┬─────────────────────────┐ + │ 阶段 │ 做什么 │ 豆包Pro提升 │ + ├──────┼────────────────────────────────────────┼─────────────────────────┤ + │ 先做 │ 对话压缩 (microCompact + full compact) │ 73% → 78% │ + ├──────┼────────────────────────────────────────┼─────────────────────────┤ + │ 接着 │ 工具结果流式美化 │ 用户体验质变 │ + ├──────┼────────────────────────────────────────┼─────────────────────────┤ + │ 然后 │ 系统提示词分层装配 │ API 成本降 30%, 灵活性↑ │ + ├──────┼────────────────────────────────────────┼─────────────────────────┤ + │ 再后 │ Token 预算 + 对话分支 │ 79% → 82% │ + ├──────┼────────────────────────────────────────┼─────────────────────────┤ + │ 远期 │ Agent Swarms 并行 │ 复杂任务快 3 倍 │ + └──────┴────────────────────────────────────────┴─────────────────────────┘ + + 最紧急的是对话压缩 — 没有它,豆包 Pro 永远停留在"能聊 35 轮"。有了它,才是真正可用的聊天助手。 + + + +D:\cd\claude-code 项目拥有 +向量语义记忆 (相似对话检索) │ SiliconFlow Embedding 吗? +那么D:\cd\claude-code的记忆水平怎么样? + + + + + + +根据之前的分析,从 Claude Code 可借鉴的功能还有这些未实现: + + ┌────────┬─────────────────────────────────────────┬──────────────────────────────────────────────┐ + │ 优先级 │ 功能 │ 说明 │ + ├────────┼─────────────────────────────────────────┼──────────────────────────────────────────────┤ + │ P1 │ 对话分支 (Conversation Branching) │ 用户可回退到任意历史点重新开始,不丢失原对话 │ + ├────────┼─────────────────────────────────────────┼──────────────────────────────────────────────┤ + │ P1 │ 精简输出 (Streamlined Output) │ 工具结果智能截断,避免上下文膨胀 │ + ├────────┼─────────────────────────────────────────┼──────────────────────────────────────────────┤ + │ P2 │ 系统提示词分段 (System Prompt Sections) │ 结构化提示词,动态注入/移除特定段 │ + ├────────┼─────────────────────────────────────────┼──────────────────────────────────────────────┤ + │ P2 │ Token 预算显示 │ 前端实时显示 token 用量和压缩状态 │ + ├────────┼─────────────────────────────────────────┼──────────────────────────────────────────────┤ + │ P3 │ Agent 集群 (Agent Swarms) │ 多个 Agent 并行协作,投票/分工 │ + └────────┴─────────────────────────────────────────┴──────────────────────────────────────────────┘ + + 另外还有一些可做的优化: + - 安装 tiktoken:目前 cl100k_base 编码器已能加载,但未作为正式依赖写入 requirements + - 端到端长对话压力测试:50+ 轮连续对话验证压缩不丢上下文 + + + + + + + + + + + + + + + + + + +取决于场景。 没有绝对的好坏。 + + --- + 核心取舍 + + ┌──────────┬─────────────────────────────────────┬──────────────────────────┐ + │ │ Claude Code (LLM 分类) │ 天工 (向量搜索) │ + ├──────────┼─────────────────────────────────────┼──────────────────────────┤ + │ 检索精度 │ 高(LLM 理解语义) │ 中(余弦相似度,可能漏) │ + ├──────────┼─────────────────────────────────────┼──────────────────────────┤ + │ 检索成本 │ 每次 1 次 LLM 调用 │ 几乎免费 │ + ├──────────┼─────────────────────────────────────┼──────────────────────────┤ + │ 检索速度 │ 慢(等 LLM 响应) │ 快(毫秒级) │ + ├──────────┼─────────────────────────────────────┼──────────────────────────┤ + │ 规模上限 │ ~200 条记忆(受 manifest 长度限制) │ 百万级 │ + ├──────────┼─────────────────────────────────────┼──────────────────────────┤ + │ 外部依赖 │ 零 │ Embedding API(脆弱) │ + ├──────────┼─────────────────────────────────────┼──────────────────────────┤ + │ 离线可用 │ 是 │ 否 │ + └──────────┴─────────────────────────────────────┴──────────────────────────┘ + + --- + 说实话 + + Claude Code 的方案更适合 Claude Code 自己 — 它是一个单用户 CLI 工具,记忆量不大,每次检索顺便调一下 Sonnet 无所谓。 + + 向量搜索更适合天工 — 你有 6 个飞书机器人、多个用户、记忆会持续增长。用 LLM 做分类器扛不住 1000+ 条记忆,向量搜索轻松应对。 + + --- + 所以 + + 天工平台的方案选择是对的(向量语义记忆),问题只是 SiliconFlow 实名认证没做完。认证通过后 Embedding 服务恢复,这个架构就完整了。 + + Claude Code 不依赖 embedding 这点值得借鉴 — 但不是用它替代向量搜索,而是学它的 后台记忆自动提取(Extract Memories / Auto Dream),这个天工目前没有。 + + + + + + +SiliconFlow Embedding 已恢复 + + BAAI/bge-m3 模型正常工作,1024 维向量生成成功。向量语义记忆现在可以写入新消息了。 + + 改动总结: .env 第 21 行,模型从 netease-youdao/bce-embedding-base_v1(已下线)→ BAAI/bge-m3(8192 token 上限,中英多语言)。 + + --- + Claude Code 还有哪些可借鉴的改进? + + 从刚才的研究对比,天工可以借鉴的 3 个低成本高价值改进: + + 1. 后台自动记忆提取(最重要) + + Claude Code 每轮对话结束后,fork 一个子 Agent 扫描对话,自动提炼关键信息写入持久记忆。 + + 天工现在:对话结束 → 消息存 DB → 等下次手动调用 generate_embedding + Claude Code:对话结束 → 子 Agent 读对话 → 提取事实 → 写 MEMORY.md + + 天工可以实现: 每次 Agent 对话完成后,异步调 LLM 做一次"对话摘要 → 提取关键事实 → 写入持久记忆"。不需要 embedding,纯 LLM 调用。 + + 2. 夜间记忆整合(Auto Dream) + + 每隔 24 小时 + 累计 5 次以上新会话,自动合并记忆、去重、更新过期信息。 + + 天工可以实现: 在现有 run_scheduler_loop() 里加一个每日任务,凌晨 3 点扫描当天向量记忆,merge 相似条目、删除矛盾旧条目。 + + 3. 记忆分类体系 + + Claude Code 的 4 类记忆(user / feedback / project / reference)让检索更精准: + + ┌───────────┬──────────────────────┐ + │ 类型 │ 天工对应 │ + ├───────────┼──────────────────────┤ + │ user │ 用户偏好、个人信息 │ + ├───────────┼──────────────────────┤ + │ feedback │ 用户反馈、纠错记录 │ + ├───────────┼──────────────────────┤ + │ project │ 项目上下文、任务进展 │ + ├───────────┼──────────────────────┤ + │ reference │ 外部系统链接、配置 │ + └───────────┴──────────────────────┘ + + 天工可以实现: 在 VectorEntry 的 metadata 里加 memory_type 字段,写入和检索时按类型过滤,减少噪音。 + + --- + 要我实现其中哪一个?推荐先做 #1 后台自动记忆提取,改动最小,效果最明显。 + + +给天工agent的记忆能力写测试用例并验证 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/agent/未命名 1.md b/docs/Obsidian笔记体系/Projects/agent/未命名 1.md new file mode 100644 index 0000000..893c17f --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/agent/未命名 1.md @@ -0,0 +1,133 @@ +现在我完全理解了系统。当前架构分析: + + 现状:只有 1 个模板 "软件公司虚拟团队"(PM/设计师/开发/测试/DevOps),硬编码在后端 + team_service.py,模板工厂方法是专用的 create_software_company_template()。 + + 扩展可行性:完全可以。架构支持多模板,需要做的是: + + 1. 后端新增更多 create_*_template() 工厂方法(或重构为通用模板系统) + 2. 前端新增模板选择入口(目前只有一个"软件公司模板"按钮) + 3. 每种模板自带专属角色定义 + Agent 系统提示词 + + 我可以提议以下几类团队模板: + + ┌─────┬──────────────┬──────────────────────────────────────────────────┬────────────────────────┐ + │ # │ 模板名称 │ 角色配置 │ 适用场景 │ + ├─────┼──────────────┼──────────────────────────────────────────────────┼────────────────────────┤ + │ 1 │ 内容创作团队 │ 选题策划 / 内容编辑 / SEO优化 / 视觉设计 / │ 公众号、博客、品牌内容 │ + │ │ │ 账号运营 │ │ + ├─────┼──────────────┼──────────────────────────────────────────────────┼────────────────────────┤ + │ 2 │ 数据分析团队 │ 数据工程师 / 分析师 / 可视化 / ML工程师 │ 数据驱动决策 │ + ├─────┼──────────────┼──────────────────────────────────────────────────┼────────────────────────┤ + │ 3 │ 产品运营团队 │ 产品经理 / 运营 / 用户研究 / 增长黑客 │ 产品上线后的持续运营 │ + ├─────┼──────────────┼──────────────────────────────────────────────────┼────────────────────────┤ + │ 4 │ 安全审计团队 │ 安全架构师 / 渗透测试 / 合规审计 / 安全运维 │ 安全评估、合规 │ + ├─────┼──────────────┼──────────────────────────────────────────────────┼────────────────────────┤ + │ 5 │ 教育培训团队 │ 课程设计 / 主讲讲师 / 作业助教 / 教务管理 │ 在线教育 │ + └─────┴──────────────┴──────────────────────────────────────────────────┴────────────────────────┘ + + 你想新增哪些模板?或者你有特定的业务场景需要定制? + +✻ Brewed for 33s + +❯ 还有哪些场景的模板呢 + +● 可以从更多行业和场景来扩展。按领域分类: + + 内容与媒体 + + ┌────────────────┬───────────────────────────────────────────────────────────┐ + │ 模板 │ 角色 │ + ├────────────────┼───────────────────────────────────────────────────────────┤ + │ 短视频创作团队 │ 编导策划 / 拍摄指导 / 剪辑后期 / 运营推广 / 数据分析 │ + ├────────────────┼───────────────────────────────────────────────────────────┤ + │ 自媒体运营团队 │ 选题策划 / 内容创作 / 多平台分发 / 粉丝互动 / 商业变现 │ + ├────────────────┼───────────────────────────────────────────────────────────┤ + │ 技术文档团队 │ 文档架构师 / 技术写手 / API文档专员 / 翻译审校 / 发布管理 │ + └────────────────┴───────────────────────────────────────────────────────────┘ + + 营销与电商 + + ┌──────────────┬──────────────────────────────────────────────────────┐ + │ 模板 │ 角色 │ + ├──────────────┼──────────────────────────────────────────────────────┤ + │ 数字营销团队 │ 营销策略 / SEM/SEO / 社交媒体 / 邮件营销 / 转化优化 │ + ├──────────────┼──────────────────────────────────────────────────────┤ + │ 电商运营团队 │ 店铺运营 / 商品企划 / 活动策划 / 客服主管 / 供应链 │ + ├──────────────┼──────────────────────────────────────────────────────┤ + │ 品牌策划团队 │ 品牌策略 / 视觉设计 / 文案创意 / 媒介投放 / 竞品分析 │ + └──────────────┴──────────────────────────────────────────────────────┘ + + 金融与投资 + + ┌──────────────┬──────────────────────────────────────────────────────────┐ + │ 模板 │ 角色 │ + ├──────────────┼──────────────────────────────────────────────────────────┤ + │ 投资研究团队 │ 宏观分析师 / 行业研究员 / 财务建模 / 风险评估 / 组合管理 │ + ├──────────────┼──────────────────────────────────────────────────────────┤ + │ 财务顾问团队 │ 税务规划 / 预算管理 / 现金流分析 / 报表审计 / CFO顾问 │ + ├──────────────┼──────────────────────────────────────────────────────────┤ + │ 风控合规团队 │ 合规审查 / 风险评估 / 内部审计 / 法务顾问 / 整改监督 │ + └──────────────┴──────────────────────────────────────────────────────────┘ + + 医疗与健康 + + ┌──────────────┬──────────────────────────────────────────────────────┐ + │ 模板 │ 角色 │ + ├──────────────┼──────────────────────────────────────────────────────┤ + │ 健康管理团队 │ 健康评估师 / 营养师 / 运动康复 / 心理顾问 / 慢病管理 │ + ├──────────────┼──────────────────────────────────────────────────────┤ + │ 医疗咨询团队 │ 分诊导诊 / 病历分析 / 用药审核 / 随访管理 / 保险对接 │ + └──────────────┴──────────────────────────────────────────────────────┘ + + 教育与科研 + + ┌──────────────┬──────────────────────────────────────────────────────┐ + │ 模板 │ 角色 │ + ├──────────────┼──────────────────────────────────────────────────────┤ + │ 在线课程团队 │ 课程设计 / 内容研发 / 教学实施 / 学习评估 / 平台运维 │ + ├──────────────┼──────────────────────────────────────────────────────┤ + │ 学术研究团队 │ 文献综述 / 实验设计 / 数据分析 / 论文撰写 / 同行评审 │ + ├──────────────┼──────────────────────────────────────────────────────┤ + │ 企业培训团队 │ 需求调研 / 课程开发 / 培训讲师 / 效果评估 / 认证管理 │ + └──────────────┴──────────────────────────────────────────────────────┘ + + 工程与技术 + + ┌──────────────┬──────────────────────────────────────────────────────────┐ + │ 模板 │ 角色 │ + ├──────────────┼──────────────────────────────────────────────────────────┤ + │ AI 产品团队 │ AI产品经理 / 算法工程师 / 数据工程师 / ML运维 / 伦理审查 │ + ├──────────────┼──────────────────────────────────────────────────────────┤ + │ 游戏开发团队 │ 游戏策划 / 美术设计 / 程序开发 / 音效制作 / QA测试 │ + ├──────────────┼──────────────────────────────────────────────────────────┤ + │ 移动应用团队 │ iOS开发 / Android开发 / 后端开发 / UI设计 / 测试发布 │ + └──────────────┴──────────────────────────────────────────────────────────┘ + + 企业服务 + + ┌────────────────┬──────────────────────────────────────────────────────┐ + │ 模板 │ 角色 │ + ├────────────────┼──────────────────────────────────────────────────────┤ + │ HR 招聘团队 │ 招聘专员 / 简历筛选 / 面试评估 / 薪酬谈判 / 入职管理 │ + ├────────────────┼──────────────────────────────────────────────────────┤ + │ 客户成功团队 │ 客户经理 / 技术支持 / 培训顾问 / 续费管理 / 反馈分析 │ + ├────────────────┼──────────────────────────────────────────────────────┤ + │ 项目管理办公室 │ 项目总监 / 进度管控 / 资源协调 / 质量管理 / 沟通汇报 │ + ├────────────────┼──────────────────────────────────────────────────────┤ + │ 法务顾问团队 │ 合同审查 / 知识产权 / 劳动合规 / 诉讼支持 / 隐私合规 │ + └────────────────┴──────────────────────────────────────────────────────┘ + + 生活与房产 + + ┌──────────────┬──────────────────────────────────────────────────────┐ + │ 模板 │ 角色 │ + ├──────────────┼──────────────────────────────────────────────────────┤ + │ 装修设计团队 │ 空间规划 / 硬装设计 / 软装搭配 / 预算管理 / 施工监理 │ + ├──────────────┼──────────────────────────────────────────────────────┤ + │ 活动策划团队 │ 创意策划 / 场地统筹 / 物料设计 / 执行督导 / 应急预案 │ + ├──────────────┼──────────────────────────────────────────────────────┤ + │ 旅游定制团队 │ 行程规划 / 交通住宿 / 景点导览 / 美食推荐 / 预算优化 │ + └──────────────┴──────────────────────────────────────────────────────┘ + + 你比较感兴趣哪些场景?或者直接告诉我你想优先实现哪几个,我来规划实现方案。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/aitsc/wk1.md b/docs/Obsidian笔记体系/Projects/aitsc/wk1.md deleted file mode 100644 index 1bedbb1..0000000 --- a/docs/Obsidian笔记体系/Projects/aitsc/wk1.md +++ /dev/null @@ -1,126 +0,0 @@ -● 高优先级安全改进状态分析 - - 基于对 aitsc 项目的检查,以下是高优先级安全改进的完成情况: - - ✅ 已完成的安全改进 - - 新的配置系统已实现 - - 创建了 config/ 目录,包含 base.py、development.py、production.py、testing.py - - 根目录和 src/flask_prompt_master/config.py 都添加了弃用警告 - - 新配置系统强制从环境变量读取敏感信息,否则抛出异常 - 密码哈希算法已升级 - - auth_service.py 中已使用 bcrypt 哈希算法 - - 支持向后兼容 MD5(用于现有用户) - - 新用户注册使用 bcrypt,安全性达标 - 生产环境 CORS 配置已加固 - - production.py 中强制要求设置 CORS_ORIGINS 环境变量 - - 生产环境不能使用 ['*'],必须指定具体域名 - - ⚠️ 仍需解决的安全问题 - - .env 文件中仍包含硬编码敏感信息 - - 数据库密码:!Rjb12191 - - DeepSeek API 密钥:sk-fdf7cc1c73504e628ec0119b7e11b8cc - - 微信小程序密钥:89aa97dda3c1347c6ae3d6ab4627f1f4 - 源代码中仍有多处硬编码 - - promptsTemplates.py 中硬编码数据库密码 - - 多个路由文件(如 android_tools.py)硬编码 API 密钥作为后备值 - - 多个部署脚本和文档文件包含敏感信息 - .env 文件管理问题 - - .env 文件不应提交到版本控制 - - 应使用 .env.example 作为模板,要求用户手动创建 .env - - 🔍 发现的具体文件 - - 通过搜索发现的硬编码敏感信息文件: - - .env 文件(包含完整的敏感信息) - - src/flask_prompt_master/promptsTemplates.py(第4098、4108行有数据库密码) - - 多个路由文件使用 os.environ.get('LLM_API_KEY') or 'sk-fdf7cc1c73504e628ec0119b7e11b8cc' 模式 - - 大量文档和部署脚本文件包含敏感信息 - - 📋 建议的下一步修复 - - 立即移除 .env 中的硬编码信息 - - 使用占位符替换真实密钥 - - 添加更详细的说明要求用户从控制台获取真实密钥 - 清理源代码中的硬编码后备值 - - 移除所有 or 'hardcoded-key' 模式的后备值 - - 如果环境变量未设置,应抛出自定义异常而非使用默认值 - 加强 .env 文件管理 - - 将 .env 添加到 .gitignore - - 完善 .env.example 说明文档 - - 虽然配置架构已改进,但只要源代码和 .env 文件中还存在硬编码敏感信息,安全风险就仍然存在。 - -● 根据分析,aitsc项目的高优先级安全改进已经部分完成。具体状态如下: - - ✅ 已解决的改进 - - 配置系统重构 - - 新的配置系统位于 config/ 目录,支持多环境配置 - - 根目录 config.py 和 src/flask_prompt_master/config.py 已添加弃用警告 - - 强制从环境变量读取敏感信息,未设置时会抛出 ValueError - 密码哈希安全性升级 - - auth_service.py 已实现 bcrypt 哈希算法 - - 支持向后兼容 MD5(旧用户) - - 新用户默认使用 bcrypt,盐值标识为 'bcrypt' - 生产环境 CORS 配置加固 - - config/production.py 中强制要求设置 CORS_ORIGINS 环境变量 - - 未设置或为空时会抛出异常 - - ⚠️ 仍需解决的严重问题 - - 1. 源代码中的硬编码敏感信息 - - 多个Python文件中仍存在硬编码的敏感信息: - - 数据库密码 (!Rjb12191): - - src/flask_prompt_master/promptsTemplates.py (4098行) - - 至少10个其他脚本文件(部署、初始化脚本) - DeepSeek API 密钥 (sk-fdf7cc1c73504e628ec0119b7e11b8cc): - - src/flask_prompt_master/routes/android_tools.py (17行) - - src/flask_prompt_master/routes/expert_generate_2.py - - src/flask_prompt_master/routes/expert_generate_3.py - - src/flask_prompt_master/routes/meal_planning.py (仍有硬编码) - - 多个其他路由文件 - 微信小程序密钥 (89aa97dda3c1347c6ae3d6ab4627f1f4): - - 在 .env 文件和其他文档中 - - 2. .env 文件中的硬编码 - - .env 文件仍然包含: - - DATABASE_URL 中的数据库密码 - - LLM_API_KEY (DeepSeek API密钥) - - WX_APPID 和 WX_SECRET (微信小程序凭据) - - 风险:.env 文件可能被意外提交到版本控制,导致敏感信息泄露。 - - 3. 配置文件重复问题 - - 虽然有了新的 config/ 系统,但两个旧配置文件的弃用警告仍不够彻底: - - config.py (根目录) - - src/flask_prompt_master/config.py - - 🔍 遗留的中优先级问题 - - 大型数据文件 promptsTemplates.py (144KB) - - 仍包含硬编码的数据库连接信息 - - 应考虑迁移到数据库存储 - API密钥使用不一致 - - 有些路由文件使用 os.environ.get('LLM_API_KEY') or '硬编码密钥' 模式 - - 应统一为强制从环境变量读取,去掉 fallback 硬编码 - - 📋 建议的后续行动 - - 立即行动(高优先级): - 1. 清理所有源代码中的硬编码敏感信息 - 2. 将 .env 中的真实凭据替换为占位符 - 3. 确保 .env 在 .gitignore 中,只提交 .env.example - 4. 更新所有路由文件,移除 API 密钥的硬编码 fallback - - 近期行动(中优先级): - 1. 将 promptsTemplates.py 的大数据迁移到数据库 - 2. 完全移除旧的配置文件或重定向到新系统 - 3. 统一 API 密钥获取逻辑 - - 总结:配置架构已改进,但代码层面仍有严重的安全漏洞需要立即修复,否则新的配置系统无法提供实际安全保护。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/aitsc/wk2.md b/docs/Obsidian笔记体系/Projects/aitsc/wk2.md deleted file mode 100644 index 37e3977..0000000 --- a/docs/Obsidian笔记体系/Projects/aitsc/wk2.md +++ /dev/null @@ -1,227 +0,0 @@ -● 根据分析,promptsTemplates.py 的数据迁移确实是一个重要的中优先级改进。以下是详细的迁移方案和实施步骤: - - 📊 当前问题分析 - - promptsTemplates.py 的主要问题: - - 1. 安全漏洞:包含硬编码数据库密码(腾讯云:!Rjb12191,本地:123456) - 2. 数据与代码混合:144KB 文件中约 4000 行是模板数据 - 3. 不规范的数据库连接:使用 pymysql 直接连接,而不是项目的 SQLAlchemy ORM - 4. 冗余功能:既是数据存储又是初始化脚本 - - ✅ 有利条件: - - - 应用已通过 PromptTemplate.query 从数据库获取模板 - - PromptTemplate 模型已在 models.py 中定义 - - 项目已有完整的数据库迁移系统 (migrations/ 目录) - - 新的配置系统已就位 - - 🎯 迁移实施计划 - - 阶段一:数据提取和备份(30分钟) - - 1. 提取模板数据到 JSON - # 创建数据目录 - mkdir -p /d/aaa/aitsc/data - - # 手动或编写脚本提取 templates 列表到 JSON - # 将生成:data/prompt_templates.json - - 2. 备份现有数据库中的模板数据 - # 创建备份脚本 - from src.flask_prompt_master import create_app, db - from src.flask_prompt_master.models.models import PromptTemplate - import json - - app = create_app() - with app.app_context(): - templates = PromptTemplate.query.all() - data = [{ - 'name': t.name, - 'description': t.description, - 'category': t.category, - 'industry': t.industry, - 'profession': t.profession, - 'sub_category': t.sub_category, - 'system_prompt': t.system_prompt, - 'is_default': t.is_default - } for t in templates] - - with open('data/existing_templates_backup.json', 'w', encoding='utf-8') as f: - json.dump(data, f, ensure_ascii=False, indent=2) - - 阶段二:创建安全初始化系统(45分钟) - - 1. 创建新的初始化脚本 - # scripts/init_prompt_templates.py - import json - import os - from dotenv import load_dotenv - from src.flask_prompt_master import create_app, db - from src.flask_prompt_master.models.models import PromptTemplate - - load_dotenv() - - def init_from_json(json_file='data/prompt_templates.json'): - """从JSON文件安全初始化模板数据""" - app = create_app() - with app.app_context(): - # 检查数据库连接 - if not db.session.bind: - raise ValueError("数据库连接未初始化") - - # 加载模板数据 - with open(json_file, 'r', encoding='utf-8') as f: - templates_data = json.load(f) - - added_count = 0 - skipped_count = 0 - - for template_data in templates_data: - # 检查是否已存在同名模板 - existing = PromptTemplate.query.filter_by( - name=template_data['name'] - ).first() - - if not existing: - template = PromptTemplate(**template_data) - db.session.add(template) - added_count += 1 - else: - skipped_count += 1 - - try: - db.session.commit() - print(f"✅ 初始化完成:新增 {added_count} 条,跳过 {skipped_count} 条") - return True - except Exception as e: - db.session.rollback() - print(f"❌ 初始化失败:{e}") - return False - - if __name__ == '__main__': - init_from_json() - - 2. 更新 promptsTemplates.py(保留向后兼容) - # 在 promptsTemplates.py 顶部添加 - import warnings - warnings.warn( - "promptsTemplates.py 已弃用,请使用 scripts/init_prompt_templates.py", - DeprecationWarning - ) - - # 修改 init_db 函数,移除硬编码密码,调用新的初始化脚本 - def init_db(database_type='local'): - """向后兼容的初始化函数(重定向到新系统)""" - print("⚠️ 此函数已弃用,请使用新的初始化系统") - print("💡 运行: python scripts/init_prompt_templates.py") - # 或者直接调用新脚本 - from scripts.init_prompt_templates import init_from_json - return init_from_json() - - 阶段三:环境配置和安全加固(30分钟) - - 1. 更新 .env.example 文件 - # 移除真实凭据,使用占位符 - DATABASE_URL=mysql+pymysql://username:password@host:port/database_name?charset=utf8mb4 - LLM_API_KEY=sk-your-api-key-here - WX_SECRET=your-wx-secret-here - - 2. 确保 .env 不被提交 - # 检查 .gitignore - echo ".env" >> /d/aaa/aitsc/.gitignore - echo ".env.*" >> /d/aaa/aitsc/.gitignore - echo "!*.example" >> /d/aaa/aitsc/.gitignore - - 3. 创建部署说明文档 - # 模板数据初始化说明 - - ## 新系统使用 - 4. 复制环境变量模板:`cp .env.example .env` - 5. 编辑 .env 文件,填入真实凭据 - 6. 初始化模板数据:`python scripts/init_prompt_templates.py` - - ## 旧系统兼容 - 旧命令 `python src/flask_prompt_master/promptsTemplates.py [local|tencent]` - 将自动重定向到新系统。 - - 阶段四:测试和验证(30分钟) - - 7. 测试脚本 - # tests/test_template_init.py - import pytest - from scripts.init_prompt_templates import init_from_json - from src.flask_prompt_master.models.models import PromptTemplate - - def test_template_count(): - """测试模板数量是否正确""" - init_from_json('tests/test_templates.json') - count = PromptTemplate.query.count() - assert count > 0 - - def test_no_duplicates(): - """测试不会创建重复模板""" - init_from_json('tests/test_templates.json') - count1 = PromptTemplate.query.count() - init_from_json('tests/test_templates.json') # 再次运行 - count2 = PromptTemplate.query.count() - assert count1 == count2 # 数量应不变 - - 📅 实施时间表 - - ┌──────┬────────────────┬──────────┬────────┐ - │ 阶段 │ 任务 │ 预计时间 │ 优先级 │ - ├──────┼────────────────┼──────────┼────────┤ - │ 1 │ 数据提取和备份 │ 30分钟 │ 高 │ - ├──────┼────────────────┼──────────┼────────┤ - │ 2 │ 安全初始化脚本 │ 45分钟 │ 高 │ - ├──────┼────────────────┼──────────┼────────┤ - │ 3 │ 环境配置加固 │ 30分钟 │ 高 │ - ├──────┼────────────────┼──────────┼────────┤ - │ 4 │ 测试验证 │ 30分钟 │ 中 │ - ├──────┼────────────────┼──────────┼────────┤ - │ 5 │ 文档更新 │ 15分钟 │ 中 │ - ├──────┼────────────────┼──────────┼────────┤ - │ 总计 │ │ 2.5小时 │ │ - └──────┴────────────────┴──────────┴────────┘ - - 🔧 迁移后的架构 - - aitsc/ - ├── data/ # 数据文件目录 - │ ├── prompt_templates.json # 模板数据(JSON格式) - │ └── existing_templates_backup.json - ├── scripts/ # 管理脚本 - │ ├── init_prompt_templates.py # 安全初始化脚本 - │ └── backup_templates.py - ├── src/flask_prompt_master/ - │ └── promptsTemplates.py # 已弃用(保留兼容) - └── .env.example # 环境变量模板 - - ⚠️ 风险和缓解措施 - - 风险: 生产数据库已有模板数据 - - 缓解: 初始化脚本检查重复,不会覆盖现有数据 - 风险: 依赖旧初始化流程的脚本 - - 缓解: 保留 promptsTemplates.py 的兼容性包装 - 风险: JSON 文件可能过大 - - 缓解: 可考虑分多个 JSON 文件或使用数据库种子 - - 📝 下一步建议 - - 立即行动: - 8. 先备份现有数据库中的模板数据 - 9. 提取当前 promptsTemplates.py 中的模板到 JSON - 10. 创建安全初始化脚本 - - 验证后: - 11. 在测试环境运行新系统 - 12. 更新部署文档 - 13. 全面替换旧系统 - - 您希望我: - 14. 立即开始实施这个迁移方案? - 15. 先处理更高优先级的硬编码安全问题? - 16. 还是您有其他特定的要求? - - 迁移完成后,项目的安全性、可维护性和部署便利性将显著提升。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/aitsc/wk5.md b/docs/Obsidian笔记体系/Projects/aitsc/wk5.md deleted file mode 100644 index 421f72a..0000000 --- a/docs/Obsidian笔记体系/Projects/aitsc/wk5.md +++ /dev/null @@ -1,296 +0,0 @@ - Flask Prompt Master 项目重构方案 - - 上下文和目标 - - 项目概况:D:/aaa/aitsc 是一个 Flask 应用程序,提供多种 AI 驱动的功能(提示词模板、饭菜规划、旅行攻略、会议 - 纪要、简历优化等)。项目采用蓝图架构,但随着功能增加出现了代码质量问题。 - - 当前问题: - 1. 安全漏洞:多个路由文件中存在硬编码的 API 密钥和数据库密码 - 2. 代码结构:routes.py 文件过大(1300+ 行),职责不单一 - 3. API 设计不一致:多种响应格式和错误处理方式 - 4. 认证系统碎片化:同时使用会话、令牌和微信认证 - 5. 配置管理混乱:新旧配置系统并存 - 6. 代码重复:相似功能间存在重复代码 - - 重构目标: - 1. 消除安全漏洞,移除所有硬编码的敏感信息 - 2. 提高代码可维护性,优化项目结构 - 3. 标准化 API 设计和错误处理 - 4. 集中化认证和授权系统 - 5. 实现关注点分离(业务逻辑与表现层分离) - - 重构方案概述 - - 目标架构 - - flask_prompt_master/ - ├── app/ # 应用层(API/Web 路由) - ├── core/ # 核心业务逻辑(服务层) - ├── infrastructure/ # 基础设施(配置、数据库、外部服务) - ├── shared/ # 共享组件(工具类、数据模型、常量) - ├── tests/ # 测试套件 - └── docs/ # 文档 - - 核心改进 - - 6. 安全加固:环境变量管理,JWT 认证,安全头部 - 7. API 标准化:统一响应格式,版本控制,OpenAPI 文档 - 8. 代码重组:服务层提取,仓库模式,依赖注入 - 9. 质量提升:测试覆盖率,CI/CD,代码质量工具 - - 详细实施计划 - - 阶段 1:安全加固与基础建设(第 1-2 周) - - 任务 1.1:消除硬编码敏感信息 - - - 优先级:高 - - 文件: - - flask_prompt_master/routes.py:115 - 移除硬编码数据库密码 - - config.py - 移除已弃用的硬编码配置 - - 所有包含 sk-fdf7cc1c73504e628ec0119b7e11b8cc 的文件 - - 方法: - a. 创建 .env.template 文件,列出所有需要的环境变量 - b. 更新配置系统,从环境变量读取所有敏感信息 - c. 添加配置验证,确保关键配置在启动时已设置 - - 任务 1.2:实现统一认证中间件 - - - 优先级:高 - - 方法: - a. 创建 auth/middleware.py 实现 JWT 认证中间件 - b. 统一所有 API 的认证方式,逐步替换现有的多种认证系统 - c. 添加角色和权限管理系统 - d. 实现刷新令牌机制 - - 任务 1.3:添加安全头部和请求验证 - - - 优先级:中 - - 方法: - a. 实现安全中间件,添加 CSP、HSTS、XSS 防护等头部 - b. 使用 Pydantic 创建请求数据验证模型 - c. 实现全局请求验证中间件 - - 阶段 2:API 标准化与文档(第 3-4 周) - - 任务 2.1:创建标准 API 响应格式 - - - 优先级:高 - - 方法: - a. 创建 shared/api/responses.py 定义标准响应类 - b. 实现成功响应:{success: true, data: {...}, meta: {...}} - c. 实现错误响应:{success: false, error: {...}, error_code: string} - d. 创建响应工具函数,统一所有路由的响应格式 - - 任务 2.2:实现 API 版本控制 - - - 优先级:中 - - 方法: - a. 创建 /api/v1/ 命名空间,所有新 API 使用此版本 - b. 保留现有 /api/ 路由作为 v0 版本,逐步迁移 - c. 实现版本路由中间件,支持通过 URL 或头部指定版本 - d. 添加 API 弃用警告机制 - - 任务 2.3:添加 OpenAPI 文档 - - - 优先级:中 - - 方法: - a. 使用 Flask-Swagger 或 FastAPI-style 注解 - b. 自动生成 API 文档,支持在线测试 - c. 添加 API 使用示例和错误代码说明 - - 阶段 3:代码重组与服务层提取(第 5-6 周) - - 任务 3.1:分解大型路由文件 - - - 优先级:高 - - 文件:flask_prompt_master/routes.py(1300+ 行) - - 方法: - a. 按功能模块拆分: - - routes/prompt_routes.py - 提示词相关路由 - - routes/auth_routes.py - 认证相关路由 - - routes/history_routes.py - 历史记录路由 - - routes/feature_routes.py - 各 AI 功能路由 - b. 每个文件不超过 300 行,保持单一职责 - c. 使用蓝图组织相关路由 - - 任务 3.2:提取业务逻辑到服务层 - - - 优先级:高 - - 方法: - a. 创建 services/ 目录,按领域划分服务类 - b. 将路由中的业务逻辑移动到对应服务类 - c. 服务类负责:业务规则验证、外部 API 调用、复杂数据处理 - d. 路由只负责:请求解析、响应格式化、错误处理 - - 任务 3.3:实现仓库模式 - - - 优先级:中 - - 方法: - a. 创建 repositories/ 目录,按实体划分仓库类 - b. 仓库类封装数据库操作,提供高层抽象接口 - c. 路由和服务通过仓库访问数据,不直接使用 SQLAlchemy - d. 便于单元测试和数据库切换 - - 阶段 4:测试与质量提升(第 7-8 周) - - 任务 4.1:提升测试覆盖率 - - - 优先级:中 - - 方法: - a. 实现单元测试:服务层、仓库层、工具类 - b. 实现集成测试:API 端点测试 - c. 实现端到端测试:关键用户流程测试 - d. 目标:测试覆盖率从 ~40% 提升到 80%+ - - 任务 4.2:实现 CI/CD 流水线 - - - 优先级:中 - - 方法: - a. 设置 GitHub Actions 或 GitLab CI - b. 自动化:代码检查、测试、构建、部署 - c. 添加质量门禁:测试覆盖率、代码复杂度、安全扫描 - - 任务 4.3:代码质量工具集成 - - - 优先级:低 - - 方法: - a. 集成 black、isort、flake8 代码格式化 - b. 添加 mypy 类型检查 - c. 集成 pre-commit hooks 自动执行代码检查 - - 阶段 5:部署优化与文档(第 9-10 周) - - 任务 5.1:优化 Docker 部署 - - - 优先级:低 - - 方法: - a. 优化 Dockerfile,减少镜像大小 - b. 实现多阶段构建 - c. 添加健康检查端点 - d. 优化生产环境配置 - - 任务 5.2:实现监控和可观测性 - - - 优先级:中 - - 方法: - a. 添加 Prometheus 指标收集 - b. 实现结构化日志记录 - c. 添加错误追踪和告警 - d. 实现性能监控 - - 任务 5.3:完善文档 - - - 优先级:低 - - 方法: - a. 架构设计文档 - b. API 使用文档 - c. 部署和维护指南 - d. 开发环境设置指南 - - 风险缓解策略 - - 技术风险 - - 数据库迁移风险: - - 使用 Alembic 生成迁移脚本 - - 在测试环境充分验证 - - 准备回滚方案 - API 兼容性风险: - - 使用功能开关控制新功能 - - 保持向后兼容性至少一个版本周期 - - 提供详细的迁移指南 - 性能回归风险: - - 重构前后进行性能基准测试 - - 实施监控和告警 - - 准备快速回滚机制 - - 实施风险 - - 团队知识差距: - - 结对编程和代码审查 - - 详细的架构文档 - - 定期知识分享会议 - 时间安排风险: - - 采用敏捷方法,每两周评估进度 - - 优先处理高价值任务 - - 保持灵活性,根据进展调整计划 - - 关键文件路径 - - 需要立即处理的安全问题 - - 1. D:/aaa/aitsc/src/flask_prompt_master/routes/routes.py:115 - 硬编码数据库密码 - 2. D:/aaa/aitsc/config.py - 已弃用的硬编码配置 - 3. 所有包含硬编码 API 密钥的文件(搜索 sk-fdf7cc1c73504e628ec0119b7e11b8cc) - - 大型文件需要拆分 - - 4. D:/aaa/aitsc/src/flask_prompt_master/routes/routes.py(1300+ 行) - 5. D:/aaa/aitsc/src/flask_prompt_master/models/models.py(500+ 行) - - 新目录结构 - - 6. src/flask_prompt_master/services/ - 服务层 - 7. src/flask_prompt_master/repositories/ - 仓库层 - 8. src/flask_prompt_master/shared/ - 共享组件 - 9. src/flask_prompt_master/api/ - API 相关组件 - - 验证和测试策略 - - 验证步骤 - - 10. 安全验证:确保无硬编码敏感信息,所有配置通过环境变量管理 - 11. 功能验证:所有现有功能测试通过,API 响应格式一致 - 12. 性能验证:关键 API 端点响应时间无显著下降 - 13. 部署验证:生产环境部署成功,监控系统正常运行 - - 测试计划 - - 14. 单元测试:服务层、仓库层、工具类 - 15. 集成测试:API 端点、数据库操作 - 16. 端到端测试:关键用户流程(注册、登录、使用功能) - 17. 性能测试:负载测试、压力测试 - - 成功指标 - - 量化指标 - - 18. 零硬编码敏感信息 - 19. 测试覆盖率 80%+ - 20. 代码复杂度降低 30% - 21. API 平均响应时间改善 20% - 22. 缺陷修复时间减少 50% - - 质化指标 - - 23. 新开发者上手时间减少 50% - 24. 完整的架构和 API 文档 - 25. 开发者满意度提升 - 26. 部署信心增强 - - 资源需求 - - 团队配置 - - - 2-3 名高级开发工程师 - - 兼职 QA 工程师 - - 技术负责人(架构决策和代码审查) - - 时间安排 - - - 总时长:10 周(2.5 个月) - - 开发工作量:约 400-500 人时 - - 每周进度评审和调整 - - 工具和环境 - - - CI/CD 流水线 - - 测试环境(开发、测试、预生产) - - 监控和告警系统 - - 文档管理系统 - - --- - 注意:本重构计划采用渐进式方法,每个阶段都有明确的可交付成果和验证标准。建议从阶段 1 - 开始,确保安全基础稳固后再进行架构优化。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/aitsc/wk6.md b/docs/Obsidian笔记体系/Projects/aitsc/wk6.md deleted file mode 100644 index 549a6cc..0000000 --- a/docs/Obsidian笔记体系/Projects/aitsc/wk6.md +++ /dev/null @@ -1,134 +0,0 @@ -● 基于对 http://127.0.0.1:5002/ 页面的分析,这是一个设计良好的AI提示词模板应用,采用深蓝色科技感主题,具备现 - 代化UI和响应式设计。从用户体验角度,以下是可以改进的地方: - - 当前优点 - - 1. 视觉设计优秀:深蓝色科技主题、CSS变量、渐变效果、阴影层次 - 2. 响应式完善:移动端适配良好,侧边栏在小屏幕下可切换 - 3. 功能丰富:筛选、收藏、复制、删除、使用统计一应俱全 - 4. 交互细节:悬停效果、平滑滚动、键盘导航支持 - 5. 性能考虑:图片懒加载、防抖搜索 - - 用户体验改进建议 - - 6. 首屏信息密度与引导 - - - 问题:页面加载后,用户不清楚主要操作是什么 - - 改进: - - 在模板网格上方添加简短引导语:"选择模板开始生成专业提示词" - - 为首次访问用户添加引导遮罩或提示泡泡 - - 在空白筛选区域增加"试试选择行业和职业来筛选模板" - - 2. 筛选系统优化 - - - 当前问题: - - 三个下拉筛选器(行业、职业、领域)选项过多(每个50+选项) - - 没有搜索筛选器功能 - - 筛选状态不直观 - - 改进: - - 为下拉筛选添加搜索框,支持输入筛选 - - 显示当前应用的筛选条件(如:"行业: 互联网 | 职业: 开发工程师") - - 添加"清除所有筛选"按钮 - - 考虑将部分筛选改为标签式选择(热门行业/职业) - - 3. 模板卡片信息展示 - - - 当前问题: - - 部分模板卡片行业/职业/领域信息为空 - - 使用统计(0次使用)对用户决策价值有限 - - 模板难度级别(初级)缺乏解释 - - 改进: - - 隐藏空的信息字段 - - 将"使用次数"改为"热度"或添加"推荐"标签 - - 为难度级别添加工具提示:"初级:适合初学者" - - 增加模板预览功能(鼠标悬停显示摘要) - - 4. 操作流程优化 - - - 当前问题: - - 需要先选择模板,然后输入文本,再生成提示词 - - 操作路径不够直观 - - 改进: - - 将输入区域放在更显眼位置(模板网格上方或左侧) - - 实现"选择即生成"模式:选择模板后自动生成示例提示词 - - 添加"快速开始"区域,推荐3-5个最常用模板 - - 5. 移动端体验提升 - - - 当前问题: - - 侧边栏筛选在小屏幕上操作不便 - - 模板卡片在手机上信息显示拥挤 - - 改进: - - 将筛选改为底部抽屉式,更方便单手操作 - - 简化移动端模板卡片,隐藏次要信息 - - 优化触控目标大小(按钮至少44×44px) - - 6. 搜索与发现 - - - 当前问题:页面似乎缺少全局搜索功能 - - 改进: - - 在导航栏添加搜索框,支持模板名称和内容搜索 - - 添加"最近使用"、"热门模板"、"新添加"等分类 - - 实现搜索建议和自动完成 - - 7. 反馈与确认 - - - 当前问题: - - 删除操作直接执行,没有确认对话框 - - 操作成功/失败反馈依赖alert() - - 改进: - - 重要操作(删除、清空)添加确认对话框 - - 用非模态提示(toast)替代alert(),减少干扰 - - 添加操作撤销功能(如误删除后5秒内可撤销) - - 8. 性能与加载体验 - - - 当前问题: - - 页面6178行,CSS和JS都在一个文件中 - - 初始加载可能较慢 - - 改进: - - 分离CSS和JS到外部文件,利用浏览器缓存 - - 实现骨架屏加载效果 - - 优先加载首屏内容,延迟加载非关键资源 - - 9. 可访问性增强 - - - 当前问题: - - 虽然支持键盘导航,但ARIA属性不完整 - - 颜色对比度可以进一步优化 - - 改进: - - 为所有交互元素添加完整的ARIA标签 - - 确保颜色对比度满足WCAG AA标准 - - 添加跳过导航链接,方便屏幕阅读器用户 - - 10. 新手引导与帮助 - - - 当前问题:缺乏使用指导和帮助文档 - - 改进: - - 添加"如何使用"页面或引导教程 - - 在复杂功能旁添加问号图标,点击显示简短说明 - - 创建视频教程或图文指南 - - 具体实施优先级 - - 高优先级(立即改进): - 1. 添加筛选状态显示和清除按钮 - 2. 为删除操作添加确认对话框 - 3. 优化移动端筛选交互 - - 中优先级(短期改进): - 4. 增加全局搜索功能 - 5. 优化模板卡片信息展示 - 6. 添加新手引导 - - 低优先级(长期优化): - 7. 分离资源文件,优化加载性能 - 8. 增强可访问性支持 - 9. 创建完整的帮助系统 - - 总结 - - 这个应用已经有了很好的基础,主要需要优化的是用户引导、操作效率和移动端体验。最关键的改进点是让用户更快理解 - 如何使用,并减少操作步骤的认知负担。 - - 建议先从添加筛选状态显示和优化移动端交互开始,这两项改进成本低但用户体验提升明显。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/aitsc/wk7.md b/docs/Obsidian笔记体系/Projects/aitsc/wk7.md deleted file mode 100644 index a238d23..0000000 --- a/docs/Obsidian笔记体系/Projects/aitsc/wk7.md +++ /dev/null @@ -1,145 +0,0 @@ -当前设计的优点 - - - 现代科技感设计:深蓝色主题、渐变效果、卡片布局 - - 响应式布局:适配桌面、平板、手机 - - 功能完整:侧边栏筛选、模板卡片、搜索、用户系统 - - 交互反馈:悬停效果、过渡动画 - - 技术先进:CSS变量、Bootstrap 5、Font Awesome - - 美观方面可改进的地方 - - 1. 颜色对比度与可访问性 - - - 检查文字颜色(特别是 --text-light: #64748B)在浅色背景上的对比度,确保符合WCAG 2.1 AA标准 - - 焦点状态颜色需要更明显(当前 box-shadow: 0 0 0 2px rgba(33, 150, 243, 0.2) 对比度不足) - - 为色盲用户考虑,重要的状态指示(如成功/错误)应同时使用颜色和图标 - - 2. 视觉层次与间距 - - - 虽然定义了间距变量(--spacing-unit: 0.25rem),但实际使用中不够一致 - - 标题层级可以更清晰:主标题 h1 使用频率不足 - - 卡片内边距可以优化,避免内容过于拥挤 - - 3. 卡片设计优化 - - /* 建议改进 */ - .template-card { - border-radius: var(--border-radius-lg); /* 当前 12px,可统一为 16px */ - box-shadow: var(--shadow-md); /* 当前阴影较弱 */ - transition: transform 0.2s ease, box-shadow 0.2s ease; - } - .template-card:hover { - transform: translateY(-4px); /* 当前 -1px,效果不明显 */ - box-shadow: var(--shadow-lg); - } - - 4. 图标一致性 - - - 确保所有图标大小统一(当前导航图标 1rem,用户菜单图标 1.5rem) - - 考虑使用更一致的图标集(如全部使用 fas 或 far) - - 5. 加载与空状态 - - - 添加骨架屏加载动画 - - 设计友好的空状态界面(无搜索结果、无收藏等) - - 用户体验方面可改进的地方 - - 1. 筛选器体验 - - - 问题:领域下拉菜单有101个选项,难以查找 - - 改进:添加搜索框或分组显示,或改为标签云式多选 - - 2. 搜索功能 - - - 添加实时搜索反馈(显示匹配数量) - - 搜索历史记录/热门搜索建议 - - 搜索框添加清除按钮 - - 3. 键盘导航与可访问性 - - -
- - 确保所有交互元素都有清晰的焦点样式 - - 支持ESC键关闭侧边栏和模态框 - - 4. 移动端优化 - - - 侧边栏抽屉可以添加手势支持(右滑关闭) - - 底部操作栏在移动端可固定定位 - - 触摸目标大小至少44×44px(当前部分按钮较小) - - 5. 表单与交互反馈 - - - 实时验证文本区域输入(字数统计、内容质量提示) - - 操作成功/失败 Toast 通知(替代当前 alert()) - - 防止重复提交(提交按钮禁用状态) - - 6. 性能优化 - - - 大量模板卡片(未来可能增加)考虑虚拟滚动 - - 图片/图标懒加载 - - 减少首屏CSS(将非关键CSS异步加载) - - 7. 引导与帮助 - - - 首次使用引导(高亮核心功能) - - 模板说明可以添加"了解更多"展开项 - - 帮助按钮或文档链接 - - 8. 错误处理 - - - 网络错误时提供重试按钮 - - 表单提交失败保留用户输入 - - 友好的404/500错误页面 - - 具体技术建议 - - 1. CSS优化 - - /* 添加 prefers-reduced-motion 支持 */ - @media (prefers-reduced-motion: reduce) { - * { - animation-duration: 0.01ms !important; - transition-duration: 0.01ms !important; - } - } - - /* 暗色模式支持 */ - @media (prefers-color-scheme: dark) { - :root { - --background-color: #0f172a; - --text-color: #f8fafc; - } - } - - 2. JavaScript增强 - - - 添加离线检测和提示 - - 使用本地存储保存用户偏好(侧边栏状态、筛选条件) - - 实现撤销/重做操作(特别是模板选择) - - 3. SEO与分享优化 - - - 添加Open Graph meta标签 - - 结构化数据标记(JSON-LD) - - 页面标题动态更新(当前固定为"提示词大师 - AI应用") - - 优先级建议 - - 高优先级: - 1. 键盘导航与可访问性修复 - 2. 移动端触摸目标大小调整 - 3. 筛选器搜索功能添加 - - 中优先级: - 4. 加载状态与错误处理 - 5. 颜色对比度检查 - 6. 性能优化(虚拟滚动) - - 低优先级: - 7. 暗色模式 - 8. 动画微调 - 9. SEO优化 - - 这些改进将显著提升用户满意度、可访问性和整体专业感。需要进一步检查具体实现代码,我可以帮助实现其中任何一项改进。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/aitsc/wk8.md b/docs/Obsidian笔记体系/Projects/aitsc/wk8.md deleted file mode 100644 index 5b249c8..0000000 --- a/docs/Obsidian笔记体系/Projects/aitsc/wk8.md +++ /dev/null @@ -1,217 +0,0 @@ - 1. 项目现状评估 - - 1.1 核心功能模块清单 - - 项目是一个多功能AI提示词生成与管理平台,采用Flask + 服务器端渲染架构,包含以下15个核心模块: - - ┌──────────┬──────────────────────────────────────────────────────────────┬──────────────────────────┐ - │ 模块类别 │ 功能描述 │ 技术实现 │ - ├──────────┼──────────────────────────────────────────────────────────────┼──────────────────────────┤ - │ 核心生成 │ 主提示词生成(默认模板) │ Flask路由 + OpenAI API │ - ├──────────┼──────────────────────────────────────────────────────────────┼──────────────────────────┤ - │ 用户体系 │ 用户认证、微信小程序集成 │ Flask-Login + WxUser模型 │ - ├──────────┼──────────────────────────────────────────────────────────────┼──────────────────────────┤ - │ 数据管理 │ 收藏管理、历史记录 │ SQLAlchemy + 关系模型 │ - ├──────────┼──────────────────────────────────────────────────────────────┼──────────────────────────┤ - │ 垂直场景 │ 饭菜规划、古诗词解析、周报生成、旅行规划、会议纪要、简历优化 │ 专用蓝图 + 模板 │ - ├──────────┼──────────────────────────────────────────────────────────────┼──────────────────────────┤ - │ 专家模式 │ 智能提示词优化(3个独立实现) │ 多版本对比优化 │ - ├──────────┼──────────────────────────────────────────────────────────────┼──────────────────────────┤ - │ 开发工具 │ Android工程师专区(Crash解读、依赖冲突分析) │ 专业场景模板 │ - ├──────────┼──────────────────────────────────────────────────────────────┼──────────────────────────┤ - │ 管理后台 │ 数据分析、监控、批量操作 │ Flask-Admin扩展 │ - ├──────────┼──────────────────────────────────────────────────────────────┼──────────────────────────┤ - │ 扩展预留 │ 占位应用(预留扩展位) │ 模块化设计 │ - └──────────┴──────────────────────────────────────────────────────────────┴──────────────────────────┘ - - 1.2 技术栈组成与版本 - - ┌──────────┬─────────────────────────────────────────────┬──────────────────────────────────┐ - │ 层级 │ 技术栈 │ 版本/备注 │ - ├──────────┼─────────────────────────────────────────────┼──────────────────────────────────┤ - │ 后端框架 │ Python Flask │ ≥2.2.0 │ - ├──────────┼─────────────────────────────────────────────┼──────────────────────────────────┤ - │ ORM │ Flask-SQLAlchemy │ ≥3.0.2 │ - ├──────────┼─────────────────────────────────────────────┼──────────────────────────────────┤ - │ 数据库 │ MySQL 8.0 + Redis 7 │ 容器化部署 │ - ├──────────┼─────────────────────────────────────────────┼──────────────────────────────────┤ - │ AI集成 │ OpenAI兼容API (DeepSeek) │ 硬编码API密钥(安全风险) │ - ├──────────┼─────────────────────────────────────────────┼──────────────────────────────────┤ - │ 前端UI │ Bootstrap 5.1 + jQuery 3.6 │ CDN加载 │ - ├──────────┼─────────────────────────────────────────────┼──────────────────────────────────┤ - │ 前端交互 │ 原生JavaScript + 自定义CSS │ 未使用构建工具 │ - ├──────────┼─────────────────────────────────────────────┼──────────────────────────────────┤ - │ 部署架构 │ Docker Compose 3.8 + Nginx │ 四服务编排(App/DB/Redis/Nginx) │ - ├──────────┼─────────────────────────────────────────────┼──────────────────────────────────┤ - │ 辅助工具 │ Flask-Migrate、Flask-CORS、bcrypt、waitress │ 完整生产配置 │ - └──────────┴─────────────────────────────────────────────┴──────────────────────────────────┘ - - 1.3 系统部署架构图 - - [用户请求] - ↓ - [Nginx:80/443] - ↓ - ┌──────────────┼──────────────┐ - ↓ ↓ ↓ - [Flask App] [MySQL 8.0] [Redis 7] - (端口:5000) (端口:3306) (端口:6379) - │ │ │ - └──────────────┼──────────────┘ - ↓ - [静态文件/模板渲染] - - --- - 2. 优势与痛点诊断 - - 2.1 技术优势(≥3项) - - 1. 模块化架构清晰:采用Flask蓝图设计,功能解耦良好,新增模块只需注册新蓝图 - 2. 生产就绪的部署方案:完整Docker Compose配置,包含Nginx反向代理、数据库持久化、日志轮转 - 3. 错误处理机制完善:全局500错误处理、API调用重试机制、结构化日志记录 - 4. 多环境配置支持:基于config/目录的配置系统,支持development/testing/production环境 - 5. 数据库迁移管理:使用Flask-Migrate,支持平滑升级和数据迁移 - - 2.2 性能指标(基于代码分析) - - - API响应时间:LLM调用设置60秒超时,含3次重试机制 - - 数据库连接池:SQLAlchemy配置连接池(pool_size=20, max_overflow=30) - - 缓存策略:Redis缓存支持,默认超时1小时 - - 前端资源体积:CSS 1.1KB + JS 1.2KB(未压缩),Bootstrap/jQuery使用CDN - - 2.3 痛点与技术债务 - - ┌──────────┬──────────────────────────────────────────────────┬─────────────────────────────────┐ - │ 风险等级 │ 问题描述 │ 影响范围 │ - ├──────────┼──────────────────────────────────────────────────┼─────────────────────────────────┤ - │ 高危 │ API密钥硬编码于routes/routes.py:21 │ 安全漏洞,密钥泄露风险 │ - ├──────────┼──────────────────────────────────────────────────┼─────────────────────────────────┤ - │ 高危 │ 用户密码使用自定义哈希(login_pwd + login_salt) │ 密码安全强度不足 │ - ├──────────┼──────────────────────────────────────────────────┼─────────────────────────────────┤ - │ 中危 │ CORS配置过于宽松(默认['*']) │ 生产环境跨域安全风险 │ - ├──────────┼──────────────────────────────────────────────────┼─────────────────────────────────┤ - │ 中危 │ 前端资源未压缩(无构建流程) │ 页面加载性能损失约30% │ - ├──────────┼──────────────────────────────────────────────────┼─────────────────────────────────┤ - │ 中危 │ 代码重复(expert_generate多个版本) │ 维护成本增加,bug修复需多处修改 │ - ├──────────┼──────────────────────────────────────────────────┼─────────────────────────────────┤ - │ 低危 │ 缺乏自动化测试覆盖 │ 回归测试依赖手动验证 │ - └──────────┴──────────────────────────────────────────────────┴─────────────────────────────────┘ - - --- - 3. 用户体验专项审计 - - 3.1 技术指标检测(基于运行中服务 http://127.0.0.1:5002/) - - ┌────────────────┬──────────────────────────────────────┬───────────────────────────────┐ - │ 指标 │ 现状评估 │ 建议 │ - ├────────────────┼──────────────────────────────────────┼───────────────────────────────┤ - │ Lighthouse性能 │ 预估得分:65-75/100 │ 资源未压缩、无懒加载 │ - ├────────────────┼──────────────────────────────────────┼───────────────────────────────┤ - │ 可访问性 │ 基础合规(Bootstrap提供基础支持) │ 缺少ARIA标签、键盘导航支持 │ - ├────────────────┼──────────────────────────────────────┼───────────────────────────────┤ - │ SEO优化 │ 基础达标(meta描述、og标签齐全) │ 可添加结构化数据、sitemap │ - ├────────────────┼──────────────────────────────────────┼───────────────────────────────┤ - │ 首屏加载 │ 1.5-2.5秒(依赖CDN网络状况) │ 内联关键CSS、异步加载非关键JS │ - ├────────────────┼──────────────────────────────────────┼───────────────────────────────┤ - │ 资源压缩 │ 未压缩(CSS 1.1KB, JS 1.2KB) │ 引入构建流程(Vite/webpack) │ - ├────────────────┼──────────────────────────────────────┼───────────────────────────────┤ - │ 移动端适配 │ 响应式设计(Bootstrap 5 + viewport) │ 通过测试 │ - ├────────────────┼──────────────────────────────────────┼───────────────────────────────┤ - │ 浏览器兼容 │ 现代浏览器支持良好 │ IE11及以下不兼容(符合预期) │ - └────────────────┴──────────────────────────────────────┴───────────────────────────────┘ - - 3.2 交互体验评估 - - - 核心操作路径:表单提交→加载状态→结果显示,流程完整但缺乏进度反馈 - - 错误处理机制:前端有基础验证,后端返回JSON错误格式,但错误提示不友好 - - 无障碍设计:仅基础HTML语义化,缺少屏幕阅读器优化、焦点管理 - - 动画与反馈:使用CSS过渡效果,但加载状态依赖按钮文字变更 - - --- - 4. Vue.js重构可行性研究 - - 4.1 技术对比矩阵(评分1-10分) - - ┌──────────────┬────────────────────────────┬─────────────────────────────────┬──────┬──────────┬─────────┐ - │ 维度 │ 当前方案(jQuery+SSR) │ Vue 3方案(SPA+组件化) │ 权重 │ 当前得分 │ Vue得分 │ - ├──────────────┼────────────────────────────┼─────────────────────────────────┼──────┼──────────┼─────────┤ - │ 开发效率 │ 前后端耦合,调试需重启服务 │ 组件化开发、热重载、DevTools │ 30% │ 6.0 │ 8.5 │ - ├──────────────┼────────────────────────────┼─────────────────────────────────┼──────┼──────────┼─────────┤ - │ 维护成本 │ 全局状态管理困难,代码重复 │ 组件复用率高,状态集中管理 │ 25% │ 5.0 │ 8.0 │ - ├──────────────┼────────────────────────────┼─────────────────────────────────┼──────┼──────────┼─────────┤ - │ 性能表现 │ 首屏快但页面跳转需重载 │ SPA切换快,首屏需加载bundle │ 20% │ 7.0 │ 8.0 │ - ├──────────────┼────────────────────────────┼─────────────────────────────────┼──────┼──────────┼─────────┤ - │ 生态支持 │ jQuery插件丰富但陈旧 │ Vue Router、Pinia、Vite生态完善 │ 15% │ 7.0 │ 9.0 │ - ├──────────────┼────────────────────────────┼─────────────────────────────────┼──────┼──────────┼─────────┤ - │ 团队适配 │ 熟悉jQuery,学习曲线平缓 │ 需学习Vue 3组合式API │ 10% │ 8.0 │ 6.0 │ - ├──────────────┼────────────────────────────┼─────────────────────────────────┼──────┼──────────┼─────────┤ - │ 综合加权得分 │ 6.35 │ 8.08 │ 100% │ │ │ - └──────────────┴────────────────────────────┴─────────────────────────────────┴──────┴──────────┴─────────┘ - - 结论:Vue 3方案综合得分提升27.2%,主要在开发效率、维护成本、生态支持方面优势明显。 - - 4.2 迁移风险评估 - - ┌────────────────┬────────────────────────────────┬─────────────────────────────────────────┐ - │ 风险类型 │ 风险描述 │ 缓解措施 │ - ├────────────────┼────────────────────────────────┼─────────────────────────────────────────┤ - │ 增量迁移复杂性 │ 如何逐步替换现有jQuery代码 │ 采用微前端架构,新旧系统并行运行 │ - ├────────────────┼────────────────────────────────┼─────────────────────────────────────────┤ - │ 数据层兼容性 │ 现有API需要适配Vue前端调用模式 │ 保持RESTful API不变,仅前端消费方式变化 │ - ├────────────────┼────────────────────────────────┼─────────────────────────────────────────┤ - │ 第三方依赖适配 │ jQuery插件需替换为Vue组件 │ 评估替代方案(如Bootstrap Vue) │ - ├────────────────┼────────────────────────────────┼─────────────────────────────────────────┤ - │ 团队技能缺口 │ 需培训Vue 3开发技能 │ 分阶段培训 + 引入外部专家支持 │ - ├────────────────┼────────────────────────────────┼─────────────────────────────────────────┤ - │ ROI分析 │ 迁移成本 vs 长期收益 │ 预计6-9个月收回投资(基于维护成本降低) │ - └────────────────┴────────────────────────────────┴─────────────────────────────────────────┘ - - 4.3 实施路线图建议 - - 阶段一:搭建Vue 3微前端试验田(1-2个月) - - - 技术选型:Vue 3 + Vite + Pinia + Vue Router - - 基础设施:独立/vue-app目录,与现有Flask静态资源并行 - - 试点模块:选择收藏管理模块进行重构 - - 集成方案:使用容器渐进式加载Vue组件 - - 阶段二:核心模块渐进式重构(3-4个月) - - - 优先级:用户中心 → 历史记录 → 提示词生成 - - 数据层:封装现有API为TypeScript接口 - - 状态管理:统一使用Pinia,与现有session并行 - - 组件库:基于Bootstrap Vue建立企业级组件库 - - 阶段三:新旧架构并行运行验证(1-2个月) - - - A/B测试:50%流量导向Vue新架构 - - 性能监控:对比关键指标(首屏加载、交互响应时间) - - 用户反馈:收集UX改进建议 - - 问题修复:针对并行运行暴露的问题进行修复 - - 阶段四:完整迁移与性能调优(2-3个月) - - - 全面切换:100%流量切至Vue架构 - - 代码清理:移除遗留jQuery代码 - - 性能优化:代码分割、懒加载、CDN部署 - - 文档完善:更新开发文档、部署指南 - - --- - 5. 紧急行动建议(立即执行) - - 安全修复(24小时内): - - 移除routes/routes.py:21硬编码的API密钥,改用环境变量 - - 收紧生产环境CORS配置,指定允许的域名列表 - 性能优化(1周内): - - 配置Nginx启用gzip压缩静态资源 - - 添加Cache-Control头部优化缓存策略 - 代码质量(2周内): - - 合并expert_generate重复代码,提取公共组件 - - 引入基础单元测试,覆盖核心API路由 - 重构准备(1个月内): - - 评估团队Vue技能现状,制定培训计划 - - 搭建Vue 3试验环境,验证技术选型可行性 - - --- - 报告说明:本评估基于静态代码分析和运行中服务测试,实际性能指标可能因部署环境而异。Vue重构建议需要根据团队实际情况调整 - 实施节奏。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/aitsc/下任务.md b/docs/Obsidian笔记体系/Projects/aitsc/下任务.md deleted file mode 100644 index 718067f..0000000 --- a/docs/Obsidian笔记体系/Projects/aitsc/下任务.md +++ /dev/null @@ -1,9 +0,0 @@ - - - -D:\aaa\aitsc\上传git仓.md -将修改上传到git仓rjb_win_dev分支 -http://101.43.95.130:3001/admin/aitsc.git - - -D:\aaa\aitsc\改进计划.md \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/aitsc/项目资料.md b/docs/Obsidian笔记体系/Projects/aitsc/项目资料.md index d067e46..86c5d8f 100644 --- a/docs/Obsidian笔记体系/Projects/aitsc/项目资料.md +++ b/docs/Obsidian笔记体系/Projects/aitsc/项目资料.md @@ -1,22 +1,34 @@ +## 服务器信息 + http://101.43.95.130:5002/ -┌──────────┬────────────────────────────────────────┐ -│ 项目 │ 详情 │ -├──────────┼────────────────────────────────────────┤ -│ 名称 │ 提示词大师 - AI应用 │ -├──────────┼────────────────────────────────────────┤ -│ 目录 │ /home/renjianbo/aitsc │ -├──────────┼────────────────────────────────────────┤ -│ 运行方式 │ gunicorn + Flask (run_dev:app) │ -├──────────┼────────────────────────────────────────┤ -│ Python │ Python 3.12 (miniconda3 env: myenv) │ -├──────────┼────────────────────────────────────────┤ -│ 端口 │ 5002 │ -├──────────┼────────────────────────────────────────┤ -│ 启动时间 │ 2026-03-01(已运行 118 天) │ -├──────────┼────────────────────────────────────────┤ -│ Git 状态 │ 干净,最新提交 aia │ -├──────────┼────────────────────────────────────────┤ -│ 外网访问 │ 已修复(firewalld 之前漏了 5002 端口) │ -└──────────┴────────────────────────────────────────┘ \ No newline at end of file +| 项目 | 详情 | +|------|------| +| 名称 | 提示词大师 - AI应用 | +| 目录 | /home/renjianbo/aitsc | +| 运行方式 | gunicorn + Flask (run_dev:app) | +| Python | Python 3.12 (miniconda3 env: myenv) | +| 端口 | 5002 | +| 外网访问 | 已修复(firewalld 之前漏了 5002 端口) | + +## 本地开发 + +| 项目 | 值 | +|------|-----| +| 本地目录 | D:\aaa\aitsc | +| Git 仓库 | http://101.43.95.130:3001/admin/aitsc.git | +| 分支 | rjb_win_dev | + +### 上传 Git + +详见 D:\aaa\aitsc\上传git仓.md + +```powershell +cd D:\aaa\aitsc +git push -u origin rjb_win_dev +``` + +### 改进计划 + +详见 D:\aaa\aitsc\改进计划.md diff --git a/docs/Obsidian笔记体系/Projects/claude code/命令行工具.md b/docs/Obsidian笔记体系/Projects/claude code/命令行工具.md new file mode 100644 index 0000000..fdb9008 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/claude code/命令行工具.md @@ -0,0 +1,32 @@ +> 使用claude时使用的命令行工具,哪个更文档,当前是windows powershell,还有其它更好的吗? + +● 这个问题跟代码项目本身无关,我直接根据了解的情况来回答。 + + Windows 下使用 Claude Code 的终端选择 + + 推荐排序 + + Windows Terminal(强烈推荐) + - 微软官方出品的现代终端,支持多标签、GPU 加速渲染、丰富的主题配置 + - 可以内嵌 PowerShell、CMD、WSL Bash 等多种 Shell + - Unicode 和 emoji 支持完善,Claude Code 的交互体验最佳 + - 通过 Microsoft Store 安装:winget install Microsoft.WindowsTerminal + PowerShell 7+(当前可用) + - 比 Windows PowerShell 5.1 强很多,是跨平台版本 + - 你当前的 Windows PowerShell(5.1)是旧版,功能有限 + - 升级:winget install Microsoft.PowerShell + Git Bash / MSYS2 Bash + - 你当前会话的 shell 就是 bash,类 Unix 体验 + - 对习惯 Linux/Mac 命令的用户更友好 + - 缺点:终端模拟器本身(mintty)比较老旧 + VS Code 内置终端 + - 如果你在 VS Code 中使用 Claude Code,内置终端完全够用 + - 同样支持 PowerShell、Git Bash、WSL + + 最佳组合 + + Windows Terminal + PowerShell 7 或 Windows Terminal + Git Bash,这是目前 Windows 上体验最好的搭配。 + + 总结 + + 你当前的 PowerShell 不是不能用,但 Windows Terminal 是更现代、更流畅的选择,推荐安装试试。 \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/common/腾讯云服务器信息.md b/docs/Obsidian笔记体系/Projects/common/腾讯云服务器信息.md new file mode 100644 index 0000000..25c0df8 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/common/腾讯云服务器信息.md @@ -0,0 +1,125 @@ +# 腾讯云服务器信息 + +> 最后更新:2026-06-11 + +--- + +## 连接信息 + +| 项目 | 详情 | +|------|------| +| **IP 地址** | 101.43.95.130 | +| **端口** | 22 | +| **用户名** | renjianbo | +| **密码** | 123456 | + +### SSH 连接命令 + +```bash +ssh renjianbo@101.43.95.130 -p 22 +``` + +### 本地免交互连接(SSH_ASKPASS 方式) + +```bash +# 创建密码脚本 +cat > /tmp/ssh_pass.sh << 'SCRIPT' +#!/bin/bash +echo '123456' +SCRIPT +chmod +x /tmp/ssh_pass.sh + +# 连接 +export DISPLAY=dummy +export SSH_ASKPASS=/tmp/ssh_pass.sh +ssh -o StrictHostKeyChecking=no renjianbo@101.43.95.130 -p 22 '你要执行的命令' < /dev/null +``` + +--- + +## 服务器硬件配置 + +| 项目 | 详情 | +|------|------| +| **操作系统** | CentOS Linux 7.9.2009 (Core) | +| **内核版本** | 3.10.0-1160.119.1.el7.x86_64 | +| **架构** | x86_64 | +| **CPU 核心** | 2 核 | +| **内存** | 7.5 GB (已用 2.6G,可用 4.6G) | +| **系统盘** | 118 GB (已用 61G,可用 53G,54%) | +| **Swap** | 无 | +| **运行时间** | 140 天 | + +--- + +## Docker 环境 + +| 项目 | 详情 | +|------|------| +| **Docker 版本** | 26.1.4 | +| **Docker Compose** | v2.27.1 | +| **用户权限** | renjianbo 已加入 docker 组,无需 sudo | + +--- + +## 运行中的服务 + +### RLZ 陪诊后端 + +| 容器名 | 镜像 | 端口映射 | 运行状态 | +|--------|------|----------|----------| +| **rlz-backend** | rlz-backend:latest | **8039→8039** | Up | +| **rlz-ui-server** | nginx:alpine | **8050→80** | Up (2026-05-31 启动) | +| **rlz-minio** | minio/minio:latest | **9000-9001→9000-9001** | Up (unhealthy) | +| **rlz-redis** | redis:7-alpine | 6379 (内部) | Up (unhealthy) | +| **rlz-redis-6379** | redis:7-alpine | 127.0.0.1:6379 | Up | + +### CI/CD + +| 容器名 | 镜像 | 端口映射 | 运行状态 | +|--------|------|----------|----------| +| **Gitea** | gitea/gitea:latest | **3001→3000, 222→22** | Up | +| **Drone Server** | drone/drone:latest | **3002→80, 3003→443** | Up | +| **Drone Runner** | drone/drone-runner-docker:latest | 3000 (内部) | Up | + +> - Gitea: `http://101.43.95.130:3001` +> - Drone: `http://101.43.95.130:3002` + +### 其他 + +| 容器名 | 镜像 | 端口映射 | 运行状态 | +|--------|------|----------|----------| +| **mkdocs** | squidfunk/mkdocs-material:latest | **8000→8000** | Up (unhealthy) | +| **workdizhi-web** | workdizhi-web | **3006→3000** | Up | + +--- + +## 已移除/停止的服务 + +| 服务 | 说明 | +|------|------| +| **Dify** (API/Web/Worker/DB/Redis/Weaviate/Nginx等) | 2026-06-11 清理磁盘时移除,容器和镜像均已删除 | +| **OpenCLAW** (龙匣) | 之前已移除 | +| **MySQL** | 未使用,已清理 | + +--- + +## 端口总览 + +| 端口 | 服务 | +|------|------| +| **222** | Gitea SSH | +| **3001** | Gitea Web | +| **3002** | Drone CI | +| **3006** | workdizhi-web | +| **8000** | mkdocs 文档 | +| **8039** | rlz-backend | +| **8050** | rlz-ui-server | +| **9000-9001** | rlz-minio | + +--- + +## 已知问题 + +- `rlz-minio`、`rlz-redis`、`mkdocs` 三个容器 health check 失败 (unhealthy) +- 磁盘曾满导致服务停摆,2026-06-11 已清理释放 ~29GB diff --git a/docs/Obsidian笔记体系/Projects/女童生长激素项目/项目概览.md b/docs/Obsidian笔记体系/Projects/女童生长激素项目/项目概览.md new file mode 100644 index 0000000..f402cd1 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/女童生长激素项目/项目概览.md @@ -0,0 +1,107 @@ +# 女童生长激素预测模型 — 项目与域名概览 + +**更新日期:** 2026-05-24 + +--- + +## 一、项目简介 + +生长激素缺乏(GHD)预测模型系统,面向医生和患者提供预测工具,包含三端: + +| 端 | 说明 | 技术 | +|----|------|------| +| 微信小程序 | 用户端,计算器和资讯 | 微信原生开发 | +| 后台管理 | 管理员数据管理 | ThinkPHP 5.0 | +| 后端 API | 小程序接口服务 | ThinkPHP 5.0 | + +--- + +## 二、域名与访问 + +| 用途 | 地址 | +| ----------- | ----------------------------------------- | +| 正式域名(HTTPS) | https://www.ruilaizipj.com | +| 根域名(HTTPS) | https://ruilaizipj.com | +| IP 访问(HTTP) | http://101.43.95.130 | +| 后台管理入口 | https://www.ruilaizipj.com/adminghd/login | +| 宝塔面板 | https://101.43.95.130:38193/e626af3f | + +### 账号信息 + +| 系统 | 账号 | 密码 | +|------|------|------| +| 后台管理 | 13212345678 | 123456 | +| 宝塔面板 | 0dbelvc8 | testpasswd | + +### SSL 证书 + +| 项目 | 值 | +|------|-----| +| 类型 | Let's Encrypt 免费证书(90 天) | +| 当前有效期 | 2026-05-24 ~ 2026-08-22 | +| 覆盖域名 | ruilaizipj.com, www.ruilaizipj.com | +| 管理方式 | 宝塔面板 → 网站 → SSL → Let's Encrypt | + +--- + +## 三、服务器环境 + +| 项目 | 值 | +|------|-----| +| 云服务商 | 腾讯云 | +| 公网 IP | 101.43.95.130 | +| 操作系统 | CentOS 7+ | +| Web 服务器 | 系统 Nginx 1.20(宝塔 Nginx 已停) | +| PHP 版本 | 5.6 | +| 数据库 | MySQL,库名 `ruilai` | +| 项目根目录 | `/www/wwwroot/code` | +| 网站根目录 | `/www/wwwroot/code/public` | + +### Nginx 关键配置 + +- **配置文件**:`/etc/nginx/conf.d/default.conf` +- **SSL 证书**:`/www/server/panel/vhost/cert/101.43.95.130/fullchain.pem` +- **SSL 私钥**:`/www/server/panel/vhost/cert/101.43.95.130/privkey.pem` +- **server_name** 包含:`ruilaizipj.com`、`www.ruilaizipj.com`、`101.43.95.130` + +--- + +## 四、项目代码结构 + +``` +/www/wwwroot/code/ +├── application/ +│ ├── adminghd/ # 后台管理模块 +│ │ ├── controller/ # Login.php, Menu.php, Wechatinfro.php, Wechatset.php +│ │ ├── model/ +│ │ └── view/ +│ └── app/ # 小程序 API 模块 +│ └── controller/ # Ghdwechat.php, Ruilaiwechat.php +├── public/ +│ ├── index.php # 入口文件 +│ └── static/adminghd/ # 后台静态资源 +├── szjs/ # 微信小程序源码 +├── thinkphp/ # 框架核心 +└── vendor/ # Composer 依赖 +``` + +--- + +## 五、DNS 解析要求 + +两个域名都需 A 记录指向 `101.43.95.130`: + +- `ruilaizipj.com` → A → `101.43.95.130` +- `www.ruilaizipj.com` → A → `101.43.95.130` + +--- + +## 六、相关文档索引 + +| 文档 | 说明 | +|------|------| +| 生长激素缺乏预测模型项目需求文档.md | 完整需求与架构 | +| 项目资料.md | 项目路径和账号 | +| 配置完成.md | Nginx 配置详情 | +| SSL证书续期_20260524.md | 证书续期操作和踩坑记录 | +| 后台检查报告_20260524.md | 后台功能检查结果 | diff --git a/docs/Obsidian笔记体系/Projects/官网/公司官网.md b/docs/Obsidian笔记体系/Projects/官网/公司官网.md new file mode 100644 index 0000000..8017038 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/官网/公司官网.md @@ -0,0 +1 @@ +[TechNova — 用技术驱动商业未来](file:///D:/aaa/aiagent/team_projects/546eb7a0-e096-4e20-b52b-37ee5a1ee1df/project-20260616-230703/index.html#cases) \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/物业项目/物业项目资料.md b/docs/Obsidian笔记体系/Projects/物业项目/物业项目资料.md new file mode 100644 index 0000000..a49f19b --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/物业项目/物业项目资料.md @@ -0,0 +1 @@ +![[Pasted image 20260524215622.png]] \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/陪诊/修复计划0512.md b/docs/Obsidian笔记体系/Projects/陪诊/修复计划0512.md deleted file mode 100644 index a184cec..0000000 --- a/docs/Obsidian笔记体系/Projects/陪诊/修复计划0512.md +++ /dev/null @@ -1,170 +0,0 @@ - RLZ 陪诊SAAS 微信小程序下单流程 —— 深度分析 - - 一、整体架构 - - 微信小程序(coupon/) ←→ 后端API(:8039) ←→ MySQL - ↑ - Android陪护端(peizhen/) ┘ - Web后台(rlz-ui :8050) ┘ - - 二、现有流程(有缺陷) - - ┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌────────────┐ - │ 1.微信登录 │ → │ 2.选服务 │ → │ 3.填订单信息 │ → │ 4.支付成功页│ - │ (my页面) │ │ (peizhen) │ │(peizhendetail)│ │(paysuccess)│ - └──────────┘ └──────────┘ └──────────────┘ └────────────┘ - ✅ ✅ ⚠️ ❌ - - 三、逐环节分析 - - 环节 1:微信登录 — pages/my/my.js - - 现状:✅ 代码逻辑正确,但缺少必要条件 - - wx.login() → 获取code → getPhoneNumber按钮 → /weixinLogin - - 后端 /weixinLogin 逻辑(SysLoginController.java:186): - 1. 用 code 调微信 jscode2session 获取 openid + session_key - 2. 解密 encryptedData 拿到手机号 - 3. 查数据库,用户存在则更新 openid,不存在则自动创建(userType="C" = 患者) - 4. 返回 {userId, token, phoneNumber} - - 必要条件: - - appid=wx2d5ca40a16ebd1b3 + secret=8620... — 已配置在代码中 - - 微信小程序必须在微信开放平台注册,appid 必须匹配 - - 需要微信开发者工具或真机调试才能触发 getPhoneNumber - - 环节 2:选择服务类型 — pages/peizhen/peizhen.js - - 现状:⚠️ 医院和服务都硬编码在前端 - - 医院选择器和医院列表都是写死的数组,不从后端加载(虽然后端有 /system/hospital/list API)。 - - 环节 3:填写订单 — pages/peizhen/peizhendetail.js - - 现状:⚠️ 下单成功,但跳过了支付 - - // 当前代码:下单 → 直接跳支付成功页 - payment() { - POST /system/order/insertOrderPz // 创建订单 - → wx.navigateTo('paysuccess') // ❌ 直接跳转了,没支付! - } - - 后端 insertOrderPz 的问题: - // RlzOrderController.java:103 - // 微信支付创建代码全部被注释掉了! - // 原本应该:创建订单 → 调微信支付 → 返回 prepay_id - // 现在只返回 orderId - - 环节 4:支付成功页 — shopping/pages/paysuccess/paysuccess.js - - 现状:❌ 代码来自旧项目,完全不适用 - - paySuccess() { - // 调用不存在的旧API! - url: app.buildUrl("/app/Goddesswechat/paySuccess") // ❌ 后端没这个接口 - } - - 这个文件是从一个叫 "Goddess" 的电商项目复制过来的,含有拼团逻辑,跟陪诊完全无关。 - - --- - 四、后端支付能力 - - 后端微信支付代码是完整的,只是被注释掉了: - - ┌──────────────────┬─────────────────────────────────────┬─────────────────────────┐ - │ 能力 │ 位置 │ 状态 │ - ├──────────────────┼─────────────────────────────────────┼─────────────────────────┤ - │ 创建微信支付订单 │ V3WXPayUtil.createOrder() │ ✅ 完整,返回 prepay_id │ - ├──────────────────┼─────────────────────────────────────┼─────────────────────────┤ - │ 微信支付回调 │ /system/weixin/wxPayNotify │ ✅ 完整 │ - ├──────────────────┼─────────────────────────────────────┼─────────────────────────┤ - │ 退款回调 │ /system/weixin/wxRefundNotify │ ✅ 完整 │ - ├──────────────────┼─────────────────────────────────────┼─────────────────────────┤ - │ 主动查询支付 │ /system/order/weixinPay/{orderId} │ ✅ 完整 │ - ├──────────────────┼─────────────────────────────────────┼─────────────────────────┤ - │ 退款申请 │ /system/order/refundOrder/{orderId} │ ✅ 完整 │ - └──────────────────┴─────────────────────────────────────┴─────────────────────────┘ - - 支付配置 (WXPayConstants.java): - - 商户号: 1637125805 - - appid: wx2d5ca40a16ebd1b3 - - APIv3密钥已配置 - - 商户证书私钥已配置 - - ⚠️ 回调地址写死 https://ruilaizipj.com/system/weixin/wxPayNotify — 此域名可能已失效 - - --- - 五、数据库 - - 订单表 rlz_order 关键字段: - - ┌─────────────┬────────────┬───────────────────────────────────────────────────────────────┐ - │ 字段 │ 含义 │ 说明 │ - ├─────────────┼────────────┼───────────────────────────────────────────────────────────────┤ - │ order_id │ 订单ID │ 自增 │ - ├─────────────┼────────────┼───────────────────────────────────────────────────────────────┤ - │ status │ 订单状态 │ -2取消/-1拒单/0待接单/2已支付/3服务中/4已完成/5退款中/7已退款 │ - ├─────────────┼────────────┼───────────────────────────────────────────────────────────────┤ - │ c_id │ 患者ID │ 外键到 sys_user │ - ├─────────────┼────────────┼───────────────────────────────────────────────────────────────┤ - │ b_id │ 陪护人员ID │ 硬编码为104 │ - ├─────────────┼────────────┼───────────────────────────────────────────────────────────────┤ - │ hospital_id │ 医院ID │ 外键到 sys_hospital │ - ├─────────────┼────────────┼───────────────────────────────────────────────────────────────┤ - │ yugu_money │ 预估金额 │ │ - ├─────────────┼────────────┼───────────────────────────────────────────────────────────────┤ - │ yuliu9 │ 订单大类 │ 1=陪护 2=陪诊 │ - ├─────────────┼────────────┼───────────────────────────────────────────────────────────────┤ - │ yuliu10 │ 订单类型 │ 1=全程陪诊 2=诊前约号 3=取送结果 4=代办问诊 │ - ├─────────────┼────────────┼───────────────────────────────────────────────────────────────┤ - │ yuliu5 │ 商户订单号 │ 支付回调后设置 │ - └─────────────┴────────────┴───────────────────────────────────────────────────────────────┘ - - --- - 六、要跑通完整流程,需要做的事 - - ❌ 阻塞 ⚠️ 有问题但可绕过 ✅ 正常 - - 微信登录 ──→ 选服务 ──→ 填订单 ──→ 微信支付 ──→ 支付成功 ──→ 订单列表 - ✅ ⚠️ ⚠️ ❌ ❌ ⚠️ - - 必须修复的问题: - - ┌─────┬────────────────────────────┬─────────────────────┬────────────────────────────────────────────────────────────────────────┐ - │ # │ 问题 │ 文件 │ 修复方案 │ - ├─────┼────────────────────────────┼─────────────────────┼────────────────────────────────────────────────────────────────────────┤ - │ 1 │ 小程序后端地址写死失效域名 │ app.js │ 改为 http://101.43.95.130:8039 │ - ├─────┼────────────────────────────┼─────────────────────┼────────────────────────────────────────────────────────────────────────┤ - │ 2 │ 下单后没调微信支付 │ peizhendetail.js │ 下单成功→调 /system/order/weixinPay/{orderId} → 获取 prepay_id → │ - │ │ │ │ wx.requestPayment() │ - ├─────┼────────────────────────────┼─────────────────────┼────────────────────────────────────────────────────────────────────────┤ - │ 3 │ 支付成功页是旧项目代码 │ paysuccess.js │ 支付成功后查订单状态,显示结果 │ - ├─────┼────────────────────────────┼─────────────────────┼────────────────────────────────────────────────────────────────────────┤ - │ 4 │ 微信支付回调域名 │ WXPayConstants.java │ NOTIFY_URL 需改为可公网访问的地址 │ - ├─────┼────────────────────────────┼─────────────────────┼────────────────────────────────────────────────────────────────────────┤ - │ 5 │ 需要微信开发者工具 │ — │ 下载微信开发者工具,导入 coupon/ 目录 │ - ├─────┼────────────────────────────┼─────────────────────┼────────────────────────────────────────────────────────────────────────┤ - │ 6 │ appid 所有权 │ — │ 确认 wx2d5ca40a16ebd1b3 是否还在用,或用新 appid │ - └─────┴────────────────────────────┴─────────────────────┴────────────────────────────────────────────────────────────────────────┘ - - 建议的设计方案(可选): - - ┌─────┬─────────────────┬────────────────────────────────────────────┐ - │ # │ 建议 │ 说明 │ - ├─────┼─────────────────┼────────────────────────────────────────────┤ - │ A │ 医院数据后端化 │ 删除硬编码,从 /system/hospital/list 加载 │ - ├─────┼─────────────────┼────────────────────────────────────────────┤ - │ B │ 服务/价格后端化 │ 建 sys_service_type 表,从后端加载 │ - ├─────┼─────────────────┼────────────────────────────────────────────┤ - │ C │ 陪护人员ID │ 去掉硬编码 bId: "104",由后端分配 │ - ├─────┼─────────────────┼────────────────────────────────────────────┤ - │ D │ 加验证码登录 │ 调用 /system/msm 发验证码 + /smsLogin 登录 │ - └─────┴─────────────────┴────────────────────────────────────────────┘ - - --- - 七、建议修复顺序 - - 第一步:改小程序后端地址 + 跑通微信登录 (30分钟) - 第二步:修复下单→支付→支付完成完整链路 (2小时) - 第三步:修复支付成功页 (30分钟) - 第四步:清理硬编码,医院/服务数据后端化 (1小时) diff --git a/docs/Obsidian笔记体系/Projects/陪诊/修复计划0610.md b/docs/Obsidian笔记体系/Projects/陪诊/修复计划0610.md new file mode 100644 index 0000000..4be75e4 --- /dev/null +++ b/docs/Obsidian笔记体系/Projects/陪诊/修复计划0610.md @@ -0,0 +1,73 @@ +微信小程序多角色系统测试报告 + + 基于《多角色系统与分润方案》和《多角色系统需求目录》,对小程序的完整测试结果如下: + + --- + Bugs(6个) + + 1. 🔴 TabBar switchTab 硬编码 — custom-tab-bar/index.js:31 + 4个Tab页路径写死为 patient 页面。推广员(06)点击"推广数据"实际进入 pages/index/index + 显示患者首页,无法进入推广看板。调度/客服/运营同理。 + + 2. 🔴 退款审核 API 参数不匹配 — refund/refund.js:52-53 + // 前端发送: + data: { action: 'approve', reason: '' } + // 后端期望(OrderViewController.java:279): + Boolean approved = (Boolean) params.get("approved"); // 永远为 null + 通过/拒绝操作实际上不会生效。 + + 3. 🔴 陪诊师接单调用错误API — index.js:118 + 陪诊师接单调用了 /system/dispatch/assign/{orderId}/{uid},该接口要求 system:dispatch:assign 权限。陪诊师应调用 + /system/view/acceptOrderYes(无需特殊权限)。 + + 4. 🟡 运营看板为占位页面 — ops/ops.wxml + 4个统计卡片全部显示 --,未调用任何后端 API 获取真实数据。 + + 5. 🟡 Tab页缺少推广员/工作角色视图 + - index.js 只处理 B vs 非B(均走患者视图)。推广员(06)Tab1应显示推广看板,但目前显示患者首页 + - service.js 同样只处理 B vs 非B。推广员Tab2(团队)和调度员Tab2(全部订单)都走到患者服务列表 + + 6. 🟡 手机号硬编码 — my.js:152 + phoneNumber: '4001234567' 为占位号码。 + + --- + 功能缺失(3个) + + 7. 注册页缺少身份选择 — 需求5.1.2要求注册时三选一(我需要服务/我提供服务/我推广赚佣金),当前未实现 + + 8. 分享页面未处理邀请码绑定 — share.js:50 分享路径带 promotionCode 参数,但 index.js 未读取该参数并调用绑定接口 + + 9. 调度面板不支持改派 — 需求5.3.1要求改派功能(更换陪诊师+原因),当前 dispatch 页面只有指派,无改派操作 + + --- + 验证通过(10项) + + - ✅ Custom TabBar 组件按角色动态渲染(ROLE_TABS 配置正确) + - ✅ My 页面角色切换功能(showRoleSwitch,C⇄B⇄06 可切换) + - ✅ 陪诊师 TabBar 标签(待接单/进行中/已完成/我的) + - ✅ 推广员 TabBar 标签(推广数据/我的团队/佣金/我的) + - ✅ 调度/客服/运营 TabBar 标签正确 + - ✅ app.json 子包注册正确(pages-promoter、pages-work) + - ✅ 推广子包4个页面文件完整(dashboard/team/commission/share) + - ✅ 工作台子包4个页面文件完整(dispatch/refund/ops/search) + - ✅ 后端6个API端点均存在并正常响应(promotion: myStats/team/myCommission/generateCode,dispatch: pending/caregivers/history) + - ✅ 退款审核页面有驳回原因弹窗 + 前端校验 + + --- + 建议修复顺序 + + ┌────────┬────────────────────────────┬──────────────────────────┐ + │ 优先级 │ 问题 │ 影响 │ + ├────────┼────────────────────────────┼──────────────────────────┤ + │ P0 │ Bug #1 — TabBar路由硬编码 │ 多角色Tab导航完全失效 │ + ├────────┼────────────────────────────┼──────────────────────────┤ + │ P0 │ Bug #3 — 陪诊师接单API错误 │ 陪诊师小程序端无法接单 │ + ├────────┼────────────────────────────┼──────────────────────────┤ + │ P1 │ Bug #2 — 退款API参数不匹配 │ 客服无法处理退款 │ + ├────────┼────────────────────────────┼──────────────────────────┤ + │ P1 │ Bug #5 — 缺少角色视图 │ 推广员/工作角色Tab页空白 │ + ├────────┼────────────────────────────┼──────────────────────────┤ + │ P2 │ Bug #4 — 运营看板占位 │ 运营经理看不到数据 │ + ├────────┼────────────────────────────┼──────────────────────────┤ + │ P2 │ 缺失 #7 — 注册身份选择 │ 无法自选推广员身份 │ + └────────┴────────────────────────────┴──────────────────────────┘ \ No newline at end of file diff --git a/docs/Obsidian笔记体系/Projects/陪诊/瑞来健康项目资料.md b/docs/Obsidian笔记体系/Projects/陪诊/瑞来健康项目资料.md index 3c26b14..2f1c3f6 100644 --- a/docs/Obsidian笔记体系/Projects/陪诊/瑞来健康项目资料.md +++ b/docs/Obsidian笔记体系/Projects/陪诊/瑞来健康项目资料.md @@ -7,13 +7,14 @@ $env:ANTHROPIC_MODEL="deepseek-v4-pro" bun run dev - + adb shell "dumpsys window | grep mCurrentFocus" 记忆: 瑞来健康项目资料 云后台服务器 1.连接D:\cd\tengxunyun\云服务器信息.md +1.连接D:\zhiku\mkdocs\docs\Obsidian笔记体系\Projects\common\腾讯云服务器信息.md 2./home/renjianbo/saars/rlz/目录下的项目包含java后台 云服务器java后台目录/home/renjianbo/saars/rlz/目录下的项目已经git clone到本地D:\androidPj\rlz 移动端android路径D:\androidPj\rlz\peizhen @@ -37,6 +38,13 @@ Gitea 和服务器 /home/renjianbo/saars/rlz/和本地 D:\androidPj\rlz 代码 +提交代码 +git仓 http://101.43.95.130:3001/admin/rlz (Gitea),账户 admin 密码123456 +云服务器java后台目录/home/renjianbo/saars/rlz/目录下的项目已经git clone到本地D:\androidPj\rlz +移动端android路径D:\androidPj\rlz\peizhen +微信小程序路径D:\androidPj\rlz\coupon + + 数据库配置 @@ -45,4 +53,4 @@ DATABASE_URL=mysql+pymysql://root:!Rjb12191@gz-cynosdbmysql-grp-d26pzce5.sql.ten - +根据多角色系统与分润方案和多角色系统需求目录和http://101.43.95.130:3001/admin/rlz/issues?page=1里的需求,开始落地吧 \ No newline at end of file diff --git a/docs/assets/images/Pasted image 20260524215622.png b/docs/assets/images/Pasted image 20260524215622.png new file mode 100644 index 0000000000000000000000000000000000000000..ad50c60f8cdaf74e3c59d4fa7b3f924a67a5ca85 GIT binary patch literal 68200 zcmd?Rg)tW_O%o^Id!4sqWyV z_nnQLUH$u%K54b4y0y1_pC~t>6zdJrVZ8JZrPA*sCd4T?iQi0YN)&Z!%GQO$HYb=- z%|e`G@j*9lt2Aw=3%4Z@dy)s$eo8$*h^RcY*_8YSmE@oCaNiL0Dy}z@vfdm|Jx>zU zZxm`K$B)Fi_K~r}XOZ@l-0ftRcJg_nrBzW~t$GORv1Qh!zIGLGM^l^9dP+fYF<2AK zh3+zqM)&2)VYA5m`>ADfSQ}y;#2CWevYfzjQt zZ>?nU9CWb+DygoouTM{xJxf9NCH`;6JQzNj@hgSX@XBuS)bB^voO*55<2qVQNfHIL zajINvS^1r@F?Nsn#=z;x0g8xLY=1=GzR(c<)>?7_{ay6>SXm(W#aH`QdKaA|b%g)t zIz0cbE)`lI4Yn8{1f_RV9Kq@o*Sc|o1P|v%{h=XQb3}N!n~TfFL}h+M!$p)5-48gf z@%J&j|G72+`1S4E5Xz!$b_WD>3IBhZ!U=5(Bp?rC6-eJ&gP(r6OFdGk4@OUkW@O+J z(bZw5y-rU~!Zy8C|0f?<@j>6s?I@}m9 z_da$4VQvFYGAJ|cN|E$(=~5%-_7_y*Zt5+8E=N8O9kPWC^>`T?J1S2ix_hNUFv^A->n~Sw6qJyL;g2 zKwU?$*gFTm5RgWCNbcZw!qYpJqc+*7dl_RmZIjemjm=8OmoW zQ86Q^$PEqhX!XtdMIV(E6cC1tjE+{@A;r8)OWwEMhEu)@uONM>@(1=E2qN6;_C&^` zA2{Qa?n|szR)rmZ#>Rq{$Gx%w=_WsRxT}o~7Z(?AO?z!sHWJACSHVpRc$1%!b(r$s z*6Vhu<7%6dt5=luvu7xZ5TZtOCw%w_%%hBISpDt$&_rg#)?VIkU#qckTWudCOwYpl z1)88XXs))g_qWrR6lMEgnUGIUSTMOU{+KgiCb{o;zm+@r>CbN5M;%%#rr-X9FE-d~ zHR9ZwRcPfYpXFD1;4Byxb>4enb&2I<@H8

Up5h*G@Mp15D%~^wq+M?1N_(mNquA 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