Rust自学一周初印象
经过一周对Rust语言圣经的学习和第三方包的使用体验,我成功从纯Rust小白成为了Rust爱好者,已经有了能进行网络编程和数据库交互的基本能力。 概括一下Rust的特点 超高效的运行时效率 大聪明编译器 干费我2核2G服务器的rust analyzer 安全,安全,还是安全! 特征,特征对象,超牛的泛型编程方式 又见堆栈我原本是以C/C++为主语言的,在使用Python或Java这种有GC垃圾回收机制的语言时,对堆栈并不强调,没想到遇上Rust,堆栈的概念再一次被强调了起来,但与C/C++这种对堆栈,尤其是堆区的分配的过于自由的管理相比,Rust对堆栈的管理十分严格,且涉及到Rust是如何在没有GC机制的前提下,既能高效使用内存,又能保证安全。 所有权与借用对于变量的数据,它有一个所有权规则,没错,变量和数据之间的联系更为松散,存在通过所有权转移导致数据还在,但变量已经失效的情况 以上是一点,而还有一点就是当变量拥有分配在堆上的数据的所有权时,变量一旦带着所有权被释放时,堆上的数据会一并被自动回收,这样就不用担心内存泄漏的问题了,也不用手动释放内存。 不想转移所有权?,那就试试使用克 ...
Rust框架入门之Axum+Sea-ORM实现MySQL增删查改
框架介绍Axum一款基于tokio的web框架TODO Sea_ORM一款提供对象关系映射服务的项目 环境准备 编程环境: 安装好rust 编码环境:vscode + rust analyzer插件 数据库:安装好本机上的MySQL Server 开始上手数据库准备虽然Sea-ORM提供数据库的建库和建表操作,但是为了简化项目难度,这次我们就手动创建了 这里给出初始化的sql语句 123456789DROP DATABASE if EXISTS RustMysql;CREATE DATABASE RustMysql DEFAULT CHARACTER SET utf8mb4;use RustMysql;create table account( `id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, `name` varchar(16) not null unique)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 安装swa-orm-cli客户端这是一个专门用于自动生成sea-o ...
v2.5美鹅外卖平台数据库优化更新
日志查阅在2.4出现后台服务器挂掉的情况后,我立即去查看了容器的日志信息,获得了如下日志: 12345678910111213141516171819202122[default-logger][06:16:43][9][info ][HTTPServer.cpp:415] [消费者获取菜品详情]成功,dish id:D7d33e8b47dda[default-logger][06:16:43][9][trace ][HTTPServer.cpp:416] { "dish" : "{\n \"base_price\" : 11.0,\n \"description\" : \"11\",\n \"icon_path\" : \"https://ts3.cn.mm.bing.net/th?id=ORMS.800de0e05f326302bea15ba2e5ff707d&pid=Wdp&w=26 ...
v2.4美鹅外卖平台反向代理更新
更新内容 架构上添加代理层,升级为应用服务集群架构 容器编排上,后端服务程序数量提升为两个 采用反向代理负载均衡技术,后端服务器均衡承载负载 什么是应用服务集群架构当单台应用服务器出现了性能瓶颈之后,可以有如下两种扩展解决方案: 垂直扩展/纵向扩展ScaleUp。通过购买性能更优、价格更⾼的应⽤服务器来应对更多的流量。这种⽅案的优势在于完全不需要对系统软件做任何的调整;但劣势也很明显:硬件性能和价格的增⻓关系是⾮线性的,意味着选择性能2倍的硬件可能需要花费超过4倍的价格,其次硬件性能提升是有明显上限的。 ⽔平扩展/横向扩展ScaleOut。通过调整软件架构,增加应⽤层硬件,将⽤⼾流量分担到不同的应⽤层服务器上,来提升系统的承载能⼒。这种⽅案的优势在于成本相对较低,并且提升的上限空间也很⼤。但劣势是带给系统更多的复杂性,需要技术团队有更丰富的经验 这里我们决定使用水平扩展,调整软件架构的方式提高服务法并发量。 但这需要引⼊⼀个新的组件⸺负载均衡:为了解决⽤⼾流量向哪台应⽤服务器分发的问题,需要⼀个专⻔的系统组件做流量分发。 关于流量分发的策略,有以下几种常见的策 ...
C++复习小短篇】访问基类的私有函数
题目内容该问题考察对虚函数表的理解,虚函数表就是是一个类存储虚函数地址的指针列表,每一个声明的虚函数(不论是新建还是重写)都会写入虚函数表的对应位置。 虚函数表的地址在vc编译器下存储在每个对象内存空间的最前面,通过解引用可以访问虚函数表的首地址,接下来我们可以通过遍历等方式访问里面存的函数地址。 代码如下 12345678910111213141516171819202122232425262728293031323334353637383940414243#include <iostream>using namespace std;class A{public: virtual void g() { cout << "A::g" << endl; }private: virtual void f() { cout << "A::f"<<endl; }};class B :public A{public: vir ...
初阶】初识Redis与指令学习
认识RedisRedis 是⼀种基于键值对(key-value)的NoSQL数据库,同时它也是一款高性能的内存数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis可以满⾜很多的应⽤场景,⽽且因为Redis会将所有数据都存放再内存中,所以它的读写性能⾮常惊⼈。 Redis的八大特性Redis有着八大令人青睐的特性 1. 速度快Redis最突出的特点就是速度快,官⽅给出的读写性能可以高达10万/秒,而保证它能有如此之高性能的基础,主要有如下四点: 基于内存:相比于传统数据库基于外存上存储的数据库文件,Redis所有的数据都是存放在内存中的,由于内存和外存的读写速率差异是以数量级论的,所以Redis相比之下速度特别快 C语言实现:C语言本身就具有高性能的特点 单线程数据处理: 单线程的处理方式避免了锁竞争造成的性能损耗 高性能的代码实现 2. 基于键值对的数据结构服 ...
Postman服务端HTTP接口测试工具
Postman是一款强大的API开发协作工具,它的功能十分丰富,但是在这里我们仅选取要运用的接口测试相关的功能。 安装Postman点我去下载页面🔗https://www.postman.com/downloads/ 这里作者是Windows环境,所以下载的是Windows版本的安装包。其实它还提供了vscode 插件、命令行工具等不同的安装形式 认识Postman界面首先是认识左侧选项卡和底边选项卡 然后我们着重认识一下集合管理和创建接口测试 开始准备测试创建集合集合类似于文件夹,可以把一组相关的请求接口放在同一个集合里。 为了创建集合,我们点击图中的加号,创建一个空集合,然后右键集合再重命名为testForBlog 创建请求接口 如图,我们创建了一个请求接口,把它重命名为test1,调用的API默认为GET,然后输入了baidu.com的URL,发送之后我们就获得了响应报文。 这样就完成了一次接口的单次测试 使用其它请求接口如图,Postman提供了多种接口 \ 编写请求报文和测试脚本如图,这里使用了我一个项目的一个查询接口,它使用POST接口,报文是JSON格式,响应也是 ...
v2.3美鹅外卖平台数据库守护线程更新
更新要点 为DatabaseClient配置了一个负责重连的异步守护线程 完成了DatabaseClient和HTTPServer的解耦合 为每一个数据库客户端接口的异常处理处加入了被动检测连接状态 异步线程循环中加入了计数器,能够定时自动触发连接状态检测 解决了查询订单列表时导致客户端崩溃的问题 为什么引入守护线程原先的数据库连接更多的偏向于能用就行的实验性功能,这导致了一个很严重的问题: 数据库连接不稳定,以及只连接一次数据库,导致断连之后只能通过重启整个容器的方式重新连接,运维成本过高 因此我们引入守护线程,专门异步地负责数据库的重连。这样就能大大提高数据库连接的健壮性。 代码结构解耦合原先嵌入在HTTPServer内的initDB()接口暴露了DatabaseClient内的init()接口参数,导致这两个类的耦合度过高,一旦修改init()接口的参数,initDB也要跟着修改,这已经是非常明显的因为耦合度过高所造成的问题了,为此要通过修改代码的方式实现二者的解耦合 这里我们采用最简单的方法解耦合: 将原先的DatabaseClient db改为智能指针类型std::sha ...
使用perf和perl工具进行C++性能分析和生成火焰图
简介安装perf安装perf指令位于linux-tools通用包内,因此要安装适配当前运行内核的包 123apt update -y# 安装 linux-tools 通用包(适配当前运行的内核)apt install -y linux-tools-generic linux-tools-$(uname -r) 获取火焰图生成工具1git clone https://github.com/brendangregg/FlameGraph.git 开始性能分析perf采样perf采样可以有多种方式 运行并采样 123456sudo perf record -F 99 -g ./cmd --sleep 60# 参数说明:# -F 99 : 每秒采样 99 次(平衡精度与开销)# -a : 监控所有 CPU# -g : 记录调用栈(stack trace)# -- sleep : 采样持续时间 采样特定pid的进程 123456789# 获取待采样的进程的pidps aux | grep <进程名># 根据pid采样进程,假设pid为 <P ...
v2.1~V2.2美鹅外卖平台更新内容
v2.1 命令行参数更新1. gflags库引入戳我去gflags的介绍博客 gflags是Google开发的一个开源库,用于C++应用程序中命令行参数的声明、定义和解析。gflags库提供了一种简单的方式来添加、解析和文档化命令行标志(flags),使得程序可以根据不同的运行时配置进行调整。 有了gflags后,我们可以统一地使用命令行参数或者统一的配置文件方便地配置服务端的相关参数 2. 删除JSON配置文件相比于命令行参数的配置文件,JSON文件写起来相对繁琐,且不够灵活,因此删除了JSON文件,全面使用命令行参数替代 3. 在main.cpp中定义命令行参数因为如果要解析命令行参数,就必须使用google::ParseCommandLineFlags(&argc, &argv, true);解析main函数的传参,所以直接把命令行参数的定义写在main.cpp的全局区中 main.cpp 1234567891011121314#include <gflags/gflags.h>DEFINE_string(host,"0.0.0.0&qu ...
C++测试】美鹅外卖v2.3~v2.4版本性能测试
在本版本中,整个服务端的基本功能已经完成,包括稳定性提升和日志标准化输出,因此为了进一步优化服务器的性能,提高其并发性和准确率,我们将使用测试工具Postman、perf、perl和火焰图开源项目进行测试、绘制火焰图和分析性能瓶颈 戳我去Postman介绍博客🔗 戳我去火焰图绘制介绍博客🔗 v2.3第一次测试测试信息 key value 项目版本 v2.3 当前架构 逻辑上应用数据分离架构,物理上单机架构(只有一台云服务器) 服务端信息 阿里云服务器Ubuntu 22.04 , 2核2G,Docker 容器资源分配默认配置 测试端信息 Postman客户端 修改 docker-compose.yml经过初次进入容器尝试使用perf,会发现权限不足,原因是Docker对容器的权限做了限制,即使使用root用户,获得的权限也是受限的,所以我们要修改docker-compose.yml修改容器的启动参数,来获得全部权限。注:获得权限的参数理应只在测试时使用 获得权限的方式就是加上privileged: true参数即可 展示的部分代码如下 123456789 ...
redis-plus-plus适用于C++的Redis API库使用探究
Redis简介Redis是一款开源的内存型键值数据库,支持多种数据结构(字符串、哈希、列表、集合、有序集合等),提供持久化、原子操作及高达10万+/秒的读写性能。主要应用于缓存、消息队列、会话存储、实时排行榜等场景。采用单线程模型保障操作原子性,同时支持主从复制、集群部署和高可用方案。 为了能在程序中调用Redis服务,我们使用redis-plus-plus库编写Redis的C++客户端 redis-plus-plus安装这里仅介绍Ubuntu安装 apt安装12345678910111213sudo apt update# 安装前置依赖(C语言的库sudo apt install -y libhiredis-dev # 安装redis-plus-plus只能源码编译了git clone https://github.com/sewenew/redis-plus-plus.gitcd ./redis-plus-plus/mkdir buildcd ./build/cmake ..make sudo make install
spdlog高速C++日志库使用探究
spdlog介绍spdlog 是一个高性能、超快速、零配置的C++日志库,它旨在提供简洁的API和丰富的功能,同时保持高性能的日志记录。它支持多种输出目标、格式化选项、线程安全以及异步日志记录 为什么用spdlog它有如下优点 高性能:spdlog 专为速度而设计,即使在高负载情况下也能保持良好的性能。 零配置:无需复杂的配置,只需包含头文件即可在项目中使用。 异步日志:支持异步日志记录,减少对主线程的影响。 格式化:支持自定义日志消息的格式化,包括时间戳、线程 ID、日志级别等。 多平台:跨平台兼容,支持 Windows、Linux、macOS 等操作系统。 丰富的 API:提供丰富的日志级别和操作符重载,方便记录各种类型的日志。 spdlog安装前置依赖库安装spdlog依赖fmt库,如果没有,需要提前安装 123sudo apt update -ysudo apt install -y libfmt-dev 同时编译的时候要加上选项 -lfmt apt安装12sudo apt updatesudo apt install -y libspdlog-dev 源码安 ...
gflags命令行参数解析库使用探究
gflags库介绍gflags是Google开发的一个开源库,用于C++应用程序中命令行参数的声明、定义和解析。gflags库提供了一种简单的方式来添加、解析和文档化命令行标志(flags),使得程序可以根据不同的运行时配置进行调整。 为什么用gflags它有如下优点: 易于使用: flags提供了一套简单直观的API来定义和解析命令行标志,使得开发者可以轻松地为应用程序添加新的参数。 自动帮助和文档:gflags可以自动生成每个标志的帮助信息和文档(内容由开发者填充),这有助于用户理解如何使用程序及其参数。 类型安全:gflags支持多种数据类型的标志,包括布尔值、整数、字符串等,并且提供了类型检查和转换。 多平台支持:gflags 可以在多种操作系统上使用,包括Windows、Linux和macOS 可扩展性:gflags允许开发者自定义标志的注册和解析逻辑,提供了强大的扩展性。 官方文档: https://gflags.github.io/gflags/代码仓库: https://github.com/gflags/gflags.git gflags安装目前只介绍Ubunt ...
计算机网络复习题-答案-第一章
来自计算机科学丛书:《计算机网络:自顶向下方法》的每章复习题,我们给出每个题目的文字答案并选择合适的题目配上图解 1.1节 R1 “主机”和“端系统”之间有什么不同?列举几种不同类型的端系统。Web服务器是一种端系统吗? (1)没有区别。在本书中“主机”和“终端系统”是交换使用的。 (2)端系统包括PC、工作站、网络服务器、邮件服务器、智能手机 (3)显然Web服务器是一种端系统 R2 协议一次常被用于外交关系,维基百科是怎样描述外交协议的? 来自维基百科:外交协议常用于描述一系列国家来往规则。这些构建完备和经过时间检验的规则可以使国家和人民生活和工作更简单。协议规则以人民准则为基础,其中的一部分已经作为现在分级的地位声明。 R3 标准对于协议为什么重要? 标准对于协议来说,可以让人们创建可以相互操作的网络系统和产品 1.2节 R4 列出6种接入技术。将它们分类为住宅接入,公司接入或广域无线网接入 通过电话线的拨号调制解调器: 住宅接入 通过电话线的DSL: 住宅或小办公室 混合光纤同轴电缆: 住宅 100M交换以太网: 公司接入 无线网: 住宅接入或公司接入 3 ...
高级IO】④Reactor事件驱动模型探究
Reactor模型是相对与传统的阻塞式I/O模型提出来的,节约线程资源和提升业务处理并发量的IO模型,它主要基于I/O多路复用配合线程池的思想来实现。不过实际上Reactor模式依然是一种同步I/O模型 对比参照-传统阻塞式I/O模型 可以看到当并发规模增大时,这一模型有着显著的性能问题: 线程资源消耗大: 每一个客户端链接都需要唯一的线程维护链接和处理业务,开销迅速上升 线程利用率低: 当出现连接数很高而实时活跃连接数较低时,大部分线程处于阻塞状态,浪费了大部分线程的处理性能。 Reactor模型的提出基于传统阻塞式I/O的两大痛点,Reactor模型使用了两大思想对应解决: I/O多路复用: 多个连接由同一个对象同时监听,当事件就绪时输出所有就绪的链接(在C++中则是文件描述符)。这样维护链接的任务就可以统一交给实现I/O多路复用的对象中,而不用分散给每一个线程。 线程池: 当有任务就绪时,则将其分配给线程池中的线程,而但任务完成后,就将空闲的线程还给线程池,这样可以解决线程利用率低的问题。当然相应地它也引出了动态扩容和负载均 ...
MySQL关键字专题
ER图关系模型->数据表数据模型方法一 实体集 == 表 1->n , 主键->外键 n->m, 新表,主键=(外键1 + 外键2) 1-1 , 选2或3 表名称 属性 person driver_id(PK), address,name car license(PK) , model, year accident report-number(PK), location, date owns owner_driver_id(PK,FK),car_license(PK,FK) participated driver_id(PK,FK),license(PK,FK),report_number(PK,FK),damage_amount 表名称 属性 职员表 职员编号(PK),年龄,性别,从属部门(FK) 部门表 部门编号(PK),部门属性码 项目表 项目编号(PK),项目时间,属性码,主管编号(FK) 项目参与表 职员编号(PK,FK),项目编号(PK,FK) 表名称 ...
C++项目】v2.3美鹅外卖-总集介绍博客
项目介绍为客户提供一个C/S架构的外卖平台,使用Qt框架和cpp-httplib 等模块实现其业务功能。能够服务消费者,商家和管理员的使用需求,目前支持的客户端平台为Windows平台。服务端平台只需支持Docker即可 使用的技术点有: QT界面框架 Json序列化与反序列化 cpp-httplib库 MySQL connector/c++ Docker容器与镜像管理技术 运行环境当前版本v2.3 客户端: windows 11 服务端: 阿里云ECS云服务器 ubuntu 22.04 需求分析用户需求当前目标实现的用户需求有 用户注册、登录 商家添加产品 商家查看和修改产品 商家查看和处理订单 消费者查看和添加购物车 消费者查看和结算订单 消费者优惠等级变化 管理员查看销售日志 角色抽象归纳根据需求的功能点,可以将系统的参与者抽象成两层三类。 用户: 所有具体参与者的总称,更高一级的抽象 商家:提供菜品和处理订单的一类人 消费者:点餐和请求订单的一类人 管理员:有权限查看销售日志的一类人 用例图 功能需求根据用户的需求,我们提出更具体,更偏向实现的功 ...
C++项目】v2.0美鹅外卖平台的服务端实现
重大更新平台迁移服务端的开发环境和部署环境均完成了操作系统平台迁移。从Windows 11转移到了Ubuntu 22.04云服务器上。 第三方库依赖更新 完全抛弃QT框架 新增jsoncpp替代QJson 部署升级 引入Dockerfile完成镜像自动构建 使用docker-compose.yml自动完成服务编排和部署启动,使单机开发测试更简单 服务端详细设计版本信息当前版本: v2.0重大更新 当前服务器使用了如下技术栈: MySQL数据库服务:由MySQL 8.0提供数据持久化服务 MySQL API服务: 由MySQL Connector/C++ 7提供原生API,并在开发中封装成数据库对象及其接口 序列化与反序列化服务: 由jsoncpp库提供对象的序列化与反序列化 HTTP短链接通信服务 : 由开源项目cpp-httplib提供的单头文件库提供简单易用的HTTP服务 当前架构图 服务端层次结构 HTTP请求路径约定客户端与服务端的交互对具体函数的调用,取决于HTTP 请求路径的约定,所以要提前约定好 账户相关 Account API 路径 业务 /acco ...
高级IO】③epoll实现IO多路转接
以epoll相关接口构成的高级IO 不仅是名称上类似,epoll与poll的功能也是类似的,但是按man手册的说法,epoll是为处理大批量句柄而做了改进的poll,它几乎具备了之前所介绍的select和poll构成的高级IO的一切优点,因此它被公认为Linux2.6下性能最好的多路I/O就绪通知方法 认识 epoll 系列接口epoll有3个相关的系统调用 来自头文件<sys/epoll.h> epoll_create该接口用于创建epoll实例,它的返回值我们称为epfd 1int epoll_create(int size); 根据man手册,自Linux 2.6.8之后,参数size将会被忽略,但是必须大于0 epoll_ctlepoll的事件注册函数 1int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); 这一系统用于增、改、查位于epfd对应的epoll实例内的待监听的文件描述符列表 参数描述 epfd: 由先前的epoll_create产生的epfd op: 操作代码,有如 ...
高级IO】②poll实现IO多路转接
以系统提供的函数poll为核心实现多路转接,即高级网络IO 认识 poll 函数123#include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout); 特殊的结构体pollfd 12345struct pollfd { int fd; /* 文件描述符 */ short events; /* 请求事件 */ short revents; /* 应答事件 */}; 功能poll也类似于select函数,能够同时监听多个文件描述符的就绪事件 参数解释 fds是pollfd结构体数组的指针/地址,提供待监听文件描述符的列表。其中结构体中的位图提供了每个文件描述符的各种状态的可能性 nfds表示传入数组的长度 timeout表示poll函数的超时时间,单位是毫秒(ms) 其中events和revents都是位图,可以有如下取值 | 事件 | 描述 ...
为什么写博客-540天总结
前言今天是2025年的情人节,我与我的博客小站已经相互陪伴了540天啦~。人对事物的认识总是阶段性的,所以我决定是时候阶段性地回答当初遗留的问题了—-为什么写博客 我们首先回顾一下我们的博客产出经历了怎样的阶段: 建站之初: 其实一开始我只模糊地知道写博客有很多好处,自己折腾建站也主要是因为觉得有自己的博客网站很酷,于是便折腾出了一个博客网站。 难产时期:我原本并没有写文章的习惯,写博客对我来说是全新的尝试,但是根据我学习各种新东西积累下来的经验,我知道刚开始总是产出很低效率很低的。确实,一开始我写博客的效率并不高,质量也不高。但没关系,我知道,它们作为我起步的垫脚石至关重要 配图时期: 早起的博客我很少配图,因为我一直苦于找不到合适的作图软件。后来我还是下定了决心要给我的文章配上示意图,工具我就选择了我本身有一点点基础的ppt,虽然做的不快,但好在易上手,图示清晰。 系列时期: 此时我读到了一些好书,我觉得可以根据书中的内容出一些系列博客。这些书也着实成为了博客的高质量灵感来源 项目时期: 当学习到可以产出比较有规模的代码时,我的博客技术已经发展到可以自信地输出文字,和高效地利用pp ...
面向对象分析与设计(2)--对象模型
对象模型引入面向对象要素建立在很好的工程基础之上。它的要素统称为“开发对象模型”,或者简称为“对象模型”。拆开来讲,它包含如下原则:抽象 封装 模块化 层次结构 类型 并发 持久 就它们本身来说,没有一个原则是创新的。但重要的是,在对象技术中,它将这些要素以一种相互配合的方式结合起来了。面向对象分析和设计在本质上与传统的结构化设计方法提出了一种不同的方式来解决软件问题。 对象模型的演进了解对象模型是如何诞生和一步步走向成熟的,有利于我们理解现代对象模型是如何工作的。 第一代语言主要用于科学和工程应用,因此以数学表达式为主。但它依然标志着高级程序设计语言向着问题空间靠近了一步,向底层计算机远离了一步 第二代语言中,重点是算法抽象。 第三代语言则是演进到了支持数据抽象 后来发展到面向对象语言的兴盛。 之后出现的许多语言活动,新版本和标准化工作,导致了程序设计框架的出现 程序设计语言的拓扑结构演进对于一门语言的拓扑结构,是指这种语言的基本物理构成单元,以及这些部分是如何连接的。比起其它方面,拓扑着重强调连接是如何组织的 第一代和第二代早期此时用这些语言编写的应用展现出相对 ...
C++项目】美鹅外卖-总集介绍博客
项目介绍为客户提供一个C/S架构的外卖平台,使用Qt框架和cpp-httplib 等模块实现其业务功能。能够服务消费者,商家和管理员的使用需求,目前支持的平台为Windows平台。 使用的技术点有: QT界面框架 QT Json处理模块 cpp-httplib库 MySQL connector/c++ 运行环境当前版本v1.0 客户端: windows 11 服务端: windows 11 需求分析用户需求当前目标实现的用户需求有 用户注册、登录 商家添加产品 商家查看和修改产品 商家查看和处理订单 消费者查看和添加购物车 消费者查看和结算订单 消费者优惠等级变化 管理员查看销售日志 角色抽象归纳根据需求的功能点,可以将系统的参与者抽象成两层三类。 用户: 所有具体参与者的总称,更高一级的抽象 商家:提供菜品和处理订单的一类人 消费者:点餐和请求订单的一类人 管理员:有权限查看销售日志的一类人 用例图 功能需求根据用户的需求,我们提出更具体,更偏向实现的功能需求 阅读提示:点击右侧目录可以跳转 用户注册功能用户可以使用唯一的*账号名和手机号和进行账号注册 ...
avatar
副驾supdriver
动物界 脊索动物门 哺乳纲 灵长目 人科 人属 智人种
我github还蛮大的
公告
主域名:
supdriver.top
网站资讯
文章数目 :
93
已运行时间 :
本站总字数 :
313.6k
本站总访问量 :
最后更新时间 :