Windows风格的个人网盘,支持文档在线编辑
这是一个Windows页面风格的个人网盘,支持普通文本、文档、表格、xmind等在线编辑,支持Windows的小组件,例如计算器、WhiteBoard、python 等,其他更多功能待你来发现,也待你来开发。
为什么要做这个网盘?因为现在的商用网盘收费太高,个人文件存在别人的服务器上也不安全。而现在一些开源的个人网盘,例如NextDown、可道云等,用起来感觉很卡,而且“闭源”,想增加功能很难。因此我就自己做一个网盘,并增加了很多其他功能,现已完全开源。
介绍
已实现的功能
- 文件夹的新建、删除、重命名、移动、导出
- 文件上传、下载、新建、删除、移动、重命名、分享
- txt、markdown、表格、文档的在线预览和编辑功能
- 支持 xmind 文件在线预览和编辑
- 支持 python 脚本在线编辑和运行
- 支持远程连接 Linux 服务器
- 不同用户的数据完全隔离
- 可任意挂载多个磁盘
技术选型
- 后端框架:FastApi
- 数据库:SQLite3 or MySQL
- 前端:原生 html + js + css
实现方案
文件和文件夹的层级结构维护在数据库中,这样在页面查询列表时,只需要查询数据库就可以了,速度会快很多;同时数据库中的文件和文件夹的层级结构也全部真实的映射到磁盘里,所见即所得,便于以后你不想用这个系统了,它也保留完整有序的文件,而不是乱序的。
- 查询文件和文件夹时,直接在数据库中查询,可以非常方便的进行过滤和排序,只有在读写文件和文件夹时,才会和磁盘交互,有效的降低了磁盘IO。
- 所有文件和文件夹的数据通过 id 查询,页面上只能看到相对路径,完全隐藏了本地真实的文件路径。
- 可以很方便的“挂载”磁盘,只需要在配置文件中将新磁盘配置上就行了。
- 搭配大家都熟悉的 Windows 文件系统的页面交互(来源Windows12概念图),前端页面使用的是这个作者tjy-gitnub的开源项目,非常感谢作者。我只是在这个项目的基础上进行了大量的增删(删除了大量的静态代码和缓存数据的代码,提高了整个页面的加载速度,并把大量的功能变成真实有用的功能)。
页面
登录页面
登录页面的背景图是可以换的

桌面
桌面的背景图也是可以换的

任务栏
任务栏采用的是居中展示的样式,Windows11以后应该都是这个样式

文件资源管理器
上边一排工具栏依次是新建文件、新建文件夹、重命名、移动、复制、上传、下载、分享、删除,这些图标均来源Windows10的系统图标。文件列表可按照名称、创建时间、修改时间排序。文件 资源管理器中的所有文件,除了支持在线编辑的文件外,其他格式的文件会直接用浏览器打开,浏览器能打开预览的文件可以直接在浏览器中预览,浏览器不支持的文件则直接下载到本地。
使用文件上传功能上传文件时,会首先检测网盘是否存在相同的文件,如果存在则不上传,这就是类似一些网盘的秒传的功能。

回收站
上边一排工具栏依次是还原文件、删除文件、清空回收站,基本上和Windows系统的回收站操作一样。

我的分享
当分享文件时,可设置分享链接的打开次数,超过次数会返回 Nginx 默认页面。其中:markdown、表格、文档 和 xmind 分享链接打开后页面虽然可以编辑,但数据不会保存,仅支持导出数据。
分享功能的常规使用场景是分享文件给别人,还要一个场景就是去打印店打印文档,通过浏览器调用打印机后,刷新页面到指定的次数,这个链接就失效了,有效降低了文档泄漏的风险和使用U盘被病毒感染的风险。

设置
支持修改密码、退出登陆、上传桌面背景图片、设置主题、播放本地视频、ssh。

计算器
一个感觉很鸡肋的小工具,感觉还不如用 python 命令行计算。

Whiteboard
没事可以用鼠标涂鸦画画,放松一下。

连接 Linux
首先需要设置服务器连接信息,然后就可以直接在浏览器上打开页面连接 Linux 服务器;支持上传文件到服务器,或者下载文件到本地。为了提供更好的使用体验,提供了 Ctrl+C(复制)和 Ctrl+V(粘贴)快捷键,不仅如此,还仍然保留了 Ctrl+C 快捷键终止前台进程的功能。为节省服务器资源,对“挂机”超过10分钟的连接进行关闭。


播放本地视频
播放本地视频,不消耗流量。为什么会做这个功能,因为我的手机上没有安装任何视频播放软件,只能用相册自带的功能播放视频,但相册自带的功能不支持记录视频播放进度,如果手误碰退出视频,则又会重头开始播放。所以这个功能就是用来记录视频播放进度的。

python命令行
支持 python 命令行,支持导入 python 官方库,可以用来做一些简单的计算,或者处理一些简单的数据。

在线编辑功能
所有在线编辑功能:每隔10秒自动保存,标题栏文件名旁会展示自动保存的时间,点击关闭按钮也会自动保存。其中txt、markdown和文档的在线编辑支持导出成html格式,用浏览器打开导出的html后,可通过浏览器自带的打印功能把文件转成PDF格式。
txt 文件
点击右上角的下载按钮,可以直接将当前文档转成 html,并下载。如需下载原 txt文件,可在文件资源管理器中选中文件并点击下载。

markdown 文件
点击右上角的下载按钮,可以直接将当前文档转成 html,并在新标签页打开,如需下载这个 html,可在新打开的标签页右键下载。需要注意:这里使用的是第三方工具转的html,一些样式在转换时会丢失。如需保留所有的html样式,可在工具栏点击全窗口预览HTML即可。

表格
由于表格功能太多,暂不支持导出功能,可用于在线存储一些数据,可手动复制表格中的数据,并粘贴到本地 excel 表格中。

文档
该文档左侧带有目录,支持目录定位页面到指定位置。可导出成 html 格式的文件,用浏览器打开 html 文件,调用浏览器自带的打印功能,调整打印页边距,可把文档转成页面布局合适的 PDF 文件。

xmind 脑图
支持标准的 xmind 文件(xmind8 和 xmind zen(xmind 2020))在线编辑,文件打开后,原文件格式已经转换,只能通过页面工具栏中的导出功能才能导出 xmind8(只支持导出 xmind8,不支持导出 xmind zen)。在线编辑的脑图中添加的样式、颜色、优先级、完成进度、备注等也支持导出到 xmind8 中,更多功能请看下面图片中的内容。亲测文件打开速度比 xmind8 快很多。

python 脚本
支持在线编辑 py 文件,点击运行后可直接在浏览器上看到结果。如果想导入第三方库,需要专门打包,具体可查阅相关资料。

其他
1、因为是在操作本地文件,所以不支持集群部署和分布式存储,如需集群部署和分布式存储,可查看我的另一个项目;
2、登录页面的背景图片的路径是web/img/pictures/undefined/background.jpg,如需修改登录背景图片,可直接替换掉这个图片即可,注意:图片名必须是background.jpg;
3、所有页面已经尽可能的适配手机端了。使用手机浏览器打开,横屏展示,整体使用体验还是不错的;
部署
最经典的前后端分离的部署架构,整个项目部署非常简单,详见项目文件夹中的 README.md。
推荐部署方案
- 带公网IP的云服务器,买云服务器的钱比开网盘的VIP会员的钱要便宜的多得多,而且有公网IP,还可以干其他很多有趣的事情;
- 树莓派,用于部署网盘服务,可根据自己的需求买对应配置的树莓派,500元左右就可以买一个差不多配置的树莓派了,咸鱼上会更便宜。树莓派 24h 开机,一个星期的耗电量大约不到1度电;高配置的树莓派还可以用来当电脑、电视、机顶盒用哦,就看你的动手能力有多强了;
- 硬盘,自己可以买一个几T的机械硬盘存储数据,现在机械硬盘也很便宜;土豪可以用固态硬盘,也不是很贵;
- 内网穿透,在云服务器和树莓派上分别部署内网穿透软件即可,推荐使用 frp 进行内网穿透;
可选部署方案
- 树莓派 + 硬盘;
- 公网IP,可以让宽带运营商给你一个固定/动态的公网IP(IPv4就不用想了,运营商肯定不会给,可以使用IPv6);
- 域名,由于IPv6很难记,所以还需要购买一个域名(便宜的域名一年也就不到8元);
- 动态域名解析,宽带运营商如果给你一个固定的公网IP,那样就很不安全,动态公网IP会安全一些,这就需要动态域名解析;
其他部署
如果你没有随时随地使用的需求,只是在局域网内用着玩,那你就随便找个电脑部署就行了;
以上你就拥有了个人网盘,保护个人数据安全;不仅如此,你还可以自己开发,扩展功能。
项目地址
项目地址: https://github.com/leeyoshinari/OneDrive,欢迎使用,欢迎 Star。
Windows风格的个人网盘,支持文档在线编辑的更多相关文章
- wps金山文档在线编辑--.Net 接入指南
一.申请成为服务商,对金山文档在线服务进行申请 ①进入官网 https://open.wps.cn/ ②申请后如下图,点击右下角的进入服务 ③申请成功后 ④数据回调URL一定是服务器地址,本次我使用的 ...
- Office文档在线编辑的实现之二
讲述了如何通过iis的webdav支持实现客户端的office直接编辑服务器上的文件,本篇将讲解如何实现客户端的office直接编辑数据库中的二进制形式保存的office文件. 实现的关键:模拟IIS ...
- 告别收费BI!如何自己动手做一个免费的可视化数据报表还支持文档在线预览?
本人大学刚毕业目前在一家互联网公司从事产品运营工作,一季度刚过,公司需要我出一份产品运营数据报表,由于产品用户数据.订单数据等数据量太大,我希望找一款Bi产品,支持我做出一个精美的可视化报表,还可以让 ...
- 使用WebDAV实现Office文档在线编辑
Office的文档处理能力是非常强大的,但是它是本地资源,在Office Web App尚未成熟前,仍需要使用本地能力来进行文档编辑,可是现代的系统的主流却是B/S,所以在B/S中调用本地的Offic ...
- Office文档在线编辑的实现之一
因为项目的关系,研究了一下Office的在线编辑功能,写出来共享一下. Office xp之后的版本支持通过webdav协议(http的扩展)直接编辑服务器上的文件. IIS(6.0)支持webdav ...
- sharepoint 2013 office web app 2013 文档在线浏览 IE11 浏览器不兼容解决方法
昨晚配置完成office web apps 2013的外部网络访问之后,今天发现了一个很奇怪的问题,就是IE 11不支持文档在线浏览,找了很多方法,打补丁什么的,都不管用,最后在预览文件的页面,看到& ...
- 玩转Windows Azure存储服务——网盘
存储服务是除了计算服务之外最重要的云服务之一.说到云存储,大家可以想到很多产品,例如:AWS S3,Google Drive,百度云盘...而在Windows Azure中,存储服务却是在默默无闻的工 ...
- 够快网盘支持与iOS-ASIHTTPRequest框架学习
够快网盘支持与iOS-ASIHTTPRequest框架学习 前段时间在公司的产品中支持了够快网盘,用于云盘存储. 在这个过程中,学习到了很多新的知识,也遇到了很多问题,在此记录一下. 首先就够快的AP ...
- 在物理 Data Guard 中对异构主备系统的支持 (文档 ID 1602437.1)
Data Guard中主数据库与物理备用数据库(Redo Apply)之间可以有什么差别?本说明针对重做应用和 Oracle Data Guard 12 发行版 1 进行了更新.它适用于 Oracle ...
- [BI项目记]-配置Sharepoint2013支持文档版本管理笔记
做开发或者做方案,写文档是很重要的一个工作,我们经常需要知道文档被修改的次数,谁在什么时间修改的文档,以及在某一个版本中,都修改了哪些内容,以及不同版本的文档之间有什么差别. 如何对文档进行版本管理, ...
随机推荐
- 将excel中的多列内容合并为一列
有需求,就有方法.实现如下: 1. 需求: 将A.B两列数据合并为一列 2. 方法: 2.1 在C列输入A.B两列合并后的数据:501001001 2.2 选中C列,按组合键 Ctrl+E,在C列中就 ...
- WPF实现类似ChatGPT的逐字打印效果
背景 前一段时间ChatGPT类的应用十分火爆,这类应用在回答用户的问题时逐字打印输出,像极了真人打字回复消息.出于对这个效果的兴趣,决定用WPF模拟这个效果. 真实的ChatGPT逐字输出效果涉及其 ...
- ros源的移除
在Ubuntu上卸载了ros系统后,每次运行源更新命令 sudo apt update 都会报错,提示ros源找不到等问题. 这时,只需要 cd /etc/apt/souce.list.d sudo ...
- 你的开发套件已到货「GitHub 热点速览」
这周的 GitHub 热点榜,撇开上周的介绍过的几个项目,剩下就两字:套件.像是搜罗了大量黑客工具的 hackingtool,还有打算一统米哈游游戏客户端的 Starward,以及好用的 CV 库 s ...
- 《CTFshow-Web入门》01. Web 1~10
@ 目录 web1 题解 web2 题解 web3 题解 web4 题解 web5 题解 原理 web6 题解 原理 web7 题解 web8 题解 web9 题解 原理 web10 题解 ctf - ...
- Python 潮流周刊#18:Flask、Streamlit、Polars 的学习教程
你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中三则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...
- QA|20221002|SecureCRT中退格键变成了^H
原因:backspace键和delete键的键码映射问题 解决办法一:要使用回删键(backspace)时,同时按住ctrl键 解决办法二:重新设置码值映射关系.比如SecureCRT中,会话 ...
- php-fpm的配置
pass 对应的php-fpm socket,这样nginx就能将请求转发给php-fpm,这个的实现真的是精彩,为什么,因为php-fpm是负责管理多个php进程的,他的稳定性令人赞叹. index ...
- js调起android安卓与ios苹果方法 vue3.0 + ts
let shareSelect = (ev :any) => { const u :any= navigator.userAgent; const win :any = window const ...
- 2017-A1
#include <iostream> #include <string> using namespace std; int main(){ string s; cin> ...