diff --git a/package.json b/package.json index 81083be..0d82ee3 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,9 @@ }, "dependencies": { "core-js": "^3.6.5", + "echarts": "^5.3.1", + "element-plus": "^2.1.4", + "nprogress": "^0.2.0", "vue": "^3.0.0", "vue-router": "^4.0.0-0", "vuex": "^4.0.0-0" diff --git a/src/App.vue b/src/App.vue index 3fa872e..a7e6a86 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,30 +1,24 @@ diff --git a/src/assets/face/NO.png b/src/assets/face/NO.png new file mode 100644 index 0000000..de13583 Binary files /dev/null and b/src/assets/face/NO.png differ diff --git a/src/assets/face/OK.png b/src/assets/face/OK.png new file mode 100644 index 0000000..976248f Binary files /dev/null and b/src/assets/face/OK.png differ diff --git a/src/assets/face/emoji-after.png b/src/assets/face/emoji-after.png new file mode 100644 index 0000000..ca2211d Binary files /dev/null and b/src/assets/face/emoji-after.png differ diff --git a/src/assets/face/emoji-before.png b/src/assets/face/emoji-before.png new file mode 100644 index 0000000..620b6b5 Binary files /dev/null and b/src/assets/face/emoji-before.png differ diff --git a/src/assets/face/乒乓.png b/src/assets/face/乒乓.png new file mode 100644 index 0000000..606eefe Binary files /dev/null and b/src/assets/face/乒乓.png differ diff --git a/src/assets/face/乱舞.png b/src/assets/face/乱舞.png new file mode 100644 index 0000000..137ba8f Binary files /dev/null and b/src/assets/face/乱舞.png differ diff --git a/src/assets/face/亲亲.png b/src/assets/face/亲亲.png new file mode 100644 index 0000000..f09535c Binary files /dev/null and b/src/assets/face/亲亲.png differ diff --git a/src/assets/face/便便.png b/src/assets/face/便便.png new file mode 100644 index 0000000..6e7ea6b Binary files /dev/null and b/src/assets/face/便便.png differ diff --git a/src/assets/face/偷笑.png b/src/assets/face/偷笑.png new file mode 100644 index 0000000..e7ede5a Binary files /dev/null and b/src/assets/face/偷笑.png differ diff --git a/src/assets/face/傲慢.png b/src/assets/face/傲慢.png new file mode 100644 index 0000000..4bf853c Binary files /dev/null and b/src/assets/face/傲慢.png differ diff --git a/src/assets/face/再见.png b/src/assets/face/再见.png new file mode 100644 index 0000000..33c29ba Binary files /dev/null and b/src/assets/face/再见.png differ diff --git a/src/assets/face/冷汗.png b/src/assets/face/冷汗.png new file mode 100644 index 0000000..19fff5a Binary files /dev/null and b/src/assets/face/冷汗.png differ diff --git a/src/assets/face/凋谢.png b/src/assets/face/凋谢.png new file mode 100644 index 0000000..7aadc6f Binary files /dev/null and b/src/assets/face/凋谢.png differ diff --git a/src/assets/face/刀.png b/src/assets/face/刀.png new file mode 100644 index 0000000..44fa579 Binary files /dev/null and b/src/assets/face/刀.png differ diff --git a/src/assets/face/勾引.png b/src/assets/face/勾引.png new file mode 100644 index 0000000..97ac70d Binary files /dev/null and b/src/assets/face/勾引.png differ diff --git a/src/assets/face/发呆.png b/src/assets/face/发呆.png new file mode 100644 index 0000000..b562171 Binary files /dev/null and b/src/assets/face/发呆.png differ diff --git a/src/assets/face/发怒.png b/src/assets/face/发怒.png new file mode 100644 index 0000000..ea04e8c Binary files /dev/null and b/src/assets/face/发怒.png differ diff --git a/src/assets/face/发抖.png b/src/assets/face/发抖.png new file mode 100644 index 0000000..f36e3a0 Binary files /dev/null and b/src/assets/face/发抖.png differ diff --git a/src/assets/face/可怜.png b/src/assets/face/可怜.png new file mode 100644 index 0000000..8b4a094 Binary files /dev/null and b/src/assets/face/可怜.png differ diff --git a/src/assets/face/右哼哼.png b/src/assets/face/右哼哼.png new file mode 100644 index 0000000..3938340 Binary files /dev/null and b/src/assets/face/右哼哼.png differ diff --git a/src/assets/face/右太极.png b/src/assets/face/右太极.png new file mode 100644 index 0000000..3ef59eb Binary files /dev/null and b/src/assets/face/右太极.png differ diff --git a/src/assets/face/吐.png b/src/assets/face/吐.png new file mode 100644 index 0000000..766ad1d Binary files /dev/null and b/src/assets/face/吐.png differ diff --git a/src/assets/face/吓.png b/src/assets/face/吓.png new file mode 100644 index 0000000..a10a2bb Binary files /dev/null and b/src/assets/face/吓.png differ diff --git a/src/assets/face/呲牙.png b/src/assets/face/呲牙.png new file mode 100644 index 0000000..b626e67 Binary files /dev/null and b/src/assets/face/呲牙.png differ diff --git a/src/assets/face/咒骂.png b/src/assets/face/咒骂.png new file mode 100644 index 0000000..8fa8c6b Binary files /dev/null and b/src/assets/face/咒骂.png differ diff --git a/src/assets/face/咖啡.png b/src/assets/face/咖啡.png new file mode 100644 index 0000000..9db94c3 Binary files /dev/null and b/src/assets/face/咖啡.png differ diff --git a/src/assets/face/哈欠.png b/src/assets/face/哈欠.png new file mode 100644 index 0000000..1c42a73 Binary files /dev/null and b/src/assets/face/哈欠.png differ diff --git a/src/assets/face/啤酒.png b/src/assets/face/啤酒.png new file mode 100644 index 0000000..0f8c77c Binary files /dev/null and b/src/assets/face/啤酒.png differ diff --git a/src/assets/face/嘘.png b/src/assets/face/嘘.png new file mode 100644 index 0000000..14eadc6 Binary files /dev/null and b/src/assets/face/嘘.png differ diff --git a/src/assets/face/嘴唇.png b/src/assets/face/嘴唇.png new file mode 100644 index 0000000..c30fec3 Binary files /dev/null and b/src/assets/face/嘴唇.png differ diff --git a/src/assets/face/嘿哈.png b/src/assets/face/嘿哈.png new file mode 100644 index 0000000..f046059 Binary files /dev/null and b/src/assets/face/嘿哈.png differ diff --git a/src/assets/face/回头.png b/src/assets/face/回头.png new file mode 100644 index 0000000..6cd2d29 Binary files /dev/null and b/src/assets/face/回头.png differ diff --git a/src/assets/face/困.png b/src/assets/face/困.png new file mode 100644 index 0000000..f878067 Binary files /dev/null and b/src/assets/face/困.png differ diff --git a/src/assets/face/坏笑.png b/src/assets/face/坏笑.png new file mode 100644 index 0000000..c082745 Binary files /dev/null and b/src/assets/face/坏笑.png differ diff --git a/src/assets/face/大哭.png b/src/assets/face/大哭.png new file mode 100644 index 0000000..a2fe2c2 Binary files /dev/null and b/src/assets/face/大哭.png differ diff --git a/src/assets/face/太阳.png b/src/assets/face/太阳.png new file mode 100644 index 0000000..c89a346 Binary files /dev/null and b/src/assets/face/太阳.png differ diff --git a/src/assets/face/奋斗.png b/src/assets/face/奋斗.png new file mode 100644 index 0000000..82a71f6 Binary files /dev/null and b/src/assets/face/奋斗.png differ diff --git a/src/assets/face/奸笑.png b/src/assets/face/奸笑.png new file mode 100644 index 0000000..543a4da Binary files /dev/null and b/src/assets/face/奸笑.png differ diff --git a/src/assets/face/委屈.png b/src/assets/face/委屈.png new file mode 100644 index 0000000..1e2e39e Binary files /dev/null and b/src/assets/face/委屈.png differ diff --git a/src/assets/face/害羞.png b/src/assets/face/害羞.png new file mode 100644 index 0000000..67f4072 Binary files /dev/null and b/src/assets/face/害羞.png differ diff --git a/src/assets/face/尴尬.png b/src/assets/face/尴尬.png new file mode 100644 index 0000000..a954c55 Binary files /dev/null and b/src/assets/face/尴尬.png differ diff --git a/src/assets/face/左哼哼.png b/src/assets/face/左哼哼.png new file mode 100644 index 0000000..0e9f122 Binary files /dev/null and b/src/assets/face/左哼哼.png differ diff --git a/src/assets/face/左太极.png b/src/assets/face/左太极.png new file mode 100644 index 0000000..d01df1b Binary files /dev/null and b/src/assets/face/左太极.png differ diff --git a/src/assets/face/差劲.png b/src/assets/face/差劲.png new file mode 100644 index 0000000..8ddde22 Binary files /dev/null and b/src/assets/face/差劲.png differ diff --git a/src/assets/face/弱.png b/src/assets/face/弱.png new file mode 100644 index 0000000..6bf1caf Binary files /dev/null and b/src/assets/face/弱.png differ diff --git a/src/assets/face/强.png b/src/assets/face/强.png new file mode 100644 index 0000000..7e34985 Binary files /dev/null and b/src/assets/face/强.png differ diff --git a/src/assets/face/得意.png b/src/assets/face/得意.png new file mode 100644 index 0000000..2b1ba69 Binary files /dev/null and b/src/assets/face/得意.png differ diff --git a/src/assets/face/微笑.png b/src/assets/face/微笑.png new file mode 100644 index 0000000..4a38990 Binary files /dev/null and b/src/assets/face/微笑.png differ diff --git a/src/assets/face/心碎.png b/src/assets/face/心碎.png new file mode 100644 index 0000000..0665834 Binary files /dev/null and b/src/assets/face/心碎.png differ diff --git a/src/assets/face/快哭了.png b/src/assets/face/快哭了.png new file mode 100644 index 0000000..b9b5190 Binary files /dev/null and b/src/assets/face/快哭了.png differ diff --git a/src/assets/face/怄火.png b/src/assets/face/怄火.png new file mode 100644 index 0000000..8a05c34 Binary files /dev/null and b/src/assets/face/怄火.png differ diff --git a/src/assets/face/悠闲.png b/src/assets/face/悠闲.png new file mode 100644 index 0000000..e8d4a4a Binary files /dev/null and b/src/assets/face/悠闲.png differ diff --git a/src/assets/face/惊恐.png b/src/assets/face/惊恐.png new file mode 100644 index 0000000..648b4fe Binary files /dev/null and b/src/assets/face/惊恐.png differ diff --git a/src/assets/face/惊讶.png b/src/assets/face/惊讶.png new file mode 100644 index 0000000..1e86345 Binary files /dev/null and b/src/assets/face/惊讶.png differ diff --git a/src/assets/face/愉快.png b/src/assets/face/愉快.png new file mode 100644 index 0000000..91ad87c Binary files /dev/null and b/src/assets/face/愉快.png differ diff --git a/src/assets/face/憨笑.png b/src/assets/face/憨笑.png new file mode 100644 index 0000000..4aa5d0c Binary files /dev/null and b/src/assets/face/憨笑.png differ diff --git a/src/assets/face/抓狂.png b/src/assets/face/抓狂.png new file mode 100644 index 0000000..51740fb Binary files /dev/null and b/src/assets/face/抓狂.png differ diff --git a/src/assets/face/投降.png b/src/assets/face/投降.png new file mode 100644 index 0000000..aee818c Binary files /dev/null and b/src/assets/face/投降.png differ diff --git a/src/assets/face/抠鼻.png b/src/assets/face/抠鼻.png new file mode 100644 index 0000000..14c6af7 Binary files /dev/null and b/src/assets/face/抠鼻.png differ diff --git a/src/assets/face/抱拳.png b/src/assets/face/抱拳.png new file mode 100644 index 0000000..7c8bd29 Binary files /dev/null and b/src/assets/face/抱拳.png differ diff --git a/src/assets/face/拥抱.png b/src/assets/face/拥抱.png new file mode 100644 index 0000000..0fcc271 Binary files /dev/null and b/src/assets/face/拥抱.png differ diff --git a/src/assets/face/拳头.png b/src/assets/face/拳头.png new file mode 100644 index 0000000..166e87a Binary files /dev/null and b/src/assets/face/拳头.png differ diff --git a/src/assets/face/捂脸.png b/src/assets/face/捂脸.png new file mode 100644 index 0000000..2459dd5 Binary files /dev/null and b/src/assets/face/捂脸.png differ diff --git a/src/assets/face/握手.png b/src/assets/face/握手.png new file mode 100644 index 0000000..e9bc91c Binary files /dev/null and b/src/assets/face/握手.png differ diff --git a/src/assets/face/撇嘴.png b/src/assets/face/撇嘴.png new file mode 100644 index 0000000..5dbb5b3 Binary files /dev/null and b/src/assets/face/撇嘴.png differ diff --git a/src/assets/face/擦汗.png b/src/assets/face/擦汗.png new file mode 100644 index 0000000..3e82855 Binary files /dev/null and b/src/assets/face/擦汗.png differ diff --git a/src/assets/face/敲打.png b/src/assets/face/敲打.png new file mode 100644 index 0000000..5c40d2a Binary files /dev/null and b/src/assets/face/敲打.png differ diff --git a/src/assets/face/晕.png b/src/assets/face/晕.png new file mode 100644 index 0000000..de893e4 Binary files /dev/null and b/src/assets/face/晕.png differ diff --git a/src/assets/face/月亮.png b/src/assets/face/月亮.png new file mode 100644 index 0000000..fb3b35e Binary files /dev/null and b/src/assets/face/月亮.png differ diff --git a/src/assets/face/机智.png b/src/assets/face/机智.png new file mode 100644 index 0000000..4002d4e Binary files /dev/null and b/src/assets/face/机智.png differ diff --git a/src/assets/face/流汗.png b/src/assets/face/流汗.png new file mode 100644 index 0000000..39a9ef5 Binary files /dev/null and b/src/assets/face/流汗.png differ diff --git a/src/assets/face/流泪.png b/src/assets/face/流泪.png new file mode 100644 index 0000000..9912664 Binary files /dev/null and b/src/assets/face/流泪.png differ diff --git a/src/assets/face/激动.png b/src/assets/face/激动.png new file mode 100644 index 0000000..84b6372 Binary files /dev/null and b/src/assets/face/激动.png differ diff --git a/src/assets/face/炸弹.png b/src/assets/face/炸弹.png new file mode 100644 index 0000000..3b6320c Binary files /dev/null and b/src/assets/face/炸弹.png differ diff --git a/src/assets/face/爱你.png b/src/assets/face/爱你.png new file mode 100644 index 0000000..abc26dd Binary files /dev/null and b/src/assets/face/爱你.png differ diff --git a/src/assets/face/爱心.png b/src/assets/face/爱心.png new file mode 100644 index 0000000..b1582e9 Binary files /dev/null and b/src/assets/face/爱心.png differ diff --git a/src/assets/face/爱情.png b/src/assets/face/爱情.png new file mode 100644 index 0000000..baa3602 Binary files /dev/null and b/src/assets/face/爱情.png differ diff --git a/src/assets/face/猪头.png b/src/assets/face/猪头.png new file mode 100644 index 0000000..cb56ee0 Binary files /dev/null and b/src/assets/face/猪头.png differ diff --git a/src/assets/face/献吻.png b/src/assets/face/献吻.png new file mode 100644 index 0000000..933404e Binary files /dev/null and b/src/assets/face/献吻.png differ diff --git a/src/assets/face/玫瑰.png b/src/assets/face/玫瑰.png new file mode 100644 index 0000000..5cdf902 Binary files /dev/null and b/src/assets/face/玫瑰.png differ diff --git a/src/assets/face/瓢虫.png b/src/assets/face/瓢虫.png new file mode 100644 index 0000000..fd6ca53 Binary files /dev/null and b/src/assets/face/瓢虫.png differ diff --git a/src/assets/face/疑问.png b/src/assets/face/疑问.png new file mode 100644 index 0000000..48567b7 Binary files /dev/null and b/src/assets/face/疑问.png differ diff --git a/src/assets/face/疯了.png b/src/assets/face/疯了.png new file mode 100644 index 0000000..9dcb8eb Binary files /dev/null and b/src/assets/face/疯了.png differ diff --git a/src/assets/face/白眼.png b/src/assets/face/白眼.png new file mode 100644 index 0000000..0b2cb45 Binary files /dev/null and b/src/assets/face/白眼.png differ diff --git a/src/assets/face/皱眉.png b/src/assets/face/皱眉.png new file mode 100644 index 0000000..289b6b2 Binary files /dev/null and b/src/assets/face/皱眉.png differ diff --git a/src/assets/face/睡.png b/src/assets/face/睡.png new file mode 100644 index 0000000..d02cc5c Binary files /dev/null and b/src/assets/face/睡.png differ diff --git a/src/assets/face/磕头.png b/src/assets/face/磕头.png new file mode 100644 index 0000000..0cdc841 Binary files /dev/null and b/src/assets/face/磕头.png differ diff --git a/src/assets/face/礼物.png b/src/assets/face/礼物.png new file mode 100644 index 0000000..f2219ca Binary files /dev/null and b/src/assets/face/礼物.png differ diff --git a/src/assets/face/篮球.png b/src/assets/face/篮球.png new file mode 100644 index 0000000..ba51abf Binary files /dev/null and b/src/assets/face/篮球.png differ diff --git a/src/assets/face/糗大了.png b/src/assets/face/糗大了.png new file mode 100644 index 0000000..3c966ef Binary files /dev/null and b/src/assets/face/糗大了.png differ diff --git a/src/assets/face/红包.png b/src/assets/face/红包.png new file mode 100644 index 0000000..dd1941a Binary files /dev/null and b/src/assets/face/红包.png differ diff --git a/src/assets/face/耶.png b/src/assets/face/耶.png new file mode 100644 index 0000000..0f6f5a9 Binary files /dev/null and b/src/assets/face/耶.png differ diff --git a/src/assets/face/胜利.png b/src/assets/face/胜利.png new file mode 100644 index 0000000..ec1fc0b Binary files /dev/null and b/src/assets/face/胜利.png differ diff --git a/src/assets/face/色.png b/src/assets/face/色.png new file mode 100644 index 0000000..86107c6 Binary files /dev/null and b/src/assets/face/色.png differ diff --git a/src/assets/face/菜刀.png b/src/assets/face/菜刀.png new file mode 100644 index 0000000..336e6fd Binary files /dev/null and b/src/assets/face/菜刀.png differ diff --git a/src/assets/face/蛋糕.png b/src/assets/face/蛋糕.png new file mode 100644 index 0000000..1a97494 Binary files /dev/null and b/src/assets/face/蛋糕.png differ diff --git a/src/assets/face/衰.png b/src/assets/face/衰.png new file mode 100644 index 0000000..438af01 Binary files /dev/null and b/src/assets/face/衰.png differ diff --git a/src/assets/face/西瓜.png b/src/assets/face/西瓜.png new file mode 100644 index 0000000..fb381c5 Binary files /dev/null and b/src/assets/face/西瓜.png differ diff --git a/src/assets/face/调皮.png b/src/assets/face/调皮.png new file mode 100644 index 0000000..4815f5f Binary files /dev/null and b/src/assets/face/调皮.png differ diff --git a/src/assets/face/足球.png b/src/assets/face/足球.png new file mode 100644 index 0000000..e9c08ca Binary files /dev/null and b/src/assets/face/足球.png differ diff --git a/src/assets/face/跳绳.png b/src/assets/face/跳绳.png new file mode 100644 index 0000000..26a0b85 Binary files /dev/null and b/src/assets/face/跳绳.png differ diff --git a/src/assets/face/跳跳.png b/src/assets/face/跳跳.png new file mode 100644 index 0000000..c370740 Binary files /dev/null and b/src/assets/face/跳跳.png differ diff --git a/src/assets/face/转圈.png b/src/assets/face/转圈.png new file mode 100644 index 0000000..6501073 Binary files /dev/null and b/src/assets/face/转圈.png differ diff --git a/src/assets/face/鄙视.png b/src/assets/face/鄙视.png new file mode 100644 index 0000000..03087b5 Binary files /dev/null and b/src/assets/face/鄙视.png differ diff --git a/src/assets/face/酷.png b/src/assets/face/酷.png new file mode 100644 index 0000000..9884164 Binary files /dev/null and b/src/assets/face/酷.png differ diff --git a/src/assets/face/闪电.png b/src/assets/face/闪电.png new file mode 100644 index 0000000..ea0178b Binary files /dev/null and b/src/assets/face/闪电.png differ diff --git a/src/assets/face/闭嘴.png b/src/assets/face/闭嘴.png new file mode 100644 index 0000000..b6bb864 Binary files /dev/null and b/src/assets/face/闭嘴.png differ diff --git a/src/assets/face/阴险.png b/src/assets/face/阴险.png new file mode 100644 index 0000000..b1834a9 Binary files /dev/null and b/src/assets/face/阴险.png differ diff --git a/src/assets/face/难过.png b/src/assets/face/难过.png new file mode 100644 index 0000000..69b144c Binary files /dev/null and b/src/assets/face/难过.png differ diff --git a/src/assets/face/飞吻.png b/src/assets/face/飞吻.png new file mode 100644 index 0000000..57f2296 Binary files /dev/null and b/src/assets/face/飞吻.png differ diff --git a/src/assets/face/饥饿.png b/src/assets/face/饥饿.png new file mode 100644 index 0000000..53aa48a Binary files /dev/null and b/src/assets/face/饥饿.png differ diff --git a/src/assets/face/饭.png b/src/assets/face/饭.png new file mode 100644 index 0000000..9a4e698 Binary files /dev/null and b/src/assets/face/饭.png differ diff --git a/src/assets/face/骷髅.png b/src/assets/face/骷髅.png new file mode 100644 index 0000000..453226b Binary files /dev/null and b/src/assets/face/骷髅.png differ diff --git a/src/assets/face/鸡.png b/src/assets/face/鸡.png new file mode 100644 index 0000000..07517f3 Binary files /dev/null and b/src/assets/face/鸡.png differ diff --git a/src/assets/face/鼓掌.png b/src/assets/face/鼓掌.png new file mode 100644 index 0000000..027f883 Binary files /dev/null and b/src/assets/face/鼓掌.png differ diff --git a/src/assets/image/avator.png b/src/assets/image/avator.png new file mode 100644 index 0000000..7d1e905 Binary files /dev/null and b/src/assets/image/avator.png differ diff --git a/src/components/Charts/Keyboard.vue b/src/components/Charts/Keyboard.vue new file mode 100644 index 0000000..0b258f3 --- /dev/null +++ b/src/components/Charts/Keyboard.vue @@ -0,0 +1,155 @@ + + + diff --git a/src/components/Charts/LineMarker.vue b/src/components/Charts/LineMarker.vue new file mode 100644 index 0000000..580176d --- /dev/null +++ b/src/components/Charts/LineMarker.vue @@ -0,0 +1,230 @@ + + diff --git a/src/components/Charts/MixChart.vue b/src/components/Charts/MixChart.vue new file mode 100644 index 0000000..c416542 --- /dev/null +++ b/src/components/Charts/MixChart.vue @@ -0,0 +1,271 @@ + + + diff --git a/src/components/Charts/mixins/resize.js b/src/components/Charts/mixins/resize.js new file mode 100644 index 0000000..20cf1e6 --- /dev/null +++ b/src/components/Charts/mixins/resize.js @@ -0,0 +1,56 @@ +import { debounce } from '@/utils/index.js' + +export default { + data() { + return { + $_sidebarElm: null, + $_resizeHandler: null + } + }, + mounted() { + this.initListener() + }, + activated() { + if (!this.$_resizeHandler) { + // avoid duplication init + this.initListener() + } + + // when keep-alive chart activated, auto resize + this.resize() + }, + beforeDestroy() { + this.destroyListener() + }, + deactivated() { + this.destroyListener() + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_sidebarResizeHandler(e) { + if (e.propertyName === 'width') { + this.$_resizeHandler() + } + }, + initListener() { + this.$_resizeHandler = debounce(() => { + this.resize() + }, 100) + window.addEventListener('resize', this.$_resizeHandler) + + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0] + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler) + }, + destroyListener() { + window.removeEventListener('resize', this.$_resizeHandler) + this.$_resizeHandler = null + + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler) + }, + resize() { + const { chart } = this + chart && chart.resize() + } + } +} diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue deleted file mode 100644 index 4716a3f..0000000 --- a/src/components/HelloWorld.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - diff --git a/src/components/pipeline/index.vue b/src/components/pipeline/index.vue new file mode 100644 index 0000000..1130301 --- /dev/null +++ b/src/components/pipeline/index.vue @@ -0,0 +1,8 @@ + + diff --git a/src/components/pipeline/zb-pipeline-start.vue b/src/components/pipeline/zb-pipeline-start.vue new file mode 100644 index 0000000..0300e82 --- /dev/null +++ b/src/components/pipeline/zb-pipeline-start.vue @@ -0,0 +1,63 @@ + + + diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue new file mode 100644 index 0000000..793bb52 --- /dev/null +++ b/src/layout/components/AppMain.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/src/layout/components/Sidebar/Link.vue b/src/layout/components/Sidebar/Link.vue new file mode 100644 index 0000000..62b9535 --- /dev/null +++ b/src/layout/components/Sidebar/Link.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue new file mode 100644 index 0000000..21be7c9 --- /dev/null +++ b/src/layout/components/Sidebar/Logo.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue new file mode 100644 index 0000000..c6977ca --- /dev/null +++ b/src/layout/components/Sidebar/SidebarItem.vue @@ -0,0 +1,84 @@ + + + diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..f05f211 --- /dev/null +++ b/src/layout/components/Sidebar/index.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/src/layout/components/UHeader/Personal.vue b/src/layout/components/UHeader/Personal.vue new file mode 100644 index 0000000..eb8657f --- /dev/null +++ b/src/layout/components/UHeader/Personal.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/layout/components/UHeader/expand.vue b/src/layout/components/UHeader/expand.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/layout/components/UHeader/index.vue b/src/layout/components/UHeader/index.vue new file mode 100644 index 0000000..cba525f --- /dev/null +++ b/src/layout/components/UHeader/index.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/src/layout/index.vue b/src/layout/index.vue new file mode 100644 index 0000000..5234715 --- /dev/null +++ b/src/layout/index.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/src/main.ts b/src/main.ts index a92f228..e3af2a6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,4 +3,10 @@ import App from './App.vue' import router from './router' import store from './store' -createApp(App).use(store).use(router).mount('#app') +import './permission' +import ElementPlus from 'element-plus' +import 'element-plus/dist/index.css' + + +import '@/styles/index.scss' // global css +createApp(App).use(store).use(router).use(ElementPlus).mount('#app') diff --git a/src/permission.js b/src/permission.js new file mode 100644 index 0000000..358a3c1 --- /dev/null +++ b/src/permission.js @@ -0,0 +1,56 @@ +import router from './router/index' +import store from './store/index' +import NProgress from 'nprogress' +import 'nprogress/nprogress.css' +import { getToken } from '@/utils/auth' + +NProgress.configure({ showSpinner: false }) // NProgress Configuration + +const whiteList = ['/login', '/auth-redirect'] // 设置白名单 +// 记录路由 +let hasRoles = true + +router.beforeEach(async(to, from, next) => { + // 开启进度条 + NProgress.start() + + // set page title + document.title = to.meta.title + + // 确定用户是否已登录 + const hasToken = getToken() + + if (hasToken) { + if (to.path === '/login') { + // 如果已登录,请重定向到主页 + next({ path: '/' }) + NProgress.done() + } else { + try { + // 路由添加进去了没有及时更新 需要重新进去一次拦截 + if(hasRoles){ + const accessRoutes = await store.dispatch('permission/generateRoutes', 'roles') + console.log('accessRoutes==',accessRoutes) + hasRoles = false + accessRoutes.forEach(item => router.addRoute(item)) // 动态添加访问路由表 + next({ ...to, replace: true }) // // 这里相当于push到一个页面 不在进入路由拦截 + }else { + next() // // 如果不传参数就会重新执行路由拦截,重新进到这里 + } + } catch (error) { + next(`/login?redirect=${to.path}`) + } + } + }else{ + if (whiteList.indexOf(to.path) !== -1) { + next() + } else { + next(`/login?redirect=${to.path}`) + NProgress.done() + } + } +}) + +router.afterEach(() => { + NProgress.done() +}) diff --git a/src/router/index.ts b/src/router/index.ts index a6021e1..60077ae 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,25 +1,45 @@ import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router' -import Home from '../views/Home.vue' +import Layout from "@/layout/index.vue"; -const routes: Array = [ + + +import chartsRouter from './modules/charts' +import chatRouter from './modules/chat' + + +export const constantRoutes: Array = [ { - path: '/', - name: 'Home', - component: Home + path: '/login', + name: 'Login', + component: () => import('@/views/login/index.vue'), + // hidden: true }, { - path: '/about', - name: 'About', - // route level code-splitting - // this generates a separate chunk (about.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') - } + path: '/', + name: 'layout', + component: Layout, + redirect: '/dashboard', + children: [ + { + path: '/dashboard', + component: () => import('@/views/dashboard/index.vue'), + name: 'Dashboard', + meta: { title: 'Dashboard', icon: 'dashboard', affix: true } + }, + ] + }, + +] + + +export const asyncRoutes = [ + chartsRouter, + chatRouter ] const router = createRouter({ history: createWebHistory(process.env.BASE_URL), - routes + routes:constantRoutes }) export default router diff --git a/src/router/modules/charts.ts b/src/router/modules/charts.ts new file mode 100644 index 0000000..2c98487 --- /dev/null +++ b/src/router/modules/charts.ts @@ -0,0 +1,30 @@ +/** When your routing table is too long, you can split it into small modules**/ + +import Layout from "@/layout/index.vue"; + +const chartsRouter = { + path: '/charts', + component: Layout, + redirect: 'noRedirect', + name: 'Charts', + meta: { + title: '图表', + icon: 'chart' + }, + children: [ + { + path: 'keyboard', + component: () => import('@/views/charts/keyboard.vue'), + name: 'KeyboardChart', + meta: { title: 'Keyboard Chart', noCache: true } + }, + { + path: 'line', + component: () => import('@/views/charts/line.vue'), + name: 'KeyboardChart', + meta: { title: '折现图', noCache: true } + }, + ] +} + +export default chartsRouter diff --git a/src/router/modules/chat.ts b/src/router/modules/chat.ts new file mode 100644 index 0000000..d952723 --- /dev/null +++ b/src/router/modules/chat.ts @@ -0,0 +1,24 @@ +/** When your routing table is too long, you can split it into small modules**/ + +import Layout from "@/layout/index.vue"; + +const chartsRouter = { + path: '/chat', + component: Layout, + redirect: 'noRedirect', + name: 'chat', + meta: { + title: 'chat', + icon: 'chart' + }, + children: [ + { + path: 'index', + component: () => import('@/views/chat/index.vue'), + name: 'chat', + meta: { title: '聊天框', noCache: true } + }, + ] +} + +export default chartsRouter diff --git a/src/store/getters.ts b/src/store/getters.ts new file mode 100644 index 0000000..9cdbd5d --- /dev/null +++ b/src/store/getters.ts @@ -0,0 +1,6 @@ +const getters = { + permission_routes: state => state.permission.routes, + isCollapse: state => state.app.isCollapse, + userInfo: state => state.user.userInfo, +} +export default getters diff --git a/src/store/index.ts b/src/store/index.ts index 5f05f19..f362e50 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,12 +1,24 @@ import { createStore } from 'vuex' +import permission from './modules/permission' +import app from './modules/app' +import user from './modules/user' + +import getters from './getters' + export default createStore({ state: { + }, mutations: { + }, actions: { }, modules: { - } + permission, + app, + user + }, + getters }) diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts new file mode 100644 index 0000000..da09f82 --- /dev/null +++ b/src/store/modules/app.ts @@ -0,0 +1,21 @@ +import {Module} from "vuex"; + +const state = { + isCollapse: false, +} + +const mutations = { + SET_COLLAPSE: (state, value) => { + state.isCollapse = value + } +} + + + +const app:Module = { + namespaced:true, + state, + mutations, +} + +export default app diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts new file mode 100644 index 0000000..d087f8e --- /dev/null +++ b/src/store/modules/permission.ts @@ -0,0 +1,74 @@ +import {Module} from "vuex"; + +import { asyncRoutes, constantRoutes } from '@/router/index' + +/** + * Use meta.role to determine if the current user has permission + * @param roles + * @param route + */ +function hasPermission(roles, route) { + if (route.meta && route.meta.roles) { + return roles.some(role => route.meta.roles.includes(role)) + } else { + return true + } +} + +/** + * Filter asynchronous routing tables by recursion + * @param routes asyncRoutes + * @param roles + */ +export function filterAsyncRoutes(routes, roles) { + const res = [] + + routes.forEach(route => { + const tmp = { ...route } + if (hasPermission(roles, tmp)) { + if (tmp.children) { + tmp.children = filterAsyncRoutes(tmp.children, roles) + } + res.push(tmp) + } + }) + + return res +} + + +const state = { + routes: [], + addRoutes: [] +} + +const mutations = { + SET_ROUTES: (state, routes) => { + state.addRoutes = routes + state.routes = constantRoutes.concat(routes) + } +} + +const actions = { + generateRoutes({ commit }, roles) { + return new Promise(resolve => { + // let accessedRoutes + // if (roles.includes('admin')) { + // accessedRoutes = asyncRoutes || [] + // } else { + // accessedRoutes = filterAsyncRoutes(asyncRoutes, roles) + // } + commit('SET_ROUTES', asyncRoutes) + resolve(asyncRoutes) + }) + } +} + +const permission:Module = { + namespaced:true, + state, + mutations, + actions +} + +export default permission diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts new file mode 100644 index 0000000..a8d9ef2 --- /dev/null +++ b/src/store/modules/user.ts @@ -0,0 +1,50 @@ +import {Module} from "vuex"; +import { getToken, setToken, removeToken } from '@/utils/auth' +const state = { + token: getToken(), + userInfo:localStorage.userInfo?JSON.parse(localStorage.userInfo):{} +} + +const mutations = { + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_INFO: (state, userInfo) => { + localStorage.userInfo = JSON.stringify(userInfo) + state.userInfo = userInfo + }, +} + + +const actions = { + // 登录 + login({ commit }, userInfo) { + console.log('=========') + const { username, password } = userInfo + return new Promise((resolve, reject) => { + commit('SET_TOKEN', username) + commit('SET_INFO', userInfo) + setToken(username) + resolve(username) + }) + }, + // 退出 + logout({ commit, state, dispatch }) { + return new Promise((resolve, reject) => { + removeToken() + commit('SET_TOKEN', '') + commit('SET_INFO', '') + resolve(null) + }) + }, +} + + +const user:Module = { + namespaced:true, + state, + actions, + mutations, +} + +export default user diff --git a/src/styles/index.scss b/src/styles/index.scss new file mode 100644 index 0000000..569860d --- /dev/null +++ b/src/styles/index.scss @@ -0,0 +1,2 @@ +@import './variables.scss'; +@import './sidebar.scss'; diff --git a/src/styles/sidebar.scss b/src/styles/sidebar.scss new file mode 100644 index 0000000..a1109d7 --- /dev/null +++ b/src/styles/sidebar.scss @@ -0,0 +1,226 @@ +#app { + + .main-container { + min-height: 100%; + transition: margin-left .28s; + margin-left: $sideBarWidth; + position: relative; + } + + .sidebar-container { + transition: width 0.28s; + width: $sideBarWidth !important; + background-color: $menuBg; + height: 100%; + position: fixed; + font-size: 0px; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 16px; + } + + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + background: none; + } + + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: $menuHover !important; + } + } + + .is-active>.el-submenu__title { + color: $subMenuActiveText !important; + } + + & .nest-menu .el-submenu>.el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $sideBarWidth !important; + background-color: $subMenuBg !important; + + &:hover { + background-color: $subMenuHover !important; + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .sub-el-icon { + margin-left: 19px; + } + } + } + + .el-submenu { + overflow: hidden; + + &>.el-submenu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .sub-el-icon { + margin-left: 19px; + } + + .el-submenu__icon-arrow { + display: none; + } + } + } + + .el-menu--collapse { + .el-submenu { + &>.el-submenu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-submenu { + min-width: $sideBarWidth !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0px; + } + + .sidebar-container { + transition: transform .28s; + width: $sideBarWidth !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$sideBarWidth, 0, 0); + } + } + } + + .withoutAnimation { + + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + .sub-el-icon { + margin-right: 12px; + margin-left: -2px; + } + } + + .nest-menu .el-submenu>.el-submenu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: $menuHover !important; + } + } + + // the scroll bar appears when the subMenu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/src/styles/variables.scss b/src/styles/variables.scss new file mode 100644 index 0000000..a19c27c --- /dev/null +++ b/src/styles/variables.scss @@ -0,0 +1,35 @@ +// base color +$blue:#324157; +$light-blue:#3A71A8; +$red:#C03639; +$pink: #E65D6E; +$green: #30B08F; +$tiffany: #4AB7BD; +$yellow:#FEC171; +$panGreen: #30B08F; + +// sidebar +$menuText:#bfcbd9; +$menuActiveText:#409EFF; +$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951 + +$menuBg:#304156; +$menuHover:#263445; + +$subMenuBg:#1f2d3d; +$subMenuHover:#001528; + +$sideBarWidth: 210px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuText: $menuText; + menuActiveText: $menuActiveText; + subMenuActiveText: $subMenuActiveText; + menuBg: $menuBg; + menuHover: $menuHover; + subMenuBg: $subMenuBg; + subMenuHover: $subMenuHover; + sideBarWidth: $sideBarWidth; +} diff --git a/src/utils/auth.js b/src/utils/auth.js new file mode 100644 index 0000000..3d5b86e --- /dev/null +++ b/src/utils/auth.js @@ -0,0 +1,14 @@ + +const TokenKey = 'zb-token' + +export function getToken() { + return localStorage.TokenKey +} + +export function setToken(token) { + return localStorage.TokenKey = token +} + +export function removeToken() { + return localStorage.TokenKey ='' +} diff --git a/src/utils/emojis.js b/src/utils/emojis.js new file mode 100644 index 0000000..3fafa63 --- /dev/null +++ b/src/utils/emojis.js @@ -0,0 +1,12 @@ +export default { + imgs: ['爱你', + '爱情', '爱心', '傲慢', + '白眼', '抱拳', '鄙视', + '闭嘴', '便便', '擦汗', + '菜刀', '差劲', '呲牙', + '大哭', '蛋糕', '刀', + '得意', '凋谢', '发呆', 'NO', 'OK', + '发抖', '发怒', '饭', '飞吻', '奋斗', + '疯了', '尴尬', '勾引', '鼓掌', '哈欠', + ] +} diff --git a/src/utils/index.js b/src/utils/index.js new file mode 100644 index 0000000..3225d3c --- /dev/null +++ b/src/utils/index.js @@ -0,0 +1,357 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * Parse the time to string + * @param {(Object|string|number)} time + * @param {string} cFormat + * @returns {string | null} + */ +export function parseTime(time, cFormat) { + if (arguments.length === 0 || !time) { + return null + } + const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string')) { + if ((/^[0-9]+$/.test(time))) { + // support "1548221490638" + time = parseInt(time) + } else { + // support safari + // https://stackoverflow.com/questions/4310953/invalid-date-in-safari + time = time.replace(new RegExp(/-/gm), '/') + } + } + + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => { + const value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] } + return value.toString().padStart(2, '0') + }) + return time_str +} + +/** + * @param {number} time + * @param {string} option + * @returns {string} + */ +export function formatTime(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } + if (option) { + return parseTime(time, option) + } else { + return ( + d.getMonth() + + 1 + + '月' + + d.getDate() + + '日' + + d.getHours() + + '时' + + d.getMinutes() + + '分' + ) + } +} + +/** + * @param {string} url + * @returns {Object} + */ +export function getQueryObject(url) { + url = url == null ? window.location.href : url + const search = url.substring(url.lastIndexOf('?') + 1) + const obj = {} + const reg = /([^?&=]+)=([^?&=]*)/g + search.replace(reg, (rs, $1, $2) => { + const name = decodeURIComponent($1) + let val = decodeURIComponent($2) + val = String(val) + obj[name] = val + return rs + }) + return obj +} + +/** + * @param {string} input value + * @returns {number} output value + */ +export function byteLength(str) { + // returns the byte length of an utf8 string + let s = str.length + for (var i = str.length - 1; i >= 0; i--) { + const code = str.charCodeAt(i) + if (code > 0x7f && code <= 0x7ff) s++ + else if (code > 0x7ff && code <= 0xffff) s += 2 + if (code >= 0xDC00 && code <= 0xDFFF) i-- + } + return s +} + +/** + * @param {Array} actual + * @returns {Array} + */ +export function cleanArray(actual) { + const newArray = [] + for (let i = 0; i < actual.length; i++) { + if (actual[i]) { + newArray.push(actual[i]) + } + } + return newArray +} + +/** + * @param {Object} json + * @returns {Array} + */ +export function param(json) { + if (!json) return '' + return cleanArray( + Object.keys(json).map(key => { + if (json[key] === undefined) return '' + return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) + }) + ).join('&') +} + +/** + * @param {string} url + * @returns {Object} + */ +export function param2Obj(url) { + const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ') + if (!search) { + return {} + } + const obj = {} + const searchArr = search.split('&') + searchArr.forEach(v => { + const index = v.indexOf('=') + if (index !== -1) { + const name = v.substring(0, index) + const val = v.substring(index + 1, v.length) + obj[name] = val + } + }) + return obj +} + +/** + * @param {string} val + * @returns {string} + */ +export function html2Text(val) { + const div = document.createElement('div') + div.innerHTML = val + return div.textContent || div.innerText +} + +/** + * Merges two objects, giving the last one precedence + * @param {Object} target + * @param {(Object|Array)} source + * @returns {Object} + */ +export function objectMerge(target, source) { + if (typeof target !== 'object') { + target = {} + } + if (Array.isArray(source)) { + return source.slice() + } + Object.keys(source).forEach(property => { + const sourceProperty = source[property] + if (typeof sourceProperty === 'object') { + target[property] = objectMerge(target[property], sourceProperty) + } else { + target[property] = sourceProperty + } + }) + return target +} + +/** + * @param {HTMLElement} element + * @param {string} className + */ +export function toggleClass(element, className) { + if (!element || !className) { + return + } + let classString = element.className + const nameIndex = classString.indexOf(className) + if (nameIndex === -1) { + classString += '' + className + } else { + classString = + classString.substr(0, nameIndex) + + classString.substr(nameIndex + className.length) + } + element.className = classString +} + +/** + * @param {string} type + * @returns {Date} + */ +export function getTime(type) { + if (type === 'start') { + return new Date().getTime() - 3600 * 1000 * 24 * 90 + } else { + return new Date(new Date().toDateString()) + } +} + +/** + * @param {Function} func + * @param {number} wait + * @param {boolean} immediate + * @return {*} + */ +export function debounce(func, wait, immediate) { + let timeout, args, context, timestamp, result + + const later = function() { + // 据上一次触发时间间隔 + const last = +new Date() - timestamp + + // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait + if (last < wait && last > 0) { + timeout = setTimeout(later, wait - last) + } else { + timeout = null + // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 + if (!immediate) { + result = func.apply(context, args) + if (!timeout) context = args = null + } + } + } + + return function(...args) { + context = this + timestamp = +new Date() + const callNow = immediate && !timeout + // 如果延时不存在,重新设定延时 + if (!timeout) timeout = setTimeout(later, wait) + if (callNow) { + result = func.apply(context, args) + context = args = null + } + + return result + } +} + +/** + * This is just a simple version of deep copy + * Has a lot of edge cases bug + * If you want to use a perfect deep copy, use lodash's _.cloneDeep + * @param {Object} source + * @returns {Object} + */ +export function deepClone(source) { + if (!source && typeof source !== 'object') { + throw new Error('error arguments', 'deepClone') + } + const targetObj = source.constructor === Array ? [] : {} + Object.keys(source).forEach(keys => { + if (source[keys] && typeof source[keys] === 'object') { + targetObj[keys] = deepClone(source[keys]) + } else { + targetObj[keys] = source[keys] + } + }) + return targetObj +} + +/** + * @param {Array} arr + * @returns {Array} + */ +export function uniqueArr(arr) { + return Array.from(new Set(arr)) +} + +/** + * @returns {string} + */ +export function createUniqueString() { + const timestamp = +new Date() + '' + const randomNum = parseInt((1 + Math.random()) * 65536) + '' + return (+(randomNum + timestamp)).toString(32) +} + +/** + * Check if an element has a class + * @param {HTMLElement} elm + * @param {string} cls + * @returns {boolean} + */ +export function hasClass(ele, cls) { + return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) +} + +/** + * Add class to element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function addClass(ele, cls) { + if (!hasClass(ele, cls)) ele.className += ' ' + cls +} + +/** + * Remove class from element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function removeClass(ele, cls) { + if (hasClass(ele, cls)) { + const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') + ele.className = ele.className.replace(reg, ' ') + } +} diff --git a/src/utils/validate.js b/src/utils/validate.js new file mode 100644 index 0000000..6b3ac41 --- /dev/null +++ b/src/utils/validate.js @@ -0,0 +1,87 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUsername(str) { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +} + +/** + * @param {string} url + * @returns {Boolean} + */ +export function validURL(url) { + const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/ + return reg.test(url) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validLowerCase(str) { + const reg = /^[a-z]+$/ + return reg.test(str) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUpperCase(str) { + const reg = /^[A-Z]+$/ + return reg.test(str) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validAlphabets(str) { + const reg = /^[A-Za-z]+$/ + return reg.test(str) +} + +/** + * @param {string} email + * @returns {Boolean} + */ +export function validEmail(email) { + const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + return reg.test(email) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function isString(str) { + if (typeof str === 'string' || str instanceof String) { + return true + } + return false +} + +/** + * @param {Array} arg + * @returns {Boolean} + */ +export function isArray(arg) { + if (typeof Array.isArray === 'undefined') { + return Object.prototype.toString.call(arg) === '[object Array]' + } + return Array.isArray(arg) +} diff --git a/src/views/charts/index.vue b/src/views/charts/index.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/views/charts/keyboard.vue b/src/views/charts/keyboard.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/views/charts/line.vue b/src/views/charts/line.vue new file mode 100644 index 0000000..970bca3 --- /dev/null +++ b/src/views/charts/line.vue @@ -0,0 +1,24 @@ + + + + + + diff --git a/src/views/chat/components/u-chartBox/chat.js b/src/views/chat/components/u-chartBox/chat.js new file mode 100644 index 0000000..4c9404d --- /dev/null +++ b/src/views/chat/components/u-chartBox/chat.js @@ -0,0 +1,15 @@ +export const chatData = [ + { + is_self:0, + created_at:'2022-03-11', + content:'hello 你好呀!', + id:1 + }, + { + is_self:1, + created_at:'2022-03-11', + content:'hello 你好呀!', + id:2, + type:1, // 文字 + } +] diff --git a/src/views/chat/components/u-chartBox/index.vue b/src/views/chat/components/u-chartBox/index.vue new file mode 100644 index 0000000..659b711 --- /dev/null +++ b/src/views/chat/components/u-chartBox/index.vue @@ -0,0 +1,465 @@ + + + + + diff --git a/src/views/chat/components/u-toolbar/index.vue b/src/views/chat/components/u-toolbar/index.vue new file mode 100644 index 0000000..b273c99 --- /dev/null +++ b/src/views/chat/components/u-toolbar/index.vue @@ -0,0 +1,159 @@ + + + + + diff --git a/src/views/chat/index.vue b/src/views/chat/index.vue new file mode 100644 index 0000000..95e8360 --- /dev/null +++ b/src/views/chat/index.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/src/views/components-demo/editor.vue b/src/views/components-demo/editor.vue new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/views/components-demo/editor.vue @@ -0,0 +1 @@ + diff --git a/src/views/components-demo/flow-chart.vue b/src/views/components-demo/flow-chart.vue new file mode 100644 index 0000000..808f81e --- /dev/null +++ b/src/views/components-demo/flow-chart.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/src/views/components-demo/mark-down.vue b/src/views/components-demo/mark-down.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/views/components-demo/split-pane.vue b/src/views/components-demo/split-pane.vue new file mode 100644 index 0000000..2ac6cce --- /dev/null +++ b/src/views/components-demo/split-pane.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/views/components-demo/watermark.vue b/src/views/components-demo/watermark.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue new file mode 100644 index 0000000..3d43e2c --- /dev/null +++ b/src/views/dashboard/index.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/src/views/login/index.vue b/src/views/login/index.vue new file mode 100644 index 0000000..2ea7457 --- /dev/null +++ b/src/views/login/index.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/views/other/cropper.vue b/src/views/other/cropper.vue new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/views/other/cropper.vue @@ -0,0 +1 @@ + diff --git a/src/views/other/print.vue b/src/views/other/print.vue new file mode 100644 index 0000000..e69de29 diff --git a/src/views/other/share.vue b/src/views/other/share.vue new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/views/other/share.vue @@ -0,0 +1 @@ + diff --git a/tsconfig.json b/tsconfig.json index e621cbc..b1fbd7d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "esnext", "module": "esnext", - "strict": true, + "strict": false, "jsx": "preserve", "importHelpers": true, "moduleResolution": "node", diff --git a/yarn.lock b/yarn.lock index 2451a3e..c484911 100644 --- a/yarn.lock +++ b/yarn.lock @@ -932,6 +932,16 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@ctrl/tinycolor@^3.4.0": + version "3.4.0" + resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.0.tgz#c3c5ae543c897caa9c2a68630bed355be5f9990f" + integrity sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ== + +"@element-plus/icons-vue@^1.1.1": + version "1.1.4" + resolved "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-1.1.4.tgz#5d2788ea356f1458068e6d400e724ca5f3d29aca" + integrity sha512-Iz/nHqdp1sFPmdzRwHkEQQA3lKvoObk8azgABZ81QUOpW9s/lUyQVUSh0tNtEPZXQlKwlSh7SPgoVxzrE0uuVQ== + "@hapi/address@2.x.x": version "2.1.4" resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" @@ -1004,6 +1014,11 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@popperjs/core@^2.11.3": + version "2.11.4" + resolved "https://registry.npmmirror.com/@popperjs/core/-/core-2.11.4.tgz#d8c7b8db9226d2d7664553a0741ad7d0397ee503" + integrity sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg== + "@soda/friendly-errors-webpack-plugin@^1.7.1": version "1.8.1" resolved "https://registry.yarnpkg.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz#4d4fbb1108993aaa362116247c3d18188a2c6c85" @@ -1560,6 +1575,27 @@ resolved "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz#b6b40a7625429d2bd7c2281ddba601ed05dc7f1a" integrity sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA== +"@vueuse/core@^8.0.1": + version "8.1.2" + resolved "https://registry.npmmirror.com/@vueuse/core/-/core-8.1.2.tgz#3153d4766b07a648bfbdd01559e8d3b20fda6eb5" + integrity sha512-prI2GzigBUtJNTcwRjJPzUPLFoRZM1RZFR464DFdwgU8TxRFf7dRvuvWFDNbCATzLExHFnGI3zTp9GkXTTZxgQ== + dependencies: + "@vueuse/metadata" "8.1.2" + "@vueuse/shared" "8.1.2" + vue-demi "*" + +"@vueuse/metadata@8.1.2": + version "8.1.2" + resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-8.1.2.tgz#4e0707de7575ff265484c122f2b85f40f11c43c7" + integrity sha512-LrPtdiYMleygnGmz8mEmYI9h4Eyo+/igxZWNrwuPnqvL9pIO+8eUpBgPLH5GowKv3Nu0LPZSXSIuaWVJBSU1Cg== + +"@vueuse/shared@8.1.2": + version "8.1.2" + resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-8.1.2.tgz#68564aa81aca334f6252098f02e4e0a9715c0585" + integrity sha512-4Hb9iPUhAz7ghO4hgvB2GV2FOy12qQGdhmQ+9HC6QN/J66DELhmxAvkZAtK5FBqZOSwzKszPqNqoyhRKQrrWGQ== + dependencies: + vue-demi "*" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -1937,6 +1973,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-validator@^4.0.7: + version "4.0.7" + resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.0.7.tgz#034a0fd2103a6b2ebf010da75183bec299247afe" + integrity sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ== + async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -3143,6 +3184,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +dayjs@^1.10.8: + version "1.11.0" + resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.0.tgz#009bf7ef2e2ea2d5db2e6583d2d39a4b5061e805" + integrity sha512-JLC809s6Y948/FuCZPm5IX8rRhQwOiyMb2TfVVQEixG7P8Lm/gt5S7yoQZmC8x1UehI9Pb7sksEt4xx14m+7Ug== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3437,6 +3483,14 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +echarts@^5.3.1: + version "5.3.1" + resolved "https://registry.npmmirror.com/echarts/-/echarts-5.3.1.tgz#709e03aaf8c7a4439788272ee5c500cf0dce7e5b" + integrity sha512-nWdlbgX3OVY0hpqncSvp0gDt1FRSKWn7lsWEH+PHmfCuvE0QmSw17pczQvm8AvawnLEkmf1Cts7YwQJZNC0AEQ== + dependencies: + tslib "2.3.0" + zrender "5.3.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -3452,6 +3506,24 @@ electron-to-chromium@^1.4.84: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz#33c06592812a17a7131873f4596579084ce33ff8" integrity sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw== +element-plus@^2.1.4: + version "2.1.4" + resolved "https://registry.npmmirror.com/element-plus/-/element-plus-2.1.4.tgz#52ad532d5c7c321822244bd12ff5c03ba6e22632" + integrity sha512-pcwgDbKUrzyWbixYB/zIbLPLBQ/NPGPJnGXJ+jYozUSthPW4SuriaUGJKgbAE6PDBAtw3IodiT2E2GbiaZLxww== + dependencies: + "@ctrl/tinycolor" "^3.4.0" + "@element-plus/icons-vue" "^1.1.1" + "@popperjs/core" "^2.11.3" + "@vueuse/core" "^8.0.1" + async-validator "^4.0.7" + dayjs "^1.10.8" + escape-html "^1.0.3" + lodash "^4.17.21" + lodash-es "^4.17.21" + lodash-unified "^1.0.2" + memoize-one "^6.0.0" + normalize-wheel-es "^1.1.1" + elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -3572,7 +3644,7 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-html@~1.0.3: +escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= @@ -5221,6 +5293,16 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash-unified@^1.0.2: + version "1.0.2" + resolved "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.2.tgz#bb2694db3533781e5cce984af60cfaea318b83c1" + integrity sha512-OGbEy+1P+UT26CYi4opY4gebD8cWRDxAT6MAObIVQMiqYdxZr1g3QHWCToVsm31x2NkLS4K3+MC2qInaRMa39g== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -5365,6 +5447,11 @@ memfs@^3.1.2: dependencies: fs-monkey "1.0.3" +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz#b2591b871ed82948aee4727dc6abceeeac8c1045" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -5743,6 +5830,11 @@ normalize-url@^3.0.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== +normalize-wheel-es@^1.1.1: + version "1.1.1" + resolved "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.1.1.tgz#a8096db6a56f94332d884fd8ebeda88f2fc79569" + integrity sha512-157VNH4CngrcsvF8xOVOe22cwniIR3nxSltdctvQeHZj8JttEeOXffK28jucWfWBXs0QNetAumjc1GiInnwX4w== + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -5757,6 +5849,11 @@ npm-run-path@^4.0.0: dependencies: path-key "^3.0.0" +nprogress@^0.2.0: + version "0.2.0" + resolved "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" + integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== + nth-check@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -7834,6 +7931,11 @@ ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== +tslib@2.3.0: + version "2.3.0" + resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e" + integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== + tslib@^1.8.0, tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" @@ -8149,6 +8251,11 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +vue-demi@*: + version "0.12.4" + resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.12.4.tgz#420dd17628f95f1bbce1102ad3c51074713a8049" + integrity sha512-ztPDkFt0TSUdoq1ZI6oD730vgztBkiByhUW7L1cOTebiSBqSYfSQgnhYakYigBkyAybqCTH7h44yZuDJf2xILQ== + vue-hot-reload-api@^2.3.0: version "2.3.4" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" @@ -8556,3 +8663,10 @@ yorkie@^2.0.0: is-ci "^1.0.10" normalize-path "^1.0.0" strip-indent "^2.0.0" + +zrender@5.3.1: + version "5.3.1" + resolved "https://registry.npmmirror.com/zrender/-/zrender-5.3.1.tgz#fa8e63ac7e719cfd563831fe8c42a9756c5af384" + integrity sha512-7olqIjy0gWfznKr6vgfnGBk7y4UtdMvdwFmK92vVQsQeDPyzkHW1OlrLEKg6GHz1W5ePf0FeN1q2vkl/HFqhXw== + dependencies: + tslib "2.3.0"