├── .DS_Store ├── .gitignore ├── .idea ├── .gitignore ├── WechatMsgAnalyzer.iml ├── modules.xml └── vcs.xml ├── LICENSE ├── README.md ├── cmd ├── analyze.go ├── root.go └── serve.go ├── go.mod ├── go.sum ├── img └── front.png ├── internal ├── .DS_Store ├── chat │ ├── analyzer.go │ ├── chat_test.go │ ├── model.go │ └── parse.go └── report │ ├── generator.go │ └── report_test.go ├── main.go ├── package-lock.json └── web ├── .DS_Store ├── babel.config.js ├── docs ├── css │ └── app.9375d4e5.css ├── favicon.ico ├── img │ ├── boy.6cb9ac8f.png │ ├── cloud1.c1599773.png │ ├── cloud2.794b62cd.png │ ├── cy.e58cda03.png │ ├── foot.f81a63da.png │ ├── girl.40b358d4.png │ ├── mask.bdd881c5.png │ └── result.e064ea5d.png ├── index.html └── js │ ├── app.b8e9b973.js │ ├── app.b8e9b973.js.map │ ├── chunk-vendors.88253f38.js │ └── chunk-vendors.88253f38.js.map ├── package-lock.json ├── package.json ├── public ├── favicon.ico └── index.html ├── src ├── App.vue ├── assets │ └── images │ │ ├── boy.png │ │ ├── cloud1.png │ │ ├── cloud2.png │ │ ├── cloud3.png │ │ ├── cy.png │ │ ├── foot.png │ │ ├── girl.png │ │ ├── left.png │ │ ├── looney-51.png │ │ ├── looney-52.png │ │ ├── looney-dragon-1.png │ │ ├── mask.png │ │ ├── mask2.png │ │ ├── pale-100.png │ │ ├── result.png │ │ └── sammy-line-chinese-dragon.png ├── components │ ├── EighthPage │ │ └── index.vue │ ├── FifthPage │ │ └── index.vue │ ├── FirstPage │ │ └── index.vue │ ├── ForthPage │ │ └── index.vue │ ├── NinthPage │ │ └── index.vue │ ├── SecondPage │ │ └── index.vue │ ├── SeventhPage │ │ └── index.vue │ ├── SixthPage │ │ └── index.vue │ └── ThirdPage │ │ └── index.vue └── main.js └── vue.config.js /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | data/ 2 | dist/ 3 | node_modules/ -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/WechatMsgAnalyzer.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Dragon_yy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Chat Analysis 2 | 3 | WechatMsgAnalyzer 是一个用于分析聊天记录并生成报告的命令行工具。 4 | 5 | ## 功能特性 6 | - 从 Excel 文件中读取聊天记录数据。 7 | - 分析聊天记录,包括统计发言次数、活跃时间段、关键词频率等。 8 | - 生成 HTML 报告,包含图表和统计数据。 9 | 10 | 11 | ## 项目结构 12 | ``` 13 | /chat-analysis 14 | |-- /cmd 15 | | |-- root.go # 根命令 16 | | |-- analyze.go # 分析并生成报告命令 17 | | 18 | |-- /internal 19 | | |-- /chat 20 | | | |-- analyzer.go # 聊天分析逻辑 21 | | | |-- parser.go # 解析Excel文件内容 22 | | | |-- model.go # 数据模型定义 23 | | | 24 | | |-- /report 25 | | |-- generator.go # 报告生成逻辑 26 | | |-- template.go # HTML报告模板 27 | | 28 | |-- /data 29 | | |-- chat_record.xlsx # Excel聊天记录文件 30 | | 31 | |-- /web 32 | | 33 | |-- go.mod # Go模块文件 34 | |-- go.sum # Go模块依赖版本锁定文件 35 | |-- main.go # 程序主入口 36 | |-- README.md # 项目说明文档 37 | ``` 38 | 39 | ## 使用 40 | **1. 使用[WeChatMsg](https://github.com/LC044/WeChatMsg)项目导出微信聊天记录到excel文件,筛选你想要生成报告的聊天对象保存到新excel中,例如test.xlsx,excel包含以下字段(WeChatMsg导出文件即包含这些字段):** 41 | - localId: 通常指的是记录在本地数据库中的唯一标识符,用于区分每条消息或通讯记录。 42 | - TalkerId: 可能指的是对话的另一方的标识符,即消息的接收者或发送者的ID。 43 | - Type: 表示消息的类型,这可能包括文本、图片、视频等。 44 | - SubType: 进一步细分消息的类型,例如在文本消息中可能区分是否包含链接或特殊格式。 45 | - IsSender: 标记消息的发送者,通常用布尔值表示(例如,true表示发送者,false表示接收者)。 46 | - CreateTime: 消息创建的时间戳,表明消息发送或接收的具体时间。 47 | - Status: 消息的状态,可能包括已发送、已接收、已读、错误等状态。 48 | - StrContent: 消息的具体内容,以字符串形式表示。 49 | - StrTime: 可能是消息时间的字符串表示形式,用于显示目的。 50 | - Remark: 可能是对消息或通讯记录的额外注释或备注。 51 | - NickName: 通讯双方的昵称或显示名称。 52 | - Sender: 消息发送者的标识符,可能与TalkerId相对应。 53 | 54 | **2. 根据聊天记录excel文件生成json** 55 | ```bash 56 | ./WechatMsgAnalyzer_MacOS-1.0 analyze -t test -f test.xlsx -o ./test.json 57 | ``` 58 | **3. 运行serve命令开启后端服务** 59 | ```bash 60 | ./WechatMsgAnalyzer_MacOS-1.0 serve -i 127.0.0.1 -p 9000 -r test.json 61 | ``` 62 | **4. 运行前端项目,需要注意由于我在前端项目中使用了axios请求后端服务,所以需要修改请求地址为后端服务地址** 63 | ```bash 64 | cd web 65 | npm install 66 | npm run serve 67 | ``` 68 | 程序将会分析聊天记录并生成报告,报告将保存为 HTML 文件。 69 | 示例报告 70 |  71 | 72 | ## 技术栈 73 | - Go 74 | - Cobra 75 | - Gin 76 | - Vue 77 | 78 | ## 贡献 79 | 欢迎提出问题和改进建议!如果你有兴趣贡献代码,请提一个 Pull Request。 80 | 81 | ## 许可证 82 | MIT 许可证 83 | 84 | ## 鸣谢 85 | 使用了以下开源项目: 86 | - [wechat-report](https://github.com/myth984/wechat-report) -------------------------------------------------------------------------------- /cmd/analyze.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import ( 4 | "fmt" 5 | "github.com/Dragon-yy/WechatMsgAnalyzer/internal/chat" 6 | reportPgk "github.com/Dragon-yy/WechatMsgAnalyzer/internal/report" 7 | "github.com/spf13/cobra" 8 | ) 9 | 10 | // analyzeCmd represents the analyze command 11 | var analyzeCmd = &cobra.Command{ 12 | Use: "analyze", 13 | Short: "Analyze Wechat messages from an Excel file", 14 | Long: `Analyze Wechat messages from an Excel file and generate a report.`, 15 | Run: func(cmd *cobra.Command, args []string) { 16 | fmt.Println("analyze called") 17 | // 获取命令行参数 18 | excelFile := cmd.Flag("file").Value.String() 19 | reportTitle := cmd.Flag("title").Value.String() 20 | outputFile := cmd.Flag("output").Value.String() 21 | 22 | // 这里调用internal包的函数 23 | report := chat.AnalyzeChat(reportTitle, excelFile) 24 | //fmt.Println(len(report.TopWords)) 25 | // 26 | //fmt.Println(report) 27 | //fmt.Println(report.ActiveTime) 28 | //fmt.Println(report.TopWords) 29 | 30 | // 把report json序列化后保存在data/data.json中 31 | reportPgk.GenerateReportData(report, outputFile) 32 | 33 | // 生成词云 34 | //reportPgk.GenerateWordCloud(reportTitle, report.TopWords) 35 | }, 36 | } 37 | 38 | func init() { 39 | analyzeCmd.Flags().StringP("file", "f", "", "The Excel file to be analyzed") 40 | analyzeCmd.MarkFlagRequired("file") 41 | analyzeCmd.Flags().StringP("title", "t", "", "The title of the report") 42 | analyzeCmd.MarkFlagRequired("title") 43 | analyzeCmd.Flags().StringP("output", "o", "data/data.json", "The output file of the report") 44 | analyzeCmd.MarkFlagRequired("output") 45 | 46 | RootCmd.AddCommand(analyzeCmd) 47 | } 48 | -------------------------------------------------------------------------------- /cmd/root.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import "github.com/spf13/cobra" 4 | 5 | // RootCmd represents the base command when called without any subcommands 6 | var RootCmd = &cobra.Command{ 7 | Use: "WechatMsgAnalyzer", 8 | Short: "Analyze chat messages from an Excel file", 9 | Long: `Analyze chat messages from an Excel file and generate a report.`, 10 | } 11 | 12 | func Execute() error { 13 | return RootCmd.Execute() 14 | } 15 | 16 | func init() { 17 | RootCmd.AddCommand(analyzeCmd) 18 | } 19 | -------------------------------------------------------------------------------- /cmd/serve.go: -------------------------------------------------------------------------------- 1 | package cmd 2 | 3 | import ( 4 | "encoding/json" 5 | "fmt" 6 | "github.com/gin-gonic/gin" 7 | "github.com/spf13/cobra" 8 | "net/http" 9 | "os" 10 | ) 11 | 12 | // 创建gin服务,监听端口,返回data.json 13 | 14 | var serveCmd = &cobra.Command{ 15 | Use: "serve", 16 | Short: "Start the web server", 17 | Long: `Start the web server and serve the report data.`, 18 | Run: func(cmd *cobra.Command, args []string) { 19 | // 获取参数 20 | report := cmd.Flag("report").Value.String() 21 | // 获取port 22 | port := cmd.Flag("port").Value.String() 23 | // 获取IP 24 | ip := cmd.Flag("ip").Value.String() 25 | // 解析报告数据 26 | reportData, err := parseReportData(report) 27 | if err != nil { 28 | fmt.Println("Error parsing report data:", err) 29 | return 30 | } 31 | // 启动服务器 32 | startWebServer(ip, port, reportData) 33 | }, 34 | } 35 | 36 | func parseReportData(reportPath string) (map[string]interface{}, error) { 37 | // 读取报告数据文件 38 | reportBytes, err := os.ReadFile(reportPath) 39 | if err != nil { 40 | return nil, err 41 | } 42 | 43 | // 解析 JSON 数据 44 | var reportData map[string]interface{} 45 | err = json.Unmarshal(reportBytes, &reportData) 46 | if err != nil { 47 | return nil, err 48 | } 49 | 50 | return reportData, nil 51 | } 52 | 53 | func startWebServer(ip, port string, reportData map[string]interface{}) { 54 | r := gin.Default() 55 | // 设置CORS头 56 | r.Use(func(c *gin.Context) { 57 | c.Writer.Header().Set("Access-Control-Allow-Origin", "*") 58 | c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") 59 | c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS") 60 | c.Writer.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type, Accept") 61 | c.Next() 62 | }) 63 | // 添加路由 64 | r.GET("/report", func(c *gin.Context) { 65 | c.JSON(http.StatusOK, reportData) 66 | }) 67 | 68 | // 启动服务器 69 | fmt.Println(fmt.Sprintf("Listening on %s:%s", ip, port)) 70 | err := r.Run(fmt.Sprintf("%s:%s", ip, port)) 71 | if err != nil { 72 | fmt.Println("Error starting server:", err) 73 | } 74 | } 75 | 76 | func init() { 77 | serveCmd.Flags().StringP("report", "r", "data/data.json", "The report data file to be served") 78 | // 添加port 79 | serveCmd.Flags().StringP("port", "p", "9000", "The port to listen on") 80 | // 添加IP 81 | serveCmd.Flags().StringP("ip", "i", "127.0.0.1", "The IP to listen on") 82 | RootCmd.AddCommand(serveCmd) 83 | 84 | } 85 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/Dragon-yy/WechatMsgAnalyzer 2 | 3 | go 1.21.0 4 | 5 | require ( 6 | github.com/go-echarts/go-echarts/v2 v2.3.3 7 | github.com/spf13/cobra v1.8.0 8 | github.com/xuri/excelize/v2 v2.8.0 9 | ) 10 | 11 | require ( 12 | github.com/bytedance/sonic v1.11.0 // indirect 13 | github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect 14 | github.com/chenzhuoyu/iasm v0.9.1 // indirect 15 | github.com/gabriel-vasile/mimetype v1.4.3 // indirect 16 | github.com/gin-contrib/sse v0.1.0 // indirect 17 | github.com/gin-gonic/gin v1.9.1 // indirect 18 | github.com/go-ego/gse v0.80.2 // indirect 19 | github.com/go-playground/locales v0.14.1 // indirect 20 | github.com/go-playground/universal-translator v0.18.1 // indirect 21 | github.com/go-playground/validator/v10 v10.18.0 // indirect 22 | github.com/goccy/go-json v0.10.2 // indirect 23 | github.com/inconshreveable/mousetrap v1.1.0 // indirect 24 | github.com/json-iterator/go v1.1.12 // indirect 25 | github.com/klauspost/cpuid/v2 v2.2.6 // indirect 26 | github.com/leodido/go-urn v1.4.0 // indirect 27 | github.com/mattn/go-isatty v0.0.20 // indirect 28 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect 29 | github.com/modern-go/reflect2 v1.0.2 // indirect 30 | github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect 31 | github.com/pelletier/go-toml/v2 v2.1.1 // indirect 32 | github.com/richardlehane/mscfb v1.0.4 // indirect 33 | github.com/richardlehane/msoleps v1.0.3 // indirect 34 | github.com/spf13/pflag v1.0.5 // indirect 35 | github.com/twitchyliquid64/golang-asm v0.15.1 // indirect 36 | github.com/ugorji/go/codec v1.2.12 // indirect 37 | github.com/vcaesar/cedar v0.20.1 // indirect 38 | github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca // indirect 39 | github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a // indirect 40 | golang.org/x/arch v0.7.0 // indirect 41 | golang.org/x/crypto v0.19.0 // indirect 42 | golang.org/x/net v0.21.0 // indirect 43 | golang.org/x/sys v0.17.0 // indirect 44 | golang.org/x/text v0.14.0 // indirect 45 | google.golang.org/protobuf v1.32.0 // indirect 46 | gopkg.in/yaml.v3 v3.0.1 // indirect 47 | ) 48 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= 2 | github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= 3 | github.com/bytedance/sonic v1.11.0 h1:FwNNv6Vu4z2Onf1++LNzxB/QhitD8wuTdpZzMTGITWo= 4 | github.com/bytedance/sonic v1.11.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= 5 | github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= 6 | github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= 7 | github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= 8 | github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= 9 | github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= 10 | github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0= 11 | github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= 12 | github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= 13 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 14 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 15 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 16 | github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= 17 | github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= 18 | github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= 19 | github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= 20 | github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= 21 | github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= 22 | github.com/go-echarts/go-echarts/v2 v2.3.3 h1:uImZAk6qLkC6F9ju6mZ5SPBqTyK8xjZKwSmwnCg4bxg= 23 | github.com/go-echarts/go-echarts/v2 v2.3.3/go.mod h1:56YlvzhW/a+du15f3S2qUGNDfKnFOeJSThBIrVFHDtI= 24 | github.com/go-ego/gse v0.80.2 h1:3LRfkaBuwlsHsmkOZvnhTcsYPXUAhiP06Sqcid7mO1M= 25 | github.com/go-ego/gse v0.80.2/go.mod h1:kesekpZfcFQ/kwd9b27VZHUOH5dQUjaaQUZ4OGt4Hj4= 26 | github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= 27 | github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= 28 | github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= 29 | github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= 30 | github.com/go-playground/validator/v10 v10.18.0 h1:BvolUXjp4zuvkZ5YN5t7ebzbhlUtPsPm2S9NAZ5nl9U= 31 | github.com/go-playground/validator/v10 v10.18.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= 32 | github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= 33 | github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= 34 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 35 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 36 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 37 | github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= 38 | github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 39 | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= 40 | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 41 | github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= 42 | github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= 43 | github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= 44 | github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= 45 | github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= 46 | github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= 47 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= 48 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 49 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 50 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= 51 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 52 | github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= 53 | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= 54 | github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= 55 | github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= 56 | github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= 57 | github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= 58 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 59 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 60 | github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= 61 | github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= 62 | github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= 63 | github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM= 64 | github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= 65 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 66 | github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= 67 | github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= 68 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 69 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 70 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 71 | github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= 72 | github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= 73 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 74 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 75 | github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 76 | github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= 77 | github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= 78 | github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 79 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 80 | github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= 81 | github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= 82 | github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= 83 | github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= 84 | github.com/vcaesar/cedar v0.20.1 h1:cDOmYWdprO7ZW8cngJrDi8Zivnscj9dA/y8Y+2SB1P0= 85 | github.com/vcaesar/cedar v0.20.1/go.mod h1:iMDweyuW76RvSrCkQeZeQk4iCbshiPzcCvcGCtpM7iI= 86 | github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca h1:uvPMDVyP7PXMMioYdyPH+0O+Ta/UO1WFfNYMO3Wz0eg= 87 | github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= 88 | github.com/xuri/excelize/v2 v2.8.0 h1:Vd4Qy809fupgp1v7X+nCS/MioeQmYVVzi495UCTqB7U= 89 | github.com/xuri/excelize/v2 v2.8.0/go.mod h1:6iA2edBTKxKbZAa7X5bDhcCg51xdOn1Ar5sfoXRGrQg= 90 | github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a h1:Mw2VNrNNNjDtw68VsEj2+st+oCSn4Uz7vZw6TbhcV1o= 91 | github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= 92 | github.com/yanyiwu/gojieba v1.3.0 h1:6VeaPOR+MawnImdeSvWNr7rP4tvUfnGlEKaoBnR33Ds= 93 | github.com/yanyiwu/gojieba v1.3.0/go.mod h1:54wkP7sMJ6bklf7yPl6F+JG71dzVUU1WigZbR47nGdY= 94 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 95 | golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= 96 | golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc= 97 | golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= 98 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 99 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 100 | golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= 101 | golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= 102 | golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= 103 | golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= 104 | golang.org/x/image v0.11.0 h1:ds2RoQvBvYTiJkwpSFDwCcDFNX7DqjL2WsUgTNk0Ooo= 105 | golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8= 106 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 107 | golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 108 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 109 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 110 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 111 | golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 112 | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 113 | golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= 114 | golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= 115 | golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= 116 | golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= 117 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 118 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 119 | golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 120 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 121 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 122 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 123 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 124 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 125 | golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 126 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 127 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 128 | golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 129 | golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= 130 | golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 131 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 132 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 133 | golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 134 | golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= 135 | golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= 136 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 137 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 138 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 139 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 140 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 141 | golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= 142 | golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 143 | golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= 144 | golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 145 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 146 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 147 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 148 | golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 149 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 150 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 151 | google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= 152 | google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= 153 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 154 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 155 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 156 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 157 | nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= 158 | rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= 159 | -------------------------------------------------------------------------------- /img/front.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/img/front.png -------------------------------------------------------------------------------- /internal/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/internal/.DS_Store -------------------------------------------------------------------------------- /internal/chat/analyzer.go: -------------------------------------------------------------------------------- 1 | package chat 2 | 3 | func AnalyzeChat(title, file string) Report { 4 | /* 5 | - 发言次数统计:根据 TalkerId 或 NickName 字段统计每个用户的发言次数。 6 | - 活跃度分析:分析每个用户的活跃时间段,可以根据 CreateTime 字段中的时间信息来统计用户在一天中的活跃时间。 7 | - 聊天内容分析:可以使用 StrContent 字段进行聊天内容的情感分析、关键词提取等。 8 | - 聊天情绪分析:根据聊天内容进行情绪分析,可以使用自然语言处理技术,如情感词典或机器学习模型来分析。 9 | - 用户互动分析:根据 IsSender 字段来分析每个用户是发送者还是接收者,进而分析用户之间的互动情况。 10 | - 聊天时间分析:分析聊天记录的时间分布,可以根据 CreateTime 字段来统计每天、每周、每月的聊天活动情况。 11 | - 聊天内容类型分析:根据 Type 和 SubType 字段来分析聊天内容的类型,如文本消息、图片消息、语音消息等。 12 | - 用户间关系分析:根据用户的互动情况和聊天内容,分析用户之间的关系密度和联系频率 13 | - 词云展示:根据聊天内容生成词云图,展示聊天记录中的关键词。 14 | - 图表展示:使用图表展示聊天记录的统计数据,如发言次数、活跃时间段、聊天内容类型等。 15 | */ 16 | //msgChats := ParseChat("../../data/test.xlsx") 17 | msgChats := ParseChat(file) 18 | report := Report{} 19 | report.analyze(msgChats, title) 20 | return report 21 | } 22 | -------------------------------------------------------------------------------- /internal/chat/chat_test.go: -------------------------------------------------------------------------------- 1 | package chat 2 | 3 | import ( 4 | "fmt" 5 | "strconv" 6 | "testing" 7 | "time" 8 | ) 9 | 10 | // 测试 11 | func TestParseChat(t *testing.T) { 12 | chatMsgs := ParseChat("../../data/test.xlsx") 13 | if len(chatMsgs) != 0 { 14 | fmt.Println(chatMsgs[3]) 15 | } 16 | } 17 | 18 | func TestAnalyzeChat(t *testing.T) { 19 | report := AnalyzeChat("test.xlsx", "../../data/test.xlsx") 20 | fmt.Println(report) 21 | fmt.Println(report.ActiveTime) 22 | fmt.Println(report.TopWords) 23 | } 24 | 25 | func TestActiveTime(t *testing.T) { 26 | tmp, _ := strconv.ParseInt("1672394267", 10, 64) 27 | fmt.Println(tmp) 28 | tm := time.Unix(tmp, 0) 29 | // 从字符串解析时间 30 | createTime := tm.Format("2006-01-02 15:04:05") 31 | fmt.Println(createTime) 32 | 33 | // 将时间转换为所需的格式 34 | monthKey := tm.Format("2006-01") // YYYY-MM 格式 35 | weekDayKey := tm.Weekday().String() // 周几 36 | hourKey := tm.Format("15") // 小时,24小时制 37 | fmt.Printf("monthKey: %s, weekDayKey: %s, hourKey: %s\n", monthKey, weekDayKey, hourKey) 38 | } 39 | -------------------------------------------------------------------------------- /internal/chat/model.go: -------------------------------------------------------------------------------- 1 | package chat 2 | 3 | import ( 4 | "github.com/go-ego/gse" 5 | "sort" 6 | "strconv" 7 | "strings" 8 | "time" 9 | ) 10 | 11 | /* 12 | localId TalkerId Type SubType IsSender CreateTime Status StrContent StrTime Remark NickName Sender 13 | */ 14 | // 将词频转换为切片 15 | type WordCount struct { 16 | Word string 17 | Count int 18 | } 19 | 20 | // ChatMessage represents a chat message 21 | type ChatMessage struct { 22 | LocalId string 23 | TalkerId string 24 | Type string 25 | SubType string 26 | IsSender string 27 | CreateTime string 28 | Status string 29 | StrContent string 30 | StrTime string 31 | Remark string 32 | NickName string 33 | Sender string 34 | } 35 | 36 | // Report store the analysis result 37 | type Report struct { 38 | // 报告标题 39 | Title string 40 | // 第一条记录时间 41 | FirstTime string 42 | // 发言次数统计 43 | SpeakCount int 44 | // love词语出现次数 45 | LoveCount map[string]int 46 | // 照片出现次数 47 | ImgCount int 48 | // emoji出现次数 49 | EmojiCount int 50 | // 活跃度分析 51 | ActiveTime map[string]int 52 | // 最频繁聊天词汇 53 | TopWords []WordCount 54 | // 最长的聊天记录 55 | LongestMsg ChatMessage 56 | // 最晚的聊天记录 57 | LatestMsg ChatMessage 58 | // 最常用的词 59 | MostUsedWord map[string]int 60 | } 61 | 62 | func (r *Report) analyze(chatMsgs []ChatMessage, title string) { 63 | // 临时保存聊天信息,以分词 64 | tmpChatMsgs := "" 65 | r.LoveCount = make(map[string]int) 66 | r.ActiveTime = make(map[string]int) 67 | for _, msg := range chatMsgs { 68 | // title 69 | r.Title = title 70 | 71 | // 实现第一条记录时间的逻辑 72 | // 1. 遍历chatMsgs,找到最早的一条记录 73 | // 2. 将记录的时间存储到FirstTime中 74 | 75 | if r.FirstTime == "" { 76 | r.FirstTime = msg.CreateTime 77 | } else { 78 | if msg.CreateTime < r.FirstTime { 79 | r.FirstTime = msg.CreateTime 80 | } 81 | } 82 | 83 | // 实现发言次数统计的逻辑 84 | r.SpeakCount++ 85 | 86 | // 爱你 想你 喜欢你词语出现次数 87 | if strings.Contains(msg.StrContent, "爱你") { 88 | r.LoveCount["爱你"]++ 89 | } else if strings.Contains(msg.StrContent, "想你") { 90 | r.LoveCount["想你"]++ 91 | } else if strings.Contains(msg.StrContent, "喜欢你") { 92 | r.LoveCount["喜欢你"]++ 93 | } 94 | 95 | // 照片出现次数 96 | if msg.Type == "3" { 97 | r.ImgCount++ 98 | } 99 | // emoji出现次数 100 | if msg.Type == "47" { 101 | r.EmojiCount++ 102 | } 103 | // 最长的聊天记录,遇到标签 xml标签跳过 104 | if !strings.Contains(msg.StrContent, "") { 105 | if r.LongestMsg.StrContent == "" { 106 | r.LongestMsg = msg 107 | } else { 108 | if len(msg.StrContent) > len(r.LongestMsg.StrContent) { 109 | r.LongestMsg = msg 110 | } 111 | } 112 | } 113 | // 最晚的聊天记录,遇到标签 xml标签跳过 114 | FindLatestMessageDuringNight(&msg, &r.LatestMsg) 115 | // 调用活跃度分析的逻辑 116 | analyzeActiveTime(msg, r.ActiveTime) 117 | 118 | // 向tmpChatMsgs中添加聊天内容 119 | if msg.StrContent != "" && !strings.Contains(msg.StrContent, "") { 120 | tmpChatMsgs += msg.StrContent + " " 121 | } 122 | 123 | } 124 | // 调用最频繁聊天词汇的逻辑 125 | r.TopWords = analyzeTopWords(&tmpChatMsgs) 126 | // 获取最常用的词r.TopWords 第一个 127 | r.MostUsedWord = map[string]int{r.TopWords[0].Word: r.TopWords[0].Count} 128 | } 129 | 130 | func analyzeActiveTime(msg ChatMessage, ActiveTime map[string]int) { 131 | // 实现活跃度分析的逻辑 132 | // 1. 创建一个map用于存储用户活跃时间段 133 | // 2. 遍历chatMsgs,统计每个用户的活跃时间段,时间段包括一年中每月聊天次数、一周中周一到周日的聊天次数、一天中每个时间段的聊天次数 134 | // 3. 将统计结果存储到map中 135 | // 4. 返回map 136 | tmp, _ := strconv.ParseInt(msg.CreateTime, 10, 64) 137 | tm := time.Unix(tmp, 0) 138 | //createTime := tm.Format("2006-01-02 15:04:05") 139 | 140 | // 将时间转换为所需的格式 141 | monthKey := tm.Format("2006-01") // YYYY-MM 格式 142 | weekDayKey := tm.Weekday().String() // 周几 143 | hourKey := tm.Format("15") // 小时,24小时制 144 | //fmt.Printf("monthKey: %s, weekDayKey: %s, hourKey: %s\n", monthKey, weekDayKey, hourKey) 145 | // 检查是否已经为该用户创建了内层的 map,如果没有则创建 146 | if ActiveTime == nil { 147 | ActiveTime = make(map[string]int) 148 | } 149 | // 更新月份计数 150 | ActiveTime["month_"+monthKey]++ 151 | // 更新星期计数 152 | ActiveTime["weekday_"+weekDayKey]++ 153 | // 更新小时计数 154 | ActiveTime["hour_"+hourKey]++ 155 | 156 | } 157 | 158 | func analyzeTopWords(msg *string) []WordCount { 159 | // 实现最频繁聊天词汇的逻辑 160 | // 1. 创建一个map用于存储词汇和出现次数 161 | // 2. 遍历chatMsgs,统计每条记录的词汇出现次数 162 | // 3. 将统计结果存储到map中 163 | // 4. 返回map 164 | // 创建分词器 165 | var seg gse.Segmenter 166 | // 加载词典 167 | err := seg.LoadDict("zh_s") 168 | if err != nil { 169 | panic(err) 170 | } 171 | // 分词 172 | 173 | // 过滤标签 174 | if strings.Contains(*msg, "") { 175 | return nil // 跳过 176 | } 177 | // 分词 178 | segments := seg.Cut(*msg, true) 179 | // 统计词频,取前100个 180 | punc := "。,、;:?!“”‘’()《》【】[]{} < > ? @ # $ % ^ & * ( ) _ + - = | \\ / ; : ' ' ; 、 ? ! ¥ … ( ) 《 》 【 】" 181 | 182 | // 临时保存词频,以便后续排序 183 | tmpWordFreqs := make(map[string]int) 184 | 185 | for _, segment := range segments { 186 | // 忽略标点符号和单字词,因为是中文,所以占用3个字节 187 | if len(segment) > 3 && !strings.ContainsAny(segment, punc) && !strings.Contains(segment, "") { 188 | tmpWordFreqs[segment]++ 189 | } 190 | 191 | } 192 | 193 | var wfSlice []WordCount 194 | for k, v := range tmpWordFreqs { 195 | wfSlice = append(wfSlice, WordCount{k, v}) 196 | } 197 | 198 | // 对切片按照词频降序排序 199 | sort.Slice(wfSlice, func(i, j int) bool { 200 | return wfSlice[i].Count > wfSlice[j].Count 201 | }) 202 | // 只保留前100个高频词 203 | if len(wfSlice) > 100 { 204 | wfSlice = wfSlice[:100] 205 | } 206 | 207 | return wfSlice 208 | 209 | } 210 | 211 | func FindLatestMessageDuringNight(msg, latestMsg *ChatMessage) { 212 | // 实现最晚的聊天记录的逻辑 213 | // 1.比较时间即可,6点之后的时间越大越晚,6点之前的时间越小越晚 214 | tmp, _ := strconv.ParseInt(msg.CreateTime, 10, 64) 215 | tm := time.Unix(tmp, 0) 216 | //createTime := tm.Format("2006-01-02 15:04:05") 217 | if latestMsg.CreateTime == "" { 218 | *latestMsg = *msg 219 | } else { 220 | tmp, _ := strconv.ParseInt(latestMsg.CreateTime, 10, 64) 221 | latestTime := time.Unix(tmp, 0) 222 | // 判断当前消息是否在晚间时间范围内 223 | if tm.Hour() >= 6 && latestTime.Hour() >= 6 { 224 | if tm.After(latestTime) { 225 | *latestMsg = *msg 226 | } 227 | } 228 | if tm.Hour() < 6 && latestTime.Hour() < 6 { 229 | if tm.After(latestTime) { 230 | *latestMsg = *msg 231 | } 232 | } 233 | if tm.Hour() < 6 && latestTime.Hour() >= 6 { 234 | *latestMsg = *msg 235 | } 236 | } 237 | } 238 | 239 | func (r *Report) analyzeEmotion(chatMsgs []ChatMessage) { 240 | // TODO: 实现聊天情绪分析的逻辑 241 | } 242 | 243 | func (r *Report) analyzeTimeLine(data []string) { 244 | // TODO: 实现时间线分析的逻辑 245 | } 246 | -------------------------------------------------------------------------------- /internal/chat/parse.go: -------------------------------------------------------------------------------- 1 | package chat 2 | 3 | import ( 4 | "github.com/xuri/excelize/v2" 5 | "sync" 6 | ) 7 | 8 | // 读取保存在excel中的聊天记录并解析进ChatMessage列表中 9 | // 运行效率26.5s 10 | func ParseChat(filepath string) []ChatMessage { 11 | // 读取excel文件 12 | f, err := excelize.OpenFile(filepath) 13 | if err != nil { 14 | panic(err) 15 | } 16 | 17 | // 获取所有行数据 18 | rows, err := f.GetRows(f.GetSheetName(0)) 19 | if err != nil { 20 | panic(err) 21 | } 22 | 23 | var chatMsgs []ChatMessage 24 | // 批量读取数据并解析 25 | batchSize := 1000 // 每次读取的行数 26 | for i := 0; i < len(rows); i += batchSize { 27 | end := i + batchSize 28 | if end > len(rows) { 29 | end = len(rows) 30 | } 31 | batchRows := rows[i:end] 32 | 33 | // 解析每一行数据 34 | for _, row := range batchRows { 35 | // 解析行数据并添加到chatMsgs列表中 36 | chatMsg := ChatMessage{} 37 | chatMsg.LocalId = row[0] 38 | chatMsg.TalkerId = row[1] 39 | chatMsg.Type = row[2] 40 | chatMsg.SubType = row[3] 41 | chatMsg.IsSender = row[4] 42 | chatMsg.CreateTime = row[5] 43 | chatMsg.Status = row[6] 44 | chatMsg.StrContent = row[7] 45 | chatMsg.StrTime = row[8] 46 | chatMsg.Remark = row[9] 47 | chatMsg.NickName = row[10] 48 | chatMsg.Sender = row[11] 49 | // 添加到chatMsgs中 50 | chatMsgs = append(chatMsgs, chatMsg) 51 | } 52 | } 53 | 54 | return chatMsgs[1:] 55 | } 56 | 57 | // 运行效率29.61 没有提升,而且由于多goroutine会打乱顺序 58 | func ParseChatMulti(filepath string) []ChatMessage { 59 | // 读取excel文件 60 | f, err := excelize.OpenFile(filepath) 61 | if err != nil { 62 | panic(err) 63 | } 64 | 65 | // 获取所有行数据 66 | rows, err := f.GetRows(f.GetSheetName(0)) 67 | if err != nil { 68 | panic(err) 69 | } 70 | 71 | // 定义批量处理大小 72 | batchSize := 10000 73 | totalRows := len(rows) 74 | 75 | // 创建等待组 76 | var wg sync.WaitGroup 77 | wg.Add((totalRows + batchSize - 1) / batchSize) 78 | 79 | // 创建通道 80 | ch := make(chan []ChatMessage, (totalRows+batchSize-1)/batchSize) 81 | 82 | // 并发读取数据 83 | for i := 0; i < totalRows; i += batchSize { 84 | end := i + batchSize 85 | if end > totalRows { 86 | end = totalRows 87 | } 88 | go func(start, end int) { 89 | defer wg.Done() 90 | var batchMsgs []ChatMessage 91 | // 解析每一行数据 92 | for _, row := range rows[start:end] { 93 | // 解析行数据并添加到chatMsgs列表中 94 | chatMsg := ChatMessage{} 95 | chatMsg.LocalId = row[0] 96 | chatMsg.TalkerId = row[1] 97 | chatMsg.Type = row[2] 98 | chatMsg.SubType = row[3] 99 | chatMsg.IsSender = row[4] 100 | chatMsg.CreateTime = row[5] 101 | chatMsg.Status = row[6] 102 | chatMsg.StrContent = row[7] 103 | chatMsg.StrTime = row[8] 104 | chatMsg.Remark = row[9] 105 | chatMsg.NickName = row[10] 106 | chatMsg.Sender = row[11] 107 | // 添加到批量消息中 108 | batchMsgs = append(batchMsgs, chatMsg) 109 | } 110 | // 发送批量消息到通道 111 | ch <- batchMsgs 112 | }(i, end) 113 | } 114 | 115 | // 合并结果 116 | go func() { 117 | wg.Wait() 118 | close(ch) 119 | }() 120 | 121 | var chatMsgs []ChatMessage 122 | for msgs := range ch { 123 | chatMsgs = append(chatMsgs, msgs...) 124 | } 125 | 126 | return chatMsgs 127 | } 128 | -------------------------------------------------------------------------------- /internal/report/generator.go: -------------------------------------------------------------------------------- 1 | package report 2 | 3 | import ( 4 | "encoding/json" 5 | "github.com/Dragon-yy/WechatMsgAnalyzer/internal/chat" 6 | "os" 7 | ) 8 | 9 | //func GenerateWordCloud(title string, words map[string]int) { 10 | // // 创建词云图 11 | // wordCloud := charts.NewWordCloud() 12 | // wordCloud.SetGlobalOptions( 13 | // charts.WithTitleOpts(opts.Title{ 14 | // Title: title, 15 | // }), 16 | // charts.WithTooltipOpts(opts.Tooltip{Show: true}), 17 | // ) 18 | // 19 | // var wcData []opts.WordCloudData 20 | // for word, count := range words { 21 | // wcData = append(wcData, opts.WordCloudData{ 22 | // Name: word, 23 | // Value: count, 24 | // }) 25 | // } 26 | // 27 | // wordCloud.AddSeries("wordCloud", wcData). 28 | // SetSeriesOptions( 29 | // charts.WithWorldCloudChartOpts( 30 | // opts.WordCloudChart{ 31 | // SizeRange: []float32{14, 80}, 32 | // }), 33 | // ) 34 | // 35 | // // 生成HTML文件 36 | // //f, _ := os.Create("word_cloud.html") 37 | // //wordCloud.Render(f) 38 | //} 39 | 40 | // 把report数据格式化为json并保存在data/data.json中 41 | func GenerateReportData(data chat.Report, output string) { 42 | jsonReport, _ := json.Marshal(data) 43 | err := os.WriteFile(output, jsonReport, 0644) 44 | if err != nil { 45 | panic(err) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /internal/report/report_test.go: -------------------------------------------------------------------------------- 1 | package report 2 | 3 | import ( 4 | "fmt" 5 | "github.com/Dragon-yy/WechatMsgAnalyzer/internal/chat" 6 | "testing" 7 | ) 8 | 9 | //func TestGenerateWordCloud(t *testing.T) { 10 | // words := map[string]int{"Hello": 100, "World": 200, "Go": 300, "Echarts": 400, "WordCloud": 500} 11 | // GenerateWordCloud("Word Cloud Example", words) 12 | //} 13 | 14 | func TestFindLatestMessageDuringNight(t *testing.T) { 15 | chatMsgs := []chat.ChatMessage{ 16 | { 17 | CreateTime: "1672394267", 18 | }, 19 | { 20 | CreateTime: "1672394278", 21 | }, 22 | } 23 | lastestMsg := chat.ChatMessage{} 24 | for _, msg := range chatMsgs { 25 | chat.FindLatestMessageDuringNight(&msg, &lastestMsg) 26 | } 27 | fmt.Println(lastestMsg) 28 | } 29 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "github.com/Dragon-yy/WechatMsgAnalyzer/cmd" 5 | ) 6 | 7 | func main() { 8 | cmd.Execute() 9 | } 10 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "@babel/parser": { 6 | "version": "7.23.9", 7 | "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.9.tgz", 8 | "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==" 9 | }, 10 | "@vue/compiler-sfc": { 11 | "version": "2.7.16", 12 | "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", 13 | "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", 14 | "requires": { 15 | "@babel/parser": "^7.23.5", 16 | "postcss": "^8.4.14", 17 | "prettier": "^1.18.2 || ^2.0.0", 18 | "source-map": "^0.6.1" 19 | } 20 | }, 21 | "commander": { 22 | "version": "2.20.3", 23 | "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", 24 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 25 | }, 26 | "css-element-queries": { 27 | "version": "1.2.3", 28 | "resolved": "https://registry.npmmirror.com/css-element-queries/-/css-element-queries-1.2.3.tgz", 29 | "integrity": "sha512-QK9uovYmKTsV2GXWQiMOByVNrLn2qz6m3P7vWpOR4IdD6I3iXoDw5qtgJEN3Xq7gIbdHVKvzHjdAtcl+4Arc4Q==" 30 | }, 31 | "csstype": { 32 | "version": "3.1.3", 33 | "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", 34 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" 35 | }, 36 | "d3": { 37 | "version": "4.13.0", 38 | "resolved": "https://registry.npmmirror.com/d3/-/d3-4.13.0.tgz", 39 | "integrity": "sha512-l8c4+0SldjVKLaE2WG++EQlqD7mh/dmQjvi2L2lKPadAVC+TbJC4ci7Uk9bRi+To0+ansgsS0iWfPjD7DBy+FQ==", 40 | "requires": { 41 | "d3-array": "1.2.1", 42 | "d3-axis": "1.0.8", 43 | "d3-brush": "1.0.4", 44 | "d3-chord": "1.0.4", 45 | "d3-collection": "1.0.4", 46 | "d3-color": "1.0.3", 47 | "d3-dispatch": "1.0.3", 48 | "d3-drag": "1.2.1", 49 | "d3-dsv": "1.0.8", 50 | "d3-ease": "1.0.3", 51 | "d3-force": "1.1.0", 52 | "d3-format": "1.2.2", 53 | "d3-geo": "1.9.1", 54 | "d3-hierarchy": "1.1.5", 55 | "d3-interpolate": "1.1.6", 56 | "d3-path": "1.0.5", 57 | "d3-polygon": "1.0.3", 58 | "d3-quadtree": "1.0.3", 59 | "d3-queue": "3.0.7", 60 | "d3-random": "1.1.0", 61 | "d3-request": "1.0.6", 62 | "d3-scale": "1.0.7", 63 | "d3-selection": "1.3.0", 64 | "d3-shape": "1.2.0", 65 | "d3-time": "1.0.8", 66 | "d3-time-format": "2.1.1", 67 | "d3-timer": "1.0.7", 68 | "d3-transition": "1.1.1", 69 | "d3-voronoi": "1.1.2", 70 | "d3-zoom": "1.7.1" 71 | } 72 | }, 73 | "d3-array": { 74 | "version": "1.2.1", 75 | "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-1.2.1.tgz", 76 | "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" 77 | }, 78 | "d3-axis": { 79 | "version": "1.0.8", 80 | "resolved": "https://registry.npmmirror.com/d3-axis/-/d3-axis-1.0.8.tgz", 81 | "integrity": "sha512-K0djTb26iQ6AsuD2d6Ka08wBHf4V30awIxV4XFuB/iLzYtTqqJlE/nIN0DBJJCX7lbOqbt2/oeX3r+sU5k2veg==" 82 | }, 83 | "d3-brush": { 84 | "version": "1.0.4", 85 | "resolved": "https://registry.npmmirror.com/d3-brush/-/d3-brush-1.0.4.tgz", 86 | "integrity": "sha512-nUFueDzOlvwFvuOBynGSyJM7Wt1H9fKgJeoWFSg3ScS4c7FJBch92FKUJKum4xtgPYHdgH2C3bRg3GzSVltCJQ==", 87 | "requires": { 88 | "d3-dispatch": "1", 89 | "d3-drag": "1", 90 | "d3-interpolate": "1", 91 | "d3-selection": "1", 92 | "d3-transition": "1" 93 | } 94 | }, 95 | "d3-chord": { 96 | "version": "1.0.4", 97 | "resolved": "https://registry.npmmirror.com/d3-chord/-/d3-chord-1.0.4.tgz", 98 | "integrity": "sha512-o0ExexkK1N0KikUakKrQwttP5Flu8AYD6iBUh3AdPJqnTh6xlvcX5wFRuuo29sLOAr9+T4yZPUH1S3CCQJ1SlQ==", 99 | "requires": { 100 | "d3-array": "1", 101 | "d3-path": "1" 102 | } 103 | }, 104 | "d3-cloud": { 105 | "version": "1.2.7", 106 | "resolved": "https://registry.npmmirror.com/d3-cloud/-/d3-cloud-1.2.7.tgz", 107 | "integrity": "sha512-8TrgcgwRIpoZYQp7s3fGB7tATWfhckRb8KcVd1bOgqkNdkJRDGWfdSf4HkHHzZxSczwQJdSxvfPudwir5IAJ3w==", 108 | "requires": { 109 | "d3-dispatch": "^1.0.3" 110 | } 111 | }, 112 | "d3-collection": { 113 | "version": "1.0.4", 114 | "resolved": "https://registry.npmmirror.com/d3-collection/-/d3-collection-1.0.4.tgz", 115 | "integrity": "sha512-+TPxaBFzbzfpLF3Hjz8JPeuStNmJnyWAufu8VUfpDCDn5RieIgY+OQDjhKMDorf2naLgAjjZXLUQN7XFp/kgog==" 116 | }, 117 | "d3-color": { 118 | "version": "1.0.3", 119 | "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-1.0.3.tgz", 120 | "integrity": "sha512-t+rSOrshj6m2AUOe8kHvTwfUQ5TFoInEkBfmsHHAHPof58dmbRXNpicB7XAyPbMQbcC7i09p2BxeCEdgBd8xmw==" 121 | }, 122 | "d3-dispatch": { 123 | "version": "1.0.3", 124 | "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-1.0.3.tgz", 125 | "integrity": "sha512-Qh2DR3neW3lq/ug4oymXHYoIsA91nYt47ERb+fPKjRg6zLij06aP7KqHHl2NyziK9ASxrR3GLkHCtZvXe/jMVg==" 126 | }, 127 | "d3-drag": { 128 | "version": "1.2.1", 129 | "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-1.2.1.tgz", 130 | "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==", 131 | "requires": { 132 | "d3-dispatch": "1", 133 | "d3-selection": "1" 134 | } 135 | }, 136 | "d3-dsv": { 137 | "version": "1.0.8", 138 | "resolved": "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-1.0.8.tgz", 139 | "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==", 140 | "requires": { 141 | "commander": "2", 142 | "iconv-lite": "0.4", 143 | "rw": "1" 144 | } 145 | }, 146 | "d3-ease": { 147 | "version": "1.0.3", 148 | "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-1.0.3.tgz", 149 | "integrity": "sha512-io3QwOJwVPAxRF2UXpKpCdz2wm/7VLFCQQ1yy+GzX6YCtt3vi2BGnimI8agSF5jyUrHsADyF303d2S+ps7zU8w==" 150 | }, 151 | "d3-force": { 152 | "version": "1.1.0", 153 | "resolved": "https://registry.npmmirror.com/d3-force/-/d3-force-1.1.0.tgz", 154 | "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", 155 | "requires": { 156 | "d3-collection": "1", 157 | "d3-dispatch": "1", 158 | "d3-quadtree": "1", 159 | "d3-timer": "1" 160 | } 161 | }, 162 | "d3-format": { 163 | "version": "1.2.2", 164 | "resolved": "https://registry.npmmirror.com/d3-format/-/d3-format-1.2.2.tgz", 165 | "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==" 166 | }, 167 | "d3-geo": { 168 | "version": "1.9.1", 169 | "resolved": "https://registry.npmmirror.com/d3-geo/-/d3-geo-1.9.1.tgz", 170 | "integrity": "sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==", 171 | "requires": { 172 | "d3-array": "1" 173 | } 174 | }, 175 | "d3-hierarchy": { 176 | "version": "1.1.5", 177 | "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz", 178 | "integrity": "sha512-PcsLIhThc60mWnxlojIOH7Sc0tQ2DgLWfEwEAyzCtej5f3H9wSsRmrg5pEhKZLrwiJnI2zyw/pznJxL9a/Eugw==" 179 | }, 180 | "d3-interpolate": { 181 | "version": "1.1.6", 182 | "resolved": "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-1.1.6.tgz", 183 | "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==", 184 | "requires": { 185 | "d3-color": "1" 186 | } 187 | }, 188 | "d3-path": { 189 | "version": "1.0.5", 190 | "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-1.0.5.tgz", 191 | "integrity": "sha512-eD76prgnTKYkLzHlY2UMyOEZXTpC+WOanCr1BLxo38w4fPPPq/LgCFqRQvqFU3AJngfZmmKR7rgKPZ4EGJ9Atw==" 192 | }, 193 | "d3-polygon": { 194 | "version": "1.0.3", 195 | "resolved": "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-1.0.3.tgz", 196 | "integrity": "sha512-2zP7GOvf4XOWTeQouK7fCO534yQxyhYYTw6GTqcXifIalHgA6qV/es+4GRQii9m6XxEPFcht4loobD/o2iEo1A==" 197 | }, 198 | "d3-quadtree": { 199 | "version": "1.0.3", 200 | "resolved": "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-1.0.3.tgz", 201 | "integrity": "sha512-U2Jc3jF3JOBGXIOnvWY9C4ekRwRX9hEVpMMmeduJyaxAwPmoe7t84iZFTLn1RwYOyrXxJF55H/Hrg186TFQQdw==" 202 | }, 203 | "d3-queue": { 204 | "version": "3.0.7", 205 | "resolved": "https://registry.npmmirror.com/d3-queue/-/d3-queue-3.0.7.tgz", 206 | "integrity": "sha512-2rs+6pNFKkrJhqe1rg5znw7dKJ7KZr62j9aLZfhondkrnz6U7VRmJj1UGcbD8MRc46c7H8m4SWhab8EalBQrkw==" 207 | }, 208 | "d3-random": { 209 | "version": "1.1.0", 210 | "resolved": "https://registry.npmmirror.com/d3-random/-/d3-random-1.1.0.tgz", 211 | "integrity": "sha512-XuMbjx3Jq4EWfJP4g6nR7zns/bZfaVbWHWfR8auDkEiWCzVbWifmasfszV1ZRN3xXK3nY4RUFL2nTIhceGZSFQ==" 212 | }, 213 | "d3-request": { 214 | "version": "1.0.6", 215 | "resolved": "https://registry.npmmirror.com/d3-request/-/d3-request-1.0.6.tgz", 216 | "integrity": "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==", 217 | "requires": { 218 | "d3-collection": "1", 219 | "d3-dispatch": "1", 220 | "d3-dsv": "1", 221 | "xmlhttprequest": "1" 222 | } 223 | }, 224 | "d3-scale": { 225 | "version": "1.0.7", 226 | "resolved": "https://registry.npmmirror.com/d3-scale/-/d3-scale-1.0.7.tgz", 227 | "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", 228 | "requires": { 229 | "d3-array": "^1.2.0", 230 | "d3-collection": "1", 231 | "d3-color": "1", 232 | "d3-format": "1", 233 | "d3-interpolate": "1", 234 | "d3-time": "1", 235 | "d3-time-format": "2" 236 | } 237 | }, 238 | "d3-scale-chromatic": { 239 | "version": "1.5.0", 240 | "resolved": "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", 241 | "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", 242 | "requires": { 243 | "d3-color": "1", 244 | "d3-interpolate": "1" 245 | } 246 | }, 247 | "d3-selection": { 248 | "version": "1.3.0", 249 | "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-1.3.0.tgz", 250 | "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" 251 | }, 252 | "d3-shape": { 253 | "version": "1.2.0", 254 | "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-1.2.0.tgz", 255 | "integrity": "sha512-LP48zJ9ykPKjCdd0vSu5k2l4s8v1vI6vvdDeJtmgtTa+L6Ery0lzvOaV7pMunFuLv11hwSRZQnSnlhFl801aiw==", 256 | "requires": { 257 | "d3-path": "1" 258 | } 259 | }, 260 | "d3-time": { 261 | "version": "1.0.8", 262 | "resolved": "https://registry.npmmirror.com/d3-time/-/d3-time-1.0.8.tgz", 263 | "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" 264 | }, 265 | "d3-time-format": { 266 | "version": "2.1.1", 267 | "resolved": "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-2.1.1.tgz", 268 | "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", 269 | "requires": { 270 | "d3-time": "1" 271 | } 272 | }, 273 | "d3-timer": { 274 | "version": "1.0.7", 275 | "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-1.0.7.tgz", 276 | "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" 277 | }, 278 | "d3-transition": { 279 | "version": "1.1.1", 280 | "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-1.1.1.tgz", 281 | "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==", 282 | "requires": { 283 | "d3-color": "1", 284 | "d3-dispatch": "1", 285 | "d3-ease": "1", 286 | "d3-interpolate": "1", 287 | "d3-selection": "^1.1.0", 288 | "d3-timer": "1" 289 | } 290 | }, 291 | "d3-voronoi": { 292 | "version": "1.1.2", 293 | "resolved": "https://registry.npmmirror.com/d3-voronoi/-/d3-voronoi-1.1.2.tgz", 294 | "integrity": "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==" 295 | }, 296 | "d3-zoom": { 297 | "version": "1.7.1", 298 | "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-1.7.1.tgz", 299 | "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==", 300 | "requires": { 301 | "d3-dispatch": "1", 302 | "d3-drag": "1", 303 | "d3-interpolate": "1", 304 | "d3-selection": "1", 305 | "d3-transition": "1" 306 | } 307 | }, 308 | "iconv-lite": { 309 | "version": "0.4.24", 310 | "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", 311 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 312 | "requires": { 313 | "safer-buffer": ">= 2.1.2 < 3" 314 | } 315 | }, 316 | "intersection-observer": { 317 | "version": "0.5.1", 318 | "resolved": "https://registry.npmmirror.com/intersection-observer/-/intersection-observer-0.5.1.tgz", 319 | "integrity": "sha512-Zd7Plneq82kiXFixs7bX62YnuZ0BMRci9br7io88LwDyF3V43cQMI+G5IiTlTNTt+LsDUppl19J/M2Fp9UkH6g==" 320 | }, 321 | "lodash.debounce": { 322 | "version": "4.0.8", 323 | "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", 324 | "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" 325 | }, 326 | "nanoid": { 327 | "version": "3.3.7", 328 | "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz", 329 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" 330 | }, 331 | "picocolors": { 332 | "version": "1.0.0", 333 | "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", 334 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 335 | }, 336 | "postcss": { 337 | "version": "8.4.35", 338 | "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.35.tgz", 339 | "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", 340 | "requires": { 341 | "nanoid": "^3.3.7", 342 | "picocolors": "^1.0.0", 343 | "source-map-js": "^1.0.2" 344 | } 345 | }, 346 | "prettier": { 347 | "version": "2.8.8", 348 | "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz", 349 | "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", 350 | "optional": true 351 | }, 352 | "rw": { 353 | "version": "1.3.3", 354 | "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", 355 | "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" 356 | }, 357 | "safer-buffer": { 358 | "version": "2.1.2", 359 | "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", 360 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 361 | }, 362 | "source-map": { 363 | "version": "0.6.1", 364 | "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", 365 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 366 | }, 367 | "source-map-js": { 368 | "version": "1.0.2", 369 | "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", 370 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" 371 | }, 372 | "vue": { 373 | "version": "2.7.16", 374 | "resolved": "https://registry.npmmirror.com/vue/-/vue-2.7.16.tgz", 375 | "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", 376 | "requires": { 377 | "@vue/compiler-sfc": "2.7.16", 378 | "csstype": "^3.1.0" 379 | } 380 | }, 381 | "vue-resize-directive": { 382 | "version": "1.2.0", 383 | "resolved": "https://registry.npmmirror.com/vue-resize-directive/-/vue-resize-directive-1.2.0.tgz", 384 | "integrity": "sha512-LmpFexQcl1XYyz3DQrTrq3Efgj50MKEON60nR9MMAq1D2ZtXFg1WDcy1wy1T0SeduNtIu9hos2aLTsJUplvjlQ==", 385 | "requires": { 386 | "css-element-queries": "^1.0.2", 387 | "intersection-observer": "^0.5.0", 388 | "lodash.debounce": "^4.0.8" 389 | } 390 | }, 391 | "vue-wordcloud": { 392 | "version": "1.1.1", 393 | "resolved": "https://registry.npmmirror.com/vue-wordcloud/-/vue-wordcloud-1.1.1.tgz", 394 | "integrity": "sha512-Gs78q+mmQbI21OolpZY2b7YYdbb7wGHvIZCP+zsomxOsWICaInKTVqJADXdNtjGdBHH9JB3X9NEqBMgBVnvaUQ==", 395 | "requires": { 396 | "d3": "^4.10.0", 397 | "d3-cloud": "^1.2.4", 398 | "d3-scale-chromatic": "^1.3.3", 399 | "vue": "^2.3.3", 400 | "vue-resize-directive": "^1.0.0" 401 | } 402 | }, 403 | "xmlhttprequest": { 404 | "version": "1.8.0", 405 | "resolved": "https://registry.npmmirror.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", 406 | "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==" 407 | } 408 | } 409 | } 410 | -------------------------------------------------------------------------------- /web/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/.DS_Store -------------------------------------------------------------------------------- /web/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /web/docs/css/app.9375d4e5.css: -------------------------------------------------------------------------------- 1 | .title[data-v-b82f994e]{color:#fff;line-height:1;display:grid;grid-template-columns:-webkit-max-content 1fr;grid-template-columns:max-content 1fr}.title .a[data-v-b82f994e]{font-size:25vw}.title .b[data-v-b82f994e]{padding-top:1em;font-size:5vw}.title .c[data-v-b82f994e]{font-size:10vw}.human .boy[data-v-b82f994e]{top:-10vh}.human .boy[data-v-b82f994e],.human .girl[data-v-b82f994e]{position:relative;-webkit-animation:up-down-data-v-b82f994e 2s ease-in-out infinite both;animation:up-down-data-v-b82f994e 2s ease-in-out infinite both}.human .girl[data-v-b82f994e]{top:-20vh;left:30vw}@-webkit-keyframes up-down-data-v-b82f994e{0%{transform:translateY(1vh)}50%{transform:translateY(0)}to{transform:translateY(1vh)}}@keyframes up-down-data-v-b82f994e{0%{transform:translateY(1vh)}50%{transform:translateY(0)}to{transform:translateY(1vh)}}.human .boy .a[data-v-b82f994e]{width:27vw;position:relative;left:10vw;top:15vh;z-index:2}.human .boy .b[data-v-b82f994e]{width:50vw;position:relative;left:-30vw;top:20vh}.human .girl .a[data-v-b82f994e]{width:57vw;position:relative;left:5vw;top:15vh;z-index:2}.human .girl .b[data-v-b82f994e]{width:50vw;position:relative;left:5vw;top:-5vh}.star[data-v-b82f994e]{position:absolute;bottom:10vh;left:35vw}.star .circle[data-v-b82f994e]{width:30vw;height:30vw;border-radius:100%;background-color:#f04b3f;text-align:center;font-size:25vw;color:#fff;-webkit-animation:hvr-ripple-out-data-v-b82f994e 2s ease-in-out infinite alternate both;animation:hvr-ripple-out-data-v-b82f994e 2s ease-in-out infinite alternate both}@-webkit-keyframes hvr-ripple-out-data-v-b82f994e{to{transform:scale(1.05)}}@keyframes hvr-ripple-out-data-v-b82f994e{to{transform:scale(1.05)}}.star .label[data-v-b82f994e]{font-size:5vw;text-align:center;font-weight:lighter}.a[data-v-1ac34a22],.b[data-v-1ac34a22],.c[data-v-1ac34a22]{text-align:center;color:#fff}.a[data-v-1ac34a22]{font-size:8vw;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.a[data-v-1ac34a22],.b[data-v-1ac34a22]{padding-top:15vh;-webkit-animation-name:slide-top;animation-name:slide-top;-webkit-animation-duration:1s;animation-duration:1s}.b[data-v-1ac34a22]{font-size:6vw;-webkit-animation-delay:1s;animation-delay:1s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.c[data-v-1ac34a22]{font-weight:lighter;-webkit-animation-delay:1.5s;animation-delay:1.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.a[data-v-ca7d3b68],.c[data-v-1ac34a22]{font-size:5vw;-webkit-animation-name:slide-top;animation-name:slide-top;-webkit-animation-duration:1s;animation-duration:1s}.a[data-v-ca7d3b68]{padding-top:15vh;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.b[data-v-ca7d3b68]{-webkit-animation-delay:1s;animation-delay:1s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.b[data-v-ca7d3b68],.c[data-v-ca7d3b68]{-webkit-animation-name:slide-top;animation-name:slide-top;-webkit-animation-duration:1s;animation-duration:1s}.c[data-v-ca7d3b68]{-webkit-animation-delay:2s;animation-delay:2s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.d[data-v-ca7d3b68]{padding-top:10vh;-webkit-animation-delay:2.5s;animation-delay:2.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.a[data-v-6c3eee52],.d[data-v-ca7d3b68]{font-size:5vw;-webkit-animation-name:slide-top;animation-name:slide-top;-webkit-animation-duration:1s;animation-duration:1s}.a[data-v-6c3eee52]{padding-top:15vh;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.b[data-v-6c3eee52]{padding-top:5vh;white-space:normal;text-overflow:ellipsis;overflow:hidden;line-height:2;color:ebf45f}.b[data-v-6c3eee52],.c[data-v-6c3eee52]{-webkit-animation-delay:1s;animation-delay:1s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.b[data-v-6c3eee52],.c[data-v-6c3eee52],.d[data-v-6c3eee52]{-webkit-animation-name:slide-top;animation-name:slide-top;-webkit-animation-duration:1s;animation-duration:1s}.d[data-v-6c3eee52]{text-align:right;padding-top:3vh;font-weight:bolder;-webkit-animation-delay:1.5s;animation-delay:1.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.a[data-v-38b99058]{font-size:5vw;padding-top:15vh;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.a[data-v-38b99058],.b[data-v-38b99058]{-webkit-animation-name:slide-top;animation-name:slide-top;-webkit-animation-duration:1s;animation-duration:1s}.b[data-v-38b99058]{padding-top:5vh;white-space:normal;text-overflow:ellipsis;overflow:hidden;line-height:2;color:ebf45f;-webkit-animation-delay:1s;animation-delay:1s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.c[data-v-38b99058]{-webkit-animation-delay:1.5s;animation-delay:1.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.c[data-v-38b99058],.d[data-v-38b99058]{-webkit-animation-name:slide-top;animation-name:slide-top;-webkit-animation-duration:1s;animation-duration:1s}.d[data-v-38b99058]{text-align:right;padding-top:3vh;font-weight:bolder;-webkit-animation-delay:2s;animation-delay:2s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.e[data-v-38b99058]{-webkit-animation-delay:2.5s;animation-delay:2.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.a[data-v-109abf35],.e[data-v-38b99058]{-webkit-animation-name:slide-top;animation-name:slide-top;-webkit-animation-duration:1s;animation-duration:1s}.a[data-v-109abf35]{-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.b img[data-v-109abf35]{width:100%}.b img[data-v-109abf35],.chart[data-v-0601a1af]{-webkit-animation-name:slide-top;animation-name:slide-top;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:1s;animation-delay:1s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.chart[data-v-0601a1af]{width:100vw;height:50vh}.a[data-v-0601a1af]{padding-top:15vh;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.a[data-v-0601a1af],.chart[data-v-6721cfb1]{-webkit-animation-name:slide-top;animation-name:slide-top;-webkit-animation-duration:1s;animation-duration:1s}.chart[data-v-6721cfb1]{width:100vw;height:50vh;-webkit-animation-delay:1s;animation-delay:1s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.a[data-v-6721cfb1]{padding-top:15vh;-webkit-animation-name:slide-top;animation-name:slide-top;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:.5s;animation-delay:.5s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}.v[data-v-4c5e150c]{background-image:linear-gradient(#f89d92,#fac9bf);height:100%;color:#73e373}.a[data-v-4c5e150c]{margin-top:10vh;height:60vh;border:5px solid #73e373;background:#fef9f9;padding:5vw}.b[data-v-4c5e150c]{font-size:13vw;padding-bottom:unset}.c[data-v-4c5e150c]{font-size:5vw;font-weight:700;padding-bottom:5vh}.d[data-v-4c5e150c]{color:#000;font-weight:700}.e[data-v-4c5e150c]{color:#000;font-size:12vw}.f[data-v-4c5e150c]{height:1px;background:#73e373;width:30vw;margin-top:2vh;margin-bottom:2vh}.p[data-v-4c5e150c]{position:absolute;width:27vw;left:55vw;top:40vh;z-index:2}.y[data-v-4c5e150c]{position:absolute;width:60vw;left:36vw;top:50vh}.i[data-v-4c5e150c],.j[data-v-4c5e150c]{position:absolute;color:#3c4739}.j[data-v-4c5e150c]{font-size:15vw;top:25vh;left:50vw}.i[data-v-4c5e150c]{font-size:15vw;top:32vh;left:53vw}body,html{padding:0;margin:0;color:#fff}#app,body,html{height:100vh;overflow:hidden}#app{background-image:linear-gradient(#1f9ef4,#a1e1ff);font-family:Microsoft YaHei,微软雅黑,Microsoft JhengHei,华文细黑,STHeiti,MingLiu;font-size:4vw}.box{padding:5vw;padding-top:10vw;overflow:hidden}.delay{-webkit-animation-name:delay-display;animation-name:delay-display;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-delay:.3s;animation-delay:.3s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards}@-webkit-keyframes delay-display{0%{opacity:0}to{opacity:1}}@keyframes delay-display{0%{opacity:0}to{opacity:1}}@-webkit-keyframes slide-top{0%{opacity:0;transform:translateY(10vh)}to{opacity:1;transform:translateY(0)}}@keyframes slide-top{0%{opacity:0;transform:translateY(10vh)}to{opacity:1;transform:translateY(0)}}.value{display:inline-block;padding:5px;transform:scaleY(1.1) translateY(-5.2%);font-weight:bolder;color:#ebf45f}.footer[data-v-7725176c]{background-image:url(../img/foot.f81a63da.png);background-size:cover;width:100vw;height:20vh;position:absolute;bottom:0;overflow:hidden}.mask[data-v-7725176c]{width:100vw;height:100vh;z-index:-1;position:absolute;top:0;-webkit-animation:up-move-data-v-7725176c 1s;animation:up-move-data-v-7725176c 1s;background-image:url(../img/mask.bdd881c5.png);background-repeat:repeat-x;background-size:contain}@-webkit-keyframes up-move-data-v-7725176c{0%{transform:translateY(0);z-index:-1}to{transform:translateY(-100vh);z-index:2}}@keyframes up-move-data-v-7725176c{0%{transform:translateY(0);z-index:-1}to{transform:translateY(-100vh);z-index:2}} -------------------------------------------------------------------------------- /web/docs/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/docs/favicon.ico -------------------------------------------------------------------------------- /web/docs/img/boy.6cb9ac8f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/docs/img/boy.6cb9ac8f.png -------------------------------------------------------------------------------- /web/docs/img/cloud1.c1599773.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/docs/img/cloud1.c1599773.png -------------------------------------------------------------------------------- /web/docs/img/cloud2.794b62cd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/docs/img/cloud2.794b62cd.png -------------------------------------------------------------------------------- /web/docs/img/cy.e58cda03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/docs/img/cy.e58cda03.png -------------------------------------------------------------------------------- /web/docs/img/foot.f81a63da.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/docs/img/foot.f81a63da.png -------------------------------------------------------------------------------- /web/docs/img/girl.40b358d4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/docs/img/girl.40b358d4.png -------------------------------------------------------------------------------- /web/docs/img/mask.bdd881c5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/docs/img/mask.bdd881c5.png -------------------------------------------------------------------------------- /web/docs/img/result.e064ea5d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/docs/img/result.e064ea5d.png -------------------------------------------------------------------------------- /web/docs/index.html: -------------------------------------------------------------------------------- 1 | wechat-reportWe're sorry but wechat-report doesn't work properly without JavaScript enabled. Please enable it to continue. -------------------------------------------------------------------------------- /web/docs/js/app.b8e9b973.js: -------------------------------------------------------------------------------- 1 | (function(t){function s(s){for(var a,c,r=s[0],o=s[1],l=s[2],v=0,f=[];vs[1]&&(s=a)}}catch(n){e.e(n)}finally{e.f()}return s}},mounted:function(){this.myChart=V["a"](this.$refs.chart),this.myChart.setOption({tooltip:{},xAxis:{},yAxis:{},series:[{type:"bar",data:this.arr,itemStyle:{color:"#ebf45f"},clip:!1}]})}},q=Z,Q=(e("73ff"),Object(u["a"])(q,B,K,!1,null,"0601a1af",null)),X=Q.exports,Y=function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",[e("div",{staticClass:"a"},[t._v(" 这一年我们最喜欢在 "),e("span",{staticClass:"value"},[t._v(" "+t._s(t.maxMonth[0])+" ")]),t._v("点聊天 说的话 有"),e("span",{staticClass:"value"},[t._v(" "+t._s(t.maxMonth[1])+" ")]),t._v("条 ")]),e("div",{ref:"chart",staticClass:"chart"})])},tt=[],st={data:function(){return{myChart:void 0,arr:y["hourGroup"]}},computed:{maxMonth:function(){var t,s=this.arr[0],e=Object(U["a"])(this.arr);try{for(e.s();!(t=e.n()).done;){var a=t.value;a[1]>s[1]&&(s=a)}}catch(n){e.e(n)}finally{e.f()}return s}},mounted:function(){this.myChart=V["a"](this.$refs.chart),this.myChart.setOption({tooltip:{},xAxis:{},yAxis:{},series:[{type:"line",data:this.arr,itemStyle:{color:"#d5cede"},clip:!1,symbol:"none"}],animationDuration:5e3})}},et=st,at=(e("6faa"),Object(u["a"])(et,Y,tt,!1,null,"6721cfb1",null)),nt=at.exports,it=function(){var t=this,s=t.$createElement,e=t._self._c||s;return e("div",{staticClass:"v"},[e("div",{staticClass:"a"},[e("div",{staticClass:"b"},[t._v("#2021")]),e("div",{staticClass:"c"},[t._v("年度聊天报告")]),e("div",{staticClass:"d"},[t._v("关键词")]),e("div",{staticClass:"e"},[t._v("吃")]),e("div",{staticClass:"f"}),e("div",{staticClass:"d"},[t._v("爱意词")]),e("div",{staticClass:"e"},[t._v(t._s(t.b))]),e("div",{staticClass:"f"}),e("div",{staticClass:"d"},[t._v("话痨月")]),e("div",{staticClass:"e",staticStyle:{"font-size":"5vw"}},[t._v(t._s(t.c)+"月")]),e("div",{staticClass:"f"}),t._m(0),e("div",{staticClass:"j"},[t._v("再见")]),e("div",{staticClass:"i"},[t._v("2021")])])])},ct=[function(){var t=this,s=t.$createElement,a=t._self._c||s;return a("div",{staticClass:"h"},[a("img",{staticClass:"p",attrs:{src:e("173c")}}),a("img",{staticClass:"y",attrs:{src:e("991c")}})])}],rt=(e("d3b7"),e("159b"),e("b64b"),{data:function(){var t,s=y.loveWord,e=y.mostWord,a=y.monthGroup,n=a[0],i=Object(U["a"])(a);try{for(i.s();!(t=i.n()).done;){var c=t.value;c[1]>n[1]&&(n=c)}}catch(l){i.e(l)}finally{i.f()}var r={w:"",c:0};Object.keys(s).forEach((function(t){var e=s[t];e>r.c&&(r={w:t,c:e})}));var o={w:"",c:0};return Object.keys(e).forEach((function(t){var s=e[t];s>o.c&&(o={w:t,c:s})})),{a:o.w,b:r.w,c:n[0]}}}),ot=rt,lt=(e("d3b0"),Object(u["a"])(ot,it,ct,!1,null,"4c5e150c",null)),ut=lt.exports,vt={name:"App",components:{FirstPage:f,SecondPage:C,ThirdPage:E,ForthPage:A,FifthPage:F,SixthPage:J,SeventhPage:X,EighthPage:nt,NinthPage:ut},data:function(){return{step:1,mask:!0}},computed:{handleMask:function(){return{mask:this.mask}},isMobile:function(){return/AppleWebKit.*Mobile/i.test(navigator.userAgent)||/MIDP|SymbianOS|NOKIA|SAMSUNG|LG|NEC|TCL|Alcatel|BIRD|DBTEL|Dopod|PHILIPS|HAIER|LENOVO|MOT-|Nokia|SonyEricsson|SIE-|Amoi|ZTE/.test(navigator.userAgent)}},watch:{step:function(){var t=this;this.mask=!1,setTimeout((function(){t.mask=!0}))}},methods:{next:function(){9!==this.step&&this.step++}}},ft=vt,dt=(e("034f"),e("7922"),Object(u["a"])(ft,n,i,!1,null,"7725176c",null)),_t=dt.exports;a["a"].config.productionTip=!1,new a["a"]({render:function(t){return t(_t)}}).$mount("#app")},"60e6":function(t,s,e){"use strict";e("48fd")},"689a":function(t,s,e){},"6faa":function(t,s,e){"use strict";e("7312")},7151:function(t,s,e){},7312:function(t,s,e){},"73ff":function(t,s,e){"use strict";e("689a")},7922:function(t,s,e){"use strict";e("a602")},"85ec":function(t,s,e){},8771:function(t,s,e){t.exports=e.p+"img/cloud1.c1599773.png"},"980c":function(t,s,e){t.exports=e.p+"img/boy.6cb9ac8f.png"},"991c":function(t,s,e){t.exports=e.p+"img/cloud2.794b62cd.png"},a602:function(t,s,e){},aa97:function(t,s,e){},aedd:function(t,s,e){t.exports=e.p+"img/girl.40b358d4.png"},c2f5:function(t,s,e){"use strict";e("ddcc")},ca46:function(t,s,e){},d3b0:function(t,s,e){"use strict";e("f5b1")},d4b6:function(t,s,e){"use strict";e("162c")},ddcc:function(t,s,e){},de80:function(t,s,e){"use strict";e("7151")},f5b1:function(t,s,e){}}); 2 | //# sourceMappingURL=app.b8e9b973.js.map -------------------------------------------------------------------------------- /web/docs/js/app.b8e9b973.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/App.vue?4a62","webpack:///./src/assets/images/result.png","webpack:///./src/components/ForthPage/index.vue?c3b6","webpack:///./src/assets/images/cy.png","webpack:///./src/components/SecondPage/index.vue?a3c7","webpack:///./src/App.vue?8b70","webpack:///./src/components/FirstPage/index.vue?bd67","webpack:///src/components/FirstPage/index.vue","webpack:///./src/components/FirstPage/index.vue?285c","webpack:///./src/components/FirstPage/index.vue","webpack:///./src/components/SecondPage/index.vue?1a83","webpack:///src/components/SecondPage/index.vue","webpack:///./src/components/SecondPage/index.vue?6d9a","webpack:///./src/components/SecondPage/index.vue","webpack:///./src/components/ThirdPage/index.vue?5bd9","webpack:///src/components/ThirdPage/index.vue","webpack:///./src/components/ThirdPage/index.vue?4bb2","webpack:///./src/components/ThirdPage/index.vue","webpack:///./src/components/ForthPage/index.vue?693d","webpack:///src/components/ForthPage/index.vue","webpack:///./src/components/ForthPage/index.vue?3853","webpack:///./src/components/ForthPage/index.vue","webpack:///./src/components/FifthPage/index.vue?88bd","webpack:///src/components/FifthPage/index.vue","webpack:///./src/components/FifthPage/index.vue?828c","webpack:///./src/components/FifthPage/index.vue","webpack:///./src/components/SixthPage/index.vue?3025","webpack:///src/components/SixthPage/index.vue","webpack:///./src/components/SixthPage/index.vue?a810","webpack:///./src/components/SixthPage/index.vue","webpack:///./src/components/SeventhPage/index.vue?7975","webpack:///src/components/SeventhPage/index.vue","webpack:///./src/components/SeventhPage/index.vue?d12e","webpack:///./src/components/SeventhPage/index.vue","webpack:///./src/components/EighthPage/index.vue?e284","webpack:///src/components/EighthPage/index.vue","webpack:///./src/components/EighthPage/index.vue?95ce","webpack:///./src/components/EighthPage/index.vue","webpack:///./src/components/NinthPage/index.vue?24ec","webpack:///src/components/NinthPage/index.vue","webpack:///./src/components/NinthPage/index.vue?35e9","webpack:///./src/components/NinthPage/index.vue","webpack:///src/App.vue","webpack:///./src/App.vue?60d0","webpack:///./src/App.vue","webpack:///./src/main.js","webpack:///./src/components/ThirdPage/index.vue?3edb","webpack:///./src/components/EighthPage/index.vue?5d23","webpack:///./src/components/SeventhPage/index.vue?a5fc","webpack:///./src/App.vue?55f7","webpack:///./src/assets/images/cloud1.png","webpack:///./src/assets/images/boy.png","webpack:///./src/assets/images/cloud2.png","webpack:///./src/assets/images/girl.png","webpack:///./src/components/SixthPage/index.vue?607e","webpack:///./src/components/NinthPage/index.vue?64b3","webpack:///./src/components/FirstPage/index.vue?c791","webpack:///./src/components/FifthPage/index.vue?12ae"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","_vm","this","_h","$createElement","_c","_self","attrs","on","$event","stopPropagation","next","arguments","step","staticClass","_e","nativeOn","class","handleMask","_v","staticRenderFns","_m","$emit","component","_s","count","imgCount","voiceCount","_l","word","index","content","substring","time","hour","staticStyle","user","maxMonth","ref","myChart","undefined","arr","computed","max","mounted","echarts","setOption","tooltip","xAxis","yAxis","series","animationDuration","b","w","keys","loveWord","forEach","lc","mostWord","mc","a","components","FirstPage","SecondPage","ThirdPage","ForthPage","FifthPage","SixthPage","SeventhPage","EighthPage","NinthPage","mask","isMobile","watch","setTimeout","methods","Vue","config","productionTip","render","h","App","$mount"],"mappings":"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","file":"js/app.b8e9b973.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=css&\"","module.exports = __webpack_public_path__ + \"img/result.e064ea5d.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=6c3eee52&scoped=true&lang=css&\"","module.exports = __webpack_public_path__ + \"img/cy.e58cda03.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=1ac34a22&scoped=true&lang=css&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"},on:{\"!click\":function($event){$event.stopPropagation();return _vm.next.apply(null, arguments)}}},[(_vm.isMobile)?[(_vm.step === 1)?_c('FirstPage',{staticClass:\"delay box\",on:{\"start\":_vm.next}}):_vm._e(),(_vm.step === 2)?_c('SecondPage',{staticClass:\"delay box\",nativeOn:{\"click\":function($event){return _vm.next.apply(null, arguments)}}}):_vm._e(),(_vm.step === 3)?_c('ThirdPage',{staticClass:\"delay box\",on:{\"next\":_vm.next}}):_vm._e(),(_vm.step === 4)?_c('ForthPage',{staticClass:\"delay box\",on:{\"next\":_vm.next}}):_vm._e(),(_vm.step === 5)?_c('FifthPage',{staticClass:\"delay box\",on:{\"next\":_vm.next}}):_vm._e(),(_vm.step === 6)?_c('SixthPage',{staticClass:\"delay box\",on:{\"next\":_vm.next}}):_vm._e(),(_vm.step === 7)?_c('SeventhPage',{staticClass:\"delay box\",on:{\"next\":_vm.next}}):_vm._e(),(_vm.step === 8)?_c('EighthPage',{staticClass:\"delay box\",on:{\"next\":_vm.next}}):_vm._e(),(_vm.step === 9)?_c('NinthPage',{staticClass:\"delay box\",on:{\"next\":_vm.next}}):_vm._e(),(_vm.step !== 9)?_c('div',{staticClass:\"footer\"}):_vm._e(),_c('div',{class:_vm.handleMask})]:[_vm._v(\" 请用手机查看 \")]],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"box\"},[_vm._m(0),_vm._m(1),_c('div',{staticClass:\"star\"},[_c('div',{staticClass:\"circle\",on:{\"click\":function($event){return _vm.$emit('start')}}},[_c('div',{staticClass:\"left\",on:{\"click\":function($event){return _vm.$emit('start')}}},[_vm._v(\"→\")])]),_c('div',{staticClass:\"label\",on:{\"click\":function($event){return _vm.$emit('start')}}},[_vm._v(\"点击开启\")])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"title\"},[_c('div',{staticClass:\"a\"},[_vm._v(\"2021\")]),_c('div',{staticClass:\"b\"},[_vm._v(\" WECHAT \"),_c('br'),_vm._v(\" REPORT \")]),_c('div',{staticClass:\"c\"},[_vm._v(\"年度聊天报告\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"human\"},[_c('div',{staticClass:\"boy\"},[_c('img',{staticClass:\"a\",attrs:{\"src\":require(\"@/assets/images/boy.png\")}}),_c('img',{staticClass:\"b\",attrs:{\"src\":require(\"@/assets/images/cloud1.png\")}})]),_c('div',{staticClass:\"girl\"},[_c('img',{staticClass:\"a\",attrs:{\"src\":require(\"@/assets/images/girl.png\")}}),_c('img',{staticClass:\"b\",attrs:{\"src\":require(\"@/assets/images/cloud2.png\")}})])])}]\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n 2021\r\n \r\n WECHAT\r\n \r\n REPORT\r\n \r\n 年度聊天报告\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n →\r\n \r\n 点击开启\r\n \r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=b82f994e&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=b82f994e&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"b82f994e\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"a\"},[_vm._v(\"我们又在一起了一年\")]),_c('div',{staticClass:\"b\"},[_vm._v(\"年年有我,岁岁有我\")]),_c('div',{staticClass:\"c\"},[_vm._v(\"出发去看看我们的2021吧~\")])])}]\n\nexport { render, staticRenderFns }","\r\n \r\n 我们又在一起了一年\r\n 年年有我,岁岁有我\r\n 出发去看看我们的2021吧~\r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=1ac34a22&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=1ac34a22&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1ac34a22\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"a\"},[_vm._v(\" 今年我们一共发了 \"),_c('span',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.count)+\" \")]),_vm._v(\" 条消息 \")]),_c('div',{staticClass:\"b\"},[_vm._v(\" 其中有 \"),_c('span',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.imgCount)+\" \")]),_vm._v(\" 是图片 其中有 \"),_c('span',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.voiceCount)+\" \")]),_vm._v(\" 是语音 \")]),_c('div',{staticClass:\"c\"},[_vm._l((_vm.loveWord),function(count,word,index){return _c('div',{key:index},[_vm._v(\" 说\"+_vm._s(word)+\" \"),_c('span',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(count)+\" \")]),_vm._v(\"次 \")])}),_c('div',[_vm._v(\"...\")])],2),_vm._m(0)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"d\"},[_vm._v(\"比起网络\"),_c('br'),_vm._v(\"我们更喜欢在现实表达爱意\")])}]\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n 今年我们一共发了\r\n {{ count }} \r\n 条消息\r\n \r\n \r\n 其中有\r\n {{ imgCount }} \r\n 是图片 其中有\r\n {{ voiceCount }} \r\n 是语音\r\n \r\n \r\n \r\n 说{{ word }} {{ count }} 次\r\n \r\n ...\r\n \r\n 比起网络我们更喜欢在现实表达爱意\r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=ca7d3b68&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=ca7d3b68&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"ca7d3b68\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"a\"},[_vm._v(\" 这一年 我们说过最长的一句话 \"),_c('span',{staticClass:\"value\"},[_vm._v(_vm._s(_vm.content.length))]),_vm._v(\"字 \")]),_c('div',{staticClass:\"b\"},[_vm._v(\" \"+_vm._s(_vm.content.substring(0, 100))+\" \")]),_c('div',{staticClass:\"c\"},[_vm._v(\"...\")]),_c('div',{staticClass:\"d\"},[_vm._v(\" \"+_vm._s(_vm.time)+\" \")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n 这一年 我们说过最长的一句话 {{ content.length }}字\r\n \r\n \r\n {{ content.substring(0, 100) }}\r\n \r\n ...\r\n \r\n {{ time }}\r\n \r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=6c3eee52&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=6c3eee52&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6c3eee52\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"a\"},[_vm._v(\" 这一年 我们说过最晚的一句话 \"),_c('br'),_vm._v(\" 在凌晨 \"),_c('span',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.hour)+\" \")]),_vm._v(\" 点 \")]),_c('div',{staticClass:\"b\"},[_c('span',{staticStyle:{\"font-size\":\"3.6vw\"}},[_vm._v(\" \"+_vm._s(_vm.user)+\": \")]),_vm._v(\" \"+_vm._s(_vm.content)+\" \")]),_c('div',{staticClass:\"c\"},[_vm._v(\"...\")]),_c('div',{staticClass:\"d\"},[_vm._v(\" \"+_vm._s(_vm.time)+\" \")]),_c('div',{staticClass:\"e\",staticStyle:{\"padding-top\":\"5vh\",\"font-size\":\"5vw\"}},[_vm._v(\"那天在做什么还能记起来吗\")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n 这一年 我们说过最晚的一句话\r\n \r\n 在凌晨\r\n \r\n {{ hour }}\r\n \r\n 点\r\n \r\n \r\n {{ user }}: \r\n {{ content }}\r\n \r\n ...\r\n \r\n {{ time }}\r\n \r\n\r\n 那天在做什么还能记起来吗\r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=38b99058&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=38b99058&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"38b99058\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"a\",staticStyle:{\"padding-top\":\"15vh\"}},[_vm._v(\" 这一年 我们说过最多的词是 \"),_c('span',{staticClass:\"value\",staticStyle:{\"font-size\":\"5vw\"}},[_vm._v(\" \"+_vm._s(_vm.content)+\" \")]),_vm._v(\" 居然有 \"),_c('span',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.count)+\"次\")])]),_vm._m(0)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"b\"},[_c('img',{attrs:{\"src\":require(\"@/assets/images/cy.png\")}})])}]\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n 这一年 我们说过最多的词是\r\n\r\n {{ content }} \r\n 居然有\r\n {{ count }}次\r\n \r\n \r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=109abf35&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=109abf35&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"109abf35\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"a\"},[_vm._v(\" 这一年我们 \"),_c('span',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.maxMonth[0])+\" \")]),_vm._v(\"月 说的话最多 有\"),_c('span',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.maxMonth[1])+\" \")]),_vm._v(\"条 \")]),_c('div',{ref:\"chart\",staticClass:\"chart\"})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n 这一年我们\r\n {{ maxMonth[0] }} 月 说的话最多 有\r\n {{ maxMonth[1] }} 条\r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=0601a1af&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=0601a1af&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0601a1af\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{staticClass:\"a\"},[_vm._v(\" 这一年我们最喜欢在 \"),_c('span',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.maxMonth[0])+\" \")]),_vm._v(\"点聊天 说的话 有\"),_c('span',{staticClass:\"value\"},[_vm._v(\" \"+_vm._s(_vm.maxMonth[1])+\" \")]),_vm._v(\"条 \")]),_c('div',{ref:\"chart\",staticClass:\"chart\"})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n 这一年我们最喜欢在\r\n {{ maxMonth[0] }} 点聊天 说的话 有\r\n {{ maxMonth[1] }} 条\r\n \r\n \r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=6721cfb1&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=6721cfb1&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6721cfb1\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"v\"},[_c('div',{staticClass:\"a\"},[_c('div',{staticClass:\"b\"},[_vm._v(\"#2021\")]),_c('div',{staticClass:\"c\"},[_vm._v(\"年度聊天报告\")]),_c('div',{staticClass:\"d\"},[_vm._v(\"关键词\")]),_c('div',{staticClass:\"e\"},[_vm._v(\"吃\")]),_c('div',{staticClass:\"f\"}),_c('div',{staticClass:\"d\"},[_vm._v(\"爱意词\")]),_c('div',{staticClass:\"e\"},[_vm._v(_vm._s(_vm.b))]),_c('div',{staticClass:\"f\"}),_c('div',{staticClass:\"d\"},[_vm._v(\"话痨月\")]),_c('div',{staticClass:\"e\",staticStyle:{\"font-size\":\"5vw\"}},[_vm._v(_vm._s(_vm.c)+\"月\")]),_c('div',{staticClass:\"f\"}),_vm._m(0),_c('div',{staticClass:\"j\"},[_vm._v(\"再见\")]),_c('div',{staticClass:\"i\"},[_vm._v(\"2021\")])])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"h\"},[_c('img',{staticClass:\"p\",attrs:{\"src\":require(\"@/assets/images/result.png\")}}),_c('img',{staticClass:\"y\",attrs:{\"src\":require(\"@/assets/images/cloud2.png\")}})])}]\n\nexport { render, staticRenderFns }","\r\n \r\n \r\n #2021\r\n 年度聊天报告\r\n 关键词\r\n 吃\r\n \r\n 爱意词\r\n {{ b }}\r\n \r\n 话痨月\r\n {{ c }}月\r\n \r\n \r\n \r\n \r\n \r\n 再见\r\n 2021\r\n \r\n \r\n\r\n\r\n\r\n\r\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=4c5e150c&scoped=true&\"\nimport script from \"./index.vue?vue&type=script&lang=js&\"\nexport * from \"./index.vue?vue&type=script&lang=js&\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=4c5e150c&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4c5e150c\",\n null\n \n)\n\nexport default component.exports","\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 请用手机查看 \n \n\n\n\n\n\n\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--13-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--13-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=7725176c&scoped=true&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=css&\"\nimport style1 from \"./App.vue?vue&type=style&index=1&id=7725176c&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7725176c\",\n null\n \n)\n\nexport default component.exports","import Vue from 'vue'\nimport App from './App.vue'\n\nVue.config.productionTip = false\n\nnew Vue({\n render: h => h(App),\n}).$mount('#app')\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=ca7d3b68&scoped=true&lang=css&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=6721cfb1&scoped=true&lang=css&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=0601a1af&scoped=true&lang=css&\"","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=1&id=7725176c&scoped=true&lang=css&\"","module.exports = __webpack_public_path__ + \"img/cloud1.c1599773.png\";","module.exports = __webpack_public_path__ + \"img/boy.6cb9ac8f.png\";","module.exports = __webpack_public_path__ + \"img/cloud2.794b62cd.png\";","module.exports = __webpack_public_path__ + \"img/girl.40b358d4.png\";","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=109abf35&scoped=true&lang=css&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=4c5e150c&scoped=true&lang=css&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=b82f994e&scoped=true&lang=css&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./index.vue?vue&type=style&index=0&id=38b99058&scoped=true&lang=css&\""],"sourceRoot":""} -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wechat-report", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "axios": "^1.6.7", 12 | "core-js": "^3.6.5", 13 | "echarts": "^5.2.2", 14 | "vue": "^2.6.11" 15 | }, 16 | "devDependencies": { 17 | "@vue/cli-plugin-babel": "~4.5.0", 18 | "@vue/cli-plugin-eslint": "~4.5.0", 19 | "@vue/cli-service": "~4.5.0", 20 | "babel-eslint": "^10.1.0", 21 | "eslint": "^6.7.2", 22 | "eslint-plugin-vue": "^6.2.2", 23 | "vue-template-compiler": "^2.6.11" 24 | }, 25 | "eslintConfig": { 26 | "root": true, 27 | "env": { 28 | "node": true 29 | }, 30 | "extends": [ 31 | "plugin:vue/essential", 32 | "eslint:recommended" 33 | ], 34 | "parserOptions": { 35 | "parser": "babel-eslint" 36 | }, 37 | "rules": {} 38 | }, 39 | "browserslist": [ 40 | "> 1%", 41 | "last 2 versions", 42 | "not dead" 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /web/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/public/favicon.ico -------------------------------------------------------------------------------- /web/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= htmlWebpackPlugin.options.title %> 9 | 10 | 11 | 12 | We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue. 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /web/src/App.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | 19 | 20 | 21 | 22 | 23 | 24 | 请用手机查看 25 | 26 | 27 | 28 | 90 | 91 | 146 | 178 | -------------------------------------------------------------------------------- /web/src/assets/images/boy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/boy.png -------------------------------------------------------------------------------- /web/src/assets/images/cloud1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/cloud1.png -------------------------------------------------------------------------------- /web/src/assets/images/cloud2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/cloud2.png -------------------------------------------------------------------------------- /web/src/assets/images/cloud3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/cloud3.png -------------------------------------------------------------------------------- /web/src/assets/images/cy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/cy.png -------------------------------------------------------------------------------- /web/src/assets/images/foot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/foot.png -------------------------------------------------------------------------------- /web/src/assets/images/girl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/girl.png -------------------------------------------------------------------------------- /web/src/assets/images/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/left.png -------------------------------------------------------------------------------- /web/src/assets/images/looney-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/looney-51.png -------------------------------------------------------------------------------- /web/src/assets/images/looney-52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/looney-52.png -------------------------------------------------------------------------------- /web/src/assets/images/looney-dragon-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/looney-dragon-1.png -------------------------------------------------------------------------------- /web/src/assets/images/mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/mask.png -------------------------------------------------------------------------------- /web/src/assets/images/mask2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/mask2.png -------------------------------------------------------------------------------- /web/src/assets/images/pale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/pale-100.png -------------------------------------------------------------------------------- /web/src/assets/images/result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/result.png -------------------------------------------------------------------------------- /web/src/assets/images/sammy-line-chinese-dragon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dragon-yy/WechatMsgAnalyzer/5109c0b3ab2ec6b5fff45d39a7bc98e78246ea01/web/src/assets/images/sammy-line-chinese-dragon.png -------------------------------------------------------------------------------- /web/src/components/EighthPage/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 这一年我们最喜欢在 5 | {{ maxMonth[0] }} 点聊天 说的话 有 8 | {{ maxMonth[1] }} 条 10 | 11 | 12 | 13 | 14 | 81 | 82 | -------------------------------------------------------------------------------- /web/src/components/FifthPage/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 这一年 我们说过最晚的一句话 5 | 6 | 在凌晨 7 | 8 | {{ latestword.hour }} 9 | 10 | 点 11 | 12 | 13 | {{ latestword.sender }}: 14 | {{ latestword.content }} 15 | 16 | ... 17 | 18 | {{ latestword.time }} 19 | 20 | 21 | 那天在做什么还能记起来吗 22 | 23 | 24 | 25 | 89 | 90 | -------------------------------------------------------------------------------- /web/src/components/FirstPage/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 2023 5 | 6 | WECHAT 7 | 8 | REPORT 9 | 10 | 年度聊天报告 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 点击开启 27 | 28 | 29 | 30 | 31 | 34 | 35 | -------------------------------------------------------------------------------- /web/src/components/ForthPage/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 这一年 我们说过最长的一句话 {{ content.longmsg.length }}字 6 | 7 | 8 | {{ content.longmsg.substring(0, 100) }} 9 | 10 | ... 11 | 12 | {{ content.time }} 13 | 14 | 15 | 16 | 17 | 78 | 79 | -------------------------------------------------------------------------------- /web/src/components/NinthPage/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #2023 5 | 年度聊天报告 6 | 关键词 7 | {{ wordcount.content }} 8 | 9 | 爱意词 10 | {{ wordcount.loveword }} 11 | 12 | 话痨月 13 | {{ wordcount.maxMonth }}月 14 | 15 | 16 | 17 | 18 | 19 | 再见 20 | 2023 21 | 22 | 23 | 24 | 25 | 107 | 108 | -------------------------------------------------------------------------------- /web/src/components/SecondPage/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 我们在一起了 5 | {{ timeDifference.days }} 天 6 | {{ timeDifference.hours }} 小时 7 | {{ timeDifference.minutes }} 分钟 8 | {{ timeDifference.seconds }} 秒 9 | 10 | 11 | 年年有我,岁岁有我 12 | 出发去看看我们的2023吧~ 13 | 14 | 15 | 16 | 75 | -------------------------------------------------------------------------------- /web/src/components/SeventhPage/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 这一年我们 5 | {{ maxMonth[0] }} 月 说的话最多 有 8 | {{ maxMonth[1] }} 条 10 | 11 | 12 | 13 | 14 | 81 | 82 | -------------------------------------------------------------------------------- /web/src/components/SixthPage/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 这一年 我们说过最多的词是 5 | 6 | {{ mostusedword.content }} 7 | 居然有 8 | {{ mostusedword.count }}次 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 91 | 92 | -------------------------------------------------------------------------------- /web/src/components/ThirdPage/index.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 今年我们一共发了 5 | {{ count.totalCount }} 6 | 条消息 7 | 8 | 9 | 其中有 10 | {{ count.imgCount }} 11 | 是图片 其中有 12 | {{ count.emojiCount }} 13 | 是表情包 14 | 15 | 16 | 17 | 说{{ word }} {{ count }} 次 18 | 19 | ... 20 | 21 | 比起网络我们更喜欢在现实表达爱意 22 | 23 | 24 | 25 | 74 | 75 | -------------------------------------------------------------------------------- /web/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | 4 | Vue.config.productionTip = false 5 | 6 | new Vue({ 7 | render: h => h(App), 8 | }).$mount('#app') 9 | -------------------------------------------------------------------------------- /web/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | // 选项... 3 | publicPath: "./", 4 | outputDir: "docs", 5 | }; 6 | --------------------------------------------------------------------------------