vue+springboot(前后端分离项目)

news2024/9/24 7:20:10

目录

JAVA后端项目

一、创建项目

1、使用aliyun的server url

2、初始化项目结构

3、添加依赖

4、创建文件夹

5、把mapper类交给spring容器管理

5.1、方法1

5.2、方法2

6、在yaml文件中配置数据库信息

7、在yaml文件中配置mapper的xml文件的路径

8、配置mapper的xml文件

二、编写程序

1、登录功能

1.1、编写UserController

1.2、编写UserserviceImpl

1.3、编写接口Userservice

1.4、编写mapper

1.5、编写xml

1.6、前端发请求


JAVA后端项目

一、创建项目

1、使用aliyun的server url
https://start.aliyun.com
2、初始化项目结构

3、添加依赖

4、创建文件夹

5、把mapper类交给spring容器管理
5.1、方法1

在每一个mapper类上加上注解@Mapper

@Mapper
public class UserMapper {
}

缺点:每个mapper文件都得添加

5.2、方法2

在主程序启动类上添加扫描所有mapper

@MapperScan("com.example.goods_admin.mapper")

注意:路径可以是指定文件,或者文件夹。

6、在yaml文件中配置数据库信息
server:
  port: 9090
​
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/goods_admin?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
    username: root
    password: root
    driverClassName: com.mysql.cj.jdbc.Driver
7、在yaml文件中配置mapper的xml文件的路径
mybatis:
  mapper-locations: classpath:mapper/*.xml  //classpath是resources文件夹

8、配置mapper的xml文件
<!--XML头部(固定的)-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.goods_admin.mapper.UserMapper">
<!--    结果映射:数据库字段与实体类字段的映射关系-->
    <resultMap id="BaseResultMap" type="com.example.goods_admin.entity.User">
        <id column="id" jdbcType="VARCHAR" property="id" />
        <result column="userId" jdbcType="VARCHAR" property="userId" />
        <result column="userName" jdbcType="VARCHAR" property="userName" />
        <result column="password" jdbcType="VARCHAR" property="password" />
        <result column="sex" jdbcType="TINYINT" property="sex" />
        <result column="age" jdbcType="INTEGER" property="age" />
        <result column="location" jdbcType="VARCHAR" property="location" />
    </resultMap>
​
</mapper>

二、编写程序

user实体类

package com.example.goods_admin.entity;

public class User {
    private String id;
    private String userId;
    private String userName;
    private String password;
    private String sex;
    private int age;
    private String location;
    //无参构造函数
    public User() {
    }
    //构造函数:用来实例化对象的
    //有参构造函数
    public User(String id, String userId, String userName, String password, String sex, int age, String location) {
        this.id = id;
        this.userId = userId;
        this.userName = userName;
        this.password = password;
        this.sex = sex;
        this.age = age;
        this.location = location;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }


}

1、登录功能

1.1、编写UserController
​
@RestController
//@RequestMapping用于将 HTTP 请求映射到控制器方法上
@RequestMapping("/user")
public class UserController {
​
    @Autowired
    Userservice userservice;
    /*
    **登录
     */
    @PostMapping("/login")
    public Result login(@RequestBody User user){
    return userservice.login(user);
    }
 
​
}
1.2、编写UserserviceImpl
@Service
public class UserserviceImpl implements Userservice {
​
    @Autowired
    UserMapper userMapper;
​
    @Override
    public Result login(User user) {
        /**
         * 1、先根据账号查询,是否账号存在
         * 2、不存在,显示该账户未注册,先注册再登录
         * 3、存在,查询该账户的密码是不是数据库中的密码
         * 4、如果传入的密码和数据库的密码不一样,说明密码错误,请重新输入密码
         * 5、如果传入的密码和数据库的密码一样,说明账号密码都正确,显示登录成功,跳转到首页
         */
​
        //1、根据账号查询,是否账号存在
        User user2 = userMapper.seleteUserByUserId(user.getUserId());
​
        //2、不存在,显示该账户未注册,先注册再登录
        if (user2 == null) {
            return Result.failed("用户不存在,请注册");
        } else {
            //3、存在,查询该账户的密码是不是数据库中的密码
            User user3 = userMapper.seleteUserByPassword(user);
            if (user3 != null && user3.getPassword().equals(user.getPassword())) {
                return Result.succeed("登录成功");
            } else {
                return Result.failed("密码错误");
            }
​
        }
​
    }
​
    
​
​
}
1.3、编写接口Userservice
public interface Userservice {
​
    Result login(User user);
​
}
1.4、编写mapper
@Mapper
public interface UserMapper {
​
    User seleteUserByUserId(String userId);
​
    void login(User user);
​
   
}
1.5、编写xml
<select id="seleteUserByUserId" resultType="com.example.goods_admin.entity.User">
        select * from user where userId=#{userId}
    </select>
    <select id="login">
        select * from user where userId=#{userId}
    </select>
1.6、前端发请求
   login() {
            if (this.userId === '') {
                this.$message.error("请输入账号");
                return;
            } else if (this.password === '') {
                this.$message.error("请输入密码");
                return;
            }
            // 判断是否勾选协议
            if (this.agreementChecked) {
                // 发送登录请求
                this.$axios({
                    method: "post",
                    url: "http://localhost:8080/api/user/login",
                    data: {
                        userId: this.userId,
                        password: this.password,
                    },
                })
                    .then((res) => {
                        console.log(res);
                        if (res.data.code == "200") {
                            // 登录成功,显示成功提示信息
                            this.$message({
                                message: res.data.message,
                                type: "success",
                            });
​
                            //1、储存token(令牌)   保存到浏览器
                            window.sessionStorage.setItem("token", res.data.token);
                            //2、储存user
                            window.sessionStorage.setItem(
                                "user",
                                JSON.stringify(res.data.user)
                            );
                            //3、跳转到后台主页 (编程式导航)
                            this.$router.push("./home"); //
                        } else if (res.data.code == "500") {
                            this.$message({
                                message: res.data.message,
                                type: "error",
                            });
                        }
                    })
                    .catch(() => {
                        // 登录失败,显示提示信息
                        this.$message({
                            message: "该登录失败",
                            type: "error",
                        });
                    });
            } else {
                // 未勾选协议,不执行登录逻辑
                this.$message({
                    message: "请同意用户协议和隐私政策!",
                    type: "error",
                });
            }
        },

注意:先解决跨域问题(vue.config.js文件)

module.exports = {
​
  devServer: {
    proxy: {
      '/api': {//表示拦截以/api开头的请求路径
        target: 'http://localhost:9090',
        changOrigin: true,//是否开启跨域
        pathRewrite: {
          '^/api': '' //重写api,把api变成空字符,因为我们真正请求的路径是没有api的
        }
      }
    }
  }
​
};
​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1397678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django开发_13_静态资源、cookie/session/token

一、在html文件下的操作 &#xff08;一&#xff09;在html中添加{% load static %}标签&#xff0c;加载static模块 &#xff08;二&#xff09;使用{%static "图片地址" %}动态生成静态资源URL 二、csrf跨站请求伪造 在账号登录的html文件中相应位置要加上{% csr…

转转交易猫自带客服多模板全开源完整定制版源码

商品发布&#xff1b; 请在后台商品添加成功后&#xff0c; 再点击该商品管理&#xff0c;可重新编辑当前商品的所有信息及配图以及支付等等相关信息 可点击分享或者跳转&#xff0c;将链接地址进行发布分享 请在手机端打开访问 访问商品主要模板文件路径目录 咸鱼&#…

K8S-YAML

一、Kubernetes对象的描述 kubernetes中资源可以使用YAML描述&#xff08;如果您对YAML格式不了解&#xff0c;可以参考YAML语法&#xff09;&#xff0c;也可以使用JSON。其内容可以分为如下四个部分&#xff1a; typeMeta&#xff1a;对象类型的元信息&#xff0c;声明对象…

软件是什么?前端,后端,数据库

软件是什么&#xff1f; 由于很多东西没有实际接触&#xff0c;很难理解&#xff0c;对于软件的定义也是各种各样。但是我还是不理解&#xff0c;软件开发中的前端&#xff0c;后端&#xff0c;数据库到底有什么关系呢&#xff01; 这个问题足足困扰了三年半&#xff0c;练习时…

创建SERVLET

创建SERVLET 要创建servlet,需要执行以下任务: 编写servlet。编译并封装servlet。将servlet部署为Java EE应用程序。通过浏览器访问servlet。编写servlet 要编写servlet,需要扩展HttpServlet接口的类。编写servlet是,需要合并读取客户机请求和返回响应的功能。 读取和处…

基于Mcrosemi M2S090T FPGA 的 imx991 SWIR的SLVS解码(一)

目录 一、平台介绍 二、器件的简介 1、imx991 SWIR Image Sensor 2、M2S090T 三、工程 1、imx991寄存器配置 一、平台介绍 工程开发平台&#xff1a;Libero Version:20231.0.6 Release:v2023.1 文本编辑器&#xff1a;Sublime text3 二、器件的简介 1、imx991 SWIR I…

K8s调试积累

文章目录 一、K8S 集群服务访问失败&#xff1f;二、K8S 集群服务访问失败&#xff1f;三、K8S 集群服务暴露失败&#xff1f;四、外网无法访问 K8S 集群提供的服务&#xff1f;五、pod 状态为 ErrImagePull&#xff1f;六、探测存活 pod 状态为 CrashLoopBackOff&#xff1f;七…

postman导入https证书

进入setting配置中Certificates配置项 点击“Add Certificate”,然后配置相关信息 以上配置完毕&#xff0c;如果测试出现“SSL Error:Self signed certificate” 则将“SSL certificate verification”取消勾选

【车载开发系列】Autosar DCM诊断管理模块

【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块一. DCM模块概念二. DCM模块与Autosar其他模块关系1&#xff09;Dcm和PduR的交互2&#xff09;Dcm和ComM模块的交互3&#xff09;Dcm和Dem的交互4&a…

Maven(五)如何只打包项目某个模块及其依赖模块?

目录 一、背景二、解决方案三、补充3.1 提出疑问3.2 解答 一、背景 在 SpringCloud 微服务框架下&#xff0c;会存在多个模块。当我们需要对其中某一个服务打包的时候&#xff0c;需要将该服务依赖的模块一起打包更新&#xff0c;如果项目比较小的话我们可以直接将项目中的所有…

C++ memmove 学习

memmove&#xff0c;将num字节的值从源指向的位置复制到目标指向的内存块。 允许目标和源有重叠。 当目标区域与源区域没有重叠则和memcpy函数功能相同。 宽字符版本是wmemmove&#xff0c;安全版本加_s&#xff1b; #include "stdafx.h" #include<iostream&g…

Addressables(2) ResourceLocation和AssetReference

IResourceLocation var op Addressables.LoadResourceLocationsAsync(key); var result op.WaitForCompletion(); 把加载的Key塞进去&#xff0c;不难看出&#xff0c;IResourceLocation可以用来获得资源的详细信息 很适合用于更新分析&#xff0c;或者一些检查工具 AssetR…

three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程002 - three.js正交相机OrthographicCamera</title><script src"ThreeJS/three.js"></script><script src&qu…

LLMs之Vanna:Vanna(利用自然语言查询数据库的SQL工具+底层基于RAG)的简介、安装、使用方法之详细攻略

LLMs之Vanna&#xff1a;Vanna(利用自然语言查询数据库的SQL工具底层基于RAG)的简介、安装、使用方法之详细攻略 目录 Vanna的简介 1、用户界面 2、RAG vs. Fine-Tuning 3、为什么选择Vanna&#xff1f; 4、扩展Vanna Vanna的安装和使用方法 1、安装 2、训练 (1)、使用…

IPv6--ACL6(IPv6访问控制列表--基本ACL6配置)

ACL基本原理 ACL由一系列规则组成,通过将报文与ACL规则进行匹配,设备可以过滤出特定的报文。 ACL的组成 ACL编号: 在网络设备上配置ACL时,每个ACL都需要分配一个编号,称为ACL编号,用来标识ACL。不同分类的ACL编号范围不同,这个后面具体讲。 规则: 前面提到了,一个AC…

vectorCast——Probe point 功能实现故障注入,局部变量打印,断点调试。

选择一个测试用例,选择coverage窗口进行查看。点击edit probe point,如图所示绿色的小圆圈。选代码中选择需要打断点的地方进行点击。黑色的小圆点都可以选。点击黑色小圆点,小圆点变绿,表示打断点成功。此时就可以根据自己的需求在打断点的位置编写一些C语言的命令语句。点…

C语言之编译和链接

C语言之编译和链接 文章目录 C语言之编译和链接翻译环境和运行环境1 翻译环境编译1.1.1 预处理&#xff08;预编译&#xff09;1.1.2 编译第一步&#xff1a;词法分析第二步&#xff1a;语法分析第三步&#xff1a;语义分析 1.1.3 汇编 链接 2. 运行环境 翻译环境和运行环境 在…

Autosar信息安全入门系列01-SecOC基础介绍

本文框架 1. 概述2. SecOC基本概念2.1 SecOC是什么&#xff1f;2.2 新鲜度值与MAC值2.3 SecOC报文格式 3. SecOC报文发送及接收逻辑3.1 SecOC报文的发送3.2 SecOC报文的接收 1. 概述 本文为Autosar通信入门系列介绍&#xff0c;如您对AutosarMCAL配置&#xff0c;通信&#xf…

Vue中的日历组件 Calendar 实现 考勤打卡记录

日历组件 Calendar 可以自定义在页面添加内容。 实现效果图 1.由于Calendar没有右上角月份切换的API事件&#xff0c;可以给组件源码添加自定义添加一个事件 2.也可以通过自带的input事件来获取日历 3.vue页面完整代码 注释&#xff1a;this.$m(this.beginTime).format(…

linux C语言socket函数recv

recv 函数是在 Linux C 语言网络编程中用于从已连接的套接字接收数据的函数。它通常与 TCP 连接一起使用&#xff0c;但也可以用于 UDP&#xff08;尽管对于 UDP&#xff0c;更常使用 recvfrom&#xff0c;因为它还可以接收发送方的地址信息&#xff09;。 函数原型 recv 函数…