• ElementUI之登陆+注册->饿了吗完成用户登录界面搭建,axios之get请求,axios之post请求,跨域,注册界面


    •  饿了吗完成用户注册登录界面搭建
    • axios之get请求
    • axios之post请求
    • 跨域
    • 注册界面

    1.饿了吗完成用户注册登录界面搭建

    将端口号8080改为8081

    导入依赖,在项目根目录使用命令npm install element-ui -S,添加Element-UI模块

    -g:将依赖下载node_glodal全局依赖

    -d(依赖放在static/[]package.json的devDependencies里):下载依赖到SPA工程中,不会参与打包

    -s(依赖放在static/[]package.json的dependencies里):下载依赖到SPA工程中,会参与打包

     

    登录+注册静态页实现:

    在src目录下创建views目录(该目录用于存放vue组件)

    在main.js中引入element-ui模块,在项目中src目录下找到`main.js`,并在指定位置添加三行代码

    1. //App.vue页面创建views

    检查是否能启动项目

    1. //新建一个src下的view/login,写好登录界面
    1. //src下的App.vue,写好样式
    1. //src/router/index.js
    2. import Vue from 'vue'
    3. import Router from 'vue-router'
    4. import HelloWorld from '@/components/HelloWorld'
    5. import Login from '@/views/Login'
    6. import Register from '@/views/Register'
    7. Vue.use(Router)
    8. export default new Router({
    9. routes: [
    10. {
    11. path: '/',
    12. name: 'Login',
    13. component: Login
    14. },
    15. {
    16. path: '/Register',
    17. name: 'Register',
    18. component: Register
    19. }],
    20. })

    2.axios之get请求

    准备好后台项目,导入sql,查看项目连接数据库密码等信息(项目名:ssm/src/main/resources/jdbc.properties)

    将项目导入idea:file->open->项目路经copy到弹出框->点击项目里的pom.xml->ok

    修改maven服务器等默认路径,C盘改为D盘:点击file->setting->搜索maven->修改右边路径

    检查idea是否可以正常运行

    HbuiderX里安装axios,vue等插件

    写好get请求相关代码,运行

    1. src下的view/login,get请求

    1. //src下的view/login,post请求

    优化

    1. //view/Login
    1. //api/action.js
    2. /**
    3. * 对后台请求的地址的封装,URL格式如下:
    4. * 模块名_实体名_操作
    5. */
    6. export default {
    7. 'SERVER': 'http://localhost:8080/ssm', //服务器
    8. 'SYSTEM_USER_DOLOGIN': '/user/userLogin', //登陆
    9. 'SYSTEM_USER_DOREG': '/userAction.action', //注册
    10. 'getFullPath': k => { //获得请求的完整地址,用于mockjs测试时使用
    11. return this.SERVER + this[k];
    12. }
    13. }
    14. /**
    15. * 对后台请求的地址的封装,URL格式如下:
    16. * 模块名_实体名_操作
    17. */
    18. export default {
    19. 'SERVER': 'http://localhost:8080/ssm', //服务器
    20. 'SYSTEM_USER_DOLOGIN': '/user/userLogin', //登陆
    21. 'SYSTEM_USER_DOREG': '/userAction.action', //注册
    22. 'getFullPath': k => { //获得请求的完整地址,用于mockjs测试时使用
    23. return this.SERVER + this[k];
    24. }
    25. }
    1. //api/http.js
    2. /**
    3. * vue项目对axios的全局配置
    4. */
    5. import axios from 'axios'
    6. import qs from 'qs'
    7. //引入action模块,并添加至axios的类属性urls上
    8. import action from '@/api/action'
    9. axios.urls = action
    10. // axios默认配置
    11. axios.defaults.timeout = 10000; // 超时时间
    12. // axios.defaults.baseURL = 'http://localhost:8080/j2ee15'; // 默认地址
    13. axios.defaults.baseURL = action.SERVER;
    14. //整理数据
    15. // 只适用于 POST,PUT,PATCH,transformRequest` 允许在向服务器发送前,修改请求数据
    16. axios.defaults.transformRequest = function(data) {
    17. data = qs.stringify(data);
    18. return data;
    19. };
    20. // 请求拦截器
    21. axios.interceptors.request.use(function(config) {
    22. return config;
    23. }, function(error) {
    24. return Promise.reject(error);
    25. });
    26. // 响应拦截器
    27. axios.interceptors.response.use(function(response) {
    28. return response;
    29. }, function(error) {
    30. return Promise.reject(error);
    31. });
    32. // // 路由请求拦截
    33. // // http request 拦截器
    34. // axios.interceptors.request.use(
    35. // config => {
    36. // //config.data = JSON.stringify(config.data);
    37. // //config.headers['Content-Type'] = 'application/json;charset=UTF-8';
    38. // //config.headers['Token'] = 'abcxyz';
    39. // //判断是否存在ticket,如果存在的话,则每个http header都加上ticket
    40. // // if (cookie.get("token")) {
    41. // // //用户每次操作,都将cookie设置成2小时
    42. // // cookie.set("token", cookie.get("token"), 1 / 12)
    43. // // cookie.set("name", cookie.get("name"), 1 / 12)
    44. // // config.headers.token = cookie.get("token");
    45. // // config.headers.name = cookie.get("name");
    46. // // }
    47. // return config;
    48. // },
    49. // error => {
    50. // return Promise.reject(error.response);
    51. // });
    52. // // 路由响应拦截
    53. // // http response 拦截器
    54. // axios.interceptors.response.use(
    55. // response => {
    56. // if (response.data.resultCode == "404") {
    57. // console.log("response.data.resultCode是404")
    58. // // 返回 错误代码-1 清除ticket信息并跳转到登录页面
    59. // // cookie.del("ticket")
    60. // // window.location.href='http://login.com'
    61. // return
    62. // } else {
    63. // return response;
    64. // }
    65. // },
    66. // error => {
    67. // return Promise.reject(error.response) // 返回接口返回的错误信息
    68. // });
    69. export default axios;
    1. //src/view/main.js
    2. // The Vue build version to load with the `import` command
    3. // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
    4. import Vue from 'vue'
    5. // 新添加1
    6. import ElementUI from 'element-ui'
    7. // 新添加2,避免后期打包样式不同,要放在import App from './App';之前
    8. import 'element-ui/lib/theme-chalk/index.css'
    9. import App from './App'
    10. import router from './router'
    11. import axios from '@/api/http'
    12. import VueAxios from 'vue-axios'
    13. Vue.use(VueAxios,axios)
    14. Vue.use(ElementUI);
    15. Vue.config.productionTip = false
    16. /* eslint-disable no-new */
    17. new Vue({
    18. el: '#app',
    19. router,
    20. components: { App },
    21. template: ''
    22. })

    3.跨域

    1. package com.zlj.ssm.util;
    2. import java.io.IOException;
    3. import javax.servlet.Filter;
    4. import javax.servlet.FilterChain;
    5. import javax.servlet.FilterConfig;
    6. import javax.servlet.ServletException;
    7. import javax.servlet.ServletRequest;
    8. import javax.servlet.ServletResponse;
    9. import javax.servlet.http.HttpServletRequest;
    10. import javax.servlet.http.HttpServletResponse;
    11. /**
    12. * 配置tomcat允许跨域访问
    13. *
    14. * @author Administrator
    15. *
    16. */
    17. public class CorsFilter implements Filter {
    18. @Override
    19. public void init(FilterConfig filterConfig) throws ServletException {
    20. }
    21. @Override
    22. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
    23. throws IOException, ServletException {
    24. HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
    25. HttpServletRequest req = (HttpServletRequest) servletRequest;
    26. // Access-Control-Allow-Origin就是我们需要设置的域名
    27. // Access-Control-Allow-Headers跨域允许包含的头。
    28. // Access-Control-Allow-Methods是允许的请求方式
    29. httpResponse.setHeader("Access-Control-Allow-Origin", "*");// *,任何域名
    30. httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
    31. //允许客户端发一个新的请求头jwt
    32. httpResponse.setHeader("Access-Control-Allow-Headers","responseType,Origin,X-Requested-With, Content-Type, Accept, jwt");
    33. //允许客户端处理一个新的响应头jwt
    34. httpResponse.setHeader("Access-Control-Expose-Headers", "jwt,Content-Disposition");
    35. //httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    36. //httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
    37. // axios的ajax会发两次请求,第一次提交方式为:option,直接返回即可
    38. if ("OPTIONS".equals(req.getMethod())) {
    39. return;
    40. }
    41. filterChain.doFilter(servletRequest, servletResponse);
    42. }
    43. @Override
    44. public void destroy() {
    45. }
    46. }

     4.注册页面

    前端 

    1. //src/view/Register.vue
    1. //src/router/index.js
    2. import Vue from 'vue'
    3. import Router from 'vue-router'
    4. import HelloWorld from '@/components/HelloWorld'
    5. import Login from '@/views/Login'
    6. import Register from '@/views/Register'
    7. Vue.use(Router)
    8. export default new Router({
    9. routes: [{
    10. path: '/',
    11. name: 'Login',
    12. component: Login
    13. },
    14. {
    15. path: '/Register',
    16. name: 'Register',
    17. component: Register
    18. }
    19. ]
    20. })
    1. //src/api/action.js
    2. /**
    3. * 对后台请求的地址的封装,URL格式如下:
    4. * 模块名_实体名_操作
    5. */
    6. export default {
    7. 'SERVER': 'http://localhost:8080/ssm', //服务器
    8. 'SYSTEM_USER_DOLOGIN': '/user/userLogin', //登陆
    9. 'SYSTEM_USER_DOREG': '/user/userRegister', //注册
    10. 'getFullPath': k => { //获得请求的完整地址,用于mockjs测试时使用
    11. return this.SERVER + this[k];
    12. }
    13. }

    后端

    1. package com.zlj.ssm.service.impl;
    2. import com.zlj.ssm.mapper.UserMapper;
    3. import com.zlj.ssm.model.User;
    4. import com.zlj.ssm.service.IUserService;
    5. import com.zlj.ssm.util.PageBean;
    6. import com.zlj.ssm.vo.UserVo;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.stereotype.Service;
    9. import java.util.List;
    10. import java.util.Map;
    11. @Service
    12. public class UserServiceImpl implements IUserService {
    13. @Autowired
    14. private UserMapper userMapper;
    15. @Override
    16. public List> queryUserPager(UserVo userVo, PageBean pageBean) {
    17. return userMapper.queryUserPager(userVo);
    18. }
    19. @Override
    20. public int insertSelective(User record) {
    21. return userMapper.insertSelective(record);
    22. }
    23. }
    1. package com.zlj.ssm.controller;
    2. import com.zlj.ssm.service.IUserService;
    3. import com.zlj.ssm.util.JsonResponseBody;
    4. import com.zlj.ssm.util.PageBean;
    5. import com.zlj.ssm.vo.UserVo;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Controller;
    8. import org.springframework.web.bind.annotation.RequestMapping;
    9. import org.springframework.web.bind.annotation.ResponseBody;
    10. import javax.servlet.http.HttpServletRequest;
    11. import javax.servlet.http.HttpServletResponse;
    12. import java.util.List;
    13. import java.util.Map;
    14. import com.zlj.ssm.jwt.*;
    15. @Controller
    16. @RequestMapping("/user")
    17. public class UserController {
    18. @Autowired
    19. private IUserService userService;
    20. @RequestMapping("/userLogin")
    21. @ResponseBody
    22. public JsonResponseBody userLogin(UserVo userVo, HttpServletResponse response) {
    23. System.out.println(123);
    24. if (userVo.getUsername().equals("admin") && userVo.getPassword().equals("123")) {
    25. //私有要求claim
    26. // Map json=new HashMap();
    27. // json.put("username", userVo.getUsername());
    28. //生成JWT,并设置到response响应头中
    29. // String jwt=JwtUtils.createJwt(json, JwtUtils.JWT_WEB_TTL);
    30. // response.setHeader(JwtUtils.JWT_HEADER_KEY, jwt);
    31. return new JsonResponseBody<>("用户登陆成功!", true, 0, null);
    32. } else {
    33. return new JsonResponseBody<>("用户名或密码错误!", false, 0, null);
    34. }
    35. }
    36. @RequestMapping("/queryUserPager")
    37. @ResponseBody
    38. public JsonResponseBody>>
    39. queryUserPager(UserVo userVo, HttpServletRequest request) {
    40. try {
    41. PageBean pageBean = new PageBean();
    42. pageBean.setRequest(request);
    43. List> users = userService.queryUserPager(userVo, pageBean);
    44. return new JsonResponseBody<>("OK", true, pageBean.getTotal(), users);
    45. } catch (Exception e) {
    46. e.printStackTrace();
    47. return new JsonResponseBody<>("分页查询用户信息失败!", false, 0, null);
    48. }
    49. }
    50. @RequestMapping("/userRegister")
    51. @ResponseBody
    52. public JsonResponseBody userRegister(UserVo userVo, HttpServletResponse response) {
    53. //状态新注册默认为0
    54. userVo.setStatus("0");
    55. //因为ID为String类型需要手动设置,当然可以根据自己的需要改为Int类型
    56. userVo.setId("8");
    57. int i = userService.insertSelective(userVo);
    58. if (i > 0) {
    59. return new JsonResponseBody<>("注册成功", true, 0, null);
    60. } else {
    61. return new JsonResponseBody<>("用户注册失败,请重新输入", false, 0, null);
    62. }
    63. }
    64. }

     

  • 相关阅读:
    集成 push kit 签名配置报6003/收不到华为推送
    C++二分算法:水位上升的泳池中游泳
    Elasticsearch 字段别名 field-alias
    【C++】哈希表的实现
    Qt不规则可移动窗体的实现
    Redisson 实现分布式锁源码浅析
    HANA 常用数据类型详解
    Kotlin学习快速入门(7)——扩展的妙用
    H3C 6520X 配置IRF+BFD
    韩顺平linux(1-11小节)
  • 原文地址:https://blog.csdn.net/weixin_73471776/article/details/133182849