vue2 项目25
app.js:
<template> <div id="app"> <router-view></router-view> </div> </template> <style lang="less"> body, html { margin: 0; padding: 0; height: 100%; width: 100%; } [v-cloak]{ display: none; } #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; height: 100%; width: 100%; } nav { padding: 30px; a { font-weight: bold; color: #2c3e50; &.router-link-exact-active { color: #42b983; } } } </style>
mylogin:
<template> <div id="login"> <div class="middle"> <el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="50px" class="demo-ruleForm"> <el-form-item prop="email" label="邮箱" :rules="[ { required: true, message: '请输入邮箱地址', trigger: 'blur' }, { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] } ]"> <el-input v-model.trim="ruleForm.email"></el-input> </el-form-item> <el-form-item label="密码" prop="pass"> <el-input type="password" v-model.trim="ruleForm.pass" autocomplete="off"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm('ruleForm')">登录</el-button> <el-button @click="resetForm('ruleForm')">重置</el-button> </el-form-item> </el-form> </div> </div> </template> <script> export default { data() { var validatePass = (rule, value, callback) => { if (value === '') { callback(new Error('请输入密码')); } else { if (this.ruleForm.checkPass !== '') { this.$refs.ruleForm.validateField('checkPass'); } callback(); } }; return { ruleForm: { pass: '', email: '' }, rules: { pass: [ { validator: validatePass, trigger: 'blur' } ] } }; }, methods: { submitForm(formName) { console.log(formName); this.$refs[formName].validate((valid) => { if (valid) { console.log(valid); if (this.ruleForm.email === '111@qq.com' && this.ruleForm.pass === '123') { // 登录成功 // 1. 存储 token localStorage.setItem('token', 'Bearer xxxx') // 2. 跳转到后台主页 this.$router.push('/home') } else { alert('error submit!!'); localStorage.removeItem('token') } } else { alert('error submit!!'); return false; } }); }, resetForm(formName) { this.$refs[formName].resetFields(); } } } </script> <style lang="less" scoped> #login { width: 100%; height: 100%; background-image: linear-gradient(to right, #fbc2eb, #a6c1ee); position: absolute; top: 50%; left: 48.9%; -webkit-transform: translate(-50%,-50%); transform: translate(-50%,-50%); padding: 0 20px; max-width: 100%; } .middle{ width: 40%; margin: auto; .demo-ruleForm{ margin: 25%; margin-top: 50%; } } </style>
HomeView:
<template> <div class="home"> <Header></Header> <div class="Side"> <Side></Side> <div class="side-router"> <router-view></router-view> </div> </div> </div> </template> <script> import Header from '../components/Header.vue' import Side from '../components/Side.vue' export default { components: { Header, Side } } </script> <style lang="less" scoped> .home{ height: 100%; display: flex; flex-direction: column; } .Side{ height: 100%; display: flex; .side-router{ padding: 15px; flex: 1; } } </style>
路由--index:
import Vue from 'vue' import VueRouter from 'vue-router' import myLogin from '../views/myLogin.vue' import pathArr from '@/router/pathArr.js' Vue.use(VueRouter) const router = new VueRouter({ routes: [ { path: '/', redirect: '/login' }, // 登录的路由规则 { path: '/login', component: myLogin }, { path: '/home', name: 'home', component: () => import('../views/HomeView.vue'), redirect: '/home/users', children: [ { path: 'users', name: 'users', component: () => import('../components/side/MyUsers.vue') }, { path: 'rights', component: () => import('../components/side/MyRights.vue') }, { path: 'goods', component: () => import('../components/side/MyGoods.vue') }, { path: 'orders', component: () => import('../components/side/MyOrders.vue') }, { path: 'settings', component: () => import('../components/side/MySettings.vue') }, // 用户详情页 { path: 'userinfo/:id', component: () => import('../components/side/user/info.vue'), props: true } ] } ] }) // 全局前置守卫 router.beforeEach(function (to, from, next) { if (pathArr.indexOf(to.path) !== -1) { const token = localStorage.getItem('token') if (token) { next() } else { next('/login') } } else { next() } }) export default router
patharr.js:
export default ['/home', '/home/users', '/home/rights', '/home/goods', '/home/settings', '/home/orders']
组件页面:
MyUsers:
<template> <div> <template> <el-table :data="tableData" height="100%" border style="width: 100%"> <el-table-column prop="date" label="日期" width="180"> </el-table-column> <el-table-column prop="name" label="姓名" width="180"> </el-table-column> <el-table-column prop="address" label="地址"> </el-table-column> <el-table-column label="操作" prop="id"> <!-- 获取id prop="id"--> <template slot-scope="scope"> <!-- 传递id scope.row.id--> <div @click.prevent="operation(scope.row.id)"> 详情 </div> </template> </el-table-column> </el-table> </template> </div> </template> <script> export default { name: 'MyUser', data() { return { tableData: [{ id: 1, date: '2016-05-02', name: '王小虎', address: '上海市普陀区金沙江路 1518 弄' }, { id: 2, date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄' }, { id: 3, date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄' }, { id: 4, date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄' }, { id: 5, date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄' }, { id: 6, date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄' }, { id: 7, date: '2016-05-04', name: '王小虎', address: '上海市普陀区金沙江路 1517 弄' }] } }, methods: { gotoDetail(id) { // /home/userinfo/1 // /home/userinfo/2 // /home/userinfo/3 this.$router.push('/home/userinfo/' + id) }, operation(id) { // console.log('ok'); this.$router.push('/home/userinfo/' + id) } } } </script> <style lang="less" scoped> </style>
MySettings:
<template> <h4 class="text-center">系统设置</h4> </template> <script> export default { name: 'MySettings' } </script> <style lang="less" scoped> </style>
MyRights:
<template> <h4 class="text-center">权限管理</h4> </template> <script> export default { name: 'MyRights' } </script> <style lang="less" scoped> </style>
MyOrders:
<template> <h4 class="text-center">订单管理</h4> </template> <script> export default { name: 'MyOrders' } </script> <style lang="less" scoped> </style>
MyGoods:
<template> <h4 class="text-center">商品管理</h4> </template> <script> export default { name: 'MyGoods' } </script> <style lang="less" scoped> </style>
Header:
<template> <div class="header"> <div class="header_com"> <el-row> <el-col :span="12"> <div class="grid-content bg-purple"> <el-image style="width: 50px; height: 50px; display:flex;margin-top: 5px;" :src="url"> </el-image> <p>后台管理系统</p> </div> </el-col> <el-col :span="12"> <div class="grid-content bg-purple-light" @click="Logout">退出登录</div> </el-col> </el-row> </div> </div> </template> <script> export default { data() { return { url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg' } }, methods: { Logout() { localStorage.removeItem('token') this.$router.push('/login') } } } </script> <style lang="less" scoped> .header { width: 100%; height: 60px; line-height: 60px; background: #545c64; .header_com { width: 90%; margin: auto; line-height: 60px; .bg-purple { display: flex; p { padding-left: 20px; line-height: 30px; color: #fff; } } .bg-purple-light { display: flex; justify-content: flex-end; color: #fff; } } } </style>
Side:
<template> <div class="side"> <el-row class="tac"> <el-col :span="12"> <el-menu default-active="2" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b"> <router-link to="/home/users"> <el-submenu index="1"> <template slot="title"> <i class="el-icon-user-solid"></i> 用户管理 </template> <el-menu-item-group> <template slot="title">分组一</template> <el-menu-item index="1-1">选项1</el-menu-item> <el-menu-item index="1-2">选项2</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组2"> <el-menu-item index="1-3">选项3</el-menu-item> </el-menu-item-group> <el-submenu index="1-4"> <template slot="title">选项4</template> <el-menu-item index="1-4-1">选项1</el-menu-item> </el-submenu> </el-submenu> </router-link> <router-link to="/home/rights"> <el-menu-item index="2"> <i class="el-icon-menu"></i> 权限管理 </el-menu-item> </router-link> <router-link to="/home/goods"> <el-menu-item index="3"> <i class="el-icon-document"></i> 商品管理 </el-menu-item> </router-link> <router-link to="/home/orders"> <el-menu-item index="4"> <i class="el-icon-edit-outline"></i> 订单管理 </el-menu-item> </router-link> <router-link to="/home/settings"> <el-menu-item index="5"> <i class="el-icon-setting"></i> 系统设置 </el-menu-item> </router-link> </el-menu> </el-col> </el-row> </div> </template> <script> export default { methods: { handleOpen(key, keyPath) { console.log(key, keyPath); }, handleClose(key, keyPath) { console.log(key, keyPath); } } } </script> <style lang="less" scoped> a { text-decoration: none; } .side { width: 220px; height: 100%; background: #545c64; .el-menu { border-right: none } } .el-menu-vertical-demo { width: 218px; } </style>
info:
<template> <div> <h4 class="text-center">用户详情页 ———————— {{ id }}</h4> <button @click="$router.back()">后退</button> </div> </template> <script> export default { name: 'Myinfo', props: ['id'] } </script> <style lang="less" scoped> </style>
main:
import Vue from 'vue' import App from './App.vue' 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({ router, render: h => h(App) }).$mount('#app')
.eslintrc.js:
module.exports = { root: true, env: { node: true }, extends: [ 'plugin:vue/essential', '@vue/standard' ], parserOptions: { parser: '@babel/eslint-parser' }, rules: { 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', // 在方法的形参()之前,是否加上空格 "space-before-function-paren": ["warn", "never"], // 组件名字检测 "vue/multi-word-component-names": "off", // 关闭空格检测 "indent": 0, 'semi':0 } }
代码改变了我们,也改变了世界