回退到旧的系统版本

下载旧版本的系统ROM包

进入官网ColorOS官网,然后点击右上方的下载菜单。
然后选择手机对应的系列,R系列,然后找到手机对应的型号,OPPO R9Plus(全网通)
最后在历史版本中选择一个低版本的的,如:
版本号:正式版-160405,然后点击右侧的立即下载,即可下载该ROM.

将ROM复制到手机内部存储根目录

回退系统版本

关机

1
2
3
先按住两个音量键,然后再按电源键
按开机键+音量减键
按下开机键,然后同时按音量上键和音量下 键

进入Recovery,选择简体中文
找到刚才的ROM的zip包,更新系统

安装KingRoot

下载KingRoot(KingRoot_v4.85),使用KingRoot获取Root权限。
第一次Root可能不成功,多试几次, 我试了两次后成功了。

安装谷歌框架

下载360手机助手

下载VPN

下载GG谷歌安装器

  • 打开GG谷歌安装器,进行修复,修复不一定会成功,但是会把谷歌框架需要的apk下载到内部存储的根目录
  • 安装内部存储根目录下的谷歌框架,四件套必须得按照一定的顺序依次安装,顺序为
    • Google框架服务(GoogleServicesFramework.apk)
    • Google帐号管理程序(GoogleLoginService.apk)
    • Google Play服务(GooglePlayService.apk)
    • Google Play商店(GooglePlay.apk)
  • 打开VPN,连接到外网
  • 打开Google Play store,按照提示登录谷歌账号
  • 下载Google Play store上的相关软件。

gitbook serve命令找不到fontsettings.js

问题描述

今天运行gitbook serve命令,老是报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ gitbook serve
Live reload server started on port: 35729
Press CTRL+C to quit ...

info: 7 plugins are installed
info: loading plugin "livereload"... OK
info: loading plugin "highlight"... OK
info: loading plugin "search"... OK
info: loading plugin "lunr"... OK
info: loading plugin "sharing"... OK
info: loading plugin "fontsettings"... OK
info: loading plugin "theme-default"... OK
info: found 1 pages
info: found 0 asset files

Error: ENOENT: no such file or directory, stat 'E:\Blog\MyGitBook\_book\gitbook\gitbook-plugin-fontsettings\fontsettings.js'

这个原来是一个Bug(Vesion:3.2.3)

解决方案

懒得写,见参考资料

参考资料

https://blog.csdn.net/prufeng/article/details/83301895
https://segmentfault.com/q/1010000009569245
https://www.cnblogs.com/wenhui92/p/9482629.html
https://blog.csdn.net/wltsysterm/article/details/104442439

gitbook发布到github pages

初始化git

1
git init

创建仓库和gh-pages分支

登录到Github,创建一个新的仓库,名称我们就命令为book,这样我就就得到了一个book的空仓库。
克隆仓库到本地:git clone git@github.com:USER_NAME/book.git。
创建一个新分支:git checkout -b gh-pages,注意,分支名必须为gh-pages。
将分支push到仓库:git push -u origin gh-pages。
切换到主分支: git checkout master。

经过这一步处理,我们已经创建好gh-pages分支了,有了这个分支,Github会自动为你分配一个访问网址:
你可以在项目页面右下settings中看到:

构建

1
gitbook build

这样会在项目根目录下生成_book目录,将这个目录清空

同步静态网站代码到分支

下面我们就可以将build好的静态网站代码同步到gh-pages分支中去了:
切换出master分支目录。我们需要将gh-pages分支内容存放到另一个目录中去。
克隆gh-pages分支:git clone -b gh-pages git@github.com:USERNAME/book.git book-end。这步我们只克隆了gh-pages分支,并存放在一个新的目录book-end里面。

手动部署

清空本地gh-pages分支文件夹:

1
rm -rf /e/Blog/MyGitBook_GithubPages/*

复制_book目录下的所有文件到gh-pages分支文件夹

1
cp -r /e/Blog/MyGitBook/_book/* /e/Blog/MyGitBook_GithubPages

查看

1
git status

QQ输入法短语:

gitbookfabu
1
rm -rf /e/Blog/MyGitBook_GithubPages/*$(CRLF)cp -r /e/Blog/MyGitBook/_book/* /e/Blog/MyGitBook_GithubPages$(CRLF)git status$(CRLF)

添加

1
git add .

提交

1
git commit

推送

1
git push origin

cd /e/Blog/MyGitBook/
gitbook build
cd /e/Blog/MyGitBook_GithubPages/
rm -rf *
cp -r /e/Blog/MyGitBook/_book/* ./
git status

cd /e/Blog/MyGitBook/ && gitbook build && cd /e/Blog/MyGitBook_GithubPages/ && rm -rf * && cp -r /e/Blog/MyGitBook/_book/* ./ && git status

gitbook安装和使用

安装低于v10.21.0版本的node.js

我之前用的是12.x版本的LTS办的nodejs,但是在安装gitbook的时候,有如下报错:

经过一段排查之后,我发现gitbook不支持高版本的node.js,

安装gitbook

1
npm install gitbook-cli -g

运行效果:

1
2
3
4
5
6
7
E:\Blog\MyGitBook>node -v
v10.21.0

E:\Blog\MyGitBook>npm install gitbook-cli -g
E:\Program Files\nodejs\npm_global\gitbook -> E:\Program Files\nodejs\npm_global\node_modules\gitbook-cli\bin\gitbook.js
+ gitbook-cli@2.3.2
updated 3 packages in 15.526s

此时并没有安装完毕,输入如下命令继续安装:

1
gitbook -V

运行效果:

1
2
3
4
5
6
7
8
9
10
11
E:\Blog\MyGitBook>gitbook -V
CLI version: 2.3.2
Installing GitBook 3.2.3
gitbook@3.2.3 C:\Users\lan\AppData\Local\Temp\tmp-12016inN44NmImh8T\node_modules\gitbook
├── escape-html@1.0.3
├── escape-string-regexp@1.0.5
├── destroy@1.0.4
├── 省略。。。。。。。。。。。。。。。。。。。。
commander@2.9.0, cross-spawn-async@2.2.5, web-resource-inliner@2.0.0)
└── nunjucks@2.5.2 (asap@2.0.6, yargs@3.32.0, chokidar@1.7.0)
GitBook version: 3.2.3

初始化

1
gitbook init

运行效果:

1
2
3
4
5
E:\Blog\MyGitBook>gitbook init
warn: no summary file in this book
info: create README.md
info: create SUMMARY.md
info: initialization is finished

这将会生成两个文件:README.md和SUMMARY.md:

1
2
3
4
E:\Blog\MyGitBook>mytree f
E:\Blog\MyGitBook
├─README.md
└─SUMMARY.md

其中,README.md中存放的时候书的简介,SUMMARY.md文件中存放的是书的目录.

编写目录

README.md
1
2
3
# Introduction

这是我的第一本GitBook

编写目录

SUMMARY.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Summary

- [Introduction](README.md)
- [第1章 Hello](Chapter1/README.md)
- [1.1 xxxx](Chapter1/xxxx.md)
- [1.2 yyyy](Chapter1/yyyy.md)
- [1.3 zzzz](Chapter1/zzzz.md)
- [第2章 World](Chapter2/README.md)
- [2.1 xxxx](Chapter2/xxxx.md)
- [2.2 yyyy](Chapter2/yyyy.md)
- [2.3 zzzz](Chapter2/zzzz.md)
- [2.2 iiii](Chapter2/iiii.md)
- [2.3 jjjj](Chapter2/jjjj.md)
- [2.3 kkkk](Chapter2/kkkk.md)

再次初始化

1
gitbook init

运行效果:

1
2
3
4
5
6
7
8
9
10
E:\Blog\MyGitBook>gitbook init
info: create Chapter2/README.md
info: create Chapter2/xxxx.md
info: create Chapter2/yyyy.md
info: create Chapter2/zzzz.md
info: create Chapter2/iiii.md
info: create Chapter2/jjjj.md
info: create Chapter2/kkkk.md
info: create SUMMARY.md
info: initialization is finished

此时的项目结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
E:\Blog\MyGitBook>mytree f
E:\Blog\MyGitBook
├─Chapter1\
│ ├─iiii.md
│ ├─jjjj.md
│ ├─kkkk.md
│ ├─README.md
│ ├─xxxx.md
│ ├─yyyy.md
│ └─zzzz.md
├─Chapter2\
│ ├─iiii.md
│ ├─jjjj.md
│ ├─kkkk.md
│ ├─README.md
│ ├─xxxx.md
│ ├─yyyy.md
│ └─zzzz.md
├─README.md
└─SUMMARY.md

继续在上面生成的新文件中编写一些内容

启动本地服务器

1
gitbook serve

运行效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
E:\Blog\MyGitBook>gitbook serve
Live reload server started on port: 35729
Press CTRL+C to quit ...

info: 7 plugins are installed
info: loading plugin "livereload"... OK
info: loading plugin "highlight"... OK
info: loading plugin "search"... OK
info: loading plugin "lunr"... OK
info: loading plugin "sharing"... OK
info: loading plugin "fontsettings"... OK
info: loading plugin "theme-default"... OK
info: found 12 pages
info: found 14 asset files
info: >> generation finished with success in 1.7s !

Starting server ...
Serving book on http://localhost:4000

打包文档

生成电子书

配置文件book.json

gitbook插件

插件官网

https://plugins.gitbook.com/plugin/

安装和使用插件方法

在根目录下创建book.json配置文件,在配置文件中按照指定格式插入插件对应的代码。

安装插件有两种方式 :

  • 一种是在book.json写入相应插件和配置后,使用gitbook install命令,进行全局安装
  • 一种是使用npm install gitbook-plugin-插件名,单独安装。

    hide-element 隐藏元素

    主要用来隐藏不想看到的元素。
    如:默认的gitbook左侧提示:Published with GitBook

使用方式: 在book.json中写入以下内容:

book.json
1
2
3
4
5
6
7
8
9
10
{
"plugins": [
"hide-element"
],
"pluginsConfig": {
"hide-element": {
"elements": [".gitbook-link"]
}
}
}

然后运行gitbook install命令进行安装,安装效果如下:

1
2
3
4
5
6
7
8
9
$ gitbook install
info: installing 1 plugins using npm@3.9.2
info:
info: installing plugin "hide-element"
info: install plugin "hide-element" (*) from NPM with version 0.0.4
E:\Blog\MyGitBook
`-- gitbook-plugin-hide-element@0.0.4

info: >> plugin "hide-element" installed with success

back-to-top-button 回到顶部

当文章篇幅较长时,页面底部会显示按钮,一键点击自动回到顶部。

1
2
3
4
5
6
7
8
9
10
11
{
"plugins": [
"hide-element",
"back-to-top-button"
],
"pluginsConfig": {
"hide-element": {
"elements": [".gitbook-link"]
}
}
}

chapter-fold 导航目录折叠

gitbook默认目录没有折叠效果。

code 复制代码

在代码域的右上角添加一个复制按钮,点击一键复制代码。

1
2
3
4
5
6
7
8
9
10
11
12
{
"plugins": [
"hide-element",
"back-to-top-button",
"code"
],
"pluginsConfig": {
"hide-element": {
"elements": [".gitbook-link"]
}
}
}

splitter 侧边栏宽度可调节

左侧目录和右侧文章可以拖动调节宽度。

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"plugins": [
"hide-element",
"back-to-top-button",
"code",
"splitter"
],
"pluginsConfig": {
"hide-element": {
"elements": [".gitbook-link"]
}
}
}

search-pro 高级搜索

支持中英文,准确率更高一些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"plugins": [
"hide-element",
"back-to-top-button",
"code",
"splitter",
"-lunr",
"-search",
"search-pro"
],
"pluginsConfig": {
"hide-element": {
"elements": [".gitbook-link"]
}
}
}

在左侧导航栏上方插入logo。url支持本地图片也支持网络图片链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"plugins": [
"hide-element",
"back-to-top-button",
"code",
"splitter",
"-lunr",
"-search",
"search-pro",
"insert-logo"
],
"pluginsConfig": {
"hide-element": {
"elements": [".gitbook-link"]
},
"insert-logo": {
"url": "images/logo.png",
"style": "background: none; max-height: 30px; min-height: 30px"
}
}
}

custom-favicon 修改标题栏图标

设置浏览器选项卡标题栏的小图标。
注意只支持ico后缀的图片,并且只支持本地图片,不支持网络图片链接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"plugins": [
"hide-element",
"back-to-top-button",
"code",
"splitter",
"-lunr",
"-search",
"search-pro",
"insert-logo",
"custom-favicon"
],
"pluginsConfig": {
"hide-element": {
"elements": [".gitbook-link"]
},
"insert-logo": {
"url": "images/logo.png",
"style": "background: none; max-height: 30px; min-height: 30px"
},
"favicon": "icon/favicon.ico"
}
}

pageview-count 阅读量计数

记录每个文章页面被访问的次数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
"plugins": [
"hide-element",
"back-to-top-button",
"code",
"splitter",
"-lunr",
"-search",
"search-pro",
"insert-logo",
"custom-favicon",
"pageview-count"
],
"pluginsConfig": {
"hide-element": {
"elements": [".gitbook-link"]
},
"insert-logo": {
"url": "images/logo.png",
"style": "background: none; max-height: 30px; min-height: 30px"
},
"favicon": "icon/favicon.ico"
}
}

在每个文章下面标注版权信息和文章时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"plugins": [
"hide-element",
"back-to-top-button",
"code",
"splitter",
"-lunr",
"-search",
"search-pro",
"insert-logo",
"custom-favicon",
"pageview-count",
"tbfed-pagefooter"
],
"pluginsConfig": {
"hide-element": {
"elements": [".gitbook-link"]
},
"insert-logo": {
"url": "images/logo.png",
"style": "background: none; max-height: 30px; min-height: 30px"
},
"favicon": "icon/favicon.ico",
"tbfed-pagefooter": {
"copyright":"Copyright &copy dsx2016.com 2019",
"modify_label": "该文章修订时间:",
"modify_format": "YYYY-MM-DD HH:mm:ss"
}
}
}

点击可以在新窗口展示图片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
"plugins": [
"hide-element",
"back-to-top-button",
"code",
"splitter",
"-lunr",
"-search",
"search-pro",
"insert-logo",
"custom-favicon",
"pageview-count",
"tbfed-pagefooter",
"popup",
],
"pluginsConfig": {
"hide-element": {
"elements": [".gitbook-link"]
},
"insert-logo": {
"url": "images/logo.png",
"style": "background: none; max-height: 30px; min-height: 30px"
},
"favicon": "icon/favicon.ico",
"tbfed-pagefooter": {
"copyright":"Copyright &copy dsx2016.com 2019",
"modify_label": "该文章修订时间:",
"modify_format": "YYYY-MM-DD HH:mm:ss"
}
}
}

sharing-plus 分享当前页面

gitbook默认只有Facebook、Google+、Twiter、Weibo、Instapaper

插件可以有更多分享方式,也可以关闭指定分享方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{
"plugins": [
"hide-element",
"back-to-top-button",
"code",
"splitter",
"-lunr",
"-search",
"search-pro",
"insert-logo",
"custom-favicon",
"pageview-count",
"tbfed-pagefooter",
"popup",
"-sharing",
"sharing-plus"
],
"pluginsConfig": {
"hide-element": {
"elements": [".gitbook-link"]
},
"insert-logo": {
"url": "images/logo.png",
"style": "background: none; max-height: 30px; min-height: 30px"
},
"favicon": "icon/favicon.ico",
"tbfed-pagefooter": {
"copyright": "Copyright &copy dsx2016.com 2019",
"modify_label": "该文章修订时间:",
"modify_format": "YYYY-MM-DD HH:mm:ss"
},
"sharing": {
"douban": true,
"facebook": true,
"google": true,
"pocket": true,
"qq": true,
"qzone": true,
"twitter": true,
"weibo": true,
"all": [
"douban", "facebook", "google", "instapaper", "linkedin", "twitter", "weibo",
"messenger", "qq", "qzone", "viber", "whatsapp"
]
}

}
}

Prism 代码高亮

使用 Prism.js 为语法添加高亮显示,需要将 highlight 插件去掉。该插件自带的主题样式较少,可以再安装 prism-themes 插件,里面多提供了几种样式,具体的样式可以参考 这里,在设置样式时要注意设置 css 文件名,而不是样式名。
Prism 插件地址
prism-themes 插件地址

book.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"plugins": [
"-highlight",
"prism",
"prism-themes"
],
"pluginsConfig": {
"prism": {
"css": [
"prismjs/themes/prism-solarizedlight.css"
]
}
}
}

如何切换样式

查看样式效果

https://github.com/PrismJS/prism-themes#available-themes

prism样式的本地css文件路径

gitbook install安装完毕后,样式已经保存在项目路径下的node_modules\prism-themes\themes路径下了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
E:\Blog\MyGitBook\node_modules\prism-themes\themes>mytree f
E:\Blog\MyGitBook\node_modules\prism-themes\themes
├─prism-a11y-dark.css
├─prism-atom-dark.css
├─prism-base16-ateliersulphurpool.light.css
├─prism-cb.css
├─prism-darcula.css
├─prism-dracula.css
├─prism-duotone-dark.css
├─prism-duotone-earth.css
├─prism-duotone-forest.css
├─prism-duotone-light.css
├─prism-duotone-sea.css
├─prism-duotone-space.css
├─prism-ghcolors.css
├─prism-hopscotch.css
├─prism-material-dark.css
├─prism-material-light.css
├─prism-material-oceanic.css
├─prism-nord.css
├─prism-pojoaque.css
├─prism-shades-of-purple.css
├─prism-synthwave84.css
├─prism-vs.css
├─prism-vsc-dark-plus.css
└─prism-xonokai.css

去掉前面的使用相对于node_modules目录的相对路径即可使用该css文件,例如如果你想使用VS样式(vscode)的css文件相对于node_modules的路径为:prism-themes\themes\prism-vs.css,则路径为:

1
"prism-themes/themes/prism-vs.css"

即可定位到该CSS文件
也就是将上面的book.json改成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"plugins": [
"-highlight",
"prism",
"prism-themes"
],
"pluginsConfig": {
"prism": {
"css": [
"prism-themes/themes/prism-vs.css"
]
}
}
}

即可使用该CSS。

添加github图标

1
2
3
4
5
6
7
8
"plugins": [
"github"
],
"pluginsConfig": {
"github": {
"url": "https://github.com/你的地址"
}
}

数学公式 KaTex

为了支持数学公式, 我们可以使用KaTex和MathJax插件, 官网上说Katex速度要快于MathJax

MathJax使用LaTeX语法编写数学公式教程

参考资料

https://blog.csdn.net/Lowerce/article/details/107579261
https://www.npmjs.com/package/gitbook
GitBook 插件
推荐12个实用的gitbook插件
https://www.npmjs.com/search?q=gitbook-plugin

使用nvm切换多个nodejs版本

删除本机上正在使用的nodejs

将之前安装的nodejs从本机中删除掉.

下载nvm nvm-windows

到github上下载最新版本的nvm-setup.zip这个压缩包:
https://github.com/coreybutler/nvm-windows/releases
解压nvm-setup.zip,得到nvm-setup.exe,点击运行nvm-setup.exe,

  • 选择nvm的安装路径(E:\dev2\nvm\nvm)

    • 注意nvm的安装路径里面不能有空格,(不要安装到类似E:\Program Files\nvm这类路径下)如果有空格的话使用nvm use 版本号的时候会报错:
    • exit status 1…
  • 选择nodejs的安装路径(E:\dev2\nvm\nodejs)

使用淘宝源

使用淘宝镜像,安装的时候可以快一点.

打开nvm安装路径下的settings.txt文件,在后面添加如下两行代码:

1
2
node_mirror: https://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/

完整配置文件如下所示

E:\dev2\nvm\nvm\settings.txt
1
2
3
4
root: E:\dev2\nvm\nvm
path: E:\dev2\nvm\nodejs
node_mirror: https://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/

查看可安装的版本

1
nvm list available

查询效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ nvm list available

| CURRENT | LTS | OLD STABLE | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
| 14.13.1 | 12.19.0 | 0.12.18 | 0.11.16 |
| 14.13.0 | 12.18.4 | 0.12.17 | 0.11.15 |
| 14.12.0 | 12.18.3 | 0.12.16 | 0.11.14 |
| 14.11.0 | 12.18.2 | 0.12.15 | 0.11.13 |
| 14.10.1 | 12.18.1 | 0.12.14 | 0.11.12 |
| 14.10.0 | 12.18.0 | 0.12.13 | 0.11.11 |
| 14.9.0 | 12.17.0 | 0.12.12 | 0.11.10 |
| 14.8.0 | 12.16.3 | 0.12.11 | 0.11.9 |
| 14.7.0 | 12.16.2 | 0.12.10 | 0.11.8 |
| 14.6.0 | 12.16.1 | 0.12.9 | 0.11.7 |
| 14.5.0 | 12.16.0 | 0.12.8 | 0.11.6 |
| 14.4.0 | 12.15.0 | 0.12.7 | 0.11.5 |
| 14.3.0 | 12.14.1 | 0.12.6 | 0.11.4 |
| 14.2.0 | 12.14.0 | 0.12.5 | 0.11.3 |
| 14.1.0 | 12.13.1 | 0.12.4 | 0.11.2 |
| 14.0.0 | 12.13.0 | 0.12.3 | 0.11.1 |
| 13.14.0 | 10.22.1 | 0.12.2 | 0.11.0 |
| 13.13.0 | 10.22.0 | 0.12.1 | 0.9.12 |
| 13.12.0 | 10.21.0 | 0.12.0 | 0.9.11 |
| 13.11.0 | 10.20.1 | 0.10.48 | 0.9.10 |

This is a partial list. For a complete list, visit https://nodejs.org/download/release

安装指定版本的nodejs

例如安装最新的长期支持版本12.19.0:

1
nvm install 10.21.0

运行效果:

1
2
3
4
5
6
7
8
9
10
11
12
$ nvm install 10.21.0
Downloading node.js version 10.21.0 (64-bit)...
Complete
Creating E:\dev2\nvm\nvm\temp

Downloading npm version 6.14.4... Complete
Installing npm v6.14.4...

Installation complete. If you want to use this version, type

nvm use 10.21.0

使用指定版本的nodejs

例如使用刚才安装的版本:

1
nvm use 12.19.0

运行效果:

1
2
3
4
5
6
7
8
9
10
11
$ nvm use 12.19.0
Now using node v12.19.0 (64-bit)

lan@DESKTOP-8ISAT6B MINGW64 /e/Blog/MyGitBook
$ node -v
v12.19.0

lan@DESKTOP-8ISAT6B MINGW64 /e/Blog/MyGitBook
$ npm -v
6.14.8

查看已安装的nodejs版本

1
nvm list

运行效果:

1
2
3
4
5
$ nvm list

* 12.19.0 (Currently using 64-bit executable)
10.21.0

切换到10.21.0版本:

1
nvm use 10.21.0

运行效果:

1
2
3
4
5
6
7
8
9
10
11
$ nvm use 10.21.0
Now using node v10.21.0 (64-bit)

lan@DESKTOP-8ISAT6B MINGW64 /e/Blog/MyGitBook
$ node -v
v10.21.0

lan@DESKTOP-8ISAT6B MINGW64 /e/Blog/MyGitBook
$ npm -v
6.14.4

参考资料

https://www.jianshu.com/p/a230bd5f6fe9
https://www.jianshu.com/p/7204af51fa01
windows下Nodejs多版本切换
nvm-windows下载链接
https://juejin.im/post/6844903875669917703

华为荣耀畅玩4X移动版 线刷 带谷歌服务的ROM 获取Root权限

手机基本信息

  • 华为荣耀畅玩4X移动版 标准版
  • 1G运行内存
  • Che2-TL00型号

解锁

到淘宝上找商家解锁,十块钱左右.

下载带谷歌服务的ROM

线刷ROM

下载奇兔刷机

进入奇兔刷机官网http://www.7to.cn/,下载软件,然后安装软件.

手机开启USB调试

进入设置,关于手机,在版本号上连续点击7次,即可打开开发者模式。
然后返回,进入开发人员选项,然后打开USB调试的按钮即可.

使用线刷大师

打开奇兔刷机,用数据线连上手机,然后点击线刷大师,点击选择固件按钮,选择下载好的ROM的.zip包,然后点击开始刷机按钮即可.

给手机刷入 第三方recovery

下载第三方recovery cofface Recovery

https://club.huawei.com/thread-3533408-1-1.html
cofface Recovery下载地址:
链接:http://pan.baidu.com/s/1ntMIt53密码: vfu3
链接:https://pan.baidu.com/s/1apNFeQOkYOCjQP_zVXoIpw 提取码:nxwq

刷入root.zip 获取ROOT权限

下载Root包

Root包说明

Root包说明
华为手机安卓4.3 4.4取权限的ROOT单刷包,适合华为手机大部分无法使用一键ROOT的手机。
只要您的手机有第三方recovery,不管系统是5.0还是4.4,都可以卡刷本ROOT单刷包取得超级权限。

root包下载地址

Root包下载地址
链接:https://pan.baidu.com/s/1ghleK_9rZCDFlzhJX9_yeg 提取码:qyua

重命名root包

将ROOT_For_EMUI3.0.zip,重命名为root.zip

复制root.zip到内部存储根目录

将root.zip复制到SD卡,然后使用手机的文件管理器,将这个root.zip复制到内部存储的根目录.

使用cofface Recovery开启Root权限

安装谷歌应用

安装翻墙软件,推荐使用老王VPN
我这款ROM已经自带谷歌的GMS服务了,只要下载一个Google Play store,即可下载安装Google play上的软件。

Java Swing系统托盘程序

项目结构

展开/折叠
E:\workspacne_JDK8Tomcat8.5\SystemTrayDemo
└─src\
  ├─com\
  │ └─lan\
  │   ├─networking.png
  │   ├─SystemTrayDemo.java
  │   └─SystemTrayFrame.java
  └─sun.png

托盘图标

networking.png

https://www.iconfont.cn/search/index?q=network下载一个图标,和.java文件放在同一个包下即可.

sun.png

https://www.iconfont.cn/search/index?searchType=icon&q=sun下载一个图标,放在src目录下。

SystemTrayDemo.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.lan;

import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

public class SystemTrayDemo
{
public static void main(String[] args)
{
// 判断是否支持系统托盘
if (SystemTray.isSupported())
{
// 获取图片所在的URL,请把图片放在同一个包下
URL url = SystemTrayDemo.class.getResource("networking.png");
// 实例化图像对象
ImageIcon icon = new ImageIcon(url);
// 获得Image对象
Image image = icon.getImage();
// 创建托盘图标
TrayIcon trayIcon = new TrayIcon(image);
// 为托盘添加鼠标适配器
trayIcon.addMouseListener(new MouseAdapter() {
// 鼠标事件
public void mouseClicked(MouseEvent e)
{
// 判断是否双击了鼠标
if (e.getClickCount() == 2)
{
JOptionPane.showMessageDialog(null, "SystemTrayDemo");
}
}
});
// 添加工具提示文本
trayIcon.setToolTip("本地连接\r\n速度:100.0 Mbps\r\n状态:已连接上");
// 创建弹出菜单
PopupMenu popupMenu = new PopupMenu();
popupMenu.add(new MenuItem("禁用(D)"));
popupMenu.add(new MenuItem("状态(S)"));
popupMenu.add(new MenuItem("修复(P)"));
popupMenu.addSeparator();
popupMenu.add(new MenuItem("更改 Windows 防火墙设置(C)"));
popupMenu.addSeparator();
popupMenu.add(new MenuItem("打开网络连接(O)"));

// 为托盘图标加弹出菜弹
trayIcon.setPopupMenu(popupMenu);
// 获得系统托盘对象
SystemTray systemTray = SystemTray.getSystemTray();
try
{
// 为系统托盘加托盘图标
systemTray.add(trayIcon);
} catch (Exception e)
{
e.printStackTrace();
}
} else
{
JOptionPane.showMessageDialog(null, "not support");
}
}
}

运行效果

图片

乱码解决

1. 设置项目的编码为GBK

在项目上右键,选择Properties,然后在对话框的右侧中的Text file encoding选择框中选择Other,然后选择GBK
图片

2. 添加运行参数-Dfile.encoding=GBK

在编辑区域,右键,Run As,Run Configurations...,然后在弹出的对话框的左侧列表中展开Java Application,选择SystemTrayDemo,然后点击右边的Arguments选项卡,在VM arguments:文本框中输入-Dfile.encoding=GBK
图片

SystemTrayFrame.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package com.lan;

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class SystemTrayFrame extends JFrame {
private static final long serialVersionUID = 6708808934167400534L;
private JPanel contentPane;

/**
* Launch the application.
*/
public static void main(String[] args) {
// 启动窗体
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
// 创建窗体
SystemTrayFrame frame = new SystemTrayFrame();
// 显示窗体
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the frame.
*/
public SystemTrayFrame() {
setTitle("测试系统面板");
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
// 初始化系统托盘
initSystemTray();
}

/**
* 初始化系统托盘,复用方法,把该方法复制其他Frame中,然后调用使用系统托盘。
*/
private void initSystemTray() {
// 判断系统是否支持托盘图标
if (SystemTray.isSupported()) {
// 获取托盘图标,图片请放在src目录下
URL resource = this.getClass().getResource("/sun.png");
// 创建图标
ImageIcon icon = new ImageIcon(resource);
// 创建弹出式菜单
PopupMenu pop = new PopupMenu();
// 创建 显示菜单项
MenuItem displayJFrameItem = new MenuItem("显示");
// 给 显示窗体菜单项 添加事件处理程序
displayJFrameItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(true);
}
});
// 显示菜单项 添加到 弹出式菜单中
pop.add(displayJFrameItem);

// 创建 退出菜单项
MenuItem exitItem = new MenuItem("退出");
// 给 退出菜单项 添加事件监听器,单击时退出系统
exitItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
// 添加 退出菜单项 到弹出框中
pop.add(exitItem);

// 创建托盘图标程序
TrayIcon tray = new TrayIcon(icon.getImage(), "HelloWorld", pop);
// 获得系统托盘对象
SystemTray systemTray = SystemTray.getSystemTray();
try {
// 将托盘图标添加到系统托盘中
systemTray.add(tray);
} catch (AWTException e1) {
e1.printStackTrace();
}
}
}
}

运行效果

关闭窗体后,程序并不会退出,在系统托盘上的太阳图标上右键,

  • 选择显示,可以重新显示窗体;
  • 选择退出,则退出程序;

参考资料

https://blog.csdn.net/jianggujin/article/details/50577491
https://blog.csdn.net/qq_36761831/article/details/81516535
https://www.docs4dev.com/docs/zh/java/java8/tutorials/uiswing-misc-systemtray.html
https://blog.csdn.net/xietansheng/article/details/78389278

使用步骤

控制台中创建文字识别应用

获取key

下载Java SDK

创建Java 项目

导入jar包

运行文档中的测试类

JSON转Java对象

使用单例模式创建客户端

错误提示

今天复习的时候,运行以前的测试项目出现了如下错误:

DEBUG [main] ==>  Preparing: { call insert_user( ?, ?, ?, ? ) } 
org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: java.sql.SQLException: Parameter number 1 is not an OUT parameter
### SQL: { call insert_user( ?,         ?, ?, ? ) }
### Cause: java.sql.SQLException: Parameter number 1 is not an OUT parameter
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:200)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:57)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
    at com.sun.proxy.$Proxy2.inserUser(Unknown Source)
    at test.InserTest.main(InserTest.java:21)
Caused by: java.sql.SQLException: Parameter number 1 is not an OUT parameter
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
    at com.mysql.cj.jdbc.CallableStatement.checkIsOutputParam(CallableStatement.java:643)
    at com.mysql.cj.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:1714)
    at com.mysql.cj.jdbc.CallableStatement.registerOutParameter(CallableStatement.java:1722)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:78)
    at com.sun.proxy.$Proxy4.registerOutParameter(Unknown Source)
    at org.apache.ibatis.executor.statement.CallableStatementHandler.registerOutputParameters(CallableStatementHandler.java:110)
    at org.apache.ibatis.executor.statement.CallableStatementHandler.parameterize(CallableStatementHandler.java:94)
    at org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize(RoutingStatementHandler.java:64)
    at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
    at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49)
    at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
    at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
    ... 5 more

原因

这个项目需要调用数据库中的存储过程.由于是测试项目,我当时测试成功之后,就把对应的数据库表格和存储过程删除掉了。
今天测试的时候,我忘了事先在数据库中创建需要调用的存储过程insert_user

解决方案

创建需要的数据库表格,创建需要的存储过程insert_user