今日內容
零、 復習昨日
零、 復習昨日
一、Element UI
Element,一套為開發者、設計師和產品經理準備的基于 Vue 2.0 的桌面端組件庫
官網: https://element.eleme.cn/#/zh-CN
Element Plus,基于 Vue 3,面向設計師和開發者的組件庫
官網: https://element-plus.gitee.io/zh-CN/
二 安裝&入門使用
2.1 創建vue項目
-
命令行創建
-
界面創建
過程略…
創建完項目,idea打開
2.2 安裝ElementUI
npm install element-ui -S
2.3 項目中引入
引入Element
// main.js
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';Vue.use(ElementUI);// ...其他以前的東西...
2.4 測試
新建文件,Element官網復制代碼,啟動訪問即可
三、常用組件
3.1 布局
3.2 容器
3.3 單選
3.4 復選框
3.5 輸入框
3.6 下拉框
3.7 日期
3.8 上傳
3.9 表單
3.10 表格
3.11 彈框
四、練習
4.1 登錄頁
項目啟動訪問登錄,修改路由
編寫登錄頁面
<template><div><el-row><el-col :span="8" :offset="8"><h1>登錄頁面</h1><el-form ref="form" :model="form" label-width="80px"><el-form-item label="用戶名"><el-input v-model="form.username"></el-input></el-form-item><el-form-item label="密碼"><el-input v-model="form.password" type="password"></el-input></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">登錄</el-button></el-form-item></el-form></el-col></el-row></div>
</template><script>
import axios from 'axios'
export default {name: 'Login',data() {return {form: {username: '',password: ''}}},methods: {onSubmit() {axios.get('/login',{params: {username: this.form.username,password: this.form.password,}}).then(res => {console.log('登錄返回',res)if (res.code == 2000) {this.$message({message: '恭喜你,登錄成功',type: 'success',duration:600});} else {this.$message({message: '用戶名或密碼錯誤,登錄失敗',type: 'error',duration:600});}})}}
}
</script><style scoped></style>
配置axios,在main。js中定義
// 基礎路徑
axios.defaults.baseURL = 'http://localhost:8080/day39';// 添加響應攔截器
axios.interceptors.response.use(function (response) {return response.data;// 取出R
}, function (error) {return Promise.reject(error);
});
4.2 主頁
創建主頁面,填充布局容器
<template><div><!--最外層容器--><el-container class="max-container"><!--頭部--><el-header>用戶管理系統后端</el-header><!--內部容器--><el-container><!--側邊--><el-aside width="200px"><!--:default-openeds="['1']" 默認打開--><el-menu ><el-submenu index="1"><template slot="title"><i class="el-icon-message"></i>用戶管理</template><el-menu-item index="1-1">選項1</el-menu-item><el-menu-item index="1-2">選項2</el-menu-item></el-submenu><el-submenu index="2"><template slot="title"><i class="el-icon-menu"></i>角色管理</template><el-menu-item index="1-1">選項1</el-menu-item><el-menu-item index="1-2">選項2</el-menu-item></el-submenu><el-submenu index="3"><template slot="title"><i class="el-icon-setting"></i>系統設置</template><el-menu-item index="1-1">選項1</el-menu-item><el-menu-item index="1-2">選項2</el-menu-item></el-submenu></el-menu></el-aside><!--小容器--><el-container><!--主要界面--><el-main>Main</el-main><!--頁腳--><el-footer>? 2024 Java2403ByTaotie Copyright</el-footer></el-container></el-container></el-container></div>
</template><script>
export default {name: 'Admin'
}
</script><style scoped>
.max-container {height: 710px;
}.el-header, .el-footer {background-color: #B3C0D1;color: #333;text-align: center;line-height: 60px;
}.el-aside {background-color: #D3DCE6;color: #333;text-align: center;line-height: 200px;
}.el-main {background-color: #E9EEF3;color: #333;text-align: center;line-height: 160px;
}body > .el-container {margin-bottom: 40px;
}.el-container:nth-child(5) .el-aside,
.el-container:nth-child(6) .el-aside {line-height: 260px;
}.el-container:nth-child(7) .el-aside {line-height: 320px;
}
</style>
登錄成功后,路由跳轉到這個頁面
4.3 退出按鈕
頭部添加按鈕,以及事件,路由回到登錄頁
4.4 存儲、銷毀登錄狀態
先在Vuex中設置好存儲登錄的user值,以及設置準備修改user數據的函數
登錄時存入
退出時銷毀
設置路由守護攔截
// 完整的router/index.js代碼
import Vue from 'vue'
import VueRouter from 'vue-router'
import LoginView from "@/views/LoginView.vue";
import AdminView from "@/views/AdminView.vue";
import store from '@/store'Vue.use(VueRouter)const routes = [{path: '/',name:'Login',component: LoginView},{path: '/admin',name:'Admin',component: AdminView},
]const router = new VueRouter({mode: 'history',base: process.env.BASE_URL,routes
})
router.beforeEach((to, from, next) => {if (to.name !== 'Login') {console.log("這是路由守衛取出Vuex中數據User",store.state.user.username)if(store.state.user.username){next()} else {next({ name: 'Login' })}}else {next()}
})
export default router
// Vuex要持久化
-
安裝插件
npm install vuex-persistedstate
-
配置
在/src/store/index.js中實現配置
import Vue from 'vue' import Vuex from 'vuex' // 1引入持久化插件 import vuexPersistedstate from "vuex-persistedstate";Vue.use(Vuex) export default new Vuex.Store({// ...,plugins:[vuexPersistedstate()] // 2加入插件 })
4.5 用戶界面路由展示
設置路由入口,
設置路由規則,用戶界面是設置AdminView中的,屬于嵌套路由,所以要設置路由子路徑
設置路由展示,在主界面的Main中
4.6 用戶頁面布局
<template>
<div><el-card class="box-card" :body-style="{ padding: '15px',height:'30px' }"><el-form :inline="true" :model="formInline" class="demo-form-inline"><el-form-item label="用戶名"><el-input v-model="formInline.username" placeholder="用戶名"></el-input></el-form-item><el-form-item label="手機號"><el-input v-model="formInline.phone" placeholder="手機號"></el-input></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">查詢</el-button></el-form-item></el-form></el-card><el-card class="box-card"><el-table:data="tableData"style="width: 100%"><el-table-columnprop="date"label="日期"width="180"></el-table-column><el-table-columnprop="name"label="姓名"width="180"></el-table-column><el-table-columnprop="address"label="地址"></el-table-column></el-table></el-card><el-card class="box-card" :body-style="{ padding: '15px',height:'30px'}"><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="currentPage4":page-sizes="[100, 200, 300, 400]":page-size="100"layout="total, sizes, prev, pager, next, jumper":total="400"></el-pagination></el-card>
</div>
</template><script>
export default {name:"User",data(){return {formInline: {username: '',phone: ''},tableData: [{date: '2016-05-02',name: '王小虎',address: '上海市普陀區金沙江路 1518 弄'}, {date: '2016-05-04',name: '王小虎',address: '上海市普陀區金沙江路 1517 弄'}, {date: '2016-05-01',name: '王小虎',address: '上海市普陀區金沙江路 1519 弄'}, {date: '2016-05-03',name: '王小虎',address: '上海市普陀區金沙江路 1516 弄'}, {date: '2016-05-03',name: '王小虎',address: '上海市普陀區金沙江路 1516 弄'}, {date: '2016-05-03',name: '王小虎',address: '上海市普陀區金沙江路 1516 弄'}, {date: '2016-05-03',name: '王小虎',address: '上海市普陀區金沙江路 1516 弄'},]}}
}
</script><style scoped>
.box-card {width: 100%;margin-top: 10px;
}
</style>
注意: 此時只是布局,真正完整效果后續改動…
4.7 查詢全部用戶
UserView頁面加載時查詢全部,設置鉤子函數,查詢全部,設置表格數據
<template>
<div><!--搜索卡片--><el-card class="box-card" :body-style="{ padding: '15px',height:'30px' }"><el-form :inline="true" :model="formInline" class="demo-form-inline"><el-form-item label="用戶名"><el-input v-model="formInline.username" placeholder="用戶名"></el-input></el-form-item><el-form-item label="手機號"><el-input v-model="formInline.phone" placeholder="手機號"></el-input></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">查詢</el-button></el-form-item></el-form></el-card><!--表格數據卡片--><el-card class="box-card"><el-table :data="userList" style="width: 100%"><el-table-column type="selection" width="55"></el-table-column><el-table-column prop="id" label="編號" width="75"></el-table-column><el-table-column prop="username" label="用戶名" width="100"></el-table-column><el-table-column prop="password" label="密碼" width="100"></el-table-column><el-table-column prop="phone" label="手機號" width="140"></el-table-column><el-table-column prop="createTime" label="注冊時間" width="180"></el-table-column><el-table-column prop="money" label="余額" width="140"></el-table-column><el-table-column prop="sex" label="性別" width="100"></el-table-column><el-table-column label="操作"><template slot-scope="scope"><el-buttonsize="mini"@click="handleEdit(scope.$index, scope.row)">編輯</el-button><el-buttonsize="mini"type="danger"@click="handleDelete(scope.$index, scope.row)">刪除</el-button></template></el-table-column></el-table></el-card><!--分頁卡片--><el-card class="box-card" :body-style="{ padding: '15px',height:'30px'}"><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="currentPage4":page-sizes="[100, 200, 300, 400]":page-size="100"layout="total, sizes, prev, pager, next, jumper":total="400"></el-pagination></el-card>
</div>
</template><script>
import axios from 'axios'
export default {name:"User",data(){return {formInline: {username: '',phone: ''},userList: [{id: '',username: '',password: '',phone: '',createTime: '',money: null,sex: '',}]}},methods: {findAll(){axios.get('/findAll').then(res => {if (res.code == 2000) {this.userList = res.data}})}},mounted() {this.findAll()}
}
</script><style scoped>
.box-card {width: 100%;margin-top: 10px;
}
</style>
ps: 日期演示問題,后端可以將日期注解換成@JsonFormat(pattern = “yyyy-MM-dd”)即可
4.8 分頁展現
修改UserView頁面的js代碼
<script>
import axios from 'axios'
export default {name:"User",data(){return {formInline: {username: '',phone: ''},userList: [{id: '',username: '',password: '',phone: '',createTime: '',money: null,sex: '',}],currentPage:1,// 當前頁面total:0, // 總條數pageNum:1,// 當前頁面pageSize:5// 每頁大小}},methods: {findAll(pageNum,pageSize){axios.get('/findAll',{params:{pageNum:pageNum,pageSize:pageSize}}).then(res => {if (res.code == 2000) {console.log(res.data)// 返回的是后端返回的PageInfothis.userList = res.data.listthis.total = res.data.totalthis.pageNum = res.data.pageNum}}).catch(error => {console.log('請求查詢全部報錯: ',error)})},onSubmit(){},handleSizeChange(val) { // 處理頁面大小改變時觸發this.pageSize = val;this.findAll(this.pageNum,val)},handleCurrentChange(val) {// 當前頁碼改變時觸發this.pageNum = val;this.findAll(val,this.pageSize)}},mounted() {this.findAll(1,5) // 初始時查詢,第1頁,每頁5條}
}
</script>
4.9 模糊查詢
頁面上面設置搜索和重置按鈕
js中設置事件,搜索
后端SpringBoot要設置動態sql
.data.total
this.pageNum = res.data.pageNum
}
}).catch(error => {
console.log('請求查詢全部報錯: ',error)
})
},
onSubmit(){},
handleSizeChange(val) { // 處理頁面大小改變時觸發
this.pageSize = val;
this.findAll(this.pageNum,val)
},
handleCurrentChange(val) {// 當前頁碼改變時觸發
this.pageNum = val;
this.findAll(val,this.pageSize)
}
},
mounted() {
this.findAll(1,5) // 初始時查詢,第1頁,每頁5條
}
}
## 4.9 模糊查詢頁面上面設置搜索和重置按鈕[外鏈圖片轉存中...(img-2XjszJ6V-1721010967411)]js中設置事件,搜索[外鏈圖片轉存中...(img-gBYMYmQv-1721010967411)]后端SpringBoot要設置動態sql[外鏈圖片轉存中...(img-YlU7dO6p-1721010967412)]