安装
我使用的是 vue-cli 初始化项目,命令如下:
npm i -g vue-cli mkdir my-project && cd my-project vue init webpack
修改 package.json 文件:
...
"dependencies": {
"vue": "^2.5.2",
"vue-router": "^3.0.1",
"element-ui": "^2.0.7", // element-ui
"axios": "^0.17.1" // http 请求库
}
...
之后执行 npm install 进行安装依赖,如果安装速度有点慢的话,可以试一下 cnpm ,具体安装和用法自行查找。
简单介绍下项目的目录结构:
├─build // 构建配置 ├─config // 配置文件 ├─src // vue 开发源文件目录 ├────assets // css/js 文件 ├────components // vue 组件 ├────router // 路由 ├────App.vue // 启动组件 ├────main.js // 入口文件 ├─static // 静态文件目录 ├─test // 测试目录
之后在项目根目录执行 npm run dev ,打开浏览器输入 http://localhost:8080 就可以查看了。
目标
- 登录页面,登录,退出功能
- 首页,调用接口渲染列表
路由
路由使用的是 vue-router,具体用法可参考 官方文档
我们这里需要两个路由:
src/router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import Index from '@/components/Index'
import Login from '@/components/Login'
Vue.use(Router)
const routers = new Router({
routes: [
{
path: '/index',
name: 'index',
component: Index
},
{
path: '/login',
name: 'login',
component: Login
}
]
})
routers.beforeEach((to, from, next) => {
if (to.name !== 'login' && !localStorage.getItem('token')) {
next({path: 'login'})
} else {
next()
}
})
export default routers
登录页面
src/components/Login.vue
<template>
<div class="login">
<el-form name="aa" :inline="true" label-position="right" label-width="80px">
<el-form-item label="用户名">
<el-input v-model="user.name"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input type="password" v-model="user.password"></el-input>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" @click="login()">登录</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import $http from '@/api/'
import config from '@/config'
export default {
data () {
return {
user: {
name: '',
password: ''
}
}
},
mounted: function () {
var token = localStorage.getItem('token')
if (token) {
this.$router.push('/index')
}
},
methods: {
login: function () {
var data = {
grant_type: 'password',
client_id: config.oauth_client_id,
client_secret: config.oauth_secret,
username: this.user.name,
password: this.user.password
}
var _this = this
$http.login(data).then(function (res) {
if (res.status === 200) {
$http.setToken(res.data.access_token)
_this.$message({
showClose: false,
message: '登录成功',
type: 'success'
})
_this.$router.push('/index')
} else {
_this.$message({
showClose: false,
message: '登录失败',
type: 'error'
})
}
})
}
}
}
</script>
<style>
.login{
width: 300px;
margin: 100px auto;
background-color: #ffffff;
padding: 30px 30px 5px;
border-radius: 5px;
}
</style>
首页
src/components/Index.vue
<template>
<div class="main">
<el-table
stripe
v-loading="loading"
element-loading-background="#dddddd"
:data="tableData"
style="width: 100%">
<el-table-column
prop="id"
label="ID">
</el-table-column>
<el-table-column
prop="name"
label="名称">
</el-table-column>
</el-table>
<el-pagination
background
layout="prev, pager, next"
:total="total"
class="page"
@current-change="pageList">
</el-pagination>
</div>
</template>
<script>
import $http from '@/api/'
export default {
data () {
return {
tableData: [],
total: 0,
loading: false
}
},
mounted: function () {
this.getList()
},
methods: {
pageList: function (page) {
this.search.page = page
this.getList()
},
getList: function () {
var _this = this
_this.loading = true
$http.index().then(function (res) {
if (res.status === 200) {
_this.tableData = res.data.data.lists
_this.total = res.data.data.total
}
_this.loading = false
})
}
}
}
</script>
App
src/App.vue
<template>
<div id="app">
<el-row v-if="token">
<menus class="left-menu">
<h3 class="logo"><a href="/" rel="external nofollow" >Admin</a></h3>
</menus>
<el-col :span="21" :gutter="0" :offset="3">
<el-breadcrumb separator-class="el-icon-arrow-right" class="breadcrumb">
<el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
<el-breadcrumb-item class="active">列表</el-breadcrumb-item>
</el-breadcrumb>
<el-dropdown @command="operate" class="header">
<img src="/UploadFiles/2021-04-02/head.jpg">
import axios from 'axios'
axios.defaults.baseURL = 'http://localhost:8000/'
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
axios.defaults.headers.common['Authorization'] = 'Bearer ' + localStorage.getItem('token')
export default {
setToken: function (token) {
localStorage.setItem('token', token)
axios.defaults.headers.common['Authorization'] = 'Bearer ' + token
},
login: function (param) {
return axios.post('oauth/token', param)
},
index: function (params) {
return axios.get('api/user/list', {
params: params
})
}
}
config
src/config.js 这里配置登录 oauth 需要的 client_id 和 secret
export default {
oauth_client_id: 2,
oauth_secret: ''
}
main.js
src/main.js
import Vue from 'vue'
import App from './App'
import router from './router'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
Vue.config.productionTip = false
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})
api 接口
主要用到两个接口,一个是 api/oauth/token 登录获取 token 接口,一个获取列表 api/user/list。
第一个接口是用到 laravel oauth,第二个接口直接是一个简单的查询用户列表接口,详细讲会在下一篇文章中讲述。
以上就是本次整理的关于Vue Elememt-UI构建管理后台的全部内容,感谢大家对的支持。
Vue,Elememt-UI
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]