自己开发完整项目一、登录注册功能-01

news2024/11/13 11:26:43

 一、创建spingboot项目框架

1.首先创建一个空的项目作为父项目,之后的所有都在此基础上创建模块进行开发。

2.创建负责登录注册功能模块

二、启动项目

1.出现如下错误,代表着端口号被占用,这个时候,我们可以进行端口号的修改。

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2024-08-29 13:35:55.964 ERROR 27624 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:
//这行错误提示我们8080端口被占用
Web server failed to start. Port 8080 was already in use.   

Action:

Identify and stop the process that's listening on port 8080 or configure this application to listen on another port.


Process finished with exit code 1

 2.修改login模块的端口号,在配置文件application.properties中进行修改,端口号设置为9090

//将服务端口设置为9090,这个端口号可以自己设置
server.port=9090

3.再次启动项目,出现如下提示,代表着项目启动完成

//自己项目的启动日志 :MySpringBootLoginApplication 应用正在使用 Java 17.0.10 版本在 WIN-20240219KIE 机器上启动,进程ID为 21296,工作目录在 E:\AnZhuangChengXu\java Project\spring01\mySpringBoot
2024-08-29 13:39:16.960  INFO 21296 --- [           main] c.l.m.MySpringBootLoginApplication       : Starting MySpringBootLoginApplication using Java 17.0.10 on WIN-20240219KIE with PID 21296 (E:\AnZhuangChengXu\java Project\spring01\mySpringBoot\mySpringBoot-login\target\classes started by Administrator in E:\AnZhuangChengXu\java Project\spring01\mySpringBoot)
//没有设置活动的配置文件,将使用默认的 "default" 配置文件
2024-08-29 13:39:16.962  INFO 21296 --- [           main] c.l.m.MySpringBootLoginApplication       : No active profile set, falling back to 1 default profile: "default"
//tomcat初始化启动,Tomcat 服务器已初始化,HTTP服务端口为 9090
2024-08-29 13:39:17.677  INFO 21296 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 9090 (http)
//ervlet 引擎(Apache Tomcat/9.0.68)正在启动
2024-08-29 13:39:17.685  INFO 21296 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2024-08-29 13:39:17.685  INFO 21296 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.68]
//Spring 嵌入式 Web 应用上下文正在初始化,初始化完成耗时 746 毫秒
2024-08-29 13:39:17.765  INFO 21296 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2024-08-29 13:39:17.765  INFO 21296 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 746 ms
//MySpringBootLoginApplication 应用已启动,启动耗时 1.408 秒,JVM 运行时间为 2.349 秒
2024-08-29 13:39:18.038  INFO 21296 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9090 (http) with context path ''
2024-08-29 13:39:18.045  INFO 21296 --- [           main] c.l.m.MySpringBootLoginApplication       : Started MySpringBootLoginApplication in 1.408 seconds (JVM running for 2.349)
//Spring 的 DispatcherServlet 正在初始化,初始化完成耗时 0 毫秒
2024-08-29 13:39:42.548  INFO 21296 --- [nio-9090-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-08-29 13:39:42.549  INFO 21296 --- [nio-9090-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-08-29 13:39:42.549  INFO 21296 --- [nio-9090-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms

 三、创建后端统一返回结果类型

引用:构建spring boot web项目:三、设置统一返回、统一异常处理_springboot 编写统一返回,统一报错-CSDN博客

1.创建成功类型以及错误类型的枚举类

package com.ljy.myspringbootlogin.commont;

public enum ErrorCodeEnum {

    // 成功
    SUCCESS(200, "成功"),

    // 40xxx表示请求方原因导致的异常

    /**
     * 通用异常(400xx)
     */
    BUSINESS_EXCEPTION(40000, "业务异常"),
    PARAMETER_ERROR(40001, "参数异常"),

    /**
     * 参数异常(401xx)
     */
    MISSING_PARAMETERS(40100, "参数缺失"),

    /**
     * 用户异常(4021X)
     */
    USER_NOT_EXIST(40210, "用户不存在"),
    USER_PHONE_NOT_EXIST(40210, "用户手机不存在"),
    USER_NAME_DUPLICATE(40211, "用户名称重复"),
    USER_DUPLICATE(40212, "用户重复添加"),
    USER_ALREADY_BIND(40213, "用户已经绑定微信,重新绑定需退出原绑定微信"),
    USER_NO_WORKGROUP(40214, "用户部门没有关联工作组"),
    USER_NO_DEPT(40215, "用户没有部门信息"),
    USER_DELETE_SELF_ERROR(40216, "您无法删除自己"),
    USER_NOT_PHONE(40217, "未获取到有效手机号码,请联系智慧云门户配置"),
    USER_NAME_EMPTY(40009, "用户名不能为空"),
    USER_PASSWORD_EMPTY(40010, "密码不能为空"),

    /**
     * 角色异常(4022X)
     */
    ROLE_NOT_EXIST(40220, "角色不存在"),
    ROLE_NAME_DUPLICATE(40221, "角色名称重复"),
    USER_ROLE_DUPLICATE(40222, "用户已关联此角色"),
    USER_NO_ROLE(40223, "用户未分配角色,请联系管理员处理"),
    REL_ROLE_ERROR(40224, "关联角色失败"),
    ROLE_IN_USE(40225, "角色使用中"),
    USE_DELETE_ERROR(40226, "无法删除"),

    /**
     * 部门异常(4023X)
     */
    /**
     * 认证异常(403xx)
     */
    TOKEN_GENERATE_ERROR(40300, "生成token错误"),
    LACK_TOKEN(40301, "token缺失"),
    AUTHORIZED_TIMEOUT(40302, "token过期"),
    LOGIN_ERROR(40303, "用户登录失败"),
    NO_LOGGED_IN(40304, "用户未登录"),
    UNAUTHORIZED(40305, "接口未授权"),



    WITHOUT_AUTHORITY(40001, "用户没有权限"),
    ILLEGAL_PARAMETER(40002, "参数非法"),
    USER_FROZEN(40005, "用户已冻结"),
    USER_EMAIL_DUPLICATE(40007, "用户邮箱重复"),
    USER_WITHOUT_DEPARTMENT(40008, "用户没有所属部门"),
    USER_PASSWORD_DUPLICATE(40011, "用户新密码与旧密码重复"),
    USER_EMAIL_NOT_REGISTERED(40012, "该邮箱未注册"),
    ROLE_ASSOCIATE_WITH_USER(40014, "当前角色下存在用户,请为用户分配新角色后删除"),
    ROLE_CODE_DUPLICATE(40015, "角色码重复"),
    DEPARTMENT_ASSOCIATE_WITH_USER(40017, "当前部门或子部门下存在用户,请为用户分配新部门后删除"),
    ILLEGAL_TOKEN(40018, "token非法"),
    AUTHENTICATED_TIMEOUT(40019, "认证超时"),

    DATE_PARSE_ERROR(40021, "解析日期格式错误,请检查日期格式"),
    DEPART_NOT_FOUND(40022, "部门不存在"),
    USER_PASSWORD_IS_INCORRECT(40022, "用户或密码不正确"),
    WORKING_STATUS(40023, "用户已离职或被冻结"),
    ACCOUNT_LOCK(40024, "账号被锁定"),

    // 50xxx表示响应方原因导致的异常
    RUNTIME_EXCEPTION(50000, "运行时异常"),
    SYSTEM_EXCEPTION(50001, "系统异常"),
    REDIS_READ_TIMEOUT(50002, "redis数据读取超时"),
    REDIS_WRITE_TIMEOUT(50003, "redis数据写入超时"),
    MINIO_READ_TIMEOUT(50004, "minio数据读取超时"),
    MINIO_WRITE_TIMEOUT(50005, "minio数据写入超时"),
    MINIO_READ_ERROR(50006, "minio读取数据失败"),
    MINIO_WRITE_ERROR(50007, "minio写入数据失败"),
    DATA_CONNECT_ERROR(50008, "数据库连接失败"),
    MINIO_CONNECT_ERROR(50008, "minio连接失败"),
    MINIO_FILE_NOT_FOUND(500010, "未查询到对应文件记录"),
    MINIO_FILE_NAME_TOO_LONG(50041, "文件名称过长,不能超过127个字符"),
    MINIO_FILE_SUFFIX_ERROR(50042, "文件后缀名非法"),
    MINIO_FILE_SIZE_ERROR(50043, "上传文件过大[单文件大小不得超过:%sMB],如需修改请联系管理员"),
    MINIO_FILE_TOTAL_SIZE_ERROR(50044, "上传文件过大[总上传文件大小不得超过:%sMB],如需修改请联系管理员"),
    FILE_SIZE_ERROR(50045, "上传文件失败"),
    MINIO_PICTURE_FILE_SIZE_ERROR(50046, "上传图片失败,图片大小不得超过:%sMB,如需修改请联系管理员"),

    BEAN_CLONE_ERROR(50010, "克隆bean失败"),
    BEAN_COPY_ERROR(50011, "复制bean失败"),

    DOWNLOAD_ERROR(500020, "下载失败"),

    DOWNLOAD_FILE_EMPTY(500021, "下载附件记录为空"),

    DOWNLOAD_FILE_NOTFOUND(500022, "未找到下载文件或下载文件已删除"),

    // 文件类异常
    ANALYSE_FILE_NAME_ERROR(50021, "解析文件名称失败"),

    // 压缩类异常
    ZIP_FILE_ERROR(50031, "压缩文件失败"),

    SQL_ERROR(50201, "系统异常"),

    MD5_ERROR(50202, "MD5加密失败"),
    URL_PARSE_ERROR(50203, "url编码失败"),

    /**
     * 系统异常信息
     */
    SYSTEM_INSERT_ID_EXIT(60501, "新增系统id必须为空"),
    SYSTEM_UPDATE_ID_EXIT(60502, "更新系统id必须不能为空"),
    SYSTEM_BASE_NOT_EXIT(60503, "新增|修改系统基础信息不存在"),


    ;


    private final int code;

    private final String message;

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    ErrorCodeEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public static String getMessageByCode(Integer code) {
        for (ErrorCodeEnum codeEnum : ErrorCodeEnum.values()) {
            if (codeEnum.getCode() == code) {
                return codeEnum.getMessage();
            }
        }
        return "";
    }
}

2.创建统一返回类型

package com.ljy.myspringbootlogin.commont;

import java.io.Serializable;

public class Reuslt<T> implements Serializable {

    private static final long serialVersionUID = 7498171848815486866L;

    /**
     * 状态码
     */
    private int code;

    /**
     * 信息
     */
    private String msg;

    /**
     * 数据
     */
    private T data;
    /**
     * 时间戳
     */
    private long timestamp ;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }

    public Reuslt(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
        this.timestamp = System.currentTimeMillis();
    }

    public Reuslt() {
    }

    private Reuslt(int code, String msg) {
        this(code, msg, null);
    }

    /**
     * 封装请求成功的返回值
     *
     * @param data 返回值
     * @return R
     */
    public static <T> Reuslt<T> ok(T data) {
        return new Reuslt<>(ErrorCodeEnum.SUCCESS.getCode(), ErrorCodeEnum.SUCCESS.getMessage(), data);
    }

    /**
     * 封装请求失败的返回值
     *
     * @param errorCode 系统定义的业务错误码和错误信息
     * @return R
     */
    public static <T> Reuslt<T> error(ErrorCodeEnum errorCode) {
        return new Reuslt<>(errorCode.getCode(), errorCode.getMessage());
    }

    /**
     * 封装请求失败的返回值
     *
     * @param code    自定义业务错误码
     * @param message 自定义业务错误信息
     * @return R
     */
    public static <T> Reuslt<T> error(int code, String message) {
        return new Reuslt<>(code, message);
    }

    /**
     * 封装请求失败的返回值(系统定义的业务错误码+自定义业务错误信息)
     *
     * @param message 自定义业务错误信息
     * @return R
     */
    public static <T> Reuslt<T> error(String message) {
        return new Reuslt<>(ErrorCodeEnum.BUSINESS_EXCEPTION.getCode(), message);
    }


}

 3.测试

3.1 编写测试controller

package com.ljy.myspringbootlogin.controller;

import com.ljy.myspringbootlogin.commont.Reuslt;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/test")
public class TestController {

    //创建登录控制器
    @RequestMapping("/test01")
    public Reuslt<String> aaa(){
        String a="测试";
        return Reuslt.ok(a);
    }

}

3.1.2 通过浏览器访问

 

 四、配置后端跨域

package com.ljy.myspringbootlogin.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 用于配置跨源资源共享(CORS)策略
 * @Configuration:这是一个Spring框架的注解,用于标记当前类是一个配置类,Spring容器在启动时会自动扫描并加载这个配置类
 * registry.addMapping("/")**:这行代码表示对所有路径(/**表示匹配所有路径)应用CORS策略
 * .allowCredentials(true):允许发送Cookie。默认情况下,出于安全考虑,浏览器不允许跨源请求携带Cookie。设置这个属性为true表示允许携带Cookie
 * .allowedOriginPatterns("*"):允许所有原始域进行跨域请求。这里的*表示接受所有域的请求
 * .allowedMethods(new String[]{"GET","POST","PUT","DELETE"}):设置允许的HTTP请求方法,这里允许GET、POST、PUT、DELETE方法
 * .allowedHeaders("*"):允许所有HTTP头信息
 * .exposedHeaders("*"):浏览器可以访问的响应头。这里设置为*表示所有响应头都可以被浏览器访问
 */
@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry){
        registry.addMapping("/**")
                .allowCredentials(true) //是都发送Cookie
                .allowedOriginPatterns("*")//放心哪些原始域
                .allowedMethods(new String[]{"GET","POST","PUT","DELETE"})
                .allowedHeaders("*")
                .exposedHeaders("*");

    }
}

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

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

相关文章

如何从笔记本电脑或台式电脑恢复丢失的照片和视频

意外删除或丢失笔记本电脑或 PC 上的照片和视频是一个常见问题。不用担心&#xff0c;在此博客中&#xff0c;我们解释了从笔记本电脑或 PC 恢复丢失的照片和视频的各种方法。专业的数据恢复软件&#xff0c;例如奇客 数据恢复工具&#xff0c;可以帮助用户找回丢失的文件。 提…

微信小程序uni :class不支持xxx语法

问题代码&#xff1a; <view class"cellTop"><view>{{list.payTime}}</view><view :class"payStatusClass${list.payStatus}">{{payStatusDe[list.payStatus]}}</view></view> .payStatusClass1{color: rgb(246, 122,…

传输层协议-UDP数据报

UDP协议的特点 面向数据报&#xff0c;无连接&#xff0c;不可靠&#xff0c;全双工 面向数据报&#xff1a;是指该协议在传输数据的时候使用的是数据报&#xff1b; 无连接&#xff1a;指的是发送数据不需要两个进程连接在一起&#xff0c;类似生活中我们发送短信&#xff0…

代码随想录跟练第九天——LeetCode 232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

拔了智齿后&#xff0c;好久没有总结了&#xff0c;先补一点 232.用栈实现队列 力扣题目链接(opens new window) 使用栈实现队列的下列操作&#xff1a; push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- …

解锁App推广新姿势,Xinstall带你玩转投放查看

在移动互联网时代&#xff0c;App推广和运营成为了各大企业和开发者关注的焦点。然而&#xff0c;在这个过程中&#xff0c;推广者常常面临一些痛点&#xff0c;比如无法实时查看投放效果、数据不透明、难以精准定位目标用户等。这些问题不仅影响了推广效果&#xff0c;还可能导…

这些网络设备知名厂商你都不知道?白干这行了

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 你们好啊&#xff0c;我的网工朋友。 信息技术的快速发展&#xff0c;网络行业已经成为推动全球经济和社会进步的重要力量之一。无论是企业还是个…

CI/CD实践(五)Jenkins Docker 自动化构建部署Node服务

微服务CI/CD实践系列&#xff1a; 微服务CI/CD实践&#xff08;一&#xff09;环境准备及虚拟机创建 微服务CI/CD实践&#xff08;二&#xff09;服务器先决准备 微服务CI/CD实践&#xff08;三&#xff09;gitlab部署及nexus3部署 微服务CI/CD实践&#xff08;四&#xff09…

Linux驱动学习之input子系统

简介 input 子系统就是管理输入的子系统&#xff0c;和pinctrl、gpio 子系统一样&#xff0c;都是 Linux 内核针对某一类设备而创建的框架。按键、鼠标、键盘、触摸屏等都属于输入设备&#xff0c;linux内核为此专门做了一个叫做input子系统的框架来处理输入事件。输入设备本…

day44——面向对象特征

一、封装 1.1 面向对象的三大特质 封装、继承、多态&#xff0c;如果问有四大特征&#xff0c;可以外加一个抽象 封装&#xff1a;将实现同一事物的所有的属性&#xff08;成员变量&#xff09;和行为&#xff08;成员函数&#xff09;封装到一个整体&#xff0c;我们称之为…

【Datawhale AI夏令营】从零上手CV竞赛Task2

文章目录 前言一、YOLO是什么&#xff1f;二、YOLO的历史三、性能指标四、 性能指标计算公式五、性能优化总结 前言 本文的Task2是对Task1的baseline代码进行优化的过程。 一、YOLO是什么&#xff1f; 首先简单介绍一下YOLO模型&#xff1a; 物体检测算法主要分为两类&#…

MSTP多实例生成树的配置

SW1配置&#xff1a; vlan batch 1 to 100 interface GigabitEthernet0/0/1 port link-type trunk port trunk allow-pass vlan 2 to 4094 interface GigabitEthernet0/0/2 port link-type trunk port trunk allow-pass vlan 2 to 4094 stp mode mstp //修改生成树的模式为…

【多线程】创建线程到底是多少种方法?

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 创建线程的两种方式总结(最官方)1.1 继承 Thread 类1.2 实现 Runnable 接口1.3 优先考虑使用第二种 —— …

三. Spring Boot 当中的“容器功能” 和 “配置绑定” 的详细剖析(附+源代码流程)

三. Spring Boot 当中的“容器功能” 和 “配置绑定” 的详细剖析(附源代码流程) 文章目录 三. Spring Boot 当中的“容器功能” 和 “配置绑定” 的详细剖析(附源代码流程)1. Spring Boot 是继续支持了 Spring 当中的注解的1.2 Spring 当中的 Component&#xff0c;Controller…

通过visual studio进行dump文件调试和分析

0、前言 很多时候程序crash之后需要分析原因。对于C/C程序&#xff0c;一般最常见的场景和方法就是根据dump文件进行分析。 1、分析的前提条件 进行dump文件分析&#xff0c;需要以下文件&#xff1a; 进程crash时产生的dump文件程序源码进程对应的程序exe文件编译exe文件时产…

QT Quick QML 添加海康威视SDK云台控制模块

文章目录 1. 配置海康威视 SDK 下载SDK文件移植工程文件添加 2. 函数调用流程接口参考代码 3. 代码后端核心代码前端核心代码 GitHub 源码: QmlLearningPro &#xff0c;选择子工程 HkwsDemo.pro &#xff08;暂未上传&#xff09; QML 其它文章请点击这里: QT QUICK …

Monibuca实战:如何用Go语言打造高效的直播后端

简介 Monibuca&#xff08;简称&#xff1a;m7s&#xff09; 是一个开源的实时流媒体服务器开发框架&#xff0c;使用 Go 语言编写。 它的设计目标是提供一个高性能、可扩展、易于定制的实时流媒体服务器解决方案。 Monibuca 的核心理念是模块化&#xff0c;允许开发者根据需…

文件禁止外发的方法有哪些?企业如何禁止文件外发:六个控制文件外发的小窍门!

想象一下&#xff0c;企业信息如同珍贵的宝藏&#xff0c;而文件外发就像不经意间打开的后门&#xff0c;让宝藏暴露在风雨之中&#xff01;今天&#xff0c;我们就来聊聊如何给这扇后门加上六道坚实的锁&#xff0c;确保企业信息的安全无虞。让我们一起探索六个控制文件外发的…

Mask R-CNN论文原理讲解

论文:arxiv.org/pdf/1703.06870 代码&#xff1a;maskrcnn-benchmark:Fast, modular reference implementation of Instance Segmentation and Object Detection algorithms in PyTorch. - GitCode Mask R-CNN简介 Mask R-CNN是何凯明大神的新作。Mask R-CNN是一种在有效检测…

武器弹药制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

武器弹药制造领域作为国防工业的重要组成部分&#xff0c;其数字化转型更是关乎国家安全与军事实力提升的关键。随着5G、物联网、大数据、云计算及人工智能等先进技术的融合应用&#xff0c;武器弹药制造5G智能工厂物联数字孪生平台应运而生&#xff0c;正逐步成为推进制造业数…

分享5款支持论文写作网站先稿后付的网站!

在当今学术研究和学术写作领域&#xff0c;AI论文写作工具已经成为不可或缺的助手。这些工具不仅能够提高写作效率&#xff0c;还能帮助研究人员生成高质量的论文内容。特别是那些提供“先稿后付”服务模式的网站&#xff0c;更是为用户提供了极大的便利和保障。以下是五款值得…