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> {}
相关文章:
Java开发中的------修改密码+忘记密码
目录 1.修改密码 客户端响应 前端vue 后端 controller层 ServiceImpl实现层 2.忘记密码 客户端响应 后端 controller层 serviceImpl实现层 本章需要准备:springcloud项目,依赖,数据库.... 数据库SQL SET FOREIGN_KEY_CHECKS0;-- -…...
ffmpeg安装
简介 FFmpeg是一个开源的音视频处理库,它提供了一系列的工具和API,可以用于处理音视频文件。你可以使用FFmpeg的命令行工具来执行各种音视频处理操作,比如转码、剪辑、合并等。FFmpeg的命令格式通常是:ffmpeg [全局选项] {[输入文…...
Mac电脑目录
System(系统)Applications(应用程序)应用程序目录,默认所有的GUI应用程序都安装在这里User(用户)存放用户的个人资料和配置。每个用户有自己的单独目录Library(资料库)系…...
一起学算法(栈篇)
1.栈的概念 1.栈的定义 栈是仅限在表尾进行插入和删除的线性表,栈又被称为先进后出的线性表,简称“LIFO” 我们这次用数组作为我们栈的底层数据结构,代码会放到结尾供大家参考使用 2.栈顶的定义 栈是一个线性表,我们允许插入…...
Ubuntu开机自启服务systemd.service配置教程(Ubuntu服务)(Linux服务)upstart
文章目录 为什么要将程序配置成服务?1. 自动启动2. 后台运行3. 定时重启4. 简化管理5. 整合系统 版本支持1. Ubuntu 14.04及更早版本:使用upstart作为默认的init系统/etc/rc.local旧版本新版本 2. Ubuntu 15.04到16.04版本:默认使用systemd作…...
大数据课程E4——Flume的Channel
文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Channel的作用和配置; ⚪ 掌握Channel的使用方法; ⚪ 掌握Channel的File Channel; ⚪ 掌握Channel的JDBC Channel; ⚪ 掌握Channel的Spillable Memory Channel; 一、Memory Ch…...
es6中的Map和Set数据结构
Map Map对象可以用于保存键值对 1.创建 一个Map对象 const map new Map() 2.Map的一些方法 set(key,value):通过键值对向Map对象中添加元素get(key):通过建拿到对应的值size:返回Map对象中所包含的键值对的个数has(key):判断Map对象中是否有对应的key,返回一个…...
MyBatis 框架基本的增删改查
提示:写代码要严谨 文章目录 前言前期准备MyBatis CRUD操作流程增加功能删除功能修改功能查询功能#{} 占位符${} 占位符两种占位符的区别❗ 映射文件总结❗ mapper 代理方式实现CRUDmapper代理开发规范增加功能删除功能修改功能查询功能 前言 提示:myba…...
Javascript--JSON
什么是 JSON? JavaScript中的JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,用于存储和表示结构化的数据。JSON使用键值对的方式组织数据,并支持基本数据类型(字符串、数字、布尔值、数组和对象&…...
Rust: error: failed to run custom build command for `openssl-sys v0.9.71`
error: failed to run custom build command for openssl-sys v0.9.71 解决 windows : openssl 不要选Light版 设置环境变量 cmd: set OPENSSL_DIR“C:\Program Files\OpenSSL-Win64” OPENSSL_DIR:C:\Program Files\OpenSSL-Win64 linux:…...
Excel修改日期格式,改变日期的筛选方式
我们有两列日期数据: 左边这一列筛选会显示: 右边这一列筛选会显示: 修改格式,将【日期1】改为【日期2】 将【日期1】的格式修改为文本格式即可 修改格式,将【日期2】改为【日期1】 选中日期2,点击【数据…...
【RabbitMQ(day2)】默认(直连)交换机的应用
文章目录 一、第一种模型(Hello World)二、第二种模型(work queue)自动确认机制的后果和公平分配 三、阐述默认交换机 这篇博客是以下资料学后的总结: 不良人的RabbitMQ的教学视频 官方启动教程 RabbitMQ中文文档 一、…...
谷粒商城第八天-商品服务之品牌管理的整体实现(直接使用逆向生成的代码;含oss文件上传)
目录 一、总述 二、前端部分 2.1 创建好品牌管理菜单 2.2 复制组件 编辑2.3 复制api 编辑 2.4 查看效果 编辑2.5 需要优化的地方 2.6 具体优化实现 2.6.1 优化一:将表格的状态列(这里是是否显示列)修改为开关ÿ…...
阿里云率先荣获容器集群稳定性先进级认证
7 月 25 日,由中国信通院发起的“2023 稳保体系”评估结果在可信云大会现场公布,阿里云容器服务 ACK 成为首批通过“云服务稳定运行能力-容器集群稳定性”评估的产品,并荣获“先进级”认证。 云原生技术正在激活应用构建新范式,构…...
【SpringBoot笔记37】SpringBoot基于@ServerEndpoint、@OnMessage等注解的方式集成WebSocket
这篇文章,主要介绍SpringBoot基于@ServerEndpoint、@OnMessage等注解的方式集成WebSocket。 目录 一、基于注解集成WebSocket 1.1、WebSocket常见注解 1.2、创建WebSocket服务端 1.3、配置ServerEndpointExpor...
PyTorch(安装及卸载)
目录 1. 安装 2. 卸载 参考文献 为什么用PyTorch:简单来说,19年之前tensorflow是大哥,19年tensorflow和PyTorch双龙并行,20年之后PyTorch一往无前。宗旨,哪个用的人多用哪个。 1. 安装 1. 先打开Anaconda Prompt&…...
webScoket
webScoket是什么? 支持端对端通讯可以由客户端发起,也可以有服务端发起用于消息通知、直播间讨论区、聊天室、协同编辑等 做一个简单的webScoket 客户端配置: 1、新建一个页面叫web-scoket.html <!DOCTYPE html> <html lang"…...
【C语言初阶(20)】调试练习题
文章目录 前言实例1实例2 前言 在我们开始调试之前,应该有个明确的思路;程序是如何完成工作的、变量到达某个步骤时的值应该是什么、出现的问题大概会在什么位置。这些东西在调试之前都需要先确认下来,不然自己都不知道自己在调试个什么东西…...
MicroPython ESP32网页实时更新DHT11数据显示
MicroPython ESP32网页实时更新DHT11数据显示 📌相关篇《MicroPython ESP32 读取DHT11温湿度传感器数据》📍《【Micropython esp32/8266】网页点灯控制示例》 ✨本例综合以上两篇文章内容实现:在本地网页中显示DHT11温度传感器数据。可以做到…...
JavaWeb之HTML基础篇(一)
系列文章目录 HTML基础篇(一) 文章目录 系列文章目录HTML基础篇(一)[TOC](文章目录) 前言一、HTML简介1.1介绍1.2HTML文件的书写规范1.3 HTML标签介绍1.4 HTML常见的标签 二、CSS的简介2.1css技术介绍2.2 CSS与HTML结合的三种方式…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

