# 从0实现一个年度报告 每到年底各大应用都会推出自己的年终总结报告,统计出用户一年来在应用内的行为展示给用户,供用户记录、分享。 今年掘金社区推出了自己的[2022掘友年度报告](https://zjsms.com/hbdA5jR),这次我们仿照这个报告,从0开始自己实现一个年终总结报告页面 ## 实现难点 ### 1. 数据模拟 一般情况下是根据用户UID,到后端去请求相关接口获得统计数据。 例如掘金的接口为`https://api.juejin.cn/event_api/v1/annual/annual_summary?aid=xxxxxx` 本次后端使用`NodeJS`实现了一个爬虫,可以将用户数据统计完成后导出JSON格式的数据,将此数据粘贴到前端页面的输入框即可生成自己的报告 ### 2. 屏幕适配 可以观察到,在PC端和在手机端访问年度报告展示的效果是不一样的。 本次考虑使用媒体查询来实现这个功能: - 宽屏则展示背景,页面切换也使用背景中的上下切换按钮 - 小屏则隐藏背景,让内容填满屏幕,页面切换通过滑动事件监听 ### 3. 动画效果 动画分为文本与背景元素的动画 - 背景元素的动画使用了SVG动画 - 动画中不动的部分直接使用`.png`图片 - 运动的部分使用SVG动画绘制,如克里克的眼睛、尾巴 - 文本的动画使用了`CSS Animation`渐显的效果 - 不同段落之间通过`animation-delay`属性,彼此相差`1000ms` 背景动画容器的四个位置:`左上角` `右下角` `中间部分` `中间(悬浮气泡)`。不同位置的动画容器都采用绝对定位`position: absolute;`,辅以`z-index`实现层叠 囿于工期,本次的背景动画直接采用静态图片+`CSS Animation`实现上下浮动的效果 ### 4. 音乐播放 通过`Audio`接口访问网络音乐链接,控制音乐相关功能 - 进入页面开始播放 - 离开页面暂停播放 - 支持点击按钮切换播放状态 ## 用户数据 ### 用户数据内容 ``` - 用户名 - 注册时间 距今天数 - 创作相关 - 发布文章数 - 总阅读数 总赞数 总评论数 - 掘力值增长 超过人数百分比 - 最受欢迎的文章标题 - 社交相关 - 多少位掘友看过你的文章 - 点赞最多的掘友 评论最多的掘友 - 学习相关 - 阅读文章数 点赞数 评论数 - 总阅读字数 - 最关注的技术领域TOP3 - 沸点相关 - 发布沸点数 互动掘友数 点赞数 收赞数 - 互动最频繁的掘友 - 深夜阅读 - 最晚一次阅读时间 - 阅读的文章标题 - 早起阅读 - 最晚一次阅读时间 - 阅读的文章标题 - 最终总结 - 用户名 - 获得成就 饼图 ``` ### 数据模拟 根据不同页面分配不同的字段与数据,我根据自己的报告模拟了以下JSON数据 ```json {"pages":[{"id":0,"data":{"userName":"Ziu","enterDay":1647619200000,"tillNow":291}},{"id":1,"data":{"publishArticle":187,"getReader":78959,"getLike":393,"getComment":13,"increment":3693,"rate":0.9773,"mostPopularArticle":"深入理解浏览器缓存原理"}},{"id":2,"data":{"growFriends":2861,"mostLike":"老边","mostComment":"重载新生"}},{"id":3,"data":{"mostGoodAt":["JavaScript","Vue3","TypeScript"]}},{"id":4,"data":{"readed":1397,"like":1347,"comment":1345,"words":"244万","mostFocus":["前端","JavaScript","Vue.js"]}},{"id":5,"data":{"oftenRead":[{"name":"seloven","followed":0},{"name":"掘金酱","followed":1},{"name":"CLICK克里克","followed":1},{"name":"稀土君","followed":1},{"name":"cc123nice","followed":0}]}},{"id":6,"data":{"publishPin":395,"interact":1283,"like":705,"getLike":374,"mostInteractWith":"狗哥哥"}},{"id":7,"data":{"mostLateTime":1665768240000,"publishArticle":"深入理解浏览器缓存原理"}},{"id":8,"data":{"mostEarlyTime":1661208660000,"publishArticle":"深入理解Proxy与Reflect"}},{"id":9,"data":{"nickName":"Ziu","ability":"学习力","analysis":"滴水石穿,读百篇尽显敏而好学","medal":["与你同行","笔耕不辍","博览群文","高才掘学","前排围观"]}}]} ``` ## 编码中遇到的问题 ### 音乐自动播放的问题 之前我希望不操作DOM,而是通过`new Audio()`更优雅的实现音频播放。实际情况是:浏览器禁用了无用户操作的音频自动播放,要想实现自动播放有两种解决方法: - HTML标签`