240717班级,工业化控制系统,煤矿相关行业,昆仑系统
wumu
2024-10-30 362402c3e828b4b2b1e9296b3aa15e8a513f8de2
1030
1个文件已修改
2个文件已添加
390 ■■■■■ 已修改文件
参考文档/日志模板/日志模板_名字_日期.doc 补丁 | 查看 | 原始文档 | blame | 历史
参考规则_1030.txt 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
文档分析1028.cpp 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
²Î¿¼Îĵµ/ÈÕ־ģ°å/ÈÕ־ģ°å_Ãû×Ö_ÈÕÆÚ.doc
Binary files differ
²Î¿¼¹æÔò_1030.txt
New file
@@ -0,0 +1,155 @@
=====================================
        ç»“构体的规则:
    åˆ†æˆä¸¤éƒ¨åˆ†ï¼š
        æ•°æ®å¤´ï¼š
            int type; ç”¨æ¥åŒºåˆ†ä¸åŒçš„功能
            int len; ç”¨æ¥è¡¨ç¤ºå°åŒ…的总长度,解决粘包问题
        æ•°æ®ä½“:
            å…·ä½“的功能字段
            å¦‚登录:
                char user_name[32];
                char password[32];
        ----------------------
    å‘½åè§„则:
        ç»“构体一般是成对出现:有请求,有响应
        xxReq       // Request
        xxRes       // Response
        ---------------------
    åˆå§‹åŒ–规则:
        é»˜è®¤ç»™ä¸€ä¸ªæ— å‚构造函数
        xx(){
            // å¯¹æ•°æ®å¤´è¿›è¡Œåˆå§‹åŒ–
        }
    -------------------------
    ç»™type统一起来,使用枚举来统一赋值
    enum TypeInfo{
        LOGIN_REQ, // ç™»å½•请求
        LOGIN_RES, // ç™»å½•响应
    };
    -------------------------
    å¿…须把所有的结构体以及枚举等,都放到同一个头文件中
    å¹¶ä¸”前后端都使用同一个头文件
    common.h
    -----------------------
    æå‡æ‰©å±•性:
    æŠŠæ•°æ®å¤´éƒ¨åˆ†ï¼Œå•独拎出来
    struct Head
    {
        int type;
        int len;
    };
    -----使用
    å¦‚:登录请求
    struct LoginReq
    {
        Head head;
        char user_name[32];
        char password[32];
        LoginReq(){
            head.type = LOGIN_REQ;
            head.len = sizeof(LoginReq);
        }
    };
    ç™»å½•响应:
    struct Permission
    {
        int admin;
        int log_search;
        int history;
        int map_change;
        int version_manage;
        int warning;
        int device_manage;
        int pro_plan;
        //char role_name[32]; // è§’色名
        int role_id; // è§’色id
    };
    struct LoginRes
    {
        Head head;
        char user_name[32];
        int status; // ç™»å½•状态
        // æˆåŠŸæ—¶ï¼Œè¯¥è´¦å·å¯¹åº”çš„æƒé™ç»„åˆ
        Permission per;
        LoginRes()
        {
            head.type = LOGIN_RES;
            head.len = sizeof(LoginRes);
        };
    };
    ----------------------
    ç‰¹æ®Šè¦æ±‚:
        å¯ä»¥ä½¿ç”¨json的格式,
        ä¹Ÿå¯ä»¥ä½¿ç”¨xml的格式,
        ç”šè‡³ç›´æŽ¥ä½¿ç”¨ç‰¹å®šå­—符串等
    å‰ææ¡ä»¶ï¼šæœ‰ç‰¹æ®Šè¦æ±‚的协议,提前跟网络/协议敲定;
    ---------------------
    ============================================================
        æ•°æ®åº“表的一些规则:
        è¡¨å: ä¸šåŠ¡å_info  ã€è€ƒè™‘合并,提炼出表达意思到位的名字】
            å¦‚:登录、注册、权限管理共用相同的2张表
                ç”¨æˆ·ä¿¡æ¯è¡¨  user_info
                è§’色权限表  role_info
        æ¯ä¸€ä¸ªè¡¨çš„第一个字段[第一列]:
            æ˜¯ id,int,主键,自增(从1开始)
        ----------------
        å†™sql语句时,尽量一条语句完成操作
        ã€æ„æ€ä½ è¦å†™é«˜çº§è¯­å¥ã€‘
        ----------------
        æ•°æ®åº“负责人:多个功能,用到同一张表了,要把所有字段合并
            å¹¶ä¸”去重[相同意思的保留一个字段]
        ----------------
    ================================================
    å˜é‡åå‘½åè§„则:
        æ™®é€šæˆå‘˜å˜é‡ï¼šç±»åž‹ m_变量名;  // åŠ å‰ç¼€
        é™æ€æˆå‘˜å˜é‡ï¼šç±»åž‹ s_变量名; // sm_变量名
        å±€éƒ¨å˜é‡ï¼šç±»åž‹ å˜é‡å; // ä¸è¦å‰ç¼€
    ================================================
    æ¨¡å—名命名规则:禁止使用工程创建默认的名字
        ä¸šåŠ¡å
        å¦‚登录:C端:
                ç±»åï¼š LoginMainWindow
                     æˆ–者 LoginBusiness
    ================================================
Îĵµ·ÖÎö1028.cpp
New file
@@ -0,0 +1,235 @@
[MySQL]
数据库封装:[子服务]
    1、写一个类:[设计模式:单例]
        å¢žåˆ æ”¹æŸ¥æŽ¥å£[公有]
        è¿žæŽ¥ã€é‡Šæ”¾çš„æŽ¥å£[私有]
    2、考虑性能--SQL连接池[ç±»]--[原理和线程池类似]--复用sql连接
        -- èµ·åˆ°æå‡æ€§èƒ½çš„作用
        è¿žæŽ¥æ•°é‡ï¼šæœ€å¤§ã€æœ€å°
        æ³¢åŠ¨ç®—æ³•ï¼šæœ€å°--最大--最小
建库--一个库
    å»ºè¡¨--:所有用到数据库的表,都给你汇总到一起
    --合并类似或者相同的表的字段
备份导出--shell脚本自动定时导出
安全防注入校验:参数化、正则匹配等
    ä½“现:写一个接口,给所有执行数据库sql语句的地方进行校验
===================================================
        ç‰ˆæœ¬ç®¡ç†--自动更新(版本)
        ç®¡ç†ï¼šå±žäºŽæœåŠ¡ç«¯çš„åŠŸèƒ½
        è‡ªåŠ¨æ›´æ–°ï¼šå±žäºŽå®¢æˆ·ç«¯çš„åŠŸèƒ½
        ----------------
        æ–¹å¼ï¼šå¢žé‡æ›´æ–°ã€å…¨é‡æ›´æ–°
        ----------------
        ç®¡ç†ï¼šä¹Ÿéœ€è¦ä¸€ä¸ªUI--方便提交更新的文件[可执行文件、库文件、配置文件等]
              æäº¤æ–‡ä»¶--文件写到磁盘--相关信息记录到数据库
              æ–‡ä»¶ä¸Šä¼ 
              æ‰§è¡Œæ•°æ®åº“插入语句
             ----------------------
             æ–‡ä»¶ä¿¡æ¯ï¼šæ–‡ä»¶åã€å¤§å°ã€ç›®å½•[写到服务端的目录、客户端真正的相对目录]、文件MD5值[校验文件完整性]
             ç‰ˆæœ¬ä¿¡æ¯ï¼šå½“前版本号[新版本]、依赖版本[老版本]
             é¢å¤–信息:更新时间、更新描述等
        ----------------
        ç»“构体:要用到不定长数组--文件内容是变化的、长度不确定
        ---------------
        ===================================================
        æ—¥å¿—相关
        1、数据输出:日志文件、日志数据表
        2、类:日志的类--按级别做一个调用
               åŒä¸€ä¸ªæŽ¥å£--使用函数宏--分级别去使用--最终使用:只需要传 æ—¥å¿—描述[字符串]
               å…¶ä»–的参数,使用宏来取代
               ------------------
        3、文件变大--要翻滚--解决超大文件不能直接打开的问题
            ç¿»æ»šç®—法:时间戳 æˆ–者 id
        4、定时备份导出:shell脚本自动定时导出
        5、性能:都写到同一个文件的情况下,是异步写入还是同步写入?
            å‡†å¤‡ä¸€ä¸ªé˜Ÿåˆ—,把所有的写入操作变成一个写入任务,进入队列之后,排队写入
            --使用异步的方式,给业务节约了等待时间
        -------------------------------
        ===============================================
        é…ç½®ç®¡ç†--以配置文件的形式来存储配置的内容--xml文件
        æœåŠ¡ç«¯æœ‰å•¥ï¼šç½‘ç»œé€šä¿¡ã€æ•°æ®åº“ã€æ—¥å¿—ã€ç‰ˆæœ¬ç®¡ç†ã€é…ç½®ç®¡ç†ç­‰
        --------------------内容
        ç½‘络通信:ip、port、心跳保活时长:间隔时长、轮次、是否启用心跳检测
        æ•°æ®åº“:host、port、数据库名、用户名、密码
        æ—¥å¿—:文件存储路径、文件大小
        ç‰ˆæœ¬ç®¡ç†ï¼šå­˜æ”¾ç‰ˆæœ¬æ–‡ä»¶çš„æ ¹ç›®å½•
        é…ç½®ç®¡ç†ï¼šå†·å¯åŠ¨ã€çƒ­å¯åŠ¨
        --------------------
        ä½¿ç”¨xml的库:tinyxml2   ï¼š tinyxml2.h   tinyxml2.cpp
            å¯¹xml文件解析,如存为 config.xml ï¼Œè§£æžé‡Œé¢åŒ…含的字段就行
        --------------------
        <?xml version="1.0" encoding="utf-8"?>
        <socket ip="0.0.0.0" port="16888" heartCheck="true" heartTimes="6" heartSleep="5000">  </socket>
        <MySQL>  </MySQL>
        <log>
            <path>./log</path>
            <size>100M</size>
        </log>
        <version>  </version>
        <config>  </config>
        ------------------ ä¸»è¦æ˜¯è¯»å–里面的数据
        æä¾›å†…容:全局提供对象,懒汉模式取,饿汉模式赋值
        ------------------
        ä½¿ç”¨æ—¶æœºï¼š
            1、懒汉模式,随时获取
            2、饿汉模式,需要在主函数第一行就开始跑起来
        ------------------
        è¦èµ·ä¸€æ¡çº¿ç¨‹ï¼Œæ¥è´Ÿè´£ç›‘控 config.xml文件有没有被修改,发现修改,需要更新修改的内容
        æ›´æ–°æ“ä½œï¼š1、非网络相关的子服务,可以直接热启动
                  2、网络相关的子服务,就得冷启动[重启整个exe]
        å†·å¯åŠ¨çš„æ“ä½œï¼Œå¯èƒ½éœ€è¦å®ˆæŠ¤è¿›ç¨‹æ¥ç®¡ç†
        ----------------------
        ==========================================
        socket
        1、TCP åè®®
        2、通信类[S端]、客户端只需要收包、解包
        3、性能:多线程-->线程池
            [IO复用] select、poll、epoll æ¨¡åž‹[3个里面的一个]
        4、业务基类--统一定好所有业务的接口
        -------------
        å…¶ä»–:粘包处理、心跳检测等
        ------------------
        è‡ªå®šä¹‰åè®®ï¼šè¦å¯¹ç»“构体--提炼--且统一功能type--用枚举来统一
        ------------------
        ==================================
        åè®®é€‚配:
            ç»Ÿä¸€æ•°æ®--底层协议不同
            json格式--支持不同语言的开发:web[html]\C++
            è‡ªå®šä¹‰ç»“构体格式  C/C++
            -------------------
            2个地方可以适配:
            ä¸åŒæ•°æ®æ ¼å¼çš„适配--应用层的协议
            ä¸åŒåè®®ï¼šæ›´åº•层的:tcp、udp、rs485等
            -------------------
        ä½¿ç”¨ç‰¹å®šçš„æ ‡å¿—来标识响应的协议
        =========================================
        å®¢æˆ·ç«¯ï¼š
        ------------------
        æ—¥å¿—查询:
            æŸ¥è¯¢log记录[数据库中的日志表]--展示到前端界面--分析
            ----------
            æŸ¥è¯¢æ¡ä»¶ï¼š
                çº§åˆ«ã€å…³é”®å­—、时间段等
                ä¸åŒæ¡ä»¶æŸ¥åˆ°å†…容不一样--柔性数组来表示
                    LogInfo ç»“构体 ï¼ŒåŒ…含了log表所有字段
                    ç”¨æ•°ç»„表示N行
            æ˜¾ç¤ºç»“果:
                æ˜¾ç¤ºçš„æ—¶å€™ï¼Œè¦è€ƒè™‘量级的问题
                å°±å¾—使用分页算法来处理,分页显示
                ----
                æœåŠ¡ç«¯ï¼šé»˜è®¤è¿”å›žç¬¬ä¸€é¡µçš„å†…å®¹,每页条数可以设定,默认100条
                        ä¹Ÿå¯ä»¥æŒ‡å®šé¡µç èŽ·å–æ•°æ®ï¼Œè¿”å›ž
                å®¢æˆ·ç«¯ï¼šä½¿ç”¨åˆ†é¡µæœºåˆ¶ï¼Œåªæ˜¾ç¤ºç‰¹å®šçš„分页数据,想看更多数据
                        ç‚¹ç›¸åº”的页面按钮就可以查看
        ---------------------------------
        ç‰ˆæœ¬æ›´æ–°
            åŸºäºŽç‰ˆæœ¬ç®¡ç†æä¾›çš„版本信息,来进行更新
            æ–¹å¼ï¼šæ‰‹åŠ¨æ›´æ–°ã€è‡ªåŠ¨æ›´æ–°
            æ›´æ–°é€‰æ‹©ï¼šå¢žé‡æ›´æ–°ã€å…¨é‡æ›´æ–°
                çœ‹æ€»å¤§å°çš„区别,选择小的
            æ“ä½œï¼šä¸»è¦æ˜¯ä¸‹è½½æœ€æ–°ç‰ˆçš„内容,到客户端来,进行覆盖或者新增
            æ›´æ–°ç¨‹åºï¼šupdate.exe æ¥å¯¹ä¸»ç¨‹åºè¿›è¡Œæ›´æ–°
            é€»è¾‘:update.exe å¯åŠ¨éœ€è¦ä¸»ç¨‹åºæ¥å¯åŠ¨ï¼Œå‘çŽ°æ–°ç‰ˆäº†æ‰å¯åŠ¨
                å¯åŠ¨ä¹‹åŽï¼Œupdate.exe进行版本的下载,覆盖等,完成之后,
                å†æŠŠä¸»ç¨‹åºå¯åЍ
            å°é€»è¾‘:
                å¢žé‡æ›´æ–°ï¼š
                    å½“前版本号--下一个版本--变化的文件--逐个下载,覆盖
                    --更新版本号--在把当前版本往下递归
                    --直到更新到最新版--再启动主程序
                å…¨é‡æ›´æ–°ï¼šä¸‹è½½æœ€æ–°ç‰ˆçš„安装包--安装--启动
            å½“前版本号:本地得有一个版本号的记录文件,可以是txt、xml、ini等方式
        =================================
        åœ°å›¾æ ‡æ³¨
            ç™¾åº¦åœ°å›¾--API--HTML-JS
            JS--Qt交互:webChannel.js
            ---------------------
        ====================================
        ç³»ç»Ÿè®¾ç½®ï¼š
            å®¢æˆ·ç«¯çš„界面相关:外观--风格、字体
            ç¿»è¯‘:中文、英文等
            å¿«æ·é”®ï¼šåŠŸèƒ½å’Œå¿«æ·é”®ç»‘å®š
        =====================================
            æ³¨å†Œï¼šé»˜è®¤æ˜¯æœ€å°æƒé™çš„用户
            ç™»å½•:成功--根据不同的权限来显示不同的字界面
            ---------
            è¾“入校验:
                éžæ³•字符、长度
            --------------
            å®‰å…¨ï¼šå¯†ç åР坆--解密的处理
            --------------------------------
            =======================
            è­¦æŠ¥æç¤º
                è¦ç»™æ‰€æœ‰åœ¨çº¿çš„用户-发送警报提示
            =========================
            æƒé™ç®¡ç†
                å…ˆæŸ¥è¯¢--支持模糊匹配--再显示--用表格--右键菜单--修改权限
            ------------------------