【Java-SpringBoot+Vue+MySql】Day5-前端进阶

目录

一、Axios网络请求

 中文文档:

 安装:

 导入:

使用方法:

基本语法:

 生命周期函数:

二、前端路由VueRouter

视频:12.前端路由VueRouter_哔哩哔哩_bilibili

安装:

声明路由链接和占位标签

 创建路由模块

 路由重定向

 动态路由

路由守卫

参考文档:

三、状态管理VueX

视频:13.状态管理VueX_哔哩哔哩_bilibili

State 

Getter

 Mutation

参考文档:

四、前端数据模拟MockJS

视频:14.前端数据模拟MockJS_哔哩哔哩_bilibili

参考文档:

五、JWT跨域认证

视频:16.JWT跨域认证_哔哩哔哩_bilibili

pom.xml

 JwtUtils类

Result类

ResultCode接口类

UserController类

参考文档:

六、后台前端解决方案

官网文档:介绍 | vue-element-admin

七、部署

视频:18.阿里云服务器使用_哔哩哔哩_bilibili

参考文档:



一、Axios网络请求

 中文文档:

起步 | Axios 中文文档 | Axios 中文网

 安装:

npm install axios

 导入:

可以在任意组件中通过import导入。

import axios from 'axios'

使用方法:

基本语法:

 

 

 

 生命周期函数:

每个组件都有生命周期,同时也有生命周期函数,这些函数在script中是与data、method同级的。created()(组件创建时调用)

  created:function(){
    console.log("Vue组件被创建!");
  },

在每个组件里写一个created函数,打开网页控制台,可以看到(在组件创建时)打印出每个组件里的消息。

 mounted()(组件挂载时调用)

  mounted:function(){
    console.log("Vue组件挂载完毕!");
  },

注意前后端同时启动时不能占用同一个端口!!!

 前端默认占用8080端口,

那么我们将后端端口改为8088

这样就可以同时启动了。

 访问浏览器

 http://localhost:8088/user/findAll

可以看到后端传递来的数据

 前端在created函数里使用axios接收后端网络请求:

Table.vue

  import axios from "axios"
created:function(){
        axios.get("http://localhost:8088/user/findAll").then(function(response){//回调函数
            console.log(response)
        })
      },

但是访问会发生错误 :

……has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

这就是跨域问题导致的。

 

 

 

 

 

 

解决跨域问题直接在SpringBoot的控制器中加上注解:@CrossOrigin

或者在配置包里创建配置类实现全局可跨域

 重启后端,刷新前端,我们拿到了正常的从后端传递来的数据

 将返回的data渲染到界面

将response.data传给script模块中的data

使用箭头函数继承了父级的作用域

Table.vue 

<template>
    <el-table
      :data="tableData"
      style="width: 100%"
      max-height="250">
     
      <el-table-column
        prop="birthday"
        label="出生日期"
        width="300">
      </el-table-column>

  

      <el-table-column
        prop="username"
        label="用户名"
        width="300">
      </el-table-column>

      <el-table-column
        prop="password"
        label="用户密码"
        width="300">
      </el-table-column>

      <el-table-column
        fixed
        prop="id"
        label="用户ID"
        width="100">
      </el-table-column>

      <el-table-column
        fixed="right"
        label="操作"
        width="120">
        
          <el-button
            @click.native.prevent="play()"
            type="text"
            size="small">
            详情
          </el-button>
        
      </el-table-column>
    </el-table>
  </template>
  


  <script>

import axios from "axios"

    export default {
      methods: {
        play(){
          alert("^V^")
        }
      },
      created:function(){
        axios.get("http://localhost:8088/user/findAll").then((response)=>{//回调函数
            this.tableData = response.data
        })
      },
      data() {
        
        return {
          value: null,
          texts:['1分','2分','3分','4分','5分',],
          tableData: []
        }
      }
    }
  </script>

 

 main.js

import axios from 'axios'//导入

axios.defaults.baseURL="http://localhost:8088"//设置后端接口

Vue.prototype.$http = axios//定义属性$http并挂载到Vue

Table.vue修改部分

 created:function(){
        this.$http.get("/user/findAll").then((response)=>{//回调函数
            this.tableData = response.data
        })
      },

效果不变:

二、前端路由VueRouter

视频:12.前端路由VueRouter_哔哩哔哩_bilibili

 Vue路由vue-router是官方的路由插件,能够轻松的管理 SPA 项目中组件的切换。 Vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。

通过路由,我们可以给组件设置不同的路径来进行访问。

官网:Vue Router

安装:

vue2使用@3,vue3使用@4

npm install vue-router@3

在项目中定义 Discover.vue、Friends.vue、My.vue 三个组件,将来要使用 vue-router 来控制它们的
展示与切换:

Discover.vue:

<template>
    <div>
        <h1>
            发现
        </h1>
    </div>
</template>

Friends.vue:

<template>
    <div>
        <h1>
            关注
        </h1>
    </div>
</template>

My.vue:

<template>
    <div>
        <h1>
            我的
        </h1>
    </div>
</template>

声明路由链接和占位标签


可以使用 <router-link> 标签来声明路由链接,并使用 <router-view> 标签来声明路由占位符。示例
代码如下:
App.vue:

<template>
<div>
<h1>APP组件</h1>
<!-- 声明路由链接 -->
<router-link to="/discover">发现音乐</router-link>
<router-link to="/my">我的音乐</router-link>
<router-link to="/friends">关注</router-link>
<!-- 声明路由占位标签 -->
<router-view></router-view>
</div>
</template>

 创建路由模块


在项目中创建 index.js 路由模块,加入以下代码:

import VueRouter from 'vue-router'
import Vue from 'vue'
import Discover from '@/components/Discover.vue'
import Friends from '@/components/Friends.vue'
import My from '@/components/My.vue'
//将VueRouter设置为Vue的插件
Vue.use(VueRouter)

const router = new VueRouter({
    // 指定hash属性与组件的对应关系
    routes: [
    { path: '/discover', component: Discover },
    { path: '/friends', component: Friends },
    { path: '/my', component: My },
    ]
    })
    export default router//导出

在index.js导出后,在main.js里进行导入

import Vue from 'vue'
import App from './App.vue'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import 'font-awesome/css/font-awesome.min.css';
import axios from 'axios'//导入
import router from './router'//index.js默认导入,其他名字要补全


axios.defaults.baseURL="http://localhost:8088"//设置后端接口

Vue.prototype.$http = axios//定义属性$http并挂载到Vue

Vue.config.productionTip = false
Vue.use(ElementUI);

new Vue({
  render: h => h(App),
  router//等价于 router:router,因为属性名和值相同
}).$mount('#app')

 启动项目可以看到通过点击链接可以调用不同的路由组件的页面

http://localhost:8080/#/discover

 路由重定向


路由重定向指的是:用户在访问地址 A 的时候,强制用户跳转到地址 C ,从而展示特定的组件页面。通过路由规则的 redirect 属性,指定一个新的路由地址,可以很方便地设置路由的重定向:

import VueRouter from 'vue-router'
import Vue from 'vue'
import Discover from '@/components/Discover.vue'
import Friends from '@/components/Friends.vue'
import My from '@/components/My.vue'
//将VueRouter设置为Vue的插件
Vue.use(VueRouter)

const router = new VueRouter({
    // 指定hash属性与组件的对应关系
    routes: [
    // 当用户访问 / 时,跳转到 /discover
    { path: '/', redirect: '/discover'},
    { path: '/discover', component: Discover },
    { path: '/friends', component: Friends },
    { path: '/my', component: My },
    ]
    })
    export default router

这样我们每次进入首页都会自动跳转到发现页面

 在 Discover.vue 组件中,声明 toplist和 playlist的子路由链接以及子路由占位符。示例代码如下:

<template>
    <div>
        <h1>
            发现
        </h1>
        <router-link to="/discover/toplist">推荐</router-link>
        <router-link to="/discover/playlist">歌单</router-link>
        <hr>
        <router-view></router-view>
    </div>
</template>

在创建两个组件toplist.vue和playlist.vue,并在index.js下配置子路由

import VueRouter from 'vue-router'
import Vue from 'vue'
import Discover from '@/components/Discover.vue'
import Friends from '@/components/Friends.vue'
import My from '@/components/My.vue'
import toplist from '@/components/toplist.vue'
import playlist from '@/components/playlist.vue'
//将VueRouter设置为Vue的插件
Vue.use(VueRouter)

const router = new VueRouter({
    // 指定hash属性与组件的对应关系
    routes: [
        { path: '/', redirect: '/discover'},
        {
            path: '/discover',
            component: Discover,
            // 通过children属性,嵌套声明子路由
            children: [
                {path:"toplist",component:toplist},
                {path:"playlist",component:playlist},
            ]
        },
        { path: '/friends', component: Friends },
        { path: '/my', component: My },
        //{ path: '/discover/toplist', component: TopList },
        //{ path: '/discover/playlist', component: playlist },
        ]
    })

export default router

 动态路由

创建Producet.vue组件

<template>
    <h3>商品</h3>
</template>

在My组件中引入商品路由 

<template>
    <div>
        <h1>
            我的
        </h1>
        <router-link to="/my/1">商品1</router-link>
        <router-link to="/my/2">商品2</router-link>
        <router-link to="/my/3">商品3</router-link>    
        <router-view></router-view>
    </div>
</template>

 在index.js中配置/my的子路由

import VueRouter from 'vue-router'
import Vue from 'vue'
import Discover from '@/components/Discover.vue'
import Friends from '@/components/Friends.vue'
import My from '@/components/My.vue'
import toplist from '@/components/toplist.vue'
import playlist from '@/components/playlist.vue'
import Product from '@/components/Product.vue'
//将VueRouter设置为Vue的插件
Vue.use(VueRouter)

const router = new VueRouter({
    // 指定hash属性与组件的对应关系
    routes: [
        { path: '/', redirect: '/discover'},
        {
            path: '/discover',
            component: Discover,
            // 通过children属性,嵌套声明子路由
            children: [
                {path:"toplist",component:toplist},
                {path:"playlist",component:playlist},
            ]
        },
        { path: '/friends', component: Friends },
        { path: '/my', component: My ,
            children:[
                { path: ':id', component: Product }
                // { path: '/product/1', component: Product },
                // {path: '/product/2', component: Product },  
                // { path: '/product/3', component: Product },
                
            ]
            
        },
        //{ path: '/discover/toplist', component: TopList },
        //{ path: '/discover/playlist', component: playlist },
        ]
    })

export default router

可以看到,点击不同的商品会跳转到不同的路由都指向Product组件界面,而动态路由的写法将我们原本的三行代码压缩到了两行

 

 获取动态id值

<template>
    <h3>商品<!-- 获取动态的id值 -->
<p>{{$route.params.id}}</p></h3>
</template>

另外一种传值的方式是通过属性传值

<template>
    <h1>商品{{ id }}</h1>
</template>

<script>
    export default{
        props:["id"]
    }
</script>

 index.js也要表明属性传值的参数

{ path: ':id', component: Product, props:true }

路由守卫

(类似拦截)

 导航守卫可以控制路由的访问权限。示意图如下:
全局导航守卫会拦截每个路由规则,从而对每个路由进行访问权限的控制。
你可以使用 router.beforeEach 注册一个全局前置守卫:

router.beforeEach((to, from, next) => {
if (to.path === '/main' && !isAuthenticated) {
next('/login')
}
else {
next()
}
})

 

参考文档:

链接:https://pan.baidu.com/s/1AM7UYhR32uUMuIJnalVAyg 
提取码:9p1f 
--来自百度网盘超级会员V3000的分享

三、状态管理VueX

视频:13.状态管理VueX_哔哩哔哩_bilibili

官方文档: Vuex 是什么? | Vuex

安装:

vue2对应版本vuex@3

 vue3对应版本vuex@4

npm install vuex@3

 新建文件夹store下新建index.js

import Vue from "vue";
import vuex from 'vuex'
Vue.use(vuex)

// 创建一个新的 store 实例
const store = new({
    state () {
      return {
        count: 0
      }
    },
    mutations: {
      increment (state) {
        state.count++
      }
    }
  })
  
export default store//将store对象导出

在main.js中导入

import store from './store'//index.js可以省略


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

 在HelloWorld.vue组件中导入store数据并进行操作

<template>
  <div class="hello">
    {{ this.$store.state.count }}
    <button @click="add">+1</button>
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  methods:{
    add(){
      //this.$store.state.count =this.$store.state.count + 1;
      this.$store.commit("increment")
    }
  }
}
</script>

也有更简单的写法,使用计算属性

<template>
  <div class="hello">
    {{ count }}
    <button @click="add">+1</button>
  </div>
</template>

<script>


export default {
  name: 'HelloWorld',
  computed: {
    count () {
      return this.$store.state.count
    }
  },
  methods:{
    add(){
      //this.$store.state.count =this.$store.state.count + 1;
      this.$store.commit("increment")
    }
  }
}
</script>

 或者用mapState(导入函数)

<template>
  <div class="hello">
    {{ count }}
    <button @click="add">+1</button>
  </div>
</template>

<script>
// 在单独构建的版本中辅助函数为 Vuex.mapState
import { mapState } from 'vuex'

export default {
  name: 'HelloWorld',
  computed: mapState([
  // 映射 this.count 为 store.state.count
  'count'
]),
  methods:{
    add(){
      //this.$store.state.count =this.$store.state.count + 1;
      this.$store.commit("increment")
    }
  }
}
</script>
Getter

 index.js添加列表

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

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    count: 0,
    todos: [
        { id: 1, text: '111', done: true },
        { id: 2, text: '222', done: false }
      ]
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})
export default store

 HelloWorld.vue显示

<template>
  <div class="hello">
    {{ count }}
    <button @click="add">+1</button>
    <ul>
      <li v-for="todo in todos" :key="todo.id">{{ todo.text }}</li>
    </ul>
  </div>
</template>

<script>
// 在单独构建的版本中辅助函数为 Vuex.mapState
import { mapState } from 'vuex'

export default {
  name: 'HelloWorld',
  computed: mapState([
  // 映射 this.count 为 store.state.count
  'count','todos'
]),
  methods:{
    add(){
      //this.$store.state.count =this.$store.state.count + 1;
      this.$store.commit("increment")
    }
  }
}
</script>

过滤数据

index.js 

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

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    count: 0,
    todos: [
        { id: 1, text: '111', done: true },
        { id: 2, text: '222', done: false }
      ]
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  getters: {
    // ...
    doneTodos: (state) =>  {
      return state.todos.filter(todo => todo.done)
    }
  }
}
)
export default store

 HelloWorld.vue

<template>
  <div class="hello">
    {{ count }}
    <button @click="add">+1</button>
    <ul>
      <li v-for="todo in doneTodos" :key="todo.id">{{ todo.text }}</li>
    </ul>
  </div>
</template>

<script>
// 在单独构建的版本中辅助函数为 Vuex.mapState
import { mapState,mapGetters } from 'vuex'

export default {
  name: 'HelloWorld',
  computed: {
    ...mapState([
      'count',
      'todos',
      // ...
    ]),
  // 使用对象展开运算符将 getter 混入 computed 对象中
    ...mapGetters([
      'doneTodos',
      // ...
    ]),

  },
  methods:{
    add(){
      //this.$store.state.count =this.$store.state.count + 1;
      this.$store.commit("increment")
    }
  }
}
</script>

 Mutation

提交载荷(函数参数)

  mutations: {
    increment (state, n) {
        state.count += n
      }
  },

methods:{
    add(){
      //this.$store.state.count =this.$store.state.count + 1;
      this.$store.commit("increment",2)
    }
  }

参考文档:

链接:https://pan.baidu.com/s/1cIUW0aV830wsmgzOK8PCuQ 
提取码:ohwp 
--来自百度网盘超级会员V3000的分享

四、前端数据模拟MockJS

 

 

 

 

视频:14.前端数据模拟MockJS_哔哩哔哩_bilibili

参考文档:

链接:https://pan.baidu.com/s/1hiZxbbSndy0hzo0Cxm7gOg 
提取码:zhsn 
--来自百度网盘超级会员V3000的分享

五、JWT跨域认证

视频:16.JWT跨域认证_哔哩哔哩_bilibili

pom.xml

 JwtUtils类

Result类

 

 

ResultCode接口类

UserController类

参考文档:

链接:https://pan.baidu.com/s/1TGeMS_7pfFbJPi4RTzTLvQ 
提取码:e7vg 
--来自百度网盘超级会员V3000的分享

六、后台前端解决方案

官网文档:介绍 | vue-element-admin

 Github:GitHub - PanJiaChen/vue-admin-template: a vue2.0 minimal admin template

 

在项目文件下输入cmd进入命令窗输入指令下载:

# clone the project
git clone https://github.com/PanJiaChen/vue-admin-template.git

# enter the project directory
cd vue-admin-template

#使用淘宝镜像源
npm install --registry=https://registry.npm.taobao.org

# install dependency
npm install

# develop
npm run dev

运行一下,还是很香的 

http://localhost:9528/#/login?redirect=%2Fdashboard

七、部署

视频:18.阿里云服务器使用_哔哩哔哩_bilibili

参考文档:

链接:https://pan.baidu.com/s/1G3fNqoJ8YFlxe0nNqeTmFg 
提取码:t381 
--来自百度网盘超级会员V3000的分享

本次学习笔记已全部整理完毕,由于时间原因,后面没有总结完全,但是老师给的文档记录详细,结合视频教程事半功倍,接下来我将准备项目实战。感谢老师的教导,真的学到了很多!同时感谢评论区的大神指点迷津。

参考链接:

1天搞定SpringBoot+Vue全栈开发_哔哩哔哩_bilibili

Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码骑士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值