1774110743

This commit is contained in:
Docker7530
2026-03-22 00:32:26 +08:00
parent 12d823bfc5
commit 7ab924d668
18 changed files with 915 additions and 229 deletions
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,7 +1,7 @@
{
"id": "obsidian-excalidraw-plugin",
"name": "Excalidraw",
"version": "2.21.0",
"version": "2.21.2",
"minAppVersion": "1.5.7",
"description": "Sketch Your Mind. An Obsidian plugin to edit and view Excalidraw drawings. Enter the world of 4D Visual PKM.",
"author": "Zsolt Viczian",
File diff suppressed because one or more lines are too long
+112 -120
View File
@@ -1,17 +1,121 @@
{
"recentFiles": [
{
"basename": "如何成为一个 React 工程师呢?",
"path": "resource/前端/如何成为一个 React 工程师呢?.md"
},
{
"basename": "TG 备忘录",
"path": "personal/TG 备忘录.md"
},
{
"basename": "开发笔记",
"path": "work/移动杭研/开发记录/7.19.0/开发笔记.md"
},
{
"basename": "20260321211989",
"path": "000-Inbox/20260321211989.md"
},
{
"basename": "20260320234712",
"path": "000-Inbox/20260320234712.md"
},
{
"basename": "20260320124131",
"path": "000-Inbox/20260320124131.md"
},
{
"basename": "IBS 智能体具体落实技术方案",
"path": "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md"
},
{
"basename": "CLAUDE.md",
"path": "work/移动杭研/AI 项目/CLAUDE.md.md"
},
{
"basename": "图纸-IBS 智能体-v3-项目架构",
"path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md"
},
{
"basename": "图纸-IBS 智能体-v1-流量查询 demo 对象存储",
"path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo 对象存储.md"
},
{
"basename": "图纸-IBS 智能体-v1-流量查询 demo",
"path": "work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo.md"
},
{
"basename": "ibs-ai 项目梳理",
"path": "work/移动杭研/AI 项目/ibs-ai 项目梳理.md"
},
{
"basename": "Prompt 01 COSMIC 需求扩写",
"path": "resource/ai/prompts/cosmic/Prompt 01 COSMIC 需求扩写.md"
},
{
"basename": "Prompt 06 COSMIC 锐评",
"path": "resource/ai/prompts/cosmic/Prompt 06 COSMIC 锐评.md"
},
{
"basename": "Prompt 05 COSMIC 时序图",
"path": "resource/ai/prompts/cosmic/Prompt 05 COSMIC 时序图.md"
},
{
"basename": "Prompt 04 COSMIC PRD 文档",
"path": "resource/ai/prompts/cosmic/Prompt 04 COSMIC PRD 文档.md"
},
{
"basename": "Prompt 03 COSMIC 子过程",
"path": "resource/ai/prompts/cosmic/Prompt 03 COSMIC 子过程.md"
},
{
"basename": "Prompt 02 COSMIC 功能过程",
"path": "resource/ai/prompts/cosmic/Prompt 02 COSMIC 功能过程.md"
},
{
"basename": "Prompt 00 COSMIC v1",
"path": "resource/ai/prompts/cosmic/Prompt 00 COSMIC v1.md"
},
{
"basename": "20260319165480",
"path": "000-Inbox/20260319165480.md"
},
{
"basename": "RAG Flow 部署",
"path": "work/移动杭研/AI 项目/RAG Flow 部署.md"
},
{
"basename": "杭州服务器-172.21.30.23-AI",
"path": "work/移动杭研/项目备忘/杭州服务器-172.21.30.23-AI.md"
},
{
"basename": "settings.local.json",
"path": "work/移动杭研/AI 项目/settings.local.json.md"
},
{
"basename": "RAG Flow",
"path": "work/移动杭研/AI 项目/RAG Flow.md"
},
{
"basename": "20260318101127",
"path": "000-Inbox/20260318101127.md"
},
{
"basename": "20260318100374",
"path": "000-Inbox/20260318100374.md"
},
{
"basename": "ubuntu",
"path": "resource/系统/ubuntu.md"
},
{
"basename": "Anolis 系统 Redis 安装",
"path": "resource/组件/Anolis 系统 Redis 安装.md"
},
{
"basename": "tg-bot",
"path": "000-inbox/tg-bot.md"
},
{
"basename": "Redis 安装",
"path": "000-inbox/Redis 安装.md"
},
{
"basename": "杭州服务器-AI",
"path": "000-inbox/杭州服务器-AI.md"
},
{
"basename": "常用命令",
"path": "resource/常用命令.md"
@@ -20,10 +124,6 @@
"basename": "20260316213546",
"path": "000-Inbox/20260316213546.md"
},
{
"basename": "IBS 智能体具体落实技术方案",
"path": "work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md"
},
{
"basename": "20260316160264",
"path": "000-Inbox/20260316160264.md"
@@ -52,34 +152,6 @@
"basename": "20260313151563",
"path": "000-Inbox/20260313151563.md"
},
{
"basename": "Prompt 02 COSMIC 功能过程",
"path": "resource/ai/prompts/cosmic/Prompt 02 COSMIC 功能过程.md"
},
{
"basename": "Prompt 03 COSMIC 子过程",
"path": "resource/ai/prompts/cosmic/Prompt 03 COSMIC 子过程.md"
},
{
"basename": "Prompt 01 COSMIC 需求扩写",
"path": "resource/ai/prompts/cosmic/Prompt 01 COSMIC 需求扩写.md"
},
{
"basename": "Prompt 06 COSMIC 锐评",
"path": "resource/ai/prompts/cosmic/Prompt 06 COSMIC 锐评.md"
},
{
"basename": "Prompt 05 COSMIC 时序图",
"path": "resource/ai/prompts/cosmic/Prompt 05 COSMIC 时序图.md"
},
{
"basename": "Prompt 04 COSMIC PRD 文档",
"path": "resource/ai/prompts/cosmic/Prompt 04 COSMIC PRD 文档.md"
},
{
"basename": "Prompt 00 COSMIC v1",
"path": "resource/ai/prompts/cosmic/Prompt 00 COSMIC v1.md"
},
{
"basename": "BUSI_REQUIREMENT_COSMIC",
"path": "resource/ai/prompts/cosmic 业务版本/BUSI_REQUIREMENT_COSMIC.md"
@@ -96,30 +168,10 @@
"basename": "Prompt 考勤数据规整助手 小杨",
"path": "resource/ai/prompts/Prompt 考勤数据规整助手 小杨.md"
},
{
"basename": "RAG Flow",
"path": "work/移动杭研/AI 项目/RAG Flow.md"
},
{
"basename": "ibs-ai 项目梳理",
"path": "work/移动杭研/AI 项目/ibs-ai 项目梳理.md"
},
{
"basename": "开发备注",
"path": "work/移动杭研/AI 项目/开发备注.md"
},
{
"basename": "CLAUDE.md",
"path": "work/移动杭研/AI 项目/CLAUDE.md.md"
},
{
"basename": "RAG Flow 部署",
"path": "work/移动杭研/AI 项目/RAG Flow 部署.md"
},
{
"basename": "settings.local.json",
"path": "work/移动杭研/AI 项目/settings.local.json.md"
},
{
"basename": "Prompt 公司智能体",
"path": "resource/ai/prompts/临时/Prompt 公司智能体.md"
@@ -139,66 +191,6 @@
{
"basename": "Prompt Linus",
"path": "resource/ai/prompts/Prompt Linus.md"
},
{
"basename": "Prompt Lisp 语言",
"path": "resource/ai/prompts/Prompt Lisp 语言.md"
},
{
"basename": "Prompt PPT 大纲制作专家",
"path": "resource/ai/prompts/Prompt PPT 大纲制作专家.md"
},
{
"basename": "Prompt PPT 逐字稿编写专家",
"path": "resource/ai/prompts/Prompt PPT 逐字稿编写专家.md"
},
{
"basename": "开发笔记",
"path": "work/移动杭研/开发记录/7.19.0/开发笔记.md"
},
{
"basename": "20260312105716",
"path": "000-Inbox/20260312105716.md"
},
{
"basename": "服务器-香港",
"path": "personal/服务器-香港.md"
},
{
"basename": "20260311142461",
"path": "000-Inbox/20260311142461.md"
},
{
"basename": "K-V 功能",
"path": "work/移动杭研/项目备忘/K-V 功能.md"
},
{
"basename": "IBS NG 日志模板",
"path": "work/移动杭研/项目备忘/IBS NG 日志模板.md"
},
{
"basename": "项目杂记",
"path": "work/移动杭研/项目备忘/项目杂记.md"
},
{
"basename": "数据库信息",
"path": "work/移动杭研/项目备忘/数据库信息.md"
},
{
"basename": "获取企业 token 脚本",
"path": "work/移动杭研/项目备忘/获取企业 token 脚本.md"
},
{
"basename": "环境账号",
"path": "work/移动杭研/项目备忘/环境账号.md"
},
{
"basename": "工作账号",
"path": "work/移动杭研/项目备忘/工作账号.md"
},
{
"basename": "20260311083458",
"path": "000-Inbox/20260311083458.md"
}
],
"omittedPaths": [
+30 -30
View File
@@ -4,11 +4,11 @@
"type": "split",
"children": [
{
"id": "b29f1eccf46b0980",
"id": "67738bd5acdbd7ce",
"type": "tabs",
"children": [
{
"id": "431eb252187a1635",
"id": "00649b8cd88fe2b8",
"type": "leaf",
"state": {
"type": "empty",
@@ -50,7 +50,7 @@
"state": {
"type": "search",
"state": {
"query": "培训",
"query": "sk-839b2fd5ec74530fe339c6640a7c2d486428101fbfdafc4c38824f9970d33046",
"matchingCase": false,
"explainSearch": true,
"collapseAll": false,
@@ -92,7 +92,7 @@
}
],
"direction": "horizontal",
"width": 222.5
"width": 242.5
},
"right": {
"id": "ca733f6d5936ae40",
@@ -226,35 +226,35 @@
"obsidian-excalidraw-plugin:New drawing": false
}
},
"active": "c8718c0c63702202",
"active": "00649b8cd88fe2b8",
"lastOpenFiles": [
"calendar/diary/2026-03-17.md",
"calendar/diary/2026-03-16.md",
"000-inbox/tg-bot.md",
"000-inbox/Redis 安装.md",
"000-inbox/杭州服务器-AI.md",
"000-inbox/20260316213546.md",
"resource/常用命令.md",
"000-Inbox/20260316213546.md",
"resource/前端/如何成为一个 React 工程师呢?.md",
"calendar/diary/2026-03-21.md",
"000-inbox/20260321211989.md",
"000-inbox/20260320234712.md",
"000-inbox/20260320124131.md",
"000-inbox/20260319165480.md",
"000-inbox/20260318101127.md",
"000-inbox/20260318100374.md",
"calendar/diary/2026-03-20.md",
"calendar/diary/2026-03-19.md",
"calendar/diary/2026-03-18.md",
"personal/TG 备忘录.md",
"work/移动杭研/开发记录/7.19.0/开发笔记.md",
"000-Inbox/20260321211989.md",
"000-Inbox/20260320234712.md",
"000-Inbox/20260320124131.md",
"work/移动杭研/AI 项目/IBS 智能体具体落实技术方案.md",
"000-Inbox/20260316160264.md",
"000-inbox/20260316105203.md",
"000-Inbox/20260316102936.md",
"000-Inbox/20260316105203.md",
"calendar/diary/2026-03-13.md",
"calendar/diary/2026-03-15.md",
"calendar/weeks/2026-W11.md",
"calendar/diary/2026-03-14.md",
"calendar/diary/2026-03-12.md",
"calendar/diary/2026-03-11.md",
"calendar/diary/2026-03-10.md",
"calendar/diary/2026-03-09.md",
"work/移动杭研/问题处理/2026-03/0316-配管任务限流问题.md",
"work/移动杭研/AI 项目/CLAUDE.md.md",
"work/移动杭研/AI 项目/图纸-IBS 智能体-v3-项目架构.md",
"work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo 对象存储.md",
"work/移动杭研/AI 项目/图纸-IBS 智能体-v1-流量查询 demo.md",
"work/移动杭研/AI 项目/ibs-ai 项目梳理.md",
"resource/ai/prompts/cosmic/Prompt 01 COSMIC 需求扩写.md",
"resource/ai/prompts/cosmic/Prompt 06 COSMIC 锐评.md",
"resource/ai/prompts/cosmic/Prompt 05 COSMIC 时序图.md",
"resource/ai/prompts/cosmic/Prompt 04 COSMIC PRD 文档.md",
"work/移动杭研/问题处理/2026-03",
"000-inbox/20260313151563.md",
"000-Inbox/0316-配管任务限流问题.md",
"work/移动杭研/问题处理/2025-11/1107-试用单删除问题.md",
"000-Inbox/20260313151563.md",
"resource/ai/prompts/cosmic 业务版本",
"resource/ai/prompts/cosmic",
"resource/ai/prompts/临时",
-20
View File
@@ -1,20 +0,0 @@
```
测试云主机信息 172.21.30.23 用户名:root 密码:Melo@3023
测试mysql 172.21.33.224 用户名:cosmic_ai 密码:Cosmic@3306
测试redis: 172.21.43.68:6379 密码:chRdw@redis
1.DeepSeek-671B http://36.137.208.165:5020/v1/chat/completions
2.Qwen3-8B http://172.21.9.104:31554/v1/chat/completions
redis-cli -h 127.0.0.1 -p 6379 -a '5sTb7fHFbsYl6KmI6pvC^XMw!7Y^Pbc1'
```
| 项目 | 配置 |
| --- | ------------------ |
| 系统 | Anolis OS 8.6 |
| 内核 | 4.18 |
| CPU | Intel Xeon Skylake |
| 核心 | **8 vCPU** |
| 主频 | 2.2 GHz |
| 虚拟化 | KVM |
| 架构 | x86_64 |
+32 -2
View File
@@ -1,8 +1,38 @@
# 任务
- [ ] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5)
- [ ] 开发:开发 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 50% 李春良 5
- [x] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5)
- [x] 开发:开发 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 70% 李春良 7
- [x] 客响:周一的信安信息邮件未发送。
# 日志
```
[1Panel 2026-03-17 10:07:10 install Log]: =================感谢您的耐心等待,安装已完成==================
[1Panel 2026-03-17 10:07:10 install Log]:
[1Panel 2026-03-17 10:07:10 install Log]: 请使用您的浏览器访问面板:
[1Panel 2026-03-17 10:07:10 install Log]: 外部地址: http://182.255.32.64:22448/e506222c7e
[1Panel 2026-03-17 10:07:10 install Log]: 内部地址: http://192.168.126.129:22448/e506222c7e
[1Panel 2026-03-17 10:07:10 install Log]: 面板用户: fcee1b68c9
[1Panel 2026-03-17 10:07:10 install Log]: 面板密码: 2692d0bd2c
[1Panel 2026-03-17 10:07:10 install Log]:
[1Panel 2026-03-17 10:07:10 install Log]: 官方网站:https://1panel.cn
[1Panel 2026-03-17 10:07:10 install Log]: 项目文档:https://1panel.cn/docs
[1Panel 2026-03-17 10:07:10 install Log]: 代码仓库:https://github.com/1Panel-dev/1Panel
[1Panel 2026-03-17 10:07:10 install Log]: 前往 1Panel 官方论坛获取帮助:https://bbs.fit2cloud.com/c/1p/7
[1Panel 2026-03-17 10:07:10 install Log]:
[1Panel 2026-03-17 10:07:10 install Log]: 如果您使用的是云服务器,请在安全组中打开端口 22448
[1Panel 2026-03-17 10:07:10 install Log]:
[1Panel 2026-03-17 10:07:10 install Log]: 为了您的服务器安全,离开此屏幕后您将无法再次看到您的密码,请记住您的密码。
[1Panel 2026-03-17 10:07:10 install Log]:
[1Panel 2026-03-17 10:07:10 install Log]: ================================================================
```
# 总结
```
更新方式也究极无敌简单,你直接把这段话,发给你的Agent就行,无论是Claude code、OpenClaw、OpenCode等等等等:https://github.com/anthropics/skills/tree/main/skills/skill-creator,这个skills更新了,帮我更新到最新版本  
```
调研了 Dify,今天小杨下班比较早。
晚上割接,自己页放开了。
+12
View File
@@ -0,0 +1,12 @@
# 任务
- [x] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5)
- [x] 开发:开发 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 代发完成 李春良 7)
# 日志
# 总结
今天发现了在 Java 枚举类中可以使用 spring context 获取已经注册的 service,并从而实现枚举的业务过滤,从而简化了大部分的代码,是一个很好的技巧
下班时,李虎和我讨论了关于 rag 的实现,能为他的材料提供一些功能。我发现沟通是成长最好的途径,因为在沟通中,你可以知道每个人擅长的和了解的领域进行知识交换,从而发现每个人对从功能上到,就是整个对相同的事情有不同的学习领域、学习方式以及了解程度和多多维度的知识扩展
+23
View File
@@ -0,0 +1,23 @@
# 任务
- [x] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5)
- [x] 开发:自测 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 代发完成 李春良 5)
- [x] 测试:IBS 7.19.0 测试用例评审。(961-570-648 郑子雯 2.5
# 日志
130623200701082153
tianhao123@
---
511725200605244415
wang8023941@
---
# 总结
早晨帮田昊强了四六级。8 点准时拿下。
+14
View File
@@ -0,0 +1,14 @@
# 任务
- [x] 开发:参加 IBS 项目晨会,同步昨日问题跟进事项。(李春良 0.5)
- [x] 开发:自测 IBS V7.19.0 需求。(新业务平面引入与系统集成实施 自测完成 李春良 7)
# 日志
# 总结
最近自己心态变化了一些,这次提测也没那么紧张了。
和志龙走用例。
下班带田宝去剪头发。二月二龙抬头。
+11
View File
@@ -0,0 +1,11 @@
# 任务
# 日志
# 总结
早晨起来收拾了一下屋子,上午去小寨大集吃东西。中午叫张泽过来吃饭。
下午去了全季酒店。
晚上回来带田宝去公园玩儿了会儿。
+2 -14
View File
@@ -4,11 +4,7 @@
```
https://t.me/tgcnx【Telegram 中文社群】
https://t.me/jisou2【极搜大船团】
https://t.me/animation_cn_chat【小乔国产动漫交流】
https://t.me/gmjlq【动漫交流群 Anime Group】
https://t.me/IPTV6789【IPTV📺軟件&直播源】
https://t.me/se_talk【SE-索引社群】
https://t.me/pixelexperiencechat_chn【Pixel Experience China】
https://t.me/simpreadgroup【简悦 - SimpRead】
https://t.me/eryidebiji【二一交流群】
@@ -22,8 +18,6 @@ https://t.me/BinanceChinese【币安官方中文群】
https://t.me/OKXGroup_CN【欧易OKX官方中文群】
https://t.me/ChinaPumpNow【中国密码鲸公司 WHALE CHINESE 🇨🇳🐳🚀🌖】
https://t.me/airdrop_newer【币圈 小白 撸 空投】
https://t.me/SZ399001【A股🚀股票炒股投资📈】
https://t.me/anyplus【A股@炒股笔记 股票 股市 股吧】
https://t.me/tonkeeper_chinese_chat【Tonkeeper中文频道 Chat】
https://t.me/InvestSoftGroup【InvestSoft】
```
@@ -33,31 +27,24 @@ https://t.me/InvestSoftGroup【InvestSoft】
```
https://t.me/haitunspeed【🐬海豚测速|公益EMBY|后端招募】
https://t.me/ShadowrocketApp【Shadowrocket】
https://t.me/SURGEPRO【SURGE PRO】
https://t.me/Loon0x00【Loon-0x00】
https://t.me/projectXray【Project X】
https://t.me/jichang_user【机场交流群|吃瓜群众】
https://t.me/v2rayN【v2rayN&G】
https://t.me/Clashclient【Clash 交流群】
https://t.me/qichiyuchat【七尺宇交流群】
https://t.me/airport_chat【离港[̲̅V̲̅I̲̅P̅]候机室|机场交流🅥】
https://t.me/qichiyu_bot【七尺宇私聊】
```
## 技术
```
https://t.me/gekugou2【iOS破解软件交流】
https://t.me/gpt_user【ChatGPT AI】
https://t.me/BotTalk【Telegram Bot Talk】
https://t.me/JavaBotsApi【Telegram Bots】
https://t.me/linux_home【Linux窝】
```
## 业务
```
https://t.me/SVIP334179【开户 话费 电费 油卡 Q币 E卡7折优惠 赚钱项目】
https://t.me/hezu1【[合租社群]Netflix|YouTube|Spotify |office365|Hbo|Surge|美剧|等音乐影视聊天机场电影盒子软路由】
https://t.me/voicebygoogle【Google Voice 中文群】
```
@@ -66,7 +53,6 @@ https://t.me/voicebygoogle【Google Voice 中文群】
```
https://t.me/Deno333【Denis D】备注:mt4 插件。
https://t.me/ycmjdev【KennelGPT 拼车】
https://t.me/xinchent【似水流年】
https://t.me/Cococeo【奇迹】
```
@@ -74,11 +60,13 @@ https://t.me/Cococeo【奇迹】
## 机器人
```
https://t.me/jisou【极搜🔍资源搜索@JISOU
https://t.me/OkayPayBot【Okpay💰】
https://t.me/freenodeshare_bot【免费节点自动分享】
https://t.me/SpamBot【Spam Info Bot】
https://t.me/aaooVbot【退押中·Kvmidc海外服务器🧑‍💻负责人】
https://t.me/dmssrobot【动漫搜索 Bot】
https://t.me/qichiyu_bot【七尺宇私聊】
```
# Google Voice 选购清单
@@ -63,3 +63,5 @@
5、建立客户跟进记录管理体系,支持对跟进情况的记录、查询、修改和删除。
6、建立自动化的预警机制,支持预警规则的自定义配置,支持查询、修改、删除预警规则,并能定时生成预警提醒,防范业务风险。
帮我看下现在 spring ai 底层的重试机制是怎么样的?会重试多少次?我怎么看到过 30 多次的日志。
@@ -216,6 +216,498 @@ export const User = (user: UserProps) => {
```
关于 TypeScript 定义 Props 类型:
```tsx
type UserProps = {
name: string
age: number
isVerified: boolean
hobbies?: string[]
}
export const User = (user: UserProps) => {
const { name, age, isVerified, hobbies } = user // 这里是解构的意思。
return (
<div>
<h2>{name}</h2>
<p>Age: {age}</p>
<p>校验: {isVerified ? '已验证' : '未验证'}</p>
{hobbies && hobbies.length > 0 && <p>爱好: {hobbies.join(', ')}</p>}
</div>
)
}
```
事件处理和合成事件系统
这里相当于把函数当作了 Porps,此时实现了子组件决定函数的调用,但是父组件可以控制状态。
```tsx
export const Button = () => {
const handeClick = () => {
alert('按钮触发了事件')
}
return <button onClick={handeClick}>点击我</button>
}
```
这里我们自己实现一个父子组件函数通信的能力。这里相当于我们自己声明了一个类似 onClick 的子组件。
```tsx
type LoginButtonProps = {
onLogin: () => void
}
export const LoginButton = ({ onLogin }: LoginButtonProps) => {
return <button onClick={onLogin}>登录</button>
}
```
> 这里的时间对象不是原生浏览器对象,是一个合成事件。
useState
```tsx
import { useState } from 'react'
const Counter = () => {
const [count, setCount] = useState(0)
const handelClick = () => {
setCount(count + 1)
}
return (
<div>
<h1>Counter</h1>
<p>Count: {count}</p>
<button onClick={handelClick}>增加</button>
</div>
)
}
export default Counter
```
这里 `setUser` 要用一个新的对象,否则话是不会生效的。
```tsx
import { useState } from 'react'
const ErrorState = () => {
const [user, setUser] = useState({ name: 'tianzhuo', age: 20 })
const handelClick = () => {
setUser({ ...user, age: user.age + 1 })
}
return (
<div>
<h1>ErrorState</h1>
<p>Name {user.name}</p>
<p>Age {user.age}</p>
<button onClick={handelClick}>Increment Age</button>
</div>
)
}
export default ErrorState
```
三元运算符
```tsx
import { useState } from 'react'
export const Login = () => {
const [isLogin, setIsLogin] = useState(false)
return (
<div>
<h1>{isLogin ? 'Welcome Back!' : 'Please Login'}</h1>
<button onClick={() => setIsLogin(!isLogin)}>Toggle Login</button>
</div>
)
}
```
`&&` 标签显示问题
```tsx
export const MaillBox = ({ messge }) => {
return (
<div>
<h1>MailBox</h1>
{messge.length > 0 && <h2>You have {messge.length} unread messages.</h2>}
</div>
)
}
```
代办
```tsx
const todos = [
{ id: 1, tesx: 'Learn React' },
{ id: 2, tesx: 'Learn TypeScript' },
{ id: 3, tesx: 'Build a React App' },
]
export const TodoList = () => {
return (
<div>
<h1>Todo List</h1>
<ul className="li">
{todos.map((todo) => (
<li key={todo.id}>{todo.tesx}</li>
))}
</ul>
</div>
)
}
```
## hook 生命周期
因为 StrictMode 的关系,这里会展示两次挂载。
同时如果依赖数组如果是空的话,只会渲染一次。
```tsx
import { useState, useEffect } from 'react'
export const UserProfile = ({ userId }) => {
const [userData, setUserData] = useState(null)
useEffect(() => {
console.log('Fetching user data for userId:', userId)
const timer = setTimeout(() => {
setUserData({ name: 'John Doe', age: 30 })
}, 1000)
return () => {
clearTimeout(timer)
console.log('🧹 定时器已清理')
}
}, [userId])
if (!userData) {
return <div>Loading...</div>
}
return (
<div>
<h1>User Profile</h1>
<p>Name: {userData.name}</p>
<p>Age: {userData.age}</p>
</div>
)
}
```
hook 的更新
这里相当与用 useState 触发了依赖数组的更新。只得关注的是每变化的时候,是先执行上一次的 clean。
```tsx
import { useState, useEffect } from 'react'
export const UserProfile = () => {
const [userId, setUserId] = useState(1) // ← 当前用户ID
const [userData, setUserData] = useState(null)
// 模拟不同ID返回不同数据
const mockUsers = {
1: { name: '张三', age: 28 },
2: { name: '李四', age: 35 },
3: { name: '王五', age: 42 },
}
useEffect(() => {
console.log(`🚀 开始请求 userId: ${userId}`)
const timer = setTimeout(() => {
setUserData(mockUsers[userId] || { name: '未知用户', age: 0 })
console.log(`✅ 数据加载完成!当前用户: ${mockUsers[userId]?.name}`)
}, 800)
// 清理函数(StrictMode 会展示)
return () => {
console.log(`🧹 清理上一次的定时器 (userId: ${userId})`)
clearTimeout(timer)
}
}, [userId]) // ← 关键!依赖 userId
if (!userData) {
return <div>加载中...</div>
}
return (
<div style={{ padding: '20px', border: '1px solid #ccc' }}>
<h1>用户资料(当前 ID: {userId}</h1>
<p>姓名:{userData.name}</p>
<p>年龄:{userData.age}</p>
<hr />
<button onClick={() => setUserId(1)}>切换到张三 (ID=1)</button>
<button onClick={() => setUserId(2)} style={{ marginLeft: '10px' }}>
切换到李四 (ID=2)
</button>
<button onClick={() => setUserId(3)} style={{ marginLeft: '10px' }}>
切换到王五 (ID=3)
</button>
</div>
)
}
```
hook 常见问题
1. 无限循环
```tsx
import { useState, useEffect } from 'react'
export const BadExample = () => {
const [count, setCount] = useState(0)
useEffect(() => {
console.log(`🔄 Effect 执行了!当前 count = ${count}`)
// 这里更新了 count,而 count 又是依赖项
setCount(count + 1) // ← 罪魁祸首!
}, [count]) // ← 依赖了 count
return (
<div style={{ padding: '20px', border: '2px solid red' }}>
<h1>无限循环演示</h1>
<p>当前 count: {count}</p>
<p style={{ color: 'red' }}>看控制台!页面会疯狂卡顿,count 一直加!</p>
<button onClick={() => setCount(0)}>重置(也没用)</button>
</div>
)
}
```
2. 忘记放依赖项。
useRef
这里放的是 input
```tsx
import { useRef, useEffect } from 'react'
export const RefExample = () => {
const inputRef = useRef(null)
useEffect(() => {
inputRef.current?.focus()
}, [])
return (
<div>
<h1>useRef 示例:自动聚焦输入框</h1>
<input ref={inputRef} type="text" placeholder="focus"></input>
</div>
)
}
```
动态数据存储
```tsx
import { useRef, useState, useEffect } from 'react'
export const Search = () => {
const [query, setQuery] = useState('')
const timeOutRef = useRef(null)
useEffect(() => {
timeOutRef.current = setTimeout(() => {
console.log('搜索:', query)
}, 500)
return () => {
console.log('清除上一次的定时器')
clearTimeout(timeOutRef.current)
}
}, [query])
return (
<input value={query} onChange={(e) => setQuery(e.target.value)}></input>
)
}
```
## 第二部分
新老表单
```tsx
export const OldForm = () => {
const handleSubmit = (e) => {
e.preventDefault() // 这里是为了阻止表单提交默认的动作。
const formData = new FormData(e.target)
const name = formData.get('name')
console.log(name)
}
return (
<form onSubmit={handleSubmit}>
<input type="text" name="name" />
</form>
)
}
```
```tsx
export const NewForm = () => {
const handleSubmit = async (formdata: FormData) => { // 异步操作
const name = formdata.get('name')
console.log(name)
await new Promise((resolve) => setTimeout(resolve, 1000))
}
return (
<form action={handleSubmit}>
<input type="text" name="name" />
<button type="submit">Submit</button>
</form>
)
}
```
useActionState,这个我理解其实是一个对历史功能的封装优化。简化了自己需要声明很多的 state。
```tsx
import { useActionState } from 'react'
export const UseActionState = ({ productId }) => {
const addToCart = async (previousState, formData) => {
const quantity = formData.get('quantity')
console.log('Added to cart')
const result = await addToCart1(productId, quantity)
if (result.success) {
return { success: true, message: 'Product added to cart successfully!' }
} else {
return { success: false, message: 'Failed to add product to cart.' }
}
}
const addToCart1 = (productId, quantity) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({ success: true })
}, 1000)
})
}
const [state, submitAction, isPending] = useActionState(addToCart, null)
return (
<form action={submitAction}>
<input type="number" name="quantity" defaultValue={1} min={1} />
<button type="submit" disabled={isPending}>
{isPending ? 'Adding...' : 'Add to Cart'}
</button>
{state?.message && <p>{state.message}</p>}
</form>
)
}
```
useformState
可使用 useFormState 获取父组件的表单状态。
```tsx
import { useFormStatus } from 'react-dom'
const SubButton = () => {
const { pending } = useFormStatus()
return (
<button type="subbmit" disabled={pending}>
{pending ? 'Submitting...' : 'Submit'}
</button>
)
}
export const NewForm = () => {
const handeSubmit = async (formData) => {
const name = formData.get('name')
console.log('Form submitted with name:', name)
await new Promise((resolve) => setTimeout(resolve, 2000))
console.log('Form submission completed')
}
return (
<div>
<form action={handeSubmit}>
<input type="text" name="name" />
<SubButton />
</form>
</div>
)
}
```
use
这里的一个想法是实现了层级 fallback
```tsx
import React, { Suspense, use } from 'react'
import { ErrorBoundary } from 'react-error-boundary'
function fetchUser() {
return new Promise<{ name: string }>((resolve, reject) => {
setTimeout(() => {
const success = false
if (success) {
resolve({ name: '张三' })
} else {
reject(new Error('获取用户失败'))
}
}, 2000)
})
}
function UserInfo({ userPromise }: { userPromise: Promise<{ name: string }> }) {
const user = use(userPromise)
return <h2>用户名:{user.name}</h2>
}
export default function App() {
const userPromise = fetchUser()
return (
<ErrorBoundary fallback={<p>加载失败了</p>}>
<Suspense fallback={<p>用户加载中...</p>}>
<UserInfo userPromise={userPromise} />
</Suspense>
</ErrorBoundary>
)
}
```
# CSS
顶级作用域
@@ -1,17 +1,3 @@
下面给你一份**适用于 Anolis OS 8.6 / x86_64 / 源码包 redis-8.6.1.tar.gz** 的**标准安装文档**,包含:
- 安装编译依赖
- 源码编译安装
- 创建专用运行用户
- 配置目录与日志目录
- 设置 Redis 密码
- 配置 systemd 开机自启
- 启动、验证、常用维护命令
我按**生产环境标准化安装方式**写,你可以直接照着执行。
---
# Redis 8.6.1 标准安装文档
适用系统:**Anolis OS 8.6 x86_64**
@@ -241,20 +227,6 @@ dbfilename dump.rdb
requirepass 5sTb7fHFbsYl6KmI6pvC^XMw!7Y^Pbc1
```
```
/usr/local/redis/bin/redis-cli -a '5sTb7fHFbsYl6KmI6pvC^XMw!7Y^Pbc1' MODULE LIST
/usr/local/redis/bin/redis-cli -a '5sTb7fHFbsYl6KmI6pvC^XMw!7Y^Pbc1' FT._LIST
/usr/local/redis/bin/redis-cli -a '5sTb7fHFbsYl6KmI6pvC^XMw!7Y^Pbc1' INFO server
AUTH 5sTb7fHFbsYl6KmI6pvC^XMw!7Y^Pbc1
```
例如:
```conf
requirepass Redis@2025#Strong
```
> 这是你最关心的“设置密码”方式,客户端连接时必须认证。
---
@@ -813,12 +785,3 @@ systemctl status redis --no-pager -l
```text
PONG
```
---
如果你愿意,我还可以继续给你补两份内容之一:
1. **一份可直接执行的自动化安装脚本 install_redis_8.6.1.sh**
2. **一份更严格的生产环境配置版(限制 IP、ACL 用户、systemd 安全加固、日志轮转)**
如果你要,我可以直接继续输出。
@@ -34,7 +34,7 @@ Function Calling / Tool Call / Tool Calling
> 调用工具:客户端发起 call tool,带上符合 schema 的参数
> 返回结果:服务器返回结构化结果(文本/数据/错误),客户端再交给模型继续推理
**ReAct**: Synergizing Reasoning and Acting in Language Models
**ReAct**: Synergizing Reasoning(推理) and Acting(行动) in Language Models
> Question: 用户问题
>
@@ -47,6 +47,36 @@ Function Calling / Tool Call / Tool Calling
>
> Final Answer: 最终结果
Thought(思考) → Action(行动) → Observation(观察) → Thought → … → Final Answer
- 用户:北京今天天气?
- Thought:需要实时天气,我没有实时数据,调用天气API
- Actionget_weather("北京")
- Observation:北京晴天,1525℃
- Thought:信息足够,直接回答
- Answer:北京今天晴天,15–25℃,适合户外活动
例如在 Dify 中:
```
用户问题
Dify Agent 接收
选择策略 (Function Calling / ReAct)
连接 MCP 服务器
发现可用工具列表
根据用户问题选择工具
调用工具获取结果
返回给模型生成回答
```
**RAGFlow**(开源的 RAG 工程化平台 / 系统)Python TypeScript
本质是 RAGRetrieval-Augmented Generation)检索增强生成
@@ -96,3 +126,13 @@ DeepSeek-R1-Distill-Qwen-32B 工具调用。
后期 Tool 多了,我们是否提供 MCP 注册中心。
DeepSeek-R1-Distill-Qwen-32B 工具调用。
---
- **可以商用**
- **可以二次开发**
- **可以作为企业应用开发平台使用**
- 但如果你要:
- 搭建**多租户服务**
- 或修改/去掉其前端品牌标识
- 那就**需要向官方购买商业授权**。
@@ -10,6 +10,90 @@ Add/Fix/Mod JiraID BYMC 说明
## 需求开发
```json
{
"企业月流量": {
"华为平面": "1",
"中兴平面": "2",
"HCDN": "3",
"自研2.0": "8",
"自研RTMP": "5",
"合作服务商1": "10",
"合作服务商2": "11"
},
"试商用客户峰值带宽": {
"华为平面": "1",
"中兴平面": "2",
"HCDN": "3",
"自研2.0": "4",
"合作服务商1": "6",
"合作服务商2": "7"
},
"非系统分发域名日峰值": {
"华为": "1",
"中兴": "2",
"HCDN": "3",
"自研2.0": "8",
"合作服务商1": "10",
"合作服务商2": "11"
}
}
```
# 用例评审
# 冒烟自测
企业名称:ECName1773900714
订购:PRODUCTID1773900830
网页加速
融合2平面
DevReq1773900714B.komect.com
DevReq1773900714A.komect.com
---
企业名称:ECName1773900498
订购:PRODUCTID1773900678
网页加速
融合1平面
DevReq1773900498B.komect.com
DevReq1773900498A.komect.com
---
企业名称:ECName1773972775
订购:PRODUCTID1773972906
网页加速
合作服务商1
devreq1773972775b.komect.com
devreq1773972775a.komect.com
---
企业名称:ECName1773973012
订购:PRODUCTID1773973126
网页加速
合作服务商2
devreq1773973012b.komect.com
devreq1773973012a.komect.com
@@ -0,0 +1,55 @@
| 项目 | 配置 |
| --- | ------------------ |
| 系统 | Anolis OS 8.6 |
| 内核 | 4.18 |
| CPU | Intel Xeon Skylake |
| 核心 | 8 vCPU |
| 主频 | 2.2 GHz |
| 架构 | x86_64 |
OpenResty`/apprun/openresty/nginx/conf/conf.d/excalicode-ai.conf`
openjdk-25.0.2`/opt/java/jdk-25.0.2`
前端文件:`/var/www/excalicode-ai`
后端文件:`/opt/excalicode-ai`
配置信息:`/etc/excalicode-ai/excalicode-ai.env`
```bash
docker run -d \
--name redis \
--restart always \
-p 6379:6379 \
-v $(pwd)/data:/data \
-v $(pwd)/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v $(pwd)/logs:/logs \
-e TZ=Asia/Shanghai \
--ulimit nofile=65536:65536 \
redis:8.6.1 \
redis-server /usr/local/etc/redis/redis.conf
```
```
主机:172.21.30.23 用户名:root 密码:Melo@3023
mysql172.21.33.224 用户名:cosmic_ai 密码:Cosmic@3306
redis172.21.43.68:6379 密码:chRdw@redis
redis8.6.1:172.21.30.23 密码:5sTb7fHFbsYl6KmI6pvC^XMw!7Y^Pbc1
http://172.21.9.104:31554/v1/chat/completions
vllm-qwen8b-pkQCNH9bBLboUy8aDlPj3IpwOJu9ZAsXzDKUDHlIwPE
qwen8b-embedding
http://36.137.208.165:5020/v1/chat/completions
DeepSeek-671B
```
```
https://cloud.siliconflow.cn/
Qwen/Qwen3-Embedding-8B
4096 维
32K
```