前端后臺管理系統梳理

再梳理一遍
在這里插入圖片描述

一、商品后臺管理系統

1. 功能

1.1 服務端情況

  • 開啟了CORS跨域支持
  • 需要授權的 API ,必須在請求頭中使用 Authorization 字段提供token 令牌(axios攔截器)
  • baseUrl,接口地址:http://localhost:8888/api/private/v1/

token令牌在服務端生成,當登錄成功時,post請求返回的用戶信息里包含了這一元素:
在這里插入圖片描述

1.1.1 axios發ajax請求

Axios:通過promise實現對ajax技術的一種封裝,ajax只能訪問同源的請求。axios并沒有install 方法,所以是不能使用vue.use()方法的。為了不在每個文件都引用一次axios,將它改造成vue插件。

  1. npm安裝
  2. axios發請求

1)使用

axios.get('/user?ID=12345').then(function (response) {console.log(response);}).catch(function (error) {console.log(error);});

2) 改造為vue插件
plugins/http.js

import axios from 'axios'
?
const httpHelper = {}
// 配置Vue插件
httpHelper.install = function fn (Vue) {axios.defaults.baseURL = 'http://127.0.0.1:8888/api/private/v1'Vue.prototype.$http = axios
}
?
export default httpHelper

main.js里安裝插件

 import http from '@/plugins/http.js'
Vue.use(http)

1.1.2 攔截器 – 向服務端發請求需要token

httpAxios.install = function (Vue) {const instance = axios.create({baseURL: 'http://127.0.0.1:8888/api/private/v1'})
?instance.interceptors.request.use(function (config) {if (config.url.toLowerCase() !== 'login') {const token = sessionStorage.getItem('token')config.headers.Authorization = token}return config}, function (error) {return Promise.reject(error)})Vue.prototype.$http = instance
}

1.1.3 路由導航守衛 – 權限控制

路由的前置守衛 router.js

router.beforeEach((to, from, next) => {console.log(to, from)if (to.name === 'login') {next()} else {const token = sessionStorage.getItem('token')if (!token) {router.push({ 'name': 'login' })Message.warning('請先登錄')return}next()}
})

1.1.4 使用async和await

handleLogin () {this.$http.post('login', this.formData).then((res) => {const data = res.dataconst {meta: {status, msg}} = dataif (status === 200) {const token = data.data.tokensessionStorage.setItem('token', token)this.$message.success(msg)} else {this.$message.error(msg)}})
}
async handleLogin () {const res = await this.$http.post('login', this.formData)const data = res.dataconst { meta: { status, msg } } = dataif (status === 200) {const token = data.data.tokensessionStorage.setItem('token', token)this.$message.success(msg)} else {this.$message.error(msg)}
}

外層方法使用async關鍵字(await最近的外層函數要加上async),發請求代碼前加 await,省略.then
在這里插入圖片描述

1.2 自定義組件

以自定義面包屑組件(子組件)為例,父組件(使用到面包屑的組件)向子組件傳值。
子組件

<template><!-- 面包屑 --><el-breadcrumb separator="/"><el-breadcrumb-item :to="{ path: '/' }">首頁</el-breadcrumb-item><el-breadcrumb-item>{{this.level1}}</el-breadcrumb-item><el-breadcrumb-item>{{this.level2}}</el-breadcrumb-item></el-breadcrumb>
</template>
?
<script>
export default {name: 'my-bread',props: ['level1', 'level2']
}
</script>

父組件

<my-bread level1='權限管理' level2='角色列表'></my-bread>

1.3 登錄

  • 組件el-form 表單
  • :rules=“rules” 表單驗證,show-password
  • 登錄按鈕的點擊事件:
    1)表單驗證是否通過
    2)通過設置token,跳轉到主頁
  • 頭像:css設置水平居中
  • 全局監聽enter鍵(把監聽事件綁定到document上),當(that.$route.path === ‘/login’) && (e.keyCode === 13),觸發登錄方法

1.4 主頁

  • 布局
  • 頭部+左側導航菜單+主體

1.4.1 頭部,退出

  • 刪除token sessionStorage.clear()
  • 跳轉到登錄頁 this.$router.push({name: 'login'})

1.4.2 左側菜單 – 權限控制

  • el-aside -> el-menu
  • :router 開啟路由模式,設置el-menu-item的index值 為路由標識
  • 動態渲染:不同身份登錄,權限控制

一級菜單和子菜單之間是并列關系,在知道有幾級菜單的情況下,思考:如果不知道有幾級菜單

<el-menu :unique-opened=true :router=true><el-submenu :index="item1.order.toString()" v-for="(item1,i) in menus" :key="item1.id"><template slot="title"><i :class="iconlist[i]"></i><span>{{item1.authName}}</span></template><el-menu-item :index="item2.path" v-for="item2 in item1.children" :key="item2.id"><i class="el-icon-menu"></i><span>{{item2.authName}}</span></el-menu-item></el-submenu>
</el-menu>

1.5 系統功能

1.5.1 用戶管理 - 用戶列表 - 增刪改查

  • 展示:現有用戶數量 GET
  • 增加:用戶名、密碼、郵箱、手機,新增后重新加載頁面 POST
  • 刪除:刪除后重新加載頁面 PUT
  • 修改:DELETE
    1)改基本信息:手機、郵箱
    2)改角色:關系到權限
  • 組件
    面包屑、搜索框、表格、分頁組件、switch狀態轉換
1.5.1.1 顯示、搜索的處理

顯示
在created的時候,調用this.getUserList(),拿到res的數據,賦值給data里的userlist

const res = await this.$http.get(`users?query=${this.query}&pagenum=${this.pagenum}&pagesize=${this.pagesize}`)

搜索

<el-input @clear="getUserList"  v-model="query" clearable @keyup.enter.native="getUserList">

鍵盤抬起時/輸入框清空時,依然是觸發getUserList,該方法內部通過雙向數據綁定的query進行傳參查詢,接口文檔中,query參數可以為空,為空時顯示全量信息。

1.5.1.2 slot-scope=“scope” 參數傳遞
 
<el-table-column label="用戶狀態"><template slot-scope="scope"><!-- scope.row就是當前綁定的數據對象 --><el-switch @change="handleSwitchChange(scope.row)" v-model="scope.row.mg_state" active-color="#13ce66"inactive-color="#ff4949"></el-switch></template>
</el-table-column>
1.5.1.3 添加完成,清空文本框
for (const key in this.formData) {this.formData[key] = ''
}
1.5.1.4 編輯用戶,顯示已有信息

編輯按鈕所在行,通過slot-scope="scope"將被編輯用戶信息傳給方法editUser,通過初始化form(顯示用戶信息的el-form所綁定的內容)展示

editUser(user) {this.dialogFormVisibleEdit = truethis.form = user
}
<el-dialog title="編輯用戶" :visible.sync="dialogFormVisibleEdit"><el-form :model="form"><el-form-item label="用戶名" ><el-input v-model="form.username" disabled></el-input></el-form-item></el-form>
</el-dialog>
1.5.1.5 下拉框-顯示當前用戶角色
  1. select標簽有多個option,有selected屬性的option,會默認選中
  2. 被選中的option的value值就是select的value值,當選擇了其他角色時,select的value值也會隨之改變 => 獲取當前編輯用戶的角色id,雙向綁定給select的value,既處理了顯示,又處理了角色分配。
    在這里插入圖片描述

1.5.2 權限管理 - 權限列表、角色列表

1.5.2.1 權限列表

一到三級權限的名詞展示,可以作為后臺的文檔數據,不必作為一項功能

1.5.2.2 角色列表
  • 添加角色(簡單提交)
  • 編輯、刪除(簡單slot-scope傳參、delete請求)
  • 分配角色(tag)
  • 權限展示(表格展開行)
【難點1】 三級權限展示,樹形結構,row、col的結構

請求角色列表的產物,因此數據包含在getRoleList的返回值里。
理解el-row和el-col的關系,兩者包含成為一維。

在這里插入圖片描述

<el-row :gutter="20"><el-col :span="6"><div class="grid-content bg-purple"></div></el-col><el-col :span="6"><div class="grid-content bg-purple"></div></el-col><el-col :span="6"><div class="grid-content bg-purple"></div></el-col><el-col :span="6"><div class="grid-content bg-purple"></div></el-col>
</el-row>
{"data": [{"id": 30,"roleName": "主管","roleDesc": "技術負責人","children": [{"id": 101,"authName": "商品管理","path": null,"children": [{"id": 104,"authName": "商品列表","path": null,"children": [{"id": 105,"authName": "添加商品","path": null}]}]}]}],
}

在這里插入圖片描述
在這里插入圖片描述

代碼怎么寫:

  • 先縱向看,有幾個一級權限就應當v-for循環出幾行
  • 再橫向看,每個el-row里,拿一個el-col現實出當級權限,另一個el-col再作為一個整體來看(再看成一行兩列)
<el-row v-for="(item1,i) in scope.row.children" :key="i" class="expand"><!-- 第一列中放一級標簽 --><el-col :span="4"><!-- 可移除標簽,這里展示一級標簽,綁定取消權限方法 --><el-tag class="expand" closable @close="delRight(item1.id,scope.row)">{{item1.authName}}</el-tag></el-col><el-col :span="20"><!-- 第二列也是一行兩列 --><el-row v-for="(item2,index) in item1.children" :key="index"><!-- 第二行第一列中放二級標簽 --><el-col :span="4"><el-tag class="expand" type="success" closable @close="delRight(item2.id,scope.row)">{{item2.authName}}</el-tag></el-col><el-col :span="20"><el-tag class="expand" @close="delRight(item3.id,scope.row)" closable type="warning"v-for="(item3,indexInner) in item2.children" :key="indexInner">{{item3.authName}}</el-tag></el-col></el-row></el-col>
</el-row>
【難點2】 分配權限,樹形結構el-tree 全選、半選(如何展示)

在這里插入圖片描述

  • 展開所有的權限(樹形結構自帶的屬性:default-expand-all
  • 顯示:先勾選上擁有的三級權限(三層forEach,獲得所有三級權限的集合,賦值給checklistArr
    :default-checked-keys="checklistArr"
  • 提交:需要獲取所有的一、二、三級權限的集合(全選+半選),傳參修改

顯示:

editRight(role) {// checklist權限的集合,是個樹形結構this.checklist = role.childrenthis.currentRoleId = role.idvar tmpArr = []this.checklist.forEach(item1 => {var item2 = item1.childrenitem2.forEach(item2 => {var item3 = item2.childrenitem3.forEach(item3 => {tmpArr.push(item3.id)})})})this.checklistArr = tmpArr
}

提交:

async confirmRole() {let arr1 = this.$refs.mytree.getCheckedKeys()let arr2 = this.$refs.mytree.getHalfCheckedKeys()let arr = [...arr1, ...arr2]const res = await this.$http.post(`roles/${this.currentRoleId}/rights`, { rids: arr.join(',') })
}

在這里插入圖片描述

1.5.3 商品管理 - 列表、分類參數、商品分類

1.5.3.1 商品分類

分類接口設計:
重要參數type,type=2(返回一層、二層分類),type=3(返回前三層分類)
在這里插入圖片描述

1.【難點3】樹形組件element-tree-grid在表格中的運用(組件選擇、配置)
  • 表格樣式:樹形結構 +【是否有效】【級別】【操作】字段;
  • 組件選擇:由于第一列的el-table-column要展示為樹形結構,因此使用組件element-tree-grid,all props of el-table-column are supported;
  • 在獲取到三級商品分類后,element-tree-grid只需要綁定好對應的屬性,即可顯示。
    在這里插入圖片描述
<el-tree-grid treeKey="cat_id" parentKey="cat_pid" levelKey="cat_level" childKey="children" prop="cat_name"label="分類名稱">
</el-tree-grid>
2.【難點4】級聯選擇器-添加分類(理解接口type參數)
  • 由于最細添加的是三級分類(或者添加一級、二級分類),因此級聯選擇器只用展示一、二級的父類,請求分類接口,type=2
  • value / v-model: 選中項綁定值,是一個數組
  • 級聯選擇器的handleChange方法,能獲取到最接近一層的父類參數分類id,配置級別和分類名稱,組成一個obj作為參數發POST請求
      handleChange(value) {console.log(value);}

在這里插入圖片描述

1.5.3.2 【難點5】分類參數 – 只允許為三級分類設置參數
  • 級聯選擇器 type=3 展示出三級分類
  • 動態(涉及列表展開)、靜態參數

如何限定只讓第三級被選中:

    handleChange () {if (this.selectedOptions.length !== 3) {this.$message.warning('商品只能添加到三級分類')this.selectedOptions.length = 0}}
1.5.3.3 【難點6】什么時候渲染出參數,tabs標簽頁改造

el-tab-pane里含了el-table–綁定dynamicAttrs el-button
在點擊了級聯選擇器器之后,渲染出動、靜態參數

async handleChange() {if (this.value.length === 3) {if (this.active === '1') {// 動態參數const res = await this.$http.get(`categories/${this.value[2]}/attributes?sel=many`)this.dynamicAttrs = res.data.datathis.dynamicAttrs.forEach((item) => {// 把attr_vals轉為數組類型item.attr_vals = item.attr_vals.split(',')})} else if (this.active === '2') {const res1 = await this.$http.get(`categories/${this.value[2]}/attributes?sel=only`)this.staticAttrs = res1.data.data}}
}
1.5.3.4 【體現功能】商品列表 - 1000條數據

在這里插入圖片描述

商品參數數據格式:
參數名–參數值(可能有多個)

    "data": [{"attr_id": 1,"attr_name": "cpu","cat_id": 22,"attr_sel": "only","attr_write": "manual","attr_vals": "2G","4G","8G"}],
  • 查詢名稱、價格、重量、參數管理
  • 添加商品詳細描述(名稱、價格、重點、數量、分類、參數、屬性、圖片)
  • 步驟條組件+縱向tabs組件(需要包裹在el-form里)(并列關系)
  • 上傳圖片(餓了么Upload組件、百度Web Uploader)
  • 富文本編輯器
  • 功能上的bug,商品列表不能顯示圖片(接口沒返回這個字段)
  • bug2,數據庫表設計時,時間字段長度太短,導致時間不正確,令人汗顏

在這里插入圖片描述
在這里插入圖片描述

改了表字段的數據類型,可能不是最合適,但是時間顯示正常了。創建時間的時候,還是以1970位默認值。在這里插入圖片描述
在這里插入圖片描述

1. 上傳圖片 – 拓展,檢測文件格式;性能

請求上傳接口,需要設置token(這里不是發axios請求)

<el-upload 
action="http://47.xxx.1xx.7:8888/api/private/v1/upload" 
:headers="header" 
:on-remove="handleRemove" 
:on-success="handleSuccess" 
:file-list="fileList" 
list-type="picture"><el-button size="small" type="primary">點擊上傳</el-button><div slot="tip" class="el-upload__tip">只能上傳jpg/png文件,且不超過500kb</div>
</el-upload>header: {Authorization: sessionStorage.getItem('token')
}
2. 富文本編輯器組件 vue-quill-editor
<quill-editor v-model="form.goods_introduce"></quill-editor>

1.5.4 訂單管理

1.5.5 數據統計

2. 框架選擇 – vue

  1. 容易上手:react(JSX,學習成本),vue(模板):任何合乎規范的 HTML 都是合法的 Vue 模板。可以在單文件組件里完全控制 CSS,將其作為組件代碼的一部分。
  2. vue-cli(核心插件)供了各種用途的模板。
  3. 體積:一個包含了 Vuex + Vue Router 的 Vue 項目 (gzip 之后 30kB) 相比使用了這些優化的 angular-cli 生成的默認項目尺寸 (~65KB) 還是要小得多。
  4. 當某個組件的狀態發生變化時,系統能精確知曉哪個組件確實需要被重渲染。(組件的依賴是在渲染過程中自動追蹤的)

3. 組件庫

3.1 elementUI

3.1.1 vue-cli安裝插件

vue create mypro
cd mypro
vue add element

這里選擇的是按需引入:
在這里插入圖片描述
觀察項目文件夾中多了plugins-element.js
默認按需引入只引入了{Button組件} (可以減小體積),修改代碼
在這里插入圖片描述

3.1.2 echarts

4. 項目結構

在這里插入圖片描述
一般腳手架都應當有以下的幾個功能:

  • 自動化構建代碼,比如打包、壓縮、上傳等功能
  • 本地開發與調試,并有熱替換與熱加載等功能
  • 本地接口數據模擬
  • css 模塊化:拓展語言、預處理器saas、less(css 不是編程語言,所以不能聲明變量、函數,不能做判斷、循環和計算,也不能嵌套)
  • 檢查并自動矯正不符合規范的代碼,并優化代碼格式

定義好項目的目錄結構

  • 解耦:代碼盡量去耦合,這樣代碼邏輯清晰,也容易擴展
  • 分塊:按照功能對代碼進行分塊、分組,并能快捷的添加分塊、分組
  • 編輯器友好:需要更新功能時,可以很快的定位到相關文件,并且這些文件應該是很靠近的,而不至于到處找文件

5. 亮點

  • 權限、商品分類涉及到多層級的樹形結構
  • 權限控制

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251294.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統 --- 使用套接字進行網絡通信

一個套接字就是一個通信標識類型的數據結構,包含了通信目的的地址、通信使用的端口號、通信網絡的傳輸協議、進程所在的網絡地址,以及針對客戶或服務器程序提供的不同系統調用等,是進程通信和網絡通信的基本構件。套接字是為客戶/服務器模型而設計的,通常分為以下兩類: 1.基于…

構造器執行順序

轉載于:https://www.cnblogs.com/a6948076/p/8045801.html

Java08-java語法基礎(七)構造方法

Java08-java語法基礎&#xff08;七&#xff09;構造方法 一、構造方法 1、什么是構造方法&#xff1f; 構造方法&#xff08;類方法&#xff09;是一個方法名和類名相容的特殊的成員方法。 2、構造方法的作用&#xff1f; 當使用new關鍵字創建一個對象時&#xff0c;為新建對象…

安裝mysql8.0.20,報錯“找不到VCRUNTIME140_1.dll”

寫在最前&#xff0c;指令集合 以管理員身份運行cmd mysql -uroot -p 【進入】mysql mysql > exit 【退出】 net stop mysql 【暫停】 net start mysql 【啟動】 mysql -u root -p&#xff08;命令后輸入臨時密碼&#xff0c;進入mysql&#xff09; ALTER USER USER() …

操作系統 --- 線程與進程的比較

如果說,在操作系統中引入進程的目的是為了使多個程序能并發執行,以提高資源利用率和系統吞吐量,那么在操作系統中再引入線程,則是為了減少程序在并發執行時所付出的時空開銷,使OS(操作系統)具有更好的并發性… 我們再回顧一下進程的兩個基本屬性: 1.進程是一個可擁擁有資源的獨…

24種吸引人的營銷文章標題寫法,總有一個適合你!

在如今信息爆炸的互聯網時代下&#xff0c;如何提高提高文章的閱讀(新聞稿、軟文宣傳稿、微信公眾號)&#xff0c;成為從業者們共同研究的課題?首先你得有一個足夠吸引的標題&#xff0c;尤其是定向推送的時候&#xff0c;這將是由一個質變帶來量變的過程。小編雖然不提倡標題…

[js] 處理字符串換行造成的json解析失敗

需求&#xff1a;從數據庫某個字段取出字符串出來&#xff0c;轉為json&#xff0c;結果發現報錯為 解析失敗&#xff0c;發現是因為取出的字符串換行導致&#xff0c;現在需要將字符串里面的換行替換為&#xff0c;使字符串可依成功解析成json對象。 技術&#xff1a;依靠repl…

使用mockjs模擬數據

一、安裝 簡單粗暴 npm install mockjs 二、引入 CommonJS引入 let Mock require(mockjs) let userInfo Mock.mock({data: {responseCode: 200,responseMessage: success,userMessage: {name: "cname",email: "email",msg: cparagraph(2)}} })或者ES…

angular --- ngDialog關閉當前層

今天做項目,使用ngDialog 彈出了一層,并且在彈出層上又彈出了第二層. 現在想點擊確定按鈕關閉第二層. 使用以前的ngDialog.close()會關閉掉全部ngDialog.open方法彈出來的層. 在網上查了一堆,找了好多,最后發現就一句話.$scope.closeThisDialog(); 注意, 要在controller:中傳遞…

lodash源碼分析之compact中的遍歷

小時候&#xff0c; 鄉愁是一枚小小的郵票&#xff0c; 我在這頭&#xff0c; 母親在那頭。 長大后&#xff0c;鄉愁是一張窄窄的船票&#xff0c; 我在這頭&#xff0c; 新娘在那頭。 后來啊&#xff0c; 鄉愁是一方矮矮的墳墓&#xff0c; 我在外頭&#xff0c; 母親在里頭。…

[HAOI2008]移動玩具

這又是一道神奇的搜索題。。。只要記錄每種狀態。。。然后暴力判斷這種狀態往后一步的情況。。。 廣搜出最優解即可。。。 呆碼&#xff1a; #include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std;int dx[5]{0…

javascript --- Sortable一個拖拽的接口

最近項目里面要實現需要實現一個拖拽功能,自己實現很麻煩,就在網上找到了一個封裝好的sortable函數,github(https://github.com/SortableJS/Sortable). 首先是依賴的引入:(也可以自己下載源代碼導入,方式很多呢) <body><!-- Latest compiled and minified CSS -->…

個人發展戰略6天課

第一課 冰山模型 【知道自己為什么會不喜歡一份工作】 衡量和一個崗位是否匹配、匹配程度如何 從上到下的要素 知識技能&#xff08;30%&#xff09;特定領域 - 可以后天學習的&#xff0c;顯性的、容易看出來的 和工作的關系&#xff1a; 工作中有陌生的內容&#xff0c;每天…

《Web全棧工程師的自我修養》

1. 什么是全棧工程師 Full-Stack Engineer Facaebook只招全棧工程師&#xff1f; Web開發流程 產品經理-->交互設計-->視覺設計-->開發&#xff08;前端、后端&#xff09;-->測試-->發布 流水線的優勢 “各司其職”的弊端 工程師職責不清導致效率低工程師缺乏主…

div設置overflow-scroll滾動之后,jq獲取其子元素的offset.top出現問題。

先上個圖&#xff1a; 布局很簡單&#xff0c;左右超過屏幕的部分自行滾動。 1. html <div class"ce-container"><div class"ce-leftBox">//左邊的內容</div><div class"ce-rightBox">//右邊的內容 </div…

javascript --- 利用Sortable實現一個可視化公式編輯器

Sortable的依賴引入和簡單使用參見:https://blog.csdn.net/piano9425/article/details/90437182 先簡單的介紹一下可視化公式編輯器的功能(樣式沒有調,畢竟每個人的需求都不一樣): 首先會有2個需要計算的(我稱為操作數)A_XiangRaoZuWenSheng和AYKZQ_CS,以及兩個操作符ADD(加法…

使用uni-app搭建微信小程序

0 問題待解決 import { } 與否為什么要封裝對齊問題每次重啟項目&#xff0c;sitemap就會消失動態修改標題失效圖片問題多多 &#xff1a;高度自適應 改成image固定高度&#xff0c;mode&#xff1a;aspectFill微信小程序文檔b站視頻鏈接后端接口文檔 一、知識點 uni-app 是…

HttpTomcat

本節內容&#xff1a; Http協議Tomcat服務器下面開始的一系列內容都是JavaEE的內容&#xff0c;主要的內容見下圖。JavaEE主要是做服務器端開發。 JavaEE全部規范&#xff1a;有13門技術&#xff0c;主要做web開發的需要學習servlet和jsp。其他技術&#xff0c;像EJB、 JNDI、J…

python---線程與進程

一 線程 1.1 概述 線程是操作系統能夠進行運算調度的最小單位。它被包含在進程之中&#xff0c;是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流&#xff0c;一個進程中可以并發多個線程&#xff0c;每條線程并行執行不同的任務。 Threading用于提供線程相關…

jquery常見操作分享

參考: https://www.cnblogs.com/eager/p/7133270.html