【C语言】C语言 文具店商品库存管理系统(源码+数据文件)【独一无二】
👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。
系列文章目录
目录
- 系列文章目录
- 一、设计要求
- 1. 项目名称
- 2. 项目简介
- 1. 系统功能要求
- 二、设计思路
- 1. 总体设计思路
- 2. 数据结构设计
- 3. 模块说明与代码分析
- 3.1 数据合法性校验
- 3.2 数据文件操作模块
- 3.2.1 从文件加载数据
- 3.2.2 保存数据到文件
- 3.3 商品操作模块
- 3.3.1 批量录入初始商品信息
- 3.3.2 浏览全部商品信息
- 3.3.3 查询商品信息
- 3.3.4 添加新商品
- 3.3.5 删除商品信息
- 3.3.6 修改商品信息
- 3.3.7 按类别统计商品数量
- 3.3.8 按单价排序商品
- 3.3.9 计算库存总价值
- 3.4 主菜单及主函数
- 3.4.1 菜单函数
- 3.4.2 主函数
- 三、结果
一、设计要求
1. 项目名称
文具店商品库存管理系统
2. 项目简介
设计并开发一款商品库存管理系统,用于高效管理文具店的商品库存。该系统支持商品的入库、出库操作,并提供库存查询功能,帮助文具零售店优化库存管理、提高运营效率。
文具商品的基本信息包括:
- 商品编号
- 商品名称
- 数据类型:字符数组
- 示例:签字笔、水彩笔、田格本、日记本等(可自行设计)
- 类别
- 包括:笔、本、颜料、其他
- 品牌
- 示例:晨光、得力等(可自行设计)
- 商品单价
- 数据类型:浮点型
- 商品库存
- 数据类型:int
1. 系统功能要求
系统主要功能模块示意见“图1”以及“图2”(图示仅供参考),具体功能如下:
-
批量录入初始商品信息
- 提示用户批量录入初始商品信息,要求录入的商品数量不少于 5 条。
- 商品信息可以通过读取指定文本文件(例如:test.txt,格式参见图3)实现录入。
- 在录入过程中,对商品编号进行查重,同一编号的商品不能重复出现。
- 对于重复数据,应跳过录入并反馈提示信息,如“商品序号 xxx 已存在,跳过此商品”。
- 确保录入后的商品数据完整、有效,并保存于系统中以备后续操作。
-
浏览全部商品信息
- 在屏幕上显示仓库中所有商品的全部信息,要求数据对齐、格式美观。
- 如果当前仓库中没有商品,则显示提示“当前仓库无商品”。
- 显示格式参考图5。
-
查询商品信息
- 用户可根据以下条件查询商品信息:
- 商品编号
- 商品名称
- 品牌
- 类别
- 用户选择查询条件后,系统根据输入内容匹配相应商品信息,并以整齐、格式化的方式显示查询结果(参见图6)。
- 若未找到符合条件的商品,系统应提示“未找到符合条件的商品信息”。
- 用户可根据以下条件查询商品信息:
-
增加商品信息
- 提示用户按照规定的格式输入一条新增的商品信息(参考图7)。
- 系统需对新增商品的商品编号进行查重,若编号已存在,则提示“编号已存在,请重新输入”,直至输入有效。
- 新增的信息必须保证格式正确且数据完整。
-
删除商品信息
- 提示用户输入要删除的商品编号或商品名称。
- 系统显示该商品的全部信息(参照图8),并询问用户是否确认删除。
- 若存在同名商品,系统应提示“找到多条同名商品,将同时删除”,并在用户确认后进行删除操作。
-
修改商品信息
- 提示用户输入需要修改的商品编号,系统根据该编号显示商品的全部信息(参见图9)。
- 系统随后询问用户需要修改哪一项信息(除商品编号外的所有数据项均可修改)。
- 修改完成后,系统应提示“修改成功”。
-
按类别统计商品数量
- 提示用户输入需要统计的商品类别,系统统计该类别商品的数量,并以清晰格式显示结果(参考图10)。
- 若输入类别不存在,则提示“未找到该类别的商品信息”。
-
按单价对商品排序
- 系统根据商品单价对商品进行排序:
- 默认按单价升序显示,同一单价的商品按商品编号升序排序。
- 用户可选择按单价降序排序,同一单价的商品仍按商品编号升序排列。
- 查询结果应以整齐格式展示(参考图11)。
- 系统根据商品单价对商品进行排序:
-
计算当前库存商品的总价值
- 系统计算当前仓库中所有商品的总价值:
- 对每个商品,计算公式为:商品单价 × 库存数量
- 总价值为所有商品个别计算值的累加结果
- 计算结果应清晰显示(参考图12)。
- 若仓库中无商品,系统提示“当前仓库无商品,无法计算总价值”。
- 系统计算当前仓库中所有商品的总价值:
-
退出系统
- 在退出前提示用户是否退出系统,经确认后退出。
二、设计思路
1. 总体设计思路
该系统主要目的是管理文具店的商品库存,通过文件实现数据持久化。系统支持以下主要操作:
-
数据文件操作
程序启动时从文件中加载商品数据,退出时保存所有数据到文件。 -
数据合法性校验
每条商品记录在录入时需进行合法性检查,确保输入数据完整且符合要求。 -
基础数据操作
支持批量录入初始商品、浏览全部商品、查询、添加、删除、修改商品信息。 -
统计与排序功能
根据商品类别统计数量、按照单价排序展示商品、计算库存总价值。 -
菜单式操作
采用文本菜单驱动系统,用户根据提示输入指令,实现对各种操作模块调用。
整个系统基于结构体数组实现数据存储,每个功能模块独立成函数,主函数中先加载数据再进入菜单循环操作,最后退出前保存数据。
2. 数据结构设计
系统使用如下结构体存储商品信息:
#define NAME_LEN 50
#define BRAND_LEN 20
#define CATEGORY_LEN 20typedef struct {int id; // 商品编号char name[NAME_LEN]; // 商品名称char category[CATEGORY_LEN]; // 类别char brand[BRAND_LEN]; // 品牌float price; // 单价int quantity; // 库存数量
} Product;
说明:
- 每个商品由编号、名称、类别、品牌、单价和库存数量构成。
- 全局数组
products[MAX_PRODUCTS]
用于存储所有商品记录,整型变量productCount
表示当前商品数量。
3. 模块说明与代码分析
3.1 数据合法性校验
为了保证录入的数据是符合要求的,定义了函数 validateProduct()
。
// 数据合法性校验函数,判断一个商品记录是否有效
int validateProduct(Product p) {if (p.id <= 0 || strlen(p.name) == 0 || strlen(p.category) == 0 ||strlen(p.brand) == 0 || p.price <= 0 || p.quantity < 0) {return 0; // 不合法}return 1; // 合法
}
思路:
- 检查商品编号是否大于零;
- 检查名称、类别、品牌字符串不为空;
- 保证商品单价大于零、库存数量不为负。
3.2 数据文件操作模块
为确保数据的持久化,提供了加载和保存文件的两个函数。
3.2.1 从文件加载数据
void loadProductsFromFile() {FILE *file = fopen("test.txt", "r");if (file == NULL) {printf("未找到数据文件,已创建新文件。\n");return;}char line[256];while (fgets(line, sizeof(line), file)) {Product newProduct;int fieldsRead = sscanf(line, "%d %s %s %s %f %d", &newProduct.id, newProduct.name,newProduct.category, newProduct.brand, &newProduct.price, &newProduct.quantity);// 检查数据完整性if (fieldsRead != 6 || !validateProduct(newProduct)) {printf("跳过格式错误或无效的数据行:%s", line);continue;}// 检查商品编号是否重复int duplicate = 0;for (int i = 0; i < productCount; i++) {if (products[i].id == newProduct.id) {printf("商品编号 %d 重复,跳过此行:%s", newProduct.id, line);duplicate = 1;break;}}if (!duplicate) {products[productCount++] = newProduct;}}fclose(file);printf("数据加载完成,共加载 %d 条商品记录。\n", productCount);
}
说明:
- 采用
fgets()
逐行读取数据文件; - 使用
sscanf()
分析每行中各个字段的值; - 对数据完整性与合法性进行验证;
- 对重复的商品编号进行检查,跳过重复数据。
3.2.2 保存数据到文件
void saveProductsToFile() {FILE *file = fopen("test.txt", "w");if (file == NULL) {printf("无法保存数据。\n");return;}for (int i = 0; i < productCount; i++) {fprintf(file, "%d %s %s %s %.2f %d\n", products[i].id, products[i].name, products[i].category,products[i].brand, products[i].price, products[i].quantity);}fclose(file);printf("数据保存成功!\n");
}
说明:
- 文件以写模式打开,遍历所有商品记录,用格式化输出写入文件。
3.3 商品操作模块
3.3.1 批量录入初始商品信息
void addInitialProducts() {int count;printf("请输入要录入的商品数量(不少于5):");scanf("%d", &count);if (count < 5) {printf("录入数量不足5条。\n");return;}// 此处略 10行代码 .....int duplicate = 0;for (int j = 0; j < productCount; j++) {if (products[j].id == newProduct.id) {printf("商品编号 %d 已存在,跳过此商品。\n", newProduct.id);duplicate = 1;break;}}if (!duplicate) {products[productCount++] = newProduct;}}
}
说明:
- 要求用户录入不少于 5 条商品信息;
- 逐条录入时先读取各项数据,再进行数据合法性和查重处理;
- 如果数据不合法或编号重复,则循环重新输入。
3.3.2 浏览全部商品信息
void displayAllProducts() {if (productCount == 0) {printf("当前仓库无商品。\n");return;}printf("编号\t名称\t类别\t品牌\t单价\t库存\n");for (int i = 0; i < productCount; i++) {printf("%d\t%s\t%s\t%s\t%.2f\t%d\n", products[i].id, products[i].name,products[i].category, products[i].brand, products[i].price, products[i].quantity);}
}
说明:
- 如果当前商品数量为 0,则提示“当前仓库无商品”;
- 否则以表格形式输出所有商品信息。
3.3.3 查询商品信息
void queryProduct() {int option;printf("请选择查询条件:1.编号 2.名称 3.品牌 4.类别\n");scanf("%d", &option);char queryStr[NAME_LEN];int queryId;int found = 0;// 此处略 10行代码 .....}if (!found) {printf("未找到符合条件的商品信息。\n");}
}
说明:
- 用户可以根据编号、名称、品牌或类别进行查询;
- 根据用户选择,程序分别比较对应字段;
- 如果没有找到任何匹配记录,则提示“未找到符合条件的商品信息”。
3.3.4 添加新商品
void addProduct() {Product newProduct;while (1) {printf("请输入新增商品信息(编号 名称 类别 品牌 单价 库存):\n");scanf("%d %s %s %s %f %d", &newProduct.id, newProduct.name, newProduct.category,newProduct.brand, &newProduct.price, &newProduct.quantity);// 查重// 此处略 10行代码 .....printf("商品添加成功!\n");
}
说明:
- 循环读取输入直到用户输入的商品编号不重复;
- 将新商品直接存入数组中,并更新商品数量。
3.3.5 删除商品信息
void deleteProduct() {int id;printf("请输入要删除的商品编号:");scanf("%d", &id);for (int i = 0; i < productCount; i++) {if (products[i].id == id) {printf("删除商品:编号 %d 名称 %s\n", products[i].id, products[i].name);for (int j = i; j < productCount - 1; j++) {products[j] = products[j + 1];}productCount--;printf("商品删除成功!\n");return;}}printf("未找到指定编号的商品。\n");
}
说明:
- 根据用户输入的商品编号查找对应商品;
- 找到后,将该商品从数组中删除,并后移后续记录,最后减少
productCount
。
3.3.6 修改商品信息
void modifyProduct() {int id;printf("请输入要修改的商品编号:");scanf("%d", &id);for (int i = 0; i < productCount; i++) {// 此处略 10行代码 .....scanf("%d", &option);switch (option) {case 1:printf("请输入新名称:");scanf("%s", products[i].name);break;case 2:printf("请输入新类别:");scanf("%s", products[i].category);break;case 3:printf("请输入新品牌:");scanf("%s", products[i].brand);break;case 4:printf("请输入新单价:");scanf("%f", &products[i].price);break;case 5:printf("请输入新库存:");scanf("%d", &products[i].quantity);break;default:printf("无效选项。\n");}printf("商品信息修改成功!\n");return;}}printf("未找到指定编号的商品。\n");
}
说明:
- 用户输入目标商品编号,程序显示该商品所有信息;
- 用户选择要修改的项(除商品编号外的项),修改后提示“修改成功”。
3.3.7 按类别统计商品数量
void categoryStatistics() {char category[CATEGORY_LEN];printf("请输入要统计的类别:");scanf("%s", category);int count = 0;for (int i = 0; i < productCount; i++) {if (strcmp(products[i].category, category) == 0) {count++;}}if (count > 0) {printf("类别 %s 的商品数量为 %d。\n", category, count);} else {printf("未找到该类别的商品信息。\n");}
}
说明:
- 用户输入需要统计的类别,遍历数组统计该类别的商品数量,最后输出统计结果或错误提示。
3.3.8 按单价排序商品
void sortProducts() {int option;printf("请选择排序方式:1.升序 2.降序\n");scanf("%d", &option);for (int i = 0; i < productCount - 1; i++) {for (int j = 0; j < productCount - i - 1; j++) {// 此处略 10行代码 .....products[j + 1] = temp;}}}printf("排序完成,结果如下:\n");displayAllProducts();
}
说明:
- 用户选择升序或者降序排序;
- 采用冒泡排序算法,根据商品的单价进行排序;
- 排序完成后调用
displayAllProducts()
显示排序结果。
3.3.9 计算库存总价值
void calculateTotalValue() {if (productCount == 0) {printf("当前仓库无商品,无法计算总价值。\n");return;}float totalValue = 0;for (int i = 0; i < productCount; i++) {totalValue += products[i].price * products[i].quantity;}printf("当前库存商品的总价值为:%.2f\n", totalValue);
}
说明:
- 遍历所有商品,将每个商品的单价与库存数量相乘,累加得到总价值;
- 如果没有商品则提示无法计算。
3.4 主菜单及主函数
3.4.1 菜单函数
void menu() {int choice;do {printf("\n************文具店商品库存管理系统************\n");printf("\n--------------------------------------------\n");printf("---------1. 批量录入初始商品信息---------\n");printf("---------2. 浏览全部商品信息---------\n");printf("---------3. 查询商品信息---------\n");printf("---------4. 增加商品信息---------\n");printf("---------5. 删除商品信息---------\n");printf("---------6. 修改商品信息---------\n");printf("---------7. 按类别统计商品数量---------\n");printf("---------8. 按单价排序商品---------\n");printf("---------9. 计算库存总价值---------\n");printf("---------10. 退出---------\n");printf("请选择功能:");scanf("%d", &choice);switch (choice) {case 1: addInitialProducts(); break;case 2: displayAllProducts(); break;case 3: queryProduct(); break;case 4: addProduct(); break;case 5: deleteProduct(); break;case 6: modifyProduct(); break;case 7: categoryStatistics(); break;case 8: sortProducts(); break;case 9: calculateTotalValue(); break;case 10: printf("系统已退出。\n"); break;default: printf("无效选择,请重新输入。\n");}} while (choice != 10);
}
说明:
- 使用 do…while 循环持续显示菜单;
- 根据用户输入的选项调用对应的操作函数;
- 当用户选择退出 (10) 时结束循环。
3.4.2 主函数
int main() {loadProductsFromFile(); // 程序启动时加载文件数据menu(); // 进入主菜单saveProductsToFile(); // 程序退出时保存数据return 0;
}
说明:
- 程序启动时先调用
loadProductsFromFile()
从数据文件加载商品记录; - 进入菜单驱动的操作界面;
- 用户操作结束退出后,再调用
saveProductsToFile()
将最新数据保存至文件中。
通过模块化编程方式将文具店商品库存管理系统各项功能分解为独立函数,在满足业务需求的同时实现以下目标:
- 数据输入、校验与持久化:通过文件读写与数据合法性检查确保数据可靠性;
- 商品管理与查询:提供批量录入、浏览、查询、添加、删除、修改等全方位操作;
- 数据统计与排序:支持按类别统计、按单价排序及计算库存总价值,有助于快速了解库存状况;
- 用户交互:基于简单的文本菜单实现友好的用户操作体验。
三、结果
—
相关文章:

【C语言】C语言 文具店商品库存管理系统(源码+数据文件)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 系列文章目录 目录 系列文章目录一、设计要求1. 项…...

LangChain系列: 使用工具和工具包构建代理实战教程
让我们在LangChain中构建简单代理示例,以帮助我们理解代理的基本概念和构建块。通过保持简单,我们可以更好地掌握这些代理背后的基本思想,使我们能够在未来构建更复杂的代理。 什么是代理 LangChain官方文档有非常好的章节来介绍其代理的高级…...
布隆过滤器(简单介绍)
布隆过滤器(Bloom Filter) 是一种高效的概率型数据结构,用于快速判断一个元素是否可能存在于某个集合中。它的核心特点是空间效率极高,但存在一定的误判率(可能误报存在,但不会漏报)。 核心原理…...
C++ 利器:inline 与 nullptr
探秘 C 利器:inline 与 nullptr 引言 在 C 的浩瀚海洋中,有着许多实用且强大的特性,它们如同夜空中闪烁的繁星,照亮了开发者前行的道路。今天,我们要深入探索其中两颗耀眼的星星:inline 关键字和 nullptr …...
给一个单体项目加装Feign
1.导入pom坐标 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>4.1.2</version> </dependency> 2.主函数注解 EnableFeignClients public cl…...

可以使用Deepseek R1模型的平台集锦
最近Deepseek掀起了AI浪潮,就在今天百度文心一言和ChatGPT宣布要在近期实施免费开放,日渐减少的用户。Deepseek这么火爆,其官网却一直遭受攻击,访问速度很慢。自己本地部署,又负担不起硬件费用,相比之下&am…...

“探索1688平台:高效获取店铺商品信息的实用指南“
在电商领域,获取店铺所有商品信息对于商家进行数据分析、库存管理、竞品分析等方面具有重要意义。1688平台作为中国领先的B2B电商平台,提供了丰富的API接口供开发者使用,其中就包括获取店铺所有商品信息的接口。本文将详细介绍如何使用该接口…...

在fedora41中安装钉钉dingtalk_7.6.25.4122001_amd64
在Fedora-Workstation-Live-x86_64-41-1.4中安装钉钉dingtalk_7.6.25.4122001_amd64.deb 到官网下载钉钉Linux客户端com.alibabainc.dingtalk_7.6.25.4122001_amd64.deb https://page.dingtalk.com/wow/z/dingtalk/simple/ddhomedownload#/ 一、直接使用dpkg命令安装deb包报错…...
数据结构:图论入门
图论起源于欧拉对哥尼斯堡七桥问题的解决. 他构建的图模型将陆地用点来表示, 桥梁则用线表示, 如此一来, 该问题便转化为在图中能否不重复地遍历每条边的问题. 图论的应用 地图着色 在地图着色问题中, 我们用顶点代表国家, 将相邻国家之间用边相连. 这样, 问题就转化为用最少…...

有限状态系统的抽象定义及CEGAR分析解析理论篇
文章目录 一、有限状态系统的抽象定义及相关阐述1、有限状态系统定义2、 有限状态系统间的抽象关系(Abstract)2.1 基于函数的抽象定义2.2 基于等价关系的抽象定义 二、 基于上面的定义出发,提出的思考1. 为什么我们想要/需要进行抽象2. 抽象是…...
Apache Hive用PySpark统计指定表中各字段的空值、空字符串或零值比例
from pyspark.sql import SparkSession from pyspark.sql.functions import col, coalesce, trim, when, lit, sum from pyspark.sql.types import StringType, NumericType# 初始化SparkSession spark SparkSession.builder \.appName("Hive Data Quality Analysis"…...

高校元宇宙实训室解决方案:以技术驱动教育,用数字人链接未来
在AIGC技术的浪潮下,AI数字人正成为数字营销、文化传播等领域的核心工具。为助力高校培养适应未来需求的新型人才,广州虚拟动力推出高校元宇宙实训室解决方案,通过动作捕捉设备与虚拟数字人技术,构建沉浸式教学场景,赋…...

提升编程效率,体验智能编程助手—豆包MarsCode一键Apply功能测评
提升编程效率,体验智能编程助手—豆包MarsCode一键Apply功能测评 🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 目录 引言豆包…...
【前端开发】query参数和params参数的区别
在Web开发中,query参数(URL查询参数)和params参数(路由参数)是两种不同的URL传参方式,它们的核心区别如下: 一、 位置不同 query参数params参数位置URL中?之后,用&连接多个参数…...
推荐系统召回算法
推荐系统召回算法 召回算法UserCFItemCFSwing矩阵分解 召回算法 基于协同过滤的召回算法主要是应用在推荐环节的早期阶段,大致可以分为基于用户、基于物品的。两者各有优劣,优点是具有较好的可解释性,缺点是对于稀疏的交互矩阵,效…...
Python基础(上)
1. 基础语法 1.1 环境安装 Python版本: 推荐使用Python 3.6.6及以上开发工具: PyCharm 1.2 基本语法 输出: print("Hello World") 注释: 单行注释: # 注释内容(快捷键 Ctrl/) 多行注释: 使用三引号 注释内容 注意:不推…...

【DuodooBMS】给PDF附件加“受控”水印的完整Python实现
给PDF附件加“受控”水印的完整Python实现 功能需求 在实际工作中,许多文件需要添加水印以标识其状态,例如“受控”“机密”等。对于PDF文件,添加水印不仅可以增强文件的可识别性,还可以防止未经授权的使用。本代码的功能需求是…...
【虚幻引擎UE】UE4.23到UE5.5的核心功能变化
简单总结从UE4.23到UE5.5,虚幻引擎的重大变化: 1. WebGL/HTML5 平台支持和像素流 UE4.23-UE4.25:移除官方HTML5支持,改为社区插件维护。 但通过第三方插件(如WebAssemblyWebGPU)可在浏览器运行部分项目。U…...

阿里云《AI 剧本生成与动画创作》解决方案技术评测
引言 随着人工智能技术的发展,越来越多的工具和服务被应用于内容创作领域。阿里云推出的《AI 剧本生成与动画创作》解决方案,利用函数计算 FC 构建 Web 服务,结合百炼模型服务和 ComfyUI 工具,实现了从故事剧本撰写、插图设计、声…...
commons-io 包 IOUtils、FileUtils、FilenameUtils
1. IOUtils void IOUtils.closeQuietly(Closeable... closeables) 无条件关闭流。int IOUtils.copy(InputStream inputStream, OutputStream outputStream) 将字节从InputStream复制到OutputStream,返回复制的长度,流最大不能超过2G,默认缓冲…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
Python常用模块:time、os、shutil与flask初探
一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...

STM32 低功耗设计全攻略:PWR 模块原理 + 睡眠 / 停止 / 待机模式实战(串口 + 红外 + RTC 应用全解析)
文章目录 PWRPWR(电源控制模块)核心功能 电源框图上电复位和掉电复位可编程电压监测器低功耗模式模式选择睡眠模式停止模式待机模式 修改主频一、准备工作二、修改主频的核心步骤:宏定义配置三、程序流程:时钟配置函数解析四、注意…...