unknown
2025-07-02 1cfdd3d7c8d81eb07283c60afa2f84603ba5e3b3
Merge branch 'master' of ssh://115.28.86.8:29418/~admin/智能网联_25-0305_617_v1
14 文件已复制
1 文件已重命名
27个文件已添加
3个文件已修改
6个文件已删除
828 ■■■■ 已修改文件
Client/于文龙/log/日志-于文龙-250627.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/寇百盛/log/日志_寇百盛_0627.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/寇百盛/log/日志_寇百盛_0629.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/师浩/log/日志_师浩_250629.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/徐蔓云/log/日志_徐蔓云_0627.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/徐蔓云/log/日志_徐蔓云_0628.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/杨高权/log/日志_杨高权_250627.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/杨高权/log/日志_杨高权_250629.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/杨高权/log/日志_杨高权_250701.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/牛彦江/log/日志_牛彦江_250627.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/牛彦江/log/日志_牛彦江_250701.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/王国壮/code/untitled1.7z 补丁 | 查看 | 原始文档 | blame | 历史
Client/王国壮/document/实时环境信息展示.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
Client/王国壮/log/~$_王国壮_0625.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/王国壮/log/日志_王国壮_0627.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/王国壮/log/日志_王国壮_0629.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/舒海林/log/~$_舒海林_0629.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/舒海林/log/日志_舒海林_0702.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/陈豪/log/日志_陈豪_250627.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/陈豪/log/日志_陈豪_250702.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/魏强/code/LogExportModule_PageSizeFinal.zip 补丁 | 查看 | 原始文档 | blame | 历史
Client/魏强/code/LogExportModule_PageSizeFinal_changeOK.rar 补丁 | 查看 | 原始文档 | blame | 历史
Client/魏强/code/log_table.sql 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/魏强/document/log_table_structure.docx 补丁 | 查看 | 原始文档 | blame | 历史
Client/魏强/document/日志需求分析文档.docx 补丁 | 查看 | 原始文档 | blame | 历史
Client/魏强/log/~$_魏强_0626.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/魏强/log/日志_魏强_0627.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/魏强/log/日志_魏强_0629.doc 补丁 | 查看 | 原始文档 | blame | 历史
Client/魏强/log/日志_魏强_0630.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/common_type.h 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Server/刘斌/log/日志_刘斌_20250626.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/刘斌/log/日志_刘斌_20250628.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/徐逸凡/log/日志_徐逸凡_250628.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/徐逸凡/log/日志_徐逸凡_250701.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/林余杰/log/日志_林余杰_20250626.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/梁博/code/server_config.zip 补丁 | 查看 | 原始文档 | blame | 历史
Server/梁博/log/~$_梁博_0624.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/梁博/log/日志_梁博_0626.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/梁博/log/日志_梁博_0627.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/梁博/log/日志_梁博_0629.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/梁博/log/日志_梁博_0701 .doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/段延冲/log/日志_段延冲_0626.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/段延冲/log/日志_段延冲_0701.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/汪卫军/code/ImageStorage.cpp 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Server/汪卫军/code/ImageStorage.h 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Server/汪卫军/code/图像处理.rar 补丁 | 查看 | 原始文档 | blame | 历史
Server/汪卫军/log/日志_汪卫军_0626.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/汪卫军/log/日志_汪卫军_0629.doc 补丁 | 查看 | 原始文档 | blame | 历史
Server/汪卫军/log/日志_汪卫军_0702.doc 补丁 | 查看 | 原始文档 | blame | 历史
~$蚂蚁智能网联项目分工表.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
功能模块_介绍.txt 630 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Client/ÓÚÎÄÁú/log/ÈÕÖ¾-ÓÚÎÄÁú-250627.doc
Binary files differ
Client/¿Ü°ÙÊ¢/log/ÈÕÖ¾_¿Ü°ÙÊ¢_0627.doc
Binary files differ
Client/¿Ü°ÙÊ¢/log/ÈÕÖ¾_¿Ü°ÙÊ¢_0629.doc
Binary files differ
Client/ʦºÆ/log/ÈÕÖ¾_ʦºÆ_250629.doc
Binary files differ
Client/ÐìÂûÔÆ/log/ÈÕÖ¾_ÐìÂûÔÆ_0627.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Client/\345\276\220\350\224\223\344\272\221/log/\346\227\245\345\277\227_\345\276\220\350\224\223\344\272\221_0627.doc" Binary files differ
Client/ÐìÂûÔÆ/log/ÈÕÖ¾_ÐìÂûÔÆ_0628.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Client/\345\276\220\350\224\223\344\272\221/log/\346\227\245\345\277\227_\345\276\220\350\224\223\344\272\221_0628.doc" Binary files differ
Client/Ñî¸ßȨ/log/ÈÕÖ¾_Ñî¸ßȨ_250627.doc
Binary files differ
Client/Ñî¸ßȨ/log/ÈÕÖ¾_Ñî¸ßȨ_250629.doc
Binary files differ
Client/Ñî¸ßȨ/log/ÈÕÖ¾_Ñî¸ßȨ_250701.doc
Binary files differ
Client/Å£Ñå½­/log/ÈÕÖ¾_Å£Ñå½­_250627.doc
Binary files differ
Client/Å£Ñå½­/log/ÈÕÖ¾_Å£Ñå½­_250701.doc
Binary files differ
Client/Íõ¹ú׳/code/untitled1.7z
Binary files differ
Client/Íõ¹ú׳/document/ʵʱ»·¾³ÐÅϢչʾ.xlsx
Binary files differ
Client/Íõ¹ú׳/log/~$_Íõ¹ú׳_0625.doc
Binary files differ
Client/Íõ¹ú׳/log/ÈÕÖ¾_Íõ¹ú׳_0627.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Client/\347\216\213\345\233\275\345\243\256/log/\346\227\245\345\277\227_\347\216\213\345\233\275\345\243\256_0627.doc" Binary files differ
Client/Íõ¹ú׳/log/ÈÕÖ¾_Íõ¹ú׳_0629.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Client/\347\216\213\345\233\275\345\243\256/log/\346\227\245\345\277\227_\347\216\213\345\233\275\345\243\256_0629.doc" Binary files differ
Client/Êæº£ÁÖ/log/~$_Êæº£ÁÖ_0629.doc
Binary files differ
Client/Êæº£ÁÖ/log/ÈÕÖ¾_Êæº£ÁÖ_0702.doc
Binary files differ
Client/³ÂºÀ/log/ÈÕÖ¾_³ÂºÀ_250627.doc
Binary files differ
Client/³ÂºÀ/log/ÈÕÖ¾_³ÂºÀ_250702.doc
Binary files differ
Client/κǿ/code/LogExportModule_PageSizeFinal.zip
Binary files differ
Client/κǿ/code/LogExportModule_PageSizeFinal_changeOK.rar
Binary files differ
Client/κǿ/code/log_table.sql
New file
@@ -0,0 +1,23 @@
-- åˆ›å»ºæ—¥å¿—表
CREATE TABLE IF NOT EXISTS log_entries (
    id INTEGER PRIMARY KEY AUTOINCREMENT,      -- ä¸»é”®ï¼Œè‡ªå¢ž ID
    timestamp DATETIME NOT NULL,               -- æ—¥å¿—时间戳
    level VARCHAR(10) NOT NULL,                -- æ—¥å¿—级别(INFO/WARN/ERROR)
    module VARCHAR(50),                        -- æ‰€å±žæ¨¡å—(如IPC、UI)
    source_file VARCHAR(100),                  -- æ¥æºæ–‡ä»¶å
    line_number INTEGER,                       -- è¡Œå·
    message TEXT NOT NULL,                     -- æ—¥å¿—消息
    extra TEXT                                 -- å¯é€‰æ‰©å±•信息(如JSON字符串)
);
-- æ’入示例数据
INSERT INTO log_entries (timestamp, level, module, source_file, line_number, message, extra)
VALUES (
    '2025-06-29 16:00:00',
    'ERROR',
    'CAN',
    'can_driver.cpp',
    125,
    'CAN è®¾å¤‡åˆå§‹åŒ–失败',
    '{"thread_id": "0x12345", "user_id": "admin"}'
);
Client/κǿ/document/log_table_structure.docx
Binary files differ
Client/κǿ/document/ÈÕÖ¾ÐèÇó·ÖÎöÎĵµ.docx
Binary files differ
Client/κǿ/log/~$_κǿ_0626.doc
Binary files differ
Client/κǿ/log/ÈÕÖ¾_κǿ_0627.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Client/\351\255\217\345\274\272/log/\346\227\245\345\277\227_\351\255\217\345\274\272_0627.doc" Binary files differ
Client/κǿ/log/ÈÕÖ¾_κǿ_0629.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Client/\351\255\217\345\274\272/log/\346\227\245\345\277\227_\351\255\217\345\274\272_0629.doc" Binary files differ
Client/κǿ/log/ÈÕÖ¾_κǿ_0630.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Client/\351\255\217\345\274\272/log/\346\227\245\345\277\227_\351\255\217\345\274\272_0630.doc" Binary files differ
Server/common_type.h
@@ -1,31 +1,44 @@
#ifndef TCPDATATYPE_H
#define TCPDATATYPE_H
/*        */
/*
 * å®¢æˆ·ç«¯ä¸ŽæœåŠ¡å™¨äº¤äº’çš„åŠ¨ä½œç±»åž‹æžšä¸¾
 * æ³¨æ„ï¼šä½¿ç”¨ enum class é¿å…å‘½åå†²çªï¼ˆC++11特性)
 */
enum class ActionType
{
    HeartCheck = 100,
    Login = 110,
    Register = 120,
    Msg = 200,
    Download = 300
    HeartCheck = 100,  // å¿ƒè·³æ£€æµ‹ï¼ˆä¿æŒè¿žæŽ¥æ´»æ€§ï¼‰
    Login = 110,       // ç™»å½•请求
    Register = 120,    // æ³¨å†Œè¯·æ±‚
    Msg = 200,        // æ™®é€šæ¶ˆæ¯ä¼ è¾“
    Download = 300     // æ–‡ä»¶ä¸‹è½½è¯·æ±‚
};
/* Î¿ HTTP    Ó¦  */
/*
 * HTTP风格响应状态码(简化版)
 * ç”¨äºŽæœåŠ¡å™¨å‘å®¢æˆ·ç«¯è¿”å›žæ“ä½œç»“æžœçŠ¶æ€
 */
enum class ResponseCode
{
    ResponseOK = 200,      //     É¹
    BadRequest = 400,      //  Í»             ó£¬·      Þ·
    Unauthorized = 401,    //     Òª   Ã»        Ö¤
    Forbidden = 403,       //              Í»  Ëµ    ó£¬µ  Ç¾Ü¾ Ö´ Ð´
    NotFound = 404,        //        Þ·  Òµ        Ô´
    MethodNotAllowed = 405 //  Í»        ÐµÄ·       Ö¹
    ResponseOK = 200,      // æˆåŠŸï¼ˆOK)
    BadRequest = 400,      // é”™è¯¯è¯·æ±‚(客户端请求语法错误)
    Unauthorized = 401,    // æœªæŽˆæƒï¼ˆéœ€è¦èº«ä»½éªŒè¯ï¼‰
    Forbidden = 403,       // ç¦æ­¢è®¿é—®ï¼ˆæƒé™ä¸è¶³ï¼‰
    NotFound = 404,        // æœªæ‰¾åˆ°ï¼ˆè¯·æ±‚资源不存在)
    MethodNotAllowed = 405 // æ–¹æ³•不允许(如用GET请求POST接口)
};
/*  Ï¢  */
/*
 * é€šç”¨æ¶ˆæ¯å¤´ç»“构(所有数据包必须包含)
 * ä½œç”¨ï¼šæ ‡è¯†æ¶ˆæ¯ç±»åž‹å’ŒåŸºæœ¬ä¿¡æ¯
 */
struct Head
{
    ActionType type;
    int len;
    int version;
    ActionType type;    // æ¶ˆæ¯ç±»åž‹ï¼ˆå¯¹åº”ActionType枚举)
    int len;           // æ•´ä¸ªæ•°æ®åŒ…的长度(字节数)
    int version;       // åè®®ç‰ˆæœ¬å·ï¼ˆç”¨äºŽå…¼å®¹æ€§æŽ§åˆ¶ï¼‰
    // æž„造函数(初始化时必须提供三个参数)
    Head(ActionType ptype, int plen, int pversion)
    {
        len = plen;
@@ -33,40 +46,61 @@
        version = pversion;
    }
};
struct HeartCheckReq //
/*
 * å¿ƒè·³æ£€æµ‹è¯·æ±‚结构
 * ç‰¹ç‚¹ï¼šå›ºå®šç±»åž‹å’Œé•¿åº¦ï¼ˆä¸éœ€è¦é¢å¤–数据)
 */
struct HeartCheckReq
{
    ActionType type;
    int len;
    ActionType type;  // å›ºå®šä¸ºActionType::HeartCheck
    int len;         // ç»“构体自身大小
    HeartCheckReq()
    {
        type = ActionType::HeartCheck;
        len = sizeof(HeartCheckReq);
        len = sizeof(HeartCheckReq);  // è‡ªåŠ¨è®¡ç®—ç»“æž„ä½“å¤§å°
    }
};
struct HeartCheckRes //       Ó¦
/*
 * å¿ƒè·³æ£€æµ‹å“åº”结构
 * æ³¨æ„ï¼šä¸Žè¯·æ±‚结构相同(实际可能包含服务器状态信息)
 */
struct HeartCheckRes
{
    ActionType type;
    int len;
    ActionType type;  // å›ºå®šä¸ºActionType::HeartCheck
    int len;         // ç»“构体自身大小
    HeartCheckRes()
    {
        type = ActionType::HeartCheck;
        len = sizeof(HeartCheckRes);
    }
};
/*
 * ç”¨æˆ·æ³¨å†Œè¯·æ±‚结构
 * ç»„成:消息头 + ç”¨æˆ·ä¿¡æ¯å­—段
 */
struct RegisterRequest
{
    Head head;
    char name[64];
    char password[64];
    char email[32];
    char phone[32];
    Head head;        // å¿…须包含的消息头
    char name[64];    // ç”¨æˆ·åï¼ˆå›ºå®šé•¿åº¦64字节)
    char password[64];// å¯†ç ï¼ˆå»ºè®®åŠ å¯†å­˜å‚¨ï¼‰
    char email[32];   // é‚®ç®±ï¼ˆç”¨äºŽæ‰¾å›žå¯†ç ï¼‰
    char phone[32];   // æ‰‹æœºå·ï¼ˆå¯é€‰éªŒè¯ï¼‰
};
/*
 * ç”¨æˆ·ç™»å½•请求结构
 * æ³¨æ„ï¼šæ¯”注册请求少邮箱和手机字段
 */
struct LoginRequest
{
    Head head;
    char name[64];
    char password[64];
    Head head;        // æ¶ˆæ¯å¤´ï¼ˆtype应为ActionType::Login)
    char name[64];    // ç”¨æˆ·å
    char password[64];// å¯†ç ï¼ˆå»ºè®®åŠ å¯†ä¼ è¾“ï¼‰
};
#endif
#endif // TCPDATATYPE_H
Server/Áõ±ó/log/ÈÕÖ¾_Áõ±ó_20250626.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Server/\345\210\230\346\226\214/log/\346\227\245\345\277\227_\345\210\230\346\226\214_20250626.doc" Binary files differ
Server/Áõ±ó/log/ÈÕÖ¾_Áõ±ó_20250628.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Server/\345\210\230\346\226\214/log/\346\227\245\345\277\227_\345\210\230\346\226\214_20250628.doc" Binary files differ
Server/ÐìÒÝ·²/log/ÈÕÖ¾_ÐìÒÝ·²_250628.doc
Binary files differ
Server/ÐìÒÝ·²/log/ÈÕÖ¾_ÐìÒÝ·²_250701.doc
Binary files differ
Server/ÁÖÓà½Ü/log/ÈÕÖ¾_ÁÖÓà½Ü_20250626.doc
Binary files differ
Server/Áº²©/code/server_config.zip
Binary files differ
Server/Áº²©/log/~$_Áº²©_0624.doc
Binary files differ
Server/Áº²©/log/ÈÕÖ¾_Áº²©_0626.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Server/\346\242\201\345\215\232/log/\346\227\245\345\277\227_\346\242\201\345\215\232_0626.doc" Binary files differ
Server/Áº²©/log/ÈÕÖ¾_Áº²©_0627.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Server/\346\242\201\345\215\232/log/\346\227\245\345\277\227_\346\242\201\345\215\232_0627.doc" Binary files differ
Server/Áº²©/log/ÈÕÖ¾_Áº²©_0629.doc
Binary files differ
Server/Áº²©/log/ÈÕÖ¾_Áº²©_0701 .doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Server/\346\242\201\345\215\232/log/\346\227\245\345\277\227_\346\242\201\345\215\232_0701 .doc" Binary files differ
Server/¶ÎÑÓ³å/log/ÈÕÖ¾_¶ÎÑÓ³å_0626.doc
Binary files differ
Server/¶ÎÑÓ³å/log/ÈÕÖ¾_¶ÎÑÓ³å_0701.doc
Binary files differ
Server/ÍôÎÀ¾ü/code/ImageStorage.cpp
File was deleted
Server/ÍôÎÀ¾ü/code/ImageStorage.h
File was deleted
Server/ÍôÎÀ¾ü/code/ͼÏñ´¦Àí.rar
Binary files differ
Server/ÍôÎÀ¾ü/log/ÈÕÖ¾_ÍôÎÀ¾ü_0626.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Server/\346\261\252\345\215\253\345\206\233/log/\346\227\245\345\277\227_\346\261\252\345\215\253\345\206\233_0626.doc" Binary files differ
Server/ÍôÎÀ¾ü/log/ÈÕÖ¾_ÍôÎÀ¾ü_0629.doc
copy from "Server/\346\242\201\345\215\232/log/~WRL0005.tmp" copy to "Server/\346\261\252\345\215\253\345\206\233/log/\346\227\245\345\277\227_\346\261\252\345\215\253\345\206\233_0629.doc" Binary files differ
Server/ÍôÎÀ¾ü/log/ÈÕÖ¾_ÍôÎÀ¾ü_0702.doc
Binary files differ
~$ÂìÒÏÖÇÄÜÍøÁªÏîÄ¿·Ö¹¤±í.xlsx
Binary files differ
¹¦ÄÜÄ£¿é_½éÉÜ.txt
New file
@@ -0,0 +1,630 @@
模块划分:
客户端:C --Qt开发界面--跨平台使用
统一的要求:
    åŠŸèƒ½ç»“æž„ä½“ï¼š
        è¯·æ±‚结构体:
            æ•°æ®å¤´--固定
            æ•°æ®ä½“--不同模块,不一样
        å“åº”结构体:
            æ•°æ®å¤´
            æ•°æ®ä½“
        ä¸¾ä¾‹ï¼š
            enum TypeInfo
            {
                REGISTER_REQ,  // æ³¨å†Œè¯·æ±‚
                REGISTER_RES,  // æ³¨å†Œå“åº”
            };
            struct Head // é€šç”¨
            {
                int type;
                int len;
            };
        ä»¥æ³¨å†Œä¸ºä¾‹ï¼š
            struct RegisterReq
            {
                Head head;
                char username[32];
                char password[32];
                char email[32];
                char tel[32];
                char department[32];
                RegisterReq()
                {
                    head.type = REGISTER_REQ;
                    head.len = sizeof(RegisterReq);
                }
            };
            struct RegisterRes
            {
                Head head;
                char username[32];
                int status;
                RegisterRes()
                {
                    head.type = REGISTER_RES;
                    head.len = sizeof(RegisterRes);
                }
            };
3星    1、注册登录
    æ³¨å†Œï¼š
        è¾“入信息:用户名、密码、确认密码、邮箱、手机号、部门
        è‡ªåŠ¨è¡¥å……çš„ä¿¡æ¯ï¼šçŠ¶æ€ã€æ³¨å†Œæ—¶é—´ã€é»˜è®¤çš„æƒé™--在服务端补充
        æ ¡éªŒï¼šå®¢æˆ·ç«¯æœ¬åœ°æ ¡éªŒï¼šç”¨æˆ·åã€å¯†ç ã€åˆæ³•字符的判断
               é‚®ç®±ã€æ‰‹æœºå·æ ¼å¼çš„判断、两次密码比较是否一样
               æœåŠ¡ç«¯äºŒæ¬¡æ ¡éªŒï¼šç”¨æˆ·åã€å¯†ç ã€åˆæ³•å­—ç¬¦çš„åˆ¤æ–­
               æœåŠ¡ç«¯åˆ¤æ–­ï¼šç”¨æˆ·åæ˜¯å¦å­˜åœ¨ï¼Œä¸å­˜åœ¨åˆ™å†™å…¥[用户名唯一]
        å®‰å…¨ï¼šå¯†ç åŠ å¯†çš„å¤„ç†ï¼Œé˜²æ­¢æ˜Žæ–‡ä¼ è¾“å’Œæ˜Žæ–‡æ˜¾ç¤º
             åŠ å¯†ç®—æ³•ï¼šåŒå‘éžå¯¹ç§°åŠ å¯† RSA å…¬é’¥--私钥:公钥加密,私钥解密
             å®¢æˆ·ç«¯ï¼šæ‹¿åˆ°å…¬é’¥ï¼ŒåŠ å¯†ï¼Œæ”¾åˆ°ç»“æž„ä½“é‡Œé¢ä¼ è¾“å¯†æ–‡
             æœåŠ¡ç«¯ï¼šç”¨ç§é’¥è§£å¯†ï¼Œå¾—åˆ°å¯†ç æ˜Žæ–‡
        å…¬é’¥ã€ç§é’¥çš„产生,是在服务端每次随机生成固定长度的一组密钥
             å°†å…¬é’¥å‘给对应的客户端,私钥在服务端留着用来解密密文
            åŽŸå§‹å†…å®¹ï¼š123456
                å¯†é’¥ï¼šå…¬é’¥ xxww99
            åŠ å¯†ç®—æ³•ï¼š(2个参数:原始内容,密钥-公钥) --> è¿”回计算结果:密文:x8sdsdsaxxxxadsadsadsadsda889e21ess
            å¯†é’¥ï¼šç§é’¥ uuyy84
            å°†å¯†æ–‡å‘给另一端之后,解密算法(2个参数:密文,密钥-私钥)--> æ˜Žæ–‡ï¼š123456
    ç™»å½•:
        è¾“入信息:用户名、密码、验证码[可选]
        æ ¡éªŒï¼šå®¢æˆ·ç«¯æœ¬åœ°æ ¡éªŒï¼šç”¨æˆ·åã€å¯†ç ã€åˆæ³•字符的判断
              æœåŠ¡ç«¯äºŒæ¬¡æ ¡éªŒï¼šç”¨æˆ·åã€å¯†ç ã€åˆæ³•å­—ç¬¦çš„åˆ¤æ–­
        å®‰å…¨ï¼šå¯†ç åŠ å¯†çš„å¤„ç†ï¼Œé˜²æ­¢æ˜Žæ–‡ä¼ è¾“å’Œæ˜Žæ–‡æ˜¾ç¤º
        çŠ¶æ€ï¼šæˆåŠŸ--显示主界面--根据用户拥有的权限,来显示不同的子界面
              å¤±è´¥--再次登录
    UI美化:QSS样式美化
    --------------------------------------------
    æ•°æ®åº“表:用户信息表、角色权限表
    ---------------------------------------------
5星 2、考勤识别、管理、异常处理
    è€ƒå‹¤è¯†åˆ«ï¼š
        AI识别,需要传入图片,将图片放到AI算法里面调用模型进行识别,返回所属的分类,通过分类ID获取数据库里面用户信息表中的用户信息,并且将信息展示到界面上。
        èŽ·å–å›¾ç‰‡ï¼šæ‰“å¼€æ‘„åƒå¤´--获取一张有人脸的照片
                   OpenCV库来打开摄像头并获取人脸照片
                æœåŠ¡ç«¯è¯†åˆ«ï¼šå®¢æˆ·ç«¯ä¸Šä¼ å›¾ç‰‡åˆ°æœåŠ¡ç«¯ï¼Œè°ƒç”¨æœåŠ¡ç«¯AI算法,返回识别结果
                æœ¬åœ°è¯†åˆ«ï¼šéœ€è¦åœ¨å®¢æˆ·ç«¯æœºå™¨ä¸Šéƒ¨ç½²AI模型,将图片传入调用AI算法识别,拿到分类ID,再把ID发送给服务端,进行数据库查询,拿到查询结果,在客户端UI展示
        è¯†åˆ«ï¼šæˆåŠŸ--要记录人脸打开信息:考勤信息表--用户名[id]、考勤时间、考勤设备id
              å¤±è´¥--提示失败
    ç®¡ç†ï¼š
        æŸ¥è¯¢--展示一个特定时间段的考勤统计结果
              è€ƒå‹¤åˆ¤æ–­ï¼šä¸Šç­æ—¶é—´æ®µ--下班时间段
        å¿˜æ‰“卡--补打卡次数: 5次/月
    å¼‚常处理:
        è€ƒå‹¤å¼‚常:迟到、早退、缺勤、请假-[细分....]
4星 3、权限管理
    å‰ææ¡ä»¶ï¼šç®¡ç†å‘˜æ‰èƒ½ç®¡ç†è¿™ä¸ªæ¨¡å—
    ç®¡ç†ï¼š å…ˆæŸ¥è¯¢åˆ°ç‰¹å®šç”¨æˆ·ï¼Œå†ç‚¹å¼€ç‰¹å®šç”¨æˆ·çš„æƒé™ä¿¡æ¯ï¼Œå¯¹æƒé™å‹¾é€‰/去勾选,最后提交修改,保存到服务端是数据库
    ç•Œé¢ï¼šæŸ¥è¯¢æ¡ä»¶----用户名、工号、注册时间段、部门、邮箱、手机号等
          æŸ¥è¯¢ç»“果展示----用二维表视图展示[MVD]
          å³å‡»èœå•--选择特定用户--修改权限、禁用用户[修改状态]
          ä¿®æ”¹æƒé™----显示当前选定用户拥有的权限[勾选√],没有的权限不勾
                      ä¿®æ”¹çš„话,对选项勾选或去勾选之后,提交修改
    æƒé™ï¼šæœ‰å°±æ˜¯1,无就是0
        admin ç®¡ç†å‘˜
        export æŠ¥è¡¨å¯¼å‡º
        log_search æ—¥å¿—查询
        img_in  å›¾åƒå½•å…¥
        map_mark_change åœ°å›¾æ ‡æ³¨ä¿®æ”¹
        history åŽ†å²å›žæ”¾ã€åŽ†å²æŸ¥è¯¢
        warning_man è­¦æŠ¥ç®¡ç†
        device_man è®¾å¤‡ç®¡ç†
        version_man å®¢æˆ·ç«¯ç‰ˆæœ¬ç®¡ç†
    æ•°æ®åº“表:
        id è§’色名 å…·ä½“的权限...【9个】
5星 4、客户端版本更新
    æ›´æ–°æ–¹å¼ï¼šå¢žé‡æ›´æ–°ã€å…¨é‡æ›´æ–°
    å¢žé‡æ›´æ–°ï¼šé€ç‰ˆæœ¬æ›´æ–°
    å…¨é‡æ›´æ–°ï¼šæŸä¸ªç‰ˆæœ¬çš„完整更新,就是整个安装包
    æ›´æ–°é€»è¾‘:比较版本--最新[不更新]
                      --不是最新--更新--比较要要更新文件的大小--选择更新方式
               å¢žé‡æ›´æ–°ï¼š å¾ªçŽ¯æ“ä½œï¼š å½“前版本--找到下一个版本要更新的文件--下载--覆盖到客户端本地目录--完成更新--再接着比较版本...
               å…¨é‡æ›´æ–°ï¼šä¸‹è½½æœ€æ–°ç‰ˆçš„完整安装包,安装到本地即可
    æ ¸å¿ƒï¼š
        æ–‡ä»¶ä¼ è¾“--大文件--要支持 æ–­ç‚¹ç»­ä¼ --记录一些传输的信息--确认断点位置--ç»­ä¼ 
    æ•°æ®åº“表: ç‰ˆæœ¬ä¿¡æ¯è¡¨--读取
            id å½“前版本号 ä¾èµ–版本号[前置版本] æ–‡ä»¶å æ–‡ä»¶å¤§å° æ–‡ä»¶MD5 æ–‡ä»¶S端路径 æ–‡ä»¶C端路径[相对路径] çŠ¶æ€ äº§ç”Ÿæ—¶é—´
            ä¼ è¾“记录表[可选]
    ç•Œé¢ï¼š æ›´æ–°è¿›åº¦å±•示:进度条、详细信息罗列...
    æ›´æ–°ç¨‹åºï¼šå’Œä¸»ç¨‹åºè¦ç›¸äº’独立
            update.exe  client.exe
    ç‰ˆæœ¬å¦‚何记录?
            é…ç½®æ–‡ä»¶æ¥è®°å½•,可以是 version.ini æˆ– version.xml
3星 5、报表导出
        é€»è¾‘:提前数据[日志、历史...]--导出到文件: æ–‡æ¡£ã€è¡¨æ ¼[csv,xlsx]、pdf
        ã€html--保存到本次磁盘
        ä¸€ã€æä¾›æŽ¥å£ï¼Œè®©åˆ«çš„æ¨¡å—传参调用
        äºŒã€ç”¨åˆ—表展示已经导出的记录,可预览相应的文件
5星 6、实时播放
        é€»è¾‘:客户端先获取所有可查看的摄像头信息,形成一个菜单配置[1-4-9-16-25]
              ç„¶åŽåœ¨æ ¹æ®æ’­æ”¾è§†å›¾é€‰æ‹©ï¼Œç»„合菜单配置形成播放的实时画面
              æ’­æ”¾ï¼šè¦ç»™é€‰å¥½çš„画面连接,进行多线程的拉流处理--RTSP协议--FFmpeg
              --拉流过来之后:解码形成图片--在标签上显示
        æ•°æ®åº“表:
            æ‘„像头信息--设备信息表--会包含每个摄像头的url[网址]
        æ•°æ®æµï¼šH.265压缩内容,200倍的压缩比,要解压--解码
            åœ¨ä¸‰æ–¹åº“中已经完成了:FFmpeg库
        æœ‰2部分的东西:
        1、常规业务
            æŸ¥è¯¢è¯·æ±‚--拿到所有可用摄像头的信息
            è¯·æ±‚:只需要指定结构体头里面的功能类型值就行
                struct RealtimeShowReq
                {
                    Head head;
                    RealtimeShowReq()
                    {
                        head.type = xx; // xx为提前定好的枚举变量
                        head.len = sizeof(RealtimeShowReq);
                    }
                };
            å“åº”:回一个摄像头信息[柔性数组]的响应
                struct VideoInfo
                {
                    int id;
                    char url[256]; // æ‹¼æŽ¥å¥½çš„æ‘„像头网址 åè®®://ip:port/1/last.ts
                    // ...
                };
                struct RealtimeShowRes
                {
                    Head head;
                    VideoInfo vi[0]; // æŸ”性数组
                };
        2、视频业务
            ç”¨FFmpeg去拉rtsp url的地址流数据过来,用FFmpeg来解压缩、解码就行
3星 7、系统设置
        å®¢æˆ·ç«¯çš„设置:
            æ ·å¼æŽ§åˆ¶ï¼šå­—体、颜色、外观调整
            å›½é™…化的显示:中文、英文、法文...
            å¿«æ·é”®ï¼š
            è‡ªå¯åŠ¨çš„æœåŠ¡ï¼šå¼€æœºå¯åŠ¨
            è‡ªåŠ¨ç™»å½•ï¼šè¦è®°å½•ç”¨æˆ·åã€å¯†ç [加密记录]
            ......
        å¦‚何生效:将配置信息保存到xml文件中,启动时加载设置
3星 8、日志查询
        æŸ¥è¯¢æ¡ä»¶ï¼šçº§åˆ«ã€æ—¶é—´æ®µç­‰
        æ˜¾ç¤ºç»“果:用表格显示[MVD的视图]、分页显示--分页算法-将结果分成更小的块来显示,提升性能
                1 2 3 ... 98 99 100  è·³è½¬__页[下拉框/编辑框]
        å¯¼å‡ºï¼šè°ƒç”¨æŠ¥è¡¨å¯¼å‡ºæŽ¥å£
4星 9、图像录入
        ç”¨äºŽè®­ç»ƒæ¨¡åž‹ï¼Œæ¯ä¸ªæ–°å‘˜å·¥éƒ½éœ€è¦é‡‡é›†ä¸€äº›ç‰¹å®šæ•°é‡çš„图片来训练,训练完了之后,用于识别--考勤等
        é€»è¾‘:客户端--先把要录入的员工工号输入--确认工号信息正确--再点开摄像头--获取该员工特定数量、视角的照片--上传到服务端特定目录下保存--用于模型训练
        ç•Œé¢ï¼š
            é€šè¿‡è¾“入工号--获取员工信息--显示--通过操作员判断正确否
            ç‚¹ä¸€ä¸‹å½•入按钮:就会提示分别路哪些视角:正脸、侧脸、眨眼、张嘴等
                        æ¯ä¸ªå½•完之后,用标签显示一下录到的照片--预览
            ç¡®è®¤æ— è¯¯--提交--上传到服务器特定工号目录保存--同时记录到数据库表
        æ•°æ®åº“表:图片信息表:id、图片名字、路径、所属工号、上传时间、是否已训练...
5星 10、地图标注-摄像头、设备
        ç‰¹æ®Šçš„地方:编译器得使用MSVC的编译器,才能支持浏览器的绘制
                    é€šè¿‡ç»˜åˆ¶çš„æµè§ˆå™¨ï¼ŒåŠ è½½ç™¾åº¦åœ¨çº¿åœ°å›¾
        æ ‡æ³¨ï¼šè®¾å¤‡çš„坐标[经度、纬度],设备名称、编号、状态等显示出来
        æ ¸å¿ƒï¼š
            QT å’Œ ç½‘页的JS要交互,使用信号槽来交互
            ç”¨åˆ°çš„æŠ€æœ¯ webchannal.js
            éœ€è¦é¢å¤–掌握:HTML、JS代码的编写 [会C/C++,必然能秒懂]
        é€»è¾‘:
            æ˜¾ç¤ºåœ°å›¾çš„æ ‡æ³¨ç‚¹--去查询设备的经纬度--拿到所有可用设备经纬度--标记到网页地图里
            ä¿®æ”¹æ ‡æ³¨ç‚¹ï¼šæ”¹çŠ¶æ€ã€æ”¹åå­—ã€è°ƒæ•´ç»çº¬åº¦ç­‰
        æ•°æ®åº“表:
            è®¾å¤‡ä¿¡æ¯è¡¨  è¦ç»åº¦ã€ç»´åº¦ åå­— id çŠ¶æ€ ç­‰
5星 11、历史回放、历史数据查询分析
        åŽ†å²å›žæ”¾ -- å›žæ”¾çš„æ˜¯è§†é¢‘内容
            æŸ¥è¯¢ç‰¹å®šæ—¶é—´æ®µã€ç‰¹å®šè®¾å¤‡ç±»åž‹ã€ç¼–号---拿到了特定时间段内的视频文件url
            ----使用FFmpeg对【RTSP】url è¿›è¡Œæ‹‰æµ--解码显示
            æ“ä½œï¼š
                æˆªå›¾--保存某一帧图片
                å¿«è¿›ã€åŽé€€ã€æš‚停、播放等控制视频的操作
        åŽ†å²æ•°æ®æŸ¥è¯¢åˆ†æž -- æŸ¥çœ‹çš„æ˜¯çŽ¯å¢ƒä¿¡æ¯çš„åŽ†å²æ•°æ®
            éœ€è¦æŒ‡å®šæŸ¥è¯¢æ¡ä»¶--时间段、设备等--拿到历史数据--展示到二维表
            --分析[日、周、月、年]:最小值、最大值、平均值、中位数--形成图形、曲线
            --用到QChart库,或者三分库 QCustomPlot来显示更多数据量的图形
        ç»“构体里面如何表示内容每次查询都不一样,但是都能拿到:用不定长结构体[柔性数组]
        æ•°æ®åº“表: è§†é¢‘信息表、环境信息表......
5星 12、实时环境信息展示
        é€»è¾‘: å¾—用一个大屏来实时显示环境信息
            åˆ†ä¸åŒåŒºåŸŸæ¥æ˜¾ç¤ºï¼Œè¿˜å¯ä»¥æ˜¾ç¤ºåˆ«çš„æ•°æ®åˆ°å¤§å±é‡Œé¢æ¥
            ä¸»è¦æ˜¯çŽ¯å¢ƒä¿¡æ¯[温度、湿度、粉尘浓度、施工进度等]
            å…¶ä»–信息:看一下小地图、看一下考勤情况、动态切换一下监控摄像头情况
                      è·Ÿå…·ä½“模块负责人对接,要接口就行
        å®žæ—¶çŽ¯å¢ƒä¿¡æ¯ï¼šçŽ°åœºçš„å„ç§ä¼ æ„Ÿå™¨é‡‡é›†è€Œæ¥
                     æµ‹è¯•环境--可以模拟数据发送过来
        å®žæ—¶ä¿¡æ¯ï¼šé€šè¿‡ç¡¬ä»¶ä¸Šä¼ æ•°æ®ä¹‹åŽï¼Œåˆ°æœåŠ¡ç«¯äº†ï¼Œç»™æ‰€æœ‰åœ¨çº¿çš„å®¢æˆ·ç«¯è½¬å‘çš„
        æ•°æ®åº“表: çŽ¯å¢ƒä¿¡æ¯è¡¨ï¼šid è®¾å¤‡id æ¸©åº¦ é€‚度 ç²‰å°˜æµ“度
                   æ–½å·¥è¿›åº¦è¡¨ï¼šid æ–½å·¥ç±»åž‹ é¢„计工作量  å½“前完成量  æ—¶é—´ ...
        çœŸå‡å®žæ—¶ï¼šè½¬å‘为真,轮询为假
4星 13、警报管理
        é’ˆå¯¹å“ªäº›åšå‡ºè­¦æŠ¥çš„判断?
            æ¸©åº¦ã€æ¹¿åº¦ã€ç²‰å°˜æµ“度、施工进度等
        è¦å¯¹ç‰¹å®šæŒ‡æ ‡è¿›è¡Œé˜ˆå€¼çš„管理:可以动态调整阈值--最大、最小值
        å‘生了警报,怎么处理?
            1、预警--硬件端先触发声、光警报,接着软件部分会给所有在线客户端提示预警信息
            2、解决--控制现场设备,自动调节--失败了--给值班室派单--解决问题
        æ•°æ®åº“表:
            é˜ˆå€¼ä¿¡æ¯è¡¨ã€è­¦æŠ¥ä¿¡æ¯è¡¨
        ç•Œé¢ï¼š
            ç®¡ç†é˜ˆå€¼çš„界面--先查询-再修改
            æ˜¾ç¤ºè­¦æŠ¥çš„界面--要在主窗口中,所有子模块都能同时看见的位置显示
        å¦‚何触发:
            æ•°æ®åˆ°äº†æœåŠ¡ç«¯ä¹‹åŽï¼Œé™¤äº†å®žæ—¶è½¬å‘çš„æ“ä½œï¼Œè¿˜è¦ä¸€ä¸ªé¢„è­¦åˆ¤æ–­çš„æ“ä½œ
                å‘生异常了,同时记录到警报信息表,且给所有在线客户端转发警报提示
3星 14、设备管理
        è®¾å¤‡ï¼šæ‘„像头、硬盘录像机、各种工地的设备[资产管理的]
        å¯¹è®¾å¤‡è¿›è¡Œå¢žåˆ æ”¹æŸ¥
        æ·»åŠ ï¼šæ–°è®¾å¤‡--录入信息--对于外露固定位置的设备,要有安装位置的经纬度
        åˆ é™¤ï¼šä¿®æ”¹è®¾å¤‡çŠ¶æ€--废弃、不可用、维修、正常
        æ”¹ï¼šä¿®æ”¹å·²ç»å½•入的信息
        æŸ¥è¯¢ï¼šæŸ¥çœ‹éƒ½æœ‰å“ªäº›è®¾å¤‡
        æ•°æ®åº“表:设备信息表
                id è®¾å¤‡ç±»åž‹ åå­— åºåˆ—号 çŠ¶æ€ å®‰è£…æ—¶é—´ ç»åº¦ ç»´åº¦ è´Ÿè´£äºº
服务端:S
5星 1、网络搭建、TCP、UDP实现
        ç¡®å®šå¹¶å‘量:1000--5000的并发量来设置
        select + çº¿ç¨‹æ± 
        æœ€ç»ˆçš„æœåŠ¡ç«¯ï¼šåœ¨linux平台下运行--Ubuntu 20.3--也可以使用epoll来处理高并发
        è§£è€¦æ“ä½œï¼š
            æŠŠä¸šåŠ¡å½“ä»»åŠ¡å¤„ç†ï¼Œè¦å†™ä¸€ä¸ªé€šç”¨çš„ä»»åŠ¡ç±»æ¥è¡¨ç¤ºä¸åŒçš„ä¸šåŠ¡
        çº¿ç¨‹æ± çš„实现:先考虑使用C++实现--鸿蒙系统的线程池
        è¿˜éœ€è¦ç¡®å®šçš„:
            1、每个用到网络的模块,要提交:请求结构体、响应结构体
            2、要给每一个请求、响应结构体,分配枚举类型内容--type--用来区分不同的业务功能
            3、任务类可以使用模板来处理,结合业务抽象类[纯虚函数],定好统一当接口
            4、考虑使用高级的操作--设计模式的选择:工厂模式、观察者模式等
        åè®®ç›¸å…³ï¼š
            TCP--心跳检测、粘包处理
            RTSP[udp]--使用Live555框架来支撑rtsp服务即可--开源框架
4星 2、数据库搭建
        MySQL数据库--建库--建表
        å»ºåº“:统一建一个库名: znwl_db
        å»ºè¡¨ï¼šéœ€è¦å’Œæ¯ä¸€ä¸ªç”¨åˆ°æ•°æ®åº“的负责人--对接--要他们的数据库表--整合重复的内容--建表
        SQL脚本导出:完成建库、建表之后,要导出sql语句,形成一个脚本,其他人使用脚本,本地即可生成一个新的库、表
        å°è£…:提供接口,给其他人使用--作为子服务来使用的
            ç±»--公有的接口--给他人调用
            æŽ¥å£ï¼šå¢žåˆ æ”¹æŸ¥çš„æ“ä½œ--先以sql语句为参数--拿结果集或拿条数
                  å‡çº§v2:写一个类来组装sql语句,每一条语句,就是一个对象,较安全
                  å®‰å…¨æ ¡éªŒï¼šé˜²æ³¨å…¥æ ¡éªŒ--正则匹配
                 ç§æœ‰API:自动初始化使用的--实例化对象时,自动把数据库连上
        å‡çº§ï¼šæ•°æ®åº“连接池--解决连接复用的问题
        å¤‡ä»½å¯¼å‡ºï¼šshell脚本--定时导出--打包--上传到指定的ftp服务器保存
3星 3、日志封装
        æ—¥å¿—作用:用于问题定位的
        çº§åˆ«ï¼šå¸¸è§„、调试、警告、错误、致命等
        å†™åˆ°å“ªé‡Œï¼Ÿ æ–‡ä»¶ã€æ•°æ®åº“表
            æ–‡ä»¶ï¼šæ‰€æœ‰çº§åˆ«çš„记录 -- è¶…过指定大小之后-- æ–‡ä»¶ç¿»æ»š -- æ¢ä¸€ä¸ªæ–‡ä»¶ç»§ç»­è®°å½• -- å®žçŽ°æ–‡ä»¶ç¿»æ»šç®—æ³•
            æ•°æ®åº“表: è­¦å‘Šã€é”™è¯¯ã€è‡´å‘½ç­‰é‡è¦çš„级别的日志内容
        å†™æ—¥å¿—:同步、异步的选择?---- å¼‚步高效 -- ç”¨é˜Ÿåˆ—来缓冲--记录任务
        å°è£…:类--提供对应的接口--函数宏[跟级别挂钩]:只需要选择宏,给一个日志描述,其他的自动生成
        å†…容:
            id çº§åˆ« æ—¶é—´ æ—¥å¿—描述 æ–‡ä»¶å å‡½æ•°å è¡Œå· ç­‰
            å†…容一式两份,一个写到文件,一个写到数据库表
        å‚考框架:
            log4c  log4cPlus等框架,仅作参考,还是要自己实现封装的功能
5星 4、CNN模型搭建
    ä½œç”¨ï¼šæä¾›è¯†åˆ«åŠŸèƒ½çš„æ¨¡å—ï¼Œ
        éœ€è¦äº§ç”Ÿä¸€ä¸ªæ¨¡åž‹æ–‡ä»¶ï¼Œé€šè¿‡è®­ç»ƒçš„æ–¹å¼äº§ç”Ÿ
        å¯¹ä¼ è¿›æ¥çš„图片,使用模型去快速匹配到相应的分类,从而实现AI的人脸识别功能
    CNN: å·ç§¯ç¥žç»ç½‘络算法:核心过程--卷积--池化--全连接
         åå‘训练:随机梯度下降算法
    æ­å»ºï¼šç¥žç»ç½‘络--需要搭建很多层,逐层去计算并处理各种特征--图片特征--能最终快速找到分类--产生:训练好的模型
    è®­ç»ƒï¼š
        è¾“入:一堆图片特征--都是处理过的图片
        è¾“出:模型文件
    è¯†åˆ«ï¼š
        è¾“入: ä¸€å¼ å›¾ç‰‡
            è¿‡ç¨‹ï¼šå°†å›¾ç‰‡å¤„理之后,去训练好的模型里面,匹配特征,找到分类,返回
        è¾“出: è¿™å¼ å›¾ç‰‡å¯¹åº”的所属分类
    æä¾›ï¼š
        æ¨¡åž‹æ–‡ä»¶
        æŽ¥å£å‡½æ•°
    ---------------------------------------------
    è¿ç§»å­¦ä¹ ï¼š
        å·²ç»è®­ç»ƒäº†ä¸€ä¸ªæ¨¡åž‹äº†ï¼Œå†æ¥æ–°å‘˜å·¥ï¼Œå¦‚何加到模型里面去
        ä¸¤ç§æ–¹æ¡ˆï¼šä¸€ã€åŠ è¿›æ¥ä¹‹åŽï¼Œé‡æ–°å…¨éƒ¨å†æ¥ä¸€é
                  äºŒã€åŠ è¿›æ¥ä¹‹åŽï¼Œåœ¨å·²æœ‰çš„åŸºç¡€ä¸Šï¼Œè¿›è¡ŒäºŒæ¬¡è®­ç»ƒ--迁移
    ---------------------------------------------
    ç»†èŠ‚ï¼š
        æ‹Ÿåˆé—®é¢˜ï¼šè¿‡æ‹Ÿåˆã€æ¬ æ‹Ÿåˆ
        æ´»ä½“检测问题:3维成像效果--立体的方式
                      é…åˆåŠ¨ä½œæ¥è¯†åˆ«
        -----------------------------------------
    æŠ€æœ¯ï¼š
        æ¡†æž¶ TensorFlow--谷歌的开源框架
        çœŸæ­£çš„æ™ºèƒ½ä½“,也就是所谓的通用AI,真正牛逼起来的时候:量子计算机量产的时候
        -----------------------------------------
4星 5、图像管理
        å›¾åƒ--人脸照片
                    ç”¨æ¥ç›´æŽ¥è®­ç»ƒçš„图片--采集好的
                    è¯†åˆ«äº§ç”Ÿçš„单张照片--识别时保存的
        åˆ†ç±»ï¼šç”¨å·¥å·æ¥ä½œä¸ºå­ç›®å½•,保存每个员工的人脸照片
        ä»€ä¹ˆæ—¶å€™åˆ›å»ºå­ç›®å½•?
            æ³¨å†ŒæˆåŠŸçš„æ—¶å€™ï¼Œäº§ç”Ÿäº†å‘˜å·¥id,此时就可以触发--调用接口来创建子目录
        æŽ¥å£ï¼šä¼ è¿›æ¥ä¸€ä¸ªå·¥å·[字符串],会到图像根目录去创建这个工号子目录
        å¯¹äºŽç”¨äºŽä¸åŒåŠŸèƒ½çš„å›¾ç‰‡ï¼Œè®°å½•çš„æ—¶å€™ï¼Œå¯ä»¥åŠ ä¸Šæ ‡å¿—--训练否
        æŽ¥å£ï¼šåˆ é™¤å·²ç»æ— ç”¨çš„照片--不再用于训练的照片、有干扰的照片
        ã€æ˜¯å¦è¦ç”¨ç•Œé¢æ˜¾ç¤ºå¯¹åº”子目录下的照片,并进行相应的操作--查询、修改】
4星 6、模型数据预处理
        å¤„理的是照片,要把原始的照片--处理--变成矩阵特征
        å¤„理方式:向量化、灰度化、二值化、浮点归一化、降噪等处理方式
        åŽŸç†ï¼šå›¾ç‰‡ä¸­çš„æ¯ä¸€ä¸ªåƒç´ ç‚¹ï¼Œä½“çŽ°çš„éƒ½æ˜¯RGB的颜色值 (255,255,255)
        ä½¿ç”¨çš„æ¡†æž¶ï¼šOpenCV
3星 7、配置管理
        ä½œç”¨ï¼šä½¿å¾—服务端,不需要再进行二次编码,特别是一些参数要变的时候:ip、port、路径......
        é…ç½®ä¿¡æ¯å­˜æ”¾ï¼šxml文件来保存,如:config.xml
        å†…容:
            socket:ip、port
            MySQL: host、user、password、db、port等
            log: æ–‡ä»¶ç¿»æ»š--大小限定,存放的路径、是否启动异步模式
            å›¾ç‰‡å­˜æ”¾ï¼šæ ¹ç›®å½•
            é…ç½®æœåŠ¡çš„å¯åŠ¨æ–¹å¼ï¼šå†·å¯åŠ¨ã€çƒ­å¯åŠ¨
            å†…容提供方式:饿汉=0、懒汉=1
            å®¢æˆ·ç«¯æ–‡ä»¶ç‰ˆæœ¬å­˜æ”¾ï¼šæ ¹ç›®å½•
        è§£æžåº“:tinyxml2    ä½¿ç”¨ä¸‰æ–¹åº“的头文件和源文件就可以搞定
        æä¾›å†…容的方式:
            åœ¨ä¸»å‡½æ•°ä¸­ç¬¬ä¸€ä¸ªåŠ è½½èµ·æ¥
            é¥¿æ±‰å¼ï¼šä¸€å¼€å§‹å°±å…¨å±€æ‰€æœ‰çš„内容--可以使用全局变量来存储最新的内容
            æ‡’汉式:需要时,再提供--提供函数接口,调用--返回结果
        å¯åŠ¨æ–¹æ¡ˆï¼š
            å®šæ—¶ç›‘控配置内容是否发生变化,变化了,要随时做出相应的重启服务
            å®šæ—¶ç›‘控:使用一条子线程,间隔10秒读一下xml配置文件和上一次的数据对比
                      æœ‰å˜åŒ–了,就按配置的方式启动
5星 8、客户端文件版本管理
        æƒé™--版本管理权限
        èŽ·å–ç‰ˆæœ¬å·ï¼šæŸ¥è¯¢åˆ°æ‰€æœ‰ç‰ˆæœ¬å·ï¼Œæ”¾åˆ°ä¸€ä¸ªä¸‹æ‹‰æ¡†ä¸­å±•ç¤º
        æ·»åŠ å·²ç»å˜åŒ–çš„æ–‡ä»¶ï¼š-- å¢žé‡æ›´æ–°
            ä¸“门的UI界面:
                é€‰æ‹©æ–‡ä»¶çš„æœ¬åœ°è·¯å¾„
                ç‰ˆæœ¬å·[规则],依赖版本号
                æœåŠ¡ç«¯çš„å­˜æ”¾è·¯å¾„ï¼Œå®¢æˆ·ç«¯çš„å­˜æ”¾è·¯å¾„
                äºŒç»´è¡¨ï¼šç‚¹å‡»æ·»åŠ æ–‡ä»¶ä¹‹åŽï¼Œä¼šå°†ä¸Šè¿°çš„å†…å®¹ï¼Œå†™åˆ°è¡¨æ ¼ä¸­
                    å½“添加完所有变化的文件之后
                    å†ç‚¹å‡»æäº¤æŒ‰é’®ï¼Œä¸Šä¼ åˆ°æœåŠ¡ç«¯ï¼Œæ–‡ä»¶å­˜åˆ°ç£ç›˜å¯¹åº”ç›®å½•[服务端的存放路径],相应的信息写到数据库表
        æŠ€æœ¯ï¼š    æ–‡ä»¶ä¸Šä¼ ã€æ–­ç‚¹ç»­ä¼ 
        æ–‡ä»¶æ‰“包:所有文件打包成一个安装包,作为全量更新的安装包
        æ•°æ®åº“表:版本信息表--写入
3星 9、视频存储管理
        å…ˆé“ºåž«ä¸€ä¸‹ï¼šè§†é¢‘文件在哪里?
        å­˜åœ¨ç¡¬ç›˜å½•像机里面
        æ‘„像头--数据线--硬盘录像机[存视频文件]--软件服务端--MySQL数据库[存信息]
                                                    |
                                                  å®¢æˆ·ç«¯
        ç®¡ç†è§†é¢‘文件:
            è¿žä¸Šæ¯ä¸€ä¸ªç¡¬ç›˜å½•像机--查看对应的摄像头目录下都有哪些视频文件
            è¿˜å¯ä»¥è°ƒæ•´ä¸€ä¸‹æ‘„像头对应的文件夹名字--默认是摄像头id
        åŠ¨ä½œï¼šæŸ¥è¯¢ã€ä¿®æ”¹
             å¢žåŠ --是摄像头的事情
        [还可以加上UI来显示,操作会更加方便]
        è®¾ç½®è¦†ç›–周期:只会保存多久的视频--30天、60天...
        è®¾ç½®æ¯ä¸ªè§†é¢‘文件的时长:5min,10min......
        å“ç‰Œï¼š
            æµ·åº·å¨è§†ã€å¤§åŽã€å®‡è§†ç§‘技等[全国前三]
4星 10、活体检测处理
4星 11、推送、通知管理
        æœ¬è´¨ï¼šç¾¤å‘,给所有在线的客户端群发的
        ä»€ä¹ˆæ—¶å€™å‘? æœ‰æ–°é€šçŸ¥çš„æ—¶å€™ï¼Œç¾¤å‘
            ç¾¤å‘之后,要记录每一个已经发过的账号信息
            å¦‚果后面在登录,要判断是否已经发过某一条通知,没发过的接着发,发过的不要再发了
        æŽ¨é€è®°å½•表:id、用户名、通知id、发送时间、状态
        é€šçŸ¥ä¿¡æ¯è¡¨: id、通知标题、通知内容、创建时间、状态、用户id
        ç®¡ç†é€šçŸ¥ï¼š
            å¢žåˆ æ”¹æŸ¥
            æœ€å¥½æ˜¯ç”¨ä¸€ä¸ªui界面管理一下相关的通知
        ä¿è¯æ‰€æœ‰ç™»å½•成功的用户,都能收到一次最新的通知
        ã€å‚考邮件系统】
        é€šçŸ¥ï¼šè¿˜å¯ä»¥æœ‰æŽ¨é€çš„记录,以及阅读的状态:未读、已读
==================================================================================
        ä¸šåŠ¡åˆ†ç¦»ï¼šåªè¦æ˜¯è‡ªå·±ä¸šåŠ¡ç›¸å…³çš„ï¼Œä¸ç®¡åœ¨å®¢æˆ·ç«¯è¿˜æ˜¯æœåŠ¡ç«¯ï¼Œ          éƒ½è¦å†™ä»£ç åŽ»å®žçŽ°
        å‰åŽåˆ†ç¦»ï¼šåˆ†ç•Œçº¿æ˜¯ï¼šå‰ç«¯(客户端),后端(服务端)
                  å‰ç«¯åªåšå‰ç«¯çš„业务
                  åŽç«¯åªåšåŽç«¯çš„业务
                   å‰åŽçš„业务通信,需要商量好特定的格式
        ---------------------------------------
        ä¸šåŠ¡åˆ†ç¦»ï¼š å¿…须得2个端的开发语言一样
        å‰åŽåˆ†ç¦»ï¼š 2个端开发的语言不一样时,就得使用
        ---------------------------------------
        çŽ°åœ¨çš„é¡¹ç›®ï¼šé‡‡ç”¨ä¸šåŠ¡åˆ†ç¦»çš„æ–¹å¼
==============================================================================================
        åˆä»£ç çš„一些细节:
        1、客户端的代码合并
            A、保证所有模块使用同一个套接字,这样收包的时候,就统一在一个地方了
            B、模块对应的类名,一定要根据功能来命名,不允许使用默认的名字
            C、合代码的原则:尽量少修改的原则,只需要在主模块添加适当的代码为主
                å­æ¨¡å—的功能保持不动
            D、合代码之后,保证原有的功能不会被修改,且不影响其他模块的使用
        2、服务端的代码合并
            A、自己的子服务模块要先合并好,是一种被动调用的方式
            B、客户端的业务要合到服务端来时,要用类的方式来合并[xx.h,xx.cpp]