粤嵌实训医疗项目--day03(Vue + SpringBoot)
往期回顾
粤嵌实训医疗项目day02(Vue + SpringBoot)-CSDN博客
粤嵌实训医疗项目--day01(Vue+SpringBoot)-CSDN博客
目录
一、SpringBoot AOP的使用
二、用户模块-注册功能(文件上传)
三、用户模块-注册实现
四、用户模块-登录-校验码
一、项目SpringBoot AOP的使用(增添日志输出等)
在vaccinum包下创建aspect包并输入以下代码
@Aspect
@Component
public class LogAspect {private final static Logger LOG = LoggerFactory.getLogger(LogAspect.class);/** 定义一个切点 */@Pointcut("execution(public * com.example.vaccinum.controller..*Controller.*(..))")public void controllerPointcut() {}@Resourceprivate SnowFlake snowFlake;@Before("controllerPointcut()")public void doBefore(JoinPoint joinPoint) throws Throwable {// 增加日志流水号MDC.put("LOG_ID", String.valueOf(snowFlake.nextId()));// 开始打印请求日志ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();Signature signature = joinPoint.getSignature();String name = signature.getName();// 打印请求信息LOG.info("------------- 开始 -------------");LOG.info("请求地址: {} {}", request.getRequestURL().toString(), request.getMethod());LOG.info("类名方法: {}.{}", signature.getDeclaringTypeName(), name);LOG.info("远程地址: {}", request.getRemoteAddr());RequestContext.setRemoteAddr(getRemoteIp(request));// 打印请求参数Object[] args = joinPoint.getArgs();// LOG.info("请求参数: {}", JSONObject.toJSONString(args));Object[] arguments = new Object[args.length];for (int i = 0; i < args.length; i++) {if (args[i] instanceof ServletRequest|| args[i] instanceof ServletResponse|| args[i] instanceof MultipartFile) {continue;}arguments[i] = args[i];}// 排除字段,敏感字段或太长的字段不显示String[] excludeProperties = {"password", "file"};PropertyPreFilters filters = new PropertyPreFilters();PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();excludefilter.addExcludes(excludeProperties);LOG.info("请求参数: {}", JSONObject.toJSONString(arguments, excludefilter));}@Around("controllerPointcut()")public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {long startTime = System.currentTimeMillis();Object result = proceedingJoinPoint.proceed();// 排除字段,敏感字段或太长的字段不显示String[] excludeProperties = {"password", "file"};PropertyPreFilters filters = new PropertyPreFilters();PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();excludefilter.addExcludes(excludeProperties);LOG.info("返回结果: {}", JSONObject.toJSONString(result, excludefilter));LOG.info("------------- 结束 耗时:{} ms -------------", System.currentTimeMillis() - startTime);return result;}/*** 使用nginx做反向代理,需要用该方法才能取到真实的远程IP* @param request* @return*/public String getRemoteIp(HttpServletRequest request) {String ip = request.getHeader("x-forwarded-for");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}}
再在vaccinum包下创建util包并引入两个类
1.用于存储和获取当前请求的远程地址类RequestContext
package com.example.vaccinum.util;import java.io.Serializable;public class RequestContext implements Serializable {private static ThreadLocal<String> remoteAddr = new ThreadLocal<>();public static String getRemoteAddr() {return remoteAddr.get();}public static void setRemoteAddr(String remoteAddr) {RequestContext.remoteAddr.set(remoteAddr);}}
2.雪花算法类SnowFlaske
package com.example.vaccinum.util;import org.springframework.stereotype.Component;import java.text.ParseException;/*** Twitter的分布式自增ID雪花算法**/
@Component
public class SnowFlake {/*** 起始的时间戳*/private final static long START_STMP = 1609459200000L; // 2021-01-01 00:00:00/*** 每一部分占用的位数*/private final static long SEQUENCE_BIT = 12; //序列号占用的位数private final static long MACHINE_BIT = 5; //机器标识占用的位数private final static long DATACENTER_BIT = 5;//数据中心占用的位数/*** 每一部分的最大值*/private final static long MAX_DATACENTER_NUM = -1L ^ (-1L << DATACENTER_BIT);private final static long MAX_MACHINE_NUM = -1L ^ (-1L << MACHINE_BIT);private final static long MAX_SEQUENCE = -1L ^ (-1L << SEQUENCE_BIT);/*** 每一部分向左的位移*/private final static long MACHINE_LEFT = SEQUENCE_BIT;private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;private final static long TIMESTMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;private long datacenterId = 1; //数据中心private long machineId = 1; //机器标识private long sequence = 0L; //序列号private long lastStmp = -1L;//上一次时间戳public SnowFlake() {}public SnowFlake(long datacenterId, long machineId) {if (datacenterId > MAX_DATACENTER_NUM || datacenterId < 0) {throw new IllegalArgumentException("datacenterId can't be greater than MAX_DATACENTER_NUM or less than 0");}if (machineId > MAX_MACHINE_NUM || machineId < 0) {throw new IllegalArgumentException("machineId can't be greater than MAX_MACHINE_NUM or less than 0");}this.datacenterId = datacenterId;this.machineId = machineId;}/*** 产生下一个ID** @return*/public synchronized long nextId() {long currStmp = getNewstmp();if (currStmp < lastStmp) {throw new RuntimeException("Clock moved backwards. Refusing to generate id");}if (currStmp == lastStmp) {//相同毫秒内,序列号自增sequence = (sequence + 1) & MAX_SEQUENCE;//同一毫秒的序列数已经达到最大if (sequence == 0L) {currStmp = getNextMill();}} else {//不同毫秒内,序列号置为0sequence = 0L;}lastStmp = currStmp;return (currStmp - START_STMP) << TIMESTMP_LEFT //时间戳部分| datacenterId << DATACENTER_LEFT //数据中心部分| machineId << MACHINE_LEFT //机器标识部分| sequence; //序列号部分}private long getNextMill() {long mill = getNewstmp();while (mill <= lastStmp) {mill = getNewstmp();}return mill;}private long getNewstmp() {return System.currentTimeMillis();}public static void main(String[] args) throws ParseException {// 时间戳// System.out.println(System.currentTimeMillis());// System.out.println(new Date().getTime());//// String dateTime = "2021-01-01 08:00:00";// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");// System.out.println(sdf.parse(dateTime).getTime());SnowFlake snowFlake = new SnowFlake(1, 1);long start = System.currentTimeMillis();for (int i = 0; i < 10; i++) {System.out.println(snowFlake.nextId());System.out.println(System.currentTimeMillis() - start);}}
}
还需要导入如下依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.70</version>
</dependency>
spring-boot-starter-aop:这是Spring Boot提供的一个AOP(面向切面编程)模块的启动器,它包含了Spring AOP和AspectJ等AOP框架的依赖,可以方便地在Spring Boot应用中使用AOP。AOP可以通过切面(Aspect)来实现横向逻辑的复用,比如日志记录、事务管理、权限控制等。
fastjson:这是阿里巴巴开源的一个JSON序列化/反序列化框架,它可以将Java对象转换成JSON字符串,也可以将JSON字符串转换成Java对象。fastjson具有快速、稳定、高效的特点,广泛应用于Java应用的数据交换、RPC调用、消息队列等场景。在Spring Boot应用中,fastjson可以作为默认的JSON序列化/反序列化工具,也可以与其他JSON库一起使用。
二、用户模块-注册功能(文件上传)
--在controller层提供FileController文件上传的接口、在本地创建存储图片的文件夹
1.创建上传图片接口
@RestController
@RequestMapping("/file")
public class FileController {@RequestMapping("/upload")public String upload(MultipartFile file) throws IOException {String uuid = UUID.randomUUID().toString();
// 1.1获取文件真实名称 123.jpgString filename = file.getOriginalFilename();
// 2.图片名称修改
// 后缀String substring = filename.substring(filename.lastIndexOf("."));
// 拼接uuid和后缀名filename = uuid +substring;// 3.如何存到本地磁盘中 文件的上传file.transferTo(new File("E:\\实训\\upload\\"+filename));return "http://localhost:8085/" + filename;}
}
通过uuid类可以使得上传到本地磁盘文件名不会出现重复
--在Login.vue提供对话框、在data中提供form变量
找到Login.vue对应注册组件
<!-- 对话框 --><el-dialog :visible.sync="dialogVisible" title="注册账号" width="30%"><el-form :model="form" label-width="120px"><el-form-item label="名称"><el-input v-model="form.name" style="width: 80%"></el-input></el-form-item><el-form-item label="手机号码"><el-input v-model="form.phone" style="width: 80%"></el-input></el-form-item><el-form-item label="密码"><el-input v-model="form.password" style="width: 80%"></el-input></el-form-item><el-form-item label="头像"><!-- action表示为上传文件的url --><el-uploadclass="avatar-uploader"action="http://localhost:8088/file/upload/":show-file-list="false":on-success="handleAvatarSuccess":before-upload="beforeAvatarUpload"><img v-if="imageUrl" :src="imageUrl" class="avatar" /><i v-else class="el-icon-plus avatar-uploader-icon"></i></el-upload></el-form-item><el-form-item label="身份证号"><el-input v-model="form.code" style="width: 80%"></el-input></el-form-item><el-form-item label="邮箱"><el-input v-model="form.email" style="width: 80%"></el-input></el-form-item><el-form-item label="性别"><el-input v-model="form.sex" style="width: 80%"></el-input></el-form-item><el-form-item label="年龄"><el-input v-model="form.age" style="width: 80%"></el-input></el-form-item></el-form><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">取消</el-button><el-button type="primary" @click="save()">确定</el-button></span></template></el-dialog>
--在methods中提供上传的处理函数
测试功能:
可以看到成功上传成功并且展示出存放到磁盘中的图片
三、用户模块-注册实现
--在用户实体中提供主键字段
在vaccinum架构下创建userInfo表单
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (`user_id` bigint(20) NOT NULL COMMENT '用户id',`code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份证',`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',`sex` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',`age` int(11) NULL DEFAULT NULL COMMENT '年龄',`job` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '职位',`status` int(11) NULL DEFAULT 0 COMMENT '用户通行码-0绿码-1黄码-2红码',PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户信息' ROW_FORMAT = DYNAMIC;-- ----------------------------
-- Records of user_info
-- ----------------------------
INSERT INTO `user_info` VALUES (2, '456379865132485', '752963252@qq.com', '男', 45, '', 2);
INSERT INTO `user_info` VALUES (3, '123465789651', '5689562@qq.com', '男', 16, NULL, 1);
INSERT INTO `user_info` VALUES (9, '阿斯顿', 'asd', '女', 12, 'asd', 0);
INSERT INTO `user_info` VALUES (10, '34', '34', '女', 3, '4', 0);
INSERT INTO `user_info` VALUES (12, 'asd', 'asd', '男', 23, 'ghf', 0);
INSERT INTO `user_info` VALUES (16, 'asd', 'asd', '男', 12, 'asd', 0);
通过插件mbatisx使用逆向,自动创建对应三层架构的代码
idea实现数据库连接
下载完对应驱动后进行配置
使用mybatisx插件
mybatisx逆向配置
创建完后对应userInfo实体类,需要进行修改
@Data
@EqualsAndHashCode(callSuper = false)
public class UserInfo implements Serializable {private static final long serialVersionUID = 1L;/*** 用户id INPUT设置为手动输入id*/@TableId(value = "user_id", type = IdType.INPUT)private Long userId;/*** username*/@TableField(exist = false)private String userName;/*** 身份证*/private String code;/*** 邮箱*/private String email;/*** 性别*/private String sex;/*** 年龄*/private Integer age;/*** 职位*/private String job;/*** 用户通行码-0绿码-1黄码-2红码*/private Integer status;@TableField(exist = false)private User user;}
在启动类中添加扫描mapper的注解
--在用户controller中提供注册接口
@Autowired
UserInfoService userInfoService; //定义一个请求接口来实现用户的注册 user、userinfo@RequestMapping("/register")public String register(User user,UserInfo userInfo) throws JsonProcessingException {
// 1.创建json解析工具ObjectMapper json = new ObjectMapper();
// 2.返回的结果集HashMap map = new HashMap<>();
// 3.调用方法添加数据boolean save = userService.save(user);
// 4.添加userInfo的数据 需要设置 user的id主键 为 userinfo id的值userInfo.setUserId(user.getId());boolean save1 = userInfoService.save(userInfo);
// 响应结果map.put("flag",save&&save1);
// 返回解析好的json数据return json.writeValueAsString(map);}
前端设置好请求
--在文件上传成功后,把服务器响应的图片url赋值到form.image
--修改页面提供save函数和异步请求操作
//注册的函数save() {//发起一个异步请求,查询分类的数据request// post 请求方式.post("/gec/user/register", this.form)// then表示请求后的回调函数.then((res) => {//判断操作是否成功if (res.ok == true) {//消息提示this.$message({message: "注册成功",type: "success",});//把form的数据清空this.form = {name: "",phone: "",password: "",image: "",code: "",email: "",sex: "",age: "",};//关闭对话框this.dialogVisible = false;} else {this.$message.error("注册失败");}});},
功能展示:
前端展示:
数据库展示:
四、用户模块-登录-校验码
在项目中的resource下创建lib包并设置为库,放入以下两个jar包
检测是否变成库
--在项目中提供验证码的controller接口【注意使用:jdk8】
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//sun.misc.BASE64Encoder jdk8提供
import sun.misc.BASE64Encoder;import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Properties;@RestController
@RequestMapping("/captcha")
public class CaptchaController {//返回验证码@RequestMapping("/getCaptcha")public void getCaptcha(HttpServletRequest request, HttpServletResponse response) throws Exception {//验证码生成器DefaultKaptcha defaultKaptcha = new DefaultKaptcha();//配置Properties properties = new Properties();//是否有边框properties.setProperty("kaptcha.border", "yes");//设置边框颜色properties.setProperty("kaptcha.border.color", "105,179,90");//边框粗细度,默认为1// properties.setProperty("kaptcha.border.thickness","1");//验证码properties.setProperty("kaptcha.session.key", "code");//验证码文本字符颜色 默认为黑色properties.setProperty("kaptcha.textproducer.font.color", "blue");//设置字体样式properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅 黑");//字体大小,默认40properties.setProperty("kaptcha.textproducer.font.size", "30");//验证码文本字符内容范围 默认为abced2345678gfynmnpwx// properties.setProperty("kaptcha.textproducer.char.string", "");//字符长度,默认为5properties.setProperty("kaptcha.textproducer.char.length", "4");//字符间距 默认为2properties.setProperty("kaptcha.textproducer.char.space", "4");//验证码图片宽度 默认为200properties.setProperty("kaptcha.image.width", "100");//验证码图片高度 默认为40properties.setProperty("kaptcha.image.height", "40");Config config = new Config(properties); //当前对象包引用路径 为 googledefaultKaptcha.setConfig(config);//定义response输出类型为image/jpegresponse.setDateHeader("Expires", 0);response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");response.addHeader("Cache-Control", "post-check=0, pre-check=0");response.setHeader("Pragma", "no-cache");response.setContentType("image/jpeg");//---------------------------生成验证码----------------------//获取验证码文本内容String text = defaultKaptcha.createText();System.out.println("验证码: " + text);//captcha作为key,将验证码放到session中request.getSession().setAttribute("captcha", text);//根据文本内容创建图形验证码BufferedImage image = defaultKaptcha.createImage(text);//创建IO流ByteArrayOutputStream baos = new ByteArrayOutputStream();try {//输出流输出图片,格式为jpgImageIO.write(image, "jpg", baos);} catch (IOException e) {e.printStackTrace();}byte[] bytes = baos.toByteArray();//把流转换成字节数组BASE64Encoder encoder = new BASE64Encoder();String imgStr = encoder.encodeBuffer(bytes).trim();System.out.println(imgStr);HashMap<String, Object> map = new HashMap<>();map.put("code", 200);map.put("imgStr", imgStr);ObjectMapper objectMapper = new ObjectMapper();String json = objectMapper.writeValueAsString(map);response.getWriter().println(json);}}
--在用户controller中修改登录请求
//定义一个请求接口来实现用户登录
@RequestMapping("login")
public String login(String phone, String password, String code, HttpSession session) throws JsonProcessingException {//定义json解析工具ObjectMapper objectMapper = new ObjectMapper();//key-value集合结果HashMap result = new HashMap();//获取正确的验证码String captcha = (String) session.getAttribute("captcha");// 进行验证码判断if(!code.equals(captcha)){//保存到map中result.put("ok", false);result.put("message", "验证码错误");//返回解析的json数据return objectMapper.writeValueAsString(result);}//调用业务层的方法进行登录查询 【手机号码、密码】QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();userQueryWrapper.eq("phone", phone);userQueryWrapper.eq("password", password);//根据条件进行查询User user = userService.getOne(userQueryWrapper);//判断if (user != null) {//登录成功//保存到map中result.put("ok", true);result.put("user", user);} else {result.put("ok", false);result.put("message", "用户名或密码错误");}//返回解析的json数据return objectMapper.writeValueAsString(result);
}
--在script中提供生命周期、及获取验证码的函数
created() {this.getCode();//this.getCookie();},
getCode() {request.get("/captcha/getCaptcha").then((res) => {console.log("res:", res);if (res.code == "200") {this.codeUrl = "data:image/jpg;base64," + res.imgStr;}});},
效果展示 :
验证码判断
正确验证码与正确账号密码下正常登陆。
相关文章:

粤嵌实训医疗项目--day03(Vue + SpringBoot)
往期回顾 粤嵌实训医疗项目day02(Vue SpringBoot)-CSDN博客 粤嵌实训医疗项目--day01(VueSpringBoot)-CSDN博客 目录 一、SpringBoot AOP的使用 二、用户模块-注册功能(文件上传) 三、用户模块-注册实现…...

spark3.3.x处理excel数据
环境: spark3.3.x scala2.12.x 引用: spark-shell --jars spark-excel_2.12-3.3.1_0.18.5.jar 或项目里配置pom.xml <!-- https://mvnrepository.com/artifact/com.crealytics/spark-excel --> <dependency><groupId>com.crealytics</groupId><art…...

哪一个更好?Spring boot还是Node.js
前言 本篇文章有些与众不同,由于我自己手头有些关于这个主题的个人经验,受其启发写出此文。虽然SpringBoot和Node.js服务于很不一样的场景,但是这两个框架共性惊人。其实每种语言都有不计其数的框架,但仅仅一部分是真正卓越的。如…...

AD7321代码SPI接口模数转换连接DAC0832输出verilog
名称:AD7321代码12位ADC,SPI接口模数转换连接DAC0832输出 软件:QuartusII 语言:VHDL 代码功能: 使用VHDL语言编写代码,实现AD7321的控制,将模拟信号转换为数字信号,再经过处理后…...

JavaScript_Pig Game切换当前玩家
const current0El document.getElementById(current--0); const current1El document.getElementById(current--1); if (dice ! 1) {currentScore dice;current0El.textContent currentScore;} else {} });这是我们上个文章写的代码,这个代码明显是有问题的&…...

EtherNet Ip工业RFID读写器与欧姆龙PLC 配置示例说明
一、准备阶段 POE交换机欧姆龙PLC 支持EtherNet Ip协议CX-Programmer 9.5配置软件 二、配置读卡器 1、打开软件 2、选择网卡,如果多网卡的电脑请注意对应所接的网卡,网卡名一般为“Network adapter Realtek PCIe GBE Family” 3、点击“选择网卡”&…...

UE5简化打包大小
UE5.3默认空项目带初学者包的打包后1G多 简化思路: 1.不打包初学者包(或者创建时不包括初学者包,跳过第一条) 导航:ProjectSettings->Project->Packaging->Packaging->Advanced->List of maps to incl…...

ThinkPHP8学习笔记
ThinkPHP8官方文档地址:ThinkPHP官方手册 一、composer换源 1、查看 composer 配置的命令composer config -g -l 2、禁用默认源镜像命令composer config -g secure-http false 3、修改为阿里云镜像源composer config -g repo.packagist composer https://mirror…...

NSSCTF做题第9页(2)
[SWPUCTF 2022 新生赛]ez_1zpop <?php error_reporting(0); class dxg { function fmm() { return "nonono"; } } class lt { public $impohi; public $md51weclome; public $md52to NSS; function __construct() { $this-&…...

Rust笔记【1】
元组和解构语法 let tup : (i32, f64, u8) (666, 2.0, 1);let tup (666, 2.0, 1); let (x, y, z) tup;let x tup.0; let y tup.1; let z tup.2;数组类型 数组定义是方括号:[ ] 元组定义是小圆括号:( ) 结构体定义是大括号:{ }…...

代码随想录训练营day3:链表part1
理论 链表的增删操作时间复杂度O(1),查询时间复杂度O(n),因为要从头结点开始。使用场景和数据完全相反 链表的储存地址是不连续的。也和数组不同。 移除链表元素 利用虚拟头结点可以同意操作。不然删除头结点需要额外写。 记得返回的是虚拟头结点的next而不是虚拟头结点retu…...

Bootstrap的咖啡网站实例代码阅读笔记
目录 01-index.html的完整代码02-图片可以通过类 rounded-circle 设置为圆形显示03-<li class"nav-item mt-1 a">中,类mt-1是什么意思?类a又是什么意思?04-href"javascript:void(0);"是什么意思?05-类f…...

2021年06月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下列代码后,运行结果是? seq[hello,good,morning] s*.join(seq) print(s)A: hello*good*m…...

FileWriter文件字符输出流
一.概念 以内存为基准,把内存中的数据以字符形式写出到文件中 二.构造器 public FileWriter(Filefile) 创建字节输出流管道与源文件对象接通 public FileWriter(String filepath) 创建字节输出流管道与源文件路径接通 public Filewriter(File file,boolean append) …...

Vue的八个基础命令及作用
1.v-text 作用:获取data数据, 设置标签的内容,以纯文本进行显示v-text 会覆盖 标签中的内容,如果想要拼接数据,可以直接在v-text中拼接如果拼接的是数字:直接使用 “”如果拼接的是字符串,需要使用与外部不同的引号进…...

Log日志详解分析
目录 1、log日志的用途2、log日志级别3、什么时候需要输出日志1. 系统启动参数、环境变量2. 异常捕获处3. 函数获得期望之外的结果时4. 关键操作 4、日志输出的内容5、 注意事项1. 日志信息不明确2. 特殊异常处理3. 日志输出顺序4. 临时调试日志 6、xml文件配置7、linux下查看日…...

【API篇】九、Flink的水位线
文章目录 1、Flink时间语义2、事件时间和窗口3、水位线4、水位线和窗口的工作原理 1、Flink时间语义 事件时间处理时间 举个例子就是,一条数据在23:59:59产生,在00:00:01被处理,前者为事件时间,后者为处理时间。 从Flink1.12版本…...

#经典论文 异质山坡的物理模型 2 有效导水率
Binley, A., Beven, K., & Elgy, J. (1989). A physically based model of heterogeneous hillslopes: 2. Effective hydraulic conductivities. Water Resources Research, 25(6), 1227–1233. https://doi.org/10.1029/WR025i006p01227 这篇论文指出, 每个输…...

Java面试题-Redis-第一天(Redis简单介绍)
目录 一、Redis是什么?优缺点? 二、Redis为什么这么快? 三、Redis相较于Memcached有哪些优势? 四、为什么使用Redis做缓存? 五、为什么要用Redis而不用map/guava做缓存? 六、Redis的常用场景有哪些&am…...

Java 生成和读取JSON文件
下面的demo当中 ,是将json文件放到了zip包当中。如果不需要,可以拿掉。 1、生成对象JSON文件 public static void crateJson() {try {String orcPath "D:\\doc\\ts_service_orchestration.json";// 对象集合或者对象都可以List<DataPO>…...

k8s-----26、细粒度权限管理 RBAC
0、导读 每一个用户对API资源进行操作都需要通经过以下三个步骤: 第一步:对客户端访问进行认证操作,确认是否具有访问k8s权限(也就是通过serviceaccount) token(共享秘钥) SSL(双向SSL认证) …通过任何一个认证即表示认证通过,进入下一步第二步:授权检查,确认是否对资源…...

【Unity ShaderGraph】| 制作一个 高级流体水球效果
前言 【Unity ShaderGraph】| 快速制作一个 流体水球效果一、效果展示二、简易流体水球效果三、进阶流体水球效果四、应用实例 前言 本文将使用ShaderGraph制作一个 高级流体水球 ,可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章…...

日常软件游戏丢失msvcp120dll怎么修复?分享5个修复方法
在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“msvcp120dll丢失”。那么,究竟什么是msvcp120dll文件?当它丢失时,我们会遇到哪些问题呢?本文将从以下几个方面进行详细阐述。 msvcp120dll是…...

自动驾驶之—2D到3D升维
前言: 最近在学习自动驾驶方向的东西,简单整理一些学习笔记,学习过程中发现宝藏up 手写AI 3D卷积 3D卷积的作用:对于2DCNN,我们知道可以很好的处理单张图片中的信息,但是其对于视频这种由多帧图像组成的图…...

ubuntu18.4(后改为20.4)部署chatglm2并进行基于 P-Tuning v2 的微调
下载驱动 NVIDIA显卡驱动官方下载地址 下载好对应驱动并放在某个目录下, 在Linux系统中安装NVIDIA显卡驱动前,建议先卸载Linux系统自带的显卡驱动nouveau。 禁用nouveau 首先,编辑黑名单配置。 vim /etc/modprobe.d/blacklist.conf 在文件的最后添加…...

爬虫-获取数据xpath
安装lxml pip3 install lxml基本用法 import reauests from lxml import etree url = xxx res = reuests.get(url).text html = etree.HTML(res) # 获取所有div标签 xpath = //div print(html.xpath(xpath)) #获取id=xx的div标签下的class=yy的span标签 xpath = //div[@id=&quo…...

SpringBoot中使用JdbcTemplate访问Oracle数据库
Oracle相信大家都不陌生吧,一个大型的数据库,至于数据库,我相信各位都比较熟悉了,一个软件系统,不论是我们常做的App、小程序、还是传统的web站点,我们都有用户的信息,相关业务的数据࿰…...

【Linux】权限完结
个人主页点击直达:小白不是程序媛 系列专栏:Linux被操作记 目录 前言 chown指令 chgrp指令 文件类型 file指令 目录的权限 粘滞位 umask指令 权限总结 前言 上篇文章我们说到对于一个文件所属者和所属组都是同一个人时,使用所属者身…...

计算机网络-应用层(3)
一、FTP 文件传输协议 (File Transfer Protocol,FTP) 简称为“文传协 议”,用于在Internet上控制文件的双向传输。 FTP 客户上传文 件时,通过服务器20号端口建立的连接是建立在TCP 之上的数 据连接,通过服务器21号端口建立的连接是建立在TCP 之上的控制连…...

虎去兔来(C++)
系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…...