前后端分离项目后端基本流程

这里放一个项目,简单,适合对业务流程有一定了解的,写的很细了,看到不懂的地方看下链接项目,因为我也在用这项目练习,白卷项目

最开始要在pom.xml文件里面添加依赖,方便写代码,每个人的pom文件需要的东西都不一样,这里就不放我的了

创建状态码文件,可以让你知道你写的接口返回给的数据成功了没有。

package com.evan.wj2.result;

import lombok.Data;

@Data
public class Result {
    //响应码
    private int code;

    public Result(int code) {
        //this.code表示类的变量,code是方法的参数,this.code=code就是把传入的值赋值给类的变量,实例化的时候就有值了。
        this.code = code;
    }
}

创建实体类,这是对应你数据库里面数据表的字段,就是说数据表里面有哪些字段,这里面也要写,这里存放的是用户信息

package com.evan.wj2.model;

import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.Id;

//使用data注解可以省略写set,get方法
@Data
//表示这是一个实体类
@Entity
//表示对应的数据表名是user
@TableName("user")
@JsonIgnoreProperties({"handler", "hibernateLazyInitializer"})
public class User {
    //声明id是user表里的主键
    @Id
    //swagger里面的注解,方便以后用swagger查看接口信息
    @ApiModelProperty(value = "用户id")
    private int id;
    @ApiModelProperty(value = "用户名")
    private String username;
    @ApiModelProperty(value = "密码")
    private String password;
}

创建DTO(数据传输对象),这里写的是登录接口,需要传输用户名和密码,DTO和实体类是有关系的,登陆时把数据传给前端的时候不可能把所有的数据传给前端,所以需要写一个DTO来存放需要传输的数据,这里注意实体类对应数据库表,DTO对应传输数据,不能搞混并混合使用,容易混淆。

package com.evan.wj2.dto;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class LoginDTO {
    @ApiModelProperty(value = "用户名")
    private String username;
    @ApiModelProperty(value = "密码")
    private String password;
}

配置数据库连接application文件

# 端口配置
server.port=8443

# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/wj2?characterEncoding=UTF-8&serverTimezone=GMT%2B8
spring.datasource.username=你的数据库用户名
spring.datasource.password=你的数据库密码
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

创建controller文件,我有一定基础,所以创建文件的顺序和别人应该不一样

package com.evan.wj2.controller;

import com.evan.wj2.dto.LoginDTO;
import com.evan.wj2.model.User;
import com.evan.wj2.result.Result;
import com.evan.wj2.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
//@RestController 是@controller和@ResponseBody 的结合
@RestController
public class LoginController {
    //自动注入
    @Autowired
    UserService userService;
    //这个注解是用来跨域的注解
    @CrossOrigin
    //前端的请求路径和HTTP请求方式
    @RequestMapping(value = "/api/login", method = RequestMethod.POST)
    //从前端requestbody请求体里接收前端用户输入的用户名和密码,存入LoginDTO里面
    public Result login(@RequestBody LoginDTO loginDTO) {
        //声明一个user对象,是User类型的,接收userService传过来的login数据
        User user = userService.login(loginDTO);
        //如果user不为空说明从数据库里拿到了数据
        if (user!=null){
            //返回200状态码,代表成功
            return new Result(200);
            //或者
        }else {
            //如果user为空,说明没有拿到数据,返回400的状态码,代表失败
            return new Result(400);
        }
    }
}

创建service文件,这里是interface接口不是class类

package com.evan.wj2.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.evan.wj2.dto.LoginDTO;
import com.evan.wj2.model.User;
//使用了mybatis-plus,所以这里要继承IService
public interface UserService extends IService<User> {

    User login(LoginDTO loginDTO);
}

在service文件夹里创建impl文件夹,再创建业务逻辑实现文件UserServiceImpl

package com.evan.wj2.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evan.wj2.dto.LoginDTO;
import com.evan.wj2.mapper.UserMapper;
import com.evan.wj2.model.User;
import com.evan.wj2.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
//这个注解表示他是service层,不懂的去看看java三层架构
@Service
//这里也使用了mybatis-plus也继承ServiceImpl,然后实现UserService
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Autowired
    UserMapper userMapper;

    @Override
    //把前端传入的数据放入参数里
    public User login(LoginDTO loginDTO) {
        //这里使用了mybatis-plus,是对数据库发出指令,并不是直接修改数据库内容,这里进行查询操作
        QueryWrapper<User> loginWrapper = new QueryWrapper<>();
        //上面声明了loginWrapper对象,这里的意思是User表里得到的用户名要和传入的loginDTO数据得到的用户名相等
        loginWrapper.lambda().eq(User::getUsername, loginDTO.getUsername())
                //同上,把用户名改成密码
                .eq(User::getPassword, loginDTO.getPassword());
        //返回根据传入的数据查询出的结果,selectOne是BaseMapper里面的知识,也是mybatis-plus
        return userMapper.selectOne(loginWrapper);
    }
}

创建mapper文件,实际对数据库的一系列操作都是在mapper层操作,简单的单表查询和修改可以使用mybatis-plus来少写SQL语句,但面对多表操作就需要自己写SQL语句了,一般是在mapper曾里面写一个方法添加@Select,或者@Insert注解来写sql语句,不用在xml里面写复杂的配置

package com.evan.wj2.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.evan.wj2.model.User;
import org.apache.ibatis.annotations.Mapper;
//声明这是mapper
@Mapper
//这里也使用了mybatis-plus需要继承BaseMapper
public interface UserMapper extends BaseMapper<User> {
}

在这个项目里还需要跨域,直接复制后端源代码里config文件夹里面的MyWebConfigurer就行了

到这里一个登录就写完了,因为我也是新手,业务逻辑实现有可能写的不对但没发现,但大体上应该没问题

登录之后前端vue接收到200状态码,没有跳转页面,我前端不好,他那个前端源代码我改不来,有大佬看到的话可以改下前端的路由拦截器,链接放评论区,这里放我改的

原来的前端源代码在components文件夹下面的Login.vue里面,这是源代码

 methods: {
      login () {
        var _this = this
        this.$axios
          .post('/login', {
            username: this.loginForm.username,
            password: this.loginForm.password
          })
          .then(resp => {
            if (resp.data.code === 200) {
              var data = resp.data.result
              _this.$store.commit('login', data)
              var path = _this.$route.query.redirect
              _this.$router.replace({path: path === '/' || path === undefined ? '/admin/dashboard' : path})
            } else {
              this.$alert(resp.data.message, '提示', {
                confirmButtonText: '确定'
              })
            }
          })
          .catch(failResponse => {})
      }
      }
    }

我改的

methods: {
      login () {
        this.$axios
          .post('/login', {
            username: this.loginForm.username,
            password: this.loginForm.password
          })
          .then(successResponse => {
            if (successResponse.data.code === 200) {
              this.$router.replace({path: '/index'})
            }
          })
          .catch(failResponse => {
          })
      }
    }
  }

之后接收到200状态码就可以跳转页面了

如果你改完之后打开页面发现页面一片空白,打开(我用的谷歌,其他浏览器我不知道一不一样)浏览器控制台报"undefined" is not valid JSON错误,就点击控制台的应用,找到本地存储空间,把下面的东西鼠标右键清除,再打开就行了

这就是写一个接口的流程,登录这里没写完,因为我技术不达标写不到很完美的地步,而且一般加入公司后都是中途加入项目,登录接口这些最重要的东西别人肯定都写好了的,新手只需要关注怎么把数据库里的数据传到前端就好了,token和session这些东西可以以后等你技术更好了再去了解,反正我现在了解的挺痛苦的。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值