Minio
毕设用Minio搭建一个对象存储服务得了,不用买oss了
docker搭建Minio123456docker run -d -p 9000:9000 -p 9001:9001 --name minio \-e "MINIO_ROOT_USER=root" \-e "MINIO_ROOT_PASSWORD=01020304" \-v /mnt/data:/data \-v /mnt/config:/root/.minio \minio/minio server --console-address ":9001" /data
密码最低八位….,不然启动失败:
minio concole配置文件上传后默认是不会返回url的,但是可以获取临时的访问链接,这个链接最长7天,不符合业务要求,所以可以新增存储桶的规则:
这样就可以直接通过ip:port/bucket/filename来访问了
Springboot整合minio依赖12345<dependency> <groupId>io. ...
BeanUtils注意事项
今天改了一个项目中的bug
简单来说就是关于BeanUtils.copyProperties()的,当属性名一样但是属性类型不一样时,方法不会进行拷贝
项目里就是用了这玩意导致搜索条件没加上
123456789101112131415161718192021 @Test void testBeanUtils() { Test1 t1 = new Test1(); Test2 t2 = new Test2(); /** * 如果要拷贝的某个字段名一样但是类型不一样,则不会拷贝 */ BeanUtils.copyProperties(t2, t1); System.out.println(t1); }@Dataclass Test1 { private String id;}@Dataclass Test2 { // private String id = 10L; private String id = ...
毕设规划
2024年1月11日 12点33分
功能需求部分美食教程小程序应能够满足用户的基本需求
食谱浏览:
分类浏览:按照不同的菜系等分类浏览食谱。
热门推荐:展示热门、受欢迎的食谱。
搜索菜谱
根据菜谱的名字,内容搜索
发布菜谱
菜谱的帖子中要包含文字和图片,图片怎么弄呢?难道还要买个OSS,应该还是要买一个OSS的,不然图片传不上取啊
一个难点在于,菜谱中的图片,传上来,然后怎么确定就在那个位置呢?
一个上传按钮,上传完图片就会在光标位置生成markdown的图片引用,这不就刚刚好了
评论
评论主要是针对菜谱进行的,而这里的菜谱代表的就是帖子,然后菜谱的评论可以嵌套,也就是对评论也可以进行评论
收藏
而收藏,也就是收藏菜谱了
点赞
点赞菜谱
杂谈登录部分设计成什么样的呢?
手机验证码登录
手机号密码登录
微信扫码登录,这个做不了,要认证啥的,很麻烦.
数据库设计user:用户表
id
nick_name
account:手机号
password
avatar_url:头像url
bio:个人简介
create_time
update_time
role_i ...
Collection与Map
集合框架概述数组的特点与弊端特点
数组一旦初始化,长度就已经确定了
数组中的多个元素是依次紧密排列的,有序的,可重复
数组一旦初始化完成,其元素的类型就是确定的,不是此类型的元素,就不能添加到数组中
元素的类型既可以是基本数据类型,也可以是引用数据类型
弊端
数组一旦初始化,长度就已经不可变了
数组中存储数据特点的单一性,对于无序的,不可重复的场景的多个数据就不行了
数组中可用的方法,属性都极少
针对于数组中元素的删除,插入操作,性能较差(尾部添加性能并不差)
Java集合框架体系java.util.Collection:存储一个一个数据
List
存储有序的,可重复的数据
ArrayList
LinkedList
Vector
Set(底层其实就是Map,只使用了Map的键,来保证唯一,不可重复)
存储无序的,不可重复的数据
HashSet
LinkedHashSet
TreeSet
java.util.Map:存储一对一对数据
HashMap
LinkedHashMap
TreeMap
Hashtable
Properties
Collection接口
ad ...
Java比较器
基本数据类型需要比较大小的话,可以直接使用比较运算符,但是引用数据类型是不能直接使用比较运算符来比较大小的
自然排序自然排序Comparable
如果数组中是基本数据类型的比较
12345678@Testpublic void test1() { String[] arr = new String[]{"Tom", "Jerry", "John", "Atom", "Bomb"}; Arrays.sort(arr); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }}
就能够使用Arrays.sort()来进行正常的排序
如果数组中的是引用数据类型,就会报错
1234567891011121314@Testpublic void test2() { Product[] arr = n ...
JVM面经
JVM相关面试题1 JVM组成1.1 JVM由那些部分组成,运行流程是什么?
难易程度:☆☆☆
出现频率:☆☆☆☆
JVM是什么
Java Virtual Machine Java程序的运行环境(java二进制字节码的运行环境)
好处:
一次编写,到处运行
自动内存管理,垃圾回收机制
JVM由哪些部分组成,运行流程是什么?
从图中可以看出 JVM 的主要组成部分
ClassLoader(类加载器)
Runtime Data Area(运行时数据区,内存分区)
Execution Engine(执行引擎)
Native Method Library(本地库接口)
运行流程:
(1)类加载器(ClassLoader)把Java代码转换为字节码
(2)运行时数据区(Runtime Data Area)把字节码加载到内存中,而字节码文件只是JVM的一套指令集规范,并不能直接交给底层系统去执行,而是有执行引擎运行
(3)执行引擎(Execution Engine)将字节码翻译为底层系统指令,再交由CPU执行去执行,此时需要调用其他语言的本地库接口(Native Method L ...
并发编程面经
文档说明
在文档中对所有的面试题都进行了难易程度和出现频率的等级说明
星数越多代表权重越大,最多五颗星(☆☆☆☆☆) 最少一颗星(☆)
Java多线程相关面试题1.线程的基础知识1.1 线程和进程的区别?
难易程度:☆☆
出现频率:☆☆☆
程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。
当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。
一个进程之内可以分为一到多个线程。
一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行
Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。在 windows 中进程是不活动的,只是作为线程的容器
二者对比
进程是正在运行程序的实例,进程中包含了线程,每个线程执行不同的任务
不同的进程使用不同的内存空间,在当前进程下的所有线程可以共享内存空间
线程更轻量,线程上下文切换成本一般上要比进程上下文切换低(上下文切换指的是从一个线程切换到另一个线程 ...
Ciy Mag68驱动使用教程
前言刚换了ciy mag68,这把键盘应该算是船壳68的终章了吧
详细配置:
这里说记录一下这驱动的使用方式
驱动官网下载
驱动界面
全局设置全局设置可以调整休眠时间,按键去抖等功能
按键指派这个就是重头戏了,这个界面也是非常简陋啊
分为默认层,FN1层,FN2层,Tap层
如果修改默认层,就是直接修改了键盘默认的按键了,可以在下方选择一个目标按键,然后点击键盘图上的某个按键,即可修改键盘上的键值为目标按键,比如你可以将q改成a(除非你有这么闲)
FN1层
这一层操作空间就大了,比如我的这里是FN+rAlt是截图,要用到组合键
操作步骤
选择一个要绑定的按键,比如alt
勾选上Win,点击请输入一个单键或组合键下面的输入框,然后按Print
即可给右alt绑定上全屏截图键(Win+print)
宏驱动是支持宏定义的,只需要在宏编辑面板设置一个宏,然后在按键指派面板继续上面的绑定就行了
最后编辑完别忘了点击右下角的保存按钮
驱动会更新键盘的数据,如果发现没有变化,驱动关了再开说不定就好了
感觉驱动有些bug,比如给字母区的按键绑定fn组合键,就可能不能用,希望后期能完善些吧.
集合面经
Java集合相关面试题导学这次课程主要涉及到的是List和Map相关的面试题,比较高频就是
ArrayList
LinkedList
HashMap
ConcurrentHashMap
ArrayList底层实现是数组
LinkedList底层实现是双向链表
HashMap的底层实现使用了众多数据结构,包含了数组、链表、散列表、红黑树等
在讲解这些集合之后,我们会讲解数据结构,知道了数据结构的特点之后,熟悉集合就更加简单了。在讲解数据结构之前,我们也会简单普及一下算法复杂度分析,让大家能够评判代码的好坏,也能更加深入去理解数据结构和集合。
1 算法复杂度分析1.1 为什么要进行复杂度分析?我们先来看下面这个代码,你能评判这个代码的好坏吗?
123456789101112/** ** *求**1~n**的累加和 ** @param* *n ** @return*/public int sum(int n) { int sum = 0; for ( int i = 1; i <= n; i++) { sum = sum + i; ...
框架面经
框架篇面试题-参考回答
面试官:Spring框架中的单例bean是线程安全的吗?候选人:
嗯!
不是线程安全的,是这样的
当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中有对该单列状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。
Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。
比如:我们通常在项目中使用的Spring bean都是不可可变的状态(比如Service类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。
如果你的bean有多种状态的话(比如 View Model对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用由“singleton”变更为“prototype”。
面试官:什么是AOP
候选人:
aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般比如可以做为公共日志保存,事务处理等 ...