提交 5740b2e6 编写于 作者: P peterq

update doc

上级 560ea42e
# 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)
# 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)
# 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)
../README.md
\ No newline at end of file
# 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)
# 目录结构
## 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
# 项目初始化
## 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
```
......@@ -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.
先完成此消息的编辑!
想要评论请 注册