nyj
2025-07-02 bcced73493348117c9f3316513718b23459d6f33
¹¦ÄÜÄ£¿é_½éÉÜ.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]