Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Alderaan
pan-light
提交
5740b2e6
P
pan-light
项目概览
Alderaan
/
pan-light
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
pan-light
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
5740b2e6
编写于
6月 30, 2019
作者:
P
peterq
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update doc
上级
560ea42e
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
495 addition
and
9 deletion
+495
-9
doc/DevEnv/golang.md
doc/DevEnv/golang.md
+11
-1
doc/DevEnv/goproxy.io-shot.png
doc/DevEnv/goproxy.io-shot.png
+0
-0
doc/DevEnv/protobuf.md
doc/DevEnv/protobuf.md
+28
-1
doc/DevEnv/qt5.md
doc/DevEnv/qt5.md
+22
-1
doc/README.md
doc/README.md
+45
-1
doc/README.md
doc/README.md
+45
-1
doc/Start/directory.md
doc/Start/directory.md
+253
-1
doc/Start/init.md
doc/Start/init.md
+49
-1
doc/book.json
doc/book.json
+42
-2
未找到文件。
doc/DevEnv/golang.md
浏览文件 @
5740b2e6
# golang
## todo...
> 本项目使用的是go1.12
golang 官网 https://golang.org;
墙内用户可在这里下载: https://golang.google.cn/dl/
> 为了加快下载go包速度, 建议使用go mod代理:
将
`export GOPROXY=https://goproxy.io`
加入到
`~/.bashrc`
文件.
这是一个免费公共代理, 更多信息, 可访问 https://goproxy.io/ 下面是官网截图, 有意思了
![
goproxy.io截图
](
goproxy.io-shot.png
)
doc/DevEnv/goproxy.io-shot.png
0 → 100644
浏览文件 @
5740b2e6
153.2 KB
doc/DevEnv/protobuf.md
浏览文件 @
5740b2e6
# protobuf
## todo...
> protobuf 是google出品的一个跨语言数据序列化库.
它由2个部分组成:一个是protoc程序, 用来将数据格式描述文件(proto文件)转换成需要的编程语言代码.
另一部分就是编程语言运行的支持库, 比如golang中的 github.com/golang/protobuf/proto 包.
这里我们先下载安装protoc程序
## 安装protoc
```
bash
# 获取源码包
wget https://github.com/google/protobuf/archive/v3.5.0.tar.gz
# 解压缩并进入源码目录
tar
-zxvf
v3.5.0.tar.gz
cd
protobuf-3.5.0
# 生成configure文件
./autogen.sh
# 编译安装
./configure
make
make check
make
install
```
## 相关资料
-
[
golang-protobuf快速上手指南
](
https://studygolang.com/articles/14337
)
doc/DevEnv/qt5.md
浏览文件 @
5740b2e6
# qt5
## todo...
## 下载
> Qt 是由c++构建的夸平台gui框架, 本项目使用的Qt \>= 5.11 版本.
本项目gui部分基于qt quick, 也就是qml语言实现. 如果你不懂, 没关系, 作者也是第一次接触,
很简单, 是JavaScript语法. 如果你会js, 入门只需半天
下载地址 http://download.qt.io/archive/qt/5.12/5.12.4/
也可以通过系统的包管理器安装
## 配置环境变量
将如下内容加入
`~/.bashrc`
```
bash
export
QT_VERSION
=
5.11.3
# 你安装的qt的版本
export
QT_DIR
=
/media/peterq/files/dev/env/qt
# 你安装的qt的路径
```
这2个环境变量是 github.com/peterq/pan-light/qt 这个模块用来创建qt 的 c++ 到 golang 的中间代码的
## 相关资料
-
[
QML入门教程
](
https://blog.csdn.net/qq_40194498/article/details/79849807
)
doc/README.md
已删除
120000 → 0
浏览文件 @
560ea42e
../README.md
\ No newline at end of file
doc/README.md
0 → 100644
浏览文件 @
5740b2e6
# pan-light
```
_ _ _ _
| (_) | | | |
_ __ __ _ _ __ | |_ __ _| |__ | |_
| '_ \ / _` | '_ \ | | |/ _` | '_ \| __|
| |_) | (_| | | | | | | | (_| | | | | |_
| .__/ \__,_|_| |_| |_|_|\__, |_| |_|\__|
| | __/ |
|_| |___/
```
> pan-light 是一款不限速的百度网盘客户端, 基于 golang + Qt5 开发.
本项意义在于探究 golang 在图形界面客户端; web 服务端; 事件调度, websocket, p2p 长连接 等方面的应用和实践.
欢迎广大 golang 开发者参与本项目.
[
软件官网
](
https://pan-light.peterq.cn
)
|
[
在线体验
](
https://pan-light.peterq.cn/doc
)
|
[
技术文档
](
https://pan-light.peterq.cn/doc
)
|
[
交流群: 438604465
](
https://jq.qq.com/?_wv=1027&k=52HpwTS
)
## 特性
-
利用golang轻量级协程, 高并发分段下载, 可通过调节并发数达到最佳下载速度; 下载进度状态数据持久化到磁盘, 实现软件重启后可断点续传;
-
客户端本地实现简单代理, 突破百度防盗链, 将网盘视频喂给qt视频播放组件, 从而在线播放视频
-
在线体验: 用户无需下载, 通过网页即可在线体验本软件部分功能; 该系统可应用于其他客户端产品的在线体验;
-
在线体验原理: 闲置的个人pc, 通过 docker 开启若干个'虚拟机', 虚拟机内安装好了本软件以及vnc服务.
用户打开网页, 在服务端的调度下, 网页通过 web rtc 和闲置pc建立p2p连接.
闲置pc将会打通一条用户网页到docker内部'隧道'. 网页连接虚拟机vnc服务进行远程控制
## 关于
-
本项目是作者第一个完整的go语言实战项目. 希望对于一些找不到好的实战项目的go语言初学者能起到一点帮助,
欢迎你们阅读项目技术文档, 源码, 并参与到项目开发. 但也正由于作者也是初学者且项目工作量挺大,个人精力有限等一些原因, 在代码严谨方面还有待后续跟进.
比如,你会看到为了网络数据的传递方便, 项目用了大量的
`map[string]interface{}`
类型, 并且没有做严格类型判断; 有些低频竞争数据的锁也省掉了, 等等; 欢迎大家一起来完善.
-
本文档所描述的操作都是基于linux的, 作者使用Ubuntu进行开发. 你也可以用windows开发不过需要你自己折腾. 折腾之后欢迎补充本文档
-
本项目花费了作者大量的时间和精力, 如果你觉得本项目对你有帮助, 帮忙点个star.
-
在线体验系统的源码暂未push到github. 如果需要, 你可以打开在线体验页面, 按f12, 按控制台描述方式获取
-
作者QQ
![](
https://qiniu-cdn.peterq.cn/pan-light/img/author_qq.jpg
)
doc/Start/directory.md
浏览文件 @
5740b2e6
# 目录结构
## todo...
## 三个模块
```
pan-ligth
├── demo/ // 在线演示系统模块
├── go.mod
├── LICENSE
├── pan-light.go // 开发时的辅助脚本, 把一些常用的命令集成一起方便使用
├── pan-light.pro // qt 工程文件, 编写qml代码时, 在Qt Creator ide中打开此文件.
├── pan-light.pro.user // 同上
├── pc/ // 客户端模块
├── qt/ // 用来将 qt 绑定到 go 的模块, 这个模块只在开发时运行, 程序跑起来不会运行
├── README.md
└── server/ // 服务端模块
```
### 客户端模块
```
pc
├── dep // 解决包互相依赖的问题, 以及初始化顺序的问题, 这个包不依赖其他包.
│ │ 参照laravel的service provider处理方式, 把包分为注册和初始化2个时机
│ ├── dep.go
│ ├── env-dev.go // 开发环境配置
│ ├── env.go // 全局配置变量, 服务端地址, 版本号等
│ └── env-prod.go // 正式环境配置
├── docker // 存放docker file, 这些容器用来在linux上打windows的包
│ ├── winodws_64_shared
│ │ └── Dockerfile
│ └── winodws_64_static
│ └── Dockerfile
├── downloader // 下载器包
│ ├── download-helper.go // 下载器帮助函数
│ ├── internal // protobuf 原型文件放在这里, 用来将下载状态序列化后持久化到磁盘.
│ │ └── types.proto
│ ├── manager.go // 下载管理器类, 管理所有任务的下载, 暂停, 重启软件后的恢复等
│ ├── segment.go // 分段下载用到的, 下载片段结构体, 记录某片段起始地址, 长度, 已下载完成的长度
│ ├── task.go // 下载任务结构体, 皴法下载链接, 文件保存地址等
│ └── worker.go // 下载工作协程一一对应的结构体, 一个并发对应一个worker, 一个任务中有多个work
├── functions // 这个包用来存放gui端, 也就是qml执行环境调用的函数. 这里一般不会直接实现相应功能, 而是调用其他包的函数实现, 这里只是做了一层封装.
│ ├── base.go // 软件重启, 获取配置等基本操作
│ ├── download.go // 下载模块的接口
│ ├── login.go // 几种登录方式的接口
│ ├── pan-api.go // 百度网盘的API, 获取文件链接, 列出目录下的文件等
│ ├── regitser.go // 用来把上面这些功能注册到qml
│ ├── regitser-plugin.go // plugin模式下的注册
│ └── testing.go
├── go.mod
├── go.sum
├── gui // 和qt打交道的模块, 其他包都不会和qt直接打交道.
│ ├── bridge // 桥接, 连接 qml 环境和 go环境
│ │ ├── api_for_qml.go // 存放上面functions包的map
│ │ └── router.go // 路由, 把qml的调用请求从字符串解析到相应的go函数
│ ├── comp
│ │ ├── BridgeComp.go // qml 原生组件, '继承'qt的c++类实现, 这个类联通了qml和go 2个执行环境
│ ├── gui.go // gui 界面初始化入口
│ ├── gui-plugine.go // plugin 模式下的gui界面初始化入口
│ ├── icon.ico // windows下的图标
│ ├── icon.rc
│ ├── icon_windows.syso
│ ├── qml // 界面描述文件, 也就是qml文件都存放在这里面, 详情在下方
│ │ └──...
│ └── qt-rpc // 存放几个全局变量, 解决包依赖用的
│ └── rpc.go
├── login // 登录功能实现
│ ├── baidu.go // 百度app扫码登录
│ ├── login-http-client.go // 登录用到的http客户端
│ ├── qq.go // qq扫码登录
│ └── wx.go // 微信扫码登录
├── pan-api // 把web版百度网盘提供的http接口转换成go包
│ ├── http-client.go // http客户端
│ ├── login-session.go // 登录会话结构体
│ └── pan-api.go // 调用接口具体实现
├── pan-download // 对于上面download的封装
│ ├── pan-download.go // 封装实现
│ └── video-agent.go // 一个简单的代理, 突破百度防盗链, 是的qt的视频播放器能播放网盘中的视频
├── pan-light-pc-dev.go // 开发模式, 即plugin模式程序入口
├── pan-light-pc.go // 程序main函数
├── server-api // 调用服务端模块的包
│ └── server-api.go
├── storage // 程序状态持久化包
│ ├── state.go // 全局状态结构体
│ ├── types.pb.go // protobuf生成的文件
│ └── types.proto // protobuf 原型文件
└── util // 工具包
├── file.go
└── fn.go
```
#### 客户端界面文件结构
```
pc/gui/qml
├── assets 静态文件目录
│ └── images // 图片
│ ├── icons // icon图标
│ │ ├── baidu-cloud.svg
│ │ └ ...
│ └── pan-light-1.png
├── comps // 公共组件, js动态创建的组件
│ ├── Alert.qml // 警告弹窗
│ ├── bridge.qml // 和go交互的组件
│ ├── confirm-window.qml // 确认组件
│ ├── DataSaver.qml // 将界面信息, xy坐标等状态自动存盘的组件
│ ├── desktop-widget.qml // 桌面悬浮窗组件
│ ├── dialog.qml // 对话框
│ ├── IconButton.qml // 图标按钮
│ ├── IconFont.qml // 已弃用, 打算使用阿里的Iconfont字体图标
│ ├── loginWebView.qml // 一起用, 打算通过webview来实现网页登录
│ ├── Modal.qml // 忽略, 测试用的mask窗口
│ ├── PromiseDialog.qml // promise话的dialog
│ ├── prompt-window.qml // 用户输入弹框
│ ├── rightClickMenu.qml // 右键按钮通用组件
│ ├── select-save-path.qml // 文件保存路径选择组件
│ ├── timer.qml // 计时器组件, qml未提供setTimeout函数, 通过这个组件实现polyfill
│ └── tool-tip-window.qml // 鼠标选题显示提示的窗口
├── explore // 探索页面
│ ├── explore.qml // 探索页面布局
│ ├── ShareItem.qml // 分享内容展示组件
│ ├── ShareList.qml // 分享列表 list view
│ ├── TagForm.ui.qml // 忽略
│ └── Tag.qml // 分享徽标
├── js // js 文件
│ ├── app.js // 组件全局状态
│ ├── appState.qml // 全局状态组件
│ ├── global.js // 全局变量
│ ├── promise.js // 带进度的promise实现
│ ├── transfer.js // 弃用
│ └── util.js // qml组件调用的工具
├── layout // 界面布局
│ ├── Header.qml // 头部
│ └── Layout.qml // 布局
├── login // 登录方式的界面
│ ├── Baidu.qml
│ ├── FixedWindow.qml // 登录窗口公用组件
│ ├── Login.qml
│ ├── QQ.qml
│ └── Wx.qml
├── main.qml // 界面入口
├── pages // 一些小窗口
│ ├── about-window.qml // 关于窗口
│ ├── feedback-window.qml // 反馈窗口
│ ├── setting-window.qml // 设置窗口
│ └── share-window.qml // 分享交互窗口
├── pan // 我的网盘界面
│ ├── FileIcon.qml // 文件图标组件
│ ├── FileList.qml // 文件列表
│ ├── FileNode.qml // 文件item
│ ├── left-panel // 侧边栏
│ │ ├── DiskUsage.qml
│ │ ├── LeftPanel.qml
│ │ ├── PathCollectionItem.qml
│ │ ├── PathCollection.qml
│ │ └── User.qml
│ ├── LoadDirError.qml
│ ├── pan.qml
│ └── PathNav.qml
├── qml.qrc // xml文件, 组织qml用的
├── transfer
│ ├── DownloadingList.qml
│ ├── DownloadItem.qml
│ ├── DownloadList.qml
│ ├── HeaderBar.qml
│ └── transfer.qml
├── videoPlayer // 视频播放器
│ ├── ButtonImage.qml
│ ├── ControlArea.qml
│ ├── icons
│ │ ├── backward.svg
│ │ ├── forward.svg
│ │ ├── fullscreen.svg
│ │ ├── open-file.svg
│ │ ├── pause.svg
│ │ ├── play.svg
│ │ ├── rotate.svg
│ │ ├── volume-down.svg
│ │ ├── volume-mute.svg
│ │ └── volume-up.svg
│ ├── MPlayer.qml
│ ├── screen.png
│ ├── Tips.qml
│ └── UIComp
│ ├── ActionTips.qml
│ ├── AniIcon.qml
│ ├── ButtonPlay.qml
│ ├── DataSaver.qml
│ ├── ForwardBackward.qml
│ ├── FullScreenButton.qml
│ ├── LoadingTips.qml
│ ├── OpenFileButton.qml
│ ├── PlayIcon.qml
│ ├── PlayRateButton.qml
│ ├── RotateButton.qml
│ ├── TimeSlider.qml
│ ├── TimeText.qml
│ ├── VideoTitle.qml
│ ├── VolumeButton.qml
│ ├── VolumeIcon.qml
│ └── VolumeSlider.qml
└── widget // 其他组件
├── MoveWindow.qml // 鼠标移动窗口支持
├── Resize.qml // 鼠标改变窗口尺寸
├── RightMenu.qml // 右键菜单v2
├── ToolTip.qml
├── TopIndicator.qml // 顶部信息提示
└── VirtualFrame.qml // 虚拟边框
```
### 服务端模块
```
server
├── artisan // 一些不暂时放这的功能 ;)
│ ├── cache // 缓存包
│ │ └── redis.go // redis实现缓存
│ ├── errors.go // 接口错误处理
│ ├── utils.go // 工具函数
│ └── web.go // web 应用特有
├── conf // 配置包
│ ├── conf.go // 配置
│ └── consts.go // 常量
├── dao // 数据库, mongobd
│ ├── feedback.go // 反馈表
│ ├── file-share.go // 文件分享表
│ ├── user.go // 用户表
│ ├── vip.go // 开通vip账号的表
│ └── vip-save-file.go // vip转存文件表
├── go.mod
├── go.sum
├── pan-light-server.go // 服务端入口
├── pan-light-server.yaml // 配置文件
├── pan-viper // vip账号包
│ ├── http-client.go // http 客户端
│ └── vip.go // vip结构体, 提供文件转存功能
├── pc-api // 给客户端调用的api
│ ├── handlers.go // api实现函数
│ ├── middleware // 中间件
│ │ └── pc-jwt.go // jwt auth
│ └── pc-api-router.go // 路由
├── realtime // 实时通信包, 基于websocket
│ ├── room.go // 房间结构体
│ ├── server.go // 实时通信服务器
│ └── session.go // 会话
└── timewheel // 时间轮算法实现
└── timewheel.go
```
### qt 绑定模块
> 这个模块是基于 [therecipe/qt](https://github.com/therecipe/qt) 修改的, 可以访问原项目获取详情, 会用就行
\ No newline at end of file
doc/Start/init.md
浏览文件 @
5740b2e6
# 项目初始化
## todo...
## 克隆项目到本地
> 本项目使用 go mod, 不需要把项目放go path里
```
bash
git clone git@github.com:peterq/pan-light.git
cd
pan-light
```
## protobuf 生成文件
```
bash
go generate
cd
pc
```
## 用go封装c++类
```
bash
go run ../qt/cmd/qtsetup/main.go
```
> 这里会把qt的模块生成对应的go包, 在开发时就会有相应的代码提示了.
实际上本项目只用到了少数几个模块. 这一步会耗时很久,但是这一步以后通常不需要在执行
## moc 原生组件
> gui/comp下有个go写的qml原生组件, 需要用c++封装才能被qt使用. 执行如下命令即可
```
bash
go run ../qt/cmd/qtmoc/main.go desktop gui/comp
```
## 打包qml资源文件
```
bash
go run ../qt/cmd/qtmoc/main.go desktop gui/qml
```
> 这一步会把qml资源文件打包成c++代码, 从而嵌入到程序里边
## 运行程序
```
bash
go run pan-light-pc.go
```
doc/book.json
浏览文件 @
5740b2e6
...
...
@@ -18,25 +18,62 @@
"-search"
,
"-highlight"
,
"-fontsettings"
,
"-sharing"
,
"sharing-plus"
,
"prism"
,
"prism-themes"
,
"edit-link"
,
"anchors"
,
"anchor-navigation-ex"
,
"github"
,
"search-plus"
,
"expand-active-chapter"
,
"expandable-chapters-interactive"
,
"theme-comscore"
,
"footer"
"footer"
,
"github-buttons"
],
"pluginsConfig"
:
{
"sharing"
:
{
"douban"
:
false
,
"facebook"
:
false
,
"google"
:
false
,
"hatenaBookmark"
:
false
,
"instapaper"
:
false
,
"line"
:
false
,
"linkedin"
:
false
,
"messenger"
:
false
,
"pocket"
:
false
,
"qq"
:
false
,
"qzone"
:
false
,
"stumbleupon"
:
false
,
"twitter"
:
false
,
"viber"
:
false
,
"vk"
:
false
,
"weibo"
:
false
,
"whatsapp"
:
false
,
"all"
:
[
"google"
,
"facebook"
,
"weibo"
,
"twitter"
,
"qq"
,
"qzone"
,
"linkedin"
,
"pocket"
]
},
"edit-link"
:
{
"base"
:
"https://github.com/peterq/pan-light/edit/doc/"
,
"base"
:
"https://github.com/peterq/pan-light/edit/
master/
doc/"
,
"label"
:
"编辑本页面"
},
"github"
:
{
"url"
:
"https://github.com/peterq/pan-light"
},
"github-buttons"
:
{
"buttons"
:
[{
"user"
:
"peterq"
,
"repo"
:
"pan-light"
,
"type"
:
"star"
,
"size"
:
"small"
,
"count"
:
true
}
]
},
"prism"
:
{
"css"
:
[
"prism-themes/themes/prism-vs.css"
...
...
@@ -44,6 +81,9 @@
},
"layout"
:
{
"footerPath"
:
"styles/footer.html"
},
"anchor-navigation-ex"
:
{
"showLevel"
:
false
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录