Vue后臺管理系統(tǒng)1

今日目標

1.初始化項目
2.基于Vue技術棧進行項目開發(fā)
3.使用Vue的第三方組件進行項目開發(fā)
4.理解前后端分離開發(fā)模式

1.電商業(yè)務概述

客戶使用的業(yè)務服務:PC端迈倍,小程序契邀,移動web,移動app
管理員使用的業(yè)務服務:PC后臺管理端宙橱。
PC后臺管理端的功能:管理用戶賬號(登錄,退出,用戶管理,權(quán)限管理)涂身,商品管理(商品分類,分類參數(shù)搓蚪,商品信息蛤售,訂單),數(shù)據(jù)統(tǒng)計
電商后臺管理系統(tǒng)采用前后端分離的開發(fā)模式
前端項目是基于Vue的SPA(單頁應用程序)項目

前端技術棧:Vue,Vue-Router,Element-UI,Axios,Echarts
后端技術棧:Node.js,Express,Jwt(模擬session),Mysql,Sequelize(操作數(shù)據(jù)庫的框架)

2.項目初始化

A.安裝Vue腳手架
B.通過腳手架創(chuàng)建項目
C.配置路由
D.配置Element-UI:在插件中安裝妒潭,搜索vue-cli-plugin-element
E.配置Axios:在依賴中安裝,搜索axios(運行依賴)
F.初始化git倉庫
G.將本地項目托管到github或者碼云中

3.碼云相關操作

A.注冊登錄碼云賬號
[圖片上傳失敗...(image-7c31f0-1583123180556)]

B.安裝git
在Windows上使用Git悴能,可以從Git官網(wǎng)直接下載安裝程序進行安裝。
測試命令:git --version

C.點擊網(wǎng)站右上角“登錄”杜耙,登錄碼云搜骡,并進行賬號設置
[圖片上傳失敗...(image-2e6002-1583123180556)]

D.在本地創(chuàng)建公鑰:在終端運行:ssh-keygen -t rsa -C "xxx@xxx.com"
[圖片上傳失敗...(image-3eb510-1583123180556)]
E.找到公鑰地址:
Your identification has been saved in /c/Users/My/.ssh/id_rsa.
Your public key has been saved in /c/Users/My/.ssh/id_rsa.pub.
當我們創(chuàng)建公鑰完畢之后,請注意打印出來的信息“Your public key has been saved in”
/c/Users/My/.ssh/id_rsa.pub : c盤下面的Users下面的My下面的.ssh下面的id_rsa.pub就是我們創(chuàng)建好的公鑰了

E.打開id_rsa.pub文件佑女,復制文件中的所有代碼记靡,點擊碼云中的SSH公鑰,將生成的公鑰復制到公鑰中
[圖片上傳失敗...(image-13378e-1583123180556)]

[圖片上傳失敗...(image-37df20-1583123180556)]
G.測試公鑰:打開終端团驱,輸入命令
ssh -T git@gitee.com
[圖片上傳失敗...(image-1cd936-1583123180556)]

H.將本地代碼托管到碼云中
點擊碼云右上角的+號->新建倉庫
[圖片上傳失敗...(image-bb4fb7-1583123180556)]
[圖片上傳失敗...(image-4b07f7-1583123180556)]

I.進行git配置:
[圖片上傳失敗...(image-c1f164-1583123180556)]
打開項目所在位置的終端摸吠,進行git倉庫關聯(lián)
[圖片上傳失敗...(image-7ca33f-1583123180556)]

4.配置后臺項目

A.安裝phpStudy并導入mysql數(shù)據(jù)庫數(shù)據(jù)
[圖片上傳失敗...(image-39ff19-1583123180556)]

[圖片上傳失敗...(image-d02cc3-1583123180556)]
B.安裝nodeJS,配置后臺項目,從終端打開后臺項目vue_api_server
然后在終端中輸入命令安裝項目依賴包:npm install

C.使用postman測試api接口
[圖片上傳失敗...(image-c75312-1583123180556)]

5.實現(xiàn)登錄功能

A.登錄狀態(tài)保持
如果服務器和客戶端同源嚎花,建議可以使用cookie或者session來保持登錄狀態(tài)
如果客戶端和服務器跨域了寸痢,建議使用token進行維持登錄狀態(tài)。

B.登錄邏輯:
在登錄頁面輸入賬號和密碼進行登錄紊选,將數(shù)據(jù)發(fā)送給服務器
服務器返回登錄的結(jié)果啼止,登錄成功則返回數(shù)據(jù)中帶有token
客戶端得到token并進行保存道逗,后續(xù)的請求都需要將此token發(fā)送給服務器,服務器會驗證token以保證用戶身份献烦。

C.添加新分支login滓窍,在login分支中開發(fā)當前項目vue_shop:
打開vue_shop終端,使用git status確定當前項目狀態(tài)巩那。
確定當前工作目錄是干凈的之后吏夯,創(chuàng)建一個分支進行開發(fā),開發(fā)完畢之后將其合并到master
git checkout -b login
然后查看新創(chuàng)建的分支:git branch
確定我們正在使用login分支進行開發(fā)
[圖片上傳失敗...(image-936f3d-1583123180556)]

然后執(zhí)行vue ui命令打開ui界面即横,然后運行serve噪生,運行app查看當前項目效果
[圖片上傳失敗...(image-653422-1583123180556)]

發(fā)現(xiàn)現(xiàn)在是一個默認頁面,我們需要進行更改东囚,打開項目的src目錄跺嗽,點擊main.js文件(入口文件)

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import './plugins/element.js'

Vue.config.productionTip = false


new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

再打開App.vue(根組件),將根組件的內(nèi)容進行操作梳理(template中留下根節(jié)點舔庶,script中留下默認導出抛蚁,去掉組件,style中去掉所有樣式)

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</template>

<script>
export default {
  name: 'app'
}
</script>

<style>
</style>

再打開router.js(路由)惕橙,將routes數(shù)組中的路由規(guī)則清除瞧甩,然后將views刪除,將components中的helloworld.vue刪除

import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

export default new Router({
  routes: [
    
  ]
})

在components文件夾中新建Login.vue組件,添加template弥鹦,script肚逸,style標簽,style標簽中的scoped可以防止組件之間的樣式?jīng)_突,沒有scoped則樣式是全局的

<template>
    <div class="login_container">
        
    </div>
</template>

<script>
export default {
  
}
</script>

<style lang="less" scoped>
.login_container {
  background-color: #2b5b6b;
  height: 100%;
}

</style>

在router.js中導入組件并設置規(guī)則
在App.vue中添加路由占位符

const router = new Router({
  routes: [
    { path: '/', redirect: '/login' },
    { path: '/login', component: Login }
  ]
})

當我們給Login.vue中的內(nèi)容添加樣式的時候彬坏,會報錯“缺少less-loader”朦促,需要配置less加載器(開發(fā)依賴),安裝less(開發(fā)依賴)
[圖片上傳失敗...(image-58c177-1583123180556)]
然后需要添加公共樣式栓始,在assets文件夾下面添加css文件夾务冕,創(chuàng)建global.css文件,添加全局樣式

/* 全局樣式表 */
html,body,#app{
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0; 
}

在main.js中導入global.css,使得全局樣式生效 import "./assets/css/global.css"
然后Login.vue中的根元素也需要設置撐滿全屏(height:100%)
最終Login.vue文件中的代碼如下

<template>
    <div class="login_container">
        <!-- 登錄盒子  -->
        <div class="login_box">
            <!-- 頭像 -->
            <div class="avatar_box">
                <img src="../assets/logo.png" alt="">
            </div>
            <!-- 登錄表單 -->
            <el-form :model="loginForm" ref="LoginFormRef" :rules="loginFormRules" label-width="0px" class="login_form">
                <!-- 用戶名 -->
                <el-form-item prop="username">
                    <el-input v-model="loginForm.username" prefix-icon="iconfont icon-user" ></el-input>
                </el-form-item> 
                <!-- 密碼 -->
                <el-form-item prop="password">
                    <el-input type="password" v-model="loginForm.password" prefix-icon="iconfont icon-3702mima"></el-input>
                </el-form-item> 
                <!-- 按鈕 -->
                <el-form-item class="btns">
                    <el-button type="primary" @click="login">登錄</el-button>
                    <el-button type="info" @click="resetLoginForm">重置</el-button>
                </el-form-item> 
            </el-form>
        </div>
    </div>
</template>

<script>
export default {
  data() {
    return {
      //數(shù)據(jù)綁定
      loginForm: {
        username: 'admin',
        password: '123456'
      },
      //表單驗證規(guī)則
      loginFormRules: {
        username: [
          { required: true, message: '請輸入登錄名', trigger: 'blur' },
          {
            min: 3,
            max: 10,
            message: '登錄名長度在 3 到 10 個字符',
            trigger: 'blur'
          }
        ],
        password: [
          { required: true, message: '請輸入密碼', trigger: 'blur' },
          {
            min: 6,
            max: 15,
            message: '密碼長度在 6 到 15 個字符',
            trigger: 'blur'
          }
        ]
      }
    }
  },
  //添加行為幻赚,
  methods: {
    //添加表單重置方法
    resetLoginForm() {
      //this=>當前組件對象禀忆,其中的屬性$refs包含了設置的表單ref
      //   console.log(this)
      this.$refs.LoginFormRef.resetFields()
    },
    login() {
      //點擊登錄的時候先調(diào)用validate方法驗證表單內(nèi)容是否有誤
      this.$refs.LoginFormRef.validate(async valid => {
        console.log(this.loginFormRules)
        //如果valid參數(shù)為true則驗證通過
        if (!valid) {
          return
        }

        //發(fā)送請求進行登錄
        const { data: res } = await this.$http.post('login', this.loginForm)
        //   console.log(res);
        if (res.meta.status !== 200) {
          return this.$message.error('登錄失敗:' + res.meta.msg) //console.log("登錄失敗:"+res.meta.msg)
        }

        this.$message.success('登錄成功')
        console.log(res)
        //保存token
        window.sessionStorage.setItem('token', res.data.token)
        // 導航至/home
        this.$router.push('/home')
      })
    }
  }
}
</script>

<style lang="less" scoped>
.login_container {
  background-color: #2b5b6b;
  height: 100%;
}
.login_box {
  width: 450px;
  height: 300px;
  background: #fff;
  border-radius: 3px;
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  .avatar_box {
    height: 130px;
    width: 130px;
    border: 1px solid #eee;
    border-radius: 50%;
    padding: 10px;
    box-shadow: 0 0 10px #ddd;
    position: absolute;
    left: 50%;
    transform: translate(-50%, -50%);
    background-color: #fff;
    img {
      width: 100%;
      height: 100%;
      border-radius: 50%;
      background-color: #eee;
    }
  }
}
.login_form {
  position: absolute;
  bottom: 0;
  width: 100%;
  padding: 0 20px;
  box-sizing: border-box;
}
.btns {
  display: flex;
  justify-content: flex-end;
}
</style>

其中我們有用到一下內(nèi)容,需要進行進一步處理:

A.添加element-ui的表單組件
在plugins文件夾中打開element.js文件落恼,進行elementui的按需導入
import Vue from 'vue'
import { Button } from 'element-ui'
import { Form, FormItem } from 'element-ui'
import { Input } from 'element-ui'

Vue.use(Button)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)

B.添加第三方字體
復制素材中的fonts文件夾到assets中,在入口文件main.js中導入import './assets/fonts/iconfont.css'
然后直接在 <el-input prefix-icon="iconfont icon-3702mima"></el-input>
接著添加登錄盒子

C.添加表單驗證的步驟
1).給<el-form>添加屬性:rules="rules"箩退,rules是一堆驗證規(guī)則,定義在script佳谦、中
2).在script中添加rules:export default{ data(){return{......, rules: {
name: [
{ required: true, message: '請輸入活動名稱', trigger: 'blur' },
{ min: 3, max: 5, message: '長度在 3 到 5 個字符', trigger: 'blur' }
],
region: [
{ required: true, message: '請選擇活動區(qū)域', trigger: 'change' }
]
}......
3).通過<el-form-item>的prop屬性設置驗證規(guī)則<el-form-item label="活動名稱" prop="name">

4.導入axios以發(fā)送ajax請求
打開main.js戴涝,import axios from 'axios';
設置請求的根路徑:axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1/';
掛載axios:Vue.prototype.$http = axios;

5.配置彈窗提示:
在plugins文件夾中打開element.js文件,進行elementui的按需導入
import {Message} from 'element-ui'
進行全局掛載:Vue.prototype.message = Message; 在login.vue組件中編寫彈窗代碼:this.message.error('登錄失敗')

6.登錄成功之后的操作

A.登錄成功之后,需要將后臺返回的token保存到sessionStorage中
操作完畢之后啥刻,需要跳轉(zhuǎn)到/home

login() {
      //點擊登錄的時候先調(diào)用validate方法驗證表單內(nèi)容是否有誤
      this.$refs.LoginFormRef.validate(async valid => {
        console.log(this.loginFormRules)
        //如果valid參數(shù)為true則驗證通過
        if (!valid) {
          return
        }

        //發(fā)送請求進行登錄
        const { data: res } = await this.$http.post('login', this.loginForm)
        //   console.log(res);
        if (res.meta.status !== 200) {
          return this.$message.error('登錄失敗:' + res.meta.msg) //console.log("登錄失敗:"+res.meta.msg)
        }

        this.$message.success('登錄成功')
        console.log(res)
        //保存token
        window.sessionStorage.setItem('token', res.data.token)
        // 導航至/home
        this.$router.push('/home')
      })
    }

添加一個組件Home.vue奸鸯,并為之添加規(guī)則

<template>
    <div>
        this is home
        <el-button type="info" @click="logout"> 退出 </el-button>
    </div>
</template>

<script>
export default {
  methods: {
    logout() {
      window.sessionStorage.clear()
      this.$router.push('/login')
    }
  }
}
</script>

<style lang='less' scoped>
</style>

添加路由規(guī)則

const router = new Router({
  routes: [
    { path: '/', redirect: '/login' },
    { path: '/login', component: Login },
    { path: '/home', component: Home }
  ]
})

添加路由守衛(wèi)
如果用戶沒有登錄,不能訪問/home,如果用戶通過url地址直接訪問郑什,則強制跳轉(zhuǎn)到登錄頁面
打開router.js

import Vue from 'vue'
import Router from 'vue-router'
import Login from './components/Login.vue'
import Home from './components/Home.vue'

Vue.use(Router)

const router = new Router({
  routes: [
    { path:'/', redirect:'/login'},
    { path:'/login' , component:Login },
    { path:'/home' , component:Home}
  ]
})

//掛載路由導航守衛(wèi),to表示將要訪問的路徑府喳,from表示從哪里來,next是下一個要做的操作
router.beforeEach((to,from,next)=>{ 
  if(to.path === '/login')
    return next();
  
  //獲取token
  const tokenStr = window.sessionStorage.getItem('token');

  if(!tokenStr)
    return next('/login');

  next();

})

export default router 

實現(xiàn)退出功能
在Home組件中添加一個退出功能按鈕,給退出按鈕添加點擊事件蘑拯,添加事件處理代碼如下:

export default {
    methods:{
        logout(){
            window.sessionStorage.clear();
            this.$router.push('/login');
        }
    }
}

補充

A.處理ESLint警告
打開腳手架面板,查看警告信息
[圖片]
默認情況下兜粘,ESLint和vscode格式化工具有沖突申窘,需要添加配置文件解決沖突。
在項目根目錄添加 .prettierrc 文件

{
    "semi":false,
    "singleQuote":true
}

打開.eslintrc.js文件孔轴,禁用對 space-before-function-paren 的檢查:

  rules: {
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'space-before-function-paren' : 0
  },

B.合并按需導入的element-ui

import Vue from 'vue'
import { Button, Form, FormItem, Input, Message } from 'element-ui'

Vue.use(Button)
Vue.use(Form)
Vue.use(FormItem)
Vue.use(Input)
// 進行全局掛載:
Vue.prototype.$message = Message

C.將代碼提交到碼云
新建一個項目終端,輸入命令‘git status’查看修改過的與新增的文件內(nèi)容
將所有文件添加到暫存區(qū):git add .
將所有代碼提交到本地倉庫:git commit -m "添加登錄功能以及/home的基本結(jié)構(gòu)"
查看分支: git branch 發(fā)現(xiàn)所有代碼都被提交到了login分支
將login分支代碼合并到master主分支剃法,先切換到master:git checkout master
在master分支進行代碼合并:git merge login
將本地的master推送到遠端的碼云:git push

推送本地的子分支到碼云,先切換到子分支:git checkout 分支名
然后推送到碼云:git push -u origin 遠端分支名

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末路鹰,一起剝皮案震驚了整個濱河市贷洲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晋柱,老刑警劉巖优构,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雁竞,居然都是意外死亡钦椭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門碑诉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彪腔,“玉大人,你說我怎么就攤上這事进栽〉抡酰” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵快毛,是天一觀的道長格嗅。 經(jīng)常有香客問我,道長祸泪,這世上最難降的妖魔是什么吗浩? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮没隘,結(jié)果婚禮上懂扼,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好阀湿,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布赶熟。 她就那樣靜靜地躺著,像睡著了一般陷嘴。 火紅的嫁衣襯著肌膚如雪映砖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天灾挨,我揣著相機與錄音邑退,去河邊找鬼。 笑死劳澄,一個胖子當著我的面吹牛地技,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播秒拔,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼莫矗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了砂缩?” 一聲冷哼從身側(cè)響起作谚,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庵芭,沒想到半個月后妹懒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡喳挑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年彬伦,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伊诵。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡单绑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出曹宴,到底是詐尸還是另有隱情搂橙,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布笛坦,位于F島的核電站区转,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏版扩。R本人自食惡果不足惜废离,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望礁芦。 院中可真熱鬧蜻韭,春花似錦悼尾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俯画,卻和暖如春析桥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背艰垂。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工泡仗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人材泄。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓沮焕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拉宗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 基于Vue的一些資料 內(nèi)容 UI組件 開發(fā)框架 實用庫 服務端 輔助工具 應用實例 Demo示例 element★...
    嘗了又嘗閱讀 1,140評論 0 1
  • 33辣辫、JS中的本地存儲 把一些信息存儲在當前瀏覽器指定域下的某一個地方(存儲到物理硬盤中)1旦事、不能跨瀏覽器傳輸:在...
    萌妹撒閱讀 2,071評論 0 2
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    小姜先森o0O閱讀 9,395評論 0 72
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    流觴小菜鳥閱讀 1,745評論 2 8
  • 周二,小雨急灭,倍感寂寞姐浮。 貼一段美國往事的臺詞: my beloved is white and rubby. hi...
    蘑菇菌閱讀 220評論 0 2