# warehouse_mgmt **Repository Path**: toytw/warehouse_mgmt ## Basic Information - **Project Name**: warehouse_mgmt - **Description**: 项目教学示例 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-03-25 - **Last Updated**: 2025-03-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 仓库管理系统开发 ### 项目框图 ![image-20250325092340921](README.assets/image-20250325092340921.png) ### git中.gitignore文件的配置 `.gitignore` 文件用于指定 Git 版本控制系统应忽略的文件和目录。以下是编写 `.gitignore` 文件的核心规则和语法: --- **一、基础语法** 1. **每行一个规则**:每个规则独占一行。 2. **注释**:以 `#` 开头的行是注释。 ```gitignore # 忽略所有 .log 文件 *.log ``` 3. **忽略文件/目录**:直接写文件名或目录名。 ```gitignore temp.txt # 忽略根目录下的 temp.txt build/ # 忽略所有名为 build 的目录 ``` --- **二、通配符** 1. `*`:匹配任意字符(除了路径分隔符 `/`)。 ```gitignore *.log # 忽略所有 .log 文件 ``` 2. `?`:匹配单个字符。 ```gitignore ???.txt # 忽略所有三个字符的 .txt 文件(如 abc.txt) ``` 3. `[]`:匹配括号内的任意字符。 ```gitignore [Tt]emp # 忽略 Temp 或 temp ``` --- **三、路径规则** 1. **根目录匹配**:以 `/` 开头表示从仓库根目录开始匹配。 ```gitignore /config.yml # 只忽略根目录下的 config.yml ``` 2. **目录匹配**:以 `/` 结尾表示忽略目录。 ```gitignore docs/_build/ # 忽略所有 _build 目录(仅目录,不忽略同名文件) ``` 3. **多级目录**:使用 `**` 匹配任意层级的子目录。 ```gitignore logs/**/*.log # 忽略 logs 目录及其子目录下的所有 .log 文件 ``` --- **四、排除规则(否定)** 1. `!`:强制包含某个文件/目录(必须在忽略规则之后)。 ```gitignore *.log # 忽略所有 .log 文件 !important.log # 但包含 important.log ``` --- **五、优先级规则** 1. **就近原则**:子目录中的 `.gitignore` 优先级高于父目录。 2. **规则顺序**:后面的规则可能覆盖前面的规则。 --- **六、常见示例** ```gitignore # 忽略所有编译产物 *.class *.exe *.dll *.o # 忽略依赖目录 node_modules/ vendor/ # 忽略系统文件 .DS_Store Thumbs.db # 忽略 IDE 配置文件 .idea/ .vscode/ # 忽略日志文件 *.log logs/ # 忽略特定文件 .env # 环境变量文件 secrets.yml # 敏感配置文件 # 排除某个子目录中的文件(否定规则) !src/main/resources/config.yml ``` --- **七、注意事项** 1. **已跟踪文件**:如果文件已被 Git 跟踪,添加到 `.gitignore` 后仍需手动删除缓存: ```bash git rm --cached ``` 2. **全局忽略**:可配置全局忽略规则(对所有仓库生效): ```bash git config --global core.excludesfile ~/.gitignore_global ``` 3. **转义字符**:对特殊字符(如 `#`, `!`, `*`)需要转义,例如 `\#file`。 ### 标准IO函数 FILE *fopen(const char *pathname, const char *mode); ``` 功能:打开一个文件流 pathname:文件名 mode:文件打开权限, b 二进制打开, r 只读打开, w,只写打开(不存在创建) a,追加(不存在创建) 在r+,w+,a+后面添加 + 表示读写 返回值:成功返回文件流指针 失败返回NULL ``` int fclose(FILE *stream); ``` 功能:关闭文件流 stream:文件流指针 ``` size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); 功能:读取文件内容 ptr:缓冲区指针(指向一块有效内存) size:读多少字节 nmemb:读多少块 stream:文件流指针 返回值:成功返回读到的nmemb 失败返回-1 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); ``` 功能:文件写入内容 ptr:缓冲区指针(指向即将写入的数据) size:写多少字节 nmemb:写多少块 stream:文件流指针 返回值:成功返回写入的nmemb 失败返回-1 ``` ### 获取环境变量 char *getenv(const char *name); ``` 功能:获取ubuntu下已定义环境变量 name:环境变量的名字 返回值:成功返回环境变量的值 失败返回NULL ``` --- ### ANSI 转义代码总结 ANSI 转义序列以 `\033[` 开头,`m` 结尾,用于控制文本样式、颜色和背景。 #### 1. **文本效果** | 代码 | 效果 | | --------- | --------------------- | | `\033[0m` | 重置所有样式 | | `\033[1m` | **加粗** | | `\033[2m` | 弱化(褪色) | | `\033[3m` | *斜体* | | `\033[4m` | 下划线 | | `\033[5m` | 闪烁 | | `\033[7m` | 反显(背景/前景交换) | | `\033[8m` | 隐藏 | | `\033[9m` | 删除线 | --- #### 2. **标准颜色(8色)** | 代码 | 类型 | 颜色 | | ---------- | ------ | ---- | | `\033[30m` | 前景色 | 黑色 | | `\033[31m` | 前景色 | 红色 | | `\033[32m` | 前景色 | 绿色 | | `\033[33m` | 前景色 | 黄色 | | `\033[34m` | 前景色 | 蓝色 | | `\033[35m` | 前景色 | 品红 | | `\033[36m` | 前景色 | 青色 | | `\033[37m` | 前景色 | 白色 | | `\033[40m` | 背景色 | 黑色 | | `\033[41m` | 背景色 | 红色 | | `\033[42m` | 背景色 | 绿色 | | `\033[43m` | 背景色 | 黄色 | | `\033[44m` | 背景色 | 蓝色 | | `\033[45m` | 背景色 | 品红 | | `\033[46m` | 背景色 | 青色 | | `\033[47m` | 背景色 | 白色 | --- #### 3. **高亮颜色(16色)** | 代码 | 类型 | 颜色 | | ----------- | ------ | ------ | | `\033[90m` | 前景色 | 亮黑色 | | `\033[91m` | 前景色 | 亮红色 | | `\033[92m` | 前景色 | 亮绿色 | | `\033[93m` | 前景色 | 亮黄色 | | `\033[94m` | 前景色 | 亮蓝色 | | `\033[95m` | 前景色 | 亮品红 | | `\033[96m` | 前景色 | 亮青色 | | `\033[97m` | 前景色 | 亮白色 | | `\033[100m` | 背景色 | 亮黑色 | | `\033[101m` | 背景色 | 亮红色 | | `\033[102m` | 背景色 | 亮绿色 | | `\033[103m` | 背景色 | 亮黄色 | | `\033[104m` | 背景色 | 亮蓝色 | | `\033[105m` | 背景色 | 亮品红 | | `\033[106m` | 背景色 | 亮青色 | | `\033[107m` | 背景色 | 亮白色 | --- #### 4. **256色模式** - **前景色**:`\033[38;5;m`(`` 为 0-255 的颜色编号) - **背景色**:`\033[48;5;m` --- #### 5. **RGB真彩色** - **前景色**:`\033[38;2;;;m` - **背景色**:`\033[48;2;;;m` (``, ``, `` 为 0-255 的RGB值) --- 输出效果表格的C代码示例 ```c #include int main() { printf("代码示例\t\t效果\n"); printf("----------------------------------------\n"); // 文本效果 printf("\\033[1m\t\t\033[1m加粗文本\033[0m\n"); printf("\\033[4m\t\t\033[4m下划线\033[0m\n"); printf("\\033[5m\t\t\033[5m闪烁\033[0m\n"); // 前景色 printf("\\033[31m\t\t\033[31m红色文本\033[0m\n"); printf("\\033[92m\t\t\033[92m亮绿色文本\033[0m\n"); // 背景色 printf("\\033[44m\t\t\033[44m蓝色背景\033[0m\n"); printf("\\033[103m\t\t\033[103m亮黄色背景\033[0m\n"); // 256色 printf("\\033[38;5;208m\t\033[38;5;208m橙色文本\033[0m\n"); // RGB真彩色 printf("\\033[38;2;255;0;128m\t\033[38;2;255;0;128m粉色文本\033[0m\n"); return 0; } ``` --- 输出结果示例: ``` 代码示例 效果 ---------------------------------------- \033[1m 加粗文本 \033[4m 下划线 \033[5m 闪烁 \033[31m 红色文本 \033[92m 亮绿色文本 \033[44m 蓝色背景 \033[103m 亮黄色背景 \033[38;5;208m 橙色文本 \033[38;2;255;0;128m 粉色文本 ``` **注意**:ANSI 转义代码的兼容性因终端而异,部分效果(如斜体、真彩色)可能不被所有终端支持。 ### 动态库操作函数API | 函数原型 | 功能描述 | 参数说明 | 返回值/错误处理 | | :--------------------------------------------------: | :----------------------------------------: | :----------------------------------------------------------: | :----------------------------------------------------------: | | **`void* dlopen(const char* filename, int flag);`** | 加载动态库(`.so` 文件)到内存中 | - `filename`: 动态库路径(若为 `NULL`,返回主程序句柄) - `flag`: 加载模式(如 `RTLD_LAZY`) | 成功返回动态库句柄(`void*`),失败返回 `NULL`,错误信息通过 `dlerror()` 获取 | | **`int dlclose(void* handle);`** | 卸载已加载的动态库,释放资源 | `handle`: `dlopen` 返回的句柄 | 成功返回 `0`,失败返回非零值,错误信息通过 `dlerror()` 获取 | | **`void* dlsym(void* handle, const char* symbol);`** | 从动态库中查找符号(函数或全局变量)的地址 | - `handle`: 动态库句柄 - `symbol`: 符号名称(函数/变量名) | 成功返回符号地址(`void*`),失败返回 `NULL`,错误信息通过 `dlerror()` 获取 | | **`char* dlerror(void);`** | 获取最近一次动态库操作的错误信息 | 无参数 | 返回错误描述字符串(无错误时返回 `NULL`) | ------ **关键参数说明** **`dlopen` 的 `flag` 模式**: - **`RTLD_LAZY`**: 延迟绑定(运行时解析符号,默认推荐)。 - **`RTLD_NOW`**: 立即解析所有符号(加载时检查符号是否存在)。 - **`RTLD_GLOBAL`**: 允许后续动态库使用当前库的符号。 - **`RTLD_LOCAL`**: 符号仅对当前动态库可见(默认)。 ### **INI 文件语法精简笔记** --- #### **1. 核心结构** | 元素 | 语法 | 示例 | | ---------- | --------------- | -------------- | | **节** | `[SectionName]` | `[Database]` | | **键值对** | `Key = Value` | `port = 3306` | | **注释** | `#` 或 `;` 开头 | `# 服务器配置` | --- #### **2. 语法规则** - **键值对** - 等号 `=` 分隔键和值(支持空格) - 值可包裹引号:`name = "John Doe"` - 支持整数和字符串(需程序自行转换类型) - **注释** - 整行注释:`# 日志设置` - 行尾注释:`timeout = 30 # 单位:秒` - **节** - 作用域:后续键值对属于该节,直到新节出现 - 无默认节:未声明节的键值对可能被忽略 --- #### **3. 通用约定** | 规则 | 说明 | | ---------------- | ------------------------------ | | **大小写不敏感** | 多数解析器统一转为小写处理 | | **空格自动忽略** | `key=value` 等同 `key = value` | | **禁止重复键** | 同一节内重复键可能覆盖前值 | | **无数据类型** | 所有值均为字符串 | --- #### **4. 示例文件** ```ini [Network] host = "127.0.0.1" ; 服务器地址 port = 8080 # 监听端口 [Log] level = 2 # 0=Debug,1=Info,2=Warn max_size = "10MB" # 日志文件上限 ``` --- #### **5. 常见限制** - ❌ 不支持嵌套节 - ❌ 不支持多行值(需程序拼接) - ❌ 无标准布尔值(通常用 `0/1` 或 `true/false`) _注:具体实现可能因解析库不同有细微差异,建议统一编码(UTF-8)。_ ### 解释项目分支 需要完整的项目的代码,从gitee克隆下来 hettp协议 git clone https://gitee.com/toytw/warehouse_mgmt.git ssh协议 git clone git@gitee.com:toytw/warehouse_mgmt.git #### master ​ 实现到基本的代码,未对颜色模块进行使用 #### b1 ​ 把颜色模块使用到仓库管理系统中 #### b2 ​ 讲解动态库插件实现 #### b3 ​ 程序配置文件的概念,INI配置文件规则以及解析