当前位置: 首页 > news >正文

大二毕设.3-网盘系统-用户模块讲解

目录

模块功能介绍

具体实现讲解

constants层:存放用户模块常量类

entity层:存放实体类,与数据库中的属性值基本保持一致

mapper层:对数据库进行数据持久化操作

service层:业务逻辑层,主要是针对具体的问题的操作

controller层:负责请求转发,接收页面过来的参数,传给service处理,接到返回值,并再次传给页面

po层:controller层向外接参的实体对象

context层:上下文的实体对象

vo层:视图对象,用于展示层,把某个指定页面的所有数据封装起来,方便前端获取数据

converter层:实体对象转换器


项目演示博客

  • 模块功能介绍

    • 用户注册
      • 接口幂等性
      • 全局唯一的用户名称
    • 用户登录
      • 使用缓存实现单机登录
      • 使用jwt token实现时效性以及分布式的问题
    • 用户登出
    • 用户忘记密码
      • 校验用户名称
      • 校验用户密保问题的答案
      • 修改用户密码
    • 用户在线修改密码
      • 校验旧密码
      • 修改密码
    • 查询用户的基本信息
  • 具体实现讲解

  • 用户模块下共分有9层,分别是:
    • constants层:存放用户模块常量类
    • entity层:存放实体类,与数据库中的属性值基本保持一致
      • 用户信息表(RPanUser)
      • 用户搜索历史表(RPanUserSearchHistory)
    • mapper层:对数据库进行数据持久化操作
      • 针对用户信息表的数据库操作Mapper(RPanUserMapper)
      • 针对用户搜索历史表的数据库操作Mapper(RPanUserSearchHistoryMapper)
    • service层:业务逻辑层,主要是针对具体的问题的操作
      • 针对用户信息表的数据库操作Service(IUserService)
        • 首先需要把 转换器,针对用户文件信息表的数据库操作Service,缓存管理器CacheManager,用户模块缓存业务处理类 注入进来
        • 用户注册的业务实现(register):
          • 需要实现的功能点:
            • 1、注册用户信息
            • 2、创建新用户的根本目录信息
          • 需要实现的技术难点:
            • 1、该业务是幂等的
            • 2、要保证用户名全局唯一
          • 实现技术难点的处理方案:幂等性通过数据库表对于用户名字段添加唯一索引,上游业务捕获对应的冲突异常,转化返回
          • 它只有1个参数:即UserRegisterContext
          • 首先需要实例化用户信息表的实体对象(实体转化,由上下文信息转化成用户实体,封装进上下文)(assembleUserEntity)
            • 它只有1个参数:即UserRegisterContext
            • 首先通过converter的映射方法来完成实体转换得到entity用户实体对象
            • 然后通过PasswordUtil的MessageDigestUtil.md5获取盐值信息(随机生成盐值),同时利用PasswordUtil的MessageDigestUtil.sha256传入盐值和上下文对象传来的密码进行密码加密
            • 然后对entity进行属性设置(UserId通过雪花算法id生成器生成,创建时间与更新时间通过new Date()来生成)
            • 最后将这个entity封装进上下文对象中
          • 然后实现注册用户的业务(需要捕获数据库的唯一索引冲突异常,来实现全局用户名称唯一)(doRegister)
            • 它只有1个参数:即UserRegisterContext
            • 首先从上下文实体对象(UserRegisterContext)中获取用户实体对象得到entity
            • 然后对entity进行判空处理,如果是空则抛出对应错误提示
            • 如果不是空则首先需要捕获DuplicateKeyException异常,表示在数据库中插入或更新数据时,违反了唯一性约束,即出现了重复的键值
            • 然后抛出"用户名已存在"
            • 然后调用mybatisplus的save,如果保存失败也抛出对应异常
          • 然后创建用户的根目录信息(createUserRootFolder)
            • 它只有1个参数:即UserRegisterContext
            • 首先需要创建一个文件夹上下文实体对象
            • 然后设置它的3个属性(它的userid就是上下文实体对象(UserRegisterContext)中entity的userid)
            • 最后调用IUserFileService的创建文件夹信息(createFolder)方法传入设置好的文件夹上下文实体对象来完成创建
          • 最后返回这个上下文对象里的entity里的userid
        • 用户登录的业务实现(login):
          • 需要实现的功能:
            • 1、用户的登录信息校验
            • 2、生成一个具有时效性的accessToken
            • 3、将accessToken缓存起来,去实现单机登录
          • 它只有1个参数:即UserLoginContext
          • 首先要校验传入的信息,即校验用户名密码(checkLoginInfo)
            • 它只有1个参数:即UserLoginContext
            • 首先要通过传入的UserLoginContext上下文对象获取用户名和密码
            • 然后通过用户名获取用户实体信息(getRPanUserByUsername)entity
              • 它只有1个参数:即username
              • 通过QueryWrapper进行eq实现
            • 如果查询出来的entity用户实体信息是null,则抛出对应异常
            • 然后用户名校验通过后,则校验密码信息
            • 首先要获取到它的盐值(entity的盐值),然后通过PasswordUtil传入盐值和上下文对象获取到的密码进行加密
            • 同时获取到用户实体信息entity的密码
            • 加密后的密码和数据库中的密码(用户实体信息entity的密码)进行比较,不相等则抛出对应异常
            • 最后用户名和密码都通过后,UserLoginContext上下文对象设置用户实体对象为entity,方便下游使用
          • 然后生成并保存登陆之后的凭证(generateAndSaveAccessToken)
            • 它只有1个参数:即UserLoginContext
            • 首先要通过传入的UserLoginContext上下文对象获取用户实体对象entity
            • 然后向Jwt工具类传入 entity的username,常量key值,entity的userid和过期时间 进行token生成
            • 然后通过CacheManager获取到服务端公用缓存cache
            • 以 用户登录缓存前缀+entity的userid 为键,缓存token
            • 最后UserLoginContext上下文对象设置登陆成功之后的凭证信息为token
          • 最后将UserLoginContext上下文对象中的Token返回出去
        • 用户退出登录的业务实现(exit):
          • 只需清除用户的登录凭证缓存即可
          • 它只有1个参数:即当前登录用户的userid
          • 首先通过CacheManager获取到服务端公用缓存cache
          • 然后以 用户登录缓存前缀+当前登录用户的userid 为键,清除token即可
        • 用户忘记密码-校验用户名称的业务实现(checkUsername):
          • 它只有1个参数:即CheckUsernameContext
          • 首先从context中获取Username,通过Username在数据库中查询对应的密保问题
          • 如果查询为空则抛出对应异常"没有此用户",查询成功则返回查询到的密保问题供后续服务使用
        • 用户忘记密码-校验密保答案的业务实现(checkAnswer):
          • 它只有1个参数:即CheckAnswerContext
          • 首先从context中获取Username,Question,Answer,通过Username,Question,Answer在数据库中进行对应的查询并进行eq
          • eq失败则抛出对应异常"密保答案错误",成功则生成用户忘记密码-校验密保答案通过的临时token并返回,token的失效时间为五分钟
        • 用户忘记密码-重置用户密码的业务实现(resetPassword):
          • 它只有1个参数:即ResetPasswordContext
          • 首先验证忘记密码的token是否有效(checkForgetPasswordToken):
            • 它只有1个参数:即ResetPasswordContext
            • 首先通过context把token取出来
            • 然后通过JwtUtil分析这个token,返回一个value(Username)
            • 如果这个value为空则说明token过期了,抛出对应异常
            • 如果没有过期解析成功了就把这个token转为string,然后与context中的Username进行对比,不等则抛出对应异常"token错误"
          • 然后校验用户信息并重置用户密码(checkAndResetUserPassword):
            • 它只有1个参数:即ResetPasswordContext
            • 首先通过context把Username和Password取出来
            • 然后通过传入Username进getRPanUserByUsername来判断user实体entity是否存在,不存在则抛出对应异常"用户信息不存在"
            • 如果存在则进行密码的重置
            • 然后对Password进行加密,加密完成后重新设置entity的Password和UpdateTime属性
            • 最后传入处理好的entity进updateById进行修改
        • 用户在线修改密码的业务实现(changePassword):
          • 它只有1个参数:即ChangePasswordContext
          • 首先需要校验旧密码(checkOldPassword):
            • 它只有1个参数:即ChangePasswordContext
            • 首先需要从context中获取userId和oldPassword
            • 然后通过getById查询userId得到用户的实体信息entity
            • 如果entity为空则抛出对应异常"用户信息不存在"
            • 查询成功则将用户的实体信息entity封装到上下文对象context中
            • 然后要获取到它的盐值(entity的盐值),然后通过PasswordUtil传入盐值和上下文对象获取到的密码进行加密
            • 同时获取到用户实体信息entity的密码
            • 加密后的密码和数据库中的密码(用户实体信息entity的密码)进行比较,不相等则抛出对应异常"旧密码不正确"
          • 然后需要重置新密码(doChangePassword):
            • 它只有1个参数:即ChangePasswordContext
            • 首先需要从context中获取newPassword和entity
            • 然后要获取到它的盐值(entity的盐值),然后通过PasswordUtil传入盐值和新密码newPassword重新进行加密
            • 然后用加密密码覆盖掉entity原有密码
            • 最后通过向updateById传入entity进行修改,失败则抛出对应异常"修改用户密码失败"
          • 最后退出当前的登录状态(exitLoginStatus):
            • 它只有1个参数:即ChangePasswordContext
            • 直接调用exit传入context中的UserId完成退出
        • 查询在线用户的基本信息的业务实现(info):
          • 它只有1个参数:即userId
          • 首先通过getById查询用户的基本信息实体entity,对其进行判空处理,查询失败则抛出对应异常"用户信息查询失败"
          • 然后查询用户的根文件夹信息(getUserRootFileInfo):
            • 它只有1个参数:即userId
            • 委托给文件模块的IUserFileService的getUserRootFile进行处理
          • 查询失败则抛出对应异常"查询用户根文件夹信息失败"
          • 最后通过converter的映射方法拼装VO对象(基本信息实体和根文件夹信息)返回
      • 针对用户搜索历史表的数据库操作Service(IUserSearchHistoryService)
        • 首先需要把 *** 注入进来
        • 查询用户的搜索历史记录,默认十条(getUserSearchHistories):
          • 它只有1个参数:即QueryUserSearchHistoryContext
          • 直接通过Context上下文通过baseMapper调用自定义Mapper操作进行数据库对应查询,并返回查询结果
    • controller层:负责请求转发,接收页面过来的参数,传给service处理,接到返回值,并再次传给页面
      • 用户模块的控制器实体(UserController):
        • 首先需要把 *** 注入进来
        • register:
          • 它只有1个参数:即UserRegisterPO
          • 首先在调用service的register方法前,需要将这个po对象转换成上下文对象,通过converter的映射方法来完成转换
          • 转换了实体之后,调用service的register方法把这个context给它传进去完成调用,返回一个新注册的userid
          • 最后把这id加密下,返回给客户端去使用,返回相关状态码
        • login:
          • 它只有1个参数:即UserLoginPO
          • 首先在调用service的login方法前,需要将这个po对象转换成上下文对象,通过converter的映射方法来完成转换
          • 转换了实体之后,调用service的login方法把这个context给它传进去完成调用,返回一个有时效性的accessToken供后续服务使用,返回相关状态码
        • exit:
          • 没有参数
          • 由于每次请求,token放于header中,想要获取token,每次都要通过在control层获取header,才能获取到登录信息,很麻烦
          • 所以通过用户ID存储工具类里配置好的 ThreadLocal 获取到当前登录用户的userid
          • 然后调用service的exit方法把这个userid给它传进去完成调用,返回相关状态码即可
        • checkUsername:
          • 它只有1个参数:即CheckUsernamePO
          • 首先在调用service的checkUsername方法前,需要将这个po对象转换成上下文对象,通过converter的映射方法来完成转换
          • 转换了实体之后,调用service的checkUsername方法把这个context给它传进去完成调用,返回下一步需要校验的密保问题供后续服务使用,返回相关状态码
        • checkAnswer:
          • 它只有1个参数:即CheckAnswerPO
          • 首先在调用service的checkAnswer方法前,需要将这个po对象转换成上下文对象,通过converter的映射方法来完成转换
          • 转换了实体之后,调用service的checkAnswer方法把这个context给它传进去完成调用,返回token供后续服务使用,返回相关状态码
        • resetPassword:
          • 它只有1个参数:即ResetPasswordPO
          • 首先在调用service的resetPassword方法前,需要将这个po对象转换成上下文对象,通过converter的映射方法来完成转换
          • 转换了实体之后,调用service的resetPassword方法把这个context给它传进去完成调用,返回相关状态码即可
        • changePassword:
          • 它只有1个参数:即ChangePasswordPO
          • 首先在调用service的changePassword方法前,需要将这个po对象转换成上下文对象,通过converter的映射方法来完成转换
          • 然后需要获取当前线程的用户ID,用来设置上下文对象的UserId
          • 调用service的changePassword方法把这个context给它传进去完成调用,返回相关状态码即可
        • info:
          • 没有参数
          • 通过获取当前线程的用户ID,直接调用service的info查询在线用户的基本信息
          • 查询成功返回对应vo对象,同时返回相关状态码
      • 用户搜索历史模块的控制器实体(UserSearchHistoryController):
        • 首先需要把 *** 注入进来
        • 获取用户最新的搜索历史记录,默认十条(getUserSearchHistories):
          • 首先需要创建一个 用户查询搜索历史记录上下文实体(QueryUserSearchHistoryContext)
          • 然后通过 用户ID存储工具类获取当前线程的用户ID 进行Context属性设置
          • 最后调用service的 getUserSearchHistories 方法把这个context给它传进去完成调用,返回用户最新的搜索历史记录和相关状态码
    • po层:controller层向外接参的实体对象
      • 注册用户参数实体对象(UserRegisterPO):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加4个属性:用户名,密码,密保问题,密保答案
        • 最后利用@NotBlank 进行非空校验,@Pattern 进行用户名正则校验,@Length 进行长度校验
      • 登录用户参数实体对象(UserLoginPO):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加2个属性:用户名,密码
        • 最后利用@NotBlank 进行非空校验,@Pattern 进行用户名正则校验,@Length 进行长度校验
      • 用户忘记密码-校验用户名称PO对象(CheckUsernamePO):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加1个属性:用户名
        • 最后利用@NotBlank 进行非空校验,@Pattern 进行用户名正则校验
      • 用户忘记密码-校验密保答案PO对象(CheckAnswerPO):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加3个属性:用户名,密保问题,密保答案
        • 最后利用@NotBlank 进行非空校验,@Pattern 进行用户名正则校验,@Length 进行长度校验
      • 用户忘记密码-重置用户密码PO对象(ResetPasswordPO):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加3个属性:用户名,密码,验证通过提交重置密码的token
        • 最后利用@NotBlank 进行非空校验,@Pattern 进行用户名正则校验,@Length 进行长度校验
      • 用户在线修改密码PO对象(ChangePasswordPO):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加2个属性:旧密码和新密码
        • 最后利用@NotBlank 进行非空校验,@Length 进行长度校验
    • context层:上下文的实体对象
      • 用户注册业务的上下文实体对象(UserRegisterContext):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加5个属性:用户名,密码,密保问题,密保答案,用户实体对象(RPanUser)
      • 用户登录业务的上下文实体对象(UserLoginContext):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加4个属性:用户名,密码,用户实体对象(RPanUser),登陆成功之后的凭证信息
      • 用户忘记密码-校验用户名称业务的上下文实体对象(CheckUsernameContext):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加1个属性:用户名
      • 用户忘记密码-校验密保答案业务的上下文实体对象(CheckAnswerContext):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加3个属性:用户名,密保问题,密保答案
      • 用户忘记密码-重置用户密码业务的上下文实体对象(ResetPasswordContext):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加3个属性:用户名,密码,验证通过提交重置密码的token
      • 用户在线修改密码业务的上下文实体对象(ChangePasswordContext):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加4个属性:当前登录的用户ID,旧密码,新密码,当前登录用户的实体信息(RPanUser)
      • 用户查询搜索历史记录上下文实体(QueryUserSearchHistoryContext):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加1个属性:当前登录用户的ID
    • vo层:视图对象,用于展示层,把某个指定页面的所有数据封装起来,方便前端获取数据
      • 用户基本信息实体(UserInfoVO):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加3个属性:用户名称,用户根目录的加密ID,用户根目录名称
        • 同时通过@JsonSerialize 自定义序列化类对ID进行自动加密
      • 用户搜索历史返回实体(UserSearchHistoryVO):
        • 首先它要实现Serializable序列化接口
        • 然后给它添加序列化UID这一属性
        • 再添加1个属性:搜索文案
    • converter层:实体对象转换器
      • 用户模块实体转化工具类(UserConverter)
        • 首先利用MapStruct的@Mapper 注解标记这个接口作为一个映射接口,并且是编译时MapStruct处理器的入口,简化不同的Java Bean之间映射的处理
        • 同时指定@Mapper 注解的componentModel属性为spring,这样生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired 方式进行注入
        • 然后添加若干映射方法,MapStruct会自动生成转换

相关文章:

大二毕设.3-网盘系统-用户模块讲解

目录 模块功能介绍 具体实现讲解 constants层:存放用户模块常量类 entity层:存放实体类,与数据库中的属性值基本保持一致 mapper层:对数据库进行数据持久化操作 service层:业务逻辑层,主要是针对具体…...

(Vue2)智慧商城项目

新增两个目录api、utils api接口模块:发送ajax请求的接口模块 utils工具模块:自己封装的一些工具方法模块 第三方组件库vant-ui PC端:element-ui(element-plus) ant-design-vue 移动端:vant-ui Mint UI…...

Nginx实战

虚拟主机 虚拟主机指的就是⼀个独⽴的站点,具有独⽴的域名,有完整的www服务,例如⽹站、FTP、邮件等 。Nginx⽀持多虚拟主机,在⼀台机器上可以运⾏完全独⽴的多个站点。⼀些草根流量站⻓,常会搭建个⼈站点进⾏资源分享交…...

day-57 代码随想录算法训练营(19)动态规划 part 17

647.回文子串 思路&#xff1a;动态规划 1.dp存储&#xff1a;判断以i开始&#xff0c;j结尾的字符串是否是回文串2.动态转移方程&#xff1a;当s[i]s[j]时&#xff0c;如果j-i<1,d[i][j]true; 如果 dp[i1][j-1]true&#xff0c;那么dp[i][j…...

在项目中,关于前端实现数据可视化的技术选择

前言 在项目中&#xff0c;数据可视化以图表、报表类型为主。 需求背景 技术框架是Vue2.x版本&#xff0c;组件库是Ant Design of Vue能够支撑足够多的图表类型开发图表大小/位置能够随意变动图表样式需要支持丰富多样的用户配置强大、开放的图表语法支持复杂的数据可视化场景…...

DT 卡通材质学习 一

渐变着色器 相交线 笔刷和卡通结合使用 修改器...

【游戏引擎架构】6.2 资源管理器

资源管理器可以分为离线部分系统和运行时系统 文章目录 离线资源管理数据库资产管道 运行时资源管理文件结构内存管理文件间引用 离线资源管理 数据库 UE的数据库可以直接浏览、编辑资产&#xff0c;看到运行时的状态&#xff1b;但也存在两个较大的缺点&#xff1a; 版本管…...

spring的ThreadPoolTaskExecutor装饰器传递调用线程信息给线程池中的线程

概述 需求是想在线程池执行任务的时候&#xff0c;在开始前将调用线程的信息传到子线程中&#xff0c;在子线程完成后&#xff0c;再清除传入的数据。 下面使用了spring的ThreadPoolTaskExecutor来实现这个需求. ThreadPoolTaskExecutor 在jdk中使用的是ThreadPoolExecutor…...

转载 - 洞察问题本质,解决工作难题

作者&#xff1a;关苏哲 高效管理者的三大技能 问题界定的6个问题 1.你所需要解决的问题是什么&#xff1f; 2.你为什么需要解决这个问题&#xff1f; 3.你期待的理想结果是什么&#xff1f; 4.这个问题包括哪些子问题&#xff1f; 5.你曾经尝试过哪些解决方式&#xff1f…...

关于计算机找不到d3dx9_43.dll,无法继续执行代码修复方法

d3dx9_43.dll是一个动态链接库文件&#xff0c;它是DirectX的一个组件&#xff0c;主要用于处理游戏中的图形、声音等多媒体元素。当这个文件丢失时&#xff0c;可能会导致以下问题&#xff1a; 1. 游戏无法正常运行&#xff1a;由于d3dx9_43.dll负责处理游戏中的多媒体元素&a…...

《从零开始的Java世界》01基本程序设计

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…...

【数据开发】数据全栈知识架构,数据(平台、开发、管理、分析)

文章目录 一、数据全栈知识架构1、数据方法&#xff08;思维&#xff0c;统计学&#xff0c;实践&#xff0c;北极星&#xff09;2、数据工具&#xff1a;数据仓库3、数据规范 二、数据分析工具1、大数据平台2、数据开发&#xff1a;入库计算&#xff08;重点&#xff09;3、数…...

基于STM32的宠物托运智能控制系统的设计(第十七届研电赛)

一、功能介绍 使用STM32作为主控设备&#xff0c;通过DHT11温湿度传感器、多合一空气质量检测传感器以及压力传感器对宠物的托运环境中的温湿度、二氧化碳浓度和食物与水的重量进行采集&#xff0c;将采集到的信息在本地LCD显示屏上显示&#xff0c;同时&#xff0c;使用4G模块…...

数据结构的奇妙世界:实用算法与实际应用

文章目录 数据结构和算法的基本概念数据结构数组链表栈队列树图 算法 常见的数据结构和算法排序算法快速排序示例 数据结构的应用数据库管理系统图像处理网络路由 数据结构和算法的性能分析时间复杂度空间复杂度 如何更好地编写代码避免常见错误结论 &#x1f389;欢迎来到数据…...

uniapp实现表格冻结

效果图如下&#xff1a; 思路&#xff1a; 1.由于APP项目需要&#xff0c;起初想去插件市场直接找现成的&#xff0c;结果找了很久没找到合适的&#xff08;有的不支持vue2有的不能都支持APP和小程序&#xff09; 2.后来&#xff0c;就只能去改uni-table源码了&#xff0c;因…...

Spring面试题11:什么是Spring的依赖注入

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的依赖注入 依赖注入(Dependency Injection)是Spring框架的一个核心特性,它是指通过外部容器将对象的依赖关系注入到对象中,从而…...

用于设计 CNN 的 7 种不同卷积

一 说明 最近对CNN架构的研究包括许多不同的卷积变体&#xff0c;这让我在阅读这些论文时感到困惑。我认为通过一些更流行的卷积变体的精确定义&#xff0c;效果和用例&#xff08;在计算机视觉和深度学习中&#xff09;是值得的。这些变体旨在保存参数计数、增强推理并利用目标…...

备受以太坊基金会青睐的 Hexlink,构建亿级用户涌入 Web3的入口

早在2021年9月&#xff0c;以太坊创始人Vitalik Buterin就曾提出了EIP-4337&#xff08;账户抽象&#xff09;提案&#xff0c;并在去年10月对该提案进一步更新&#xff0c;引发行业的进一步关注。在今年3月&#xff0c;EIP-4337提案正式通过审计&#xff0c;并成为了ERC-4337标…...

合约升级标准 ERC2535 的设计解析和不足

合约升级标准 ERC2535 的设计解析和不足 Safful最近审计了钻石标准的一份实现代码&#xff0c;这一标准是一种新的可升级合约模式。撰写标准是一项值得赞许的事业&#xff0c;但钻石标准及其实现有许多引人担忧的地方。这份代码是过度工程的产物&#xff0c;附带了许多不必要的…...

【Vue】ElementUI实现登录注册

一、搭建项目 二、后台交互 三、CORS跨域 好啦今天到这了&#xff0c;希望能帮到你&#xff01;&#xff01;&#xff01;...

linux 安装 wordpress

文章目录 linux 安装 wordpress1. wordpress 简介2. wordpress功能和特点3. 部署要求4. 环境搭建4.1 部署 nginx4.1.1 新增配置文件 4.2 部署 PHP74.2.1 查看当前版本4.2.2 YUM 安装 PHP74.2.3 查看 PHP 版本4.2.4 启动PHP-FPM4.2.5 修改配置文件4.2.6 重启服务 4.3 部署 mysql…...

LeetCode902最大为 N 的数字组合(相关话题:数位DP问题,递归遍历和减枝)

目录 题目描述 方法一递归遍历和减枝 方法二动态规划 数位DP问题拓展 通用方法论引入 <...

USB总线-Linux内核USB3.0主机控制器驱动框架分析(十二)

1.概述 如下图所示&#xff0c;Linux内核中USB主机体系结构由五部分组成&#xff0c;分别为Application Software、USB Class Driver、USB Core(USB Driver)、USB Host Controller Driver、USB Host Controller。应用程序处于用户空间&#xff0c;通过系统调用访问Class Drive…...

SQL模板-用户留存率计算

在这段实习中&#xff0c;我遇到了用户留存率计算的需求&#xff0c;这里做个总结。 首先来讲下&#xff0c;什么是用户留存&#xff1f; 在互联网行业中&#xff0c;用户在某段时间内开始使用应用&#xff0c;经过一段时间后&#xff0c;仍然继续使用该应用的用户。用户留存一…...

LeakCanary 源码详解(3)

上一篇&#xff1a;LeakCanary源码详解&#xff08;2&#xff09; 如果你是直接刷到这篇的&#xff0c;建议还是从1开始看&#xff0c;然后2&#xff0c;然后是这篇3&#xff0c;如果你只关注这篇的重点hprof 文件定位泄漏位置的感兴趣&#xff0c;可以试试直接读这篇&#xff…...

springboot使用SSE

1、pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> 2、前端代码 <!DOCTYPE html> <html lang"en"> <head><meta ch…...

搞定ESD(一):静电放电测试标准解析

文章目录 一、基本术语与定义1.1 基本定义1.2 重要基本术语 二、静电放电发生器介绍2.1 静电放电发生器的特性&#xff1a;通用规范【GB/T17626.2-2018 标准】2.2 ESD 放电发生器电极规格要求&#xff1a;通用规范【GB/T17626.2-2018 标准】2.3 放电回路电缆的要求&#xff1a;…...

问界M7的诸多优点(自动驾驶走进我们的生活二)

博主一直在问界工厂工作&#xff0c;从未对自己工厂的车如此关注过&#xff1b;但问界系列上市后&#xff0c;经常在茶余饭后看B站视频&#xff0c;发现问界车越来越多不可比拟的优点如下&#xff1a; 一、绿牌 绿牌特权在重庆可以随时过桥&#xff0c;不受限号限制。 二、增…...

[运维|数据库] msql中的 FIND_IN_SET如何转化为pg数据中的ARRAY_POSITION的函数

在 MySQL 中&#xff0c;FIND_IN_SET 函数用于查找一个值是否存在于逗号分隔的字符串列表中。在 PostgreSQL 中&#xff0c;可以使用 string_to_array 函数将逗号分隔的字符串转换为数组&#xff0c;然后使用 ARRAY_POSITION 函数来查找值是否在数组中。 以下是如何将MySQL中的…...

LeetCode 面试题 05.03. 翻转数位

文章目录 一、题目二、Java 题解 一、题目 给定一个32位整数 num&#xff0c;你可以将一个数位从0变为1。请编写一个程序&#xff0c;找出你能够获得的最长的一串1的长度。 示例 1&#xff1a; 输入: num 1775(110111011112) 输出: 8 示例 2&#xff1a; 输入: num 7(01112)…...

南昌网站建设公司服务器/怎样进行seo推广

注:采集专用 假如说在某个页面上有很多连接,样式都是<a href"url">title</a>,我打算将url和title放入数据库中 举个例子,HtmlCode的值如下 <a href"url1">title1</a> <a href"url2">title2</a> <a hre…...

wap网站有哪些/深圳全网推互联科技有限公司

https://segmentfault.com/a/1190000013822385转载于:https://www.cnblogs.com/EricZ-Blog/p/10817168.html...

哪里找做网站的公司/活动推广软文

1 饼状图 import mx.collections.ArrayCollection; //绑定需要显示的数据 [Bindable] //设定要显示的数据 private var modelData:ArrayCollection new ArrayCollection( [ { Year: "2010年世界杯", Count: 4 }, { Year: "2014年世界杯", Count: 10 }, { …...

国外幼儿园网站模板/亿驱动力竞价托管

参考廖雪峰python3 首先记住&#xff1a; 面向对象的三大特点是 数据封装、继承和多态 面向对象编程oop&#xff0c;就是把对象作为程序的基本单元&#xff0c;一个对象中包含了数据和操作数据的函数 而我们平时写的python程序&#xff0c;很多是面向过程的&#xff0c;也会是执…...

我要免费发布信息/重庆关键词seo排名

1.打开IDEA,创建新项目&#xff0c;选择Spring Initializr&#xff0c;选择SDK为你的java版本。 2.点击下一步&#xff0c;输入Artifact 3.点击下一步&#xff0c;选择web 4.finish 5.完成后idea自动生成下列结构&#xff0c;框出来的可以删掉。 idea会为每个module生成一个app…...

宁海县建设局网站下属单位/公司网站怎么建立

这是我2021年的第13篇原创文章&#xff0c;原汁原味的技术之路尽在Jerrycodes什么是内存泄漏Key 的泄漏Value 的泄漏如何避免内存泄露什么是内存泄漏内存泄漏指的是&#xff0c;当某一个对象不再有用的时候&#xff0c;占用的内存却不能被回收&#xff0c;这就叫作内存泄漏。因…...