在之前Element组件搭建的基础上添加抽屉组件添加用户
App.vue部分:
import createRoute from '@/minixs/createRoute.js'
export default {
mixins:[createRoute],
created() {
console.log('app init')
/* 写下面代码的目的就是为了刷新页面的时候再次添加路由信息 */
/* 保证在已经把路由菜单存起来的情况下,再动态添加路由 */
if (localStorage.arrRoute) {
console.log('arrRoute')
/* 使用minixs中的添加动态路由的公共方法 */
this.createRouteFn();
}
},
};
* {
margin: 0;
padding: 0;
}
public下创建minixs文件创建createRoute.js:
export default {
methods: {
createRouteFn: function () {
let arrRoute = JSON.parse(localStorage.arrRoute);
/* 循环路由数组 动态添加路由 */
arrRoute.forEach((v) => {
/* 我们尽量使用v.children[0].path 原因是我们的路径名用的是子路由的 */
/* 如果我们直接写死v.children[0].path 会导致只有一个子路由路径被动态添加了
如果有多个,就无法生效了,所以我们要二次循环v.children,从而实现多个二级子路由
能够被动态的添加 */
v.children.forEach((r) => {
this.$router.addRoute("index", {
path: r.path,
name: r.path,
meta: {
title: v.authName,
subTitle: r.authName,
},
/* 把名字改成我们页面的名称 例如CategoriesView.vue */
component: () =>
import(
`@/views/${r.path.substring(0, 1).toUpperCase() + r.path.substring(1)
}View.vue`
),
});
});
});
}
},
}
路由router下index.js:
import Vue from 'vue'
import VueRouter from 'vue-router'
/* 点击相同的路由出现报错,使用下面的代码抛出异常 */
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err)
}
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'login',
component: () => import('../views/LoginView.vue')
},
{
path: '/index',
name: 'index',
/* 一进入index页面就默认进入二级路由users页面 */
redirect: '/index/users',
component: () => import('../views/IndexView.vue'),
children: [{
path: "users",
name: "users",
component: () => import("@/views/UsersView.vue"),
meta:{
title:"用户管理",
subTitle:"用户列表"
},
}]
},
]
const router = new VueRouter({
routes
})
export default router
LoginView.vue登录页:
import axios from 'axios'
export default {
name:"LoginView",
data() {
var checkUser = (rule, value, callback) => {
console.log('用户名:',value)
if(value.trim()==''){
callback(new Error('请输入用户名'));
}
else if(!/^[0-9a-zA-Z_\u4e00-\u9fa5]{5,10}$/.test(value)){
callback(new Error('用户名为5-10位中英文数字或者下划线'));
}
else{
callback();
}
};
var validatePass = (rule, value, callback) => {
console.log('密码:',value)
if (value.trim()=='') {
callback(new Error('请输入密码'));
}else{
callback();
}
};
return {
ruleForm: {
password: '',
username: ''
},
rules: {
password: [
{ validator: validatePass, trigger: 'blur' }
],
username: [
{ validator: checkUser, trigger: 'blur' }
]
}
};
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
/* el-form组件的validate方法 在回调函数中
如果valid为true 则表示表单校验通过
为false则表示不通过 */
if (valid) {
axios.post('https://lia**********',{
username:this.ruleForm.username,
password:this.ruleForm.password
})
.then(res=>{
let {data,meta} = res.data;
if(meta.status==200){
this.$message.success(meta.msg);
/* 当登录成功 把用户名和token存入本地缓存中方便后续使用 */
localStorage.username = data.username;
localStorage.token = data.token;
/* 登录成功后,过一秒跳转首页 */
setTimeout(()=>{
this.$router.push({name:'index'})
},1000)
}else{
/* 用户名密码不正确的时候出现警告 */
this.$message.warning(meta.msg);
}
})
.catch(err=>{
console.log(err)
})
} else {
this.$message.error('您输入的有误');
}
});
},
resetForm(formName) {
/* 通过vue中的$refs方法来调用组件el-form中的resetFields方法 实现重置 */
this.$refs[formName].resetFields();
}
}
}
.myform{
width:600px;
margin:50px auto;
}
用户UsersView.vue:
>添加用户
>
title="添加用户" :visible.sync="drawer" :direction="direction" :wrapperClosable="false" >
import AddUsers from '@/components/AddUsers.vue'
import axios from "axios";
export default {
name:"UsersView",
components:{
AddUsers
},
data() {
return {
/* 表格数据 */
tableData: [],
/* 抽屉打开方向从右到左 */
direction: "rtl",
/* 默认抽屉是关闭的 */
drawer: false,
};
},
/* 局部的过滤器 */
// filters:{
// getDate(v){
// /* 生成当前时间戳的日期对象 */
// let oDate = new Date(v);
// return oDate.getFullYear()+'-'+(oDate.getMonth()+1)+'-'+oDate.getDate();
// }
// },
created() {
/* 一进入页面调用获取用户数据接口 */
this.getTableDate();
},
methods: {
/* 当子组件添加数据成功的时候触发的方法 */
addok(){
/* 重新获取用户数据 */
this.getTableDate();
/* 关闭抽屉 */
setTimeout(()=>{
this.drawer = false;
},600)
},
getTableDate() {
axios
.get("https://lia*******************", {
/* 请求头 */
headers: {
Authorization: localStorage.token,
},
/* 必传的请求参数 */
params: {
pagenum: 1,
pagesize: 20,
},
})
.then((res) => {
let { data, meta } = res.data;
/* 当状态为200表示数据获取成功 */
if (meta.status == 200) {
/* 把数据给到tableData数组中 */
this.tableData = data.users;
} else {
/* 如果获取数据有误,给出相应提示 */
this.$message.error(meta.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
},
},
};
components创建AddUsers.vue:
:model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" > >立即添加 >
import axios from 'axios'
export default {
data() {
return {
ruleForm: {
username: "",
password: "",
email:"",
mobile:""
},
rules: {
username: [
{ required: true, message: "请输入用户名称", trigger: "blur" },
{ min: 3, max: 12, message: "长度在 3 到 12 个字符", trigger: "blur" },
],
password: [
{ required: true, message: "请输入用户密码", trigger: "blur" },
{ min: 3, max: 12, message: "长度在 3 到 12 个字符", trigger: "blur" },
],
},
};
},
methods: {
submitForm(formName) {
this.$refs[formName].validate((valid) => {
if (valid) {
axios({
method:'post',
url: ' https://lia********************** ',
data:{
username:this.ruleForm.username,
password:this.ruleForm.password,
email:this.ruleForm.email,
mobile:this.ruleForm.mobile,
},
headers: {
Authorization: localStorage.token,
},
})
.then(res=>{
let {meta} = res.data;
if(meta.status==201){
this.$message.success(meta.msg);
this.$emit('addok')
}else{
this.$message.error(meta.msg);
}
})
} else {
this.$message.error("校验失败,请重试");
return false;
}
});
},
resetForm(formName) {
this.$refs[formName].resetFields();
},
},
};
.add-users {
padding: 20px;
}
main.js部分:
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
Vue.config.productionTip = false
/* 全局的日期过滤器 */
function bu(v) {
return v < 10 ? '0' + v : v
}
Vue.filter('getDate',(v)=>{
/* 生成当前时间戳的日期对象 */
let oDate = new Date(v);
return bu(oDate.getFullYear())+'-'+bu(oDate.getMonth()+1)+'-'+bu(oDate.getDate());
})
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')