Skip to content

用户中心

项目流程

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

需求分析

  1. 登录 / 注册
  2. 用户管理(仅管理员可见)对用户的查询或者修改
  3. 用户校验(仅星球用户可见)

技术选型

前端:三件套 + React + 组件库 Ant Design + Umi + Ant Design Pro(现成的管理系统)

后端:

  • java
  • spring(依赖注入框架,帮助你管理 Java 对象,集成一些其他的内容)
  • springmvc(web 框架,提供接口访问、restful接口等能力)
  • mybatis(Java 操作数据库的框架,持久层框架,对 jdbc 的封装)
  • mybatis-plus(对 mybatis 的增强,不用写 sql 也能实现增删改查)
  • springboot(快速启动 / 快速集成项目。不用自己管理 spring 配置,不用自己整合各种框架)
  • junit 单元测试库
  • mysql 数据库

部署:服务器 / 容器(平台)

1.创建后端项目

项目需要用到的依赖

image-20231109131928072

2.数据库设计(⭕踩坑 🆕新插件 )

sql
-- 切换库
use jiefencenter;

# 用户表
create table user
(
    user_name     varchar(256)                       null comment '用户昵称',
    id           bigint auto_increment comment 'id'
        primary key,
    user_account  varchar(256)                       null comment '账号',
    avatar_url    varchar(1024)                      null comment '用户头像',
    gender       tinyint                            null comment '性别',
    user_password varchar(512)                       not null comment '密码',
    phone        varchar(128)                       null comment '电话',
    email        varchar(512)                       null comment '邮箱',
    user_status   int      default 0                 not null comment '状态 0 - 正常',
    create_time   datetime default CURRENT_TIMESTAMP null comment '创建时间',
    update_time   datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP,
    is_delete     tinyint  default 0                 not null comment '是否删除',
    user_role     int      default 0                 not null comment '用户角色 0 - 普通用户 1 - 管理员',
    planet_code   varchar(512)                       null comment '星球编号'
)
    comment '用户';

😈

注意:数据库字段使用下划线命名时,配置字段时候无需配置application.yml,使用插件也无需勾选Actual Column

配置文件:

#my-batis-plus驼峰配置 当数据库字段中有下划线是时,采用驼峰式命名,默认开启
#mybatis-plus:
#  configuration:
#    map-underscore-to-camel-case: fals

🆕 my-batis-x插件使用:

image-20231112213358910

😈

注意:数据库字段使用大小写名时,配置字段时候需要配置application.yml

#my-batis-plus驼峰配置 当数据库字段中有下划线是时,采用驼峰式命名,默认开启
#mybatis-plus:
#  configuration:
#    map-underscore-to-camel-case: fals

🆕 my-batis-x插件使用

image-20231112213632435


3.数据库字段连通性测试,为逻辑实现做准备(🆕 :新插件 )

  • 1.创建相对应的测试类

image-20231112214217201

👿

注意:目录要同级才可以,防止报错!!!

image-20231112214118694

  • 测试类对应代码 (🆕插件的使用:generate插件 )
java
package com.example.usercenter.service;
import java.util.Date;

import com.example.usercenter.model.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
public class UserServiceTest {

    @Resource
    private UserService userService;

    @Test
    public void testAddUser(){
       User user = new User();
        右键----->>>使用generate插件快速生成
        
       user.setUserName("ybh007");
       user.setUserAccount("admin");
       user.setAvatarUrl("https://cdncode.oss-cn-beijing.aliyun\n" +
               "cs.com/test/202311121922568.jpg");
       user.setGender(0);
       user.setUserPassword("131422");
       user.setPhone("18809459069");
       user.setEmail("1341433952@qq.com");
        boolean result = userService.save(user);
        System.out.println(user.getId());
       assertTrue(result);   //使用断言,判断最后得出的结果是否和你预期的一样


    }
}

image-20231112214601435

注册逻辑 ⭕踩坑

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

测试报错 !数据库字段下划线命名!⭕

#my-batis-plus驼峰配置 当数据库字段中有下划线是时,采用驼峰式命名,默认开启
#mybatis-plus:
#  configuration:
#    map-underscore-to-camel-case: false

image-20231116184201531

  • 一定要使用和数据库名一样的字段名字
  • image-20231116184342176

登录功能

接口设计

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

请求类型:POST

请求体:JSON 格式的数据

请求参数很长时不建议用 get

返回值:用户信息( 脱敏

登录逻辑

  1. 校验用户账户和密码是否合法

    1. 非空
    2. 账户长度不小于 4 位
    3. 密码就不小于 8 位
    4. 账户不包含特殊字符
  2. 校验密码是否输入正确,要和数据库中的密文密码去对比

  3. 用户信息脱敏,隐藏敏感信息,防止数据库中的字段泄露

  4. 我们要记录用户的登录态(session),将其存到服务器上(用后端 SpringBoot 框架封装的服务器 tomcat 去记录)

    cookie

  5. 返回脱敏后的用户信息

控制层Controller封装请求

java
@RestController适用于编写result风格的api,返回值默认为json类型

controller层倾向于请求参数本身的校验,不涉及业务逻辑本身

service层是对业务逻辑的校验(有可能被controller之外的层调用)

如何知道是哪个用户登录了?

javaweb 这一块的知识

  1. 连接服务器端后,得到一个 session 状态(匿名会话),返回给前端

  2. 登录成功后,得到了登录成功的 session,并且给该sessio n设置一些值(比如用户信息),返回给前端一个设置 cookie 的 ”命令“

    session => cookie

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

  4. 前端再次请求后端的时候(相同的域名),在请求头中带上cookie去请求

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

  6. 后端从 session 中可以取出基于该 session 存储的变量(用户的登录信息、登录名)

查询用户是否存在⭕踩坑

登录查询用户时候,删除的用户不查询(逻辑删除)

yml
#配置
mybatis-plus:
	  global-config:
    db-config:
      logic-delete-field: id_delete # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
java
    /**
     * 是否删除
     */
    @TableLogic
    private Integer isDelete;

实现

控制层 Controller 封装请求

application.yml 指定接口全局路径前缀:

servlet:
  context-path: /api

控制器注解:

@RestController 适用于编写 restful 风格的 api,返回值默认为 json 类型

校验写在哪里?

  • controller 层倾向于对请求参数本身的校验,不涉及业务逻辑本身(越少越好)
  • service 层是对业务逻辑的校验(有可能被 controller 之外的类调用)

用户管理接口

接口设计关键:必须鉴权!!!

  1. 查询用户(允许根据用户名查询)
  2. 删除用户

写代码流程

  1. 先做设计
  2. 代码实现
  3. 持续优化!!!(复用代码、提取公共逻辑 / 常量)

前后端交互

前端需要向后端发送请求才能获取数据 / 执行操作。

怎么发请求:前端使用 ajax 来请求后端

前端请求库及封装关系

  • axios 封装了 ajax

  • request 是 ant design 项目又封装了一次

追踪 request 源码:用到了 umi 的插件、requestConfig 配置文件

代理🌠代理和反向代理

image-20240111164656119

正向代理:替客户端向服务器发送请求,可以解决跨域问题

反向代理:替服务器统一接收请求。

怎么实现代理?

  • Nginx 服务器
  • Node.js 服务器

调试的使用

F8:下一步

F9:到下一断点

前端Ant_Design_pro搭建

Ant Design Pro(Umi 框架)权限管理

  • app.tsx:项目全局入口文件,定义了整个项目中使用的公共数据(比如用户信息)

  • access.ts 控制用户的访问权限

1.使用命令安装框架

# 使用 npm
npm i @ant-design/pro-cli -g     //第一条命令
pro create myapp                 //第二条命令

2.使用umi3

image-20240111142128315

3.选择模板

选择simple

4.安装依赖

$ cd myapp && tyarn
// 或
$ cd myapp && npm install

5.start启动项目

image-20240111142347020

如果版本太高,导致无法正确启动,则添加一行代码,即可运行

111111

JS
windows中添加以下代码:
set NODE_OPTIONS=--openssl-legacy-provider 


linux Mac OS添加以下代码
export NODE_OPTIONS=--openssl-legacy-provider

6.安装uni小工具

yarn add @umijs/preset-ui -D

框架关系

Ant Design 组件库 => 基于 React 实现

Ant Design Procomponents => 基于 Ant Design 实现

Ant Design Pro 后台管理系统 => 基于 Ant Design + React + Ant Design Procomponents + 其他的库实现

前后端对接登录页面

1.修改前端登录需要提交的表单信息

快捷键(批量修改全局名):shift+F6

image-20240111161254943

2.登录请求路径对接

image-20240111163625857

3.解决跨域问题!!!(端口号不一样就存在跨域

使用代理

image-20240111170543914

后端已经收到请求

image-20240111170612451

4.修改前端结构

tsx
 <ProFormText
      name="userAccount"
      fieldProps={{
        size: 'large',
        prefix: <UserOutlined className={styles.prefixIcon} />,
      }}
      placeholder='请输入账号'
      rules={[
        {
          required: true,
          message: '账号是必填项!'
        },
      ]}
    />
    <ProFormText.Password
      name="userPassword"
      fieldProps={{
        size: 'large',
        prefix: <LockOutlined className={styles.prefixIcon} />,
      }}
      placeholder='请输入密码'
      rules={[
        {
          required: true,
          message: '密码是必填项',
        },
        {
          min:8,
          type:'string',
          message:'长度不能小于8'
        },
      ]}
    />
  </>
)}

💁‍♂️至此前后端登录已经跑通,只是缺少页面的跳转

前端开发注册功能

1.根据登录路径找到对应的路由

2.添加一个页面

image-20240111175046661

3.通过路由,将网址和组件进行关联

image-20240111175414043

4.去除重定向(未登录则会跳转到登录页面),通过添加一个白名单的方式(后台管理系统的安全)

image-20240111181250983

创建前端管理页面

1.创建页面

image-20240113130320629

2.配置路由

image-20240113130227263

3.设置访问权限

image-20240113130135556

前段管理页加载内容(对接后端)

1.配置返回值

image-20240120224314452

2.设置返回的字段类型

image-20240120224418427

java
 type CurrentUser = {
    id:number;
    userName: string;
    userAccount: string;
    avatarUrl:string;
    gender: number;
    phone: string;
    email: string;
    userStatus:number;
    userRole:number;
    createTime:Date;
  };

3.定义搜索用户接口

image-20240120224738845

4.接口与后端对应,返回查询到的用户列表

image-20240120224937545

5.前端管理页面有些字段不显示,解决方式如下

image-20240120232609355

要和后端返回来的数据字段相对应

java
{
        "id": 1,
        "userName": "ybh007",
        "userAccount": "admin",
        "avatarUrl": "https://cdncode.oss-cn-beijing.aliyun\ncs.com/test/202311121922568.jpg",
        "gender": 0,
        "userPassword": null,
        "phone": "18809459069",
        "email": "1341433952@qq.com",
        "userStatus": 0,
        "createTime": "2023-11-12T13:25:31.000+00:00",
        "updateTime": null,
        "userRole": 1,
        "isDelete": null,
        "planetCode": null
    },

解决图片是字符串不加载问题!

image-20240120233131589

1.使用renser()函数进行渲染

java
{
  title: '用户头像',
  dataIndex: 'avatarUrl',
  render:(_,record)=>(
  <div>
    <Image src={record.avatarUrl} width={100} />
  </div>
  ),
  copyable: true,
},

将枚举值转化为实际属性

java
 {
    title: '用户角色',
    dataIndex: 'userRole',
    valueType:'select',
    valueEnum: {
      0: {text: '普通用户',status: 'Default'},
      1: {text: '管理员', status: 'Success',},
    },
    copyable: false,
  },

📅2024.1.23

  1. 开发用户注销(前 / 后端)

  2. 补充前后端注册校验逻辑(前 / 后端)

  3. 后端代码优化

  4. 前端代码优化

  5. 项目部署上线

    • 买服务器
    • 原生部署
    • 容器部署
    • 绑定域名

🔌 插件Github Copilt(没啥用)

开发用户注销

前端操作

image-20240123135948866

右上角图标不显示

image-20240123141545508

注册添加星球编号字段

仅适用于用户可相信的情况

用户自己填写:2~5位的编号

后台对编号进行校验,长度校验,唯一性校验

前端补充输入框,适配后端

后期拉取数据,定期清理违规用户

后端优化

1.通用返回对象

​ 目的:给对象补充一些信息,告诉前端这个请求在业务层面上是成功还是失败

java
{
	"name":yupi
}

/**
	成功
**/
{	"code":0 //业务状态码
		"data"{	
		"name""jiefen"
		
		}
	"message":"ok"
}


/**
	错误
**/
{	"code":50001 //业务状态码
	"data"null
	"message":"用户操作异常"
}

1.定义返回对象(Alt+insert快捷键 :生成构造函数)

1.baseResponse类 ♻️T泛型

构造函数的作用:

⭐方便创建对象

java
<T>泛型的作用:什么类型的都也可以返回,提高了代码的复用性

@Data
public class BaseResponse<T> implements Serializable {

    private int code;

    private T data;

    private String message;
    
    //Alt+insert生成构造函数 ,方便
     public BaseResponse(int code, T data, String message) {
        this.code = code;
        this.data = data;
        this.message = message;
    }


}
  1. new 对象,统一返回值
java
        User user = userService.userLogin(userAccount, userPassword, request);
        return new BaseResponse<>(0,user,"ok");

3.改进(使用 responseUtils 帮助我们来new对象)

java
public class ResultUtils {
    public static <T> BaseResponse<T> success(T data){
        return new BaseResponse<>(0,data,"ok");
    }
}

4.打重复的一段代码,使用idea工具template定义一个快捷键

site -----> Live-Templates -----> (定制快捷键)

image-20240123205523980

  • 自定义错误码
  • 返回类支持返回正常和错误

image-20240123213711421

2.封装全局异常处理

创建的原因:把所有的错误都在一个地方进行处理

1.定义业务异常类

​ 1.在java类的异常类中,支持更多的字段

​ 2.自定义构造函数,更灵活 / 快捷的设置字段

2.编写全局异常处理器

​ 作用:

​ 1.捕获代码中所有的异常,集中处理,让前端得到更详细的业务报错,

​ 2.同时封装屏蔽掉项目框架本身的异常(不暴露服务器内部状态)

​ 实现:

1.SprinAop:在调用方法前后进行额外的处理
java
@RestControllerAdvice  //sping的一个切面功能,在任意代码前后,进行封装

3.全局请求日志和登录校验(🛤️ TO DO优化 )

前段优化(前端需要适配)

1.对接后端返回值,取 data

[写一个全局响应返回类 ]

2.全局响应处理

  1. 应用场景:我们需要对接口的通用响应进行统一的处理,比如从response中取出data;或者根据code去集中处理错误,比如用户未登录,没权限之类的

2.优势:不用在每个接口请求中写相同的逻辑

3.实现:参考你用的请求封装工具的官方文档,比如umi-request,如果你用axios,参考axios文档,创建新的文件,在该文件配置一个全局请求类,在发送请求时,使用我们自己定义的全局请求类。

用户中心项目部署

1.多环境

2.项目部署上线

  • 原始/前后端部署
  • 宝塔linux部署
  • 容器
  • 容器平台

3.前后端的联调

4.用户中心项目扩展和规划

多环境

本地开发:locahost (127.0.0.1)

多环境:指一套项目代码在不同的阶段根据实际情况来调整配置并且部署到不同的机器上

为什么需要?

​ 1.每个环境互不影响

​ 2.为了区分不同的阶段:开发/ 测试 / 生产

​ 3.对项目进行优化:

​ 1.本地日志级别

​ 2.精简依赖,节省项目体积

​ 3.项目的环境/ 参数可以调整,比如JVM参数

针对不同的环境做不同的事

多环境分类:

​ 1.本地环境(自己的电脑)locahost

​ 2.开发环境(远程开发)大家连接同一台机器,为了大家开发方便

​ 3.测试环境(测试)开发/ 测试/ 产品,性能测试,功能测试,系统集成测试,独立的数据库,独立的服务器

​ 4.预发布环境(体验服):基本和正式环境一致,正式数据库,可以更严谨查出更多问题

​ 5.正式环境:(线上,公开对外访问的项目):尽量不要改动,保证上线之前的代码是完美运行的

​ 6.沙箱环境 (实验环境):为了做实验

前端多环境实战

  • 请求地址

    • 开发环境:localhost: 8000
    • 线上环境:user-backend.hycode.top
    java
    startFront(env){
    	if(env === 'prod')
    	//不输出注释
    	//项目优化
    	//修改请求地址
    	}else{
    	//保持本地开发逻辑
    	}

使用了umi框架,build时会自动传入NODE-ENV == production参数,startNODE-ENV参数为development

  • 启动方式

    • 开发环境:npm run atart (本地启动,监听端口,自动更新)
    • 线上环境:npm run build(项目构建打包),可以使用service工具启动(npm i -g serve)
  • 项目的配置

    不同的项目(框架)都有不同的配置文件

    • 开发环境和生产环境可以在配置文件后添加对应的环境名称后缀来区分
    • 开发环境: config.dev.ts
    • 生产环境:config.production.ts
    • 公共配置:config.ts不带后缀

后端多环境配置

  1. springBoot的 application-prod.yml配置

  2. 连接数据库(后端使用的是宝塔面板的部署------>需要打开相应的端口3306)

    主机名:ip地址/数据库名称

    用户名:数据库用户名

    用户密码:数据库密码

    端口号:3306

    💟打开服务器端口

    💟打开宝塔面板端口

java
spring:
  application:
    name: user-name
#数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://43.142.3.218/user_center
    username: user_center
    password: 05092114@Ybh
# session失效时间
  session:
    timeout: 86400

原始启动项目:

  1. 使用package打包项目

  2. 在打包好的jar目录格式下,使用命令行运行打好的jar包

  3. 输入对应的代码,可以在启动项目时,传入变量

    java
    java -jar ./user-center.jar --spring.profiles.active=prod

主要是改依赖的环境和地址

  • 数据库地址
  • 缓存地址
  • 消息队列地址
  • 项目端口号

项目部署

用户中心部署流程(前后端部署-->宝塔)

  • 0.在前端项目中设置上线之访问的后端域名

    java
    /**
     * 配置request请求时的默认参数
     */
    const request = extend({
      credentials: 'include', // 默认请求是否带上cookie
      prefix: process.env.NODE_ENV === 'production' ? 'http://user-backend.hycode.top' : undefined
      // requestType: 'form',
    });

image-20240204180130661

  • 1.前端项目部署(上传dist文件到服务器之下)

image-20240204175522401

    1. 前提域名商处解析对应的域名,打开后端相应的端口,(宝塔和服务器都需要打开端口)

image-20240204175713945

    1. 配置后端上线之后的数据库prod.yml
java
spring:
#数据库配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://自己的服务器地址:3306/数据库名称
    username: 数据库用户名
    password: 数据库密码

# session失效时间
  session:
    timeout: 86400
    1. 修改之后打包项目,得到jar包

image-20240204180645998

    1. 得到jar包之后,在本地运行打包好的jar包项目, (测试)是否正确连接到了远程数据库
java
 java -jar .\user-center-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
    1. 运行之后,进行注册数据,看是否数据已经插入,看数据库是否有注册的新数据
    1. 成功之后,将打包好之后的jar包,上传到服务器,进行启动(服务器需要安装java)

      image-20240204181926464

java
/www/server/java/jdk-11.0.19/bin/java  -jar -Xmx1024M -Xms256M  /www/wwwroot/user-center-backend/user-center-0.0.1-SNAPSHOT.jar --server.port=8081 --spring.profiles.active=prod
    1. 解析后端的域名,解析到自己服务器的ip地址下面,不用配置到后端项目中!

image-20240204210816161

    1. 配置好之后测试后端访问连接,http:服务器ip地址: 8081/api/user/search
    1. 为了直接使用域名,不用加端口号,能够访问到后端,使用反向代理,将默认的80端口代理到8081端口

image-20240204211313620

1.跨域问题

浏览器为了用户的安全,仅允许向同域名、同端口的服务器发送请求

把域名端口改成相同的

解决方法:让服务器告诉浏览器:允许跨域(返回 cross- origin- allow响应头)

网关支持(可以在nginx网关和后端代码中配置)

  • nginx中配置,在后端域名中配置
java
# 跨域配置
location ^~ /api/ {
    proxy_pass http://127.0.0.1:8080/api/;
    add_header 'Access-Control-Allow-Origin' $http_origin;
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers '*';
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Origin' $http_origin;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
    }
}

修改后端服务

    1. controller中注解配置
配置 @CrossOrigin  注解
    1. 添加 web 全局请求拦截器
java
@Configuration
public class WebMvcConfg implements WebMvcConfigurer {
 
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //设置允许跨域的路径
        registry.addMapping("/**")
                //设置允许跨域请求的域名
                //当**Credentials为true时,**Origin不能为星号,需为具体的ip地址【如果接口不带cookie,ip无需设成具体ip】
                .allowedOrigins("http://localhost:9527", "http://127.0.0.1:9527", "http://127.0.0.1:8082", "http://127.0.0.1:8083")
                //是否允许证书 不再默认开启
                .allowCredentials(true)
                //设置允许的方法
                .allowedMethods("*")
                //跨域允许时间
                .maxAge(3600);
    }
}

2.绑定域名

前端项目访问:用户输入网址=> 域名解析服务器(把网址解析为ip地址/交给其他域名解析服务)=>

服务器=> (防火墙) => nginx请求,找到对应文件,返回文件给前端 => 前端加载到浏览器中(js,css )=>

后端项目访问:用户输入网址 => 域名解析服务器 => 服务器 => nginx接收请求 = >后端项目(比如8081端口)

nginx反向代理:替服务器接收请求,转发请求

项目优化点

1功能扩充

a、登录使用扫码公众号登录

a. 管理员创建用户、修改用户信息、删除用户

b.上传头像

c.按照更多的条件去查询用户

d.更改权限

2修改 Bug

3项目登录改为分布式 session(单点登录 - redis)

4通用性

aset-cookie domain 域名更通用,比如改为 *.xxx.com

b把用户管理系统 => 用户中心(之后所有的服务都请求这个后端)

5后台添加全局请求拦截器(统一去判断用户权限、统一记录请求日志)

📅2024.2.21

后端:add添加用户接口

1.封装一个新增用户请求类(要实现序列化(Alt+Enter))

自动序列化配置教程

1.输入序列化之后,得到最终的序列化

java
  private static final long serialVersionUID = 1L;

image-20240221203506335

2.之后序列化就会成功

java
  private static final long serialVersionUID = 1L;

2.添加需要的字段(管理员添加用户时需要的字段,使用Data)

java
package com.example.usercenter.model.domain.request;



import lombok.Data;

import java.io.Serializable;

@Data
public class UserAddRequest implements Serializable {
    //注解的作用:注明非数据库字段,但是需要使用
 
    private static final long serialVersionUID = 2376161123889989681L;

    /**
     * 用户昵称
     */
    private String userName;

    /**
     * 账号
     */
    private String userAccount;

    /**
     * 用户头像
     */
    private String avatarUrl;

    /**
     * 性别
     */
    private Integer gender;

    /**
     * 密码
     */
    private String userPassword;

    /**
     * 电话
     */
    private String phone;

    /**
     * 邮箱
     */
    private String email;

    /**
     * 状态 0 - 正常  1 - 已封号
     */
    private Integer userStatus;


    /**
     * 用户角色 0-普通用户 1-管理员
     */
    private int userRole;

    
    /**
     * 星球编号
     */
    private String planetCode;


}

3.在controller业务层书写管理员添加用户(使用post请求)

实现方式

  1. 使用post请求

  2. 传递数据使用@RequestBody🌳将json格式的请求数据封装到实体对象当中

  3. 使用通用返回类BaseResponse,返回一个Long ,返回添加成功之后的用户id

实现步骤:

  1. 使用注解@AuthCheck(mustRole = ......)判断用户是否为管理员/或者直接判断
  2. 如果为管理员则继续,判断前端传入的userAddResponse是否为空
  3. 创建一个新的user对象,使用BeanUtils工具 . copy将userAddResponse,复制user到对象中
  4. 将得到的user保存到userServer.save数据库中,如果为空直接抛出异常
  5. 使用抛出异常工具判断是否保存到数据库成功,否则将抛出异常
  6. 返回成功创建的用户id
java
   /**
         * 管理员添加用户
         * @param userAddRequest 用户
         * @param request
         * @return
         */
        @ApiOperation("管理员添加用户")
        @PostMapping("/adduser")
        public BaseResponse <Long> addUser (@RequestBody UserAddRequest userAddRequest, HttpServletRequest request){
            if (!userService.isAdmin(request)) {         //调用逻辑,判断是否为管理员登录
                throw new BusinessException(ErrorCode.NO_AUTH,"您不是管理员!");
            }
            if (userAddRequest == null){
                throw new BusinessException(ErrorCode.NULL_ERROR,"请求数据为空");
            }
            User user =new User();
            BeanUtils.copyProperties(userAddRequest,user);
            boolean save = userService.save(user);
            if (save != true){
                throw new BusinessException(ErrorCode.SAVE_ERROR,"数据保存错误");
            }
            return ResultUtils.success(user.getId());
        }

后端:add修改用户接口

1.封装一个修改用户请求类(继续实现序列化),添加需要的字段(使用Data,实现get,set方法)

java
  private static final long serialVersionUID = 1L;
java
package com.example.usercenter.model.domain.request;
import lombok.Data;
import java.io.Serializable;
@Data
public class UserUpdateRequest implements Serializable {
    private static final long serialVersionUID = 1L;


    /**
     * 用户昵称
     */
    private String userName;

    /**
     * 账号
     */
    private String userAccount;

    /**
     * 用户头像
     */
    private String avatarUrl;

    /**
     * 性别
     */
    private Integer gender;

    /**
     * 密码
     */
    private String userPassword;

    /**
     * 电话
     */
    private String phone;

    /**
     * 邮箱
     */
    private String email;

    /**
     * 状态 0 - 正常  1 - 已封号
     */
    private Integer userStatus;


    /**
     * 用户角色 0-普通用户 1-管理员
     */
    private int userRole;


    /**
     * 星球编号
     */
    private String planetCode;
}

2.在Controller业务层中编写代码

1.实现注意

  1. 使用post请求
  2. 传入userupdateRequest 对象,使用@RequestBody注解,将json格式的请求数据封装到实体对象当中
  3. 请求对象不能为空,用户的id不能为空
  4. 如果修改成功之后,返回值为ture

2.实现步骤

  1. 判断用户是否为管理员
  2. 判断传入的实体对象和传入的id不为空
  3. 创建一个新的user对象,
  4. 使用BeanUtils的copy方法将userupdateRequest 赋值到user对象中
  5. 将user保存到后端数据库中
  6. 如果数据保存失败,则抛出异常
  7. 成功之后返回一个布尔值

Last updated: