日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

尚品汇后台管理系统

發布時間:2025/4/16 windows 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 尚品汇后台管理系统 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

尚品匯后臺管理系統

  • 1、登錄(退出登錄)
  • 2、路由設置(***)
    • 路由表component屬性
  • 3、品牌列表模塊
    • 3.1 el-pagination layout屬性
    • 3.2 封裝四個模塊api
    • 3.3 this濫用和參數解構
    • 3.4 品牌列表展示(插槽)
    • 3.5 品牌信息新增和修改
    • 3.6 表單驗證
    • 3.7 刪除品牌信息
  • 4、商品屬性
    • 4.1 三級聯動
    • 4.2 商品屬性展示

1、登錄(退出登錄)

后臺接口swagger在線文檔:
后臺接口1
后臺接口2

1、將所有的api接口url更換為和swagger在線文檔相同的url。
2、跨域解決
devServer部分(proxy代理解決跨域)

devServer: {port: port,open: true,overlay: {warnings: false,errors: true},proxy: {// 會把請求路徑中的/api換為后面的代理服務器'/dev-api': {// 提供數據的服務器地址target: 'http://39.98.123.211',pathRewrite: { '^/dev-api': '' }}}},

記得重啟項目
3、切記將請求攔截器的X-Token改為token,否則后臺會返回jwt空錯誤。
config.headers['token'] = getToken()
退出登錄部分可以不做修改。

2、路由設置(***)

路由部分代碼

export const constantRoutes = [{path: '/login',component: () => import('@/views/login/index'),hidden: true},{path: '/404',component: () => import('@/views/404'),hidden: true},{path: '/',component: Layout,redirect: '/dashboard',children: [{path: 'dashboard',name: 'Dashboard',component: () => import('@/views/dashboard/index'),meta: { title: '首頁', icon: 'dashboard' }}]},{path: '/product',name: 'Product',component: Layout,meta: { title: '商品管理', icon: 'el-icon-goods' },children: [{path: 'trademark',name: 'TradeMark',component: () => import('@/views/tradeMark'),meta: { title: '品牌管理' }}, {path: 'attr',name: 'Attr',component: () => import('@/views/Attr'),meta: { title: '平臺屬性管理' }}, {path: 'sku',name: 'Sku',component: () => import('@/views/Sku'),meta: { title: 'Sku管理' }}, {path: 'spu',name: 'Spu',component: () => import('@/views/Spu'),meta: { title: 'Spu管理' }}]},// 404 page must be placed at the end !!!{ path: '*', redirect: '/404', hidden: true } ]

路由表component屬性

component用法一

path: 'trademark', name: 'TradeMark', component: () => import('@/views/tradeMark'),

當訪問path為trademark時,會顯示tradeMark這個組件。上面只是component最簡單的應用。
component用法二

path: '/product',name: 'Product',component: Layout,meta: { title: '商品管理', icon: 'el-icon-goods' },children: [{path: 'trademark',name: 'TradeMark',component: () => import('@/views/tradeMark'),meta: { title: '品牌管理' }}]

如果一個路由只是一個菜單項,并不對應相應的組件,那么此時的component為本菜單項所在的路由組件。

例如:上面代碼中product只是一個菜單項,并不對應相應組件。所以他的component應該為他所在的組件,即component: Layout。trademark為子菜單項,有具體對應的組件,所以component: () => import('@/views/tradeMark'),trademark的component原理就是用法一。

前端菜單欄顯示的實現具體如下:

遍歷路由信息數組,將路由項渲染為菜單項。菜單項的信息在路由信息中獲取。
(1)如果路由項只有一個子路由,則將該子路由信息作為作為菜單項信息。
(2)如果路由項有多個子路由,將父路由信息作為一級菜單項信息。然后,遍歷所有的子路由,生成相應的二級菜單項。

這個前端菜單項顯示代碼值得研究,寫的非常好。

3、品牌列表模塊

3.1 el-pagination layout屬性

layout是指分頁器各組件的排列方式,例如:
layout=" prev, pager, next, jumper,->,sizes,total"


->后面的組件會被放在頁面的最右邊。如下圖所示:

3.2 封裝四個模塊api

四個模塊分別為attr、sku、spu、tradeMark。
每個模塊的api封裝為對應的js文件,如下圖所示:

為了方便使用,將四個模塊再次封裝到一個js文件中,然后統一暴露。

這樣如果我們使用時,只需要import這個js文件就可以使用了,但是為了更加簡介,我們可以將這個js文件在main.js中注冊,將其是設置為全局屬性。

// 引入api請求接口 import API from '@/api' Vue.prototype.$API = API

之后在組件中使用四個模塊的api函數時,可直接通過this.$API.函數名調用。

3.3 this濫用和參數解構

data中的數據十分常用,當我們使用時可能會頻繁的通過this.使用data中的數據,這樣容易發生濫用this去讀取data中數據,程序性能會下降。具體原因鏈接描述
解決方法:ES6允許我們通過參數解構來避免this的濫用。

例如,getPageList函數需要使用page, limit兩個屬性。直接const { page, limit } = this解構出這兩個屬性。

export default {name: 'TradeMark',data() {return {page: 1,limit: 3}},mounted() {this.getPageList()},methods: {getPageList() {const { page, limit } = thisthis.$API.trademark.getTradeMarkInfo(page, limit)}} }

3.4 品牌列表展示(插槽)

1、獲取數據函數
設置了pager = 1參數,調用時,如果傳值就會將值賦給pager ,如果不傳pager = 1。即默認獲取的是第一頁數據。

async getPageList(pager = 1) {this.page = pagerconst { page, limit } = thisconst result = await this.$API.trademark.getTradeMarkInfo(page, limit)if (result.code === 200) {this.total = result.data.totalthis.list = result.data.records}}

2、需要注意的是插槽的使用。我們需要通過插槽獲取父組件數據。

el-table插槽使用方法:

品牌logo列使用了插槽。所以通過一下代碼探究插槽的使用

<el-table-column prop="logoUrl" label="品牌LOGO" align="center"><template slot-scope="{row, column, $index}"><p>{{row}}</p><p>{{column}}</p><p>{{$index}}</p></template> </el-table-column>

下面三個箭頭分別對應slot-scope="{row, column, $index}中的row, column, $ index。
row表示表格當前一行的全部信息;
column表示當前列的一些屬性;
$index表示當前行數據在整個數據數組中的下標。

這里我們只需要用到當前行所包含的品牌logo圖片鏈接,所以只需要使用row,完整代碼如下:

<el-table :data="list" style="width: 100%"><el-table-column type="index" label="序號" width="80px" align="center"></el-table-column><el-table-column prop="tmName" label="品牌名稱" align="center"></el-table-column><el-table-column prop="logoUrl" label="品牌LOGO" align="center"><template slot-scope="{row}"><img :src="row.logoUrl" style="width: 80px;height: 80px"/></template></el-table-column><el-table-column prop="prop" label="操作" align="center"><template slot-scope="{row}"><el-button type="primary">修改</el-button><el-button type="danger">刪除</el-button></template></el-table-column></el-table>

3、分頁器修改頁面大小和修改當前頁碼都比較簡單,直接貼代碼。

// 修改當前頁碼handleCurrentChange(current) {this.getPageList(current)},// 修改頁面大小handleSizeChange(size) {this.limit = sizethis.getPageList()},

注意:handleSizeChange中的getPageList需要帶參數,因為getPageList定義了默認參數pager=1,如果不傳入current,則getPageList的默認參數pager=1就會生效,就會一直請求第一頁數據。

3.5 品牌信息新增和修改

1、頭像上傳組件
新增中比較重要的時頭像上傳組件,代碼如下

<el-uploadclass="avatar-uploader"action="dev-api/admin/product/fileUpload":show-file-list="false":on-success="handleAvatarSuccess":before-upload="beforeAvatarUpload"><img v-if="tmFrom.logoUrl" :src="tmFrom.logoUrl" class="avatar"><i v-else class="el-icon-plus avatar-uploader-icon"></i><div slot="tip" class="el-upload__tip">只能上傳jpg文件,且不超過2MB</div> </el-upload>

圖片數據不能用v-model綁定,
action 必選參數,上傳的地址。這里的 action取值是上傳圖片的接口,是后臺提供好的接口。
before-upload表示上傳成功前的函數

beforeAvatarUpload(file) {const isJPG = file.type === 'image/jpeg'const isLt2M = file.size / 1024 / 1024 < 2if (!isJPG) {this.$message.error('上傳頭像圖片只能是 JPG 格式!')}if (!isLt2M) {this.$message.error('上傳頭像圖片大小不能超過 2MB!')}return isJPG && isLt2M}

on-success表示上傳成功后的函數

handleAvatarSuccess(res, file) {// res是上傳成功后返回給前端的數據// file是上傳成功后服務器返回給前端的數據this.tmFrom.logoUrl = URL.createObjectURL(file.raw)}

上面兩個函數餓了嗎UI官網都以給出,理解即可。
2、新增和修改函數
新增和修改按鈕使用的是同一個彈窗。
(1)點擊添加按鈕顯示彈窗
記得清空上次操作的數據

addTradeMark() {this.dialogFormVisible = true// 清空上次操作的數據this.tmFrom = { tmName: '', logoUrl: '' }}

(2)點擊修改按鈕顯示彈窗(淺拷貝問題
this.$tmFrom = row會使得二者同時指向數據的引用,當修改tmFrom表單項時,表格中數據也會改變,如果修改后點了取消按鈕,表格中數據會發生改變。所以,要解決淺拷貝

updateTradeMark(row) {this.dialogFormVisible = true// ...解決單層淺拷貝問題this.tmFrom = { ...row }}

當賦值的對象row中還有對象元素時,又會出現上面的問題,所以可以通過深拷貝JSON.parse(JSON.stringfy())實現。
(3)擊彈窗的確定按鈕實現數據的修改或新增
新增和修改成功后,需要再次獲取品牌信息。需要注意,如果時新增則刷新后顯示第一頁,如果是修改,則要在當前頁刷新顯示。

async addOrUpdate() {this.dialogFormVisible = falselet result = await this.$API.trademark.addOrUpdateTradeMark(this.tmFrom)if (result.code === 200) {this.$message.success(this.tmFrom.id ? '修改品牌成功' : '添加品牌成功')}// 現需要再次獲取品牌信息,修改數據要在當前頁刷新this.getPageList(this.tmFrom.id ? this.page : 1)},

新增或修改品牌API函數

// 新增或修改品牌 export const addOrUpdateTradeMark = (tradeMark) => {// 有id則為修改if (tradeMark.id) {return request({ url: 'admin/product/baseTrademark/update', method: 'put', data: tradeMark })}// 無id則為新增return request({ url: 'admin/product/baseTrademark/save', method: 'post', data: tradeMark }) }

3.6 表單驗證

表單驗證,主要分以下幾步:
(1)定義rules
(2)表單綁定rules,表單項prop綁定驗證屬性
(3)提交表單時觸發的函數內,先進行表單驗證,如果成功執行后續操作,否則彈出失敗。

3.7 刪除品牌信息

(1)氣泡確認框
@onConfirm="deleteTradeMark(row)"綁定的是刪除函數

<template ><el-popconfirmtitle="這是一段內容確定刪除嗎?"@onConfirm="deleteTradeMark(row)"><el-button slot="reference" type="danger" size="small">刪除</el-button></el-popconfirm></template>

(2)刪除函數
刪除成功后要刷新頁面。

async deleteTradeMark(row) {const result = await this.$API.trademark.deleteTradeMark(row.id)if (result.code === 200) {this.$message.success('刪除成功')// 成功后,重新獲取數據await this.getPageList(this.list.length > 1 ? this.page : 1)} else {this.$message.error('刪除失敗')}}

示例:

4、商品屬性

4.1 三級聯動

(1)三級聯動靜態組件
示例

由于多個頁面都使用到了上面的el-card,所以將其封裝為全局組件。
main.js

import CategorySelect from './components/CategorySelect' Vue.component(CategorySelect.name, CategorySelect)

注意:雖然該全局組件的名字是CategorySelect ,但是在使用時最好用后面的形式<category-select></category-select>。
原因:html不區分大小寫,會將大寫字母轉換為小寫,并在前面加-。即CategorySelect 轉換為category-select
(2)三級聯動數據展示
示例:

html靜態代碼

<el-card style="margin: 20px 0"><el-form :inline="true" class="demo-form-inline"><el-form-item label="一級分類"><el-select v-model="formList.category1" placeholder="請選擇" value="" @change="getCategory2List"><el-option v-for="(c1,index) in category1List" :key="c1.id" :label="c1.name" :value="c1.id"></el-option></el-select></el-form-item><el-form-item label="二級分類" ><el-select v-model="formList.category2" placeholder="請選擇" value="" @change="getCategory3List"><el-option v-for="(c2,index) in category2List" :key="c2.id" :label="c2.name" :value="c2.id"></el-option></el-select></el-form-item><el-form-item label="三級分類" ><el-select v-model="formList.category3" placeholder="請選擇" value=""><el-option v-for="(c3,index) in category3List" :key="c3.id" :label="c3.name" :value="c3.id"></el-option></el-select></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">查詢</el-button></el-form-item></el-form></el-card>

data屬性

data() {return {category1List: [],category2List: [],category3List: [],formList: {category1: '',category2: '',category3: ''}}

注意:formList內容是三個選擇框選中屬性的id。后續也是通過id去查詢。

針對于選中一級屬性后,自動獲取二級屬性列表,選中二級屬性后,再自動獲取三級屬性列表問題。
最初思路:通過computed或者watch去實現,但都沒有成功。
老師的方法:通過給選擇框添加@change屬性,再回調函數內去獲取下一級屬性列表。

@change綁定的獲取三級列表函數都比較簡單,這里就不過多描述。

// 獲取一級分類// 獲取一級分類async getCategory1List() {const result = await this.$API.attr.reqCategory1List()if (result.code === 200) {this.category1List = result.data} else {alert(result.message)}},// 通過選中一級屬性id獲取二級屬性列表async getCategory2List() {// 當一級分類改變時,上一次選擇的二級和三級分類應設置為空this.category2List = []this.category3List = []this.formList.category2 = ''this.formList.category3 = ''const result = await this.$API.attr.reqCategory2List(this.formList.category1)if (result.code === 200) {this.category2List = result.data} else {alert(result.message)}},// 通過選中二級屬性id獲取三級屬性列表async getCategory3List() {// 當二級分類改變時,上一次選擇的三級分類應設置為空this.category3List = []this.formList.category3 = ''const result = await this.$API.attr.reqCategory3List(this.formList.category2)if (result.code === 200) {this.category3List = result.data} else {alert(result.message)}},

(3)將選中的三級分類id傳遞給父組件
這里是通過點擊查詢按鈕實現的父子組件通信
查詢按鈕綁定的回調

// 子組件將三級分類id傳遞給父組件,父組件使用該id去查詢并展示數據async onSubmit() {this.$emit('getCategoryId', this.formList)}

父組件

<category-select @getCategoryId="getCategoryId"></category-select>

父組件data

data() {return {category1Id: '',category2Id: '',category3Id: ''}},

父子組件通信,父組件的接收函數:getCategoryId函數
只有當三級id不為空時,才發請求。

// 獲取子組件傳遞三級分類idgetCategoryId(list) {this.category1Id = list.category1Idthis.category2Id = list.category2Idthis.category3Id = list.category3Idif (this.category3Id) {console.log('發請求')}}

4.2 商品屬性展示

通過三級聯動獲取到要展示的屬性id后,接下來就是通過該id請求數據,然后展示。

總結

以上是生活随笔為你收集整理的尚品汇后台管理系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。