行业领先的免费开源CRM客户关系管理系统推荐

CRM和客户体验解决方案概述 借助开源智造·Odoo客户体验管理系统和CRM管理软件,你可以整合客户数据、销售、电商、营销等多个管理环节,打造独特的客户体验,进而提升客户忠诚度,实现业务增长。 15载行业专业知识铸就智慧客户体验管理系统和CRM管理软件 开源智造·Odoo客户体验管理系统是对传统CRM管理软件的一次全新升级,它针对特定行业进行量身定制,不仅能够全面满足核心业务需求,而且能够全面覆盖客户体验的各个触点。该软件可以整合电商、营销、销售和服务等多方面的数据,支持端到端流程,从而帮助企业充分发挥CRM软件的最大价值。 功能应用特点 1. 销售自动化 赋能销售团队,支持他们与客户高效互动。开源智造·Odoo销售自动化软件能够简化销售流程并实现流程自动化。这样销售人员就能集中精力建立持久的客户关系。 2.电子商务 提供极具吸引力的创新型电商体验,把握市场机遇,推动盈利性增长。开源智造·Odoo解决方案帮助企业快速推出新的业务模式,灵活应对各种变化。 3.客户服务 兑现品牌承诺,并在整个客户购买旅程中提供卓越的服务。通过连接整个企业的服务运营流程,企业能够尽快解决问题,并提高客户满意度。 4.客户数据管理 借助客户身份和访问管理、数据隐私以及数据管理等解决方案,企业能够在降低合规风险的同时,获得深入的客户洞察,从而实现营收和业务增长目标。 5.营销自动化 实现营销自动化,轻松开展全球营销活动。开源智造·Odoo客户互动解决方案能够帮助企业识别目标受众,在多个渠道提供一对一体验,并轻松评估结果。 6.分析与决策 内置报告、实时分析和基于角色的仪表板使销售、营销和服务团队能够持续监控数据。销售人员轻松制定KPI目标,例如按阶段实现的销售目标转化。 解决方案应用创新 1.提高电子邮件营销活动的成效 借助开源智造·Odoo Emarsys Customer Engagement 解决方案,采用由 AI 生成的主题行创意,以及主题行优化和测试功能,提高电子邮件营销活动的成效。 2.优化销售互动 利用开源智造·Odoo AI Sales 大模型算法的机器学习功能,获取宝贵的业务洞察,并提取情感数据、关键词和行动建议,为销售决策提供指导。 3.模拟寻源策略 使用 Odoo Order Management 的单个订单模拟功能,在实际生产之前测试各种寻源策略并生成排名,确保制定明智的业务决策。

网络安全工程师和网络工程师一样吗(网络安全工程师与网络工程师)

前言 今天给各位分享网络安全工程师和网络工程师一样吗的知识,其中也会对网络安全工程师与网络工程师进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览: 1、网络工程师、网络安全工程师、信息安全工程师的区别和联系 今天给各位分享网络安全工程师和网络工程师一样吗的知识,其中也会对网络安全工程师与网络工程师进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! 网络工程师、网络安全工程师、信息安全工程师的区别和联系 北京有相关的培训学校。共同联系都是网络相关。区别: 一、定义 1、网络工程师是通过学习和训练,掌握网络技术的理论知识和操作技能的网络技术人员。网络工程师能够从事计算机信息系统的设计、建设、运行和维护工作。网络工程师是指基于硬、软件两方面的工程师,根据硬件和软件的不同、认证的不同,将网络工程师划分成很多种类。网络工程师分硬件网络工程师和软件网络工程师两大类,硬件网络工程师以负责网络硬件等物理设备的维护和通信;软件网络工程师负责系统软件,应用软件等的维护和应用。 2、 随着互联网发展和IT技术的普及,网络和IT已经日渐深入到日常生活和工作当中,社会信息化和信息网络化,突破了应用信息在时间和空间上的障碍,使信息的价值不断提高。但是与此同时,网页篡改、计算机病毒、系统非法入侵、数据泄密、网站欺骗、服务瘫痪、漏洞非法利用等信息安全事件时有发生。 3、信息安全工程师是信息产业部和人事部举办的软考中新增开的一门考试。软考全称全国计算机技术与软件专业技术资格(水平)考试,这门新开的信息安全工程师分属该考试“信息系统”专业,位处中级资格。 二、报考条件 1、网络工程师:熟悉计算机系统的基础知识;熟悉网络操作系统的基础知识;理解计算机应用系统的设计和开发方法;熟悉数据通信的基础知识;熟悉系统安全和数据安全的基础知识。 三、工作内容 1、网络工程师: 负责机房内的网络联接及网络间的系统配置;负责系统网络的拓扑图的建立和完善,并做好系统路由的解析和资料的整理;负责机房线路的布置和协议的规范工作;负责计算机间的网络联接及网络共享,并负责网络间安全性的设置。 2、网络安全工程师:分析网络现状。对网络系统进行安全评估和安全加固,设计安全的网络解决方案;在出现网络攻击或安全事件时,提高服务,帮助用户恢复系统及调查取证;针对客户网络架构,建议合理 的网络安全解决方案;负责协调解决方案的客户化实施、部署与开发,推定解决方案上线;负责协调公司网络安全项目的售前和售后支持。 3、信息安全工程师:精通网络安全技术:包括端口、服务漏洞扫描、程序漏洞分析检测、权限管理、入侵和攻击分析追踪、网站渗透、病毒木马防范等;熟悉tcp/ip协议,熟悉sql注入原理和手工检测、熟悉内存缓冲区溢出原理和防范措施、熟悉信息存储和传输安全、熟悉数据包结构、熟悉ddos攻击类型和原理有一定的ddos攻防经验,熟悉iis安全设置、熟悉ipsec、组策略等系统安全设置。 网络工程师与网络安全工程师有什么区别? 本质上区别,网络安全很大程度上工作基于编程,shell,script,C源码。而传统网络工程师只是一个维护工,配置维护交换路由器. 待遇前者比后者高很多,很多。 网络安全工程师和网络工程师的区别 【专家热心相助】 您好!网络工程师、网络安全工程师、信息安全工程师的区别和联系,主要培养目标和侧重点知识、技术、方法和能力要求有所不同。各种培训点各地都有。 网络工程师侧重从事网络工程(偏软、偏硬方向)及管理等方面的知识、技术、方法和能力。 网络安全工程师侧重从事网络安全、网络安全工程及管理等方面的知识、技术、方法和能力。网络安全工程师分为:助理级(初级)、中级、高级网络信息安全工程师三大类。详见本人解答: 信息安全工程师相对网络安全工程师,主要区别是侧重信息安全,含情报安全、数据等方面。 祝您一切顺利、万事如意! 网络工程师和网络安全工程师的区别? 区别不大,网络工程师负责组网等一系列工作。安全工程师负责网火墙路由器调试,以及系统安全策略,数据库灾难性恢复。给分。 网络工程师和网络安全工程师是一样的吗?哪个水平更高些 不一样!但是二者却不能简单的说哪个水平高。因为网络工程师比较全面,但是不一定每一个方面都精通。网络安全工程师虽然不全面,但是在安全方面却非常精通。 网络安全工程师和网络工程师一样吗的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于网络安全工程师与网络工程师、网络安全工程师和网络工程师一样吗的信息别忘了在本站进行查找喔。 如何入门学习网络安全 1、了解什么是网络安全 2、清楚法律法规 3、网络安全干什么 然而当你掌握了 Web 基础知识时,你才会残酷的发现你还远远没有入门。 大纲 首先要找一份详细的大纲。 因篇幅有限,仅展示部分,需要资料点击下方链接即可前往获取~ [点击下载文章中所展示的资料] 多看书 ==阅读永远是最有效的方法,尽管书籍并不一定是最好的入门方式,但书籍的理解需要一定的基础;但是就目前来看,书籍是比较靠谱的入门资料。 书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。 现在 Web 安全书籍比较多,因此大家在学习的过程中可以少走了不少的弯路。如果以上推荐书籍阅读有困难,那就找自己能看得进的 Web 安全的书。 常用工具的学习 1.Burpsuite 学习 Proxy 抓包改包学习 Intruder 爆破模块学习实用 Bapp 应用商店中的插件 2.Nmap 使用 Nmap 探测目标主机所开放的端口使用 Nmap 探测目标主机的网络服务,判断其服务名称及版本号 3.SQLMap 对 AWVS 中扫描出的 SQL 注入漏洞使用 SQLMap 进行数据获取实践常见漏洞类型的挖掘与利用方法

国家网络安全工程师、大数据网络运维工程师就业前景好

国家网络安全工程师、大数据网络运维工程师就业前景怎么样?相信这是很多年轻人的担忧之处,有的人甚至会想到自己辛苦学习最后找不到好的就业单位将会是一种损失。接下来小编就带您探究这两个行业的就业前景究竟如何。 什么是网络安全工程师? 随着互联网发展和IT技术的普及,网络和IT已经日渐深入到日常生活和工作当中,社会信息化和信息网络化,突破了应用信息在时间和空间上的障碍,使信息的价值不断提高。但是与此同时,网页篡改、计算机病毒、系统非法入侵、数据泄密、网站欺骗、服务瘫痪、漏洞非法利用等信息安全事件时有发生。而许多企事业单位的业务依赖于信息系统安全运行,信息安全重要性日益凸显。信息已经成为各企事业单位中重要资源,也是一种重要的“无形财富”,在未来竞争中谁获取信息优势,谁就掌握了竞争的主动权。信息安全已成为影响国家安全、经济发展、社会稳定、个人利害的重大关键问题。因此,网络安全工程师应运而生。 简而言之,网络安全工程师是公司聘用来保护自己公司数据的人。他们会通过各种技术来对公司的数据进行保护,例如:寻找公司数据存放的弱点,监控公司系统或网络中的缺陷等。然后他们会处理他们发现的问题,修复和加强公司信息网络中可能会被攻击的地方。 *网络安全工程师就业前景如何* 1.需求稳定增长 近年来,随着全球范围内网络安全事件的日益增加,《网络安全法》、《通信网络安全防护办法》、《电信和互联网用户个人信息保护规定》等一系列配套政策法规的逐步落地实施,国内政企机构对网络安全的重视程度也日益提高,对网络安全人才的需求呈现爆发式增长。 目前,很多大型或超大型企业,已经开始着手逐步建立自己的专业安全团队,以应对企业面临的网络安全日常威胁与突发事件。企业的需求主要集中在安全管理、安全运维、研发与测试、渗透测试与漏洞挖掘、应急响应、首席安全官等岗位。其中,安全管理类岗位需求量最多,占27.1%,其次是安全运维类岗位19.1%,研发与测试类占16.2%。由此可见,市场对于网络完全工程师的需求是非常大的,并且呈现出了稳定增长的趋势。 2.薪酬优势明显 根据中国信息安全测评中心发布《中国信息安全从业人员现状调研报告》显示:信息安全从业人员缺口巨大,供需关系严重失衡推高了整体薪酬水平。国内信息安全从业人员平均薪资水平在12.2-17.8万元之间,高于国家专业技术人员及信息技术从业人员年平均工资,薪酬优势十分明显。 3.国家支持专业人才培养 通过国家颁布的一系列政策、条规、活动,我们得以窥见国家对网络安全专业人才的培养的重视: 2017年6月,《网络安全法》正式施行,该法第二十条明确规定,国家支持企业和高等学校、职业学校等教育培训机构开展网络安全相关教育与培训,采取多种方式培养网络安全人才,促进网络安全人才交流。 2018年3月,根据中共中央印发了《深化党和国家机构改革方案》,将中央网络安全和信息化领导小组改为中国共产党中央网络安全和信息化委员会。 2018年9月,人力资源社会保障部根据世界技能组织的相关规定,将网络安全列为竞赛项目并在全国范围内组织选拔优秀人才参加第45届世界技能大赛。 2019年3月,教育部发布《教育信息化和网络安全工作要点》,再次明确要求要进一步推动落实《关于加强网络安全学科建设和人才培养的意见》和《一流网络安全学院建设示范项目管理办法》,探索网络安全人才培养新思路、新体制和新机制,引导鼓励有条件的职业院校开设网络安全类专业,继续扩大网络安全相关人才培养规模。 由此可见,网络安全工程师的就业前景是非常乐观的。不仅有国家政策给予扶持,而且就业需求呈稳定增长的情况,并且薪资优势也很明显,并且通过自身努力,也可以从基层技术员上升到具有一定级别的技术管理人员。从某种程度上说,在网络安全领域,网络安全工程师属于越老越吃香的岗位,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。 什么是大数据网络运维工程师? 简单来说,大数据网络运维工程师需要负责创建和维护数据分析基础架构,包括大数据架构的开发、构建、维护和测试,例如数据库和大数据处理系统。另外,还负责大数据工程师还负责创建用于建模,挖掘,获取和验证数据集合等流程。 ****大数据网络运维工程师就业前景****** 趋势一:政策环境持续优化,产业发展将迎来“黄金期”随着国家大数据战略推进实施以及配套政策的贯彻落实,大数据产业发展环境将进一步优化,社会经济各领域对大数据服务需求将进一步增强,大数据的新技术、新业态、新模式将不断涌现,产业规模将继续保持30%以上的高速增长态势。 趋势二:大数据产业集聚,将呈现特色化发展大数据综合试验区建设是国家统筹推进大数据产业发展的重要举措。 趋势三:大数据与人工智能、云计算、物联网等技术的融合创新将更加深入网络信息技术领域是全球研发投入最集中、创新最活跃、应用最广泛、辐射带动作用最大的技术创新领域,是全球技术创新的竞争高地。大数据、云计算、物联网、人工智能等新一代信息技术是最典型的网络信息技术,创新驱动是其发展的原动力,新兴技术间的融合创新更是产业发展的主基调。 趋势四:工业大数据对智能制造的,赋能效应将进一步释放。 趋势五:大数据安全和数据跨境流动,将成为国家和社会关注的焦点数据资源作为信息社会的重要生产要素、无形资产和社会财富,成为一个国家的基础性战略资源。 前景:未来社会缺的不是知识,而是一份技能,因为未来世界最大的能源就是数据,过程:从数据收集,整理,清洗,分类,然后得出一定的规律,最后加工,然后从各方面,各个角度做出对企业有利的决策。 网络安全入门学习路线 其实入门网络安全要学的东西不算多,也就是网络基础+操作系统+中间件+数据库,四个流程下来就差不多了。 1.网络安全法和了解电脑基础 其中包括操作系统Windows基础和Linux基础,标记语言HTML基础和代码JS基础,以及网络基础、数据库基础和虚拟机使用等... 别被这些看上去很多的东西给吓到了,其实都是很简单的基础知识,同学们看完基本上都能掌握。计算机专业的同学都应该接触了解过,这部分可以直接略过。没学过的同学也不要慌,可以去B站搜索相关视频,你搜关键词网络安全工程师会出现很多相关的视频教程,我粗略的看了一下,排名第一的视频就讲的很详细。 当然你也可以看下面这个视频教程仅展示部分截图: 学到http和https抓包后能读懂它在说什么就行。 2.网络基础和编程语言 3.入手Web安全 web是对外开放的,自然成了的重点关照对象,有事没事就来入侵一波,你说不管能行吗! 想学好Web安全,咱首先得先弄清web是怎么搭建的,知道它的构造才能精准打击。所以web前端和web后端的知识多少要了解点,然后再学点python,起码得看懂部分代码吧。 最后网站开发知识多少也要了解点,不过别紧张,只是学习基础知识。 等你用几周的时间学完这些,基本上算是具备了入门合格渗透工程师的资格,记得上述的重点要重点关注哦! 再就是,要正式进入web安全领域,得学会web渗透,OWASP TOP 10等常见Web漏洞原理与利用方式需要掌握,像SQL注入/XSS跨站脚本攻击/Webshell木马编写/命令执行等。 这个过程并不枯燥,一边打怪刷级一边成长岂不美哉,每个攻击手段都能让你玩得不亦乐乎,而且总有更猥琐的方法等着你去实践。 学完web渗透还不算完,还得掌握相关系统层面漏洞,像ms17-010永恒之蓝等各种微软ms漏洞,所以要学习后渗透。可能到这里大家已经不知所云了,不过不要紧,等你学会了web渗透再来看会发现很简单。 其实学会了这几步,你就正式从新手小白晋升为入门学员了,真的不算难,你上你也行。 4.安全体系 不过我们这个水平也就算个渗透测试工程师,也就只能做个基础的安全服务,而这个领域还有很多业务,像攻防演练、等保测评、风险评估等,我们的能力根本不够看。 所以想要成为一名合格的网络工程师,想要拿到安全公司的offer,还得再掌握更多的网络安全知识,能力再更上一层楼才行。即便以后进入企业,也需要学习很多新知识,不充实自己的技能就会被淘汰。 从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。 尾言 因为入门学习阶段知识点比较杂,所以我讲得比较笼统,最后联合CSDN整理了一套【282G】网络安全从入门到精通资料包,需要的小伙伴可以点击链接领取哦! 网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

拿到一个python项目,怎么根据requirements.txt 完成环境导入

将一个Python项目的依赖环境导入通常涉及使用 文件。这个文件包含了项目所需的所有依赖包及其版本信息。你可以使用以下步骤在你的开发环境中安装这些依赖:requirements.txt 打开命令提示符或终端: 打开一个命令提示符(Windows)或终端(Linux/Mac)窗口。 导航到项目目录: 使用 命令(change directory)切换到包含 文件的项目目录。例如:cd requirements.txt cd path\to\your\project 创建虚拟环境(可选): 虽然不是必须的,但通常建议在项目中使用虚拟环境,以隔离项目的依赖。你可以使用以下命令创建虚拟环境: python -m venv venv 这会在项目目录中创建一个名为 venv 的虚拟环境。在Windows上,你可能需要使用 或 。venvpython -m venv venvpy -m venv venv 激活虚拟环境: 激活虚拟环境以确保安装的依赖只影响当前项目。在命令提示符或终端中执行以下命令: 在 Windows 上: venv\Scripts\activate 在 Linux/Mac 上: source venv/bin/activate 安装依赖: 在虚拟环境中运行以下命令来安装项目的依赖: pip install -r requirements.txt 这将根据 文件中指定的依赖项和版本信息安装所有需要的包。requirements.txt 验证安装: 安装完成后,你可以运行项目以确保所有依赖项都正确安装。你可能需要进行其他配置步骤,如数据库迁移等,具体取决于项目的要求。 这些步骤应该能够帮助你在本地环境中设置Python项目的依赖。请确保你的Python版本与项目要求的版本兼容,并根据需要更新项目中的其他配置。 虚拟环境就是只针对于当前项目的环境,可以做到环境隔离 虚拟环境安装完成后,如果需要在PyCharm运行,请在PyCharm上打开项目,并把当前虚拟环境作为当前项目的解析环境: 在PyCharm中配置使用哪个Python解释器可以通过以下步骤完成: 打开项目: 打开你的PyCharm项目。 进入项目设置: 在顶部菜单中,选择 “File”(文件) > “Settings”(设置)(在Windows上是 “File” > “Settings”,在Mac上是 “PyCharm” > “Preferences”)。 选择项目解释器: 在设置窗口左侧,选择 “Project: YourProjectName”(你的项目名称)下的 “Python Interpreter”(Python解释器)。

【AI的未来 - AI Agent系列】【MetaGPT】5. 更复杂的Agent实战 - 实现技术文档助手

在 【AI的未来 - AI Agent系列】【MetaGPT】2. 实现自己的第一个Agent 中,我们已经实现了一个简单的Agent,实现的功能就是顺序打印数字。 文章目录 0. 本文实现内容1. 实现思路2. 完整代码及细节注释 0. 本文实现内容 今天我们来实现一个有实际意义的Agent - 实现一个技术文档助手,用户只需要输入技术文档的标题,例如“Git教程”,Agent自动将Git教程写成文档,分目录,分块,条理清晰,并有代码示例。 先看下要实现的效果(全程用户只需要输入“Git 教程”): MarkDown格式分目录,一级标题、二级标题有代码示例 1. 实现思路 因为token限制的原因,我们先通过 LLM 大模型生成教程的目录,再对目录按照二级标题进行分块,对于每块目录按照标题生成详细内容,最后再将标题和内容进行拼接,解决 LLM 大模型长文本的限制问题。 整体流程如下(下图来自《MetaGPT智能体开发入门》): 分析上述流程图,我们需要实现: 生成文档大纲的Action:WriteDirectory子任务的Action:WriteContent在得到文档大纲之后,要对大纲进行拆分(本例按目录进行拆分),然后根据拆分内容动态添加子任务Action,让子任务去根据目录写技术文档的内容将子任务Action生成的内容最后做拼接,形成最终的MarkDown文档 2. 完整代码及细节注释 直接放出完整代码,代码中添加了一些细节注释来帮助你理解,用的MetaGPT 0.5.2版本。建议你一定要实操一遍,因为不实操,你永远不知道自己会遇到多少坑… 代码并不复杂 WriteDirectory的实现:基本就是我们把自己的需求放入我们准备好的提示词模板里,询问大模型得到结果,然后我们对得到的内容做一个解析。(数据格式化)WriteContent的实现:直接根据传入的子标题内容调用大模型生成回答 # 加载 .env 到环境变量 from dotenv import load_dotenv, find_dotenv _ = load_dotenv(find_dotenv()) from datetime import datetime from typing import Dict import asyncio from metagpt.actions.write_tutorial import WriteDirectory, WriteContent from metagpt.const import TUTORIAL_PATH from metagpt.logs import logger from metagpt.

element中表格组件的row-class-name和class-name属性的使用以及无效处理

1.这两个属性的使用,row-class-name用在el-table标签上,class-name用在el-table-column标签上。两个属性即可绑定类名也可绑定函数 <!-- 这里是绑定函数,也可以绑定类名 --> <el-table :data="tableData" @selection-change="handleSelect" :row-class-name="shower" border height="400px" scrollbar-always-on> <el-table-column width="60" type="selection" /> <el-table-column width="150" prop="name" label="订单号" /> <el-table-column width="120" prop="estimateTotal" label="跟单员" /> <el-table-column width="5" /> <el-table-column label="操作" width="150"> <template #default="{ row }"> <el-button type="primary" text @click="confirmData(row, 1)" v-if="true">确认应收数据</el-button> <el-button type="primary" text @click="Removeconfirm(row, 1)" v-else>撤销确认</el-button> </template> </el-table-column> <!-- 这里是绑定类名,也可以绑定函数 --> <el-table-column width="180" prop="name" label="客户名称" class-name="unconfirmeds"/> <el-table-column width="120" prop="meetName" label="核销状态" /> </el-table> 2.绑定函数时就可以通过条件来决定哪行需要添加样式 function shower({row}){ console.log(row); if(row.name==='阿尼亚'){ return 'unconfirmeds' }else{ return '' } } 3.

【RPC】动态代理:面向接口编程,屏蔽RPC处理流程

一、背景 如果我问你,你知道动态代理吗? 你可能会如数家珍般地告诉我动态代理的作用以及好处。那我现在接着问你,你在项目中用过动态代理吗?这时候可能有些人就会犹豫了。那我再换一个方式问你,你在项目中有实现过统一拦截的功能吗?比如授权认证、性能统计等等。你可能立马就会想到,我实现过呀,并且我知道可以用 Spring 的 AOP 功能来实现。 没错,进一步再想,在 Spring AOP 里面我们是怎么实现统一拦截的效果呢?并且是在我们不需要改动原有代码的前提下,还能实现非业务逻辑跟业务逻辑的解耦。这里的核心就是采用动态代理技术,通过对字节码进行增强,在方法调用的时候进行拦截,以便于在方法调用前后,增加我们需要的额外处理逻辑。 那话说回来,动态代理跟 RPC 又有什么关系呢? 二、远程调用的魔法 我说个具体的场景,你可能就明白了。 在项目中,当我们要使用 RPC 的时候,我们一般的做法是先找服务提供方要接口,通过 Maven 或者其他的工具把接口依赖到我们项目中。我们在编写业务逻辑的时候,如果要调用提供方的接口,我们就只需要通过依赖注入的方式把接口注入到项目中就行了,然后在代码里面直接调用接口的方法 。 我们都知道,接口里并不会包含真实的业务逻辑,业务逻辑都在服务提供方应用里,但我们通过调用接口方法,确实拿到了想要的结果,是不是感觉有点神奇呢?想一下,在 RPC 里面,我们是怎么完成这个魔术的。 这里面用到的核心技术就是前面说的动态代理。RPC 会自动给接口生成一个代理类,当我们在项目中注入接口的时候,运行过程中实际绑定的是这个接口生成的代理类。这样在接口方法被调用的时候,它实际上是被生成代理类拦截到了,这样我们就可以在生成的代理类里面,加入远程调用逻辑。 通过这种“偷梁换柱”的手法,就可以帮用户屏蔽远程调用的细节,实现像调用本地一样地调用远程的体验,整体流程如下图所示: 三、实现原理 动态代理在 RPC 里面的作用,就像是个魔术。现在我不妨给你揭秘一下,我们一起看看这是怎么实现的。之后,学以致用自然就不难了。 一起看下下面的流程图,具体代码细节你可以对照着 JDK 的源码看(上文中有类和方法,可以直接定位),我是按照 1.7.X 版本梳理的。 JDK 动态代理的核心是InvocationHandler 接口。这里提供一个 InvocationHandler 的Demo 实现,代码如下: public class DemoInvokerHandler implements InvocationHandler { private Object target; // 真正的业务对象,也就是RealSubject对象 public DemoInvokerHandler(Object target) { // 构造方法 this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // .

ArkTS快速入门----Harmony OS 开发(第四期)

ArkTS快速入门 初始例程解析 装饰器:用来装饰结构体,方法,变量,赋予其特殊含义 @Entry 标记当前组件是入口组件,即可以作为一个独立页面直接访问,若没有该装饰器,则该组件不能被独立访问,只能作为其他组件的陪衬。一个页面只能有一个@Entry修饰的组件,加载页面时会首先创建并呈现@Entry标记的组件,只有@Entry修饰的组件及其子组件才能被显示在页面上。 @Component 标记下面这个是自定义组件----(组件可以理解为模块,可以直接将整体拿来使用)。 @State 标记该变量是状态变量,其值的变化会触发与其关联的组件的刷新(即所有调用了该变量的组件的刷新)。 @Link 标记的变量可以与父组件的@State变量建立双向数据绑定,任何一方做的修改都会使另一方一同改变。 @Link变量不能在组件内部进行初始化。@Link 标记的变量必须在生命周期函数中完成初始化。 如上图一,在父组件RankPage中通过’$'操作符创建"引用",使父组件中的isSwitchDataSource与子组件TitleComponent中定义的isRefreshData进行双向数据绑定。 5.@Prop与@State有相同的语义,但初始化方式不同。@Prop装饰的变量必须使用其父组件提供的@State变量进行初始化,允许组件内部修改@Prop变量,但更改不会通知给父组件,即@Prop属于单向数据绑定。 如上图,@Prop装饰的变量必须使用其父组件提供的@State变量进行初始化 @Builder 按引用传递参数时,传递的参数可为状态变量,且状态变量的改变会引起@Builder方法内的UI刷新。 @Builder 就是用于页面构建的装饰器,表示其后面的函数可以用来构建页面(只要函数被调用),函数可以定义在组件外(全局页面构建函数),也可以定义在组件内部(局部页面构建函数,此时不用加function关键字)。 7.@Styles 就是用于页面构建样式的装饰器,表示其后面的函数可以用来构建页面的样式(只要函数被调用---- .函数名()),要求:函数内部的所有样式必须是通用样式。 8.@Extend(组件名a) 就是与@Styles 装饰器类似,只是其后面的函数中的样式不全是通用样式,其中有样式为a的特有样式。注意:@Extern 只能定义在全局,不能定义在组件内。 9.@Provide和@Consume 就是 @Provide修饰的状态变量自动对提供者组件的所有后代组件可用,后代组件通过使用@Consume装饰的变量来获得对提供的状态变量的访问。@Provide作为数据的提供方,可以更新其子孙节点的数据,并触发页面渲染。@Consume在感知到@Provide数据的更新后,会触发当前自定义组件的重新渲染,反之同理,@Consume 修饰的变量不用初始化,但要求变量名与祖先组件一致(方便绑定),也就是说:@Consume装饰的变量通过相同的属性名绑定其祖先组件内的@Provide装饰的变量 内置组件: ArkUI提供的组件,分为两种: 1.容器组件:用来完成页面布局,如Row(该组件内部的所有元素自动成为一行),Column(该组件内部的所有元素自动成为一列)。 2.基础组件:自带样式和功能的页面元素,如Text。 3.自定义组件: 将上面两种组件组合,可以直接拿来使用。 属性方法:设置对应组件的UI样式。 例子: .fontSize(50) //字体大小 .fontWeight(FontWeight.Bold) //字体宽度 .fontColor("#16B") //字体颜色 .height('100%') //字体高度占满 事件方法:设置该组件的触发的事件。 例子: .onClick(()=>{ //点击事件 //……处理点击事件 this.message="hello ArkTS!" }) 给组件传参数 值传递(默认) 上图就是默认的参数传递----值传递,Text()标签调用本组件内部的变量content,外部调用ToDoItem()组件时要为变量content进行初始化,形式:ToDoItem({变量名:值}); 引用传递 上图便是按引用传递,用$$ : {参数名1:参数类型,参数名2:参数类型……}接收。函数体内要使用参数:$$.参数名。外部调用组件时,变量初始化的方式与值传递的一致。 关于${……} ${……}是一种JavaScript中的模板字符串语法,用于在字符串中插入动态的变量或表达式。 生命周期函数 自定义组件生命周期:指自定义组件从创建到销毁的整个过程。 提供了两个生命周期回调函数 aboutToAppear(),aboutToDisappear(),前者在创建自定义组件后,执行build组件前自动调用,可用于初始化页面要展示的数据或申请定时器资源。 后者在该自定义组件被销毁时调用,可用于释放不再使用的资源。

在VMware上安装MySQL

第一步 安装VMware 17 镜像是 安装好后,就MySQL安装(如果不知道怎么安装VMware,可以看我之前发的) 注意:右下方的光盘有没有亮,没有要连接哦~ 第二步,使用xshell连接,宝子们很聪明,这一步就不要多说 第三步:插入光盘 输入命令 df -h 可以显示 默认/dev/sr0文件为光盘文件 输入命令 mount -o ro /dev/sr0 /media 进行手动挂载 进入 cd /etc/yum.repos.d 目录(初始状态是没有这两个文件的) 编辑并配置文件 vim yum.repo [BaseOS] name=baseos yum enabled=1 baseurl=file:///media/BaseOS gpgcheck=0 [AppStream] name=app yum enabled=1 baseurl=file:///media/AppStream gpgcheck=0 清空yum缓存 yum clean all 创建yum缓存仓库 yum makecache 查看列表 yum repolist 第三步:MySQL安装 访问 www.mysql.com Mysql官网====>DOWNLOADS====>MySQL Community (GPL) Downloads ====>Download Archives下载档案====>MySQL Community Server MySql社区服务器====>MySQL Downloads 下载 wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.34-1.el9.x86_64.rpm-bundle.tar 解tar tar xvf mysql-8.0.34-1.el9.x86_64.rpm-bundle.tar 安装

Ubuntu重启后进入initramfs导致无法开机

今晚,我的电脑意外关机,重新开机后打开了虚拟机后出现initramfs,一直无法开机。该虚拟机使用的是 vm17,系统是ubuntu20, 解决方案 使用如下命令查看和识别磁盘、分区或文件系统的信息 在initramfs后面输入 fsck /dev/sdb4 ,即修复上面损坏的系统文件 下面出现的所有需要按y的地方均按按键y,直至出现initramfs 之后在initramfs后面输入 exit ,即退出initramfs;之后等待就可以正常打开ubuntu

CentOS7中yum命令详解,本地源,在线源,混合源

目录 Linux系统中常用的软件包管理工具 yum详解 yum常见的目录 yum的本地源和在线源 本地源特点 安装本地源步骤 安装本地源具体演示 http方式安装本地源实验 ​编辑ftp方式安装本地源实验 在线源特点 安装在线源 混合源:本地源和在线源混合在一起,在一个配置文件 yum命令语法和常用用法 Linux系统中常用的软件包管理工具 apt-get:Debian和Ubuntu系统中常用的软件包管理工具,通过命令行进行软件包的安装、更新和卸载。 yum:适用于Red Hat、CentOS等RPM包管理系统的软件包管理工具,也是通过命令行进行软件包的安装、更新和卸载。 dnf:Fedora系统中的软件包管理工具,是yum的后续版本,提供更快的包管理速度和更好的依赖关系解决方案。 zypper:适用于openSUSE和SUSE Linux Enterprise系统的软件包管理工具,通过命令行进行软件包的安装、更新和卸载。 pacman:适用于Arch Linux系统的软件包管理工具,也是通过命令行进行软件包的安装、更新和卸载。 snap:一种跨发行版的软件打包和分发系统,它可以在不同的Linux发行版上安装相同的软件包,通过命令行进行软件包的安装、更新和卸载。 tar:是一种Linux系统中的归档工具,用于将多个文件或目录打包成一个单独的文件(通常是.tar文件)。tar可以压缩和解压缩文件,也可以在打包时指定压缩方法(例如gzip、bzip2等)。tar的命令格式为:tar [options] [file(s)]。 tar常用参数说明 -c:创建打包文件 -v:显示指令执行过程 -f:指定文件 -r:向已经存在的打包文件中添加文件 -x:还原文件 -t:列出备份文件的内容 tar常用用法 打包命令:tar -cvf [打包文件名] [待打包文件或目录] 解包命令:tar -xvf [打包文件名] 压缩命令:tar -czvf [压缩文件名] [待压缩文件或目录] 解压缩命令:tar -xzvf [压缩文件名] 添加文件命令:tar -rvf [打包文件名] [待添加文件或目录] 查看打包文件内容命令:tar -tvf [打包文件名] 8. rpm:一种Linux系统中的软件包管理工具,用于安装、升级和删除.rpm格式的软件包。 用rpm时需要先对rpm包所需的依赖包yum下载,需要手动下载 RPM 文件并提供给 RPM 工具进行操作。 错误示例 [root@master Packages]# rpm -ivh tomcat-lib-7.

图形化批量ping监视工具vmping

做过IT变更的同学经常要同时ping很多的IP来监控服务器状态,同时打开很多命令窗口会让桌面显得非常密密麻麻,非常的不方便,今天介绍一款可以同时ping多个IP的图形化工具-vmping。 vmping优点 轻松地 Ping 多个主机,集中显示。 颜色显示每台主机的状态。绿色表示响应,红色表示不响应,橙色表示错误。 除了支持ping,还支持监视 TCP 端口,比如 IP:port 多个探测选项可以设置,例如请求之间的间隔以及超时时间。 所有内容可以输出到文本文件。 可以发送电子邮件警报,每次主机更改状态时将发送一封电子邮件。 内置数据包生成器/压力测试器 界面可以自动统计ping结果 Vmping 能够生成详尽的测试报告,Vmping 还能以图表方式展示数据,用户可以直观地了解网络性能曲线和变化趋势。 使用方法 ​ Vmping 只需要输入目标 IP 地址或者服务端口,点击“Ping”按钮即可开始测试。用户可以设置 Ping 的参数,如测试次数、超时时间和包大小等。测试完成后,Vmping 将会给出详细的结果和报告,用户可以根据需要导出报告或查看图表展示。 可以批量输入地址,省的一个一个输入麻烦 直接输入别名,帮助辨认 此外,软件很多选项可以定制,包括ping参数设置,emai报警,日志记录等。 总结来说,Vmping 是一款功能强大的网络诊断工具,具有简单易用的界面、全面的网络监测和分析功能、详尽的测试报告、高度的可定制性和扩展性。通过使用 Vmping,用户可以轻松解决网络故障和优化网络性能。无论是个人用户还是企业用户,Vmping 都能帮助你更好地管理和维护网络,提高网络的可靠性和性能。如果有需要,可以私信我,发给你地址!

vue2从0到1搭建一个后台管理系统(一)

vue2从0到1搭建一个后台管理系统 第一步:创建项目 项目启动: npm run serve 第二步:配置 ESLint配置 禁用ESLint vue.config.js 文件 (process.env.NODE_ENV 配置在后面 ) lintOnSave:process.env.NODE_ENV === 'development', 配置文件 .eslintignore 文件 (ESLint配置文件) .eslintrc.js 文件 (ESLint忽略配置) vue.config.js 文件配置 配置基本信息 代理转发 webpack打包处理 开发 / 测试 / 生产 环境变量配置 信息包括: # 页面标题 VUE_APP_TITLE = '标题' # 开发环境配置 ENV = 'development' # 开发环境 VUE_APP_BASE_API = 'base地址' # 路由懒加载 VUE_CLI_BABEL_TRANSPILE_MODULES = true # 后端接口地址 VUE_APP_SERVER_API_URL = '后端地址' # Mqtt消息服务器连接地址 VUE_APP_MQTT_SERVER_URL = 'Mqtt消息服务器连接地址' # 百度地图AK VUE_APP_BAI_DU_AK = '你的百度地图AK'

防止被黑,安全加固SSH服务

SSH(Secure Shell)是一种安全的远程登录协议,提供对远程计算机的安全访问。放在在互联网的服务器经常会被黑客扫描,为了加固SSH服务,以确保安全性,需要采取以下措施: 禁用root用户的SSH远程登录: root特权用户登录系统会有风险,通过修改SSH配置文件来禁用root用户的SSH登录。在文件/etc/ssh/sshd_config中,找到PermitRootLogin选项,并将其值改为no,然后重新启动SSH服务。 启用公钥认证: 公钥认证是SSH连接的一种安全机制,通过生成一对密钥(公钥和私钥),由于私钥自己保管,比密码登陆要安全。在客户端生成密钥对后,将公钥添加到服务器的authorized_keys文件中。然后,在SSH服务器配置文件中添加以下行:PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys。 更改SSH端口: 互联网扫描经常会针对22,3389端口。。为了增加安全性,可以将SSH端口更改为一个非常见的端口号,如22222。在/etc/ssh/sshd_config配置文件中,找到Port选项,并将其值改为所需的端口号。 使用防火墙限制允许的IP访问: 使用防火墙设置允许的IP对SSH服务的访问,这样可以防止从互联网攻击。硬件防火墙和iptables等工具都可以配置这样的规则 使用强状密码并定期更换: 密码长度12位以上,混合使用大写字母、小写字母、数字和特殊字符,并每三个月更换一次,这样可以减少密码被破解可能性。 更新SSH服务器软件: 及时更新SSH服务器软件是确保安全的重要一步。新版本通常修复了旧版本存在的漏洞和安全问题。定期检查SSH服务器软件更新,并尽快安装最新版本。 查看SSH日志: 最后,要经常定期检查日志,尤其是异常登录尝试、登录成功或失败的记录。如果发现可疑活动,可以采取相应的措施来保护服务器。 通过以上步骤,并定期对服务器进行检查,可以有效加固SSH服务,提高服务器的安全性.如果你还有补充的,欢迎留言区留言。

自制Breadcrumb 面包屑

使用场景: 当系统拥有超过两级以上的层级结构时当需要告知用户『你在哪里』时当需要向上导航的功能时 //定义MenuItem export interface MenuItem{ key:string // 英文名 label:string //对应中文名 children : MenuItem[] // 一级子菜单 parentNodeList : MenuItem[] // 所有上级菜单=breadCrumbList ... } function findParentNodeList(key, menuData, parentNodeList = []) { for (const item of menuData) { if (item.key=== key) { return [...parentNodeList , item ]; // 找到目标菜单,返回所有上级菜单 } if (item.children) { const result = findParentNodeList(key, item.children, [...parentNodeList , item]); // 1 if (result.length > parentNodeList.length) { return result; // 已找到目标菜单,直接返回结果 } } } return parentNodeList ; // 未找到目标菜单,返回当前的上级菜单 } const breadCrumbList : MenuItem[] = findParentNodeList(activeKey,menuData); const handelBreadCrumbClick=()=>{ //处理点击事件,跳转路由 } // 面包屑组件 const BreadCrumb = ()=>{ return {breadCrumbList.

Android 12.0 13.0 默认给予指定APP的AppOpsManager权限

测试可用代码如下 frameworks\base\services\core\java\com\android\server\appop\AppOpsService.java private Op getOpLocked(Ops ops, int code, int uid, boolean edit) { Op op = ops.get(code); if (op == null) { if (!edit) { return null; } op = new Op(ops.uidState, ops.packageName, code, uid); ops.put(code, op); } Log.d("wwwwwwwww","getOpLocked 4854 op.mode="+op.mode + ",,packageName ="+ops.packageName); if(isInWhiteList(ops.packageName)){ //添加默认权限并设置为允许, 这里只加了SYTEM_ALERT_WINDOW Op op2 = new Op(ops.uidState, ops.packageName, AppOpsManager.OP_SYSTEM_ALERT_WINDOW,uid); op2.mode = AppOpsManager.MODE_ALLOWED; ops.put(op2.op, op2); } if(isInWhiteList(ops.packageName)){ //添加默认权限并设置为允许, 这里只加了OPSTR_AUTO_REVOKE_PERMISSIONS_IF_UNUSED Op op3 = new Op(ops.uidState, ops.packageName, AppOpsManager.

2024年图灵科技新书预告,技术人的必备技能,藏在每一本书里

翻过2023这一页,我们迎来了2024年。在过去的一年里,我们都有各自的收获。 图灵去年出版了100+图书,有紧跟时代前沿的《这就是ChatGPT》,还有250万人都觉得好用的Python入门经典《Python编程从入门到实践(第3版)》,更有帮助百万大学生解决高数烦恼的《高等数学(上册)精选750题》。这里的每一个选题都是策划老师对图灵读者需求的反馈,每一本书也都是他们的诚意之作。 2024年我们依旧准备了超多好书,其中有大家翘首期待的《算法图解(第2版)》《图解TCP/IP(第6版)》《R数据科学(第2版)》等等,还有大模型在各个领域应用的选题,以满足不同人群的学习需求。今年图灵将一如既往地给大家提供好书,陪伴大家学习、提升。 新年让我们收起焦虑、迷茫、纠结。给自己一个行动力,跟这些好书一起,继续前行。(注:以下图书仅为新书的一部分,后续还会不断加入新选题。图书封面以出版为准,具体图书出版时间请关注后续的每月书讯) 大模型在各领域的应用 01 《ChatGPT高效提问:prompt技巧大揭秘》 李世明,代旋,张涛 | 著 超实用 prompt 技巧大全。本书以通俗易懂的语言,详细介绍了如何编写高质量的提示,引导 ChatGPT 输出优质答案,满足各种信息需求。书中包含详细解释和丰富示例,旨在帮助读者掌握利用 ChatGPT 解决各种问题的实用技能。(今晚 20:00,本书作者将会在图灵直播间直播分享,快来点击预约吧!👇) 02 《ChatGPT从入门到精通》 黄豆奶爸 | 著 ChatGPT应用书,涉及20多个场景,涵盖高效办公+打造IP+副业赚钱+新知学习+生活质量提升,粥左罗、肖厂长、孙圈圈、易仁永澄、芷蓝、梁靠谱、理白先生、唐晓涵、沈文婷联合推荐。 03 《零基础玩转Stable Diffusion》 关键帧 | 著 为零基础读者量身打造的学习曲线,手把手保姆式教学。内容精彩,业内好评如潮。掌握创作的底层逻辑,提升设计行业的工作效率。一键搞定批量渲染,快速确定风格调性,不再人工试错! 04 《Stable Diffusion——AIGC绘画实训教程》 孟德轩 | 著 Stable Diffusion 是当下非常受欢迎的 AI 生成绘画创作工具。本书一方面详细介绍了 AI生成绘画的技术实现,包括文生图、图生图、图片分割等,引导读者了解 AI 生成绘画的具体实现方法和原理。另一方面,本书重点分析 AI 绘画在电商行业、插画设计、游戏行业和建筑行业等的应用,这些实例可以帮助读者更好地了解 AI 绘画的实际应用价值,并激发读者的创新和应用能力。本书适合于对 AI 绘画技术感兴趣的学生、教师、研究人员、艺术家和设计师。 05 《智能文本处理实战》 达观数据 | 著 “吴文俊人工智能奖”获奖企业——达观数据带来的一线行业案例经验,众多来自清华、北大、哈工大、同济、复旦、东北大学、中科院学者推荐!本书是第一本全面介绍智能文本处理相关技术场景的图书。理论部分除传统NLP技术外,详细讲解多个关于文档智能处理的特色技术;实践部分以包括达观数据在内多个专业企业的相关产品项目经验为基础,介绍了众多行业、场景中的技术产品落地工作,具有很高的参考价值。 06 《信息检索与深度学习》 郭嘉丰,兰艳艳,程学旗 | 著 孙凝晖院士作序,张亚勤、翟成祥、李航联合推荐!学术大牛带你了解信息检索核心技术、大模型前沿应用挑战。 本书以信息检索系统架构为抓手,围绕检索系统的各个技术模块展开对神经检索前沿技术的介绍。一方面,帮助读者快速了解传统技术的发展现状;另一方面,深入介绍深度学习技术给该研究问题所带来的主要变革和前沿成果。由此,读者可以通过本书较为全面地了解信息检索领域过去与当前发展的面貌。 07 《大模型应用开发极简入门:基于GPT-4和ChatGPT》 [比] 奥利维耶·卡埃朗,[法] 玛丽−艾丽斯·布莱特 | 著

Android12 授予APK默认权限

不同于以往的Android版本 可以直接在此处设置: Android/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java private void grantDefaultSystemHandlerPermissions(PackageManagerWrapper pm, int userId) { Log.i(TAG, "Granting permissions to default platform handlers for user " + userId); ..........省略代码 // Installer grantSystemFixedPermissionsToSystemPackage(pm, ArrayUtils.firstOrNull(getKnownPackages( PackageManagerInternal.PACKAGE_INSTALLER, userId)), userId, STORAGE_PERMISSIONS); // Verifier final String verifier = ArrayUtils.firstOrNull(getKnownPackages( PackageManagerInternal.PACKAGE_VERIFIER, userId)); grantSystemFixedPermissionsToSystemPackage(pm, verifier, userId, STORAGE_PERMISSIONS); grantPermissionsToSystemPackage(pm, verifier, userId, PHONE_PERMISSIONS, SMS_PERMISSIONS); // SetupWizard grantPermissionsToSystemPackage(pm, ArrayUtils.firstOrNull(getKnownPackages( PackageManagerInternal.PACKAGE_SETUP_WIZARD, userId)), userId, PHONE_PERMISSIONS, CONTACTS_PERMISSIONS, ALWAYS_LOCATION_PERMISSIONS, CAMERA_PERMISSIONS); // Camera grantPermissionsToSystemPackage(pm, getDefaultSystemHandlerActivityPackage(pm, MediaStore.ACTION_IMAGE_CAPTURE, userId), userId, CAMERA_PERMISSIONS, MICROPHONE_PERMISSIONS, STORAGE_PERMISSIONS); // Sound recorder grantPermissionsToSystemPackage(pm, getDefaultSystemHandlerActivityPackage(pm, MediaStore.

【AI的未来 - AI Agent系列】【MetaGPT】4. ActionNode从理论到实战

文章目录 0. ActionNode基础0.1 官方解释0.2 我的理解0.3 ActionNode的数据结构0.4 如何使用ActionNode 1. ActionNode简单实战1.1 思考并返回特定格式的数字1.1.1 定义两个ActionNode1.1.2 为这两个动作节点设置一个父节点1.1.3 定义一个Action来承载上面的ActionNode 1.2 逐个打印数字1.3 实现Role,执行Action 2. 完整代码和运行效果2.1 完整代码2.2 运行效果 0. ActionNode基础 0.1 官方解释 在MG框架0.5版本中,新增加了ActionNode类,为Agent的动作执行提供更强的能力 ActionNode可以被视为一组动作树,根据类内定义,一个动作树的父节点可以访问所有的子动作节点;也就是说,定义了一个完整的动作树之后,可以从父节点按树的结构顺序执行每一个子动作节点。因此,动作的执行也可以突破0.4版本框架中,需要在Role的_react内循环执行的限制,达到更好的CoT效果。 0.2 我的理解 如下图,ActionNode需要内置在Action中使用,之前可能是Action就是一个动作,执行完一个就执行完下一个。有了ActionNode后,Action就不只是一个动作,而可能是一系列动作。这一系列动作可以组织成链式结构,或者树状结构或者更复杂的结构。 0.3 ActionNode的数据结构 schema: str # raw/json/markdown, default: "" # Action Context context: str # all the context, including all necessary info llm: BaseLLM # LLM with aask interface children: dict[str, "ActionNode"] # Action Input key: str # Product Requirement / File list / Code expected_type: Type # such as str / int / float etc.