心动奶油 - 学习笔记
type: channel
link: https://atanycosts.cn/category/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
items: Truffle数据上链的文件上传系统
items: 基于SpringBoot的FilePD文件系统
items: 实习宝典
items: 记一次Jwt生成 token
items: 算法刷题
items: 膳食小搭项目-后端
items: SpringBoot+SSm+MybatisPlus实现小程序后台
items: SpringMvc学习
items: Spring学习
items: 重新学习Mybatis

Truffle数据上链的文件上传系统
type: item
date: 2023-12-04T09:34:00+08:00
description: 数据上链的文件上传系统WeBase上链的数据user_Name Stringfile_Name Stringfile_Size Floatfile_Type Stringfile_Hash Stringcreate_Time Dateupdate_Time Date表user表IDuser_Name Stringuser_Account Stringuser_Password Stringuser_Role integer三字段create table user ( ID int auto_increment comment 'ID' primary key, user_Name char(15) not null comment '名称', user_Account char(10) not null comment '账号', user_Password char(20) default '123456' null comment '密码', user_Role tinyint(1) default 1 not null comment '角色' );file表ID Stringuser_Id Stringfile_Name Stringfile_Size Floatfile_Type Stringfile_Hash String三字段create table file ( ID int auto_increment comment 'ID' primary key, user_ID int null comment 'user_ID', file_Name char(20) not null comment '文件名称', file_Size float not null comment '文件大小', file_Type char(10) default '未知' null invisible comment '文件类型', file_Hash char not null comment 'Hash', create_Time datetime not null comment '创建时间', update_Time datetime not null comment '更新时间', is_Delete tinyint(1) default 1 null comment '是否删除', constraint file_user_ID_fk foreign key (user_ID) references user (ID) );链表看返回什么,到时候说

基于SpringBoot的FilePD文件系统
type: item
date: 2023-10-27T09:38:00+08:00
description: 一个随时随地通过FTP上传文件系统基于SpringBoot的FilePD文件系统pom文件<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.8</version> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>demo</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> <!-- <dependency>--> <!-- <groupId>com.baomidou</groupId>--> <!-- <artifactId>mybatis-plus-generator</artifactId>--> <!-- <version>3.1.0</version>--> <!-- </dependency>--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <vers…

实习宝典
type: item
date: 2023-05-22T18:28:00+08:00
description: 我的面试宝典AIJava框架篇打乱顺序解析 : B D当发现有多种类型的Bean时，@Primary注解会通知IoC容器优先使用它所标注的Bean进行注入；@Quelifier注解可以与@AutoWired注解组合使用，达到通过类型和名称一起筛选Bean的效果。解析 : CSpring MVC 拦截器包含三个方法：preHandle()、postHandle()、afterCompletion()。​ preHandle() 方法：该方方法在控制器方法前执行，其返回值表示是否中断后续操作。当其返回值为true时，表示继续向下执行；当其返回值为false时，会中断后续的所有操作（包括调用下一个拦截器和控制器类中的方法执行等）。 ​ postHandle()方法：该方法在控制器方法调用之后，且解析视图之前执行。可以通过此方法对请求域中的模型和视图做出进一步的修改。 ​ afterCompletion()方法：该方法在整个请求完成，即视图渲染结束之后执行。可以通过此方法实现一些资源清理、记录日志信息等工作。解析 : Cmethod属性代表指定请求的method的类型，value属性指请求的实际地址，params是指定request中一定要有的参数值。required是@RequestParam注解的属性，是指该参数是否为必传项，默认为true，表示请求中一定要传入对应的参数。解析 : C解析 : A拦截器需实现 HandlerInterceptor 接口，而 WebMvcConfigurer 接口是 MVC 配置类要实现的接口解析 : C 目标方法允许结束后，若发生异常，会先执行异常通知，再执行后置通知。返回通知仅在无异常时执行@Before:Before 通知，用于方法执行前增强 @AfterReturning ：After Returning 通知，方法正常执行返回后增强 @AfterThrowing：After Throwing 通知，方法执行通过抛出异常退出时 @After：After (Finally) 通知，方法执行退出时执行增强，不管是正常返回，还是抛出异常退出，相当于try{}catch{}finally{}中的finally的语句。 @Around：Around 通知，最强大的通知，环绕在目标方法前后执行。它有机会在方法运行之前和之后进行工作，并确定该方法何时、如何以及是否真正开始运行@EnableAutoConfiguration注解解析 : A B C D@EnableAutoConfiguration由@SpringBootApplication引入，它的主要功能是启动Spring应用程序上下文时进行自动配置，它会尝试猜测并配置项目可能需要的Bean。@Import是@EnableAutoConfiguration注解的组成部分，也是自动配置功能的核心实现者。@SpringBootApplication @SpringBootConfiguration @EnableAutoConfiguration @AutoConfigurationPackage @Import(AutoConfigurationPackages.Registrar.class) @Import(AutoConfigurationImportSelector.class) @ComponentScanSpringBoot的核心注解 : @SpringBootApplication注解包含三个注解@SpringBootConfiguration​@EnableAutoConfiguration​ 实现自动配置的关键 , 此注解又包含两个关键注解@AutoConfigurationPackage将主启动类所在包以及子包里面的所有组件扫描并加载到spring的容器中，所以我们开发过程中Controller层、Service层、Dao层的代码总是和主启动类在同一级目录或者次级目录之下。@Import(AutoConfigurationImportSelector.class)来作自动配置至于哪些才是需要自动配置的类呢，AutoConfigurationImportSelector类里面有一个方法selectImports()，该方法通过层层调用，最终会调用一个方法loadSpringFactories()，此方加载所有的spring.factories文件，而spring.factories文件中的数据以（key-value）的形式存储，key就是EnableAutoConfiguration，value自然就是那些需要自动配置的类的全类名了，解析这个文件然后返回需要做自动配置的类的全类名@ComponentScanSpring常用容器解析 :…

记一次Jwt生成 token
type: item
date: 2023-05-04T20:55:01+08:00
description: 记一次Jwt生成 tokenThe signing key’s algorithm ‘AES’ does not equal a valid HmacSHA* algorithm name and cannot be used with HS256.The signing key’s size is 16 bits which is not secure enough for the HS256 algorithm. The JWT JWA Specification (RFC 7518, Section 3.2) states that keys used with HS256 MUST have a size >= 256 bits (the key size must be greater than or equal to the hash output size). Consider using the io.jsonwebtoken.security.Keys class’s ‘secretKeyFor(SignatureAlgorithm.HS256)’ method to create a key guaranteed to be secure enough for HS256. See https://tools.ietf.org/html/rfc7518#section-3.2 for more information.Unable to find an implementation for interface io.jsonwebtoken.io.Serializer using java.util.ServiceLoader. Ensure you include a backing implementation .jar in the classpath, for example jjwt-impl.jar, or your own .jar for custom implementations.三个错误 , jjwt的版本(0.9.0升级到0.11.2)问题一 AES 改为 HmacSHA256// jjwt 0.9.0版本 private static SecretKey generateKey(String secret) { byte[] encodedKey = Base64.decodeBase64(secret); return new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES"); } // jjwt 0.11.2版本 private static SecretKey generateKey(String secret) { byte[] encodedKey = Base64.decodeBase64(secret); return new SecretKeySpec(encodedKey, 0, encodedKey.length, "HmacSHA256"); }问题二密钥位数不够，必须大于256位，一个字符按照8位算，至少32个字符。// jjwt 0.9版本 String compactJws = Jwts.builder() .setClaims(claims) .signWith(SignatureAlgorithm.HS256, generateKey("jinan_20220511")) .compact(); // jjwt 0.11.2版本 String compactJws = Jwts.builder() .setClaims(claims) .signWith(generateKey("AtanycostscodecodecodecodeAllbushpullcommit"), SignatureAlgorithm.HS256) .serializeToJsonWith(new GsonSerializer<>(new Gson())) .compact();问题三没找到序列化的实现，添加序列化相关依赖和代码。<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-gson</artifactId> <version>0.11.2</version> </dependency>String compactJws = Jwts.builder() .setClaims(claims) .signWith(generateKey("AtanycostscodecodecodecodeAllbushpullcommit"), Si…

算法刷题
type: item
date: 2023-03-19T09:48:00+08:00
description: 第一周刷题部分题用 Java , 后面会转 C/C++ , 先把基础题拿全详解在博客更基础的就不放了一 . 写出这个数import java.util.Scanner; public class Main { public static void main(String[] args) { String[] pinyin = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"}; Scanner input = new Scanner(System.in); String n = input.nextLine(); int sum = 0; for (int i = 0; i < n.length(); i++) { sum += n.charAt(i) - '0'; } String s = Integer.toString(sum); for (int i = 0; i < s.length(); i++) { if (i != s.length()-1) { System.out.print(pinyin[s.charAt(i)-'0'] + " "); } else { System.out.println(pinyin[s.charAt(i)-'0']); } } } }​ ​ 这道题的意思就是所说 , 将输入的数进行相加 , 最后得出的数 因为是字符串用 charAt() 得到的是对应的ASCII 所需 '0', 在通过遍历pinyin这个数组得到对应下标的值二 . 数组循环右移问题#include<stdio.h> #include<stdlib.h> int main(){ int N,M,i,temp; scanf("%d %d",&N,&M); int arr[N]; M = M % N; for(i=0;i<N;i++){ scanf("%d",&arr[i]); } for(i=N-M;i<N;i++){ printf("%d ",arr[i]); } for(i=0;i<N-M;i++){ if(i == (N-M)-1){ printf("%d\n",arr[i]); }else{ printf("%d ",arr[i]); } } }​ 数组存放数据 , 只是输出出来 , 所以直接输出N-M(N为长度 ,M为移动次数)之后的数, 再输出之前的数就行三 . 成绩排名#include<stdio.h> #include<stdlib.h> struct Student{ char name[20]; char id[20]; int score; }; int main(){ int n,i; scanf("%d",&n); struct Student s[n]; for(i=0;i<n;i++){ scanf("%s %s %d",&s[i].name,&s[i].id,&s[i].score); } int min=0,max=0; for(i=0;i<n;i++){ if(s[i].score >s[max].score){ max = i; } if(s[i].score <s[min].score){ min = i; } } printf("%s %s\n",&s[max].name,&s[max].id); printf("%s %s\n",&s[min].name,&s[min].id); }​ 先定义一个结构体来存放数据 , 通过循环写入每个结构体的数据 , 再通过去比较 score 来找出最大的和最小的 , 分别输出对应的 name 和 ID四 . 试试手气(2022)import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n, m = 0; int[] a = new int[6]; for (int i = 0; i < 6; i++) { a[i] = scanner.nextInt(); } n = scanner.nextInt(); for (int i = 0; i < 6; i++) { int temp = 0; for (int j = 6; j > 6 - n; j--) { if (a[i] == j) { temp++; } m = j - temp; } if (i != 5) { System.out.print(m + " "); } else { System.o…

膳食小搭项目-后端
type: item
date: 2023-02-15T18:59:00+08:00
description: 膳食小搭项目-后端主要技术栈SpringBoot+SSM+MybatisX+Lombox插件接口文档采用ApiFox生成的文档 , 文档地址: 膳食小搭暂定的功能基本的注册登录饮食的搭配一个简易的聊天(看情况)帖子功能(看情况)接口数量预计20+打底 第一次一个人做后端 , 从需求分析 --> 数据库表的设计 --> 业务逻辑 --> Api文档的编写不定时更新1 . 接口设计​ 基本的登录 , 也可以用于注册注册退出用户用户信息查询修改用户信息查询指定ID食物食物查询新增食物​ 选择分类后,根据提交的分类ID来调用不同的子表修改食物数据删除食物(逻辑删除)平衡控制方案(预置)增加方案删除方案修改方案查询方案个性化方案增加个性化删除个性化修改个性化查询个性化用户分析前后端实现都行增加分析更新分析(用户修改信息后自动更新 , 或者不满意申请重新分析等)查询分析2 . 数据库表的设计用户表食物表​ 食物表中 , 包含水果/蔬菜/肉类吗? , 数据多会不会影响速度​ 包含的话就0/1/2​ 不包含的话会多出好多接口如何进行联调 , 需要在实体类中

SpringBoot+SSm+MybatisPlus实现小程序后台
type: item
date: 2022-12-10T15:40:00+08:00
description: 大致实现 , 完善功能中 , 年前总结

SpringMvc学习
type: item
date: 2022-12-03T20:00:02+08:00
description: SpringMvc学习一、SpringMVC简介1 . 入门案例报错的解决办法关于编码问题如果出现了就加,没出现不管<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties>关于启动Tomcat后自动关闭在 pom.xml 开头加上<packaging>war</packaging>遇到其他情况百度1.1 实现步骤1 创建web工程（Maven结构） 2 设置tomcat服务器，加载web工程(tomcat插件） 3 导入坐标（SpringMVC+Servlet） 4 定义处理请求的功能类（UserController） 5 编写SpringMVC配置类，加载处理请求的Bean。 6 加载SpringMVC配置，并设置SpringMVC请求拦截的路径1.2 代码实现1.2.1 . 创建web工程（Maven结构）1.2.2 . 设置tomcat服务器，加载web工程(tomcat插件）<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> 1.8 <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.2</version> <configuration> <port>8080</port> <path>/</path> <uriEncoding>UTF-8</uriEncoding> </configuration> </plugin> </plugins> </build>然后在配置中挂上//命令 tomcat7:run //工作目录 F:/Coding/java/atanycosts/学习/SSMLearn/SpringMvc1.2.3 . 导入坐标（SpringMVC+Servlet）<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.10.RELEASE</version> </dependency> </dependencies>1.2.4 . 定义处理请求的功能类（UserController）package com.controller; //定义表现层控制器bean @Controller public class UserController { //设置映射路径为/save，即外部访问路径 @RequestMapping("/save") //设置当前操作返回结果为指定json数据（本质上是一个字符串信息） @ResponseBody public String save(){ System.out.println("user save ..."); return "{'info':'springmvc'}"; } }注意事项：对于SpringMVC而言，Controller方法返回值默认表示要跳转的页面，没有对应的页面就会报错。如果不想跳转页面而是响应数据，那么就需要在方法上使用@ResponseBody注解。1.2.5 . 编写SpringMVC配置类，加载处理请求的Bean。//springmvc配置类，本质上还是一个spring配置类 @Configuration @ComponentScan("com.controller") public class SpringMvcConfig { }1.2.6 . 加载SpringMVC配置，并设置SpringMVC请求拦截的路径//web容器配置类 public class ServletContainersInitConfig exten…

Spring学习
type: item
date: 2022-12-01T15:17:00+08:00
description: Spring学习一 . 核心概念IOC（Inversion of Control）控制反转使用对象时，由主动new产生对象转换为由 外部 提供对象，此过程中对象创建控制权由程序转移到外部，此思想称为控制反转。通俗的讲就是 “将new对象的权利交给Spring，我们从Spring中获取对象使用即可”Spring技术对IOC思想进行了实现Spring提供了一个容器，称为IOC容器，用来充当IOC思想中的 外部IOC容器负责对象的创建、初始化等一系列工作，被创建或被管理的对象在IOC容器中统称为BeanDI（Dependency Injection）依赖注入在容器中建立bean与bean之间的依赖关系的整个过程，称为依赖注入。目标：充分解耦使用IoC容器管理bean（IOC)在IoC容器内将有依赖关系的bean进行关系绑定（DI）最终效果使用对象时不仅可以直接从IOC容器中获取，并且获取到的bean已经绑定了所有的依赖关系二 . 初步实现将被管理的对象交给IOC容器 , 然后在容器中建立bean与bean之间的依赖关系(DI)1 . 创建接口和实现类UserDao 的接口和实现类public interface UserDaoApi { public void save(); } public class UserDao implements UserDaoApi { public void save(){ System.out.println("dao save"); } } USerService 的接口和实现类public interface UserServiceApi { public void save(); } public class UserService implements UserServiceApi { private UserDao dao; public void save(){ System.out.println("service save"); dao.save(); } public void setDao(UserDao dao) { this.dao = dao; } } 2 . 创建配置文件applicationContext.xml , 在 resources 文件夹下<bean id="userService" class="com.service.UserService"> <property name="dao" ref="userDao"></property> </bean> <bean id="userDao" class="com.dao.UserDao"></bean>三 . Bean基础1 . 别名配置name来配置别名可以用 " 空格 , ; "来分隔<bean id="userDao" name="test 111,a;b" class="com.dao.UserDao"></bean>2 . 作用范围因为 bean 的默认为单例UserService Service1= (UserService)ctx.getBean("userService"); UserService Service2= (UserService)ctx.getBean("userService"); System.out.println(service1); System.out.println(service2); //如此打印出来的 service1 service2 这两个对象的地址是一样的当给 bean 添加 scope 属性后 <bean id="userDao" class="com.dao.UserDao" scope="prototype"></bean>scope 还有request、session、application、 websocket ，表示创建出的对象放置在web容器(tomcat)对应的位置。比如：request表示保存到request域中。四、Bean的实例化1 . Bean是如何创建的bean本质上就是对象，创建bean使用构造方法完成2 . 实例化Bean的三种方式2.1 . 构造方法方式 (重要)在创建 bean 时,调用的是对应类的无参构造方法 , 当被有参构造方法重写后会抛出异常 BeanCreationException2.2 . 使用静态工厂造bean处理早期遗留问题 , 知道就好2.3 . 实例工厂方式处理早期遗留问题 , 知道就好五 . Bean生命周期控制1 . 自定义提供生命周期控制方法 , 在 Dao 层设置 //表示bean初始化对应的操作 public void init(){ System.out.println("init.…

重新学习Mybatis
type: item
date: 2022-11-23T19:40:00+08:00
description: Mybatis学习正式进入框架学习一 . 环境搭建及测试1 . 导入依赖在IDEA中创建一个maven项目在根目录的 pom.xml 文件夹下导入依赖 mybatis mysql junit <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.18</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency> </dependencies>2 . mapper文件在 src --> main --> resources 下创建 mybatis-config.xml 文件此文件是连接数据库 和 让Mybatis扫描对应的mapper文件<?xml version="1.0" encoding="UTF8" ?> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/atanycosts?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/userMapper.xml"/> </mappers> </configuration>再 在src --> main --> resources 下创建 mapper 文件夹,里创建 userMapper.xml 文件此文件里写的是 SQL语句<?xml version="1.0" encoding="UTF-8" ?> <mapper namespace="UserEntity"> select * from user </mapper>3 . 实体类src --> main --> com --> atanycosts --> entity写入对应数据库的字段package com.atanycosts.entity; //实体类 public class UserEntity { private Long id; private String name; private String address; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "UserEntity{" + "id=" + id + ", name='" + name + '\'' + ", address='" + address + '\'' + '}'; } } 4 . Test类packag…