SpringBoot邮件发送Excel

一、添加jarpom

添加邮件功能jar

 <!--邮件发送-->
 <dependency>
 	<groupId>org.springframework.boot</groupId>
 	<artifactId>spring-boot-starter-mail</artifactId>
 </dependency>

添加Excel功能的jar

<!-- excel -->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>4.1.0</version>
</dependency>
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>4.1.0</version>
</dependency>
二、邮件配置
##邮箱服务器
spring.mail.host = stmp.xx.com
#你的邮箱账户
spring.mail.username = xx@xx.com
#你的邮箱第三方授权码
spring.mail.password = xx
spring.mail.properties.mail.smtp.port: 25
#代理(如果需要设置代理)
spring.mail.properties.mail.smtp.proxy.host = 192.xx.x.x
spring.mail.properties.mail.smtp.proxy.port = xxx
#编码类型
spring.mail.default-encoding = UTF-8
三、发送邮件功能

1.创建接口 继续阅读SpringBoot邮件发送Excel

定时清除linux下某文件内容

实现方式:Linux Crontab 定时任务

linux内置的cron进程能帮我们实现这些需求,cron搭配shell脚本,非常复杂的指令也没有问题。

cron介绍

我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。

  • /var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名
  • /etc/crontab 这个文件负责调度各种管理和维护任务。
  • /etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。
  • 我们还可以把脚本放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。
# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

crontab的使用

我们常用的命令如下:

crontab [-u username]    //省略用户表表示操作当前用户的crontab
    -e      (编辑工作表)
    -l      (列出工作表里的命令)
    -r      (删除工作作)

我们用crontab -e进入当前用户的工作表编辑,是常见的vim界面。每行是一条命令。

crontab的命令构成为 时间+动作,其时间有分、时、日、月、周五种,操作符有 继续阅读定时清除linux下某文件内容

逗哥上学记

幼儿园Day1⃣️
没有哭闹,没有抗拒,全程都很开心;
记住了一个小朋友的名字;
小便的时候会自己走到老师面前;
说老师让他不要站在板凳上,他说只是想看看窗外的风景;
说在幼儿园搭了城堡,老师教跳舞了,并且表演给我看;
你比麻麻想象的更懂事,加油,小伙子! ​​​​

补一个幼儿园Day2⃣️
到了班级头也不回就走了,连个再见都没有;
问我同学为什么要哭着找奶奶[笑cry]
晚上遛弯看到同班的小朋友会告诉我,那个是同学;
小伙子,继续加油💪 ​​​​

幼儿园Day3⃣️
1.老师点名:xu**?
逗哥:(沉默了三秒)老师我姓liu!
2.记住了一声平二声扬三声拐弯四声降。 继续阅读逗哥上学记

[MYSQL5.7版本sql_mode=only_full_group_by问题]

下载安装的是最新版的mysql5.7.x版本,默认是开启了 only_full_group_by 模式的,但开启这个模式后,原先的 group by 语句就报错,然后又把它移除了。

一旦开启 only_full_group_by ,感觉,group by 将变成和 distinct 一样,只能获取受到其影响的字段信息,无法和其他未受其影响的字段共存,这样,group by 的功能将变得十分狭窄了

only_full_group_by 模式开启比较好。

因为在 mysql 中有一个函数: any_value(field) 允许,非分组字段的出现(和关闭 only_full_group_by 模式有相同效果)。

具体出错提示:

[Err] 1055 – Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column ‘information_schema.PROFILING.SEQ’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

1、查看sql_mode

`select @@global.sql_mode;`

查询出来的值为:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

2、去掉ONLY_FULL_GROUP_BY,重新设置值。

`set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';`

3、上面是改变了全局sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据下执行:

`set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';`

 

解决办法大致有两种:

继续阅读[MYSQL5.7版本sql_mode=only_full_group_by问题]

删除ES索引中的数据

选择复合查询[+],然后在查询框操作如下内容:
一、 文本框

info-statistics-index/_delete_by_query

info-statistics-index为索引名

二、 协议
POST

三、 内容

{
    "query": {
        "match": {
            "type": "info-user-intent:delete"
        }
    }
}

type为字段属性
info-user-intent:delete为字段值

最后点击提交请求

页面右侧返回操作结果和删除条数,内容如下

{
    "took": 225,
    "timed_out": false,
    "total": 33,
    "deleted": 33,
    "batches": 1,
    "version_conflicts": 0,
    "noops": 0,
    "retries": {
        "bulk": 0,
        "search": 0
    },
    "throttled_millis": 0,
    "requests_per_second": -1,
    "throttled_until_millis": 0,
    "failures": []
}

至此,删除完毕。

Java8新特性学习笔记

lambda表达式学习,抛开语法从匿名内部类学习语法特性:

共6种场景
1接收一个参数,没有返回值;
2接收两个参数,返回一个参数;
3无参数,无返回;
4构造方法引用;
5静态方法应用;
6实例(对象)方法引用。

 

一、接收一个参数,没有返回值

定义一个接口(有且只有一个抽象方法)

public interface MyInterface {
    void print(String str);
}

测试类

public class Test {
    public static void main(String[] args) {
        MyInterface m1 = new MyInterface() {
            @Override
            public void print(String str) {
                System.out.println(str);
            }
        };

        //常规写法
        MyInterface m2 = (String str) -> {
            System.out.println(str);
        };

        //简写
        MyInterface m3 = str -> System.out.println(str);

        m3.print("hello lambda..");
    }
}

 

二、接收两个参数,返回一个参数

定义一个接口

public interface MyInterface {
    int sum(int num1, int num2);
}

测试类

public class Test {
    public static void main(String[] args) {
        /**
         * 匿名内部类方式
         */
        MyInterface m1 = new MyInterface() {
            @Override
            public int sum(int num1, int num2) {
                return num1 + num2;
            }
        };

        /**
         * lambda常规写法
         */
        MyInterface m2 = (int num1, int num2) -> {
            return num1 + num2;
        };

        /**
         * lambda简写
         * 1 不写入参格式,可以自动推断
         * 2 如果方法中语句只有一条可以省略{};如果是return返回数据,可以省略return
         */
        MyInterface m3 = (num1, num2) -> num1 + num2;
        System.out.println(m3.sum(123, 456));
    }
}

三、无参数,无返回

定义一个接口 继续阅读Java8新特性学习笔记

1349 – View’s SELECT contains a subquery in the FROM clause

场景:要导出视图并在另外一台服务器上创建,结果创建失败了。错误如标题所示,经过搜索找到原因,现总结下。

MySQL文档中对版本做了说明,5.7.7以前的版本不支持子查询的视图语句,要实现可以通过把子查询语句拆成单个视图,最后拼接在一起;获取使用高版本的MySQL(安装版本>5.7.7)即可。

补充:使用Navicat导出视图语句的方法 继续阅读1349 – View’s SELECT contains a subquery in the FROM clause

安全代码的检查清单

 

安全代码的检查清单

安全管理

有没有安全更新的策略和落实计划?

有没有安全漏洞的保密共识和规范?

有没有安全缺陷的评估和管理办法?

软件是不是使用最新的安全修复版?

有没有定义、归类和保护敏感信息?

有没有部署多层次的安全防御体系?

安全防御能不能运转良好、及时反应?

不同的安全防御机制能不能独立运转?

系统管理、运营人员的授权是否恰当?

有没有风险管理的预案和长短期措施?

代码评审

数值运算会不会溢出?

有没有检查数值的合理范围 继续阅读安全代码的检查清单

监听Apollo配置变动

监听Apollo配置变动


import lombok.extern.slf4j.Slf4j;
import com.ctrip.framework.apollo.ConfigFile;
import com.ctrip.framework.apollo.ConfigService;
import com.ctrip.framework.apollo.core.enums.ConfigFileFormat;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
import org.springframework.stereotype.Component;
/**
* 监听Apollo配置属性变化事件
* 注意:Apollo配置的namespace为application,属性为json.config.{xx},属性值是JSON字符串
*/
@Slf4j
@Component
public class ApolloRefreshListener {

   /**
    * json.config.value=[{"someString":"hello","someInt":100}]
    */
   @ApolloJsonValue("${json.config.value}")
   private List<JsonBean> jsonBeanList;

   /**
    * 监听namespace,默认application,多个("namespace1","namespace2")
    */
   @ApolloConfigChangeListener("application")
   private void someOnChange(ConfigChangeEvent changeEvent) {
       boolean hasChange = false;
       //update injected value of batch if it is changed in Apollo
       for (String changedKey : changeEvent.changedKeys()) {
           log.info("changedKey:{}", changedKey);
           //json.config的key发生了改变(json.config.xx的配置发生了改变)
           if (changedKey.startsWith("json.config.")) {
               hasChange = true;
               break;
          }
      }
       if (hasChange) {
           ConfigFile content = ConfigService.getConfigFile(changeEvent.getNamespace(), ConfigFileFormat.Properties);
           List<JsonBean> result = jsonBeanList;
           log.info("result:{}", result);
      }
  }
   
   
}

直接获取json配置的namespace(添加namespace时,选择private,名称后缀选择json格式),代码如下 继续阅读监听Apollo配置变动