后端系统开发之——创建注册接口

原文地址:后端系统开发之——创建注册接口 - Pleasure的博客

下面是正文内容:

前言

这是一篇SpringBoot项目的实践篇。

主要用于介绍如何从零开始搭建某一种类型的系统。

个人认为,只要后端逻辑完善了,纵使前端页面千变万化都可以慢慢来,符合自己的审美就行。

当然我也才刚起步,不可能全部都是自己手搓(肯定会有所借鉴)。

正文

大致思路

接口的实现,一般要包括下面的几种功能:

注册,登录,获取用户详细信息,更新用户基本信息,更新用户头像,更新用户密码。

需要了解数据表中用户表的表结构(在此基础上进行搭建)

大致具体的流程:明确功能需求,阅读接口文档(明确输入输出),思路分析,开发写代码,调试正确性

接口文档,通常包括:基本信息(请求路径,请求方式,接口描述),请求参数(请求参数格式,请求参数说明),响应数据(响应数据类型,响应数据说明)

前置知识

先介绍一下前置知识——MVC(Model-View-Controller)架构。

必须掌握,不然你都不知道各个文件的作用以及对于整个项目的影响。

MVC通常用于构建用户界面和应用程序的组织结构,将应用程序分成三个核心组建:模型层(Model)、视图层(View)和控制层(Controller),每个部分都有不同的职责和功能。

以Web应用程序为例来进行解释。

控制层通常用于处理业务逻辑传递给视图层用于渲染页面,通常属于后端。

前端页面就属于视图层,负责展示模型层中的数据给用户,接收用户的操作。

模型层通常分为下面的几个类:

  • 实体类(Entity),应用程序中的基本数据对象,通常与数据库中的表与文档相对应,包含了数据的结构和属性,决定了数据结构和关系,提供了数据的访问方式。
  • 数据访问对象(DAO),用于与数据库进行交互的接口或类,负责执行数据库的CRUD(创建、读取、更新、删除)操作,并将数据库中的数据映射到实体类中。
  • 业务逻辑(Business Logic),是应用程序中处理业务规则和流程的部分,用于执行特定的业务操作,并确保数据的完整性和一致性。(核心部分)
  • 数据传输对象(DTO),用于在不同层之间传递数据的对象,它通常包含了一组数据属性和相应的访问方法。通常用于将实体类中的数据传递给视图层或控制层。

控制层通过将用户的请求转换成对模型层方法(接口)的调用来执行特定的业务操作,然后根据模型层返回的结果来决定如何响应用户的请求,并将模型处理的结果返回给视图层或者直接给用户。

控制器层和模型层的分离使得业务逻辑与用户界面的交互得以解耦,使得应用程序的不同部分可以独立开发、测试和维护。控制器层负责协调用户请求和业务逻辑的处理,而模型层负责处理具体的业务逻辑,从而实现了逻辑层和表示层的分离。

私有字段、公共getter和setter

私有字段是指类中的成员变量(属性),其访问权限仅限于类内部。。公共Getter和Setter是用于读取和修改对象的私有字段的公共方法。Getter用于获取私有字段的值,而Setter用于设置私有字段的值。主要用于封装对象的状态并提供对其访问和修改的方法。

顺便插一句:添加lombok依赖的作用,自动为实体类生成不同类型的构造函数,从而简化了Java代码编写时构造函数的麻烦。

主要组成部分

下面结合上面介绍的MVC典型架构,来解释一下SpringBoot项目中不同文件夹各自的作用。

  • controller文件夹——控制层,在使用中通常用于接收用户的HTTP请求并返回HTTP响应,需要调用相应的业务逻辑。
  • mapper文件夹——通常负责与数据库进行交互
  • pojo文件夹——通常包含表示简单Java对象的Java类,具有私有字段、公共getter和setter,以及可能的构造函数。这些类通常用于在应用程序中建模数据,并且通常用作实体类或数据传输对象。
  • service文件夹——模型层,包含具体服务的接口。
  • service文件夹下的impl——用于上层文件夹接口的具体实现。
  • utils文件夹——通常存放着一些工具类,是一些通用的、不属于业务逻辑的功能模块。用来执行一些常见的操作,比如字符串处理、日期操作、文件操作等。

user数据表——对应的字段以及属性

用户密码一般需要经过加密,数据库中记录MD5值

用户头像一般储存在第三方服务器上,数据库中记录索引值

部分代码

如果不是想具体上手实践的这一部分可以直接跳过了。结合上面提供的项目文件结构直接进行复制粘贴使用即可。

需要在pom.xml中添加lombok的依赖。

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
    </dependency>

controller文件夹下的UserController.java的内容

package org.example.controller;

import org.example.pojo.Result;
import org.example.pojo.User;
import org.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping("register")
    public Result register(String username,String password){
        //查询用户
            User u = userService.findByUserName(username);
            if (u==null){
                //没有占用
                //注册
                userService.register(username,password);
                return Result.success();
            }else{
                //占用
                return Result.error("用户名已被占用");
            }
        //注册
    }
}

mapper文件夹下的UserMapper.java的内容

package org.example.mapper;

import org.example.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface UserMapper {
    //根据用户名查询用户
    @Select("select * from user where username=#{username}")
    User findByUserName(String username);

    //添加
    @Insert("insert into user(username,password,create_time,update_time)" +
            " values(#{username},#{password},now(),now())")
    void add(String username, String password);
}

pojo文件夹下的User.java的内容

package org.example.pojo;

import lombok.Data;

import java.time.LocalDateTime;
//lombok 在编译阶段,为实体类自动生成setter getter toString
//pom 文件中引入依赖 在实体类上添加注释

@Data
public class User {
    private Integer id;//主键ID
    private String username;//用户名
    private String password;//密码
    private String nickname;//昵称
    private String email;//邮箱
    private String userPic;//用户头像地址
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间
}

Article.java的内容

package org.example.pojo;

import lombok.Data;

import java.time.LocalDateTime;

@Data
public class Article {
    private Integer id;//主键ID
    private String title;//文章标题
    private String content;//文章内容
    private String coverImg;//封面图像
    private String state;//发布状态 已发布|草稿
    private Integer categoryId;//文章分类id
    private Integer createUser;//创建人ID
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间
}

Category.java的内容

package org.example.pojo;

import lombok.Data;

import java.time.LocalDateTime;

@Data
public class Category {
    private Integer id;//主键ID
    private String categoryName;//分类名称
    private String categoryAlias;//分类别名
    private Integer createUser;//创建人ID
    private LocalDateTime createTime;//创建时间
    private LocalDateTime updateTime;//更新时间
}

Result.java的内容

package org.example.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//统一响应结果
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Result<T> {
    private Integer code;//业务状态码  0-成功  1-失败
    private String message;//提示信息
    private T data;//响应数据

    //快速返回操作成功响应结果(带响应数据)
    public static <E> Result<E> success(E data) {

        return new Result<>(0, "操作成功", data);
    }

    //快速返回操作成功响应结果
    public static Result success() {

        return new Result(0, "操作成功", null);
    }

    public static Result error(String message) {

        return new Result(1, message, null);
    }
}

Service文件夹下Userservice.java的内容

package org.example.service;

import org.example.pojo.User;
public interface UserService {
    //根据用户名查询用户
    User findByUserName(String username);
    //注册
    void register(String username,String password);
}

UserServiceImpl的内容

package org.example.service;

import org.example.pojo.User;
public interface UserService {
    //根据用户名查询用户
    User findByUserName(String username);
    //注册
    void register(String username,String password);
}

utils文件夹下Md5Util.java的内容

package org.example.service;

import org.example.pojo.User;
public interface UserService {
    //根据用户名查询用户
    User findByUserName(String username);
    //注册
    void register(String username,String password);
}

SystemApplication.java的内容

package org.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SystemApplication {
    public static void main( String[] args ) {
        SpringApplication.run(SystemApplication.class,args);
    }
}

application.yml的内容

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/数据表名
    username: root
    password: root

接口成功验证

因为缺少前端页面,所以需要用到接口检验工具。

这里推荐的软件是Apifox,功能强大且目前使用范围较广。

首先重启一下项目程序

按照下图的方式传递参数,可以看到返回的json格式符合一般接口文档的要求。

可以看到Windows本地MySQL数据库成功接收到新插入的username,password数据。

接口开发成功。

尾声

后面会针对系统需要的功能针对性的一个接口一个接口进行开发,大家点个关注跟进一下。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

硬件基础:带缓启动MOS管电源开关电路

电源开关电路&#xff0c;经常用在各“功能模块”电路的电源通断控制&#xff0c;是常用电路之一。 本文要讲解的电源开关电路&#xff0c;是用MOS管实现的&#xff0c;且带缓开启功能&#xff0c;非常经典。 一、电路说明 电源开关电路&#xff0c;尤其是MOS管电源开关电路…

2024-3-18-C++day6作业

1>思维导图 2>试编程 要求: 封装一个动物的基类&#xff0c;类中有私有成员&#xff1a;姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有&#xff1a;指针成员&#xff1a;腿的个数&a…

蓝桥杯-24点-搜索

题目 思路 --暴力递归全组合的方法。只有4个数&#xff0c;4种计算方式&#xff0c;共有4 * 3 * 2 * 1 * 4种不同的情况&#xff0c;可以写递归来实现。 --每次计算都是两个数之间的运算&#xff0c;因此4个数需要3次计算&#xff0c;第一次计算前有4个数&#xff0c;第二次有…

Mysql与MyBatis

1 Sql语句 增删改查 1.1 建表 -- cmd展示数据库 show databases ; -- cmd登录数据库 mysql localhost -u root -p-- auto_increment 自动增长&#xff0c;每添加一个表项id自动增1 -- char定长字符串 0-255&#xff0c;不足十个字符按十个字符算&#xff0c; varchar变长字符串…

阿里云服务器“地域”,这么选择就对了!

阿里云服务器地域选择方法&#xff0c;如何选择速度更快、网络延迟更低的地域节点&#xff0c;地域指云服务器所在的地理位置区域&#xff0c;地域以城市划分&#xff0c;如北京、杭州、深圳及上海等&#xff0c;如何选择地域&#xff1f;建议根据用户所在地区就近选择地域&…

预防近视的台灯有哪些?多款专家说好的护眼台灯推荐

现在的儿童青少年近视率真的非常高&#xff01;据统计&#xff0c;我国儿童青少年的总体近视率为52.7%&#xff0c;其中6岁儿童为14.3%&#xff0c;小学生为35.6%&#xff0c;初中生为71.1%&#xff0c;高中生为80.5%。而造成如此高近视率的原因主要还是长时间过度用眼导致的疲…

【Qt问题】使用QSlider创建滑块小部件无法显示

问题描述&#xff1a; 使用QSlider创建滑块小部件用于音量按钮的时候&#xff0c;无法显示&#xff0c;很奇怪&#xff0c;怎么都不显示 一直是这个效果&#xff0c;运行都没问题&#xff0c;但是就是不出现。 一直解决不了&#xff0c;最后我在无意中&#xff0c;在主程序中…

LabVIEW飞行器螺旋桨性能测试与数据监控

LabVIEW飞行器螺旋桨性能测试与数据监控 开发LabVIEW的电动飞行器螺旋桨性能测试与数据监控系统&#xff0c;专门针对电动飞行器螺旋桨在运行过程中的性能测试和监控需求。通过采集转速、转矩、拉力和温度等关键参数&#xff0c;系统能够实时监测和分析螺旋桨的状态&#xff0…

AI - 集成学习

目录 集成学习概念 集成学习器性能评估 随机森林 AdaBoost &#x1f606;&#x1f606;&#x1f606;感谢大家的阅读&#x1f606;&#x1f606;&#x1f606; 集成学习概念 &#x1f48e;集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度…

【Spring MVC】Spring MVC拦截器(Interceptor)

目录 一、拦截器介绍 二、拦截器 Interceptor 定义 2.1 HandlerInterceptor接口 2.2 Spring MVC中提供的一些HandlerInterceptor接口实现类 1、AsyncHandlerInterceptor 2、WebRequestInterceptor 3、MappedInterceptor 4、ConversionServiceExposingInterceptor 三、拦…

力扣题单(小白友好)

力扣题单 算法小白自用题单,目前对于一些简单的数据结构感觉掌握的还可以,但是力扣很多题还是需要看题解,不够熟练;故整理了一份题单,用于巩固练习; 网上确实有很多对于算法分类讲解的网站,but:有一丢丢选择困难症,每天不知道该刷什么题,再加上网站对于一类题一般就有十几道题目…

人工智能技术的不当利用与风险

目录 前言1 视频篡改技术的滥用1.1 虚假信息传播与社会动荡1.2 对公众信任的破坏与舆论混乱 2 隐私泄露与监视风险2.1 个人信息安全与数据滥用风险2.2 社会稳定与个人自由权利的平衡 3 虚假评论与信息传播3.1 舆论操纵与社会意识形态的影响3.2 对信息可信度与公众信任的威胁 结…

雷龙发展Nand flash芯片试用体验

一、项目背景 最近自己开始准备了一个智能家居控制系统项目,需要包含室内的温湿度、空气质量、烟雾浓度以及气体含量,能够存储相应的数据,并进行显示。 Nand-flash存储器是flash存储器的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案…

阿里云ecs服务器配置反向代理上传图片

本文所有软件地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/12OSFilS-HNsHeXTOM47iaA 提取码&#xff1a;dqph 为什么要使用阿里云服务器&#xff1f; 项目想让别人通过外网进行访问就需要部署到我们的服务器当中 1.国内知名的服务器介绍 国内比较知名的一些…

一招让你的Mac重获新生!CleanMyMac专业软件助你清理系统垃圾,保障安全!

一、Mac用户必备神器——CleanMyMac 随着Mac的使用时间越来越长&#xff0c;系统中的垃圾文件也会越来越多&#xff0c;不仅占用宝贵的硬盘空间&#xff0c;还会影响系统的运行速度。这时候&#xff0c;一款专业的清理软件就显得尤为重要。CleanMyMac作为荣获多项大奖的清理软件…

录视频的软件推荐,助力视频内容创作

随着网络技术的发展和在线教育的兴起&#xff0c;录制视频教程的需求日益增加。无论是制作教学课程、分享办公技巧&#xff0c;还是录制游戏过程&#xff0c;一款好用的录屏软件都至关重要。本文将深入介绍三款录视频的软件&#xff0c;帮助读者了解它们的特点和操作步骤&#…

【Linux】回顾 C 文件接口

文章目录 1. 写文件2. 读文件3. 输出信息到显示器的几个方法4. stdin / stdout / stderr5. 打开文件的方式 1. 写文件 int main() {FILE* fp fopen("myfile", "w");if (!fp){printf("fopen error!\n");}const char* msg "hello world!\n…

自己录的视频怎么配上字幕?推荐几种方法

自己录的视频怎么配上字幕&#xff1f;在数字化时代&#xff0c;视频已经成为人们获取信息、娱乐消遣的重要形式。而对于许多内容创作者来说&#xff0c;为自己的视频添加字幕不仅能提升观众的观看体验&#xff0c;还能增加视频的专业度和吸引力。那么&#xff0c;如何为自己的…

初次文件包含漏洞

1.文件包含漏洞介绍 1.1.文件包含漏洞解释   文件包含漏洞就是使用函数去包含任意文件的时候&#xff0c;当包含的文件来源过滤不严谨的时候&#xff0c;当存在包含恶意文件后&#xff0c;就可以通过这个恶意的文件来达到相应的目的。 1.2.文件包含漏洞原理    其实原理就…

数据之谜:解读Facebook的用户行为

在当今数字化时代&#xff0c;社交媒体平台已经成为人们生活中不可或缺的一部分&#xff0c;而Facebook作为全球最大的社交网络之一&#xff0c;其背后隐藏着许多数据之谜。本文将深入探讨Facebook的用户行为&#xff0c;并试图解读其中的奥秘。 用户行为数据的收集 Facebook作…