用户中心项目全流程
企业做项目流程
需求分析 => 设计(概要设计 、 详细设计) => 技术选型 =>初始化项目 / 引入需要的技术 => 写个小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_incrementprimary 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-centerdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/userusername: rootpassword: 123456#mybatisplus添加日志功能
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-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);}@Autowiredprivate UserService userService;@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserLoginRequest {private String userAccount;private String userPassword;
}
用UserLoginRequest来接收前端发送过来的JSON数据(一开始是没有封装的,后面优化的时候进行封装)
Service层:
@Resourceprivate UserMapper userMapper;@Overridepublic 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;}
整体的代码逻辑:
- 对密码和用户名进行一些校验
- 从数据库中查询是否有这个用户
- 用户脱敏
- 设置当前的用户登录态
HttpServletRequest对象的getSession()方法用于获取与当前请求关联的HttpSession对象,即获取会话对象。HttpSession对象代表了用户和服务器之间的一个会话,用于存储用户的信息并保持用户的状态,在同一个会话中可以通过HttpSession对象在不同的请求之间共享数据。通过调用
getSession()方法,我们可以获得用户的会话对象,可用于存储和检索与用户会话相关的信息,例如用户的登录状态、购物车信息等。调用
setAttribute方法可以在当前会话对象中设置一个属性,并将其与指定的值关联起来。这样做可以在当前会话中保存数据,方便在整个会话周期内进行数据的传递和共享。
Mapper层:
@Mapper
public interface UserMapper extends BaseMapper<User> {}
用来Mybatis-plus框架,查询操作非常简单
相关文章:
用户中心项目全流程
企业做项目流程 需求分析 > 设计(概要设计 、 详细设计) > 技术选型 >初始化项目 / 引入需要的技术 > 写个小demo > 写代码 (实现业务逻辑) > 测试(单元测试)> 代码提交 / 代码评审 …...
达梦数据库的系统视图v$database
达梦数据库的系统视图v$database 基础信息 OS版本: Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本: DM Database Server 64 V8 DB Version: 0x7000c 03134284132-20240115-215128-20081在达梦数据库(Dameng Database…...
Vue.js中的虚拟DOM
一.节点和状态 在我们平常对DOM操作的时候,之前在vue没有诞生之前,以命令式的方式对DOM进行操作,页面上的每一个元素都可以看做成一个节点状态。 二.剔除和渲染 框架都有自己渲染的方式,假设一个页面的状态,随着Ajax请求的放松,状态发生改变,有以下的两种方式供你选择&#…...
【设计模式之迭代器模式 -- C++】
迭代器模式 – 遍历集合,无需暴露 迭代器模式是一种设计模式,用于顺序访问集合对象的元素,而无需暴露其底层实现。迭代器模式分离了集合对象的遍历行为,使得访问元素时,可以不必了解集合对象的底层实现。 组成 迭代…...
Linux网络编程:套接字编程
1.Socket套接字编程 1.1.什么是socket套接字编程 Socket套接字编程 是一种基于网络层和传输层网络通信方式,它允许不同主机上的应用程序之间进行双向的数据通信。Socket是网络通信的基本构件,它提供了不同主机间的进程间通信端点的抽象。一个Socket就是…...
多电商账户为什么要用指纹浏览器?
随着电子商务的蓬勃发展,越来越多的商家选择开设多店来扩大经营规模。然而多店运营也带来了一系列的挑战,其中之一就是账号安全。 1. 了解反检测浏览器和代理服务器 在我们开始讨论如何有效地使用反检测浏览器之前,我们首先需要了解这两个工…...
用Rancher2.8.5部署K8s集群
参考:通过Rancher 2.7.5部署企业生产级K8s集群 新K8s集群的环境信息 Rancher1台,K8s集群6台(1台rancher,3台master,4台node)。 Name|lmage Name|IP Address|Flavor|Comment project-root-dev-rancher|Ro…...
未来已来,如何打造智慧养殖场?
近年来,国家出台了一系列扶持政策,以促进养殖行业高质量发展,推动行业转型升级。在国家政策和市场需求的双重驱动下,养殖行业正迎来前所未有的发展机遇。智慧养殖以其高效、智能和可持续的特点,正逐步取代传统养殖方式…...
代码随想录算法训练营第七天|454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和
打卡Day7 1.454.四数相加II2.383. 赎金信3.15. 三数之和4.18. 四数之和 1.454.四数相加II 题目链接:四数相加II 文档讲解: 代码随想录 class Solution {public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {int res 0;Map…...
Python和tkinter实现的字母记忆配对游戏
Python和tkinter实现的字母记忆配对游戏 因为这个小游戏用到了tkinter,先简要介绍一下它。tkinter是Python的标准GUI(图形用户界面)库,它提供了一种简单而强大的方式来创建图形界面应用程序。它提供了创建基本图形界面所需的所有工具,同时保…...
Leetcode Hot100之链表
1.相交链表 解题思路 快慢指针:分别求出两个链表的长度n1和n2,在长度较长的那个链表上,快指针先走n2 - n1,慢指针再出发,最后能相遇则链表相交 时间复杂度O(mn),空间复杂度O(1)代码# Definition for singl…...
5.9k!一款清新好用的后台管理系统!【送源码】
今天给大家分享的开源项目是一个优雅清新后台管理系统——Soybean Admin。 简介 官方是这样介绍这个项目的: Soybean Admin 使用的是Vue3作为前端框架,TypeScript作为开发语言,同时还整合了NaiveUI组件库,使得系统具有高可用性和…...
Vue-cli搭建项目----基础版
什么是Vue-cli 全称:Vue command line interface 是一个用于快速搭建Vue.js项目的标准工具,他简化了Vue.js应用的创建和管理过程,通过命令工具帮助开发者快速生成,配置和管理Vue项目. 主要功能 同一的目录结构本地调试热部署单元测试集成打包上线 具体操作 第一步创建项目:…...
python之__call__函数介绍
Python 中的 __call__ 方法是一种特殊的方法,它允许对象像函数一样被调用。当你创建一个对象并使用括号 () 调用它时,Python 会自动调用这个对象的 __call__ 方法。 1. 基本用法 下面是一个简单的例子: class MyClass:def __init__(self, value):self.value valued…...
【AI】生成式AI服务器最低配置
【背景】 考虑数据安全,又想用AI赋能企业内部的日常工作,答案只有一个,本地部署。 UI采用open-web-ui,模型用Ollama管理,在局域网做成SAAS服务。要组一个服务器,提供部门内部最多30个的API并发。以下为反复…...
2.Android逆向协议-了解常用的逆向工具
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:微尘网校 上一个内容:1.Android逆向协议-环境搭建 常用的工具:AndroidKiller、jadx、JEB、IDA AndroidKiller…...
大数据------额外软件、插件及技术------Linux(完整知识点汇总)
Linxu 不同领域的主流操作系统 桌面操作系统 WindowsMAac OSLinux 服务器端操作系统 UNIX(付费)LinuxWindows Server(付费) 移动设备操作系统 Android(基于Linux开源)IOS(不开源) 嵌…...
iOS 其他应用的文件如何在分享中使用自己的应用打开
废话少说 一、第一步:先配置好plist文件 右击info.plist如下图文件打开 根据自己需要配置支持的文件类型,也可使用property List中配置,一样的 其他的文件可是参考文档:System-Declared Uniform Type Identifiers 可复制的代码&am…...
【编译原理必考大题】 推导构建语法树,写出语法树的短语,简单短语和句柄
写在最前 本文为编译原理重点考察大题之一,理论基础见专栏文章,0基础直接使用也可食用 文章目录 推导构造语法树1.语法树的概念2. 子树,短语,简单短语,句柄2.1 子树2.2 短语2.3 简单短语与句柄2.4 真题实战 推导构造语…...
redis服务介绍
redis 基础概念安装使用基础操作命令数据类型操作命令 管理和维护命令 基础概念 Remote Dictionary Server(Redis)远程字典服务器是完全开源免费的,用C语言编写的,遵守BSD开源协议,是一个高性能的(key/val…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
