用户中心项目全流程
企业做项目流程
需求分析 => 设计(概要设计 、 详细设计) => 技术选型 =>初始化项目 / 引入需要的技术 => 写个小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…...
从“抄答案”到“会解题”:我是如何利用头歌实训平台,真正掌握Python数据分析的?
从“抄答案”到“会解题”:我的Python数据分析思维进阶之路 记得第一次打开头歌实训平台的Python数据分析题目时,我像大多数初学者一样,迫不及待地寻找"正确答案"。复制、粘贴、运行——看到绿色通过提示的瞬间,以为自己…...
WhisperPlus自动字幕生成:为视频添加多语言字幕的简单方法
WhisperPlus自动字幕生成:为视频添加多语言字幕的简单方法 【免费下载链接】whisper-plus WhisperPlus: Faster, Smarter, and More Capable 🚀 项目地址: https://gitcode.com/gh_mirrors/wh/whisper-plus WhisperPlus是一款功能强大的工具&…...
CANN/asc-devkit单核形状API文档
SetSingleShape 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode…...
从‘能用’到‘好用’:给你的Vue+Element后台管理系统布局加点儿‘细节’
从‘能用’到‘好用’:VueElement后台管理系统的细节打磨指南 后台管理系统作为企业级应用的核心枢纽,其用户体验直接影响着运营效率和操作愉悦度。许多开发者在完成基础功能搭建后,常常陷入"能用但不好用"的困境——系统虽然跑得通…...
基于树莓派与ChatGPT打造私有智能音箱:从硬件选型到AI集成全攻略
1. 项目概述:打造一个会思考的智能音箱 如果你和我一样,对智能家居充满热情,但又对市面上那些“大厂”智能音箱的隐私策略和有限的对话能力感到不满,那么这个项目可能就是为你量身定做的。今天要聊的,是一个完全由自己…...
Apache Flink未授权访问漏洞深度剖析:从Dashboard暴露到Jar包上传攻击链
1. Apache Flink未授权访问漏洞全景透视 第一次接触Apache Flink的漏洞场景是在去年某次企业内网渗透测试中。当时发现目标系统开放着8081端口,访问后竟直接看到了Flink Dashboard的完整控制界面——没有任何登录验证,就像走进了一家没锁门的银行金库。这…...
程序员裸辞转行网络安全,我只用了 90 天
程序员如何90天成功转行黑客(网络安全)? 有人说:”黑客到底比程序员高在哪,为什么很多人开始转行了“其实黑客都是程序员,但是并不是所有的程序员都是黑客. 从企业和社会需求来看,现在真不缺程…...
从零到一:Apache Log4j SocketServer反序列化漏洞(CVE-2019-17571)环境构建与深度复现
1. 漏洞背景与原理剖析 2019年曝光的CVE-2019-17571漏洞堪称Java生态中的"经典教材级"案例。这个存在于Log4j 1.2.x版本中的SocketServer反序列化漏洞,完美展示了安全领域最危险的攻击模式之一——通过日志组件实现远程代码执行。我当年第一次复现这个漏…...
Intel RealSense D435i 标定实战:从工具安装到VINS配置全流程解析
1. 准备工作:认识D435i与标定原理 第一次拿到Intel RealSense D435i时,我盯着这个火柴盒大小的设备看了半天——它凭什么能实现三维感知?拆开包装后发现,这玩意儿居然集成了双目红外相机、RGB彩色相机和IMU惯性测量单元。但问题来…...
2026春招爆款!年薪40-200万!小白也能入行的智能体开发,收藏这篇超全学习指南!
本文详细介绍了智能体(Agent)的概念、核心能力及工作流程,分析了为何智能体开发成为2026年春招热门岗位,薪资可达40-200万。文章强调其转型门槛低、学习周期短,适合小白入行。同时,提供了智能体开发的核心技…...
