SPA项目开发之登录注册

},

methods: { //跳转到登录的方法

toLogin() {

this.$router.push({

path: ‘/Login’

});

}

}

}

.配置路径 index.js

import Vue from ‘vue’

import Router from ‘vue-router’

import HelloWorld from ‘@/components/HelloWorld’

import Login from ‘@/views/Login’

import Reg from ‘@/views/Reg’

Vue.use(Router)

export default new Router({

routes: [{

path: ‘/’,

name: ‘Login’,

component: Login

},

{

path: ‘/Reg’,

name: ‘Reg’,

component: Reg

},

{

path: ‘/Login’,

name: ‘Login’,

component: Login

},

]

})

界面如下,点击登录会跳转到登录界面

二、实现登录功能

========

左键File,点击import,选择箭头所示Existing Maven Projects,点击Next

Browse选择要导入的项目

导入成功后,修改mysql的版本号

在db.properties中修改为自己的mysql用户名和密码,以及放置表的数据库名

运行项目如下

将api文件导入spa项目的src中

action.js

/**

  • 对后台请求的地址的封装,URL格式如下:

  • 模块名_实体名_操作

*/

export default {

‘SERVER’: ‘http://localhost:8080/T216_SSH’, //服务器

‘SYSTEM_USER_DOLOGIN’: ‘/vue/userAction_login.action’, //用户登陆

‘SYSTEM_USER_DOREG’: ‘/vue/userAction_reg.action’, //用户注册

‘SYSTEM_MENU_TREE’: ‘/vue/treeNodeAction.action’, //左侧树形菜单加载

‘SYSTEM_ARTICLE_LIST’: ‘/vue/articleAction_list.action’, //文章列表

‘SYSTEM_ARTICLE_ADD’: ‘/vue/articleAction_add.action’, //文章新增

‘SYSTEM_ARTICLE_EDIT’: ‘/vue/articleAction_edit.action’, //文章修改

‘SYSTEM_ARTICLE_DEL’: ‘/vue/articleAction_del.action’, //文章删除

‘SYSTEM_USER_GETASYNCDATA’: ‘/vue/userAction_getAsyncData.action’, //vuex中的异步加载数据

‘getFullPath’: k => { //获得请求的完整地址,用于mockjs测试时使用

return this.SERVER + this[k];

}

}

http.js

/**

  • vue项目对axios的全局配置

*/

import axios from ‘axios’

import qs from ‘qs’

//引入action模块,并添加至axios的类属性urls上

import action from ‘@/api/action’

axios.urls = action

// axios默认配置

axios.defaults.timeout = 10000; // 超时时间

// axios.defaults.baseURL = ‘http://localhost:8080/j2ee15’; // 默认地址

axios.defaults.baseURL = action.SERVER;

//整理数据

// 只适用于 POST,PUT,PATCH,transformRequest` 允许在向服务器发送前,修改请求数据

axios.defaults.transformRequest = function(data) {

data = qs.stringify(data);

return data;

};

// 请求拦截器

axios.interceptors.request.use(function(config) {

// var jwt = window.vm.$store.getters.getJwt;

// config.headers[‘jwt’] = jwt;

return config;

}, function(error) {

return Promise.reject(error);

});

// 响应拦截器

axios.interceptors.response.use(function(response) {

// debugger;

// var jwt = response.headers[‘jwt’];

// if(jwt){

// window.vm.$store.commit(‘setJwt’,{jwt:jwt});

// }

return response;

}, function(error) {

return Promise.reject(error);

});

// // 路由请求拦截

// // http request 拦截器

// axios.interceptors.request.use(

// config => {

// //config.data = JSON.stringify(config.data);

// //config.headers[‘Content-Type’] = ‘application/json;charset=UTF-8’;

// //config.headers[‘Token’] = ‘abcxyz’;

// //判断是否存在ticket,如果存在的话,则每个http header都加上ticket

// // if (cookie.get(“token”)) {

// // //用户每次操作,都将cookie设置成2小时

// // cookie.set(“token”, cookie.get(“token”), 1 / 12)

// // cookie.set(“name”, cookie.get(“name”), 1 / 12)

// // config.headers.token = cookie.get(“token”);

// // config.headers.name = cookie.get(“name”);

// // }

// return config;

// },

// error => {

// return Promise.reject(error.response);

// });

// // 路由响应拦截

// // http response 拦截器

// axios.interceptors.response.use(

// response => {

// if (response.data.resultCode == “404”) {

// console.log(“response.data.resultCode是404”)

// // 返回 错误代码-1 清除ticket信息并跳转到登录页面

// // cookie.del(“ticket”)

// // window.location.href=‘http://login.com’

// return

// } else {

// return response;

// }

// },

// error => {

// return Promise.reject(error.response) // 返回接口返回的错误信息

// });

export default axios;

引入main.js配置

import axios from ‘@/api/http’  #vue项目对axios的全局配置

import VueAxios from ‘vue-axios’

Vue.use(VueAxios,axios)

前后端数据交互开始

src/views/Login.vue

用户登录

<el-button style=“width:100%;” type=“primary” @click=“submitForm”>提交

<el-link type=“success” @click=“toReg”>用户注册

忘记密码

submitForm() {

let url = this.axios.urls.SYSTEM_USER_DOLOGIN;

this.axios.post(url, this.ruleForm).then((resp) => {

console.log(resp);

if (resp.data.code == 1) {

this.$message({

message: resp.data.msg,

type: ‘success’

});

} else {

this.$message({

message: resp.data.msg,

type: ‘warning’

});

}

}).catch(function(error) {

console.log(error);

});

}

登录失败

登录成功

三、This 指针带来的变量污染

=====================

登录方法中用到箭头函数,由于this.message和this.axios中的this不是同一个,this的指向是由所在函数的调用方式决定的,message存在于全局中,所以引用箭头函数

submitForm() {

let url = this.axios.urls.SYSTEM_USER_DOLOGIN;

this.axios.post(url, this.ruleForm).then((resp) => {

console.log(resp);

if (resp.data.code == 1) {

this.$message({

message: resp.data.msg,

type: ‘success’

});

} else {

this.$message({

message: resp.data.msg,

type: ‘warning’

});

}

}).catch(function(error) {

console.log(error);

});

}

将this在上面定义也可以解决

四、ajax 跨域问题

===============

http://localhost:8088/#/

协议+IP+port+项目

跨域产生的原因:上面四个中有一个不同,都会产生

凡是错误中出现了CORS就是 跨域问题

解决,设置允许访问的ip,设置允许访问的请求方式

web.xml

corsFilter

com.zking.vue.util.CorsFilter

corsFilter

/*

CorsFilter.java

// Access-Control-Allow-Origin就是我们需要设置的域名

// Access-Control-Allow-Headers跨域允许包含的头。

// Access-Control-Allow-Methods是允许的请求方式

resp.setHeader(“Access-Control-Allow-Origin”, “*”);// *,任何域名

resp.setHeader(“Access-Control-Allow-Methods”, “POST, GET, PUT, DELETE”);

package com.zking.vue.util;

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

/**

  • 配置tomcat允许跨域访问

  • @author Administrator

*/

public class CorsFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

// @Override

// public void doFilter(ServletRequest servletRequest, ServletResponse

// servletResponse, FilterChain filterChain)

// throws IOException, ServletException {

// HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;

//

// // Access-Control-Allow-Origin就是我们需要设置的域名

// // Access-Control-Allow-Headers跨域允许包含的头。

// // Access-Control-Allow-Methods是允许的请求方式

// httpResponse.addHeader(“Access-Control-Allow-Origin”, “*”);// *,任何域名

// httpResponse.setHeader(“Access-Control-Allow-Methods”, "POST, GET, PUT,

// DELETE");

// // httpResponse.setHeader(“Access-Control-Allow-Headers”, "Origin,

// // X-Requested-With, Content-Type, Accept");

//

// // 允许请求头Token

// httpResponse.setHeader(“Access-Control-Allow-Headers”,

// “Origin,X-Requested-With, Content-Type, Accept, Token”);

// HttpServletRequest req = (HttpServletRequest) servletRequest;

// System.out.println(“Token=” + req.getHeader(“Token”));

// if(“OPTIONS”.equals(req.getMethod())) {

// return;

// }

//

//

// filterChain.doFilter(servletRequest, servletResponse);

// }

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)

throws IOException, ServletException {

HttpServletResponse resp = (HttpServletResponse) servletResponse;

HttpServletRequest req = (HttpServletRequest) servletRequest;

// Access-Control-Allow-Origin就是我们需要设置的域名

// Access-Control-Allow-Headers跨域允许包含的头。

// Access-Control-Allow-Methods是允许的请求方式

resp.setHeader(“Access-Control-Allow-Origin”, “*”);// *,任何域名

resp.setHeader(“Access-Control-Allow-Methods”, “POST, GET, PUT, DELETE”);

// resp.setHeader(“Access-Control-Allow-Headers”, "Origin,X-Requested-With,

// Content-Type, Accept");

// 允许客户端,发一个新的请求头jwt

resp.setHeader(“Access-Control-Allow-Headers”, “Origin,X-Requested-With, Content-Type, Accept, jwt”);

// 允许客户端,处理一个新的响应头jwt

resp.setHeader(“Access-Control-Expose-Headers”, “jwt”);

// String sss = resp.getHeader(“Access-Control-Expose-Headers”);

// System.out.println(“sss=” + sss);

// 允许请求头Token

// httpResponse.setHeader(“Access-Control-Allow-Headers”,"Origin,X-Requested-With,

// Content-Type, Accept, Token");

// System.out.println(“Token=” + req.getHeader(“Token”));

if (“OPTIONS”.equals(req.getMethod())) {// axios的ajax会发两次请求,第一次提交方式为:option,直接返回即可

return;

}

filterChain.doFilter(servletRequest, servletResponse);

}

@Override

public void destroy() {

}

}

五、axios 的 get/post 的区别( qs )

=================================

qs

qs.js它是一个url参数转化的js库。用法就两个:

var obj = qs.parse(‘a=b&c=d’);  //将URL解析成对象的形式:{a:‘b’,c:‘d’}

var str = qs.stringify(obj);    //将对象 序列化成URL的形式,以&进行拼接:a=b&c=d’

qs.stringify()将对象转换成字符串

http.js

/**

  • vue项目对axios的全局配置

*/

import axios from ‘axios’

import qs from ‘qs’

//引入action模块,并添加至axios的类属性urls上

import action from ‘@/api/action’

axios.urls = action

// axios默认配置

axios.defaults.timeout = 10000; // 超时时间

// axios.defaults.baseURL = ‘http://localhost:8080/j2ee15’; // 默认地址

axios.defaults.baseURL = action.SERVER;

//整理数据

// 只适用于 POST,PUT,PATCH,transformRequest` 允许在向服务器发送前,修改请求数据

axios.defaults.transformRequest = function(data) {

data = qs.stringify(data);

return data;

};

// 请求拦截器

axios.interceptors.request.use(function(config) {

// var jwt = window.vm.$store.getters.getJwt;

// config.headers[‘jwt’] = jwt;

return config;

}, function(error) {

return Promise.reject(error);

});

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

前端面试题汇总


前端面试题是我面试过程中遇到的面试题,每一次面试后我都会复盘总结。我做了一个整理,并且在技术博客找到了专业的解答,大家可以参考下:

由于篇幅有限,只能分享部分面试题,完整版面试题及答案可以【点击我】阅读下载哦~

感悟

小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-LcH6FYmJ-1712955351214)]

[外链图片转存中…(img-Ogeak8y3-1712955351214)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-vvF8ttwl-1712955351215)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

前端面试题汇总


前端面试题是我面试过程中遇到的面试题,每一次面试后我都会复盘总结。我做了一个整理,并且在技术博客找到了专业的解答,大家可以参考下:

由于篇幅有限,只能分享部分面试题,完整版面试题及答案可以【点击我】阅读下载哦~

感悟

春招面试的后期,运气和实力都很重要,自己也是运气比较好,为了回馈粉丝朋友们(毕竟自己也玩了这么久哈哈哈),整理个人感悟和总结以上。最后祝愿大家能够收获理想offer!!

  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值