前言
由於之前的作者沒有再更新這個后台管理系統項目的文章了,我想着把它的項目重頭到位做一遍,把剩下的文章寫完,把這個項目記錄完整,以后遇到類似的后台管理系統項目,可以快速復習一些知識點。
新的項目地址:https://github.com/C4az6/vue_manage_system
添加用戶
這個操作在用戶列表頁面,所以路由不用再進行 處理了。
基於單文件組件:
- 添加事件綁定--彈出新增用戶對話框
- 添加dialog對話框
- Element-UI組件>dialog對話框>自定義內容>表單
重點屬性:
- :visible.sync:控制當前對話框的顯示和隱藏,如果 值為true,則顯示
- label-width:label寬度
- model:表單的數據源綁定
- v-model:單個表單元素的數據綁定
細節:
- 表單元素的綁定數據的名稱不要隨意,而是參照接口
在dialog添加表單結構
<!-- 新增用戶對話框 --> <el-dialog title="新增用戶" :visible.sync="addDialogFormVisible"> <el-form :model="addForm" :label-width="'120px'"> <el-form-item label="用戶名"> <el-input v-model="addForm.username" auto-complete="off"></el-input> </el-form-item> <el-form-item label="密碼"> <el-input v-model="addForm.password" auto-complete="off"></el-input> </el-form-item> <el-form-item label="郵箱"> <el-input v-model="addForm.email" auto-complete="off"></el-input> </el-form-item> <el-form-item label="手機號"> <el-input v-model="addForm.mobile" auto-complete="off"></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="addDialogFormVisible = false">取 消</el-button> <el-button type="primary">確 定</el-button> </div> </el-dialog>
為表單元素添加驗證提示信息
- :rules屬性的設置
- rules規則的添加
- prop的名稱必須和規則的名稱對應
- rules規則添加在data屬性中的
// 新增用戶和編輯用戶數據驗證規則 rules: { username: [ { required: true, message: '請輸入用戶名', trigger: 'blur' } ], password: [ { required: true, message: '請輸入密碼', trigger: 'blur' }, { min: 6, max: 16, message: '長度在 6 到 16 個字符', trigger: 'blur' } ], email: [ // wuhu0723@126.com { required: true, message: '請輸入郵箱', trigger: 'blur' }, { message: '請輸入合法的郵箱', pattern: /\w+[@]\w+[.]\w+/, trigger: 'blur' } ], mobile: [ // wuhu0723@126.com { required: true, message: '請輸入手機號', trigger: 'blur' }, { message: '請輸入正確的手機號', pattern: /^1\d{10}$/, trigger: 'blur' } ] }
在事件中進行用戶數據的驗證--可以阻止 本次提交
- 為表單添加ref屬性
- 為按鈕添加綁定事件
- validate方法可以實現表單數據的驗證,這個驗證的規則與之前所設置的Rules完全對應
- 這個函數在實現完驗證之后會傳遞一個值給當前函數的回調,如果值為true,則說明驗證通過,否則說明不通過
發起新增用戶的請求,接收返回值,實現數據的刷新
- 引入接口方法
- 調用接口方法,傳遞參數,添加then的回調
// 新增用戶 add () { // 再次進行用戶數據的驗證 this.$refs.addForm.validate(valid => { if (valid) { // 發起新增用戶請求 addUser(this.addForm) .then(res => { if (res.data.meta.staus === 201) { this.$message({ type: 'success', message: res.data.meta.msg }) // 數據刷新 this.addDialogFormVisible = false // 表單元素的數據重置 this.$refs.addForm.resetFields() this.init() } else { this.$message({ type: 'error', message: res.data.meta.msg }) } }) .catch(() => { this.$message({ type: 'error', message: 'err' }) }) } else { // 中止本次請求 return false } }) }
后台接口方法:@/api/users.js
// 新增用戶 export const addUser = (data) => { return axios({ method: 'post', url: 'users', data }) }
組件中的業務處理
-
-
添加dialog
<!-- 編輯用戶對話框 --> <el-dialog title="編輯用戶" :visible.sync="editDialogFormVisible"> <el-form ref='editForm' :model="editForm" :rules='rules' :label-width="'120px'"> <el-form-item label="用戶名"> <el-input v-model="editForm.username" auto-complete="off" disabled></el-input> </el-form-item> <el-form-item label="郵箱" prop='email'> <el-input v-model="editForm.email" auto-complete="off"></el-input> </el-form-item> <el-form-item label="手機號" prop='mobile'> <el-input v-model="editForm.mobile" auto-complete="off"></el-input> </el-form-item> </el-form> <div slot="footer" class="dialog-footer"> <el-button @click="editDialogFormVisible = false;$refs.editForm.resetFields()">取 消</el-button> <el-button type="primary">確 定</el-button> </div> </el-dialog>
添加dialog對象的屬性
// 控制新增用戶對話框的顯示和隱藏 addDialogFormVisible: false, // 新增數據的表單數據綁定對象 addForm: { username: '', password: '', email: '', mobile: '' },
在彈出框 的時候需要加載默認數據
- 重點是slot-scope的使用
- 通過scope可以獲取這一行的對應的數據對象
- scope.row就是當前這一行的數據對象
// 單擊編輯彈出對話框,加載默認數據 handleEdit (obj) { console.log(obj) // 讓彈出框顯示 this.editDialogFormVisible = true // 表單元素實現的雙向數據綁定,所以我們只需要為表單元素的雙向綁定數據對象有數據就行 this.editForm.id = obj.id this.editForm.username = obj.username this.editForm.email = obj.email this.editForm.mobile = obj.mobile }
-
單擊確定實現修改操作
-
修改提交之前再次實現用戶數據驗證
-
接收操作返回值,進行數據刷新,關閉彈出框...
// 編輯用戶 edit () { this.$refs.editForm.validate(valid => { if (valid) { editUser(this.editForm).then(res => { // 一定不要靠猜,而是打印出數據分析數據內容和結構 console.log(res) if (res.data.meta.status === 200) { this.$message({ type: 'success', message: res.data.meta.msg }) // 數據刷新 this.editDialogFormVisible = false // 表單元素的數據重置 this.$refs.editForm.resetFields() this.init() } else { this.$message({ type: 'error', message: res.data.meta.msg }) } }).catch(() => { console.log('err') }) } else { return false } }) }
接口方法的添加
// 編輯用戶 /** * 這個方法可以實現用戶數據的編輯 * @param {object} data-用戶對象 */ export const editUser = (data) => { return axios({ method: 'put', url: `users/${data.id}`, data }) }
組件中的業務處理
- 添加刪除事件綁定
- 寫出刪除確認提示框:內容不是很復雜,但是也沒有自動消息(既不是dialog也不是$message,而是messageBox)
messageBox的使用
在單擊確認的時候發起請求
// 根據id刪除用戶 del (id) { // 彈出刪除確認框 this.$confirm(`此操作將永久刪除id號為${id}的數據, 是否繼續?`, '提示', { confirmButtonText: '確定', cancelButtonText: '取消', type: 'warning' }).then(() => { // 發起刪除請求 deleteUser(id) .then(res => { if (res.data.meta.status === 200) { this.$message({ type: 'success', message: '刪除成功!' }) this.init() } }) .catch(() => { this.$message({ type: 'error', message: '刪除失敗!' }) }) }).catch(() => { this.$message({ type: 'info', message: '已取消刪除' }) }) }
接口方法的添加
// 刪除用戶 export const deleteUser = (id) => { return axios({ method: 'delete', url: `users/${id}` }) }
組件中的業務處理
- 綁定分配角色的事件
- 添加分配角色對話框
下拉列表結構說明
// 當用戶進行選擇之后,會自動的將:value所對應數據賦值給v-model所指定的屬性 <el-select v-model="value" placeholder="請選擇"> <el-option v-for="item in options" :key="item.value" :label="item.label" //用於展示的數據--給用戶看的 :value="item.value" //這個展示數據背后的value值,它就是相當於背后的唯一標識id ></el-option> </el-select>
觀察接口方法:接口需要的是id
接口方法
// 分配用戶角色 // id:就是id號 // rid:也是一個id號 export const grantUserRole = (id, rid) => { return axios({ method: 'put', url: `users/${id}/role`, data: { rid: rid } }) }
vue組件的業務處理
處理不同用戶不同的狀態的展示
-
-
我們發現數據中有一個屬性mg_state,它就是用來描述當前用戶的狀態
-
所以我們可以將swtich的v-model綁定為用戶數據 的mg_state
<el-switch v-model="scope.row.mg_state" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
-
這個事件如果沒有傳遞參數,那么就默認的當前狀態做為參數
-
如果你手動傳遞了參數,默認的參數就不會再進行傳遞,你可以手動的添加$event
-
$event的值就是當前的狀態值
-
你也可以將之前數據源數據雙向綁定屬性做為參數傳遞
<el-switch v-model="scope.row.mg_state" active-color="#13ce66" inactive-color="#ff4949" @change='updateStatus(scope.row.id,scope.row.mg_state)'></el-switch>
實現狀態的修改:調用接口方法
// 修改用戶狀態 updateStatus (id, type) { updateUserStatus(id, type) .then(res => { console.log(res) if (res.data.meta.status === 200) { this.$message({ type: 'success', message: res.data.meta.msg }) } }) }
接口方法
// 修改用戶狀態 export const updateUserStatus = (id, type) => { return axios({ method: 'put', url: `users/${id}/state/${type}` }) }
補充:Token
token是一種新的狀態保持的方式:客戶端使用用戶名和密碼請求登錄。服務端收到請求,驗證用戶名和密碼。驗證成功后,服務端會生成一個token,然后把這個token發送給客戶端。客戶端收到token后把它存儲起來,可以放在cookie或者Local Storage(本地存儲)里。客戶端每次向服務端發送請求的時候都需要帶上服務端發給的token。服務端收到請求,然后去驗證客戶端請求里面帶着token,如果驗證成功,就向客戶端返回請求的數據。
現在我們有一個需求:我們需要獲取到token值,並且在每一次后台數據請求的時候傳遞這個token給服務器。
存儲token 》 獲取token 》 傳遞token。
存儲token
-
-
我們可以使用本地存儲來實現對token值的存儲:localStorage sessionStorage
獲取token + 傳遞token
-
-
攔截器就是在這個場景提供支持的
-
axios提供了攔截器功能
// 添加請求攔截器 axios.interceptors.request.use(function (config) { // 在發送請求之前做些什么 // 獲取可能有的token數據,進行請求頭的設置,格式Authorization:token var token = localStorage.getItem('itcast_pro_token') // console.log(config) config.headers['Authorization'] = token return config }, function (error) { // 對請求錯誤做些什么 return Promise.reject(error) })
效果展示
如果您喜歡這篇文章,可以打賞點錢給我 :)
支付寶 微信