VuePress + github pages + Travis CI 教程

介紹

VuePress 由兩部分組成:一部分是支持用 Vue 開發(fā)主題的極簡(jiǎn)靜態(tài)網(wǎng)站生成器,另一個(gè)部分是為書寫技術(shù)文檔而優(yōu)化的默認(rèn)主題。它的誕生初衷是為了支持 Vue 及其子項(xiàng)目的文檔需求。
每一個(gè)由 VuePress 生成的頁(yè)面都帶有預(yù)渲染好的 HTML,也因此具有非常好的加載性能和搜索引擎優(yōu)化(SEO)。同時(shí),一旦頁(yè)面被加載,Vue 將接管這些靜態(tài)內(nèi)容,并將其轉(zhuǎn)換成一個(gè)完整的單頁(yè)應(yīng)用(SPA),其他的頁(yè)面則會(huì)只在用戶瀏覽到的時(shí)候才按需加載。

快速上手

注意:
請(qǐng)確保你的 Node.js 版本 >= 8。

@全局安裝

npm install -g vuepress

注意
全局安裝vuepress會(huì)和webpack-dev-middleware@3.6.1沖突,導(dǎo)致運(yùn)行意外報(bào)錯(cuò)

構(gòu)建項(xiàng)目

項(xiàng)目結(jié)構(gòu)

# 新建項(xiàng)目
mkdir my_blog
cd my_blog
# 新建文檔目錄
mkdir docs 
mkdir docs/.vuepress
# 創(chuàng)建配置文件
touch package.json
touch docs/.vuepress/config.js
# 創(chuàng)建第一個(gè)文檔
touch docs/README.md

此時(shí)項(xiàng)目目錄為

my_blog
├─── docs //文檔目錄
│   ├── README.md //第一篇文檔 `hello vuepress`
│   └── .vuepress //主要用于存放VuePress相關(guān)的文件
│       └── config.js //VuePress必要的配置文件
└── package.json

配置package.json

VuePress中有兩個(gè)命令,vuepress dev docs命令運(yùn)行本地服務(wù),通過訪問http://localhost:8080即可預(yù)覽網(wǎng)站,vuepress build docs命令用來生成靜態(tài)文件,默認(rèn)情況下,放置在docs/.vuepress/dist目錄中,當(dāng)然你也可以在docs/.vuepress/config.js中的dest字段來修改默認(rèn)存放目錄。在這里將兩個(gè)命令封裝成腳本的方式,直接使用npm run docs:dev和npm run docs:build即可

{
  "scripts": {
    "docs:dev": "vuepress dev docs",
    "docs:build": "vuepress build docs"
  },
  "dependencies": {
    "vuepress": "^0.14.10"
  },
  "resolutions": {
    "webpack-dev-middleware": "3.6.0"
  }
}

這里手動(dòng)引入vuepresswebpack-dev-middleware@3.6.0

安裝依賴

yarn # 或者  npm I

運(yùn)行

yarn docs:dev # 或者:npm run docs:dev 
# 全局安裝可直接執(zhí)行 vuepress dev

編譯

要生成靜態(tài)的 HTML 文件,運(yùn)行

yarn docs:build # 或者:npm run docs:build 
# 全局安裝可直接執(zhí)行 vuepress build

配置默認(rèn)主題

首頁(yè)

默認(rèn)的主題提供了一個(gè)首頁(yè)(Homepage)的布局,
編輯根目錄下的README.md文件

---
home: true
heroImage: /hero.png
actionText: 快速上手 →
actionLink: /zh/guide/
features:
- title: 簡(jiǎn)潔至上
  details: 以 Markdown 為中心的項(xiàng)目結(jié)構(gòu),以最少的配置幫助你專注于寫作。
- title: Vue驅(qū)動(dòng)
  details: 享受 Vue + webpack 的開發(fā)體驗(yàn),在 Markdown 中使用 Vue 組件,同時(shí)可以使用 Vue 來開發(fā)自定義主題。
- title: 高性能
  details: VuePress 為每個(gè)頁(yè)面預(yù)渲染生成靜態(tài)的 HTML,同時(shí)在頁(yè)面被加載的時(shí)候,將作為 SPA 運(yùn)行。
footer: MIT Licensed | Copyright ? 2018-present Evan You
---

導(dǎo)航欄

導(dǎo)航欄可能包含你的頁(yè)面標(biāo)題、搜索框、 導(dǎo)航欄鏈接、多語(yǔ)言切換等等,它們均取決于你的配置。

導(dǎo)航欄鏈接

可以通過 themeConfig.nav 增加一些導(dǎo)航欄鏈接

// .vuepress/config.js
module.exports = {
  themeConfig: {
    nav: [
      { text: 'Home', link: '/' },
      { text: 'Guide', link: '/guide/' },
      { text: 'External', link: 'https://google.com' },
    ]
  }
}

當(dāng)提供了一個(gè) items 數(shù)組而不是一個(gè)單一的 link 時(shí),它將顯示為一個(gè) 下拉列表 :

module.exports = {
  themeConfig: {
    nav: [
      {
        text: 'Languages',
        items: [
          { text: 'Chinese', link: '/language/chinese' },
          { text: 'Japanese', link: '/language/japanese' }
        ]
      }
    ]
  }
}

此外,還可以通過嵌套的 items 來在 下拉列表 中設(shè)置分組:

module.exports = {
  themeConfig: {
    nav: [
      {
        text: 'Languages',
        items: [
          { text: 'Group1', items: [/*  */] },
          { text: 'Group2', items: [/*  */] }
        ]
      }
    ]
  }
}

可以使用 themeConfig.navbar 來禁用所有頁(yè)面的導(dǎo)航欄:

module.exports = {
  themeConfig: {
    navbar: false
  }
}

側(cè)邊欄

想要使 側(cè)邊欄(Sidebar)生效,需要配置 themeConfig.sidebar,基本的配置,需要一個(gè)包含了多個(gè)鏈接的數(shù)組:

// .vuepress/config.js
module.exports = {
  themeConfig: {
    sidebar: [
      '/',
      '/page-a',
      ['/page-b', 'Explicit link text']
    ]
  }
}

可以省略 .md 拓展名,同時(shí)以 / 結(jié)尾的路徑將會(huì)被視為 */README.md

嵌套的標(biāo)題鏈接

默認(rèn)情況下,側(cè)邊欄會(huì)自動(dòng)地顯示由當(dāng)前頁(yè)面的標(biāo)題(headers)組成的鏈接,并按照頁(yè)面本身的結(jié)構(gòu)進(jìn)行嵌套,你可以通過 themeConfig.sidebarDepth 來修改它的行為。默認(rèn)的深度是 1,它將提取到 h2 的標(biāo)題,設(shè)置成 0 將會(huì)禁用標(biāo)題(headers)鏈接,同時(shí),最大的深度為 2,它將同時(shí)提取 h2 和 h3 標(biāo)題。

---
sidebarDepth: 2
---

顯示所有頁(yè)面的標(biāo)題鏈接

默認(rèn)情況下,側(cè)邊欄只會(huì)顯示由當(dāng)前活動(dòng)頁(yè)面的標(biāo)題(headers)組成的鏈接,你可以將 themeConfig.displayAllHeaders 設(shè)置為 true 來顯示所有頁(yè)面的標(biāo)題鏈接:

module.exports = {
  themeConfig: {
    displayAllHeaders: true // 默認(rèn)值:false
  }
}

側(cè)邊欄分組

可以通過使用對(duì)象來將側(cè)邊欄劃分成多個(gè)組:

// .vuepress/config.js
module.exports = {
  themeConfig: {
    sidebar: [
      {
        title: 'Group 1',
        collapsable: false,
        children: [
          '/'
        ]
      },
      {
        title: 'Group 2',
        children: [ /* ... */ ]
      }
    ]
  }
}

多個(gè)側(cè)邊欄

如果你想為不同的頁(yè)面組來顯示不同的側(cè)邊欄,首先,將你的頁(yè)面文件組織成下述的目錄結(jié)構(gòu):

.
├─ README.md
├─ contact.md
├─ about.md
├─ foo/
│  ├─ README.md
│  ├─ one.md
│  └─ two.md
└─ bar/
   ├─ README.md
   ├─ three.md
   └─ four.md

接著,遵循以下的側(cè)邊欄配置:

// .vuepress/config.js
module.exports = {
  themeConfig: {
    sidebar: {
      '/foo/': [
        '',     /* /foo/ */
        'one',  /* /foo/one.html */
        'two'   /* /foo/two.html */
      ],

      '/bar/': [
        '',      /* /bar/ */
        'three', /* /bar/three.html */
        'four'   /* /bar/four.html */
      ],

      // fallback
      '/': [
        '',        /* / */
        'contact', /* /contact.html */
        'about'    /* /about.html */
      ]
    }
  }
}

確保 fallback 側(cè)邊欄被最后定義。VuePress 會(huì)按順序遍歷側(cè)邊欄配置來尋找匹配的配置。

自定義默認(rèn)主題顏色

如果你只是希望應(yīng)用一些簡(jiǎn)單的 overrides 到默認(rèn)主題的樣式上,可以創(chuàng)建一個(gè) .vuepress/override.styl 文件

這里有一些可以調(diào)整的顏色變量:

// showing default values
$accentColor = #3eaf7c
$textColor = #2c3e50
$borderColor = #eaecef
$codeBgColor = #282c34

部署到Git

前提

下述的指南基于以下條件:

  • 文檔放置在項(xiàng)目的 docs 目錄中;
  • 使用的是默認(rèn)的構(gòu)建輸出位置;
  • VuePress 以本地依賴的形式被安裝到你的項(xiàng)目中,并且配置了如下的 npm scripts:
{
  "scripts": {
    "docs:build": "vuepress build docs"
  }
}

準(zhǔn)備

  • 前往github,創(chuàng)建用于存放文檔的Repo
  • 開啟GitHub Pages

SSH Key

ssh,簡(jiǎn)單來講,就是一個(gè)秘鑰,其中,id_rsa是你這臺(tái)電腦的私人秘鑰,不能給別人看的,id_rsa.pub是公共秘鑰,可以隨便給別人看。把這個(gè)公鑰放在GitHub上,這樣當(dāng)你鏈接GitHub自己的賬戶時(shí),它就會(huì)根據(jù)公鑰匹配你的私鑰,當(dāng)能夠相互匹配時(shí),才能夠順利的通過git上傳你的文件到GitHub上

生成

git config --global user.name "username"
git config --global user.email "useremail"
ssh-keygen -t rsa -C "1234@qq.com"

回車后提示輸入密碼, 此處密碼可以不填, 直接回車

配置

上述命令運(yùn)行成功后,終端會(huì)給出存儲(chǔ)位置

Your public key has been saved in /Users/XXX/.ssh/id_rsa.pub

打開上述文件,復(fù)制文件中的公鑰添加到github

測(cè)試

在gitbash中,查看是否成功

ssh -T git@github.com

開始

  • docs/.vuepress/config.js 中設(shè)置正確的 base
    如果你打算發(fā)布到 https://<USERNAME>.github.io/,則可以省略這一步,因?yàn)?base 默認(rèn)即是 "/"。
  • 在你的項(xiàng)目中,創(chuàng)建一個(gè)如下的 deploy.sh 文件(請(qǐng)自行判斷去掉高亮行的注釋):
#!/usr/bin/env sh

# 確保腳本拋出遇到的錯(cuò)誤
set -e

# 生成靜態(tài)文件
npm run docs:build

# 進(jìn)入生成的文件夾
cd docs/.vuepress/dist

# 如果是發(fā)布到自定義域名
# echo 'www.example.com' > CNAME

git init
git add -A
git commit -m 'deploy'

# 如果發(fā)布到 https://<USERNAME>.github.io
# git push -f git@github.com:<USERNAME>/<USERNAME>.github.io.git master

# 如果發(fā)布到 https://<USERNAME>.github.io/<REPO>
# git push -f git@github.com:<USERNAME>/<REPO>.git master:gh-pages

cd -

macOS運(yùn)行.sh腳本需要權(quán)限

chmod 777 deploy.sh

成果

打開XXX.github.io查看成果吧

進(jìn)階

在vuepress中使用Vue

自定義Vue組件

所有在 .vuepress/components 中找到的 *.vue 文件將會(huì)自動(dòng)地被注冊(cè)為全局的異步組件,如:

.
└─ .vuepress
   └─ components
      ├─ demo-1.vue
      ├─ OtherComponent.vue
      └─ Foo
         └─ Bar.vue

你可以直接使用這些組件在任意的 Markdown 文件中(組件名是通過文件名取到的):

<demo-1/>
<OtherComponent/>
<Foo-Bar/>

使用ElementUI

由于 VuePress 是一個(gè)標(biāo)準(zhǔn)的 Vue 應(yīng)用,你可以通過創(chuàng)建一個(gè) .vuepress/enhanceApp.js 文件來做一些應(yīng)用級(jí)別的配置,當(dāng)該文件存在的時(shí)候,會(huì)被導(dǎo)入到應(yīng)用內(nèi)部。enhanceApp.js 應(yīng)該 export default 一個(gè)鉤子函數(shù),并接受一個(gè)包含了一些應(yīng)用級(jí)別屬性的對(duì)象作為參數(shù)。你可以使用這個(gè)鉤子來安裝一些附加的 Vue 插件、注冊(cè)全局組件,或者增加額外的路由鉤子等:

export default ({
  Vue, // VuePress 正在使用的 Vue 構(gòu)造函數(shù)
  options, // 附加到根實(shí)例的一些選項(xiàng)
  router, // 當(dāng)前應(yīng)用的路由實(shí)例
  siteData // 站點(diǎn)元數(shù)據(jù)
}) => {
  // ...做一些其他的應(yīng)用級(jí)別的優(yōu)化
}

開始

  • 新建.vuepress/enhanceApp.js文件,并引入ElementUI
import Element from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
export default ({
                  Vue, // VuePress 正在使用的 Vue 構(gòu)造函數(shù)
                  options, // 附加到根實(shí)例的一些選項(xiàng)
                  router, // 當(dāng)前應(yīng)用的路由實(shí)例
                  siteData // 站點(diǎn)元數(shù)據(jù)
                }) => {
  // ...做一些其他的應(yīng)用級(jí)別的優(yōu)化
  Vue.use(Element)
}
  • 安裝依賴
    package.json中添加
"dependencies": {
    "element-ui": "^2.7.0"
}
yarn # 或者 npm I
  • MarkDown或者自定義組件中使用ElementUI

Travis CI 持續(xù)集成部署

現(xiàn)有問題

我們使用上述的deploy.sh部署到git后,vuepress是把我們項(xiàng)目打包后的靜態(tài)資源文件pushgit分支上。
上傳后的項(xiàng)目大概是這個(gè)樣子:

vuepress1.png

vuepress2.png

這么做就有一個(gè)明顯的弊端。如果這個(gè)項(xiàng)目不是個(gè)人博客,而是需要多人維護(hù)的項(xiàng)目文檔,那么其他人想要修改這個(gè)文檔是沒辦法把這些html文件clone到本地進(jìn)行修改的。

我們想要的是,git上存放我們的項(xiàng)目,即markdown文件,我們可以隨時(shí)修改這些markdown然后push到線上,我們的github Pages則會(huì)相應(yīng)的顯示編譯好的html。

引入

Travis CI正好符合我們的要求。

它的作用是可以監(jiān)控到我們git資源庫(kù)的每一次變更,在收到push請(qǐng)求后會(huì)為我們提供一個(gè)虛擬機(jī)來幫助我們執(zhí)行一些任務(wù),比如我們文檔的build以及發(fā)布。

這樣一來我們把修改好的markdown推到線上后,travis會(huì)幫我們自動(dòng)執(zhí)行deploy.sh里的腳本。我們就可以只專注于文檔本身的內(nèi)容,也方便文檔的維護(hù)。。

準(zhǔn)備

重命名

使用xxx.github.io作為github Pages首頁(yè)是無(wú)法選擇分支的,git會(huì)自動(dòng)將xxx.github.io下的master分支當(dāng)做靜態(tài)資源。而我們需要的是master分支存放我們的項(xiàng)目即markdown,另外的分支來存放編譯好的html

  • 更改我們的資源庫(kù)名為docs,新建分支gh pages,然后在設(shè)置中將github Pages分支切換到gh pages
    vuepress3.png

設(shè)置base

  • 由于文檔地址已經(jīng)更換,這里需要將config.js里的base設(shè)置為/docs/
module.exports = {
  base:'/docs/'
}

配置 .travis.yml

然后在項(xiàng)目根目錄新建文件 .travis.yml, 這個(gè)文件內(nèi)容根據(jù)你的項(xiàng)目而定,比如我們的項(xiàng)目可以是這樣的

language: node_js
sudo: required
node_js:
  - "lts/*"
cache:
  directories:
    - node_modules
script:
  - ./deploy.sh
branch: master

修改deploy.sh

  • 集成 travis 還需要我們修改 deploy.sh
#!/usr/bin/env sh

# 確保腳本拋出遇到的錯(cuò)誤
set -e

# 生成靜態(tài)文件
npm run docs:build

# 進(jìn)入生成的文件夾
cd docs/.vuepress/dist

# 如果是發(fā)布到自定義域名
# echo 'www.example.com' > CNAME

git init
git add -A
git commit -m 'deploy'

# 如果發(fā)布到 https://<USERNAME>.github.io
# git push -f git@github.com:7revor/7revor.github.io.git master

# 如果發(fā)布到 https://<USERNAME>.github.io/<REPO>
# git push -f git@github.com:<USERNAME>/<REPO>.git master:gh-pages

# 如果使用 travis 持續(xù)集成
git push -f https://${access_token}@github.com/7revor/docs.git master:gh-pages

cd -

Travis CI配置

監(jiān)聽資源庫(kù)

  • 使用github賬號(hào)登錄Travis CI,選擇需要自動(dòng)部署的資源庫(kù)
    vuepress4.png

Access token

  • 首先在githubsetting -> developer setting -> personal access token一欄點(diǎn)擊generate new token, 這下面的選項(xiàng)全選,然后就會(huì)生成一個(gè)token,復(fù)制這個(gè)token。

  • 進(jìn)入travis后臺(tái),在環(huán)境變量Environment Variables里設(shè)置鍵值對(duì)

    vuepress5.png

測(cè)試

將我們的項(xiàng)目push到線上,觀察控制臺(tái)

  • travis已經(jīng)監(jiān)聽到我們資源庫(kù)的變化,開始運(yùn)行虛擬機(jī)
    vuepress6.png
  • 執(zhí)行deploy.sh中的命令
    vuepress7.png
  • 任務(wù)執(zhí)行成功,將build后的文件推送到gh pages分支
    vuepress8.png
  • 面板顯示為passed
vuepress9.png

打開xxx.github.io/docs/已經(jīng)可以正常訪問了。

這樣我們就實(shí)現(xiàn)了master分支存放markdown,gh pages存放編譯后的靜態(tài)文件。

如果有新成員加入,直接將master分支clone到本地,修改后推送到遠(yuǎn)程倉(cāng)庫(kù),travis就會(huì)幫我們自動(dòng)部署。

發(fā)布到服務(wù)器

我們的需求不止要發(fā)布到github Pages,有時(shí)也需要發(fā)布到自己的服務(wù)器。

SSH免密登錄

首先要確保自己可以通過ssh命令免密登錄自己的服務(wù)器,這就需要先生成密鑰對(duì)

ssh-keygen # 生成密鑰對(duì)

輸入上面的指令以后一路回車即可,你會(huì)發(fā)現(xiàn)在用戶根目錄下多了.ssh目錄,進(jìn)去看一下cd ~/.ssh,里面有這3個(gè)文件

pubkey.png

id_rsa.pub里的內(nèi)容,手動(dòng)復(fù)制到服務(wù)器的~/.ssh/authorized_keys(如沒有可自行創(chuàng)建)中去即可

::: tip 提示
還有一種方法是使用ssh-copy-id root@IP命令,Mac用戶可能需要用brew安裝一下ssh-copy-id,ubuntu用戶應(yīng)該是自帶的這個(gè)命令,實(shí)現(xiàn)的效果與上面手動(dòng)的一樣
:::
登錄服務(wù)器的指令如下,如果不需要密碼便進(jìn)入則表示成功

ssh ${username}@${服務(wù)器IP}
login.png

加密

我們要部署到遠(yuǎn)程服務(wù)器,那么勢(shì)必需要讓 Travis 登錄到遠(yuǎn)程服務(wù),那么登錄密碼怎么處理才能保證安全?這是首先要解決的問題,明文肯定是不行的。

Travis命令行工具

使用Travis命令行工具id_rsa.pub加密,同時(shí)將環(huán)境變量傳至Travis

  • 首先通過 Rubygem 安裝 travis
gem install travis

重試了幾次發(fā)現(xiàn)敲完這段shell如同石沉大海一般,就算開了代理還是紋絲不動(dòng),沒辦法只能換鏡像了。

gem update --system
gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/

好了,現(xiàn)在可以愉快的安裝 travis

sudo gem install travis
  • 接下來在命令行中登錄 Travis
travis login

We need your GitHub login to identify you.
This information will not be sent to Travis CI, only to api.github.com.
The password will not be displayed.

Try running with --github-token or --auto if you don't want to enter your password anyway.

Username: xxx@xxx.xxx
Password for xxx@xxx.xxx: ***
Successfully logged in as demo!

會(huì)要求你輸入 GitHub 的賬號(hào)密碼,這個(gè)是走 GitHub 的服務(wù),所以不用擔(dān)心密碼泄露。

  • 將目錄切換到項(xiàng)目根目錄下,執(zhí)行命令
travis encrypt-file ~/.ssh/id_rsa --add

這時(shí)在travis的環(huán)境變量中會(huì)多出兩個(gè)


en.png

去看一下當(dāng)前目錄下的 .travis.yml,會(huì)多出幾行

before_install:
  - openssl aes-256-cbc -K $encrypted_d89376f3278d_key -iv $encrypted_d89376f3278d_iv
  - in id_rsa.enc -out ~\/.ssh/id_rsa -d

::: tip 提示
默認(rèn)生成的命令可能會(huì)在/前面帶轉(zhuǎn)義符\,我們不需要這些轉(zhuǎn)義符,手動(dòng)刪掉所有的轉(zhuǎn)義符,否則可能在后面引發(fā)莫名的錯(cuò)誤
:::
為保證權(quán)限正常,多加一行設(shè)置權(quán)限的 shell

before_install:
  - openssl aes-256-cbc -K $encrypted_6dc88f1910e2_key -iv $encrypted_6dc88f1910e2_iv
  -in id_rsa.enc -out ~/.ssh/id_rsa -d
  - chmod 600 ~/.ssh/id_rsa

還有一點(diǎn)可能會(huì)用上,因?yàn)?travis 第一次登錄遠(yuǎn)程服務(wù)器會(huì)出現(xiàn) SSH 主機(jī)驗(yàn)證,這邊會(huì)有一個(gè)主機(jī)信任問題。官方給出的方案是添加 addons 配置:

addons:
  ssh_known_hosts: your-ip

執(zhí)行部署腳本

既然已經(jīng)可以免密登錄服務(wù)器了,那么寫一個(gè)部署腳本,在登錄時(shí)執(zhí)行該腳本就可以了
.travis.yml 配置文件中寫下這么兩行:

after_success:
  - scp -o StrictHostKeyChecking=no -r docs/.vuepress/dist/* <USER_NAME>@<HOST_IP>:/home/ubuntu/nginx-server/docs

完整的.travis.yml

language: node_js
sudo: required
node_js:
- lts/*
before_install:
 - openssl aes-256-cbc -K $encrypted_6dc88f1910e2_key -iv $encrypted_6dc88f1910e2_iv
 -in id_rsa.enc -out ~/.ssh/id_rsa -d
 - chmod 600 ~/.ssh/id_rsa
addons:
  ssh_known_hosts: your-ip
cache:
  directories:
  - node_modules
script:
- "./deploy.sh"
branch: master

after_success:
- scp -o StrictHostKeyChecking=no -r docs/.vuepress/dist/* <USER_NAME>@<HOST_IP>:/home/ubuntu/nginx-server/docs

部署測(cè)試

提交代碼到遠(yuǎn)程倉(cāng)庫(kù),在Travis查看log,顯示成功上傳

原文地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容