# FOF框架 **Repository Path**: XNL_TEAM/fof-framework ## Basic Information - **Project Name**: FOF框架 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-04-09 - **Last Updated**: 2022-04-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 使用教程 > 编辑器必须为64位 ## 主项目(exe) ### 1. 开启/关闭服务器 ![image-20220411140241472](ReadMe.assets/image-20220411140241472.png) ## 子项目(dll) ### 1. 创建子项目 > TODO ### 2. 实现一个请求 - 以请求名新建脚本 - 在 `main.v` 脚本中, 添加导出函数 ![image-20220412153711304](ReadMe.assets/image-20220412153711304.png) ### 3. 测试 - 右键项目——属性——修改编译结果类型为 **窗口EXE可执行文件** - 在脚本 `main` 中解除屏蔽测试相关逻辑(**打包时,必须注释掉**) ![image-20220413121905839](ReadMe.assets/image-20220413121905839.png) - 添加测试逻辑 1. 在脚本 `main` 的 `取导出函数` 中添加测试函数 2. 在脚本 `开发测试` 的 `内部_HTTP请求处理` 函数中,添加函数调用 ![image-20220412180508298](ReadMe.assets/image-20220412180508298.png) 3. 在脚本 `开发测试` 右键——设计xxx界面布局——添加测试按钮 ![image-20220412180635297](ReadMe.assets/image-20220412180635297.png) 4. 添加按钮对应请求方法 ![image-20220412180759923](ReadMe.assets/image-20220412180759923.png) 5. 运行项目 ### 4. 打包 - 注释 `main` 脚本中的打开窗口逻辑 ![image-20220413121905839](ReadMe.assets/image-20220413121905839.png) - 右键项目——属性 - 修改编译结果类型为 **DLL动态链接库** - 右键项目——编译发布版本 ## FOF相关教程 ### 1. 取URL中的参数 > 假设请求URL `http://www.baidu.com?search=test` ```c HTTP辅助.取参数 ("search", 用户数据.HTTP_待发整理.解析参数) ``` ### 2. 取Post的Body - PostMan ![image-20220413130925597](ReadMe.assets/image-20220413130925597.png) - 服务器收到的值 ```c UTF8到文本 (用户数据.HTTP_提交数据) => dllName=test&version=123 ``` - 取值方法 ```c HTTP辅助.取参数 ("search", UTF8到文本(用户数据.HTTP_提交数据)) ``` ### 3. 取数据 multipart/form-data 类型数据 - PostMan ![image-20220413130155359](ReadMe.assets/image-20220413130155359.png) - 服务器收到数据 ```c ----------------------------881759781416455691983214 Content-Disposition: form-data; name="dllName" login ----------------------------881759781416455691983214 Content-Disposition: form-data; name="dll"; filename="login.dll" Content-Type: application/x-msdownload 字节集 ``` - 取值方法 ```c dllName = UTF8到文本 (HTTP辅助.取参数_Post文件参数 (用户数据.HTTP_提交数据, "dllName")) dllzjj = HTTP辅助.取参数_Post文件 (用户数据.HTTP_提交数据, "dll") ``` --- # 框架相关 ## 0. 规范 - 框架相关代码开发前,需要用 **思维导图** 整理实现思路,并负该思维导图的维护 > 更新图片时,必须删除历史原来的图片资源(gitee库有大小限制) - 函数需要添加**修改日期**、**修改人**和**修改原因** ![image-20220411135726746](ReadMe.assets/image-20220411135726746.png) - 类下全局的变量 `m_xxx` ![image-20220411124236945](ReadMe.assets/image-20220411124236945.png) - 函数变量:xxx ![image-20220411124308453](ReadMe.assets/image-20220411124308453.png) - 常量类(枚举)`E_xxx ` ![image-20220411124410560](ReadMe.assets/image-20220411124410560.png) - 结构类 `结构_xxx` ![image-20220411124442745](ReadMe.assets/image-20220411124442745.png) ## 1. FOF框架 ![FOF框架思维导图](ReadMe.assets/FOF框架思维导图.png) ## 2. 热更实现 ### 思路 - dll命令规则: `xxx_$version`,version为版本号 - 启动服务器 > 加载 `程序所在目录/DLL` 内的所有DLL,由于同一个dll可能同时存在多个版本,只加载最高版本dll - 加载dll流程 ![【FOF】DLL加载流程](ReadMe.assets/【FOF】DLL加载流程.png) - 函数调用流程 ![【FOF】函数调用流程](ReadMe.assets/【FOF】函数调用流程.png) - 热更dll流程 ![FOF热更流程](ReadMe.assets/FOF热更流程.png) ## 3. Mysql封装 ### 解决问题 1. FOF官方Mysql接口流程复杂,在每一个需要执行sql语句的逻辑里都需要以下流程,并且必须完全执行,如果有人疏忽漏掉释放记录集数据和释放连接,会影响到整个项目服务器,会造成数据不对和数据库连接堵塞等情况 ![image-20220411231931435](ReadMe.assets/image-20220411231931435.png) 2. FOF官方Mysql接口对获取多行数据的支持不好,记录集数据中只存在当前行的数据,需要遍历总数量,然后不断刷新当前的数据来获取记录 ![image-20220411231937387](ReadMe.assets/image-20220411231937387.png) ### 实现思路 1. 将流程封装为统一的方法,对调用方来说,不需要实现FOF mysql流程相关逻辑,只需要专注于业务逻辑 2. 调用方去掉记录集相关操作,统一为json来操作结果 3. 封装的接口对query操作返回为jsoncpp对象或jsoncpp数组对象,对insert、update、delete操作返回逻辑型,对insert_incr操作返回长整型 ### 使用方法 封装了一个`Mysql数据库`类 假设有一个数据表的结构如下 ![image-20220411230710284](ReadMe.assets/image-20220411230710284.png) 1. 连接数据库 - 源码 ![【FOF】DLL加载流程](ReadMe.assets/image-20220411225036948.png) - 使用示例 ![image-20220411225853042](ReadMe.assets/image-20220411225853042.png) 2. 插入数据 - 源码 ![image-20220411230402764](ReadMe.assets/image-20220411230402764.png) - 使用示例 ![image-20220411230621474](ReadMe.assets/image-20220411230621474.png) 3. 自增插入数据 - 源码 ![image-20220411230417197](ReadMe.assets/image-20220411230417197.png) - 使用示例 ![image-20220411230754033](ReadMe.assets/image-20220411230754033.png) 4. 更新数据 - 源码 ![image-20220411230429870](ReadMe.assets/image-20220411230429870.png) - 使用示例 ![image-20220411230800873](ReadMe.assets/image-20220411230800873.png) 5. 删除数据 - 源码 ![image-20220411230441164](ReadMe.assets/image-20220411230441164.png) - 使用示例 ![image-20220411230810114](ReadMe.assets/image-20220411230810114.png) 6. 查询单条数据 - 源码 ![image-20220411230501995](ReadMe.assets/image-20220411230501995.png) - 使用示例 ![image-20220411230823195](ReadMe.assets/image-20220411230823195.png) 7. 查询数据 - 源码 ![image-20220411230515276](ReadMe.assets/image-20220411230515276.png) - 使用示例 ![image-20220411230836515](ReadMe.assets/image-20220411230836515.png) 8. 删除数据表 - 源码 ![image-20220411230539925](ReadMe.assets/image-20220411230539925.png) - 使用示例 ![image-20220411230955281](ReadMe.assets/image-20220411230955281.png) 9. 清空数据表 - 源码 ![image-20220411230549875](ReadMe.assets/image-20220411230549875.png) - 使用示例 ![image-20220411231056690](ReadMe.assets/image-20220411231056690.png) ## JWT ### 使用方法 1. 加密生成 - 源码 ![image-20220413092625055](ReadMe.assets\image-20220413092625055.png) - 使用示例 ![image-20220413092703324](ReadMe.assets\image-20220413092703324.png) 2. 验证token - 源码 ![image-20220413092738552](ReadMe.assets\image-20220413092738552.png) - 使用示例 ![image-20220413092812612](ReadMe.assets\image-20220413092812612.png)