1. 程式人生 > >基於vue2 + vue-router + vuex 構建的一個新聞類大型單頁面應用 —— 今日頭條

基於vue2 + vue-router + vuex 構建的一個新聞類大型單頁面應用 —— 今日頭條

vue2-news

image image image image image

前言

該專案UI模仿今日頭條,但我儘可能地做了許多修改,我不是做UI設計的,如何還看得過去,右上角點個 “star” 支援一下吧��

該專案包括移動端和native端,移動端共4個頁面,native端共20個頁面,涉及文章的分類、展示、閱讀、推薦、搜尋和使用者的登入、評論、收藏以及後臺文章編輯等等,是一個完整的生態鏈。其複雜度不用說大家也能感受到。如果這個專案能駕馭的了,你的Vue使用能力已經達到一定水平了,相信大部分公司的單頁面應用也就不在話下。

技術棧

vue2、vuex3、vue-router3、vue-awesome-swiper、vue-quill-editor

axios、mint-ui、flexible.js、IconFont

ES6/7、Stylus、ESlint、webpack3、

說明

如果對您有幫助,您可以點右上角 “Star”一下, 您的支援是我最大的動力!非常感謝!^_^ ��

或者您可以 “follow” 一下,我會不斷開源更多的有趣實用的專案

開發環境 macOS 10.12.6、Chrome 61、 nodejs 8.4.0

如有問題請直接在 Issues 中提,或者您發現問題並有非常好的解決方案,歡迎 PR ��

該專案是此開源系列的其中一個階段,更多內容檢視下方的最終目標

最終目標

注:此係列只關注前端專案的實現,後端等知識不是此係列的範圍,但會告知一二。

注意

1、請把專案裡的mint-ui.common.js檔案替換掉 node_modules/minit-ui/lib/mint-ui.common.js檔案。主要優化下拉動作和左右滑動的體驗。詳細檢視文章

餓了麼mint-ui庫loadmore元件的下拉問題

2、該專案使用vue-router的hash模式,專案裡寫了許多用來記錄頁面滾動條位置的程式碼,有點不優雅,其最終原因都是為了能實現首頁下拉和左右滑動切換欄目的功能。如需history模式的例項。請參考第一階段和第三階段的專案vue2-echo、vue2-health

3、native端某些程式碼在瀏覽器裡是不能生效的,這些是用於手機app的,如:獲取裝置uuid、微信客戶端登入等。技術是利用cordova打包成app和使用cordova的一些外掛。具體請檢視cordova官網

4、如果執行專案是灰屏,那可能是打開了app.vue檔案beforeRouteEnter鉤子的程式碼。這個主要是用於app需要保證載入完cordova外掛才能進入專案。瀏覽器開啟這段程式碼是進不到專案的。

5、關於後臺文章管理,操作的都是真實後臺資料,雖然沒什麼價值,但為了大家都能檢視一個很真的資料資訊,請勿隨意搗亂原有的資料哈,可以新建任務去操作檢視效果,謝謝啦。

效果演示

安裝包請戳這裡(目前只支援 Android)

功能

共同功能

  • [x] 下拉上滑請求資料
  • [x] 左右滑動切換欄目
  • [x] 點選頭部回到頁面頂部(指令)
  • [x] 右滑返回上一頁(指令)
  • [x] 視訊播放的載入、重播指示以及懸浮等功能
  • [x] 熱點文章和搜尋推薦(後臺演算法)
  • [x] 文章標籤(後臺演算法)
  • [x] 分享功能(移動端分享網址,native端微信分享)
  • [x] 搜尋功能

移動端

  • [x] 重新整理保持頁面的資料和狀態
  • [x] 展開全文
  • [x] 下載頁(目前只支援下載Android包)

native端

  • [x] 增減欄目
  • [x] 瀏覽歷史
  • [x] 微信客戶端登入
  • [x] 點贊、收藏、評論
  • [x] 刪除瀏覽歷史、收藏、評論
  • [x] 持久儲存使用者的登入狀態、瀏覽歷史、收藏等資料
  • [x] 後臺文章管理(發表、修改、刪除、撤回、預覽等功能)
  • [x] 啟動廣告頁
  • [x] 熱更新、版本更新
  • [x] GPS定位
  • [ ] 訊息推送(極光推送:沒調通,不弄了。。。)

部分截圖

移動端

  • 首頁、詳情頁

  • 搜尋頁

  • GIF

native端:

  • 首頁、詳情頁

  • 頻道頁、使用者頁

  • 後臺文章管理頁、廣告頁

  • GIF

目錄結構

總目錄

├── news-app                                     // native端專案  
├── news-web                                     // 移動端專案
├── screenshots                                  // 專案截圖
├── mint-ui.common.js                            // 修改之後的mint-ui原始碼檔案
├── README.md                                    // 專案介紹

移動端目錄

├── build                                        // 構建相關  
├── config                                       // 配置相關
├── src                                          // 專案程式碼
│   ├── assets                                   // 樣式、圖示等靜態資源
│   ├── components                               // 全域性公用元件
│   │   ├── banner.vue                           // banner元件
│   │   ├── commentItem.vue                      // 評論Item元件
│   │   ├── error.vue                            // 錯誤提示元件
│   │   ├── info.vue                             // listItem的列表資訊元件
│   │   ├── listItem.vue                         // 文章List元件
│   │   ├── loading.vue                          // 載入提示元件
│   │   ├── myHeader.vue                         // 頭部元件
│   │   ├── popuMenu.vue                         // 模態框元件
│   ├── config                                   // 全域性公用方法
│   │   ├── cache.js                             // 快取方法
│   │   ├── directive.js                         // 指令方法
│   │   ├── fetch.js                             // 請求方法
│   ├── page
│   │   ├── detail
│   │   |   ├── components
│   │   |   |   ├── article.vue                  // 文章元件
│   │   |   |   ├── recommend.vue                // 推薦元件
│   │   |   |   ├── share.vue                    // 分享元件
│   │   |   |   ├── tags.vue                     // 標籤元件
│   │   |   ├── detail.vue                       // 詳情頁
│   │   ├── index
│   │   |   ├── children
│   │   |   |   ├── channel.vue                  // 欄目頁
│   │   |   ├── components
│   │   |   |   ├── index_footer.vue             // 首頁底部元件
│   │   |   |   ├── index_header.vue             // 首頁頭部元件
│   │   |   |   ├── pullContainer.vue            // 下拉容器元件
│   │   |   |   ├── swiperContainer.vue          // 滑動容器元件
│   │   |   ├── index.vue                        // 首頁
│   │   ├── search
│   │   |   ├── search.vue                       // 搜尋頁
│   ├── router
│   │   ├── index.js                             // 路由配置       
│   ├── store
│   │   ├── detail
│   │   |   ├── index.js                         // 詳情頁store
│   │   ├── index
│   │   |   ├── index.js                         // 首頁store
│   │   ├── search
│   │   |   ├── index.js                         // 搜尋頁store
│   │   ├── index.js                             // 全域性store
│   ├── App.vue                                  // 頁面入口
│   └── main.js                                  // 程式入口
├── static                                       // 空資料夾,只作為github保留
├── .babelrc                                     // babel-loader 配置
├── .eslintrc.js                                 // eslint 配置項
├── .gitignore                                   // git 忽略項
├── index.html                                   // 入口html檔案
└── package.json                                 // package.json

native端目錄

├── build                                        // 構建相關  
├── config                                       // 配置相關
├── src                                          // 專案程式碼
│   ├── assets                                   // 樣式、圖示等靜態資源
│   ├── components                               // 全域性公用元件
│   │   ├── banner.vue                           // banner元件
│   │   ├── commentItem.vue                      // 評論Item元件
│   │   ├── error.vue                            // 錯誤提示元件
│   │   ├── info.vue                             // listItem的列表資訊元件
│   │   ├── listItem.vue                         // 文章List元件
│   │   ├── loading.vue                          // 載入提示元件
│   │   ├── myHeader.vue                         // 頭部元件
│   │   ├── popuMenu.vue                         // 模態框元件
│   │   ├── publishItem.vue                      // 後臺文章列表元件
│   │   ├── tool.vue                             // 評論工具欄元件
│   ├── config                                   // 全域性公用方法
│   │   ├── autoTextarea.js                      // textarea自動增加高度方法
│   │   ├── cache.js                             // 快取方法
│   │   ├── cordova.js                           // cordova外掛方法
│   │   ├── directive.js                         // 指令方法
│   │   ├── fetch.js                             // 請求方法
│   ├── page
│   │   ├── detail
│   │   |   ├── children
│   │   |   |   ├── comment.vue                  // 評論頁
│   │   |   |   ├── reply.vue                    // 回覆頁
│   │   |   ├── components
│   │   |   |   ├── article.vue                  // 文章元件
│   │   |   |   ├── collect.vue                  // 收藏元件
│   │   |   |   ├── like.vue                     // 點贊元件
│   │   |   |   ├── recommend.vue                // 推薦元件
│   │   |   |   ├── share.vue                    // 分享元件
│   │   |   |   ├── tags.vue                     // 標籤元件
│   │   |   ├── detail.vue                       // 詳情頁
│   │   ├── index
│   │   |   ├── collect
│   │   |   |   ├── collect.vue                  // 收藏頁
│   │   |   ├── home
│   │   |   |   ├── children
│   │   |   |   |   ├── channel.vue              // 欄目頁
│   │   |   |   ├── components
│   │   |   |   |   ├── homeHeader.vue           // 首頁頭部元件
│   │   |   |   |   ├── pullContainer.vue        // 下拉容器元件
│   │   |   |   |   ├── swiperContainer.vue      // 滑動容器元件
│   │   |   |   ├── home.vue                     // 主頁
│   │   |   ├── user
│   │   |   |   ├── children
│   │   |   |   |   ├── health
│   │   |   |   |   |   ├── health.vue           // 文章管理頁
│   │   |   |   |   |   ├── preview.vue          // 文章預覽頁
│   │   |   |   |   |   ├── publish.vue          // 文章編輯頁
│   │   |   |   |   ├── feedBack.vue             // 使用者反饋頁
│   │   |   |   |   ├── myComment.vue            // 我的評論頁
│   │   |   |   |   ├── myHistory.vue            // 我的歷史頁
│   │   |   |   |   ├── QRcode.vue               // 應用分享頁
│   │   |   |   ├── user.vue                     // 使用者頁
│   │   |   ├── video
│   │   |   |   ├── video.vue                    // 視訊頁
│   │   |   ├── index.vue                        // 首頁
│   │   |   ├── navBar.vue                       // 底部導航元件
│   │   ├── login
│   │   |   ├── login.vue                        // 登入頁
│   │   ├── search
│   │   |   ├── search.vue                       // 搜尋頁
│   ├── router
│   │   ├── index.js                             // 路由配置       
│   ├── store
│   │   ├── collect                              // 收藏頁store
│   │   ├── detail                               // 詳情頁store
│   │   ├── health                               // 文章管理store
│   │   ├── index                                // 首頁store
│   │   ├── login                                // 登入store
│   │   ├── search                               // 搜尋頁store
│   │   ├── user                                 // 使用者store
│   │   ├── video                                // 視訊頁store
│   │   ├── index.js                             // 全域性store
│   ├── App.vue                                  // 頁面入口
│   └── main.js                                  // 程式入口
├── static                                       // 空資料夾,只作為github保留
├── .babelrc                                     // babel-loader 配置
├── .eslintrc.js                                 // eslint 配置項
├── .gitignore                                   // git 忽略項
├── index.html                                   // 入口html檔案
└── package.json                                 // package.json

安裝執行

# install dependencies
npm install

# serve with hot reload at localhost:8088
npm run dev

# build for production with minification
npm run build

交流

歡迎熱愛學習、忠於分享的朋友一起來交流
- QQ:771674109
- WX:L771674109
- Vue交流群:338241465

License

MIT

Copyright (c) 2017-present,uncleLian