精华内容
下载资源
问答
  • Git---查看提交历史记录

    千次阅读 2017-06-07 18:43:09
    我们是如何记录我们的人生----日记,如果你那闲来无事可以翻一翻,说明我们都是有故事的人,哈哈,如果我们想要查看Git提交历史记录,怎么办? 1.查看提交历史 语法:git log commit d521dd00f9b8cc3e54064abb...

    概述:

    我们是如何记录我们的人生----日记,如果你那天闲来无事可以翻一翻,说明我们都是有故事的人,哈哈,如果我们想要查看Git提交历史记录,怎么办?

    1.查看提交历史

    语法:git log

    commit d521dd00f9b8cc3e54064abb3d8125d88e6ba412
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 17:28:47 2017 +0800
    
        Hello
    
    commit 9ddce59dbacb7160fab09c4da14523e609e9428a
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 17:03:45 2017 +0800
    
        将计就计
    
    commit e9128101a2572cf0b2398ca5a281c796676d0352
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 16:58:54 2017 +0800
    
        我提交了README
    
    commit 6ada7cad2883d636837d6072aa27cbc8f07988cb
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 16:24:38 2017 +0800
    
        D:/install/Git/aa
    
    commit 063c0f280259c2d2a97abc08bc27dbe0b01e6e6f
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 09:10:29 2017 +0800
    
        README
    
    总结:

    • 1.时间是倒序
    • 2.commit 后面就是计算出来的SHA-1校验
    • 3.Author 提交人 这个是在配置git config 时候配置的
    • 4.Date:提交日期
    • 5.提交内容(提交时候的注释)

    那么问题来,如果有很多历史记录,我想看特定记录,是不是需要检索和筛选功能?

    常用的参数 -p 表示每次提交的内容差异(类似使用 git diff)   -2 表示最近两次提交

    $ git log -p -2
    commit d521dd00f9b8cc3e54064abb3d8125d88e6ba412
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 17:28:47 2017 +0800
    
        Hello
    
    diff --git a/README b/README
    deleted file mode 100644
    index abe187b..0000000
    --- a/README
    +++ /dev/null
    @@ -1 +0,0 @@
    -将计就计
    diff --git "a/~/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243 - \345\211\257\346\234\254 (2).txt" "b/~/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243 - \345\211\257\346\234\254 (2).txt"
    deleted file mode 100644
    index e69de29..0000000
    diff --git "a/~/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243 - \345\211\257\346\234\254 - \345\211\257\346\234\254.txt" "b/~/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243 - \345\211\257\346\234\254 - \345\211\257\346\234\254.txt"
    deleted file mode 100644
    index e69de29..0000000
    diff --git "a/~/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243 - \345\211\257\346\234\254.txt" "b/~/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243 - \345\211\257\346\234\254.txt"
    deleted file mode 100644
    index e69de29..0000000
    diff --git "a/~/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt" "b/~/\346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt"
    deleted file mode 100644
    index e69de29..0000000
    
    commit 9ddce59dbacb7160fab09c4da14523e609e9428a
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 17:03:45 2017 +0800
    
        将计就计
    
    diff --git a/README b/README
    index 1a4cca6..abe187b 100644
    --- a/README
    +++ b/README
    @@ -1,2 +1 @@
    -Hello World!
    -Hello World 这行是我新写的
    +将计就计
    (END)
    
    总结:

    • diff表示两个文件不同
    • index(索引)提交动作产生索引
    • -HelloWorld! 前面-表示删除
    • +将计就计 前面+表示添加

    看一些统计信息用--stat

    $ git log --stat
    commit d521dd00f9b8cc3e54064abb3d8125d88e6ba412
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 17:28:47 2017 +0800
    
        Hello
    
     README                                                                   | 1 -
     ...6\234\254\346\226\207\346\241\243 - \345\211\257\346\234\254 (2).txt" | 0
     ...46\241\243 - \345\211\257\346\234\254 - \345\211\257\346\234\254.txt" | 0
     ...7\346\234\254\346\226\207\346\241\243 - \345\211\257\346\234\254.txt" | 0
     ...\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt" | 0
     5 files changed, 1 deletion(-)
    
    commit 9ddce59dbacb7160fab09c4da14523e609e9428a
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 17:03:45 2017 +0800
    
        将计就计
    
     README | 3 +--
     1 file changed, 1 insertion(+), 2 deletions(-)
    
    commit e9128101a2572cf0b2398ca5a281c796676d0352
    :
    
    总结:文件被新增删除记录都会被保存

    看见最后的冒号(:)表示还有记录,回车就看到

    现在看起来格式不符合要求,写过用java输出XML文件要想格式变得好看,format.pretty常量,git也是这样的

    语法:git log --pretty = oneline    (oneline表示显式一行=SHA-1+注释) ,当然还有其他值,例如:short、full、fuller

    $ git log -2 --pretty=oneline
    d521dd00f9b8cc3e54064abb3d8125d88e6ba412 Hello
    9ddce59dbacb7160fab09c4da14523e609e9428a 将计就计
    
    如果这个你看起来不爽,可以自定义

    语法:git log --pretty=format:"你的规则" (注意等号两边不能有空格)

    $ git log --pretty=format:"%h - %an, %ar : %s"  -2
    d521dd0 - chenliang, 51 minutes ago : Hello
    9ddce59 - chenliang, 76 minutes ago : 将计就计
    
    选项	  说明
    %H    提交对象(commit)的完整哈希字串
    
    %h    提交对象的简短哈希字串
    
    %T    树对象(tree)的完整哈希字串
    
    %t    树对象的简短哈希字串
    
    %P    父对象(parent)的完整哈希字串
    
    %p    父对象的简短哈希字串
    
    %an   作者(author)的名字
    
    %ae   作者的电子邮件地址
    
    %ad   作者修订日期(可以用 --date= 选项定制格式)
    
    %ar   作者修订日期,按多久以前的方式显示
    
    %cn   提交者(committer)的名字
    
    %ce   提交者的电子邮件地址
    
    %cd   提交日期
    
    %cr   提交日期,按多久以前的方式显示
    
    %s    提交说明

    如果你还觉得不够,最后一招,--graph,用图形拯救你,不过在分支合并时候展示非凡的特效

    语法: git log --pretty=format:"%h  %s"  --grapth   (注意是两个短杠)

    *   2e78057 Merge branch 'master' into smoke
    |\
    | * b93ec95 Make another attempt to identify new and deleted files in Grit#Diff
    | * 00ed843 Ensure RubyGit's diff matches real Git's output
    | * 5012845 Fix RubyGit's diff to detect additions and deletions
    | * fcd9228 use a \t to avoid tab => space conversion
    * | 7b3b447 add contributing section to readme
    * | c701103 have Commit#short_message use first non-empty message line. closes gh-1.
    * |   1af4e64 Merge commit 'b06e7ff41ad95b6fe1dbd08df7530c9d5bf76840' into smoke
    |\ \
    | * | b06e7ff a few lines on gems required for testing
    * | | d5cde35 windows support
    * | | 797d75e update history
    * | |   0bbd902 Merge commit 'a88d1d96985074db9c37f3f50a45fd089d8b4a12' into smoke
    |\ \ \
    :
    


    当然git log 还有其他参数如下:

    -p     按补丁格式显示每个更新之间的差异。
    
    --stat  显示每次更新的文件修改统计信息。
    
    --shortstat  只显示 --stat 中最后的行数修改添加移除统计。
    
    --name-only   仅在提交信息后显示已修改的文件清单。
    
    --name-status   显示新增、修改、删除的文件清单。
    
    --abbrev-commit  仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
    
    --relative-date  使用较短的相对时间显示(比如,“2 weeks ago”)。
    
    --graph   显示 ASCII 图形表示的分支合并历史。
    
    --pretty   使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。

    2.限制输出长度

    语法:git log  参数=值

    $ git log --since=2.weeks
    commit d521dd00f9b8cc3e54064abb3d8125d88e6ba412
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 17:28:47 2017 +0800
    
        Hello
    
    commit 9ddce59dbacb7160fab09c4da14523e609e9428a
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 17:03:45 2017 +0800
    
        将计就计
    
    commit e9128101a2572cf0b2398ca5a281c796676d0352
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 16:58:54 2017 +0800
    
        我提交了README
    
    commit 6ada7cad2883d636837d6072aa27cbc8f07988cb
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 16:24:38 2017 +0800
    
        D:/install/Git/aa
    :
    
    如果你想看你提交某个字符串关键字

    $ git log -S '将计就计'
    commit d521dd00f9b8cc3e54064abb3d8125d88e6ba412
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 17:28:47 2017 +0800
    
        Hello
    
    commit 9ddce59dbacb7160fab09c4da14523e609e9428a
    Author: chenliang <1040101694@qq.com>
    Date:   Wed Jun 7 17:03:45 2017 +0800
    
        将计就计
    
    其他选选项

    -(n)   仅显示最近的 n 条提交
    
    --since, --after  仅显示指定时间之后的提交。
    
    --until, --before  仅显示指定时间之前的提交。
    
    --author  仅显示指定作者相关的提交。
    
    --committer  仅显示指定提交者相关的提交。
    
    --grep  仅显示含指定关键字的提交
    
    -S  仅显示添加或移除了某个关键字的提交
    
    总结:主要对于git log 展示和检索过滤数据。
    展开全文
  • 用户可以使用应用程序栏按钮查看过去 7 的曲目以及曲目历史记录。 指示 从 Lumia 开发人员库了解 Lumia SensorCore SDK。 该示例需要 Lumia SensorCore SDK 的 NuGet 包,但会在首次构建时自动检索(如果丢失)...
  • 在Linux系统的环境下,不管是root用户还是其它的用户只有登陆系统后用进入操作我们都可以通过命令history来查看历史记录。可是假如一台服务器多人登陆,一因为某人误操作了删除 了重要的数据。这时候通...

    2019-01-07


     

    转自  https://www.cnblogs.com/kevingrace/p/7373146.html

    centos 7 查看所有登录用户的操作历史

    在Linux系统的环境下,不管是root用户还是其它的用户只有登陆系统后用进入操作我们都可以通过命令history来查看历史记录。可是假如一台服务器多人登陆,一天因为某人误操作了删除

    了重要的数据。这时候通过查看历史记录(命令:history)是没有什么意义了(因为history只针对登录用户下执行有效,即使root用户也无法得到其它用户histotry历史)。那有没有什么
    办法实现通过记录登陆后的IP地址和某用户名所操作的历史记录呢?答案肯定是有的!
      
    通过在/etc/profile文件底部添加以下代码就可以实现:
    [root@test ~]# cat /etc/profile
    ......
    #记录每个用户的操作信息
    export PS1='[\u@\h \w]# '
    history
    USER_IP=`who -u am i 2>/dev/nullawk '{print $NF}'|sed -e 's/[()]//g'`
    if "$USER_IP" "" ]
    then
    USER_IP=`hostname`
    fi
    if [ ! -d /opt/history ]
    then
    mkdir /opt/history
    chmod 777 /opt/history
    fi
    if [ ! -d /opt/history/${LOGNAME} ]
    then
    mkdir /opt/history/${LOGNAME}
    chmod 300 /opt/history/${LOGNAME}
    fi
    export HISTSIZE=4096
    DT=`date +"%Y%m%d_%H%M%S"`
    export HISTFILE="/opt/history/${LOGNAME}/${USER_IP} history.$DT"
    chmod 600 /opt/history/${LOGNAME}/*history* 2>/dev/null
      
    [root@test ~]# source /etc/profile     #使得上面配置生效
      
    上面脚本在系统的/opt下新建个history目录,记录所有登陆过系统的用户和IP地址(文件名),每当用户登录/退出会创建相应的文件,该文件保存这段用户登录时期内操作历史,可以用这个
    方法来监测系统的安全性。
    ------------------------------------------------------------------------------------------------------------------------------------------
    上面的显示跟默认的linux终端显示不太习惯。现在要求终端里切换路径后,只显示当前的简介路径,不显示全部路径,并且后面带上#或$符号,那么只需要将上面的第一行
    PS1参数后面的设置如下:
    1)只显示当前简介路径,不显示全路径,显示#号。注意下面在"#"符号后面空出一格,这样终端的"#"符号跟命令之间就有了一格的距离,习惯而已!
    PS1="[\u@\h \W]# "
    2)只显示当前简介路径,不显示全路径,显示$号。注意下面的"$"符号后面空出一格。
    PS1="[\u@\h \W]\$ "
     
    这里我在脚本选择第(1)种带"#"号显示(也可以两种都不选,直接将第一行PS1的设置给去掉,这样就是默认的了终端显示.线上使用的话,推荐使用这种默认的),生效后的终
    端显示内容和linux默认显示的一样。即export PS1="[\u@\h \W]# "

    转载于:https://www.cnblogs.com/fqxy/p/10234748.html

    展开全文
  • 查看腾讯IM的API,只有一个获取群7天内聊天记录的接口,并且每次只能获取20条,需要循环获取,才能拿到7天内完整记录。 2. 我们的实现方式是,在自己服务器上设置定时任务,每7天跑一次。每次拉取当前时间能拿到的...

    1.需求描述 

      公司使用腾讯IM及时通讯API,但是只能保存7天的聊天记录,公司又不想花钱,而且花钱也只能保存30天。需求是需要存储所有的历史聊天记录,下面记录实现过程。(这里主要是群聊记录)

     

    2.需求分析

      1. 查看腾讯IM的API,只有一个获取群7天内聊天记录的接口,并且每次只能获取20条,需要循环获取,才能拿到7天内完整记录。

      2. 我们的实现方式是,在自己服务器上设置定时任务,每7天跑一次。每次拉取当前时间能拿到的所有的聊天记录,存储在json文件中,并且保存存储记录到mysql表。每次取聊天记录时,都是拿json文件,一个文件读完,拿下一个文件,直到没有,说明拿完了。

    3.主要架构

          SpringBoot , Minio , mysql ,JDK1.8

    4.准备工作

    1.思路: 循环拿到聊天记录,解析,存储到json,保存到minio,存储保存记录

    2.腾讯IM获取聊天记录接口: https://console.tim.qq.com/v4/group_open_http_svc/group_msg_get_simple

     3.返回值示例

    [
        {
            "ActionStatus":"OK",
            "ErrorCode":0,
            "ErrorInfo":"",
            "GroupId":"32453925",
            "IsFinished":1,
            "RspMsgList":[
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Download_Flag":2,
                                "FileName":"新建文本文档.html",
                                "FileSize":15,
                                "UUID":"1400386956-liang_xiao_yu02163.com-YY7npohmbQ3TkK5oj33YHY3JUSPp0JzR",
                                "Url":"http://fdbaad7b7ad11156a9345f9c0ce09ccc-%25E6%2596%25B0%25E5%25BB%25BA%25E6%2596%2587%25E6%259C%25AC%25E6%2596%2587%25E6%25A1%25A3.html"
                            },
                            "MsgType":"TIMFileElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":67439734,
                    "MsgSeq":112,
                    "MsgTimeStamp":1615532610
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Download_Flag":2,
                                "FileName":"nacos-server-1.2.1.tar.gz",
                                "FileSize":56049322,
                                "UUID":"1400386956-liang_xiao_yu02163.com-afI7E0kyNC3ryt5z6jueOgaX3wAaGZM7",
                                "Url":"http:///2058c36e0b68e511c70fc1a9892ed456-nacos-server-1.2.1.tar.gz"
                            },
                            "MsgType":"TIMFileElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":8772338,
                    "MsgSeq":111,
                    "MsgTimeStamp":1615532595
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Download_Flag":2,
                                "FileName":"git-bash.exe.lnk",
                                "FileSize":1111,
                                "UUID":"1400386956-liang_xiao_yu02163.com-6dZ716U306jbD1Yoono71OcO5sji1rRv",
                                "Url":"http://c0deebe77c013f9e24d2328e5e001296-git-bash.exe.lnk"
                            },
                            "MsgType":"TIMFileElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":89026032,
                    "MsgSeq":110,
                    "MsgTimeStamp":1615532577
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Download_Flag":2,
                                "FileName":"翻译库.xls",
                                "FileSize":18432,
                                "UUID":"1400386956-liang_xiao_yu02163.com-RWC1yaAnuWAzghCHnWWEC7L2f0zx8A5e",
                                "Url":"http:///c69f8aba2ec030ed28966b1953843cc1-%25E7%25BF%25BB%25E8%25AF%2591%25E5%25BA%2593.xls"
                            },
                            "MsgType":"TIMFileElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":51468666,
                    "MsgSeq":109,
                    "MsgTimeStamp":1615532514
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Download_Flag":2,
                                "FileName":"nginx安装.txt",
                                "FileSize":348,
                                "UUID":"1400386956-liang_xiao_yu02163.com-nQHsFrwroDPgXXM6IvOKFZLHnzKm3c32",
                                "Url":"http:///bdde4cfdca2f1edbc011d91fbeb1ee79-nginx%25E5%25AE%2589%25E8%25A3%2585.txt"
                            },
                            "MsgType":"TIMFileElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":74013271,
                    "MsgSeq":108,
                    "MsgTimeStamp":1615532449
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "ImageFormat":1,
                                "ImageInfoArray":[
                                    {
                                        "Height":700,
                                        "Size":47941,
                                        "Type":1,
                                        "URL":"http://1615860236_1.jpg",
                                        "Width":700
                                    },
                                    {
                                        "Height":0,
                                        "Size":0,
                                        "Type":2,
                                        "URL":"http://1615860236_2.jpg",
                                        "Width":0
                                    },
                                    {
                                        "Height":198,
                                        "Size":0,
                                        "Type":3,
                                        "URL":"http://1615860236_3.jpg",
                                        "Width":198
                                    }
                                ],
                                "UUID":"1400386956-liang_xiao_yu02163.com-SSj86z7JcqEojmHVZ1VxFQtD36bu56mI"
                            },
                            "MsgType":"TIMImageElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":42015977,
                    "MsgSeq":107,
                    "MsgTimeStamp":1615444791
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Text":"Fgg"
                            },
                            "MsgType":"TIMTextElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":3848154861,
                    "MsgSeq":106,
                    "MsgTimeStamp":1615425082
                },
                {
                    "From_Account":"@TIM#SYSTEM",
                    "IsPlaceMsg":0,
                    "MsgBody":{
                        "MsgOperatorMemberExtraInfo":{
                            "Role":0,
                            "UserId":"administrator",
                            "User_Account":"administrator"
                        },
                        "MsgGroupNewInfo":{
                            "GroupName":"ttt_Asia"
                        },
                        "OpType":6,
                        "Operator_Account":"administrator"
                    },
                    "MsgPriority":2,
                    "MsgRandom":521393613,
                    "MsgSeq":105,
                    "MsgTimeStamp":1615381923
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Text":"YCYUP NCNBB
    "
                            },
                            "MsgType":"TIMTextElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":71490868,
                    "MsgSeq":104,
                    "MsgTimeStamp":1615380723
                },
                {
                    "From_Account":"administrator",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Text":"Welcome to WingHome! How can I help you today?"
                            },
                            "MsgType":"TIMTextElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":4294967295,
                    "MsgSeq":103,
                    "MsgTimeStamp":1615378320
                },
                {
                    "From_Account":"lxy111555999163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Text":"tuo"
                            },
                            "MsgType":"TIMTextElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":507636496,
                    "MsgSeq":102,
                    "MsgTimeStamp":1615378315
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Text":"对对对"
                            },
                            "MsgType":"TIMTextElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":16438472,
                    "MsgSeq":101,
                    "MsgTimeStamp":1615377891
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Text":"对对对"
                            },
                            "MsgType":"TIMTextElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":24367062,
                    "MsgSeq":100,
                    "MsgTimeStamp":1615377883
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Text":"阿发的发达法法发发的发发  阿手动阀是打发点阿发达 阿斯顿发发大轨道射灯
    1、【User manual】  https://drive.google.com/drive/folders/1H4SY5p_eqzjxzee9UBFHTkT_AWZO0efI?usp=sharing"
                            },
                            "MsgType":"TIMTextElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":95125712,
                    "MsgSeq":99,
                    "MsgTimeStamp":1615377796
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Text":"大家咖啡和打开了法式发开发建安费安居房来看待fadfjakdfjadfkljdfakdfja的福利卡的激发了快递费发jdfkl打发打发打发打发打发打发打发"
                            },
                            "MsgType":"TIMTextElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":55722669,
                    "MsgSeq":98,
                    "MsgTimeStamp":1615377768
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Text":"打发
    大法师打发"
                            },
                            "MsgType":"TIMTextElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":46653736,
                    "MsgSeq":97,
                    "MsgTimeStamp":1615377716
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "Text":"订单
    大幅度"
                            },
                            "MsgType":"TIMTextElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":14316464,
                    "MsgSeq":96,
                    "MsgTimeStamp":1615377708
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "ImageFormat":3,
                                "ImageInfoArray":[
                                    {
                                        "Height":1025,
                                        "Size":91694,
                                        "Type":1,
                                        "URL":"http://1615860237_1.PNG",
                                        "Width":1652
                                    },
                                    {
                                        "Height":0,
                                        "Size":0,
                                        "Type":2,
                                        "URL":"http://1615860237_2.PNG",
                                        "Width":0
                                    },
                                    {
                                        "Height":198,
                                        "Size":0,
                                        "Type":3,
                                        "URL":"http:///1615860237_3.PNG",
                                        "Width":320
                                    }
                                ],
                                "UUID":"1400386956-liang_xiao_yu02163.com-AtsNECl1HP55DokcCSAsneqqIJ9pyaku"
                            },
                            "MsgType":"TIMImageElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":99829389,
                    "MsgSeq":95,
                    "MsgTimeStamp":1615377696
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "ThumbDownloadFlag":2,
                                "ThumbFormat":"png",
                                "ThumbHeight":200,
                                "ThumbSize":1668,
                                "ThumbUUID":"1400386956-liang_xiao_yu02163.com-4WJCh1B3Bhnx0prAMKwT4ASeLOArpF1Z",
                                "ThumbUrl":"http://1615860239.mp4",
                                "ThumbWidth":200,
                                "VideoDownloadFlag":2,
                                "VideoFormat":"mp4",
                                "VideoSecond":0,
                                "VideoSize":3373894,
                                "VideoUUID":"1400386956-liang_xiao_yu02163.com-V0i81DKCmvWPwPFP43Hsr7i30YA7DgJX",
                                "VideoUrl":"https://e4b1-shanghai-007-shared-06-1256635546.cos.ap-shanghai.myqcloud.com/19dc-1400386956/5f62-liang_xiao_yu02163.com/f555f6ad99f32106712600580650ce3e-2de58c2f5a97584418de6752f1668aad.mp4"
                            },
                            "MsgType":"TIMVideoFileElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":14396311,
                    "MsgSeq":94,
                    "MsgTimeStamp":1615377647
                },
                {
                    "From_Account":"liang_xiao_yu02163.com",
                    "IsPlaceMsg":0,
                    "MsgBody":[
                        {
                            "MsgContent":{
                                "ThumbDownloadFlag":2,
                                "ThumbFormat":"",
                                "ThumbHeight":108,
                                "ThumbSize":55058,
                                "ThumbUUID":"1400386956_liang_xiao_yu02163.com_782ff4f2e422e6c5d94daa3a6bf0503b.com_snapshot_1615376801",
                                "ThumbUrl":"http://32453925/1615860241.mp4",
                                "ThumbWidth":192,
                                "VideoDownloadFlag":2,
                                "VideoFormat":"mp4",
                                "VideoSecond":10,
                                "VideoSize":3373894,
                                "VideoUUID":"1400386956_liang_xiao_yu02163.com_2de58c2f5a97584418de6752f1668aad.mp4",
                                "VideoUrl":"https://cos.ap-shanghai.myqcloud.com/e4b1-shanghai-007-shared-06-1256635546/19dc-1400386956/5f62-liang_xiao_yu02163.com/2de58c2f5a97584418de6752f1668aad.mp4"
                            },
                            "MsgType":"TIMVideoFileElem"
                        }
                    ],
                    "MsgPriority":2,
                    "MsgRandom":3800462492,
                    "MsgSeq":93,
                    "MsgTimeStamp":1615376803
                }
            ]
        }
    ]

    5. 具体实现

        PS:因为不仅仅要存储文本聊天记录,还有存储聊天记录里的图片,视频,文件等,所以我们需要解析之后,把里面的文件自己存储起来,再将存储地址替换tx聊天记录的地址。

    1.构建解析对象:

    调API接收的结果对象:

    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class ImResult implements Serializable {
    	
    	private static final long serialVersionUID = 1L;
    	
    	@ApiModelProperty("请求处理的结果,OK 表示处理成功,FAIL 表示失败")
    	@JsonProperty(value="ActionStatus")
    	@JSONField(name = "ActionStatus")
    	private String ActionStatus;
    	
    	@ApiModelProperty("错误码,0表示成功,非0表示失败")
    	@JsonProperty(value="ErrorCode")
    	@JSONField(name = "ErrorCode")
    	private Integer ErrorCode;
    
    	@ApiModelProperty("错误信息")
    	@JsonProperty(value="ErrorInfo")
    	@JSONField(name = "ErrorInfo")
    	private String ErrorInfo;
    	
    	@ApiModelProperty("请求中的群组 ID")
    	@JsonProperty(value="GroupId")
    	@JSONField(name = "GroupId")
    	private String GroupId;
    
    	@ApiModelProperty("是否完成获取所有消息:0未完成 1已完成")
    	@JsonProperty(value="IsFinished")
    	@JSONField(name = "IsFinished")
    	private Integer IsFinished;
    
    	@ApiModelProperty("返回的消息列表")
    	@JsonProperty(value="RspMsgList")
    	@JSONField(name = "RspMsgList")
    	private List<ImMsgBody> RspMsgList;
    
    }
    

    消息列表对象

    /**
     * @author:yuchen
     * @createTime:2021/3/11 10:38
     */
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class ImMsgBody<T> implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @ApiModelProperty("消息的发送者")
        @JsonProperty(value="From_Account")
        @JSONField(name = "From_Account")
        private String From_Account;
    
        @ApiModelProperty("MsgBody 为空,该字段为1,撤回的消息,该字段为2")
        @JsonProperty(value="IsPlaceMsg")
        @JSONField(name = "IsPlaceMsg")
        private Integer IsPlaceMsg;
    
        @ApiModelProperty("消息内容")
        @JsonProperty(value="MsgBody")
        @JSONField(name = "MsgBody")
        private T MsgBody;
    
        @ApiModelProperty("消息的优先级")
        @JsonProperty(value="MsgPriority")
        @JSONField(name = "MsgPriority")
        private Integer MsgPriority;
    
        @ApiModelProperty("消息随机值,用于对消息去重")
        @JsonProperty(value="MsgRandom")
        @JSONField(name = "MsgRandom")
        private Long MsgRandom;
    
        @ApiModelProperty("消息 seq,用于标识唯一消息,值越小发送的越早")
        @JsonProperty(value="MsgSeq")
        @JSONField(name = "MsgSeq")
        private Integer MsgSeq;
    
        @ApiModelProperty("消息被发送的时间戳,server 的时间")
        @JsonProperty(value="MsgTimeStamp")
        @JSONField(name = "MsgTimeStamp")
        private Long MsgTimeStamp;
    
    
    }
    

    消息体对象

    /**
     * @author:yuchen
     * @createTime:2021/3/11 10:38
     */
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class MsgBody<T> implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @ApiModelProperty("消息类型")
        @JsonProperty(value="MsgType")
        @JSONField(name = "MsgType")
        private String MsgType;
    
        @ApiModelProperty("消息内容")
        @JsonProperty(value="MsgContent")
        @JSONField(name = "MsgContent")
        private T MsgContent;
    
    
    }

    消息内容对象

    图片内容对象

    /**
     * @author:yuchen
     * @createTime:2021/3/11 10:38
     */
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class ImgMsgContent implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @JsonProperty(value="ImageInfoArray")
        @JSONField(name = "ImageInfoArray")
        private List<ImgMsg> ImageInfoArray;
    
        @JsonProperty(value="UUID")
        @JSONField(name = "UUID")
        private String UUID;
    
        @JsonProperty(value="ImageFormat")
        @JSONField(name = "ImageFormat")
        private Integer ImageFormat;
    
    
    }
    /**
     * @author:yuchen
     * @createTime:2021/3/11 10:38
     */
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class ImgMsg implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @JsonProperty(value="Type")
        @JSONField(name = "Type")
        private Integer Type;
    
        @JsonProperty(value="Size")
        @JSONField(name = "Size")
        private Integer Size;
    
        @JsonProperty(value="Height")
        @JSONField(name = "Height")
        private Integer Height;
    
        @JsonProperty(value="Width")
        @JSONField(name = "Width")
        private Integer Width;
    
        @JsonProperty(value="URL")
        @JSONField(name = "URL")
        private String URL;
    
    }
    

    视频内容对象

    
    /**
     * @author:yuchen
     * @createTime:2021/3/11 10:38
     * 视频聊天记录消息结构
     */
    @Data
    public class VedioMsgContent implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @JsonProperty(value = "ThumbFormat")
        @JSONField(name = "ThumbFormat")
        private String ThumbFormat;
    
        @JsonProperty(value = "ThumbSize")
        @JSONField(name = "ThumbSize")
        private Long ThumbSize;
    
        @JsonProperty(value = "ThumbUUID")
        @JSONField(name = "ThumbUUID")
        private String ThumbUUID;
    
        @JsonProperty(value = "VideoDownloadFlag")
        @JSONField(name = "VideoDownloadFlag")
        private Integer VideoDownloadFlag;
    
        @JsonProperty(value = "ThumbUrl")
        @JSONField(name = "ThumbUrl")
        private String ThumbUrl;
    
        @JsonProperty(value = "VideoFormat")
        @JSONField(name = "VideoFormat")
        private String VideoFormat;
    
        @JsonProperty(value = "VideoUrl")
        @JSONField(name = "VideoUrl")
        private String VideoUrl;
    
        @JsonProperty(value = "VideoUUID")
        @JSONField(name = "VideoUUID")
        private String VideoUUID;
    
        @JsonProperty(value = "VideoSecond")
        @JSONField(name = "VideoSecond")
        private Integer VideoSecond;
    
        @JsonProperty(value = "ThumbDownloadFlag")
        @JSONField(name = "ThumbDownloadFlag")
        private Integer ThumbDownloadFlag;
    
        @JsonProperty(value = "VideoSize")
        @JSONField(name = "VideoSize")
        private Long VideoSize;
    
        @JsonProperty(value = "ThumbHeight")
        @JSONField(name = "ThumbHeight")
        private Integer ThumbHeight;
    
        @JsonProperty(value = "ThumbWidth")
        @JSONField(name = "ThumbWidth")
        private Integer ThumbWidth;
    }
    

    文件内容对象

    /**
     * @author:yuchen
     * @createTime:2021/3/11 10:38
     */
    @Data
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class FileMsgContent implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @JsonProperty(value="Download_Flag")
        @JSONField(name = "Download_Flag")
        private Integer Download_Flag;
    
        @JsonProperty(value="FileName")
        @JSONField(name = "FileName")
        private String FileName;
    
        @JsonProperty(value="Url")
        @JSONField(name = "Url")
        private String Url;
    
        @JsonProperty(value="UUID")
        @JSONField(name = "UUID")
        private String UUID;
    
        @JsonProperty(value="FileSize")
        @JSONField(name = "FileSize")
        private Long FileSize;
    }
    

     

    2 调API获取聊天记录

    public ImResult getGroupMsg(String groupId, Integer reqMsgSeq) {
            ObjectNode object = JsonNodeFactory.instance.objectNode();
            object.put("GroupId", groupId);
            if (null != reqMsgSeq && 0 != reqMsgSeq) {
                object.put("ReqMsgSeq", reqMsgSeq);
            }
            object.put("ReqMsgNumber", 20);
            log.info(object.toString());
            HttpResult httpResult = null;
            try {
                httpResult = restApiClient.makeRestApiRequest(object.toString(), ContantIMUrl.generateAPI(ContantIMUrl.METHOD_GET_MSG_BY_GROUP));
            } catch (Exception e) {
                log.error("getGroupMsg,Error:", e);
            }
            return JSON.parseObject(JSON.toJSONBytes(JSON.parse(httpResult.getBody())), ImResult.class);
        }

    3. 循环获取所有的聊天记录

    public List<ImResult> getGroupMsgAll(String groupId) {
            List<ImResult> results = new ArrayList<>();
            int reqMsgSeq = 0;
            boolean flag = false;
            List<ImMsgBody> rspMsgList;
            ImResult result;
            do {
                result = getGroupMsg(groupId, reqMsgSeq);
                rspMsgList = result.getRspMsgList();
                if (rspMsgList != null) {
                    // 移除指定对象
                    rspMsgList.removeIf(imMsgBody -> imMsgBody.getIsPlaceMsg() != 0);
                    int msgSize = rspMsgList.size();
                    if (msgSize != 0) {
                        // 遍历消息,如果消息是图片,视频就保存文件服务器,返回地址,重新存进去
                        rspMsgList = saveImgOrVideo(rspMsgList, groupId);
                        result.setRspMsgList(rspMsgList);
                        results.add(result);
                        if (msgSize > 1) {
                            reqMsgSeq = rspMsgList.get(msgSize - 1).getMsgSeq() - 1;
                            if(reqMsgSeq == 0){
                                // 说明消息读完了,跳出循环
                                flag = false;
                            }else {
                                // 否则继续读
                                flag = true;
                            }
                        } else {
                            flag = false;
                        }
                    } else {
                        flag = false;
                    }
                }
            } while (flag);
            return results;
        }

    4.获取聊天记录的过程中,存储图片,视频,文件

    private List<ImMsgBody> saveImgOrVideo(List<ImMsgBody> rspMsgList, String groupId) {
            rspMsgList.forEach(
                    imMsgBody -> {
                        try {
                            List<MsgBody> msgBodys = JSONObject.parseArray(JSONArray.toJSONString(imMsgBody.getMsgBody()), MsgBody.class);
                            if (msgBodys != null && msgBodys.get(0) != null) {
                                MsgBody msgBody = msgBodys.get(0);
                                String msgType = msgBody.getMsgType();
                                if (msgType != null) {
                                    if ("TIMImageElem".equalsIgnoreCase(msgType)) {
                                        log.info("存图片");
                                        ImgMsgContent img = JSON.parseObject(JSON.toJSONBytes(msgBody.getMsgContent()), ImgMsgContent.class);
                                        List<ImgMsg> img1 = img.getImageInfoArray();
                                        img1.forEach(imgMsg -> {
                                            FileInputStream fileInputStream = null;
                                            File fileByUrl = null;
                                            try {
                                                // 根据url下载图片
                                                fileByUrl = FileUtil.getFileByUrl(imgMsg.getURL());
                                                fileInputStream = new FileInputStream(fileByUrl);
                                                String newName = DateUtil.currentSeconds() + "_" + imgMsg.getType() + FileUtil.getFileType(imgMsg.getURL());
                                                String fileObject = Contant.IM_IMG + groupId + "/" + newName;
                                                // 存储图片
                                                minioUtil.putObject(minioConfig.getBucketName(), fileObject, fileInputStream);
                                                String url = minioUtil.getObjectUrl(minioConfig.getBucketName(), fileObject);
                                                log.info("Minio存储Img");
                                                // 更新图片地址
                                                imgMsg.setURL(url);
                                            } catch (Exception ignored) {
                                                // 如果出异常了,就不更新聊天记录的图片了
                                            } finally {
                                                if (fileInputStream != null) {
                                                    try {
                                                        fileInputStream.close();
                                                    } catch (IOException ignored) {
                                                    }
                                                }
                                                if (fileByUrl != null) {
                                                    fileByUrl.delete();
                                                }
                                            }
                                        });
                                        img.setImageInfoArray(img1);
                                        msgBody.setMsgContent(img);
                                        msgBodys.clear();
                                        msgBodys.add(msgBody);
                                        imMsgBody.setMsgBody(msgBodys);
    
                                    } else if ("TIMVideoFileElem".equalsIgnoreCase(msgType)) {
                                        log.info("存视频");
                                        VedioMsgContent img = JSON.parseObject(JSON.toJSONBytes(msgBody.getMsgContent()), VedioMsgContent.class);
                                        FileInputStream fileInputStream = null;
                                        File fileByUrl = null;
                                        try {
                                            // 根据url下载图片
                                            fileByUrl = FileUtil.getFileByUrl(img.getThumbUrl());
                                            fileInputStream = new FileInputStream(fileByUrl);
                                            String newName = DateUtil.currentSeconds() + "_Thumb" + FileUtil.getFileType(img.getThumbUrl());
                                            String fileObject = Contant.IM_IMG + groupId + "/" + newName;
                                            // 存储图片
                                            minioUtil.putObject(minioConfig.getBucketName(), fileObject, fileInputStream);
                                            String url = minioUtil.getObjectUrl(minioConfig.getBucketName(), fileObject);
                                            log.info("Minio存储缩略图");
                                            img.setThumbUrl(url);
                                            try {
                                                fileInputStream.close();
                                            } catch (IOException ignored) {
                                            }
                                            fileByUrl.delete();
                                            // 根据url下载图片
                                            fileByUrl = FileUtil.getFileByUrl(img.getVideoUrl());
                                            fileInputStream = new FileInputStream(fileByUrl);
                                            String newMp4Name = DateUtil.currentSeconds() + FileUtil.getFileType(img.getVideoUrl());
                                            String mp4Object = Contant.IM_VEDIO + groupId + "/" + newMp4Name;
                                            // 存储图片
                                            minioUtil.putObject(minioConfig.getBucketName(), mp4Object, fileInputStream);
                                            String urlMp4 = minioUtil.getObjectUrl(minioConfig.getBucketName(), mp4Object);
                                            log.info("Minio存储vedio");
                                            img.setVideoUrl(urlMp4);
                                        } catch (Exception ignored) {
                                            // 如果出异常了,就不更新聊天记录的文件
                                        } finally {
                                            if (fileInputStream != null) {
                                                try {
                                                    fileInputStream.close();
                                                } catch (IOException ignored) {
                                                }
                                            }
                                            if (fileByUrl != null) {
                                                fileByUrl.delete();
                                            }
                                        }
                                        msgBody.setMsgContent(img);
                                        msgBodys.clear();
                                        msgBodys.add(msgBody);
                                        imMsgBody.setMsgBody(msgBodys);
                                    } /*else if ("TIMFileElem".equalsIgnoreCase(msgType)) {
                                        log.info("存文件");
                                        FileMsgContent file = JSON.parseObject(JSON.toJSONBytes(msgBody.getMsgContent()), FileMsgContent.class);
                                        FileInputStream fileInputStream = null;
                                        File fileByUrl = null;
                                        try {
                                            // 根据url下载文件
                                            fileByUrl = FileUtil.getFileByUrl(file.getUrl());
                                            fileInputStream = new FileInputStream(fileByUrl);
                                            String fileObject = Contant.IM_FILE + groupId + "/" + fileByUrl.getName();
                                            // 存储图片
                                            minioUtil.putObject(minioConfig.getBucketName(), fileObject, fileInputStream);
                                            String url = minioUtil.getObjectUrl(minioConfig.getBucketName(), fileObject);
                                            log.info("Minio存储文件");
                                            file.setUrl(url);
                                        } catch (Exception ignored) {
                                            // 如果出异常了,就不更新聊天记录的文件
                                        } finally {
                                            if (fileInputStream != null) {
                                                try {
                                                    fileInputStream.close();
                                                } catch (IOException ignored) {
                                                }
                                            }
                                            if (fileByUrl != null) {
                                                fileByUrl.delete();
                                            }
                                        }
                                        msgBody.setMsgContent(file);
                                        msgBodys.clear();
                                        msgBodys.add(msgBody);
                                        imMsgBody.setMsgBody(msgBodys);
                                    }*/
                                }
                            }
                        } catch (Exception ignored) {
                            // 报错说明消息不符合解析格式,不需要处理
                        }
                    }
            );
            return rspMsgList;
        }

    5. 保存解析后的聊天记录

    public SifarResult saveRecordById(String groupId) {
            log.info("群id = {}",groupId);
            SifarResult<GroupRecord> recordResult = customerService.getGroupRecordNew(groupId);
            if ("0".equals(recordResult.getStatu())) {
                List<ImResult> groupMsgAll = getGroupMsgAll(groupId);
                log.info("群id = {},获取聊天记录success",groupId);
                // 保存聊天记录
                int size = groupMsgAll.size();
                if (size > 0) {
                    GroupRecord r1 = recordResult.getContent();
                    log.info("计算seq={}", r1);
                    int seq = 1;
                    if (r1 != null) {
                        seq = r1.getRecordSeq() + 1;
                    }
                    try {
                        // 保存聊天记录
                        String url = saveRecord(groupMsgAll, groupId);
                        log.info("groupId={},聊天记录 url={}",groupId, url);
                        if (url != null) {
                            // 聊天记录开始时间
                            //最开始的消息列表
                            List<ImMsgBody> rspMsg = groupMsgAll.get(size - 1).getRspMsgList();
                            Long startTime = rspMsg.get(rspMsg.size() - 1).getMsgTimeStamp();
                            log.info("聊天记录开始时间={}", startTime);
                            // 聊天记录结束时间
                            Long endTime = groupMsgAll.get(0).getRspMsgList().get(0).getMsgTimeStamp();
                            log.info("聊天记录结束时间={}", endTime);
                            r1 = new GroupRecord();
                            r1.setGroupId(groupId);
                            r1.setRecordUrl(url);
                            r1.setRecordSeq(seq);
                            r1.setStartTime(startTime);
                            r1.setEndTime(endTime);
                            r1.setCreateTime(TimeUtil.GetGreenDate());
                            customerService.saveGroupRecord(r1);
                            log.info("群={},保存聊天记录 success 。。。",groupId);
                        }
                    } catch (Exception e) {
                        log.error("保存聊天记录异常群{},Error:", groupId, e);
                    }
                }
            }
            return SifarResult.success();
        }

    6.保存聊天记录到Minio

     private String saveRecord(List<ImResult> groupMsgAll, String groupId) {
            FileInputStream fileInputStream = null;
            File file = new File(groupId + ".json");
            try {
                FileOutputStream fileOutputStream = new FileOutputStream(file);
                OutputStreamWriter osw = new OutputStreamWriter(fileOutputStream, StandardCharsets.UTF_8);
                String jsonString = JSONObject.toJSONString(groupMsgAll);
                osw.write(jsonString);
                osw.flush();//清空缓冲区,强制输出数据
                osw.close();//关闭输出流
                fileOutputStream.close();
    
                fileInputStream = new FileInputStream(file);
                String newName = DateUtil.format(TimeUtil.GetGreenDate(),"yyyy-MM-dd_HH_mm_ss") + "_" + file.getName();
                String fileObject = Contant.IM_RECORD + groupId + "/" + newName;
                // 存储图片
                minioUtil.putObject(minioConfig.getBucketName(), fileObject, fileInputStream);
                return minioUtil.getObjectUrl(minioConfig.getBucketName(), fileObject);
            } catch (Exception e) {
                log.error("groupId={}保存聊天json文件异常,Error:{}",groupId, e);
            } finally {
                if (fileInputStream != null) {
                    try {
                        fileInputStream.close();
                    } catch (IOException ignored) {
                    }
                }
                file.delete();
            }
            return null;
        }

    7.保存聊天记录的对象

    /**
     * @author yuchen
     * @since 2021-03-12
     */
    @Data
    @EqualsAndHashCode(callSuper = false)
    @Accessors(chain = true)
    @ApiModel(value="GroupRecord对象", description="")
    public class GroupRecord implements Serializable {
    
        private static final long serialVersionUID=1L;
    
        @ApiModelProperty(value = "主键")
        private Integer id;
    
        @ApiModelProperty(value = "群号")
        private String groupId;
    
        @ApiModelProperty(value = "聊天记录文件地址")
        private String recordUrl;
    
        @ApiModelProperty(value = "聊天记录文件seq")
        private Integer recordSeq;
    
        @ApiModelProperty(value = "0不能看 1可以看")
        private Integer browse;
    
        @ApiModelProperty(value = "聊天记录开始时间")
        private Long startTime;
    
        @ApiModelProperty(value = "聊天记录结束时间")
        private Long endTime;
    
        @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        @ApiModelProperty(value = "创建时间")
        private Date createTime;
    
    }
    

     交流群:19514933

     

     

     

    展开全文
  • sar 查看历史负载

    万次阅读 2014-10-10 11:52:18
    默认只保留7天的文件 //查看指定文件CPU使用记录 #sar -f /var/log/sa/sa03 00:00:01 CPU %user %nice %system %iowait %idle 00:10:01 all 52.32 0.00 30.92 1.40 15.37 00:20:01 all
    sar采集结果默认保存在/var/log/sa/目录下, 文件名saxx. 默认只保留7天的文件


    //查看指定文件CPU使用记录
    #sar -f /var/log/sa/sa03
    00:00:01 CPU %user %nice %system %iowait %idle
    00:10:01 all 52.32 0.00 30.92 1.40 15.37
    00:20:01 all 50.11 0.00 28.97 0.82 20.10
    00:30:01 all 45.94 0.00 26.23 0.88 26.95
    00:40:02 all 44.92 0.00 25.54 0.81 28.73
    00:50:01 all 45.34 0.00 26.17 0.77 27.72
    01:00:01 all 43.23 0.00 24.85 0.94 30.97
    01:10:01 all 43.65 0.00 25.15 0.84 30.36
    01:20:01 all 43.13 0.00 24.99 0.92 30.96
    //查看指定文件1/5/15分钟平均负载记录
    #sar -q -f /var/log/sa/sa03
    00:00:01 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
    00:10:01 5 330 15.00 17.72 17.09
    00:20:01 4 331 8.02 13.84 16.11
    00:30:01 4 331 17.79 13.42 14.56
    00:40:02 12 332 11.66 12.31 13.51
    00:50:01 3 326 13.88 12.23 12.90
    01:00:01 26 337 10.10 12.03 12.42
    01:10:01 8 334 12.34 10.78 11.46
    01:20:01 13 329 10.00 11.58 11.49
    //查看指定文件7点到9点CPU使用记录,如要看负载加参数-q
    #sar -s 07:00:00 -e 10:00:00 -f /var/log/sa/sa03
    07:00:01 CPU %user %nice %system %iowait %idle
    07:10:01 all 42.39 0.00 23.54 0.64 33.43
    07:20:01 all 41.42 0.00 24.47 0.77 33.34
    07:30:01 all 42.93 0.00 25.55 0.75 30.77
    07:40:01 all 50.33 0.00 29.08 0.66 19.92
    07:50:01 all 51.40 0.00 30.30 0.69 17.61
    08:00:01 all 47.63 0.00 28.37 0.66 23.34
    08:10:01 all 44.23 0.00 26.30 0.71 28.76
    08:20:01 all 43.46 0.00 24.58 0.58 31.37
    08:30:01 all 43.86 0.00 26.06 0.60 29.49
    08:40:01 all 44.80 0.00 26.86 0.66 27.67
    08:50:02 all 47.46 0.00 27.16 0.51 24.87
    09:00:01 all 46.10 0.00 27.61 0.47 25.81
    09:10:01 all 46.95 0.00 27.95 0.69 24.40
    09:20:02 all 49.30 0.00 28.27 0.79 21.64
    09:30:01 all 49.99 0.00 29.07 0.64 20.30
    09:40:01 all 51.41 0.00 30.75 0.52 17.32
    09:50:01 all 51.49 0.00 30.20 0.66 17.65

    Average: all 46.77 0.00 27.42 0.65 25.16



    1.sar是做什么的? 
    主要负责收集、汇报与存储系统运行信息。

    2.sar怎么控制信息输出的时间间隔和次数? 
    有两个参数非常有用,就是“时间间隔”和“输出次数”。

    例如:sar 0 表示输出的信息是从开机到现在为止的平均值 
    sar 60 5 表示每60秒输出一次,共输出5次,历时300秒。 
    sar 60 0 表示每60秒输出一次,一直到关机为止。注意:sar 0 0 这样是行不通的。

    3.保存sar输出的信息 
    sar提供了一个选项:-o filename。

    例如:sar 5 6 -o sys_info 
    sar -f sys_info 用于读取存储的信息文件,不能使用cat,否则将显示乱码。

    4.如果没有在使用-o时指定保存的文件名,sar会将信息保存在“/var/log/saDD”文件中,其中DD表示当天的日期数字。

    例如:sar 5 6 -o 
    就会保存在/var/log/sa/sa27文件中,当前日期是2011年6月27日。

    5.sar输出查看cpu之外的信息 
    常用选项包括: 
    -b:报告I/O使用情况以及传输速率。(只适用于2.5及之前的内核,所以新内核有可能不支持这个选项) 
    -B:报告“页”使用情况 
    -c:报告进程创建情况 
    -d:报告每一个块设备的使用情况(当你使用时,你会发现在DEV列有类似dev1-7格式的字符串,其中1代表设备的主序号,n代表设备的从序号,而且rd_sec/s列和wr_sec/s列的单位都是512bytes,也就是512B,也就是0.5KB) 
    -I:汇报中断情况 
    -n:汇报网络情况 
    -P:设定CPU 
    -q:汇报队列长度和负载信息 
    -r:汇报内存和交换区使用情况 
    -R:汇报内存情况 
    -u:汇报CPU使用情况 
    -v:汇报i节点、文件和其他内核表信息 
    -w:汇报系统上下文切换情况 
    -x:可以针对某个特定PID给出统计信息, 
    可以直接指定进程ID号; 
    也可以指定为SELF,这样就是检测sar进程本身; 
    如果设定为ALL,则表示汇报所有系统进程信息。 
    -X:汇报特定PID的子进程的信息 
    -y:设定TTY设备的信息。

    6.对网络的专门实例 
    sar命令使用-n选项可以回报网络相关信息,可用参数包括:DEV、EDEV、SOCK、FULL。

    例如:sar -n DEV 1 2  将显示lo、eth0、eth1等信息 
    IFACE:就是网络设备的名称; 
    rxpck/s:每秒钟接收到的包数目 
    txpck/s:每秒钟发送出去的包数目 
    rxbyt/s:每秒钟接收到的字节数 
    txbyt/s:每秒钟发送出去的字节数
     
    rxcmp/s:每秒钟接收到的压缩包数目 
    txcmp/s:每秒钟发送出去的压缩包数目 
    txmcst/s:每秒钟接收到的多播包的包数目

    sar -n EDEV 1 3 会针对网络设备回报其失败情况 
    rxerr/s:每秒钟接收到的损坏的包的数目 
    txerr/s:当发送包时,每秒钟发生的错误数 
    coll/s:当发送包时,每秒钟发生的冲撞(collisions)数(这个是在半双工模式下才有) 
    rxdrop/s:由于缓冲区满,网络设备接收端,每秒钟丢掉的网络包的数目 
    txdrop/s:由于缓冲区满,网络设备发送端,每秒钟丢掉的网络包的数目 
    txcarr/s:当发送数据包时,每秒钟载波错误发生的次数 
    rxfram/s:在接收数据包时,每秒钟发生的帧对齐错误的次数 
    rxfifo/s:在接收数据包时,每秒钟缓冲区溢出错误发生的次数 
    txfifo/s:在发送数据包时,每秒钟缓冲区溢出错误发生的次数

    sar -n SOCK 1 3 会针对socket连接进行汇报 
    totsck:被使用的socket的总数目 
    tcpsck:当前正在被使用于TCP的socket数目 
    udpsck:当前正在被使用于UDP的socket数目 
    rawsck:当前正在被使用于RAW的socket数目 
    ip-frag:当前的IP分片的数目

    sar -n FULL 1 3 相当于上述DEV、EDEV和SOCK三者的综合。

    7.对磁盘的专门实例 
    -d的输出显示了一个度量时间段内各种与磁盘相关的统计数据 

    http://www.whypc.info/2011/06/sar_how_to_network/
    展开全文
  • “搜索历史记录”部分存储了以前搜索过的城市,最多包括5个只读搜索,以提醒用户他们之前查询过的内容。 即使在页面加载后,这些城市仍然存在,以方便用户不会丢失搜索历史数据。 通过上面讨论的功能,用户/旅行者...
  • WakaTime 是一款优秀的编程时间管理工具,可以在各大...下面的截图是我的过去7天的统计数据,通过这几个维度,基本可以很全面量化你的编程时间。 强烈建议每个程序员都去使用这个工具。时间管理的第一步就是记录...
  • 在课程结束时,您将构建一个迷你银行应用程序,该应用程序可以跟踪用户一段时间内的财务交易,从而使他们可以查看其一段时间内的历史记录。 您将学到什么 使用Rust特征系统构建超级灵活的类型 无需样板代码即可处理...
  • 今天呢,主要学习Eclipse的常用快捷键以及在Eclipse上如何使用SVN提交、更新、查看历史记录等操作。好了,直接进入正题。 一、Eclipse常用快捷键1、alt+?或alt+/:自动补全代码或者提示代码2、ctrl+o:快速outline...
  • 由于腾讯云历史消息存储时长为7天,所以在结束群聊后,需要将群聊消息拉取到本地,方面后续随时查看。 这里调用腾讯云 拉取群历史消息接口,这个接口只提供最多20条最近消息记录,所以需要使用递归不断查询,最终...
  • SQL SERVER定期转移海量数据方案 ...只保留最新7天数据,每天定期移走过期记录,归并到历史库。采用INSERT,DELETE的方法,消耗时间越来越长,平均达到45分钟,期间该表和历史库根本无法访问。 【方案】 ...
  • 因为开发在7月九号凌晨4点删除一条数据,现在交易出现问题,需要检查这条数据当时的状态,历史表没有存这个数据,现在使用备库闪回到删除之前的时间点,找回数据。当时操作没有留记录,所以只写操作过程。 1.查看...
  • 7章 人事管理系统(共20000行代码)( 教学视频:72分钟).. 320 7.1 系统分析 321 7.1.1 需求分析 321 7.1.2 可行性分析 321 7.2 系统功能结构 323 7.2.1 构建开发环境 323 7.2.2 系统预览 323 7.3 数据库...
  • 语言:English 将您的Chrome浏览器历史记录...版本1.0.1.0 *表示“永远”选项受Chrome浏览器3个月(90)的浏览历史记录内存限制。 *将.csv分别分钟和第二次填充。 例如,以纯文本格式查看时,时间从5:3:7到5:03:07。
  • 它甚至可以将数据代理到Wakatime,因此您仍然可以查看自己的7天历史记录,或者订阅高级套餐,仍然可以获取自己的数据。 入门 本演练假定您已经成功将时间日志发送到Wakatime! # Clone and deploy to Heroku git ...
  • 千里马酒店前台管理系统V7使用手册

    热门讨论 2011-06-16 14:09:38
    8.6 房间历史 139 8.7 客房消费 140 8.8 遗留物品 141 8.9 物借物品 142 §第九章 问讯留言 Information 143 9.1 问讯概要 143 9.2 问讯视图 144 9.3 客人查询 144 9.4 客人留言 145 9.5 常用信息 147 9.6 邮件收发 ...
  • TurtleTab-crx插件

    2021-03-23 07:08:14
    内置天气,待办事项,备忘录和Google搜索功能的Chrome扩展程序 TurtleTab,一个充满用户友好...6.历史记录查看或清除您的历史记录7.书签:轻松阅读书签8.墙纸:按下乌龟按钮可翻阅几种不同的背景 支持语言:English
  • 还可以查看最近7天最受欢迎的网站列表 这是用于替换默认新标签页的应用。 有一天,我决定在“新标签”页面上添加超过默认的8个网站。 最终,我创建了这个应用程序。 此外,它还会根据上周的历史记录显示最受欢迎的...
  • 也可以查看过去7天内最受欢迎的网站列表 这是用于替换默认新标签页的应用。 有一天,我决定在我的“新标签”页面上添加超过默认的8个网站。 最终,我创建了这个应用程序。 此外,它还会根据上周的历史记录显示最受...
  • 点击页面左侧”会话管理”菜单下的”在线会话”按钮, 进入在线会话列表页面, 默认展示最近7天记录历史会话同在线会话包含的信息一样, 都有用户、资产和 IP 地址等信息,它还提供最重要的录像观看。 录像审计 ...
  • 作业一直执行

    2019-09-28 12:11:03
    背景:一个作业有7个步骤,前面的...查看作业历史记录,显示作业正在进行,持续时间为38小时43分钟,而且持续时间一直在增长。首先,怀疑步骤中的语句有问题,会不会是对大表进行操作(有死锁检查,不会堵这么久)...
  • kecsp-源码

    2021-03-27 05:01:42
    查看用户密切联系历史记录的详细信息,例如时间和地点。 使用联名Apple + Google联系人跟踪建议的联系人跟踪加密技术,但使用现有的iBeacon规范发布邻近ID。 它是如何工作的? kecsp是社交距离追踪器。 它允许...
  • windows设置 - 更新和安全 - 查看更新历史记录 - 卸载更新 - 找到8月15号的 KB4512508 补丁,右键卸载。先不要重启 windows设置 - 更新和安全 - 暂停更新7天 然后重启电脑 2019年9月2号 微软发布...
  • 凡是有收入和支出的人都需要,不论你在不在乎这些东西,也许有一你看看历史记录,你会大吃一惊的。升级方式:5.0以上版本可以直接在原目录安装,不会影响到数据。(建议先备份程序目录)6.7版1.增加收支对比图的...
  • 单击图标,然后单击“ Past 7 Days文本用户可以查看其过去7天的浏览历史记录和所花费的时间。 它可以帮助用户分析诸如他在每个网站上花费的时间百分比,花费时间少于1%(带有灰点)的域,总浏览时间等内容。 即将...
  • 小王学习Mysql之旅Day02

    2020-05-16 12:03:47
    数据库学习第二 数据库的基本操作 ...在SQLyog中可以查看历史记录 4.显示所有的表 use tables 5.查看表中所有的数据 describe+表名 6.创建一个数据库 create database + 名称 7.常用语句 e

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 128
精华内容 51
关键字:

查看7天历史记录