springboot+vue/elementUi 项目,搭建,使用

前端基础:

vuecli官方搭建教程
vue教程

总体相关配置与引入(如若未配置引入。install以后直接使用即可)

import Vue from 'vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import App from './App.vue';
import '@/assets/common.css'
import './assets/iconfont.css'
Vue.use(ElementUI,{ size:"small"});
Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

iconfont整合elementui

axios:

引入axios:

axios引入与相关使用
使用教程推荐

request.js配置:

import axios from 'axios'
// 这份文件就是用来做拦截的

// 创建一个单例(实例)
const instance = axios.create({
    baseURL: 'http://localhost:8086',
    timeout: 4000
})

// 拦截器 - 请求拦截
instance.interceptors.request.use(config=>{
    // 部分接口需要拿到token
    let token = localStorage.getItem('token');
    if(token){
        config.headers = {
            'aa-token': token
        }
    }
    return config;
}, err=>{
    return Promise.reject(err)
});


// 拦截器 - 响应拦截
instance.interceptors.response.use(res=>{
    return res;
}, err=>{
    return Promise.reject(err)
});

// 整体导出
export default instance;

api配置

import request from './request'

// 登录
// export const PostLoginAPI = (params) => request.post('/auth/loginByWeb', params);
//删除
export const deleteById = (id) => request.delete(`/api/test/${id}`)
// export const deleteById = (params) => request.delete('/api/test',{params}) must be an object
// 分页查询
export const getMemberList = (params) => request.get('/api/test/page',{params});
// 登录校验
export const validateUser = (params) => request.post('/api/test/validate',params);
// 注册 +修改
export const saveOrUpdate = (params) => request.put('/api/test/saveOrUpdate',params);
//deleteFile
export const deleteFile = (name) => request.delete(`/api/common/delete?name=${name}`)
//状态更改
export const userStatusByStatus = (params) => request.post(`/api/test/status?id=${params.id}&status=${params.status}`)

使用

import {deleteById} from '@/api/xxx.js'

vux安装与使用

安装:

    [vuex安装](http://www.45fan.com/article.php?aid=1D5wU4WMsY4h2rlF)

用法:

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
    state: {
        currentPathName: '',
		userId: '',
		userName: '',
		avatarUrl: ''
    },
    mutations: {
        setPath (state,payload) {
            state.currentPathName = payload;
        },
		setUser (state,payload) {
			console.log("调用了vuex"+payload.image)
		    state.userId = payload.id
		    state.userName = payload.username
		    state.avatarUrl = payload.image
		},
    }
})

export default store

vue router

路由守卫
无限死循环

用法配置:

import Vue from 'vue'
import VueRouter from 'vue-router'
// import Activity from '../views/Activity.vue'
import Home from '../views/Home.vue'
// import Share from '../views/Share.vue'
Vue.use(VueRouter)

const routes = [
  { path: "/", redirect: "/login" },
  {
	  path: '/login',
	  name: 'login',
	  component: () => import('@/views/Login.vue')
  },
  {
	  path: '/register',
	  name: 'register',
	  meta: { title: '注册', icon: 'index', affix: true, noCache: true },
	  component: () => import('@/views/Register.vue')
  },
  {
	  path: '/home',
	  name: 'home',
	  component: Home,
	 //  children:[
	 //  	{
	 //  		path:'user',
	 //  		component: () => import('@/views/UserShow.vue')
	 //  	},
		
		// {
		//   path: 'share',
		//   name: 'share',
		//   component: Share
		// },
	 //    {
		//   path: 'activity',
		//   name: 'activity',
		//   component: Activity
	 //    },
		// {
		//   path: 'usermannage',
		//   name: 'usermannage',
		//   component: () => import('@/views/UserMannage.vue')
		// },
		// {
		//   path: 'add',
		//   name: 'add',
		//   component: () => import('@/views/operation/Add.vue')
		// },
		// {
		//   path: 'test',
		//   name: 'test',
		//   component: ()=> import('@/views/Test.vue')
		// }
		// ]
  },
  {
    path: '/404',
    name: 'NotFound',
    component: () => import('@/views/features/404.vue')
  },
  // 所有未定义路由,全部重定向到404页
  {
    path: '*',
    redirect: '/404'
  },
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})
router.beforeEach((to, from, next) => {
  localStorage.setItem("currentPathName", to.name)  // 设置当前的路由名称
  const user = localStorage.getItem("user")
  console.log(user)
  console.log(to.name)
  if(to.fullPath === '/login'){
	  next()
  }
  else if(user){
	next()
  }else{
	next('/login')
  }
  // 其他的
})
export default router

js操作Json与local Storage

有时候我们想要将一个JSON对象数据存储到localStorage中,但普通的存储肯定是不行的,因为localStorage只能存储字符串数据。
参考文档
示例

	  created() {
		  this.admin = JSON.parse(localStorage.getItem("user"))
		  console.log("admin:")
		  console.log(this.admin["avatar"])
	  },

主体代码:

登录:

代码:

<template>
  <div class="login" id="login-app">
    <div class="login-box">
      <img src="@/assets/login/login-l.png" alt="">
      <div class="login-form">
        <el-form ref="userForm" :model="user" :rules="rules" >
          <div class="login-form-title">
            <img src="@/assets/login/logo.png" style="width:170px;height:170px;" alt="" />
          </div>
          <el-form-item prop="username">
            <el-input v-model="user.username" type="text" auto-complete="off" placeholder="账号" maxlength="20"
                      prefix-icon="el-icon-user" />
          </el-form-item>
          <el-form-item prop="password">
            <el-input v-model="user.password" type="password" placeholder="密码" prefix-icon="el-icon-lock"
					  maxlength="20"
					  show-password
                      @keyup.enter.native="login" />
          </el-form-item>
          <el-form-item style="width:100%;" class="all_btn">
			 <div style="text-align:center">
				<el-button :loading="loading" class="login-btn" size="small" type="primary"
						@click.native.prevent="login" round>
				<span v-if="!loading">登录</span>
				<span v-else>登录中...</span>
				</el-button>                   
			 </div>
			 <div style="text-align:center">
				<el-button type="primary" style="margin-left: auto" size="small"
				  class="login-btn" autocomplete="off" @click="$router.push('/register')" round>注册</el-button>
			 </div>
		  </el-form-item>
        </el-form>
      </div>
    </div>
  </div>
</template>

<script>
import {validateUser} from '@/api/administrator.js'

export default {
  name: "Login",
  data() {
    return {
      user: {
		  username: 'admin',
		  password: '123'
	  },
      loading: false,
	  code: 0,
      rules: {
        username: [
          {required: true, message: '请输入用户名', trigger: 'blur'},
          {min: 3, max: 10, message: '长度在 3 到 5 个字符', trigger: 'blur'}
        ],
        password: [
          {required: true, message: '请输入密码', trigger: 'blur'},
          {min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur'}
        ],
      }
    }
  },
  methods: {
	login(formName){
		  this.$refs.userForm.validate(async (valid) =>{
			  if(valid){
				await validateUser(this.user).then(res => {
					this.code = res.data.code
					if(this.code == '1'){
						this.loading = true
						localStorage.setItem("user", JSON.stringify(res.data.user))  // 存储用户信息到浏览器
						// localStorage.setItem("menus", JSON.stringify(res.data.menus))  // 存储用户信息到浏览器
						console.log(res.data.user)
						this.$router.push('/home')
						this.$message.success({message:'登陆成功'})
					}
					else{
						this.loading = false
						this.$message.error('账号或密码错误')
					}
				}).catch(err =>{
					this.$message.error('请求出错了:'+err)
				})
		  }
		})
		}
	}	
}
</script>

<style>
  .login {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    background-color: #333;
  }
  .login-box {
    width: 900px;
    height: 450px;
    border-radius: 8px;
    display: flex;
  }

  .login-box img {
    width: 60%;
    height: auto;
  }

  .title {
    margin: 0px auto 30px auto;
    text-align: center;
    color: #707070;
  }
  .login-form {
    background: #ffffff;
    width: 40%;
    border-radius: 0px 8px 8px 0px;
    display: flex;
    justify-content: center;
    align-items: center;
  }
  .login-form .el-form {
    width: 250px;
    height: 350px;
  }
  .login-form .el-form-item {
    margin-bottom: 30px;
  }
  .login-form .el-form-item.is-error .el-input__inner {
    border: 0 !important;
    border-bottom: 1px solid #fd7065 !important;
    background: #fff !important;
  }
  .login-form .input-icon {
    height: 32px;
    width: 18px;
    margin-left: -2px;
  }
  .login-form .el-input__inner {
    border: 0;
    border-bottom: 1px solid #e9e9e8;
    border-radius: 0;
    font-size: 15px;
    font-weight: 400;
    color: #4a4a4a;
    height: 32px;
    line-height: 32px;
  }
  .login-form .el-input__prefix {
    left: 0;
  }
  .login-form .el-input--prefix .el-input__inner {
    padding-left: 26px;
  }
  .login-form .el-input__inner::placeholder {
    color: #aeb5c4;
  }
  .login-form .el-form-item--medium .el-form-item__content {
    line-height: 32px;
  }
  .login-form .el-input--medium .el-input__icon {
    line-height: 32px;
  }
 .all_btn{
	 margin-top: 0;
  }

  .login-form-title {
    height: 36px;
    display: flex;
    justify-content: center;
	/* 居中 */
    align-items: center;
    margin-bottom: 40px;
  }
  .login-form-title .title-label {
    font-weight: 500;
    font-size: 20px;
    color: #333333;
    margin-left: 10px;
  }

</style>

注册:

<template>
  <div class="wrapper">
    <div style="margin: 100px auto; background-color: #fff; width: 400px; height: 500px; padding: 20px; border-radius: 10px">
      <div style="margin: 20px 0; text-align: center; font-size: 24px"><b>注 册</b></div>
      <el-form :model="user" :rules="rules" ref="userForm">
        <el-form-item prop="username">
          <el-input placeholder="请输入账号" size="medium" style="margin: 5px 0" prefix-icon="el-icon-user" v-model="user.username"></el-input>
        </el-form-item>
        <el-form-item prop="password">
          <el-input placeholder="请输入密码" size="medium" style="margin: 5px 0" prefix-icon="el-icon-lock" show-password v-model="user.password"></el-input>
        </el-form-item>
        <el-form-item prop="confirmPassword">
          <el-input placeholder="请确认密码" size="medium" style="margin: 5px 0" prefix-icon="el-icon-lock" show-password v-model="user.confirmPassword"></el-input>
        </el-form-item>
        <el-form-item >
			<div style="text-align: center;">
				<el-button class="login-btn" type="primary" native-type="submit" size="small"
				  autocomplete="off" @click.native.prevent="register" round>注册</el-button>
			</div>
			<div style="text-align: center;">
				<el-button class="login-btn" type="primary" size="small"
				  autocomplete="off" @click="$router.push('/')" round>返回登录</el-button>
			</div>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>

<script>
	import {saveOrUpdate} from '../api/administrator.js'
export default {
  name: "Login",
  data() {
    return {
      user: {},
      rules: {
        username: [
          { required: true, message: '请输入用户名', trigger: 'blur' },
          { min: 3, max: 10, message: '长度在 3 到 5 个字符', trigger: 'blur' }
        ],
        password: [
          { required: true, message: '请输入密码', trigger: 'blur' },
          { min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur' }
        ],
        confirmPassword: [
          { required: true, message: '请输入密码', trigger: 'blur' },
          { min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur' }
        ],
      }
    }
  },
  methods: {
    register() {
      this.$refs['userForm'].validate(async (valid) => {
        if (valid) {  // 表单校验合法
          if (this.user.password !== this.user.confirmPassword) {
            this.$message.error("两次输入的密码不一致")
            return false
          }
          await saveOrUpdate(this.user).then(res => {
			  if(JSON.stringify(res.data) != '0'){
				  this.$message.success("注册成功!")
			  }
			  else{
				  this.$message.error("用户名已存在!")
			  }
          }).catch(err =>{
			  this.$message.error('请求出错了:'+err)
		  })
        }
      });
    }
  },
  watch:{
	  user(newVal,oldVal){
		  console.log(newVal.username+"----"+oldVal.username)
	  }
  }
}
</script>

<style scoped>
  .wrapper {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    background-color: #333;
  }
</style>
posted @ 2023-04-03 20:34  superJxt  阅读(168)  评论(0)    收藏  举报