用户中心项目全流程

企业做项目流程

需求分析 => 设计(概要设计 、 详细设计) => 技术选型 =>初始化项目 / 引入需要的技术 => 写个小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框架,查询操作非常简单

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

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

相关文章

【C++:list】

list概念 list是一个带头的双向循环链表&#xff0c;双向循环链表的特色&#xff1a;每一个节点拥有两 个指针进行维护&#xff0c;俩指针分别为prev和next,prev指该节点的前一个节点&#xff0c;next为该节点的后一个节点 list的底层实现中为什么对迭代器单独写一个结构体进行…

Toco x Databend:Databend Cloud 如何满足 Web3 大数据服务的严苛考验?

Toco 是一家位于瑞士的 Web3 服务提供商&#xff0c;致力于通过彻底改变全球金融体系的陈旧观念来应对气候变化。他们提供了一种开创性的碳货币 Tocos&#xff0c;每个流通中的 Tocos 代表一吨二氧化碳当量&#xff0c;存储在安全可靠的数字钱包中。用户可以使用 Tocos 应用轻松…

Jmeter+InfluxDB+Grafana性能测试数据展示

JmeterInfluxDBGrafana提供了一种更好的对Jmeter压测结果的实时监控展示。可以理解为数据源产生的数据加上时间记录并存储&#xff0c;然后使用各种开源图表组件进行展示。实现jmeter报告的更好的可视化展示 1&#xff09;方便测试结果数据落地以及更好的分析 2&#xff09;将…

计算机视觉-期末复习-简答/名词解释/综合设计

目录 第一讲--计算机/机器视觉概述 名词解释 简答 第二讲--图像处理概述 名词解释 简答 第三讲没划重点习题 第四讲--特征提取与选择 名词解释 简答 综合题 第五讲--不变特征 名词解释 简答 第六讲--物体分类与检测 简答 综合题 第七讲--视觉注意机制 简答 …

鸿蒙期末项目(完结)

两天仅睡3个小时的努力奋斗之下&#xff0c;终于写完了这个无比拉跨的项目&#xff0c;最后一篇博客总体展示一下本项目运行效果兼测试&#xff0c;随后就是答辩被同学乱沙&#xff08;悲 刚打开软件&#xff0c;会看到如下欢迎界面&#xff0c;介绍本app的功能和优点 随后我们…

基于模型蒸馏的模型加速方案总结

1.简介 1.1目的 在过去的一段时间里&#xff0c;对基于模型蒸馏技术的模型加速方案的方法在多个数据集上进行了一系列的实验。所谓的模型蒸馏技术&#xff0c;简单的来说就是利用一个设计简单的小网络去学习一个设计比较复杂的大网络。特别的有&#xff0c;本次实验针对每一个…

串口通信例子SeriaPort

本篇例子使用的虚拟串口转自这位博主:http://t.csdnimg.cn/LSGIs 串口COM: 是一种用于联接计算机和外设设备的接口&#xff0c;也叫串行接口&#xff0c;简称com&#xff0c;常见的串口有一般电脑应用的RS-232(使用25帧或者9帧的连接器) 通俗来讲串口就是usb接口、鼠标窗口。键…

第二十四节:带你梳理Vue2 : Vue具名插槽/作用域插槽/v-slot指令

1. 具名插槽 1.1 没有使用具名插槽的问题 有的时候我们在使用子组件时,在子组件模板上不同的位置插入不同的内容, 只有一个插槽显然没法满足我们的需求,看示例: 需求如下: 子组件是一篇文章的结构父组件在调用子组件是给文章插入标题,正文,时间信息 示例代码如下: <di…

6.26.4.1 基于交叉视角变换的未配准医学图像多视角分析

1. 介绍 许多医学成像任务使用来自多个视图或模式的数据&#xff0c;但很难有效地将这些数据结合起来。虽然多模态图像通常可以在神经网络中作为多个输入通道进行配准和处理&#xff0c;但来自不同视图的图像可能难以正确配准(例如&#xff0c;[2])。因此&#xff0c;大多数多视…

创新实训博客(十三)——admin前端工作效果

管理/教师端前端工作汇总education-admin&#xff1a; 首先是登录注册页面的展示 管理员 首页 管理员登录后的首页如下图所示 管理员拥有所有的权限 课程管理 1、可以查看、修改、增添、删除课程列表内容 2、可以对课程资源进行操作 3、可以对课程的类别信息进行管理&…

一个最简单的MySQL事务模拟测试

这里只是简单写了一个转账的小事务&#xff0c;模拟一下事务的过程 代码&#xff1a; 初始数据&#xff1a; 当你关闭自动提交 并且开启一个事务执行了下面的更新语句 但是没有提交时&#xff1a; 此时虽然你运行查询语句会发现他的值发生了变化 &#xff0c;但是当你运行回滚…

51单片机看门狗定时器配置

测试环境 单片机型号&#xff1a;STC8G1K08-38I-TSSOP20&#xff0c;其他型号请自行测试&#xff1b; IDE&#xff1a;KEIL C51&#xff1b; 寄存器配置及主要代码 手册中关于看门狗的寄存器描述如下&#xff1a; 启动看门狗&#xff0c;需将B5位EN_WDT置1即可&#xff0c;…

大数据------额外软件、插件及技术------Linux(完整知识点汇总)

Linxu 不同领域的主流操作系统 桌面操作系统 WindowsMAac OSLinux 服务器端操作系统 UNIX&#xff08;付费&#xff09;LinuxWindows Server&#xff08;付费&#xff09; 移动设备操作系统 Android&#xff08;基于Linux开源&#xff09;IOS&#xff08;不开源&#xff09; 嵌…

时间序列分析入门:概念、模型与应用【ARMA、ARIMA模型】

在这篇博客中&#xff0c;我们将全面探讨时间序列分析的基本概念和分类&#xff0c;深入理解平稳性及其检验方法&#xff0c;并介绍自回归模型&#xff08;AR&#xff09;、滑动平均模型&#xff08;MA&#xff09;、自回归滑动平均模型&#xff08;ARMA&#xff09;以及自回归…

动态流体工厂大屏

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 namespace 动态流体工厂大屏 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){Task.Run(() >{while (true){this.Invoke(() >…

openEuler搭建hadoop Standalone 模式

Standalone 升级软件安装常用软件关闭防火墙修改主机名和IP地址修改hosts配置文件下载jdk和hadoop并配置环境变量配置ssh免密钥登录修改配置文件初始化集群windows修改hosts文件测试 1、升级软件 yum -y update2、安装常用软件 yum -y install gcc gcc-c autoconf automake…

模块化沙箱的优势与应用

在数字化时代&#xff0c;数据安全已成为企业乃至国家层面不可忽视的重要议题。随着云计算、大数据等技术的广泛应用&#xff0c;数据泄露、恶意攻击等安全威胁日益严峻。在这样的背景下&#xff0c;模块化沙箱技术应运而生&#xff0c;为企业提供了高效、灵活的数据安全解决方…

NAND闪存巨头铠侠(Kioxia)计划最迟于10月下旬通过首次公开募股IPO

据路透社于6月26日引用消息来源的报道&#xff0c;在半导体市场条件反弹及财务业绩迅速改善的背景下&#xff0c;NAND闪存巨头铠侠&#xff08;Kioxia&#xff09;正准备尽快提交初步申请&#xff0c;并计划最迟于10月下旬通过首次公开募股&#xff08;IPO&#xff09;在东京证…

【Hive中常见的优化手段----数据采集!Join 优化!Hive索引!数据倾斜!mapreduce本地模式!map和reduce数量调整!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天主要和大家分享一下Hive中常见的优化手段----数据采集&#xff01;常见的Join 优化有哪几种&#xff01;什么是Hive索引&#xff01;数据怎么发生倾斜&#xff01;什么是mapreduce的本…

Pycharm 文件标头设置

一、设置模板步骤&#xff1a; “文件File--设置Settings--编辑器Editor--File and Code Templates- Python Script” 里面设置模板 官方预设变量表 变量名 含义 ${DATE} 当前系统日期 ${DAY} 当前月的第几日 ${DAY_NAME_SHORT} 当前星期几的单词缩写&#xff08…