Node.js
對前端來講無疑具備里程碑意義,與其愈來愈流行的今天,掌握Node.js技術已經不只僅是加分項,而是前端攻城師們必需要掌握的一項技能。而Express基於Node.js平臺,快速、開放、極簡的Web開發框架,成爲Node.js最流行的框架,因此使用Express進行web服務端的開發是個不錯且可信賴的選擇。可是Express初始化後,並不立刻就是一個開箱即用,各類功能完善的web服務端項目,例如:MySQL鏈接、jwt-token認證、md5加密、中間件路由模塊、異常錯誤處理、跨域配置、自動重啓等一系列常見的功能,須要開發者本身手動配置安裝插件和工具來完善功能,若是你對web服務端開發或者Express框架不熟悉,那將是一項耗費巨大資源的工做。javascript
本文做者根據項目實戰經驗已將底層服務架構搭建完成,而且本項目已在github開源,供你們學習參考使用(若有不足,還請批評指正),但願能減輕你們的工做量,更高效的完成工做,有更多時間提高本身的能力。🤭css
後端API接口源碼地址👉:github.com/jackchen012…html
前端界面源碼地址👉:github.com/jackchen012…前端
若是以爲本文還不錯,記得點個👍贊或者給個❤️star,大家的贊和star是做者編寫更多更精彩文章的動力!vue
分享以前咱們先來認識一下Node.js、Express
都是什麼東東。java
簡單的說Node.js就是運行在服務端的 JavaScript。node
Node.js是一個基於Chrome JavaScript運行時創建的一個平臺。mysql
Node.js是一個事件驅動I/O服務端JavaScript環境,基於Google的V8引擎,V8引擎執行Javascript的速度很是快,性能很是好。linux
Express 是一個簡潔而靈活的Node.js Web應用框架,提供了一系列強大特性幫助你建立各類Web應用,和豐富的HTTP工具。使用Express能夠快速地搭建一個完整功能的網站。webpack
Express框架核心特性:
前端項目採用的技術棧是基於Vue + iView
,用vue-cli構建前端界面,後端項目採用的技術棧是基於Node.js + Express + MySQL
,用Express搭建的後端服務器。
在線演示DEMO地址👉:http://106.55.168.13:8082/
開發前準備工做,相關運行環境配置以下:
工具名稱 | 版本號 |
---|---|
node.js | 10.16.2 |
npm | 6.9.0 |
運行項目
1> 下載安裝依賴
git clone https://github.com/jackchen0120/todo-vue-admin.git
cd todo-vue-admin
npm install 或 yarn
2> 開發模式
npm run serve
運行以後,訪問地址:http://localhost:8082
3> 生產環境打包
npm run build
│ package.json // npm包管理所需模塊及配置信息 │ vue.config.js // webpack配置 ├─public │ favicon.ico // 圖標 │ index.html // 入口html文件 └─src │ App.vue // 根組件 │ main.js // 程序入口文件 ├─assets // 存放公共圖片文件夾 ├─components │ Footer.vue // 頁面底部公用組件 │ Header.vue // 頁面頭部公用組件 ├─router │ index.js // 單頁面路由註冊組件 ├─store │ │ index.js // 狀態管理倉庫入口文件 │ └─modules │ userInfo.js // 用戶模塊狀態管理文件 ├─styles │ base.scss // 基礎樣式文件 ├─utils │ api.js // 統一封裝API接口調用方法 │ network.js // axios封裝與攔截器配置 │ url.js // 自動部署服務器環境 │ valid.js // 統一封裝公用模塊方法 └─views Home.vue // 首頁界面 Login.vue // 登陸界面 複製代碼
npm install -g @vue/cli
#安裝指定版本
npm install -g @vue/cli@4.4.0
#OR
yarn global add @vue/cli
vue create todo-vue-admin
cd todo-vue-admin
npm run serve
在項目根目錄新增vue.config.js
文件,配置信息如圖所示:
按照上面的步驟完成腳手架搭建後,把須要的axios、vue-router、view-design、sass-loader、node-sass等依賴庫安裝配置好,準備開始上膛。
首先在views文件夾下面新建login.vue
組件,編寫一個靜態的登陸註冊頁面。登陸成功後將登陸返回的token保存到瀏覽器端並跳轉到主頁。views文件夾下面新建home.vue
組件,顯示登陸成功後的頁面,並獲取用戶基本信息,主頁右上角顯示用戶頭像、修改密碼、退出登陸等功能。代碼以下:
<template>
<div class="login-container"> <div class="pageHeader"> <img src="../assets/logo.png" alt="logo"> <span>TODOList區塊鏈管理平臺</span> </div> <div class="login-box"> <div class="login-text" v-if="typeView != 2"> <a href="javascript:;" :class="typeView == 0 ? 'active' : ''" @click="handleTab(0)">登陸</a> <b>·</b> <a href="javascript:;" :class="typeView == 1 ? 'active' : ''" @click="handleTab(1)">註冊</a> </div> <!-- 登陸模塊 --> <div class="right-content" v-show="typeView == 0"> <div class="input-box"> <input autocomplete="off" type="text" class="input" v-model="formLogin.userName" placeholder="請輸入登陸郵箱/手機號" /> <input autocomplete="off" type="password" class="input" v-model="formLogin.userPwd" maxlength="20" @keyup.enter="login" placeholder="請輸入登陸密碼" /> </div> <Button class="loginBtn" type="primary" :disabled="isDisabled" :loading="isLoading" @click.stop="login"> 當即登陸 </Button> <div class="option"> <Checkbox class="remember" v-model="checked" @on-change="checkChange"> <span class="checked">記住我</span> </Checkbox> <span class="forget-pwd" @click.stop="forgetPwd">忘記密碼?</span> </div> </div> <!-- 註冊模塊 --> <div class="right_content" v-show="typeView == 1"> <div class="input-box"> <input autocomplete="off" type="text" class="input" v-model="formRegister.userName" placeholder="請輸入註冊郵箱/手機號" /> <input autocomplete="off" type="password" class="input" v-model="formRegister.userPwd" maxlength="20" @keyup.enter="register" placeholder="請輸入密碼" /> <input autocomplete="off" type="password" class="input" v-model="formRegister.userPwd2" maxlength="20" @keyup.enter="register" placeholder="請再次確認密碼" /> </div> <Button class="loginBtn" type="primary" :disabled="isRegAble" :loading="isLoading" @click.stop="register"> 當即註冊 </Button> </div> </div> </div> </template> <style lang="scss" scoped> .login-container { background-image: url('../assets/bg.png'); background-position: center; background-size: cover; position: relative; width: 100%; height: 100%; .pageHeader { padding-top: 30px; padding-left: 40px; img { vertical-align: middle; display: inline-block; margin-right: 15px; } span { font-size: 18px; display: inline-block; vertical-align: -4px; color: rgba(255, 255, 255, 1); } } .login-box { position: absolute; left: 64vw; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); box-sizing: border-box; text-align: center; box-shadow: 0 1px 11px rgba(0, 0, 0, 0.3); border-radius: 2px; width: 420px; background: #fff; padding: 45px 35px; .option { text-align: left; margin-top: 18px; .checked { padding-left: 5px; } .forget-pwd, .goback { float: right; font-size: 14px; font-weight: 400; color: #4981f2; line-height: 20px; cursor: pointer; } .protocol { color: #4981f2; cursor: pointer; } } .login-text { width: 100%; text-align: center; padding: 0 0 30px; font-size: 24px; letter-spacing: 1px; a { padding: 10px; color: #969696; &.active { font-weight: 600; color: rgba(73, 129, 242, 1); border-bottom: 2px solid rgba(73, 129, 242, 1); } &:hover { border-bottom: 2px solid rgba(73, 129, 242, 1); } } b { padding: 10px; } } .title { font-weight: 600; padding: 0 0 30px; font-size: 24px; letter-spacing: 1px; color: rgba(73, 129, 242, 1); } .input-box { .input { &:nth-child(1) { /*margin-top: 10px;*/ } &:nth-child(2), &:nth-child(3) { margin-top: 20px; } } } .loginBtn { width: 100%; height: 45px; margin-top: 40px; font-size: 15px; } .input { padding: 10px 0px; font-size: 15px; width: 350px; color: #2c2e33; outline: none; // 去除選中狀態邊框 border: 1px solid #fff; border-bottom-color: #e7e7e7; background-color: rgba(0, 0, 0, 0); // 透明背景 } input:focus { border-bottom-color: #0f52e0; outline: none; } .button { line-height: 45px; cursor: pointer; margin-top: 50px; border: none; outline: none; height: 45px; width: 350px; background: rgba(216, 216, 216, 1); border-radius: 2px; color: white; font-size: 15px; } } // 滾動條樣式 ::-webkit-scrollbar { width: 10px; } ::-webkit-scrollbar-track { -webkit-box-shadow: inset006pxrgba(0, 0, 0, 0.3); border-radius: 8px; } ::-webkit-scrollbar-thumb { border-radius: 10px; background: rgba(0, 0, 0, 0.2); -webkit-box-shadow: inset006pxrgba(0, 0, 0, 0.5); } ::-webkit-scrollbar-thumb:window-inactive { background: rgba(0, 0, 0, 0.4); } //設置更改input 默認顏色 ::-webkit-input-placeholder { /* WebKit browsers */