今天下了Vue,想试一试前后端分离的实现,没想到坑还不少,这里就记录一下我遇到的坑和我的代码:

一、Vue的下载安装:从网上找就好了,没什么问题,除了下载以后,要把镜像库改成淘宝的,要不然太慢了。

二、推荐一个很好用的软件 HBuilder X,可以在上面写前端的项目,直接就能打开浏览器看到效果,还可以自动下载依赖。

三、前端代码:

首先,先创建一个Vue项目,新建以后项目自带的程序结构如图:

          

因为我也是刚刚接触vue,对里面的东西也不是很了解,只是从网上找了一些项目,边看边学,感觉里面重要的就是main.js、router还有components这三个,当然config里应该是配置文件,也很重要,但在这个初学的项目里,并没有涉及太多里面的东西。

首先,先看一下main.js里面的东西:

      

里面的东西不多,可以看到大多数都是添加依赖,使用Vue.use()指定全局使用的包之类的功能。

这里一定要注意,比如这个程序添加了ElementUI这样的外部依赖,那么一定要在这里用Vue.use()使用起来,表示全局都载入了这个库,否则的话,在页面显示的时候,没有内容,使用F12查看网页代码,会出现:

  Unknown custom element: <xxx> - did you register the component correctly? For recursive components, make sure to provide the "name" option.

这样的提示,这时候就要检查一下自己是否只是Import但是忘了use了。

接着看一下App.vue,这是项目的根组件:

      

在这里,我为了做测试,在上面加了一个啊咧,就会发现,不管跳转到哪个页面,页面上都会有“啊咧”这两个字,而另一方面,如果去掉下面的<router-view>的话,不管用什么访问路径,都只有这一个页面,无法获得其他页面,也就是说其实这个App.vue,是程序的入口,在此基础上,通过<router-view>来找到对应路径的页面,给予显示。这有点像SpringBoot里面的Application,程序都是从那里开始启动的。

最后,是Index.js,这里面规定了各个路径对应的页面,在这里,我已经写好了两个组件,一个是登录的组件,一个是初始页面:

    

这里,path就是配置的路径名,而component对应着每一个组件,组件就可以表示一个页面。

下面,就看一看登录的页面代码:

这里主要参考了https://www.jianshu.com/p/4eecd628782a

import Vue from 'vue'
import App from './App'
import router from './router'
import Element from 'element-ui'
import VueResource from 'vue-resource'
Vue.use(Element) <template>
<div>
<el-form :model="login" status-icon :rules="rule" ref="login">
<b>用户名</b>
<el-form-item prop="username" >
<el-input prefix-icon="el-icon-ump-yonghu" v-model="login.username" auto-complete="off" />
</el-form-item>
<b>密码</b>
<el-form-item prop="password">
<el-input prefix-icon="el-icon-ump-mima" type="password" v-model="login.password" auto-complete="off" />
</el-form-item> <el-form-item>
<el-button class="btn" type="primary" @click="submitForm('login')">登录</el-button>
</el-form-item>
</el-form> <p><a href="#" class="tips">还没有账号?点我去注册</a></p>
</div>
</template> <script>
export default {
name: 'login',
data() {
var checkUsername = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入用户名'));
} else {
callback();
}
};
var checkPassword = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'));
} else {
callback();
}
};
return {
checked: false,
token: '',
login: {
username: '',
password: ''
},
rule: {
username: [{
validator: checkUsername,
trigger: 'blur'
}
],
password: [{
validator: checkPassword,
trigger: 'blur'
}]
}
}
},
methods: {
submitForm(login){
this.$refs[login].validate((valid)=>{
if(valid){
this.$http.post('http://127.0.0.1:8080/login',{
username: this.login.username,
password:this.login.password
},{emulateJSON:true}).then(result =>{
console.log(result);
if(result.bodyText ==='index'){
this.$router.push({path:'home'});
}else{
console.log("登录失败");
return false;
}
});
}else{
console.log("error submit!!");
return false;
}
});
},
},
}
</script> <style>
</style>

这个程序里面,有一些点需要说明:

①上面的<el-form>这样的标签,是在ElementUI里面的,所以一定要在main.js中使用Vue.use()来导入依赖

②对于 :model,他相当于v-bind和v-on的集合,它负责监听用户的输入事件,从而更新数据,具体的解释和实例可以参考:https://www.jianshu.com/p/20e485cb65d9

③:rules:用来添加对表单字段的检验,通常使用语法是:{validator:验证方式,trigger:验证触发},如果是自己定义的验证方式,应该传入函数名,而不加参数。

④下面的methods里,要注意的就是post的地址不要出错,不要写localhost,写127.0.0.1进行测试,端口号写自己服务器端部署的端口号。

这样子,前端就算完成了,可以运行了,但是我们看vue项目config下面的index.js(或者运行的时候,看命令行也可以),我们可以看到这样的内容,项目运行的端口地址是8080,而这个又是服务器默认运行的端口,这两个不可以在同一个端口上运行,所以必须修改一个端口,不妨把前端的端口改为8081:

    

其中,home的代码,随便写一写就好了:

<template>
<div>
<h2>这是主页</h2>
</div>
</template> <script>
export default{
name:"name"
}
</script> <style>
</style>

四、后端代码:

新建SpringBoot项目:在Controller层直接写平常写的代码即可:

@RestController
public class TestController { @CrossOrigin(origins = "*")
@RequestMapping("/login")
public String login(
@RequestParam(value = "username", required = false) String username,
@RequestParam(value = "password",required = false) String password,
Model model
){
System.out.println("用户名为"+username);
System.out.println("密码为"+password);
if (username.equals("11")){
return "index";
}else{
return "login";
}
}
}

只不过要注意的就是 最上面的注解变成了@RestController:这个注解就是@Controller和在方法上加@ResponseBody的结合,这样使得返回值自动写入返回响应中,方便了前端读取。

在部署的时候,第一个问题就是:

①:Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package

  这个是因为启动的程序Application放的位置不对,应该把它放到,包含所有java文件的包下,而不能在java包下,比如这样子放才是正确的姿势

        

②:运行了以后,发现可以使用postMan传送数据,但是却接收不到来自前段的数据:这是因为前段的数据格式不是JSON的,要转成JSON才可以接收到:

需要在传送数据的时候,加上这样一行:

    

③上面的写完以后,后端接收到了数据,但是前端没有反应:这时候,是因为跨域问题:详细可以参见https://blog.csdn.net/xcbeyond/article/details/84453832

  而SpringBoot的解决方案十分简单:直接在方法上加@CrossOrigin()注解即可:

  

SpringBoot +Vue 前后端分离实例的更多相关文章

  1. SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题

    原文链接:https://segmentfault.com/a/1190000012879279 当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异.笔者前几天刚好在负责一个项目的权限管理 ...

  2. Springboot+vue前后端分离项目,poi导出excel提供用户下载的解决方案

    因为我们做的是前后端分离项目 无法采用response.write直接将文件流写出 我们采用阿里云oss 进行保存 再返回的结果对象里面保存我们的文件地址 废话不多说,上代码 Springboot 第 ...

  3. SpringBoot,Vue前后端分离开发首秀

    需求:读取数据库的数据展现到前端页面 技术栈:后端有主要有SpringBoot,lombok,SpringData JPA,Swagger,跨域,前端有Vue和axios 不了解这些技术的可以去入门一 ...

  4. SpringBoot+Vue前后端分离项目,maven package自动打包整合

    起因:看过Dubbo管控台的都知道,人家是个前后端分离的项目,可是一条打包命令能让两个项目整合在一起,我早想这样玩玩了. 1. 建立个maven父项目 next 这个作为父工程,next Finish ...

  5. Jeecg-Boot 2.0 版本发布,基于Springboot+Vue 前后端分离快速开发平台

    目录 Jeecg-Boot项目简介 源码下载 升级日志 Issues解决 v1.1升级到v2.0不兼容地方 系统截图 Jeecg-Boot项目简介 Jeecg-boot 是一款基于代码生成器的智能开发 ...

  6. SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(一)

    当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异. 笔者前几天刚好在负责一个项目的权限管理模块,现在权限管理模块已经做完了,我想通过5-6篇文章,来介绍一下项目中遇到的问题以及我的解决方 ...

  7. springboot+vue前后端分离,nginx代理配置 tomcat 部署war包详细配置

    1.做一个小系统,使用了springboot+vue 基础框架参考这哥们的,直接拿过来用,链接https://github.com/smallsnail-wh/interest 前期的开发环境搭建就不 ...

  8. Nginx+Springboot+Vue 前后端分离 解决跨域问题

    1:前端vue 写完 打包 npm run build prod 2: 后端api 写完打包 springboot mvn package -Dmaven.test.skip=true 3: ngin ...

  9. Springboot+Vue前后端分离的博客项目

    项目介绍 演示站(服务器已过期):http://blog.hanzhe.site 开源项目地址 ( 求给个Star ):https://gitee.com/zhang_hanzhe/blog 前端采用 ...

随机推荐

  1. JVM致命错误日志详解

    目录 文件描述 文件位置 文件头 错误信息记录 JVM运行信息 崩溃原因 错误信息 线程描述 线程信息 信号信息 计数器信息 机器指令 内存映射信息 线程堆栈 其他信息 进程描述 线程列表 虚拟机状态 ...

  2. JavaScript--'data-'的用法(1)

    HTML5为我们提供了一个强大的功能,前段也也能实现后台数据库的效果,例如data-xxx <a href="#myModal" data-industry_id=" ...

  3. 关于vagrant环境下项目中图片缓存的问题

    之前用的是iis所以可能没有这些问题,后来换了nginx之后发现图片缓存问题很严重,本项目用的是thinkphp5框架:浏览器.runtime.session.cookie.加参数,后台,所有缓存都清 ...

  4. Selenium常见报错问题(3)- 解决和分析NoSuchElementException

    如果你在跑selenium脚本时,需要某些异常不知道怎么解决时,可以看看这一系列的文章,看看有没有你需要的答案 https://www.cnblogs.com/poloyy/category/1749 ...

  5. 前端JS—显示赋值(一)

    一:js代码必须位于<script>js代码</script> 把js代码放到<body>元素的地步,可以改善显示速度 二:js显示数据 使用 window.ale ...

  6. Pytorch中自定义神经网络卷积核权重

    1. 自定义神经网络卷积核权重 神经网络被深度学习者深深喜爱,究其原因之一是神经网络的便利性,使用者只需要根据自己的需求像搭积木一样搭建神经网络框架即可,搭建过程中我们只需要考虑卷积核的尺寸,输入输出 ...

  7. 安装并使用pyecharts库

    在cmd命令行中输入安装命令, pyecharts库的安装命令如下: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts ...

  8. Qt之QListWidget:项目的多选与单选设置

    2019独角兽企业重金招聘Python工程师标准>>> #include "widget.h" #include <QApplication> #in ...

  9. 使用ScriptX控件进行Web横向打印

    一个需求需要采用横向打印,目前采用IE自身的打印功能(WebBrowser.ExecWB控件)很难进行横向设置,默认需要调用document.all.WebBrowser.ExecWB(8,1);打开 ...

  10. CodeForces - 262C 贪心

    Maxim always goes to the supermarket on Sundays. Today the supermarket has a special offer of discou ...