vue前端页面搭建

十、页面搭建学习

10.1 安装element

在这里看一下有没有elementui,有就是下载成功了。

10.2 mainjs全局引入

import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';

Vue.use(ElementUI)

10.3简单试用

运行serve

10.4页面布局

(都可以直接查看官网:https://element.eleme.cn/#/zh-CN/component/container)
再src的components下面新建一个inde.vue,把官网代码复制进来

然后将index.vue加到App.vue里面去

运行时可能会出现的错误:
vue2Component name "Index" should always be multi-word
在package.json里面找到rules或者添加rules,关闭组件驼峰命名规则

"rules": {
      "vue/multi-word-component-names": "off"
    }

运行:

10.4创建全局样式表

在assets中创建global.css

然后在main.js里面导入一下

import './assets/global.css';

10.5 将侧边栏等代码拷贝到一个单独的vue里面





太方便了把,以后要修改侧边栏就只用去到vue里面修改,我之前都是一个个页面进行修改的。。

10.6 按照需求修改一下header

主要是添加点击事件

<template>
<!--  这里要加一层div,如果不加,就有两个节点就是<eldropdown>和<span>-->
  <div style="display: flex">
<!--    菜单栏伸缩-->
    <div>
      <i class="el-icon-s-fold" style="font-size: 25px"></i>
    </div>
    <div style="flex: 1;text-align: center">
      <span>XXXX系统</span>
    </div>
    <el-dropdown>
      <span>王小虎</span>
      <i class="el-icon-setting" style="margin-right: 15px;margin-left: 10px"></i>
      <el-dropdown-menu slot="dropdown">
        <el-dropdown-item @click.native="toUser">个人中心</el-dropdown-item>
        <el-dropdown-item @click.native="logout">退出登录</el-dropdown-item>
        <el-dropdown-item>删除</el-dropdown-item>
      </el-dropdown-menu>
    </el-dropdown>
  </div>
</template>

<script>
export default {
  name: "Header",
  methods:{
    toUser(){
      console.log("点击事件toUser")
    },
    logout(){
      console.log("logout被点击")
    }
  }
}
</script>

<style scoped>

</style>

F12打开开发者工具,点击后在控制台会出现console.log里面的值

10.7侧边栏实现收缩

Header.vue

<template>
<!--  这里要加一层div,如果不加,就有两个节点就是<eldropdown>和<span>-->
  <div style="display: flex">
<!--    菜单栏伸缩-->
    <div>
      <i class="el-icon-s-fold" style="font-size: 25px" @click="collapse"></i>
    </div>
    <div style="flex: 1;text-align: center">
      <span>XXXX系统</span>
    </div>
    <el-dropdown>
      <span>王小虎</span>
      <i class="el-icon-setting" style="margin-right: 15px;margin-left: 10px"></i>
      <el-dropdown-menu slot="dropdown">
        <el-dropdown-item @click.native="toUser">个人中心</el-dropdown-item>
        <el-dropdown-item @click.native="logout">退出登录</el-dropdown-item>
        <el-dropdown-item>删除</el-dropdown-item>
      </el-dropdown-menu>
    </el-dropdown>
  </div>
</template>

<script>
export default {
  name: "Header",
  methods:{
    toUser(){
      console.log("点击事件toUser")
    },
    logout(){
      console.log("logout被点击")
    },
    //侧边栏伸缩
    collapse(){
      this.$emit('doCollapse')
    }
  }
}
</script>

<style scoped>

</style>

Index.vue

<template>
  <el-container style="height: 100%; border: 1px solid #eee">
    <el-aside :width="aside_width" style="background-color: rgb(238, 241, 246)">
      <Aside :isCollapse="isCollapse"></Aside>
    </el-aside>

    <el-container style="height: 100%;">
      <el-header  style="text-align: right; font-size: 12px">
        <Header @doCollapse="doCollapse"></Header>
      </el-header>

      <el-main>
        <Main></Main>
      </el-main>
    </el-container>
  </el-container>

</template>

<script>
import Aside from "@/components/Aside";
import Header from "@/components/Header";
import Main from "@/components/Main";
export default {
  name: "Index",
  components: {Main, Header, Aside},
  data(){
    return{
      //将值传到Aside里面去
      isCollapse: false,
      aside_width: '200px'
    }
  },
  methods:{
    doCollapse(){
      //接收Header传来的东西
      console.log("Index.vue中调用Header.ver里面提交的doCollapse")
      this.isCollapse = !this.isCollapse
      if(!this.isCollapse){
        //展开
        this.aside_width='200px'
      }else {
        //收起
        this.aside_width='64px'
      }
    }
  }
}
</script>

<style scoped>
.el-header {
  background-color: #B3C0D1;
  color: #333;
  line-height: 60px;
}

.el-aside {
  color: #333;
}
</style>

Aside.vue

<template>
  <el-menu
      background-color="#545c64"
      text-color="#fff"
      active-text-color="#ffd04b"
      default-active="/Home"
      style="height: 100vh;"
      :collapse="isCollapse"
      :collapse-transition="false"
  >
    <el-menu-item index="/Home">
      <i class="el-icon-s-home"></i>
      <span>首页</span>
    </el-menu-item>

    <el-menu-item index="/First">
      <i class="el-icon-s-flag"></i>
      <span>导航1</span>
    </el-menu-item>

    <el-menu-item index="/Second">
      <i class="el-icon-s-data"></i>
      <span>导航2</span>
    </el-menu-item>

  </el-menu>
</template>

<script>
export default {
  name: "Aside",
  data(){
    return {
      // isCollapse:false
    }
  },
  props: {
    //接收Index里面传来的东西
    isCollapse: Boolean
  }
}
</script>

<style scoped>

</style>

Main.vue

<template>
  <el-table :data="tableData">
    <el-table-column prop="date" label="日期" width="140">
    </el-table-column>
    <el-table-column prop="name" label="姓名" width="120">
    </el-table-column>
    <el-table-column prop="address" label="地址">
    </el-table-column>
  </el-table>
</template>

<script>
export default {
  name: "Main",
  data() {
    const item = {
      date: '2016-05-02',
      name: '王小虎',
      address: '上海市普陀区金沙江路 1518 弄'
    };
    return {
      tableData: Array(10).fill(item)
    }
  }
}
</script>

<style scoped>

</style>

如果想要收起来之后,触碰显示导航栏对应的名字。可以在<span></span>里面添加
<span slot="title">导航1</span>

十一、axios处理跨域

为了前端后端一起开发,vue前端端口号是8080,那我们区springboot的application.yml里面改一下端口号8090,这样子两个端口不冲突。

10.1 安装axios

npm install axios --save

在main.js全局引入axios

import axios from "axios";
Vue.prototype.$axios=axios

10.2使用

可能会出现的错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource
需要创建一个全局跨域类

package com.example.comment;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//解决跨域问题:全局跨域类
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                //是否发送Cookie
                .allowCredentials(true)
                //放行哪些原始域
                .allowedOriginPatterns("*")
                .allowedMethods(new String[]{"GET", "POST", "PUT", "DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");
    }
}

Main.vue里面:

methods:{
    myget(){
      this.$axios.get('http://localhost:8090/login00/loginAll').then(res=>{
        console.log(res.data)
      })
    },
    mypost(){
      this.$axios.post('http://localhost:8090/login00/listPageC',{}).then(res=>{
        console.log(res.data)
      })
    }
  },
  beforeMount() {
    // this.myget();
    this.mypost();
  }

从上面的代码可以看到这个网址一直重复写,可以在Main.js里面写一段这个:

Vue.prototype.$httpUrl='http://localhost:8090'

image

posted on 2024-05-29 09:49  201812  阅读(410)  评论(0编辑  收藏  举报