C++项目】v2.6美鹅外卖-总集介绍博客
项目源码连接: https://github.com/sis-shen/BeautyGoose 项目介绍个人独立设计和多轮迭代开发的C/S架构开源项目。按照业务功能进行解耦合和分层,形成良好的层次结构。服务端采用高并发的应用服务器集群架构,使用Drogon作为HTTP框架。代码实现自定义的数据库客户端和Redis客户端,保持代码的易读性和易维护性。同时使用Docker容器编排技术完成应用集群构建和数据库服务部署。客户端包含QT实现的18个不同的交互界面,有完善的页面流转逻辑。 使用的技术点有: QT界面框架 Json序列化与反序列化 Drogon网络库 MySQL connector/c++ Redis 缓存层 Nginx 负载均衡 Docker容器与镜像管理技术 运行环境当前版本v2.6 客户端: windows 11 服务端: 支持Docker的任意平台 需求分析用户需求当前目标实现的用户需求有 用户注册、登录 商家添加产品 商家查看和修改产品 商家查看和处理订单 消费者查看和添加购物车 消费者查看和结算订单 消费者优惠等级变化 管理员查看销售日志 角 ...
【保持最新】C++基于多设计模式下的同步&异步⽇志系统
当前版本v1.3 戳我查看项目源码🔗 前置知识 Linux日志器(简易版) 初识Linux线程 初识设计模式&单例模式&代理模式–设计模式介绍(1) 工厂模式与建造者模式–设计模式介绍(2) 项目介绍背景引入 日志系统在软件开发和运维中扮演着至关重要的角色,主要体现在以下几个方面: 问题排查和调试:日志记录了系统运行过程中的重要信息,包括错误信息、异常堆栈、接口调用信息等。开发人员可以通过分析日志快速定位问题,减少排查时间,提高开发效率。 性能监控:通过记录应用程序的性能指标(如响应时间、请求吞吐量等),开发团队可以监控系统的健康状态,发现性能瓶颈并进行优化。 安全审计:日志可以记录用户的操作和系统事件,为后期的安全审计提供依据。一旦发生安全事件,通过分析日志可以追踪到攻击来源和攻击方式。 用户行为分析:通过对日志进行分析,开发团队可以了解用户的使用习惯和需求,这有助于改进产品功能和用户体验。 合规要求:在许多行业中,日志记录是合规的要求之一。维护完整的日志记录可以帮助企业满足法律法规和行业标准。 系统健康监控:通过实时监控日志,可以及时发现系统异常,进行预警和 ...
iam-SRS
软件需求规格说明书(SRS)项目名称: sup-iam 身份识别与访问管理系统 编写人: 沈冬法 日期: 2025年12月15日 版本号: V1.0 1. 引言特别声明,这里只提出了最小的逻辑自洽的软件需求 1.1 编写目的本文档用于分析说明“sup-iam 身份识别与访问管理系统”项目的软件系统架构、运行环境、功能及非功能需求,帮助开发者与用户对系统达成一致理解,为后续设计与开发提供基础。 1.2 项目背景与范围该文档适用于本项目相关的所有干系人,明确: 系统架构与组件分布 运行环境与依赖 主要功能模块 子功能及输入/输出说明 非功能性需求描述 1.3 术语与缩写 术语/缩写 说明 iam 身份识别与访问管理 用户 iam的使用者 运维人员 有权限查看系统日志的角色 Access Key (AK) 用于标识访问身份的公钥 Secret Key (SK) 用于请求签名的私钥 Policy 描述访问权限规则的策略文档 Auth Server 负责对访问请求进行策略评估并返回鉴权决策的服务 2. 总体描述系统逻辑上划分为 I ...
数据库课设报告
课程设计问题描述实践项目1”集成前端、服务器端及网络数据库设计开发微博应用”基本内容和要求: 开发微博客户端。 用后端语言开发微博Web服务器。 用MySQL做Web服务器的后台数据库。 可以发表微博、查看微博及微博列表等功能。 可以发表评论功能。 可以实现用户客户端登录功能。 需求分析本微博应用系统需要满足以下功能需求: 用户管理模块 用户注册:新用户可以创建账号,需要提供用户名、密码等基本信息 用户登录:已注册用户通过用户名和密码登录系统 用户信息管理:用户可以查看和修改个人资料,包括昵称、头像、简介等 微博发布模块 发表微博:用户可以发布文字内容的微博,支持最多280字符 微博列表展示:用户可以查看所有微博的时间线列表 个人微博查看:用户可以查看指定用户发布的所有微博 互动功能模块 评论功能:用户可以对微博进行评论 评论查看:用户可以查看微博的所有评论列表 非功能性需求 系统响应时间应在3秒以内 支持多用户并发访问 数据库需要保证数据一致性和完整性 界面应简洁友好,操作便捷 设计思想本项目重点考察对数据库的设计和使用,前端功能和后端服务器功能均以实现使用功能为 ...
LangChain AI】RAG检索增强⽣成|从文件加载器到检索输出
为什么有RAG技术我们先来看一下当前AI大模型和搜索引擎会有什么问题: AI善于总结知识和语义理解,但是知识有限,它的训练还是有截止日期的 搜索引擎时效性很好,但是信息分散,对语义理解困难 AI结合搜索引擎可以弥补一部分时效性问题,然而对于本地知识和内网资料等非公开资料难以获取 因此我们需要文档加载和检索技术来增强AI的生成能力。 这样的技术,便是我们所要技术的RAG技术 RAG流程我们来了解一下RAG的流程,之后我们再一步步介绍 文档加载 (Document Loading):加载多种不同来源加载文档。LangChain 提供了 100 多种不同的文档加载器,包括 PDF 在内的非结构化的数据、SQL 在内的结构化的数据,以及 Python、Java之类的代码等。 文本分割 (Splitting):文本分割器按一定规则把 Documents 切分为指定大小的块。 存储 (Storage):存储涉及到两个环节,分别是: 向量转换:将切分好的文档块进行嵌入(Embedding),即将文档块转换成向量的形式。 向量存储:将 Embedding 后的向量数据,存储到向量数据库中。 ...
LangChain AI】少样本提示
什么是少样本提示少样本提⽰是⼀种通过向LLM提供少量具体⽰例或样本,来教会它如何执⾏某项特定任务的技术。提⾼模型性能的最有效⽅法之⼀是给出⼀个【模型⽰例】指导⼤模型你想做什么、怎么做。 就实际应用来说,可以帮小学生解决定义新运算类型的问题,不使用少样本提示的代码如下: 123from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="gpt-4o-mini")print(model.invoke("表达式 4 🤓 3是多少?").content) 1表达式 "4 🤓 3" 中的符号 "🤓" 并不是一个标准的数学运算符。如果你能提供更多的上下文,例如这个符号的具体意义或者想要进行的具体计算,我将更好地帮助你解决这个问题。 少样本提⽰通俗来讲就是在给出考题前,先给它看⼏道类似的、附有正确答案的例题。添加⽰例输⼊和预期输出的技术给到模型提⽰,让模型通过例题来理解任务应该怎么做。 比如我们补充几个用例 12345678910from l ...
LangChain AI】提示词模板
为什么用提示词模板通常情况下,模板的诞生,往往就是为了提取出公共的部分,提高重复工作的效率。提示词模板亦是如此,它被广泛应用与构建LLM应用的各个环节 简单来说,只要是需要动态、批量、或有结构地向⼤语⾔模型【发送请求】的地⽅,⼏乎都会⽤到提⽰词模板。 简单的例子就比如我老家在浙江绍兴,大学在湖南长沙,实习地点在广东深圳,我需要询问大模型各个地方的天气,那我会有如下消息要发送: 绍兴的天气怎么样 长沙的天气怎么样 深圳的天气怎么样 然后我们发现这几次询问都有大量重复内容,我们就可以把它模板化为如下描述 123456template = { template_content="{city}的城市天气怎么样", variables: { "city"="绍兴" }} 然后我们在使用模板的时候,依次替换城市即可。这样子的模板工具,我们就可以把它封装成简单易用的前端接口暴露给用户使用,比如概念图如下 提⽰词模板就是⼀个可复⽤的提⽰词蓝图,它允许我们动态地⽣成提⽰词,⽽ ...
LangChain AI】实现多轮对话
对话模式我们先了解一下我们是如何与AI的,在了解原理后才能更好地理解代码 可以看到,要实现多轮对话,我们要一次性将多个消息发给LLM 多轮对话简单实现我们可以通过控制messages消息列表简单地实现多轮对话,我们来做个前后差异对比 不使用多轮消息列表1234567891011from langchain_openai import ChatOpenAIfrom langchain_core.output_parsers import StrOutputParsermodel = ChatOpenAI(model="gpt-4o-mini")parser = StrOutputParser()chain = model | parserprint(chain.invoke("你好,我是supdriver,请记住我的名字"))print(chain.invoke("你还记得我的名字吗")) 输出如下 12你好,supdriver!很高兴认识你。有什么我可以帮助你的吗?抱歉,我无法记住之前的对话或用户的个人信息。如果你愿意,可以 ...
LangChain AI】使⽤LangSmith跟踪LLM应⽤
启用LangChain使⽤LangChain构建的许多应⽤程序,可能会包含多个步骤和多次的LLM调⽤。随着这些应⽤程序变得越来越复杂,作为开发者,我们能够检查链或代理内部到底发⽣了什么变得⾄关重要。最好的⽅法是使⽤LangSmith。 LangSmith与框架⽆关,它可以与langchain和langgraph⼀起使⽤,也可以不使⽤。LangSmith是⼀个⽤于帮助我们构建⽣产级LLM应⽤程序的平台,它将密切监控和评估我们的应⽤。 LangSmith平台地址:https://smith.langchain.com/ (新⽤⼾需要注册) 同样的,要使用这个平台,也得申请它的API key 然后我们设置环境变量,偷懒的话设置下面两条就行,不一定要按照官方文档 12LANGSMITH_TRACING=trueLANGSMITH_API_KEY="你的LangSmith API Key" 测试一下设置了上面的环境变量之后,就可以直接编写代码做测试了,特别的,没有要额外添加的代码! 1234567891011121314151617181920212223242526272 ...
LangChain AI】流式输出
我们在使用大模型网站时,有时会看见有些模型的输出是一个字一个字蹦出来的,而不是我们之前API调用那样一下子返回完整结果。实际上我们可以通过设置流式输出来达到这样的效果。 stream同步流式传输我们可以使用模型的.stream()方法传消息列表并获取迭代器,使用for遍历迭代器,进行流式输出 123456from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="gpt-4o-mini")for chunk in model.stream("讲一个100字的冷笑话"): print(chunk.content,end="|") 12345D:\program_software\AnaConda\envs\langChainP13\python.exe D:\codes\code_pycharm\langChainTool\stream.py |为什么|书|总|是|很|冷|?|因为|它|们|有|很多|“|章节|”|!||||Process finish ...
LangChain AI】结构化输出
with_structured_output()方法介绍一般聊天模型的输出都是聊天式的字符串,但如果我们希望能把模型的输出存储到数据库,或者载入到程序,么从普通字符串到结构化的输出就尤为重要。 此时我们可以使用模型的with_structured_output()方法让它输出由输入结构指定的数据结构。 它的定义如下 123456789def with_structured_output( self, schema: _DictOrPydanticClass | None = None, *, method: Literal["function_calling", "json_mode", "json_schema"] = "json_schema", include_raw: bool = False, strict: bool | None = None, **kwargs: Any,) -> Runnable[LanguageModelInput, _Di ...
vscode git插件超实用技巧之代码差异对比
LangChain AI】使用Tool工具
⼯具调⽤根本作⽤是让⼤语⾔模型(LLM)具备与外部世界交互的能⼒。LLM本⾝是⼀个封闭的知识系统,其能⼒受限于其训练数据(存在滞后性)和内在的⽂本⽣成逻辑。如果没有工具调用,它⽆法执⾏直接计算、查询实时信息、操作数据库或调⽤任何外部API。⼯具调⽤打破了这层壁垒,其作⽤具体体现在: 扩展能⼒边界:模型可以借助⼯具完成它⾃⾝⽆法完成的任务,如执⾏数学计算、搜索⽹络、查询数据库等。 保证信息实时性:通过调⽤搜索⼯具或数据库查询⼯具,LLM可以获取最新的、训练数据中不存在的信息,避免回答过时或“⼀本正经地胡说⼋道”。 处理复杂任务:将⼀个复杂的⽤⼾请求(如“分析我上个⽉的消费趋势”)分解成多个步骤,并依次调⽤不同的⼯具(如“从数据库获取数据”->“⽤Python进⾏数据分析”->“⽣成图表”)来协同完成。协调这件事这更体现在Agent智能体上。 连接现有系统:可以将企业内部已有的系统、API和数据库封装成⼯具,让LLM成为⼀个⽤⾃然语⾔驱动的统⼀接⼝,极⼤地提升了⾃动化和集成能⼒ 如,当我们希望获取当前天⽓情况时,由于LLM⽆法获取实时信息,此时我们就可以借助天气搜索⼯具, ...
LangChain AI】 初步认识并接入deepseek模型api
直接创建LLM实例本来想用openai的chatgpt的,但是奈何账号已经注册了很久了,早就没有免费额度了,外国网站充钱又很难,所以所幸去接入deepseek了,好在ds是适配openai的api格式的。 点我去申请DeepSeek API key 剩下的就是简单编个码开始调用api 12345678910111213141516from langchain_openai import ChatOpenAIfrom langchain_core.messages import HumanMessage,SystemMessage# 定义大模型model = ChatOpenAI(model="deepseek-chat",openai_api_base="https://api.deepseek.com/v1")# 定义消息列表messages = [ SystemMessage(content="translate the following from English into Chinese"), HumanM ...
【实习】华为实习最终总结
由于个人安排原因,且已完成一开始分配的MinTP项目开源的任务,所以在十月底正式结束为期四个多月的实习。6.25~10.31 任务下发一入职就接到了内部项目MinTP的开源任务,需要将内部代码开源到统一互连社区。 快速熟悉项目并参与覆盖率补全为了快速熟悉项目,我申请到了开发权限后,就开始阅读单元测试和模糊测试相关的代码,并结合项目WIKI迅速熟悉项目功能,特别是项目的适用范围和API。恰巧此时由于新更新了一批代码,为项目增加了新的功能,而测试代码尚未及时补充,因此我参与主导了增量开发测试代码。最终达到了80%的增量覆盖率,符合开发要求。 在开发过程中,我们遇到了环境问题,甚至用坏了一台云服务器,但最后我们还是通过使用虚拟机和编译替换成特定linux内核完成了测试环境的搭建。 开源探索实际上由于这是我所在部门第一次开源项目,并且这个项目实际上已经有源码随着已经开源的鸿蒙内核代码开源出去了,导致对于开源合规和代码外传的道路探索上出现了一些阻碍: 作为公司的商业产品,代码外传必须脱密、合规和保质保量。因此我与部门开源负责人对接需求,参照开源评审文档,协调开源SE、法务、专家等角色对开源代码包 ...
GO语言下grpc如何使用
说到rpc就离不开多语言支持的grpc,我们来看一下Go语言下的grpc怎么用 建立rpc服务的基本流程为了建立类似上图的基础rpc框架,我们有如下基本流程 定义gRPC服务。 生成客户端和服务器代码。 实现gRPC服务。 实现gRPC客户端。 这次我们的示例代码的目录结构如下 1. 定义rpc服务首先进入目录helloworld编写proto文件 123456789101112131415161718syntax = "proto3";package helloworld;option go_package = "./";// 定义打招呼服务service SupGreeter { rpc SayHello (HelloRequest) returns (HelloReply){}}message HelloRequest { string name = 1;}message HelloReply{ string message = 1;} 2. 生成代码然后 ...
Go项目】sup版IAM系统实现
项目背景随着我的C++外卖项目要向着微服务架构转型,一个好的鉴权系统将会称为整个系统的看门技术,为此我将引入IAM系统作为微服务架构中的一环。同时该Go项目作为我的最新项目,我将按照更规范的项目设计和使用更优雅的代码开发来完成这个项目,这将作为我软件工程能力进入新阶段的重要一步。 非常特别的一点是,之前的项目要么是工具轮子,要么就是比较直接的服务应用,而这次的iam项目则是一个平台级项目,既有轮子的接口开放性,又有服务应用的架构复杂庞大和对效率的要求。甚至这次至少需要用到两个代码仓存储项目代码 IAM是什么?IAM(Identity and Access Management,身份识别与访问管理)系统是用 Go 语言编写的一个 Web 服务,用于给第三方用户提供访问控制服务。 IAM 系统可以帮用户解决的问题是:在特定的条件下,谁能够/不能够对哪些资源做哪些操作(Who is able to do what on something given some context),也即完成资源授权功能。 用户需要提供昵称、密码、邮箱、电话等信息注册并登录到 IAM 系统,这里是以 ...
【Go】常用并发代码范式
得益于Go语言的精简语法和对并发控制的良好支持,我们可以迅速总结出高效而优雅的常用并发代码范式。 for-select模式我们可以循环监听多个channel的消息实现多路复用,我们也可以使用for...range遍历 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960func normal_task(idx int) { fmt.Printf("normal_task(%d)\n", idx)}// 死循环一直监听func select_pattern(ctx context.Context) { cnt := 0 for { select { case <-ctx.Done(): fmt.Printf("done\n") return default: cnt++ cnt %= 100 norm ...
如何在Ubuntu上搭建qemu虚拟机并替换内核
查看操作系统发行版本1cat /etc/os-release 对于apt源(Ubuntu)安装qemu工具我们要安装这些工具 1sudo apt install qemu qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager -y qemu: 模拟器核心 qemu-kvm: 支持硬件加速(Intel VT-x 或 AMD-V) virt-manager: 图形化管理工具(可选) libvirt-*: 虚拟机管理守护进程和客户端工具 获取基础启动镜像对于Ubuntu虚拟机,我们可以使用wget从网络下载并改名 12wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.imgmv jammy-server-cloudimg-amd64.img ubuntu-linux5.15.img 编写启动脚本针对本项目我们的启动脚本文件start_vm.sh的内容为 1234567qemu-system ...
一篇文章讲清楚微服务与各大组件、工具的关系
一篇文章讲清楚微服务与各大组件、工具的关系前言在当今的软件架构演进中,微服务架构已经成为了大型分布式系统的主流选择。然而,要真正理解微服务,仅仅了解其概念是远远不够的,我们需要深入理解微服务生态中的各种组件和工具,以及它们之间错综复杂的关系。 本文将从微服务的核心概念出发,系统性地梳理微服务架构中的关键组件和工具,帮助读者建立完整的微服务知识体系。 一、微服务架构概述1.1 什么是微服务微服务是一种软件架构风格,它将单一应用程序开发成一组小型服务,每个服务运行在自己的进程中,使用轻量级机制(通常是HTTP资源API)进行通信。这些服务围绕业务功能构建,并且可以由全自动部署机制独立部署。 1.2 微服务的核心特征 单一职责:每个服务专注于一个业务领域 去中心化:服务间通过API进行通信 容错性:单个服务的故障不会影响整个系统 可扩展性:可以独立扩展特定服务 技术多样性:不同服务可以使用不同的技术栈 二、微服务架构的分层结构在深入了解各个组件之前,我们需要理解微服务架构的整体分层结构: 123456789┌───────────────────────────────────────── ...
【实习】华为实习中期小结
预计六个月的实习期就快过去一半了,特此来小结一下工作 通过测开快速熟悉项目,并辅助提高测试覆盖率一入职就接到了内部项目MinTP的开源任务,需要将内部代码开源到统一互连社区。 为了快速熟悉项目,我申请到了开发权限后,就开始阅读单元测试和模糊测试相关的代码,并结合项目WIKI迅速熟悉项目功能,特别是项目的适用范围和API。恰巧此时由于新更新了一批代码,为项目增加了新的功能,而测试代码尚未及时补充,因此我参与主导了增量开发测试代码。最终达到了80%的增量覆盖率,符合开发要求。 在开发过程中,我们遇到了环境问题,甚至用坏了一台云服务器,但最后我们还是通过使用虚拟机和编译替换成特定linux内核完成了测试环境的搭建。 协调各个角色,保障代码合规作为公司的商业产品,代码外传必须脱密、合规和保质保量。因此我与部门开源负责人对接需求,参照开源评审文档,协调开源SE、法务、专家等角色对开源代码包作出开源的适配更新。利用内部通讯软件的一键找人、拉群、拉电话和拉会议的功能,提高沟通协调的效率。
为什么在微服务架构中需要服务发现
在 微服务架构 中,服务数量往往成百上千,服务实例还会因为弹性伸缩、故障恢复、滚动升级等频繁上下线。服务发现(Service Discovery) 就是解决“客户端如何知道服务在哪里”的问题。 一、服务发现的作用 屏蔽服务位置的动态变化服务实例的 IP/端口不是固定的,手工配置既不现实也容易出错。服务发现让调用方不必关心服务的具体地址。 实现负载均衡服务发现可以返回一组可用服务实例,调用方通过负载均衡策略(如轮询、权重、最少连接数)选择目标。 增强系统的弹性与可扩展性新服务实例注册后即可被发现并使用;失效实例被摘除,不会影响调用。 支持故障容错调用方能根据发现机制实时感知健康的服务实例,避免请求打到不可用节点。 二、服务发现的设计思想 注册与查询分离 服务注册(Service Registration):服务启动后向注册中心报告自己的信息(如 IP、端口、元数据),并定期心跳维持。 服务发现(Service Discovery):调用方通过注册中心获取目标服务的实例列表。 两种发现模式 客户端发现(Client-side Discovery)调用方自己从 ...
什么是领域驱动设计(DDD)
软件设计不止UML在软件开发的世界中,设计方法论层出不穷。从早期的结构化设计到面向对象设计,再到如今备受关注的领域驱动设计(Domain-Driven Design,DDD),每一种方法都在试图解决软件复杂性不断增长的问题。虽然UML作为统一建模语言在软件设计中发挥了重要作用,但它并不是唯一的解决方案。 UML简介统一建模语言(Unified Modeling Language,UML)是一种标准化的建模语言,用于软件系统的可视化设计。UML提供了多种图形符号和规则,包括用例图、类图、序列图、活动图等十几种不同类型的图表。 UML的主要特点: 标准化:提供了统一的建模符号和语法 全面性:涵盖了软件开发生命周期的各个阶段 工具支持:有丰富的建模工具支持 文档化:便于团队沟通和知识传承 然而,UML也存在一些局限性: 学习曲线陡峭,需要掌握大量符号和规则 过于技术导向,业务人员难以理解 容易陷入过度设计的陷阱 维护成本高,文档与代码容易脱节 DDD的起源领域驱动设计(DDD)由Eric Evans在2003年的同名著作中首次提出。这一设计方法论的诞生背景是软件项目日益复杂,传统的技 ...
【架构】浅谈服务化
什么是服务化不相关的业务合集不是服务化烟囱架构不是服务化
avatar
副驾supdriver
动物界 脊索动物门 哺乳纲 灵长目 人科 人属 智人种
我github还蛮大的
公告
主域名:
supdriver.top
网站资讯
文章数目 :
132
已运行时间 :
本站总字数 :
385.6k
本站总访问量 :
最后更新时间 :