用户中心项目全流程

news2024/10/7 10:15:37

企业做项目流程

需求分析 => 设计(概要设计 、 详细设计) => 技术选型 =>初始化项目 / 引入需要的技术 => 写个小demo => 写代码 (实现业务逻辑) => 测试(单元测试)=> 代码提交 / 代码评审 => 部署 => 发布

需求分析:

1、登录 / 注册

2、用户管理 (管理员权限)

3、用户校验机制 (仅星球用户)

技术选型:


前端:三件套 + React + Ant design(组件库)+umi + ant design pro

后端:java +

springmvc(接口,restful接口开发)

mybatis (提供数据访, 数据持久层支持)

mybatis plus (mybatis的封装)

springboot (快速启动spring项目)

mysql

部署:服务器 / 容器

初始化项目:

1:初始化后端项目

初始化一个springboot项目:

这里有一个注意点,建议就是把springboot的版本改低一点,改到2.x,要不然后面真的会发生很多不兼容

2:初始化数据库:

create table user
(
    id           bigint auto_increment
        primary key,
    username     varchar(256)                       null comment '用户昵称',
    userAccount  varchar(256)                       null comment '账号',
    avatarUrl    varchar(1024)                      null comment '用户头像',
    gender       tinyint                            null comment '性别',
    userPassword varchar(512)                       not null comment '密码',
    phone        varchar(128)                       null comment '电话',
    email        varchar(512)                       null comment '邮箱',
    userStatus   int      default 0                 not null comment '用户状态 0-正常',
    createTime   datetime default CURRENT_TIMESTAMP null comment '创建时间',
    updateTime   datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
    isDelete     tinyint  default 0                 not null comment '是否删除',
    role         int      default 0                 not null comment '0 : 普通用户 1:管理员',
    planetCode   varchar(512)                       null comment '星球编号'
)
    comment '用户';

3:初始化前端项目:

Ant Design Pro_ant design pro百度百科-CSDN博客

4:springboot的配置文件:

spring:
  application:
    name: user-center
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/user
    username: root
    password: 123456


#mybatisplus添加日志功能
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: false
global-config:
  db-config:
    #配置Mybatis-plus操作表的默认前缀
    table-prefix: t_
    #配置Mybatis-plus的主键策略
    # 全局逻辑删除的字段名
    logic-delete-field: isDelete
    # 逻辑已删除值(默认为 1)
    logic-delete-value: 1
    # 逻辑未删除值(默认为 0)
    logic-not-delete-value: 0

主要就是配置了数据库和mybatis-plus插件的使用

mybatis-plus插件自动生成器:

MyBatisX 插件,自动根据数据库生成

domain 实体对象、

mapper(操作数据库的对象)、

mapper.xml(定义了 mapper对象和数据库的关联,可以在里面自己写 SQL)、

service(包含常用的增删改查)、

serviceImpl(具体实现 service)。

5:引入常用依赖:

        <!-- mybatis-plus启动器 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>

依赖这一块引入了一个mybatis-plus和一个lang3后面用来给密码进行加密的一个依赖

编写代码:

登录接口设计:

接受参数:用户账户,密码

请求类型:POST

请求体:JSON格式数据

返回值:用户信息

在写这个接口之前,需要稍微补充一点javaweb的知识:

1、连接服务器后,得到一个匿名session

2、登录成功后,得到登录成功的session,并给该session设置一些值(比如用户信息),返回给前端一个设置cookies的命令。 session => cookies

3、前端收到后端的命令后,设置cookie,保存到浏览器内。

4、前端再次请求后端的时候,在请求头中带上cookies去做请求

5、后端拿到前端传来的cookie,找到对应的session

6、后端从session中可以取出session中存储变量

 具体逻辑设计:

1. 用户在前端输入账户和密码、以及校验码(todo校验码表示可以先不做后期补充)
2. 校验用户的账户、密码、校验密码,是否符合要求
非空
账户长度 不小于 4 位
密码 不小于 6 位
账户不能重复
账户不包含特殊字符
密码和校验密码相同
3. 对密码进行加密(密码千万不要直接以明文存储到数据库中)
4. 向数据库插入用户数据

具体代码实现(三层):

Controller层:
@PostMapping("/login")
    public BaseResponse<User> userLogin(@RequestBody UserLoginRequest userLoginRequest, HttpServletRequest request){
        if(userLoginRequest==null){
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        log.info("用户登录:{}",userLoginRequest);
        final String userAccount = userLoginRequest.getUserAccount();
        final String userPassword = userLoginRequest.getUserPassword();
        User user = userService.userLogin(userAccount,userPassword,request);
        return ResultUtils.success(user);
    }


@Autowired
    private UserService userService;



@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserLoginRequest {
    private String userAccount;
    private String userPassword;
}

用UserLoginRequest来接收前端发送过来的JSON数据(一开始是没有封装的,后面优化的时候进行封装)

Service层:
@Resource
    private UserMapper userMapper;



@Override
    public User userLogin(String userAccount, String password, HttpServletRequest httpServletRequest) {
        //1:校验输入的账户,密码和校验码是否非空
        if (StringUtils.isAnyBlank(userAccount,password)) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "参数为空");
        }
        //账户不小于4位
        if(userAccount.length()<4){
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号过短");
        }
        //密码不小于8位
        if(password.length()<8){
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户账号过短");
        }
        //2:从数据库中查询用户
        String verifyPassword = DigestUtils.md5DigestAsHex((password).getBytes(StandardCharsets.UTF_8));
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("userAccount",userAccount);
        queryWrapper.eq("userPassword",verifyPassword);
        final User user = userMapper.selectOne(queryWrapper);
        if(user==null){
            log.info("user login failed, userAccount cannot match userPassword");
        }
        //3:用户脱敏
        /**
         * 其实这个脱敏就是创建一个新的用户封装一些我们想让前端看到的值,保证用户隐私
         */
        getSaftyUser(user);
        //4:获取用户登录态
        httpServletRequest.getSession().setAttribute(UserConstant.USER_LOGIN_STATE,user);
        return user;
    }



private User getSaftyUser(User user) {
        if(user == null) {
            return null;
        }
        User safetyuser = new User();
        safetyuser.setId(user.getId());
        safetyuser.setUsername(user.getUsername());
        safetyuser.setUserAccount(user.getUserAccount());
        safetyuser.setAvatarUrl(user.getAvatarUrl());
        safetyuser.setGender(user.getGender());
        safetyuser.setPhone(user.getPhone());
        safetyuser.setEmail(user.getEmail());
        safetyuser.setUserStatus(user.getUserStatus());
        safetyuser.setCreateTime(user.getCreateTime());
        safetyuser.setRole(user.getRole());
        safetyuser.setPlanetCode(user.getPlanetCode());
        return safetyuser;
    }

整体的代码逻辑:

  1. 对密码和用户名进行一些校验
  2. 从数据库中查询是否有这个用户
  3. 用户脱敏
  4. 设置当前的用户登录态

HttpServletRequest对象的getSession()方法用于获取与当前请求关联的HttpSession对象,即获取会话对象。HttpSession对象代表了用户和服务器之间的一个会话,用于存储用户的信息并保持用户的状态,在同一个会话中可以通过HttpSession对象在不同的请求之间共享数据。

通过调用getSession()方法,我们可以获得用户的会话对象,可用于存储和检索与用户会话相关的信息,例如用户的登录状态、购物车信息等。

调用setAttribute方法可以在当前会话对象中设置一个属性,并将其与指定的值关联起来。这样做可以在当前会话中保存数据,方便在整个会话周期内进行数据的传递和共享。

Mapper层: 
@Mapper
public interface UserMapper extends BaseMapper<User> {

}

用来Mybatis-plus框架,查询操作非常简单

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

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

相关文章

idea http client GET 请求 报503错误

idea 提供的 http client 插件&#xff0c;在 GET 请求时总是 报503 的错误&#xff0c;但请求URL可以在浏览器中正常访问。 GET localhost:8080/student Response file saved. > 2024-06-20T160906.503.html 有一种原因跟本地配置的代理有关&#xff0c;如下图。如果在…

unidbg介绍

1.unicorn介绍 好比是一个CPU&#xff0c;可以模拟执行各种指令 提供了很多编程语言接口&#xff0c;可以操作内存、寄存器等 但它不是一个系统&#xff0c;内存管理、文件管理、系统调用等都需要自己来实现 2.基于unicorn开发的框架 cemu用来学习汇编的工具 AndroidNativeEm…

AcWing算法基础课笔记——最短Hamilton路径

最短Hamilton路径 题目 给定一张 n 个点的带权无向图&#xff0c;点从 0~n-1 标号&#xff0c;求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。 输入格式 第一行输入整数n。 接下来 n 行每行n个整数&#xff0c…

SpringCloud分布式微服务链路追踪方案:Skywalking

一、引言 随着微服务架构的广泛应用&#xff0c;系统的复杂性也随之增加。在这种复杂的系统中&#xff0c;应用通常由多个相互独立的服务组成&#xff0c;每个服务可能分布在不同的主机上。微服务架构虽然提高了系统的灵活性和可扩展性&#xff0c;但也带来了新的挑战&#xf…

第六篇:精通Docker Compose:打造高效的多容器应用环境

精通Docker Compose&#xff1a;打造高效的多容器应用环境 1. 引言 1.1 目的与重要性 在现代软件开发中&#xff0c;随着应用程序的复杂性不断增加&#xff0c;传统的单一容器部署方式已无法满足需求。Docker Compose作为一种强大的工具&#xff0c;专门用于定义和运行多容器…

【Spring】Spring学习笔记

Spring数据库 Spring JDBC 环境准备 创建Spring项目, 添加以下依赖 H2 Database: 用于充当嵌入式测试数据库JDBC API: 用于连接数据库Lombok: 用于简化pojo的编写 然后添加配置文件: spring.output.ansi.enabledALWAYS spring.datasource.username*********** spring.dataso…

Java-方法引用

方法引用概念 把已经有的方法拿过来用&#xff0c;当做函数式接口中抽象方法的方法体 前提条件 1、引用处必须是函数式接口 2、被引用的方法必须已经存在 3、被引用方法的形参和返回值 需要跟抽象方法保持一致 4、被引用方法的功能要满足当前需求 方法引用格式示例 方…

Micro-ROS是什么?

Micro-ROS是ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;生态系统的一个重要组成部分&#xff0c;专为微控制器&#xff08;Microcontrollers&#xff09;设计的轻量级ROS版本。它的目标是在资源有限的嵌入式平台上实现ROS 2的功能&#xff0…

如何跑起来一个前后端项目

后端部署 第一步配置自己的maven 第二步优先导入自己本地jar包当本地没有在从远程下载 第三步找到配置文件 第四步成功运行后端部署完毕 前端部署 第一步看看项目node_modules有没有文件如果有就是已经安装好了对应的依赖&#xff0c;没有执行npm install 第二步运行即可

UE5 中的碰撞问题

文章目录 一、初始准备二、重叠和碰撞三、自定义碰撞 一、初始准备 首先我们创建一个 BP_ThirdPerson 项目&#xff0c;然后在项目中创建两个 Actor 的蓝图 Blueprint 首先是一个移动的 BP_Push&#xff0c;这里使用 time line 循环旋转 cube 的相对位置 得到效果如下 然后是…

用MySQL和navicatpremium做一个项目—(财务管理系统)。

1 ER图缩小的话怕你们看不清&#xff0c;所以截了两张图 2 vsdx绘图结果 3DDL和DML,都有点长分了好多次上传&#xff0c;慢慢看 DDL -- 用户表 CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 用户ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用…

量化交易 - 策略回测

策略回测 1、什么是策略回测&#xff1f;2、策略回测的作用3、策略回测系统概述3.1策略回测中相关的指标介绍3.2量化交易策略的资金容量3.3 完整的策略回测系统包含哪些内容 1、什么是策略回测&#xff1f; 策略回测&#xff0c;也称之为策略回溯测试&#xff0c;是指利用交易…

002关于Geogebra软件的介绍及与MatLab的区别

为什么要学Geogebra&#xff1f; 因为和MatLab的科学计算相比&#xff0c;GeoGebra重点突出教学展示&#xff0c;对于教师、学生人群来讲再合适不过了&#xff0c;尤其是可以融入到PPT里边呈现交互式动画&#xff0c;想想听众的表情&#xff01;这不就弥补了看到PPT播放数学公…

AI 开发平台(Coze)搭建《美食推荐官》

前言 本文讲解如何从零开始&#xff0c;使用扣子平台去搭建《美食推荐官》 bot直达&#xff1a;美食推荐官 - 扣子 AI Bot (coze.cn) 欢迎大家体验一下&#xff01;&#xff01; 效果 正文 prompt 美食推荐官的首要任务就是推荐美食&#xff0c;基于这个我们要给他一个基…

高考志愿不知道怎么填?教你1招,用这款AI工具,立省4位数

高中的岁月&#xff0c;就像一本厚厚的书&#xff0c;我们一页页翻过&#xff0c;现在&#xff0c;终于翻到了最后一页。但这不是结束&#xff0c;这是新的开始&#xff0c;是人生的新篇章。 高考落幕&#xff0c;学子们在短暂的放松后&#xff0c;又迎来了紧张的志愿填报。 “…

强化学习:值函数近似【Deep Q-Network,DQN,Deep Q-learning】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实例分析:GridWorld…

开发自动回复信息的插件:代码的力量与智慧!

在信息爆炸的时代&#xff0c;自动回复信息的插件成为了许多用户和管理者的得力助手&#xff0c;这些插件能够根据预设的规则或算法&#xff0c;自动、快速、准确地回复用户的信息&#xff0c;极大地提高了沟通效率和用户体验。 而开发这样一款插件&#xff0c;离不开一系列精…

数字水产养殖中的鱼类追踪、计数和行为分析技术

随着全球人口增长和生态环境退化&#xff0c;传统捕捞已无法满足人类对水产品的需求&#xff0c;水产养殖成为主要的鱼类来源。数字水产养殖利用先进技术和数据驱动方法&#xff0c;对提高生产效率、改善鱼类福利和资源管理具有显著优势。 1 数字水产养殖的重要性 1.1 提高生…

汇聚荣做拼多多运营第一步是什么?

汇聚荣做拼多多运营第一步是什么?在众多电商平台中&#xff0c;拼多多凭借其独特的社交电商模式迅速崛起&#xff0c;吸引了大量消费者和商家的目光。对于希望在拼多多上开店的商家而言&#xff0c;了解如何进行有效运营是成功的关键。那么&#xff0c;汇聚荣做拼多多运营的第…

CSS的媒体查询:响应式布局的利器

关于CSS的媒体查询 CSS媒体查询是CSS层叠样式表(Cascading Style Sheets)中的一个核心功能&#xff0c;它使得开发者能够根据不同的设备特性和环境条件来应用不同的样式规则。这是实现响应式网页设计的关键技术&#xff0c;确保网站或应用能够在多种设备上&#xff0c;包括桌面…