boycot 搜索
avatar

boycot

Dashboard自定义面板项目介绍

项目介绍

Dashboard 是一个笔者基于Vite + Vue3 + Typesript开发的项目,个性化的浏览器导航首页面板,支持自定义添加组件,可编辑组件各种属性。响应式设计,可自定义随机壁纸背景图。

功能特性

✨ 组件长度单位

面板可基于响应式设计布局,添加组件时可选择FR单位,FR 单位会基于当前屏幕宽度动态计算出组件宽度。当然也可以使用PX固定长度单位,一般建议是宽度使用FR而高度使用PX

组件长度单位

💫 布局模式

当前提供两种布局模式,默认布局是基于文档流的,使用vuedraggable可拖拽改变组件顺序。另一种是Fixed模式,是基于 Fixed 定位的,使用@howdyjs/to-drag拖拽改变位置。

🍭 编辑模式

添加的组件含有较多配置可自定义,不限于背景颜色、阴影、字体颜色大小与组件属性等。点击右下方菜单解除锁定后即可进入编辑模式,编辑模式下通过右键点击组件即可弹出菜单进行编辑(移动端下是长按弹出菜单),右键菜单基于@howdyjs/mouse-menu

🍌 数据同步

点击右下方辅助功能进入导入导出面板,现在支持两种同步方式,一种是生成随机码进行同步,另一种是导出JSON文件进行同步。后续有可能考虑会添加账户功能进行同步。

🎉 默认主题

当前首次进入网站,会弹出默认主题选择,用户可先选择一种默认主题再进行二次创作。

🌟 随机图片与动态壁纸

网站背景图与组件背景可以设置使用随机图片,图片来源于Unsplash的随机图片,可选自定义关键词,并提供了可选的国内镜像加速(由多吉提供,服务暂未稳定)。最新已加入动态壁纸的支持,选择背景图时选择网络图片后输入一个网络视频路径即会识别成动态壁纸。

🌈 多种物料组件

当前提供了多种物料组件,例如时钟、天气、搜索栏等,后面会陆续添加更多的组件。组件引入采用按需加载,没有使用的组件不会在初始化时加载。

物料组件选择

物料组件

  • Empty: 占位区块组件,支持一些简单配置与自定义文本

占位区块

  • Clock: 时钟组件

时钟

  • Verse: 随机古诗组件,API 来源于https://www.jinrishici.com/

随机古诗

  • Search: 搜索栏,支持自定义搜索引擎,按 Tab 键自动切换下一个,关键词联想

搜索栏

  • Collection: 键盘收藏夹,设置网站后按相应按键自动跳转,网站 Icon 自动获取

键盘收藏夹

  • Iframe: Iframe 外部网站,最新版浏览器只支持同协议(当前网站为 https)的 Iframe

Iframe外部网站

  • TodoList: 备忘清单,可同时设置不同日期

TodoList备忘清单

  • Weather: 天气组件,支持通过 IP 自动获取城市也可手动输入,后续考虑添加读取 GPS

天气

  • CountDown: 倒计时组件,支持天、小时、分钟三种单位

倒计时组件

  • JuejinList: 掘金组件,显示最新热门列表

掘金组件

  • WeiboList:微博热搜

微博热搜

  • GithubTrending: Github 趋势,显示当日热门仓库

Github趋势

项目相关

StandardForm 表单封装

项目中使用了ElementPlus框架,为了减轻代码量与抽离复用逻辑,封装了一个 StandardForm 组件,可以使用 jsx 文件生成 Element 表单。

各物料组件需提供一个自己的 setting.tsx 文件为该组件的配置,同时将可复用的配置项抽离出来。

例如: Weather 组件的 setting.tsx

// @/materials/Weather/setting.tsx
import pick from "../base";
export default {
  formData: {
    weatherMode: 1,
    cityName: "",
    duration: 15,
    position: 5,
    baseFontSize: 16,
    textColor: "#262626",
    textShadow: "0 0 1px #464646",
    iconShadow: "0 0 1px #464646",
    fontFamily: "",
    padding: 10,
  },
  formConf(formData: any) {
    return {
      weatherMode: {
        label: "天气城市",
        type: "radio-group",
        radio: {
          list: [
            {
              name: "自动获取(IP)",
              value: 1,
            },
            {
              name: "手动输入",
              value: 2,
            },
          ],
          label: "name",
          value: "value",
        },
      },
      cityName: {
        when: (formData: any) => formData.weatherMode === 2,
        type: "input",
        attrs: {
          placeholder: "请输入城市名(目前仅支持中国城市名)",
          clearable: true,
        },
        rules: [
          {
            required: true,
            validator: (rule: any, value: any, callback: Function) => {
              if (formData.weatherMode === 2 && !value) {
                callback(new Error("请输入城市名"));
              }
              callback();
            },
          },
        ],
      },
      duration: {
        label: "自动刷新频率",
        type: "input-number",
        attrs: {
          "controls-position": "right",
          min: 5,
          max: 12 * 60,
        },
        tips: "刷新频率,单位为分钟",
      },
      ...pick(formData, [
        "position",
        "baseFontSize",
        "textColor",
        "textShadow",
        "iconShadow",
        "fontFamily",
        "padding",
      ]),
    };
  },
};

formConf 需要传入一个参数为 formData 函数以作为 vModel 的双向绑定

字体选择器

组件有一个公用的属性是设置字体,需要获取到用户系统的自带字体列表。参考《小 tips: 使用 JS 检测用户是否安装某 font-family 字体》(张鑫旭)后,抽离出判断getSupportFontFamilyList方法。

原理是利用 canvas 画出设置后的字体,看它是否与默认字体生成的一样,如果一样则说明不支持,不一样说明新字体设置生效,用户支持该字体。

同时后面有可能考虑加入Google Font支持自定义字体。

Todo

  • 更多的物料组件
  • Service worker 存储图片缓存(已完成)
  • Chrome extension 添加浏览器插件模式(已完成)
  • Electorn 桌面应用模式(已完成)

项目仍在持续开发及优化中,若文章或项目中有做的不好的地方欢迎指出,不胜感激。

乳白
杏仁黄
茉莉黄
麦秆黄
油菜花黄
佛手黄
篾黄
葵扇黄
柠檬黄
金瓜黄
藤黄
酪黄
香水玫瑰黄
淡密黄
大豆黄
素馨黄
向日葵黄
雅梨黄
黄连黄
金盏黄
蛋壳黄
肉色
鹅掌黄
鸡蛋黄
鼬黄
榴萼黄
淡橘橙
枇杷黄
橙皮黄
北瓜黄
杏黄
雄黄
万寿菊黄
菊蕾白
秋葵黄
硫华黄
柚黄
芒果黄
蒿黄
姜黄
香蕉黄
草黄
新禾绿
月灰
淡灰绿
草灰绿
苔绿
碧螺春绿
燕羽灰
蟹壳灰
潭水绿
橄榄绿
蚌肉白
豆汁黄
淡茧黄
乳鸭黄
荔肉白
象牙黄
炒米黄
鹦鹉冠黄
木瓜黄
浅烙黄
莲子白
谷黄
栀子黄
芥黄
银鼠灰
尘灰
枯绿
鲛青
粽叶绿
灰绿
鹤灰
淡松烟
暗海水绿
棕榈绿
米色
淡肉色
麦芽糖黄
琥珀黄
甘草黄
初熟杏黄
浅驼色
沙石黄
虎皮黄
土黄
百灵鸟灰
山鸡黄
龟背黄
苍黄
莱阳梨黄
蜴蜊绿
松鼠灰
橄榄灰
蟹壳绿
古铜绿
焦茶绿
粉白
落英淡粉
瓜瓤粉
蜜黄
金叶黄
金莺黄
鹿角棕
凋叶棕
玳瑁黄
软木黄
风帆黄
桂皮淡棕
猴毛灰
山鸡褐
驼色
茶褐
古铜褐
荷花白
玫瑰粉
橘橙
美人焦橙
润红
淡桃红
海螺橙
桃红
颊红
淡罂粟红
晨曦红
蟹壳红
金莲花橙
草莓红
龙睛鱼红
蜻蜓红
大红
柿红
榴花红
银朱
朱红
鲑鱼红
金黄
鹿皮褐
醉瓜肉
麂棕
淡银灰
淡赭
槟榔综
银灰
海鸥灰
淡咖啡
岩石棕
芒果棕
石板灰
珠母灰
丁香棕
咖啡
筍皮棕
燕颔红
玉粉红
金驼
铁棕
蛛网灰
淡可可棕
中红灰
淡土黄
淡豆沙
椰壳棕
淡铁灰
中灰驼
淡栗棕
可可棕
柞叶棕
野蔷薇红
菠萝红
藕荷
陶瓷红
晓灰
余烬红
火砖红
火泥棕
绀红
橡树棕
海报灰
玫瑰灰
火山棕
豆沙
淡米粉
初桃粉红
介壳淡粉红
淡藏花红
瓜瓤红
芙蓉红
莓酱红
法螺红
落霞红
淡玫瑰灰
蟹蝥红
火岩棕
赭石
暗驼棕
酱棕
栗棕
洋水仙红
谷鞘红
苹果红
铁水红
桂红
极光红
粉红
舌红
曲红
红汞红
淡绯
无花果红
榴子红
胭脂红
合欢红
春梅红
香叶红
珊瑚红
萝卜红
淡茜红
艳红
淡菽红
鱼鳃红
樱桃红
淡蕊香红
石竹红
草茉莉红
茶花红
枸枢红
秋海棠红
丽春红
夕阳红
鹤顶红
鹅血石红
覆盆子红
貂紫
暗玉紫
栗紫
葡萄酱紫
牡丹粉红
山茶红
海棠红
玉红
高粱红
满江红
枣红
葡萄紫
酱紫
淡曙红
唐菖蒲红
鹅冠红
莓红
枫叶红
苋菜红
烟红
暗紫苑红
殷红
猪肝紫
金鱼紫
草珠红
淡绛红
品红
凤仙花红
粉团花红
夹竹桃红
榲桲红
姜红
莲瓣红
水红
报春红
月季红
豇豆红
霞光红
松叶牡丹红
喜蛋红
鼠鼻红
尖晶玉红
山黎豆红
锦葵红
鼠背灰
甘蔗紫
石竹紫
苍蝇灰
卵石紫
李紫
茄皮紫
吊钟花红
兔眼红
紫荆红
菜头紫
鹞冠紫
葡萄酒红
磨石紫
檀紫
火鹅紫
墨紫
晶红
扁豆花红
白芨红
嫩菱红
菠根红
酢酱草红
洋葱紫
海象紫
绀紫
古铜紫
石蕊红
芍药耕红
藏花红
初荷红
马鞭草紫
丁香淡紫
丹紫红
玫瑰红
淡牵牛紫
凤信紫
萝兰紫
玫瑰紫
藤萝紫
槿紫
蕈紫
桔梗紫
魏紫
芝兰紫
菱锰红
龙须红
蓟粉红
电气石红
樱草紫
芦穗灰
隐红灰
苋菜紫
芦灰
暮云灰
斑鸠灰
淡藤萝紫
淡青紫
青蛤壳紫
豆蔻紫
扁豆紫
芥花紫
青莲
芓紫
葛巾紫
牵牛紫
紫灰
龙睛鱼紫
荸荠紫
古鼎灰
乌梅紫
深牵牛紫
银白
芡食白
远山紫
淡蓝紫
山梗紫
螺甸紫
玛瑙灰
野菊紫
满天星紫
锌灰
野葡萄紫
剑锋紫
龙葵紫
暗龙胆紫
晶石紫
暗蓝紫
景泰蓝
尼罗蓝
远天蓝
星蓝
羽扇豆蓝
花青
睛蓝
虹蓝
湖水蓝
秋波蓝
涧石蓝
潮蓝
群青
霁青
碧青
宝石蓝
天蓝
柏林蓝
海青
钴蓝
鸢尾蓝
牵牛花蓝
飞燕草蓝
品蓝
银鱼白
安安蓝
鱼尾灰
鲸鱼灰
海参灰
沙鱼灰
钢蓝
云水蓝
晴山蓝
靛青
大理石灰
海涛蓝
蝶翅蓝
海军蓝
水牛灰
牛角灰
燕颔蓝
云峰白
井天蓝
云山蓝
釉蓝
鸥蓝
搪磁蓝
月影白
星灰
淡蓝灰
鷃蓝
嫩灰
战舰灰
瓦罐灰
青灰
鸽蓝
钢青
暗蓝
月白
海天蓝
清水蓝
瀑布蓝
蔚蓝
孔雀蓝
甸子蓝
石绿
竹篁绿
粉绿
美蝶绿
毛绿
蔻梢绿
麦苗绿
蛙绿
铜绿
竹绿
蓝绿
穹灰
翠蓝
胆矾蓝
樫鸟蓝
闪蓝
冰山蓝
虾壳青
晚波蓝
蜻蜓蓝
玉鈫蓝
垩灰
夏云灰
苍蓝
黄昏灰
灰蓝
深灰蓝
玉簪绿
青矾绿
草原远绿
梧枝绿
浪花绿
海王绿
亚丁绿
镍灰
明灰
淡绿灰
飞泉绿
狼烟灰
绿灰
苍绿
深海绿
长石灰
苷蓝绿
莽丛绿
淡翠绿
明绿
田园绿
翠绿
淡绿
葱绿
孔雀绿
艾绿
蟾绿
宫殿绿
松霜绿
蛋白石绿
薄荷绿
瓦松绿
荷叶绿
田螺绿
白屈菜绿
河豚灰
蒽油绿
槲寄生绿
云杉绿
嫩菊绿
艾背绿
嘉陵水绿
玉髓绿
鲜绿
宝石绿
海沬绿
姚黄
橄榄石绿
水绿
芦苇绿
槐花黄绿
苹果绿
芽绿
蝶黄
橄榄黄绿
鹦鹉绿
油绿
象牙白
汉白玉
雪白
鱼肚白
珍珠灰
浅灰
铅灰
中灰
瓦灰
夜灰
雁灰
深灰