韩源-末日生存手册 - json
type: channel
link: https://kerryhan.cn/index.php/tag/json/
items: FastDFS部署注意要点
items: 详解HTTP
items: springboot+mybatisPlus代码层级梳理
items: SpringMVC的常用注解
items: vue工程化项目搭建

FastDFS部署注意要点
type: item
date: 2023-11-08T02:54:00+00:00
description: 容器启动容器在启动之前，确保firewalld和iptables是启动状态，容器启动好之后，将docker服务进行重启，然后关闭firewalld和iptablesLinux相关命令fastdfs原生自带的文件上传命令（在storage内操作）/usr/bin/fdfd_upload_file /etc/fdfd/client.conf 文件名称在storage上查看同group的信息/usr/bin/fdfs_monitor /etc/fdfs/storage.confip地址变动，所涉及改动的文件storage.conf client.conf mod_fastdfs.conf同时，在宿主机上修改docker缓存，进入/vat/lib/docker/containers/容器ID/config.v2.json 将tracker_server的地址也修改过来

详解HTTP
type: item
date: 2021-07-12T12:29:00+00:00
description: 详解HTTPWeb及网络基础为了更好的理解什么是HTTP协议，我们需要先了解TCP/IP协议族。目前通常使用的网络都是在基于TCP/IP协议族的情况下进行信息传输，而HTTP也实际上是属于TCP/IP协议模型。要知道，不同的计算机之间要通过网络进行通信，那么必须遵循统一的规定，才能进行交流。这也就是协议的作用，通过制定规约，让不同的计算机可以进行信息互换。TCP/IP协议最重要的一点是对于信息加工传输进行了分层处理，这种分层结构清晰明了。TCP/IP协议族按层次划分为应用层、网络层、传输层、数据链路层。发送端数据依次经过应用层、网络层、传输层、数据链路层；接收端依次从数据链路层、传输层、网络层、应用层接收数据。而我们的HTTP协议就应用在应用层。HTTP报文用于HTTP协议交互的信息被称为是HTTP报文。客户端的HTTP报文叫做请求报文，响应端的HTTP报文称为响应报文。HTTP的报文是由多行数据构成的字符串文本。其结构大致可以分为报文首部和报文主体两块，两者通过空行进行划分，通常，报文是没有主体的。HTTP结构HTTP请求报文分为报文首部、空行、报文主体，其中报文首部内存放了请求行、请求首部字段、通用首部字段、实体首部字段和其他。HTTP响应报文分为报文首部、空行、报文主体，其中报文首部分为状态行、响应首部字段、通用首部字段、实体首部字段以及其他。HTTP状态码1XX：通知1XX系列响应代码仅在与HTTP服务器沟通时使用。100("Continue") 重要程度：中等，但（写操作时）很少用。这是对HTTP LBYL（look-before-you-leap）请求的一个可能的响应。该响应代码表明：客户端应重新发送初始请求，并在请求中附上第一次请求时未提供的（可能很大或者包含敏感信息的）表示。客户端这次发送的请求不会被拒绝。对LBYL请求的另一个可能的响应是417("Expectation Failed")。请求报头：要做一个LBYL请求，客户端必须把Expect请求报头设为字符串"100-continue"。除此以外，客户端还需要设置其他一些报头，服务器将根据这些报头决定是响应100还是417。101("Switching Protocols") 重要程度：非常低。当客户端通过在请求里使用Upgrade报头，以通知服务器它想改用除HTTP协议之外的其他协议时，客户端将获得此响应代码。101响应代码表示“行，我现在改用另一个协议了”。通常HTTP客户端会在收到服务器发来的101响应后关闭与服务器的TCP连接。101响应代码意味着，该客户端不再是一个HTTP客户端，而将成为另一种客户端。尽管可以通过Upgrade报头从HTTP切换到HTTPS，或者从HTTP1.1切换到某个未来的版本，但实际使用Upgrade报头的情况比较少。Upgrade报头也可用于HTTP切换到一个完全不同的协议（如IRC）上，但那需要在Web服务器切换为一个IRC服务器的同时，Web客户端切换为一个IRC的客户端，因为服务器将立刻在同一个TCP连接上开始使用新的协议。请求报头：客户端把Upgrade报头设置为一组希望使用的协议。响应报头：如果服务器同意切换协议，它就返回一个Upgrade报头，说明它将切换到那个协议，并附上一个空白行。服务器不用关闭TCP链接，而是直接在该TCP连接上开始使用新的协议。2XX: 成功2XX系列响应代码表明操作成功了。200("OK") 重要程度：非常高。一般来说，这是客户端希望看到的响应代码。它表示服务器成功执行了客户端所请求的动作，并且在2XX系列里没有其他更适合的响应代码了。实体主体：对于GET请求，服务器应返回客户端所请求资源的一个表示。对于其他请求，服务器应返回当前所选资源的一个表示，或者刚刚执行的动作的一个描述。-201("Created")重要程度：高。当服务器依照客户端的请求创建了一个新资源时，发送此响应代码。响应报头：Location报头应包含指向新创建资源的规范URI。实体主体：应该给出新创建资源的描述与链接。若已经在Location报头里给出了新资源的URI，那么可以用新资源的一个表示作为实体主体。-202("Accepted")重要程度：中等。客户端的请求无法或将不被实时处理。请求稍后会被处理。请求看上去是合法的，但在实际处理它时有出现问题的可能。若一个请求触发了一个异步操作，或者一个需要现实世界参与的动作，或者一个需要很长时间才能完成且没必要让Web客户端一直等待的动作时，这个相应代码是一个合适的选择。响应报头：应该把未处理完的请求暴露为一个资源，以便客户端稍后查询其状态。Location报头可以包含指向该资源的URI。实体主体：若无法让客户端稍后查询请求的状态，那么至少应该提供一个关于何时能处理该请求…

springboot+mybatisPlus代码层级梳理
type: item
date: 2020-04-30T14:40:00+00:00
description: 代码层级梳理代码层级annotation层ExcelVoAttribut主要用于写@ExcelVoAttribute注解，可以更灵活的配置Excel数据表导出的一些基本配置LogDirection主要用于写@LogDirection注解，注解里包含一个字段（接口描述），通过接口添加这个注解，填写上接口的功能，当用户在访问接口时候，可以利用aop技术，把用户的操作记到日志里aspect层LogDrectionAspect主要定义了aop切点的位置和增强的方法/** * @Author Johnny * @Date 2020/4/16 * @Version 1.0 */ @Aspect @Component @Slf4j public class LogDirectionAspect { @Pointcut("@annotation(logDirection)") public void doLogDirection(LogDirection logDirection){ } @Around(value = "doLogDirection(logDirection)",argNames = "pjp,logDirection") public Object doBefore(ProceedingJoinPoint pjp,LogDirection logDirection) throws Throwable{ if (!"".equals(logDirection.direction())) { log.info(logDirection.direction()+"接口被调用"); return pjp.proceed(); } return "接口信息不规范"; } }@Pointcut定义切点，此处定义切点为使用@LogDirection的方法@Around定义增强的方法，通过around的参数ProceedingJoinPoint可以很好的控制程序能不能继续执行下一步，在权限判定发挥着比较重要的作用拓展：利用下面的这种方法，需要在xml文件中配置bean实例，当然也可以在方法中通过手动扫包的方法获得bean实例进行操作/** * @Author Johnny * @Date 2020/4/16 * @Version 1.0 */ @Aspect public class MyAdvice { /** * 配置切点 */ @Pointcut("execution(* com.soft1851.spring.web.dao..*.insert*(..))") public void pointCut() { } /** * 配置前置增强 */ @Before("MyAdvice.pointCut()") public void beforeMethod() { System.out.println("等待数据插入"); } /** * 配置后置增强 */ @AfterReturning("execution(* com.soft1851.spring.web.dao..*.*(..))") public void afterMethod(){ System.out.println("关闭数据库"); } }xml配置实例 <bean name="forumDao" class="com.soft1851.spring.web.dao.impl.ForumDaoImpl"/> <bean name="myAdvice" class="com.soft1851.spring.web.interceptor.MyAdvice"/> <aop:aspectj-autoproxy/>common层ResponseResult和ResultCode这两个类可以将响应体统一进行封装，将接口的响应体规范化，使前端获取数据也更加友好贴下代码，防止以后找不到ResponseResult类package com.soft1851.music.admin.common; import lombok.Data; import java.io.Serializable; /** * @author Johnny * @Date: 2020/4/21 19:52 * @Description: */ @Data public class ResponseResult implements Serializable { private static final long serialVersionUID = -3948389268046368059L; private Integer code; private String msg; private Obje…

SpringMVC的常用注解
type: item
date: 2020-03-31T16:52:00+00:00
description: @Controller处理由DispatcherServlet 分发的请求，用于类上把用户请求的数据经过业务处理层处理之后封装成一个Model再把该Model 返回给对应的View 进行展示@RequestMapping处理请求地址映射的注解，可用于类或方法属性value： 指定请求的实际地址，指定的地址可以是URI Template 模式method： 指定请求的method类型， GET、POST、PUT、DELETE...consumes： 指定处理请求的提交内容类型（Content-Type），例如application/json, text/htmlproduces: 指定返回的内容类型，仅当request请求头中的(Accept)类型中包含该指定类型才返回params： 指定request中必须包含某些参数值是，才让该方法处理headers： 指定request中必须包含某些指定的header值，才能让该方法处理请求@Resource、@Autowired在bean的注入时使用写在字段和setter方法上。两者如果都写在字段上，那么就不需要再写setter方法@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上，即取出uri模板中的变量作为参数@requestParam主要用于在SpringMVC后台控制层获取参数，类似一种是request.getParameter("name")@ResponseBody将Controller的方法返回的对象，通过适当的HttpMessageConverter转换为指定格式@Component通用注解（可代替@Repository @Service @Controller）@Repository用于注解dao层，在daoImpl类上面注解@ModelAttribute、@SessionAttributes传递和保存数据，在不同的模型（model）和控制器之间共享数据@PathVariable、@RequestParam@PathVariable获取请求路径上的变量值@RequestParam用来获得静态的URL请求入参 spring注解时action里用到@RequestHeader、@CookieValue@RequestHeader可以把Request请求header部分的值绑定到方法的参数上。@CookieValue可以把Request header中关于cookie的值绑定到方法的参数上@RequestParam, @RequestBody@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容，提交方式GET、POST@RequestBody常用来处理Content-Type: 不是application/x-www-form-urlencoded编码的内容，例如application/json,application/xml等

vue工程化项目搭建
type: item
date: 2020-03-25T15:06:00+00:00
description: 工程化项目搭建现在可以继续在这个开发目录，开始用以下命令搭建工程化项目vue create zhihu-app提示界面进行一些选择，箭头上下选，有默认方式和手动选择。默认的设置非常适合快速创建一个新项目的原型，而手动设置则提供了更多的选项，它们是面向生产的项目更加需要的图片: https://uploader.shimo.im/f/eOL9ykt4mJAs7bpo.png可以根据项目大小和功能体验配置不同的功能，空格键 选中/反选，按a键 全选/全不选，按i键反选已选择项， 上下键 上下移动选择。这里只选择了Babel、Router、Vuex、CSS预处理图片: https://uploader.shimo.im/f/UNr3W00VnO8hZaXg.png选好后敲回车，会进一步询问细节，Router不要使用history mode，输入n选择一种CSS预处理的语言，这里选择了 Less然后会询问你是单独放配置文件，还是放在package.json，选单独配置文件最后问你要不要把本次配置保存，方便以后直接用这个配置构建项目图片: https://uploader.shimo.im/f/A6IMDf6KQwMwu3Pm.png图片: https://uploader.shimo.im/f/poXKeZeaLcAAbftc.png回车开始构建项目，速度快慢取决于网速和机器配置，构建成功如图所示：图片: https://uploader.shimo.im/f/7CcxbAIOuDQGpMJO.png按照提示，进入项目目录，用npm run serve运行项目图片: https://uploader.shimo.im/f/CUhuwuFxJfwTd7vd.png不会自动打开浏览器，把地址复制到浏览器打开即可，效果如图，Home和About可以点击切换图片: https://uploader.shimo.im/f/IlqIueU8HF8aL2Yd.png四、Q/A1.修改端口在项目根目录下新建一个vue.config.js文件：module.exports = {devServer: { // 可以用域名访问 disableHostCheck: true, //修改成你要的端口 port: 8888 }, //不在浏览器中显示错误 lintOnSave: false}命令行窗口用ctrl+c，退出批处理，然后重新用命令运行你的项目图片: https://uploader.shimo.im/f/k9IkfXBz5yIBc7dA.png会发现端口变化了~更多配置看官网：https://cli.vuejs.org/zh/config/#vue-config-js2.运行项目自动打开浏览器在项目根目录找到package.json文件，找到serve配置项，增加一个--open，如图图片: https://uploader.shimo.im/f/I87b6s0Vr2EgMhC2.png重新运行项目即可自动打开浏览器3.添加新的module项目开发过程中，会不断地有新的功能需求，需要我们去添加第三方的模块，这和后端不断在pom.xml中添加依赖是一样的，做法如下（比如需要添加axios异步网络请求的库）在项目根目录找到package.json文件，在dependencies部分添加声明即可图片: https://uploader.shimo.im/f/ix1pqsG4LFMTdvoZ.png然后在命令行输入：npm install ，安装一下即可图片: https://uploader.shimo.im/f/ZLoXwwYJh7s76tQb.png4.导航随着路由切换变化样式只需要在相关页面定义一个 .router-link-active 的样式，选中的导航会默认加上这个样式