【红隼书签】自定义光影、自定义背景、亮度和主题功能

Part1用Vue3.0 开发一款导入浏览器书签的在线书签

🤵介绍(取名)

👉👉👉【红隼书签】是一款简洁的在线书签导航网站。 名字的由来其实是,本着保护动物,爱护动物的初心,想到起一个鸟类的名称,其实最开始想了很多名字,小詹书签,麻雀书签等。

[图片上传失败...(image-d61b16-1682212273296)]

但是听起来都不够响亮。后来想了一个食肉的,有点凶猛的又有点呆萌的鸟类的名字,红隼【英文翻译:kestrel】,点个赞。于是就有了这个名字啦,但是听起来也是不错的。于是开发计划开始啦。

😀数据来源(印象中文

他的默认数据为我选的是印象中文的web导航数据;其实我自己哪里收藏了更多的导航数据,但是很多设计到公司的一些访问网站。想想还是算了,于是就用了印象中文的数据。它可以修改数据;全局搜索筛选功能;单页面完成逻辑非常简单,新手小白也能完成二次修改开发;采用granim插件完成背景动画;可选择更多动画效果;炫酷光晕背景动画效果。

[图片上传失败...(image-4f391b-1682212273296)]

💹 功能/特色

(炫酷光晕背景动画效果,可导入浏览器数据存入LeanCloud)

  • ✅ 1.同步印象中文的web导航数据;书签支持新增、修改和删除

  • ✅ 2.全局搜索筛选功能;本地离线数据持久化,书签增删改查

  • ✅ 3.可登录获取保存在leancloud里面的书签数据,再不用担心书签数据丢失了

  • ✅ 4.采用granim插件完成背景动画;可选择更多动画效果;

  • ✅ 5.支持导入浏览器书签数据(Google,火狐),并存入LeanCloud;

  • ✅ 6.可注册leanCloud并修改appId和appKey;自己部署该书签;

  • ✅ 7.采用Vue3.0 Composition API;也是一个学习Vue3.0 的学习项目;希望帮助更多正在学习VUe 3.0的朋友;

  • ✅ 8.自定义上传背景图片

  • ✅ 9.自定义背景动画效果

  • ✅ 10.导入解析浏览器书签,支持修改、删除并存入LeanCloud

📝 正在开发的功能

  • 👉自定义工具栏

  • 👉书签支持多种布局样式(卡片,列表,树形书签结构等)

  • 👉支持修改整个书签的图标;目前使用的是红点图标,也挺好看的;

  • 👉自定义配色方案

  • 👉增加中国风和热门游戏配色效果

  • 👉其他功能

😀自定义导入数据

可以将浏览器的书签导出,然后导入到书签系统中。也可以将书签系统的数据导入到浏览器中。

😀leancloud存储

数据到云端。只需注册登录即可,后续无需担心数据丢失问题。

⚡主题

目前提供 清晰/暗黑两种主题。后续还会增加更多的主题效果。

👉暗黑

[图片上传失败...(image-7eabcc-1682212273296)]

[图片上传失败...(image-cdac54-1682212273296)]

👉清新明亮

[图片上传失败...(image-496aa6-1682212273296)]

[图片上传失败...(image-83bda1-1682212273296)]

[图片上传失败...(image-16a695-1682212273296)]

💌 网址书签

========⚡⚡⚡ 红隼书签 注意:👉本项目会持续新增功能,但持续维护。如使用中发现问题,请留言或者提交 issue 。谢谢!!!

📚安装步骤

🚀 效果

[图片上传失败...(image-19fbb6-1682212273296)] [图片上传失败...(image-4d6ad0-1682212273296)] [图片上传失败...(image-5c01c4-1682212273296)] [图片上传失败...(image-8c958-1682212273296)] [图片上传失败...(image-2dccbe-1682212273296)] [图片上传失败...(image-169169-1682212273296)] [图片上传失败...(image-b40ec7-1682212273296)] [图片上传失败...(image-b9bce5-1682212273296)] [图片上传失败...(image-af2c76-1682212273296)]

😄 源码地址

完全开源,大家可以随意研究,二次开发。当然还是十分欢迎大家点个Star⭐⭐⭐\

👉👉源码链接(gitee) 👉👉源码链接(github)

项目结构


├── src

     ├── Api      // 存放接口

     │    └──common.js  // leancloud-storage公共接口函数封装

     │    └──user.js   // leancloud-storage 登录、登出接口

     ├── assets      // 存放静态资源

     │    └──Json    // 静态数据源json数据

     │    └──svg    // 工具栏图标

     ├── components  //存放组件

     │    └──Dialog.vue  // 新增、修改书签

     │    └──Login.vue    // 登录弹窗

     ├── APP.vue

     └── main.js

💡 项目图标(后续支持修改图标)

红隼书签使用了的是iconfont图标,设计的小姐姐是是半夏鸭,设计的图标太棒了,在此表示感谢。ღ( ´・ᴗ・` )

很喜欢这个图标的;[图片上传失败...(image-91bfeb-1682212273296)]

[图片上传失败...(image-4389bc-1682212273296)]

[图片上传失败...(image-381996-1682212273296)]

[图片上传失败...(image-1e3cd5-1682212273296)]

[图片上传失败...(image-3636fd-1682212273296)]

[图片上传失败...(image-bd2702-1682212273296)]

[图片上传失败...(image-58057c-1682212273296)]

[图片上传失败...(image-d05311-1682212273296)]

👨小姐姐的图标作品集地址图标作品集地址

😀主要功能函数--1、解析浏览器书签为JSON数据


export function walkBookmarksTree(root) {

  const result = []

  // 深度优先遍历

  const walk = (node, list) => {

    const els = node.children

    if (els && els.length > 0) {

      for (let i = 0; i < els.length; i++) {

        const item = els[i]

        // p标签或h3标签直接跳过

        if (item.tagName === 'P' || item.tagName === 'H3') {

          continue

        }

        // 文件夹不用创建元素

        if (item.tagName === 'DL') {

          walk(els[i], list)

        } else { // DT节点

          let child = null

          // 判断是否是文件夹

          const children = item.children

          let isDir = false

          for (let j = 0; j < children.length; j++) {

            if (children[j].tagName === 'H3' || children[j].tagName === 'DL') {

              isDir = true

            }

          }

          // 文件夹

          if (isDir) {

            child = {

              type: item.tagName === 'DT' ? item.querySelector('h3') ? item.querySelector('h3').innerText : '' : '',

              folder: true,

              children: []

            }

            walk(els[i], child.children)

          } else { // 书签

            const _item = item.querySelector('a')

            if (_item) {

              child = {

                title: _item?.innerText,

                url: _item?.href

              }

            }

          }

          child && list.push(child)

        }

      }

    }

  }

  walk(root, result)

  //过滤不为 folder的书签,保证书签能够识别

  const myBookmark = result.filter(v => v.folder)

  return flagBrowerList(myBookmark)

}

😀2、原生Input文件上传-隐藏input标签,实现点击上传


 <i class="el-icon-upload2" title="导入浏览器书签" @click="importBookmark">

    <input type="file" ref="filElem" id="file">

</i>


// 导入书签

const importBookmark = () => {

  const file = document.getElementById('file')

  file.dispatchEvent(new MouseEvent('click'))

  const mybookmark = document.getElementById('mybookmark')

  document.getElementById('file').addEventListener('change', function () {

     var file = document.getElementById('file').files[0]

     var reader = new FileReader()

     reader.readAsText(file, 'utf-8')

     reader.onload = function () {

       mybookmark.innerHTML = reader.result

       const formDatas = JSON.stringify(walkBookmarksTree(mybookmark))

          //此处已经获取了我们上传的bookmark.html文件的内容了,并且已经格式化

      })

  } else {

    ElMessage.warning('请先登录')

  }

}

😄3、接入leanCloud 实现serveless数据存储

其实这部分我已经进行了简单的函数封装,用起来是很方便的,还有很多用法可以参考leancloud文档,具体用法是非常详细的。

其实使用下面几个封装的函数,基本就可以实现一个系统的增删改查了,还是非常快速方便的。数据以JSON数据格式进行存储。

[图片上传失败...(image-deac28-1682212273296)]

😄4.1 对象存储公共函数(传入表名和存储的数据)


import AV from 'leancloud-storage'

// 对象存储公共函数

export const saveObject = (className, params) => {

  return new Promise((resolve, reject) => {

    const Todo = AV.Object.extend(className)

    const user = AV.User.current()

    var todo = new Todo()

    todo.set('formDatas', params.formDatas)

    todo.set('user', user)

    todo.save().then((res) => {

      resolve(res)

    }, (error) => {

      reject(error)

    })

  })

}

😄4.2 获取对象存储的列表数据(传入表名和条件)


// 获取对象列表

export const getObject = (className, params) => {

  return new Promise((resolve, reject) => {

    const query = new AV.Query(className)

    // 查询多个条件

    const user = AV.User.current()

    for (const v in params) {

      if (params[v]) {

        query.equalTo(v, params[v])

      }

    }

    query.equalTo('user', user)

    query.find().then((res) => {

      resolve(res)

    }, (error) => {

      reject(error)

    })

  })

}

😄4.3 删除对象数据(传入表名和数据ID)


// 删除对象

export const deleteObject = (className, id) => {

  return new Promise((resolve, reject) => {

    const todo = AV.Object.createWithoutData(className, id)

    todo.destroy().then((res) => {

      resolve(res)

    }, (error) => {

      reject(error)

    })

  })

}

😄4.4 更新对象数据(传入表名和存的数据+ID)


// 更新对象

export const updateObject = (className, params) => {

  return new Promise((resolve, reject) => {

    const todo = AV.Object.createWithoutData(className, params.id)

    for (var i in params) {

      todo.set(i, params[i])

    }

    todo.save().then((res) => {

      resolve(res)

    }, (error) => {

      reject(error)

    })

  })

}

😀 issue

需要什么新的需求或者设计,可以给我提issue,感谢,喜欢的也可以点个赞。

💯 致谢

感谢 【空白i】 的打赏 【66.6】继续加油,希望可以做出更多更精致开源的作品处理。继续加油。😀 😀 😀

😀 其他链接

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容