自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

芊雨的博客

愿你在山顶时有清风拂面,愿你在谷底时依然不孤不寒。

  • 博客(167)
  • 收藏
  • 关注

原创 通过反射+动态代理向 Java 程序中注入代码

简介最近在学习 Java 中类加载器的时候,突发奇想。本篇文章主要记录,反射的使用方法,以及使用动态代理往 Java 程序中注入代码。编写 Java 程序1、新建一个包com.qianyu.controller,在该包下新建一个类Executor,用于模拟程序的主要逻辑。package com.qianyu.controller;import java.util.Random;public class Executor { public String run() {

2020-09-15 21:14:00 829

原创 基于SpringBoot + Vue的个人博客系统17——图片上传(MinIO、七牛云)

简介写文章功能部分还有一个重要的功能没有完成,那就是图片上传。图片上传这里主要介绍两种实现方式:1、使用 MinIO 搭建图片服务,完成图片上传功能。2、使用七牛云对象存储使用 MinIO简介MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。MinIO 中文文档:https://docs

2020-09-01 23:23:09 3689 2

原创 基于SpringBoot + Vue的个人博客系统16——文章的修改和删除

简介删除文章删除功能比较简单,只需进行如下操作:调用删除接口删除文章然后再刷新文章列表修改文章在文章列表页面点击修改文章按钮跳转到写文章页面,同时带上文章 id 作为参数在写文章界面创建的时候判断,路由参数中是否有文章 id如果有文章 id 就查询文章信息,并赋值给 this.article如果没有文章 id 就不执行其他操作前端1、在@/api/article.js中添加调用修改文章、删除文章、根据 id 获取文章信息 api 的方法/** * 根据 id 删除文章

2020-09-01 22:19:42 1867

原创 基于SpringBoot + Vue的个人博客系统15——写文章功能

简介写文章页面,使用 Markdown 编辑器, 关于Markdown编辑器,vue-admin-template 默认使用的是 tui.editor ,这里使用 mavonEditor,因为 mavonEditor 的用法更加简单,文档也通俗易通,而且个人感觉样式更加美观,可以根据个人喜好自行选择。tui.editor : https://github.com/nhnent/tui.editormavonEditor : https://github.com/hinesboy/mavonEdito

2020-09-01 21:12:01 3779

原创 基于SpringBoot + Vue的个人博客系统14——退出登录功能

简介退出登录的一种比较简单的实现是直接在客户端删除token,但是这存在一个问题,就是被删除的 token 依然有效,按理说注销登录之后 token 应该也是失效的。这一篇文章就主要介绍怎么让 token 失效网上方法有很多,可以参考这篇文章:JWT 身份认证优缺点分析以及常见问题解决方案这里我们使用 Redis 黑名单的方式安装Redis1、安装 docker (这里使用阿里云,系统 CentOS 7)# 安装需要的工具包sudo yum install -y yum-utils# 设置

2020-09-01 20:54:55 1596

原创 基于SpringBoot + Vue的个人博客系统13——使用JWT实现登录功能

后端实现用户登录1、用户登录之后可以使用很多方法来保存登录态,这里使用JWT引入依赖:<!-- jwt --><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version></dependency>2、封装 JWT 用到的

2020-09-01 20:46:54 1735

原创 基于SpringBoot + Vue的个人博客系统12——使用vue-admin-template展示文章列表(后台管理)

简介前面我们实现了博客系统的前台展示页面,还有留言功能没有实现,实现留言功能无非就是在后端增加留言表,对留言进行增删改查。和文章表类似,这里就不在赘述。既然作为一款动态博客,那么后台管理是必不可少的。为了不重复造轮子,我们直接使用开源项目 vue-element-admingithub: https://github.com/PanJiaChen/vue-element-admin中文文档:https://panjiachen.gitee.io/vue-element-admin-site/zh/

2020-09-01 20:11:51 2721 1

原创 基于SpringBoot + Vue的个人博客系统11——时间线页面

简介前端实现时间线功能就比较简单,因为 Element-UI 中已经有现成的组件,详情可参考:https://element.eleme.cn/#/zh-CN/component/timeline步骤1、js 部分只用发送一个请求即可import request from "@/http/request";export default { name: "TimeLine", data() { return { timelineData: [], }; },

2020-08-30 19:07:33 840

原创 基于SpringBoot + Vue的个人博客系统10——标签和分类页面

简介其实在主界面写好之后,分类和标签页面其实就很简单了,下面主要来介绍一下我踩过的坑。实现标签页面1、因为主界面中的文章卡片可以复用,所以我们单独抽取成组件2、新建 @/components/ArticleItem.vue 组件<template> <el-card> <div slot="header"> <router-link class="main-text" :to="'/post/' + article.id" v-

2020-08-30 17:13:09 1348

原创 基于SpringBoot + Vue的个人博客系统09——实现分页

后端处理要想实现分页,我们的数据量要比较大才行,我们可以使用 SpringBootTest 往数据库中批量添加数据。1、引入依赖<!-- 单元测试 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test&lt

2020-08-30 16:32:55 963

原创 基于SpringBoot + Vue的个人博客系统08——博客信息部分

简介博客信息部分主要放在文章列表的右边,主要包含三个部分:1、个人信息,2、分类列表,3、标签列表代码实现因为博客信息在多个组件中用得到,所以可以将其存入 vuex 中, vuex 文档:https://vuex.vuejs.org/zh/先在 @/http/urls.js中新增url地址export default { baseUrl: "/api/v1", article: "/article", articles: "/articles", tags: "/tags",

2020-08-30 16:20:59 1450

原创 基于SpringBoot + Vue的个人博客系统07——文章列表和文章详情

简介由于本人不是专业的前端,所以写出来的界面可能会稍微有些丑陋,甚至有些地方的写法不是很专业,还请大家见谅主界面JS 部分首先是 js 逻辑部分我们先在@/http/request.js中定义获取文章信息的方法// 此处省略 axios 的封装,前面的文章中有export default { getArticles(page, limit) { return instance.get(urls.articles, { params: { page: pa

2020-08-30 16:15:40 3426 1

原创 基于SpringBoot + Vue的个人博客系统06——前端环境搭建

1、使用 vue-cli 创建项目,并且安装依赖vue-cli文档: https://cli.vuejs.org/zh/说明:博客样式仿照 reco ,官网:https://vuepress-theme-reco.recoluan.com/,reco 是基于 VuePress 的一个静态博客,如果只是想搭建静态博客的话 reco 可以是一个好的选择,托管到 gitee page 或者 github page 上都很方便。使用 npm install XXX 命令安装如下依赖: // pa

2020-08-30 16:00:52 2270

原创 基于SpringBoot + Vue的个人博客系统05——时间线接口

简介博客一般都会有一个时间线,本篇介绍时间线接口的实现代码实现1、开发时间线功能之前,我们先将数据库中的文章时间打乱,这样的话按照年份汇总会显得比较均匀package pers.qianyucc.qblog.service;import cn.hutool.core.util.*;import lombok.extern.slf4j.*;import org.junit.*;import org.junit.runner.*;import org.springframework.bean

2020-08-28 20:38:28 850

原创 基于SpringBoot + Vue的个人博客系统04——博客配置信息接口

简介一般博客信息包括,博客名称、博客描述、封面轮播图、博主头像、博主名称等等信息。这里提供两种思路:给用户提供页面表单,让用户第一次初始化博客的时候填写这些信息,然后存入数据库(这个数据表可以只有两个字段:key 和 value 专门用来存储博客配置),每次 Vue 实例创建的时候使用 created 钩子函数检查博客是否已经初始化。直接将这些信息写入配置文件,程序启动之后,后端直接加载进内存,前端需要的话就直接返回给前端。这里为了简单,我们使用第二种方法。Hutool 工具类中有配置文件相关

2020-08-28 20:18:59 808

原创 基于SpringBoot + Vue的个人博客系统03——标签和分类接口

简介有了文章的CRUD,现在来写文章的标签和分类相关的接口标签首先我们要明确需求,现在我们需要的是:查询出全部的标签根据标签找到对应的文章列表1、新建 TagControllerpackage pers.qianyucc.qblog.controller;import io.swagger.annotations.*;import org.springframework.beans.factory.annotation.*;import org.springframework.we

2020-08-28 20:12:31 1250

原创 基于SpringBoot + Vue的个人博客系统02——简单的CRUD

简介数据库使用 MySQL 、持久层框架使用 Mybatis-plus,本篇文章介绍对文章表简单的增删改查。接口遵循 RESTful 规范,详情可参考:理解RESTful架构——阮一峰代码实现1、首先导入依赖<!-- mybatis-plus --><dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</

2020-08-28 20:04:24 2171 1

原创 基于SpringBoot + Vue的个人博客系统01——搭建后端项目

简介后端采用 SpringBoot 搭建项目,开发工具使用IDEA,为了简化开发,建议安装 Lombok 插件。步骤搭建web项目,集成knife4j1、新建maven工程,导入依赖<?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

2020-08-28 19:36:33 4176

原创 基于SpringBoot + Vue的个人博客系统00——简单介绍

基于 SpringBoot + Vue 的个人博客系统简介以前写过几篇类似的文章,也是SpringBoot + Vue 的博客系统,但是感觉都不尽如人意,至少现在看来简直水的一比。所以抽时间,将这个项目重写了一遍,虽然仍有不足,但是思路相对以前来说更加清晰。每篇文章对应的参考代码,我都会在下面标注。本项目适合刚学完 SpringBoot 和 Vue 的朋友进行练手使用。由于本人资质平平,如果项目有什么 Bug 或者文章上写的有疏漏的地方,欢迎在文章下方评论,避免误导他人,或在码云提 issue,我们可

2020-08-28 19:16:49 4677 4

原创 详细说说单例模式

单例模式特点:全局唯一,在整个程序中,只有一个对象。什么样的类适合单例?全局使用的类创建和销毁会消耗很多系统资源的类数据库连接池工厂类数据源应用:Spring的Bean默认情况下是单例项目中,读取配置文件的类,一般也只有一个对象。没有必要每次使用配置文件数据,每次new一个对象去读取。应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。数据库连接池的设计一般也是采用单例模式,因为数据库连接是一

2020-06-03 16:02:15 220

原创 使用最简单的方法实现QQ登录

前期准备1、首先开发者需要登录QQ互联,进行开发者认证,这里需要个人基本信息一张手持身份证的张片2、进入应用管理页面,依次点击:应用管理 -> 网站应用 -> 创建应用,应用信息提交后,等待审核通过即可,这一步我们需要注意的是:网站域名需要提前备案网站信息要和备案信息一致QQ登录实现这里为了简单,我们使用JustAuth来实现QQ登录,该项目集成了Github、Gitee、QQ、微博等等第三方登录,号称史上最全的整合第三方登录的开源库。另外为了方便演示,就不使用Spri

2020-05-13 20:43:12 1893

原创 装饰者模式

简介从简介不难看出,装饰器模式主要的作用在于扩充原来类的功能。就好像HTML可以用来展示数据,CSS可以在展示数据的基础上,对数据进行美化。一般我们想要扩充一个类的功能,可以使用继承的方式,也可以使用装饰器模式。下面我们分别使用两种方式来模拟HTML和CSS的关系。代码示例需求新建一个接口,表示展示文字的功能public interface IDisplayText { void displayText();}新建一个Span类,实现该接口,用来展示以一段文字public cl

2020-05-12 22:41:38 145

原创 从某盘限速来看策略模式

简介摘自百度百科“对象有某种行为,但是在不同场景中,该行为有不同的实现”,这不禁使我想起了某盘的Vip用户和普通用户下载速度的差别,今天我们就来借用某盘的例子说一说策略模式。代码实例首先,我们将用户分为三种:普通用户(Comm)、会员(Vip)、超级会员(SVip)。他们都可以下载文件,即都有下载方法(download)于是我们新建一个接口,表示下载功能public interf...

2020-05-06 20:45:17 180

原创 哈夫曼树与哈夫曼编码

概念什么是哈夫曼树总结起来就是要满足两个条件:二叉树带权路径长度最小带权路径长度带权的结点的带权的路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度(WPL)为树中所有叶子结点的带权路径长度之和。例如下面的二叉树,有5个带权结点,它WPL= 5×3+15×3+40×2+30×2+10×2=220构造哈夫曼树构造哈夫曼树,即构造一个带权路径长度最小的二...

2020-04-03 14:01:16 1026

原创 适配器模式(java实现)

简介参考资料:https://www.bilibili.com/video/av57936239?p=60适配器模式(Adapter Pattern)将某个接口转换成客户端希望的另一个接口表示,主要目的是兼容性,让原本因接口不匹配而不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)适配器模式属于结构型模式主要分为三类:类适配器模式、对象适配器模式、接口适配器模式工作原...

2020-03-10 12:31:25 3191

原创 JVM总结

常见面试题请你谈谈你对JVM的理解?java8虚拟机和之前的变化和更新什么是OOM?什么是栈溢出?怎么分析?JVM常见的调优参数有哪些?内存快照如何抓取,怎么分析Dump文件?谈谈JVM中,类加载器你的认识常见名词JVM的位置JVM的体系结构类加载器双亲委派机制沙箱安全机制NativePC寄存器方法区栈堆三种JVM新生区、老年区、永久区堆内存调优GC...

2020-03-08 20:11:10 444

原创 java中使用双大号初始化

场景在使用pol-tl操作word的时候,初始化Map的时候使用了如下代码在上面的初始化方式中,使用到了两个大括号{{}}看似有些陌生的语法,实际上这是匿名内部类和实例化代码块的结合实例化代码块先看一道面试题:class Person { { System.out.println("初始化代码块"); } public Person(Strin...

2020-02-22 14:50:53 151

原创 SpringBoot整合Shiro

环境搭建1、新建maven项目,导入依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.3.RELEASE&lt...

2020-02-17 21:00:21 353

原创 SpringBoot整合SpringSecurity

SpringSecurity是一个安全框架,主要用于授权和认证,在普通项目中,我们使用过滤器和拦截器也可以实现,但是使用SpringSecurity更加简单。项目搭建1、新建项目,导入依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring...

2020-02-17 20:54:35 2292 3

原创 SpringBoot中yaml文件的使用

基本语法大小写敏感使用缩进表示层级关系缩进不允许使用tab,只允许空格缩进的空格数不重要,只要相同层级的元素左对齐即可'#'表示注释数据类型对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)纯量:单个的、不可再分的值yaml在线转jso...

2020-02-16 21:18:19 1317

原创 java中的编码与解码

charjava的char类型占用两个字节,有三种赋值方式:1、直接赋值char c ='a';char c1='中';System.out.println(c); // aSystem.out.println(c1); // 中2、使用16进制或十进制赋值(这里的值是指编码表中对应的数值)char c2= 0x8d24;char c3 = 36132;System.out....

2020-02-16 21:11:29 998 1

原创 String面试知识点总结

String三大核心机制不变性:是一个immutable模式的对象,不变模式的主要作用是当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性常量池优化:String对象创建后,会在字符串常量池进行缓存,下次创建同样的对象时,会直接返回缓存的引用final:String类不可继承,提高了系统的安全性常见的考点String类型不是基本数据类型,String底层实现为char类型的...

2020-02-16 16:04:02 149 1

原创 Vert.x初体验

简介Vert.x项目起始于2011年,最开始的名字叫做 node.x,是一个仿照Node.js以Java开发的,基于EventLoop的异步非阻塞编程框架。Eclipse Vert.x是一个事件驱动的JVM上的框架,可以帮助我们构建现代、灵活、可扩展的程序。使用Vert.x1、新建maven项目,导入依赖<dependencies> <dependency>...

2020-02-15 20:36:40 309

原创 SpringBoot整合Redis

Redis非关系型数据库的代表,基于内存进行存储,支持key-value的存储形式,底层是用C语言来编写的。基于key-value形式的数据字典,结构非常简单,没有数据表的概念,直接用键值对的形式完成数据的管理,Redis支持5中数据类型:字符串列表集合有序集合哈希SpringBoot整合Redis实质是使用Spring Data Redis操作Redis1、搭建环境,引入...

2020-02-10 13:06:12 4970

原创 原型模式(java实现)

原型模式介绍原型模式用于创建重复的对象,同时又能保证性能。java实现实现原型模式需要两步:实现Cloneable接口重写clone方法例如我们定义一个Video类import lombok.*;import java.time.*;@Data@AllArgsConstructorpublic class Video implements Cloneable{ ...

2020-02-08 20:03:45 579

原创 Swagger的使用(整合SpringBoot)

Swagger的使用(SpringBoot)简介前后端分离纯后端时代:前端只用管理静态页面前后端分离时代:后端:后端控制层、服务层、数据库访问层前端:前端控制层、视图层伪后端数据,json。(不需要后端,前端也可以跑起来)前后端交互:通过api前后端相互独立,松耦合前后端可以部署在不同的服务器问题:前后端集成联调,前端人员和后端人员无法做到“及...

2020-02-08 16:19:33 417

原创 使用AndroidStudio打包Flutter应用

切换镜像Flutter项目新建之后,要先将Gradle仓库设置为阿里云镜像:maven { url 'https://maven.aliyun.com/repository/google' }maven { url 'https://maven.aliyun.com/repository/jcenter' }maven { url 'http://maven.aliyun.com/nex...

2020-02-02 23:25:11 2396 1

原创 Android Studio打包发布Flutter安卓应用

打包发布安卓应用主要有5步,修改android/app/src/main/AndroidManifest.xml首先通过安卓模式打开项目然后等待项目加载完成,出现下面情况为加载完成:如果出现异常可以参考这篇文章:启动 flutter项目时报Could not find com.android.tools.build:gradle:3.2.1.然后修改APP对应的名字,也就是在手机桌面...

2020-02-02 15:37:37 1934

原创 java中finally和return的执行顺序(对比Go语言中defer)

Go语言中defer说finally之前我们先说说Go语言中deferGo语言中的defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。在Go语言的函数中return语句在底层并不是原子操作,它分为给返回值赋值和RET指令两步。而def...

2020-01-25 23:03:44 1101

原创 在一个java类中可以直接访问这个类对象的私有属性

问题描述在上面代码中,在create方法中直接使用了Student类的属性,并且通过编译。查阅《java核心技术》105页发现private关键字修饰的属性,类自身的方法还是可以访问的。...

2020-01-23 20:08:41 3215

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除