Java开发中的------修改密码+忘记密码

目录

1.修改密码

客户端响应

 前端vue

后端

controller层

ServiceImpl实现层

2.忘记密码

客户端响应

后端

controller层

serviceImpl实现层


本章需要准备:springcloud项目,依赖,数据库....

数据库SQL

 
SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for mbs_member
-- ----------------------------
DROP TABLE IF EXISTS `mbs_member`;
CREATE TABLE `mbs_member` (`id` int NOT NULL AUTO_INCREMENT COMMENT '会员客户ID',`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '账号',`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '密码',`pw_salt` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '盐值列',`status` int DEFAULT NULL COMMENT '账号状态(帐号启用状态:0->启用;1->禁用)',`id_type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '(身份证,护照,军官证,台胞证,港澳台来往内地通行证)',`path_front` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '正面',`path_reverse` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '反面',`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '客户名字',`contact_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人',`contact_phone` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系电话',`contact_address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系地址',`license_no` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '驾照号',`sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '性别',`phone_num` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '电话',`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '地址',`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '邮箱',`member_level_id` int DEFAULT NULL COMMENT '会员级别(普通,金卡,白金,钻石)',`Account_Balance` double DEFAULT '0' COMMENT '账户余额',`integration` int DEFAULT '0' COMMENT '积分',`growth` double DEFAULT NULL COMMENT '成长值',`history_integration` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '历史积分数量(只加不减)',`open_id` int DEFAULT NULL COMMENT '微信返回ID',`token` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '登录验证token',`id_card` varchar(18) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '证件编号',`head_pic` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '头像',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=89 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of mbs_member
-- ----------------------------
INSERT INTO `mbs_member` VALUES ('71', 'zhanghaojie', 'f5455390512559851fdffdc9dc71e1debe7261c41509579a3cb8d8085b86bee95d3808d9345e79790a2b2a153effe2615b1b4302694018d0d369f13a4a6e5005', '8efbe27a-4', '0', '1', null, null, '小浩杰', null, null, null, '410100123457', null, '15136204889', null, '222222@qq.com', '1', '11240', '5610', '3760', '2260', null, null, null, 'https://wangzherongyao.oss-cn-beijing.aliyuncs.com/upload/files/1605770604552-7c5b7014-09cb-4d0a.jpg');
INSERT INTO `mbs_member` VALUES ('78', 'test111', '111591072d3b1a693158b77a16df045daf87fca20ea7fc00c32411b6ace2d2c7ac0a70777619883fac37417ca9a09593465c51e7ab56cfb2b1debc174e2ffb3a', 'fcba1cda-2ce7-4d49-9658-976ff2b5aa9d', '0', '1', null, null, 'test111', null, null, null, '511621200011011212', null, '18398591677', null, '1111@11.cc', '3', '94620.96000000002', '1000', '65790.4', '0', null, null, '51162******212', 'https://qy002-bookstore.oss-cn-hangzhou.aliyuncs.com/staff_headicon/9ddb6b4b-8332-47a6-84ae-d5b9234e5065bg5.jpg');
INSERT INTO `mbs_member` VALUES ('88', 'cjj', '836bac861900ae9df5bf390ede7c2a45c1287f346139d3d3576300be822e1f17746c95d622955cc292427748dc12959447a28ba46ce13eb3c41fdcab09956161', 'c5546504-f2a1-4494-a738-8297e786acee', '0', '1', null, null, '成JJ', null, null, null, null, null, '13645678922', null, null, '1', '200', '50', '10500', '500', null, null, null, 'https://qy002-bookstore.oss-cn-hangzhou.aliyuncs.com/staff_headicon/29727801-0855-484d-bf5d-c6f69e8a72ad111.jpg');

1.修改密码

客户端响应

 

 前端vue

<template><div class="surechange"><head_><h1>修改密码</h1></head_><div class="inp"><label for="oldpw">旧密码</label><inputtype="text"placeholder="请输入旧密码"id="oldpw"v-model="oldpw"@blur="checkpw"/></div><div class="inp"><label for="newpwd">新密码</label><inputv-model="newpw":type="flas ? tests : pass"placeholder="请输入新密码"id="newpwd"/><van-icon@click="eye_active":class="flas ? 'eye_active' : ''"name="eye-o"size="0.36rem"/></div><div class="inp"><label for="sure">确认</label><input:type="flas2 ? tests : pass"v-model="surepw"placeholder="再次输入新密码"id="sure"/><van-icon@click="eye_active2":class="flas2 ? 'eye_active' : ''"name="eye-o"size="0.36rem"/></div><div class="submit"><button@click="submit":disabled="submitdisplay":class="[submitcolor == true ? 'submit_active' : '']">确认修改</button></div></div>
</template><script>//导入请求
import{changePwd,backPwd,checkPwd} from "../../request/userinfo/userinfo"
import head_ from '../jingtai_/header'
export default {props: {},data() {return {oldpw: "",newpw: "",surepw: "",flas: false,pass: "password",tests: "text",flas2: false,submitdisplay: true,submitcolor: false,regpw: /^[\w]{6,16}$/,};},methods: {//校验密码checkpw(){checkPwd({oldpw: this.oldpw}).then((res) => {if (res.code == 200) {if(!res.data){this.$toast.fail("请输入正确的密码!");this.oldpw='';}}else {this.$toast.fail("出错了!");}});},eye_active() {this.flas = !this.flas;},eye_active2() {this.flas2 = !this.flas2;},submit() {if (this.regpw.test(this.newpw) == false) {this.$toast.fail("6~16位,包含大小写字母和数字的组合");} else if (this.newpw != this.surepw) {this.$toast.fail("两次密码输入不一致");} else {changePwd({ password: this.newpw }).then((res) => {if (res.code == 200 && res.data) {this.$toast.success("修改成功");window.localStorage.removeItem("token");this.$router.push("/login");} else {this.$toast.success("修改失败");}});}},},updated() {if (this.oldpw != "" && this.newpw != "" && this.surepw != "") {this.submitdisplay = false;this.submitcolor = true;} else {this.submitcolor = false;this.submitdisplay = true;}},components: {head_},
};
</script><style scoped lang="less">
.surechange {padding: 0 0.24rem;.title {display: flex;align-items: center;height: 0.88rem;span {flex: 1;text-align: center;font-size: 0.34rem;font-weight: bolder;}}.inp {display: flex;justify-content: space-between;align-items: center;margin-top: 0.29rem;position: relative;label {font-size: 0.26rem;font-weight: bolder;}input {width: 5.48rem;height: 0.66rem;font-size: 0.22rem;padding-left: 0.19rem;border: 2px solid #e4e4e4;border-radius: 0.04rem;&::placeholder {color: #999;}}.van-icon-eye-o {position: absolute;top: 0.2rem;right: 0.19rem;}.eye_active {color: #2094ff;}}.submit {margin-top: 2.27rem;text-align: center;button {width: 5rem;height: 1rem;color: #999;background: #f2f2f2;font-size: 0.34rem;text-align: center;line-height: 1rem;border: none;outline: none;}.submit_active {background: #43a5ff;color: #fff;}}
}
</style>
// 检验密码
export function checkPwd(data){return req({url:'/member/queryByPassword?password='+data.oldpw,method:'get',data:data})
}// 修改密码
export function changePwd(data){// console.log(data)return req({url:'/member/alterPassword?pass='+data.password,method:'post',data:data})
}// 找回密码
export function backPwd(data){// console.log(data)return req({url:'/mbs/client/BackPwd',method:'post',data:data})}

后端

实体类

package com.fifth.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.io.Serializable;/*** 客户信息表** @TableName mbs_member*/
@TableName("mbs_member")
@Data
@ApiModel("客户信息实体类")
public class Member implements Serializable {/*** 会员客户ID*/@ApiModelProperty("会员客户ID")@TableId(type = IdType.AUTO)private Integer id;/*** 账号*/@ApiModelProperty("账号")private String username;/*** 密码*/@ApiModelProperty("密码")private String password;/*** 盐值列*/@ApiModelProperty("盐值列")private String pwSalt;/*** 账号状态(帐号启用状态:0->启用;1->禁用)*/@ApiModelProperty("账号状态(帐号启用状态:0->启用;1->禁用)")private Integer status;/*** (身份证,护照,军官证,台胞证,港澳台来往内地通行证)*/@ApiModelProperty("(身份证,护照,军官证,台胞证,港澳台来往内地通行证)")private String idType;/*** 正面*/@ApiModelProperty("正面")private String pathFront;/*** 反面*/@ApiModelProperty("反面")private String pathReverse;/*** 客户名字*/@ApiModelProperty("客户名字")private String name;/*** 联系人*/@ApiModelProperty("联系人")private String contactName;/*** 联系电话*/@ApiModelProperty("联系电话")private String contactPhone;/*** 联系地址*/@ApiModelProperty("联系地址")private String contactAddress;/*** 驾照号*/@ApiModelProperty("驾照号")private String licenseNo;/*** 性别*/@ApiModelProperty("性别")private String sex;/*** 电话*/@ApiModelProperty("电话")private String phoneNum;/*** 地址*/@ApiModelProperty("地址")private String address;/*** 邮箱*/@ApiModelProperty("邮箱")private String email;/*** 会员级别(普通,金卡,白金,钻石)*/@ApiModelProperty("会员级别(普通,金卡,白金,钻石)")private Integer memberLevelId;/*** 账户余额*/@ApiModelProperty("账户余额")private Double accountBalance;/*** 积分*/@ApiModelProperty("积分")private Integer integration;/*** 成长值*/@ApiModelProperty("成长值")private Double growth;/*** 历史积分数量(只加不减)*/@ApiModelProperty("历史积分数量(只加不减)")private String historyIntegration;/*** 微信返回ID*/@ApiModelProperty("微信返回ID")private Integer openId;/*** 登录验证token*/@ApiModelProperty("登录验证token")private String token;/*** 证件编号*/@ApiModelProperty("证件编号")private String idCard;/*** 头像*/@ApiModelProperty("头像")private String headPic;}

controller层

@RestController
@RequestMapping("member")
@Api(tags = "客户管理--会员管理")
public class MemberController {@Autowiredprivate MemberService memberService;//判断修改密码中输入的旧密码@GetMapping("queryByPassword")@ApiOperation("修改密码-旧密码判断")public Result<Boolean> queryByPassword(@RequestParam String password,@RequestParam String token) {return memberService.queryByPassword(password,token);}//确认修改密码@PostMapping("/alterPassword")@ApiOperation("修改密码-确认事件")public Result<Boolean> alterPassword(@RequestParam String pass, @RequestParam String token) {return memberService.alterPassword(pass, token);}
}

Service层


public interface MemberService {//修改密码-旧密码判断Result<Boolean> queryByPassword(String password, String token);//修改密码-确认事件Result<Boolean> alterPassword(String pass, String token);
}

ServiceImpl实现层


@Service
public class MemberServiceImpl implements MemberService {@Autowiredprivate MemberDao memberDao;@Autowiredprivate StringRedisTemplate redisTemplate;//修改密码-旧密码判断/*** 根据密码和用户令牌查询用户信息* @param password 用户输入的旧密码* @param token 用户令牌,用于从Redis中获取用户信息* @return 返回Result对象,包含查询结果和消息*/@Overridepublic Result<Boolean> queryByPassword(String password, String token) {// 从Redis中根据用户令牌获取用户信息String userInfoJson = redisTemplate.opsForValue().get("sso:member:" + token);if (userInfoJson == null) {// 未找到该令牌对应的用户信息return new Result<>(500, "令牌不存在", null);}// 将用户信息JSON转换成Member对象Member member = JSON.parseObject(userInfoJson, Member.class);if (member == null || member.getId() == null) {// Redis中存储的用户信息无效return new Result<>(500, "用户信息无效", null);}// 查询数据库该用户的真实密码Member member1 = memberDao.selectById(member.getId());if (member1 == null || member1.getPassword() == null || member1.getPwSalt() == null) {// 数据库中用户信息无效return new Result<>(500, "用户信息无效", null);}// 加密后的密码Md5Hash md5Hash = new Md5Hash(password, member1.getPwSalt());// 检查用户输入的旧密码是否与数据库中的密码匹配if (member1.getPassword().equals(md5Hash.toString())) {// 密码正确,返回结果为成功return new Result<>(200, "密码正确", true);} else {// 密码不正确,返回结果为失败return new Result<>(500, "旧密码错误", false);}}//修改密码-确认事件@Overridepublic Result<Boolean> alterPassword(String pass, String token) {//1.获取当前登录用户的缓存信息String s = redisTemplate.opsForValue().get("sso:member:" + token);Member member = JSON.parseObject(s,Member.class);//2.修改用户密码,进行加密并更新到数据库String newPassword = new Md5Hash(pass, member.getPwSalt()).toString();member.setPassword(newPassword);int i = memberDao.updateById(member);if (i > 0) {return new Result<>(200, "修改成功", true);}return new Result<>(500, "修改密码未知错误", false);}}

dao层

@Mapper
public interface MemberDao extends BaseMapper<Member> {}

修改密码完成

2.忘记密码

客户端响应

 前端vue......(在上面"修改密码 "前端vue里)

后端

 MemberRegisterVo.java

@Data
@ApiModel("会员短信注册信息接收")
public class MemberRegisterVo {private String confirmPassword;private String password;private String phoneNum;//验证码private String verifyCode;}

controller层

@RestController
@RequestMapping("member")
@Api(tags = "客户管理--会员管理")
public class MemberController {@Autowiredprivate MemberService memberService;@GetMapping("/queryByUserName")@ApiOperation("根据会员电话(相当于用户名)查询会员")public Result<Boolean> queryByUserName(@RequestParam String userName) {return memberService.queryByUserName(userName);}@PostMapping("/backPassword")@ApiOperation("密码找回")public Result<String> backPassword(@RequestBody MemberRegisterVo memberRegisterVo, @RequestParam String token) {return memberService.backPassword(memberRegisterVo,token);}}

service层

public interface MemberService {//根据会员电话查询会员信息Member getByPhoneNum(String num);//密码找回Result<String> backPassword(MemberRegisterVo memberRegisterVo,String token);}

serviceImpl实现层


@Service
public class MemberServiceImpl implements MemberService {@Autowiredprivate MemberDao memberDao;@Autowiredprivate StringRedisTemplate redisTemplate;//根据会员电话查询信息@Overridepublic Result<Boolean> queryByUserName(String userName) {QueryWrapper<Member> wrapper = new QueryWrapper<>();//会员手机号wrapper.eq("phone_num", userName);Member member = memberDao.selectOne(wrapper);if (member != null) {return new Result<>(200,"成功",true);}return new Result<>(200,"成功",false);}//密码找回@Overridepublic Result<String> backPassword(MemberRegisterVo memberRegisterVo,String token) {//1.获取当前登录用户的缓存信息String s = redisTemplate.opsForValue().get("sso:member:" + token);Member member = JSON.parseObject(s,Member.class);//1.校验验证码输入是否正确String verifyCode = memberRegisterVo.getVerifyCode();//获取redis中的验证码String code = redisTemplate.opsForValue().get("code");if (!code.equals(verifyCode)) {return new Result<>(200, "验证码错误", "1");}//用户密码加密String password = memberRegisterVo.getPassword();Md5Hash md5password = new Md5Hash(password, member.getPwSalt());member.setPassword(md5password.toString());int i = memberDao.updateById(member);if (i > 0) {//清除验证码redisTemplate.delete("code");return new Result<>(200, "成功", "0");}return new Result<>(200, "失败", null);}}

dao层


@Mapper
public interface MemberDao extends BaseMapper<Member> {}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用langchain与你自己的数据对话(四):问答(question answering)

之前我已经完成了使用langchain与你自己的数据对话的前三篇博客&#xff0c;还没有阅读这三篇博客的朋友可以先阅读一下&#xff1a; 使用langchain与你自己的数据对话(一)&#xff1a;文档加载与切割使用langchain与你自己的数据对话(二)&#xff1a;向量存储与嵌入使用langc…

Race竞争型漏洞

目录 Race竞争介绍 实验环境配置 安装Cookiecutter 创建基于Django框架的项目 选择配置 创建数据库 加载到环境变量里 数据库的生成 创建一个超级用户&#xff08;superuser&#xff09; 启动一个本地开发服务器 配置文件 Race竞争介绍 竞争型漏洞&#xff08;Race Co…

leetcode(力扣) 剑指 Offer 12. 矩阵中的路径(回溯 DFS)

文章目录 题目描述思路分析完整代码 题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff…

redis的事务、redis持久化方案、Java操作redis数据库

五、redis的事务 开启事务&#xff1a; 要等左边的提交事务&#xff0c;右边才能拿到修改后的值 本来name不能增加&#xff0c;会报错&#xff0c;但是事务中没提交不知道错 此时提交数据&#xff1a; redis事务将成功的正常提交&#xff0c;失败的才回滚&#xff0c;所以不具备…

Python简要复习

Python程序设计复习 Python基础知识 python的特点 兼具编译型和解释型特性&#xff0c;兼顾过程式、函数式和面向对象编程范式的通用编程语言 解释型语言无需像编译型需要一次性的编译成机器码&#xff0c;然后运行&#xff0c;而是由名叫解释器的程序动态的将源代码逐句转…

深度学习之反向传播

0 特别说明 0.1 学习视频源于&#xff1a;b站&#xff1a;刘二大人《PyTorch深度学习实践》 0.2 本章内容为自主学习总结内容&#xff0c;若有错误欢迎指正&#xff01; 1 forward&#xff08;前馈运算&#xff09;过程 通过输入相应的x和权重w&#xff08;可能涉及bais偏置…

docker push 报错:unauthorized: unauthorized to access repository: library/xx处理方法

rootmaster:/home/data/harbor# sudo docker login 49.0.241.2 admin Harbor12345 1.报错原因分析 rootmaster:/home/data/harbor# docker push 49.0.241.2/library/nginx:latest #这种报错 The push refers to repository [49.0.241.2/library/nginx] Get "https://49.…

UE5 C++ SplineMesh蓝图函数库实现(小白笔记)

UE5 C SplineMesh的蓝图函数库实现方法 UAAABlueprintFunctionLibrary UAAABlueprintFunctionLibrary.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Components/Spline…

再探python装饰器

参考视频教学&#xff1a; 可能是b站上最好的Python装饰器教程_哔哩哔哩_bilibili 【python】如何在class内部定义一个装饰器&#xff1f;这里的坑你要么不知道&#xff0c;要么不会填&#xff01;_哔哩哔哩_bilibili 推荐&#xff01;先学习第一个视频&#xff0c;再学习第…

【iOS】多线程 锁问题总结

文章目录 前言1. 你理解的多线程优点缺点 2. atomic 和 nonatomic 的区别及其作用3. GCD的队列类型 - 三种队列类型4. GCD的死锁问题线程死锁的四个必要条件 5. 多线程之间的区别和联系6. 进程和线程&#xff1f;进程间的通信方式线程间的通信方式 6. iOS的线程安全手段如何保证…

2023年电赛---运动目标控制与自动追踪系统(E题)OpenMV方案

前言 &#xff08;1&#xff09;废话少说&#xff0c;很多人可能无法访问GitHub&#xff0c;所以我直接贴出可能要用的代码。此博客还会进行更新&#xff0c;先贴教程和代码 &#xff08;2&#xff09; <1>视频教程&#xff1a; https://singtown.com/learn/49603/ <2…

k8s kubeedge安装metrics-server监控节点cpu内存使用情况

k8s kubeedge安装metrics-server监控节点cpu内存使用情况 官方安装地址: https://kubeedge.io/en/docs/advanced/metrics/ k8s的master节点上安装metrics-server #在k8s的master节点上执行#创建目录 mkdir metrics-server #下载deploy文件 wget https://github.com/kubernet…

JavaWeb 项目实现(四) 验证旧密码

1.验证旧密码 步骤很简单&#xff0c;从Session中取到当前密码&#xff0c;和修改密码界面得到的旧密码对比&#xff0c;判断是否相等。 特别之处在于实现用到了Ajax&#xff0c;可以不刷新整个页面的情况下与Web服务器进行通信。 2.Ajax Ajax&#xff08;Asynchronous Java…

正则表达式在格式校验中的应用以及包装类的重要性

文章目录 正则表达式&#xff1a;做格式校验包装类&#xff1a;在基本数据类型与引用数据类型间的桥梁总结 在现代IT技术岗位的面试中&#xff0c;掌握正则表达式的应用以及理解包装类的重要性是非常有益的。这篇博客将围绕这两个主题展开&#xff0c;帮助读者更好地面对面试挑…

无涯教程-jQuery - Menu组件函数

小部件菜单功能可与JqueryUI中的小部件一起使用。一个简单的菜单显示项目列表。 Menu - 语法 $( "#menu" ).menu(); Menu - 示例 以下是显示菜单用法的简单示例- <!doctype html> <html lang"en"><head><meta charset"utf-…

Vue2 第十节 内置指令和自定义指令

1.之前学过的指令 2. 内置指令 3. 自定义指令 一.之前学过的指令 指令名用法v-bind单项绑定解析表达式&#xff0c;可以简写为:xxxv-model双向绑定v-for遍历数组/对象/字符串v-on 绑定监听事件&#xff0c;可以简写为v-if条件渲染&#xff08;动态控制节点是否存在&#xf…

基于ANACONDA安装用于Python编程的Spyder集成开发环境的方法步骤详解

基于ANACONDA安装用于Python编程的Spyder集成开发环境的方法步骤详解 Python作为一种当下流行的编程语言&#xff0c;其编辑器有很多种&#xff0c;本文介绍基于ANACONDA的安装Spyder编辑器的方法步骤。Spyder集成开发环境&#xff0c;和其他的Python开发环境相比&#xff0c;…

C++——类与对象(中)

目录 类的6个默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载const成员函数取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时…

TCP三次握手与四次断开

TCP三次握手机制 三次握手是指建立一个TCP连接时&#xff0c;需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。 1、客户端发送建立TCP连接的请求报文&#xff0c;其…

物理分代垃圾回收器

内存结构 内存分配 堆上分配 大多数情况在eden【年轻代中的一个区域】上分配&#xff0c;偶尔会直接在old【老年代】上分配&#xff0c;细节取决于GC的实现。栈上分配&#xff08;发生了指针逃逸&#xff0c;又叫指针逃逸分析——JVM优化&#xff09; 原子类型的局部变量。 G…