继开 | 博客

热爱生活,努力学习,实现自己的价值


  • 短诗的序

  • 迷途自渡

  • 寒星三两

  • 林深见鹿

  • 记昨日书

  • 顾探往昔

Java使用freemarker导出图片对应图关系

发表于 2021-04-10
字数统计: 839 字 | 阅读时长 ≈ 5 min

freemarker的导出文件ftl

关键点

1 中的r:embed rId1003 对应 3中的Id rId1003
2 中的pkg:name /word/media/image3.jpeg 对应 3中的Target media/image3.jpeg

1,图片的占位

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<w:drawing>
<wp:inline distT="0" distB="0" distL="0" distR="0">
<wp:extent cx="457200" cy="201706"/>
<wp:effectExtent l="0" t="0" r="0" b="8255"/>
<wp:docPr id="2" name="图片 2"/>
<wp:cNvGraphicFramePr>
<a:graphicFrameLocks noChangeAspect="1"
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"/>
</wp:cNvGraphicFramePr>
<a:graphic
xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
<a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic
xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:nvPicPr>
<pic:cNvPr id="0" name="test.jpg"/>
<pic:cNvPicPr/>
</pic:nvPicPr>
<pic:blipFill>
<a:blip r:embed="rId1003" cstate="print">
<a:extLst>
<a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}">
<a14:useLocalDpi val="0"
xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main"/>
</a:ext>
</a:extLst>
</a:blip>
<a:stretch>
<a:fillRect/>
</a:stretch>
</pic:blipFill>
<pic:spPr>
<a:xfrm>
<a:off x="0" y="0"/>
<a:ext cx="465474" cy="205356"/>
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst/>
</a:prstGeom>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>

2 图片Base64 放的位置

1
2
3
<pkg:part pkg:name="/word/media/image3.jpeg" pkg:contentType="image/jpeg" pkg:compression="store">
<pkg:binaryData>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</pkg:binaryData>
</pkg:part>

3对应关系

1
2
3
<Relationships>
<Relationship Id="rId1003" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image3.jpeg"/>
</Relationships>

Java Calendar详解

发表于 2021-04-09
字数统计: 907 字 | 阅读时长 ≈ 4 min

一、Calendar类详解

Calendar 类是一个抽象类,它为特定时间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

1、使用Calendar类别之前,要先知道Calendar的一些方法取回的数字是对应于Calendar本身的常数,也就是说并不是取回1 这个数字,就表示今天是星期一。

a、想要取得时间,首先使用Calendar的getInstance()取得一个Calendar的实例,例如:
1
Calendar rightNow = Calendar.getInstance();
b、如果现在您想知道是几年,则可以使用get()方法并指定常数,例如:
1
2

System.out.println(rightNow.get(Calendar.YEAR));
c、如果是2005年,则上例会显示2005的数字,依照这个例子,假设撰写本文的时间是5月份,而现在想使用程式取得月份,则下例可能会有些困惑:
1
System.out.println(rightNow.get(Calendar.MONTH));
d、程式会显示4这个数字,而不是预期的5,因为传回的4并不是代表月份,而是对应于Calendar.MAY常数的值,Calendar在月份上的常数值从Calendar.JANUARY开始是0,到Calendar.DECEMBER的11,所以如果想要显示传回值的真正意涵,可以如下撰写:
1
2
3
String[] months = {"一月", "二月", "三月", "四月","五月", "六月", "七月", "八月","九月", "十月", "十一月", "十二月"};
Calendar rightNow = Calendar.getInstance();
System.out.println(months[rightNow.get(Calendar.MONTH)]);

2、初始值

代码如下,值得指出的是由于我们的时区设置是GMT+8,所以打印格林威治时间得到的是1970-01-01 08:00:00.

1
2
Calendar cal = Calendar.getInstance();//得到当前时间
cal.setTimeInMillis(0);//转换成格林威治时间

3、获取值

1
2
3
4
5
6
7
cal.get(Calendar.YEAR);//年
cal.get(Calendar.MONTH) + 1;//月(必须要+1)
cal.get(Calendar.DATE);//日
cal.get(Calendar.HOUR_OF_DAY);//时
cal.get(Calendar.MINUTE);//分
cal.get(Calendar.SECOND);//秒
cal.get(Calendar.DAY_OF_WEEK);//星期(Locale.ENGLISH情况下,周日是1,剩下自己推算)

如果拿时间不是为了计算而是展示出来,肯定用SimpleDateFormart了,模式为yyyy-MM-dd HH:mm:ss

4、设置值

1
2
3
4
5
6
7
cal.set(2013, 5, 4, 13, 44, 51);//年月日时分秒(月份0代表1月)
cal.set(Calendar.YEAR, 2014);//年
cal.set(Calendar.MONTH, 7);//月(月份0代表1月)
cal.set(Calendar.DATE, 11);//日
cal.set(Calendar.HOUR_OF_DAY, 15);//时
cal.set(Calendar.MINUTE, 33);//分
cal.set(Calendar.SECOND, 32);//秒

5、运算值

1
2
3
4
5
6
7
cal.add(Calendar.YEAR, 1);//年
cal.add(Calendar.MONTH, 1);//月
cal.add(Calendar.DATE, 1);//日
cal.add(Calendar.HOUR_OF_DAY, -1);//时
cal.add(Calendar.MINUTE, 1);//分
cal.add(Calendar.SECOND, 1);//秒
cal.add(Calendar.DATE, 7);//周

二、String Date Calendar之间的转换

1.Calendar 转化 String

1
2
3
Calendar calendat = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = sdf.format(calendar.getTime());

2.String 转化Calendar

1
2
3
4
5
String str="2012-5-27";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Date date =sdf.parse(str);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

3.Date 转化String

1
2
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
String dateStr=sdf.format(new Date());

4.String 转化Date

1
2
3
String str="2012-5-27";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Date date= sdf.parse(str);

5.Date 转化Calendar

1
2
Calendar calendar = Calendar.getInstance();
calendar.setTime(new java.util.Date());

6.Calendar转化Date

1
2
Calendar calendar = Calendar.getInstance();
java.util.Date date =calendar.getTime();

7.String 转成 Timestamp

1
Timestamp ts = Timestamp.valueOf("2012-1-14 08:11:00");

8.Date 转 TimeStamp

1
2
3
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time = df.format(new Date());
Timestamp ts = Timestamp.valueOf(time);

Docker安装docker-Compose并配置nginx

发表于 2021-04-01
字数统计: 832 字 | 阅读时长 ≈ 5 min

1 安装

目前有两种主流安装方式,笔者使用了第一种方式。

第一种
下载最新的docker-compose文件

下载完成后需要对/usr/local/bin/docker-compose目录进行赋权

1
curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose
1
chmod +x /usr/local/bin/docker-compose

测试结果

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost bin]# docker-compose --version
Unable to find image 'docker/compose:1.8.0' locally
1.8.0: Pulling from docker/compose
e110a4a17941: Pull complete
92120570534d: Pull complete
47d26c525b40: Pull complete
40a1d6f501ac: Pull complete
643031e197d8: Pull complete
0841ec069338: Pull complete
Digest: sha256:9bb1d2f141b4511b52dac37e5ea0aecadaf7786bc47184c133c566a4f678061d
Status: Downloaded newer image for docker/compose:1.8.0
docker-compose version 1.8.0, build f3628c7

卸载

1
rm /usr/local/bin/docker-compose

2 docker-compose 配置挂载 Volume 并运行 nginx

1.先在宿主机创建挂载目录:

1
mkdir -p /data/nginx2/{conf,conf.d,html,logs}

2.然后把nginx的配置文件 nginx.conf 文件放到 /data/nginx2/conf/

nginx.conf配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# nginx.conf配置文件如下
user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
worker_connections 1024;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

include /etc/nginx/conf.d/*.conf;
}

3.将使用的nginx子配置,配置文件 default.conf 放到 /data/nginx2/conf.d/

default.conf 配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# default.conf 配置文件如下 
server {
listen 80;
server_name localhost;

# rewrite ^(.*)$ https://www.vhxsl.com permanent;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

4.docker-compose 的配置nginx 的启动文件conpose-nginx.yml 放到/data/nginx2/

docker-compose.yml 配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#docker-compose.yml 配置文件如下 
version: "3"
services:
composeNginx:
image: nginx
ports:
- "8085:80"
volumes:
- /data/nginx2/html:/usr/share/nginx/html
- /data/nginx2/conf/nginx.conf:/etc/nginx/nginx.conf
- /data/nginx2/conf.d:/etc/nginx/conf.d
- /data/nginx2/logs:/var/log/nginx
restart: always
container_name: composeNginx

5.将一个 index.html 放到 /data/nginx2/html

index.html随便写都可以

1
aaaaaa

6.使用docker-compose 启动nginx

因为我们的yml文件不是docker-compose.yml,在进行服务排编是需要指定yml文件名称

1
docker-compose -f conpose-nginx.yml up -d

效果如下

1
2
3
4
5
6
7
8
9
10
11
12
[wjk@localhost nginx2]# docker-compose -f conpose-nginx.yml up -d
Creating network "root_default" with the default driver
Pulling composeNginx (nginx:latest)...
latest: Pulling from library/nginx
a076a628af6f: Pull complete
0732ab25fa22: Pull complete
d7f36f6fe38f: Pull complete
f72584a26f32: Pull complete
7125e4df9063: Pull complete
Digest: sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
Status: Downloaded newer image for nginx:latest
Creating composeNginx ... done

查看服务

1
2
3
[wjk@localhost nginx2]# docker ps 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78eb25c4b591 nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:8085->80/tcp composeNginx

在外部浏览器可以访问 http://ip:8085/

若报错:

1
2
3
[root@localhost nginx]# docker-compose -f conpose-nginx.yml up -d
ERROR: Version in "./conpose-nginx.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a version of "2" (or "2.0") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.
For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/

linux 版本过于旧了,需要在docker-compose.yml,修改verison值,之前是3.5,现改成2.0即可

在 SpringBoot中问题:No Qualifying Bean of Type [com.demo.dao.UseDao]

发表于 2021-03-27
字数统计: 241 字 | 阅读时长 ≈ 1 min

问题描述:

1
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.demo.dao.UseDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533) ... 24 more

总是提示无法注入Service或者Dao中的Bean!

后来经研究发现,SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!

“Application类”是指SpringBoot项目入口类。这个类的位置很关键:

如果Application类所在的包为:com.demo.module,则只会扫描com.demo.module包及其所有子包,如果service或dao所在包不在com.demo.module及其子包下,则不会被扫描!

所以需在application启动类中加上

1
2
@MapperScan("com.*.dao")//加上你项目的dao或service所在文件位置即可
@SpringBootApplication

Mybatis中使用时间字符进行比较遇到的问题

发表于 2021-03-27
字数统计: 1,350 字 | 阅读时长 ≈ 6 min

1 中使用时间的字符进行比较的时候遇到的两个问题

问题一:java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

实体类中属性

1
2
3
4
//入库日期
@DateTimeFormat(pattern="yyyy-MM-dd")
@JSONField(format="yyyy-MM-dd")
private Date inboundDate;

MySQL中

1
inbound_date datetime

mapper中属性映射的定义

1
<result column="inbound_date" javaType="java.util.Date" jdbcType="TIMESTAMP" property="inboundDate" />

mapper 中SQL语句

1
2
3
4
5
6
7
8
<select id="pages" resultMap="BaseResultMap" parameterType="com.wjikai.goodsacceptancerecord.GoodsAcceptanceRecord" >
select
<include refid="Base_Column_List" />
from goodsacceptancerecord
where 1 = 1
<if test="inboundDate != null and inboundDate !='' " >
and DATE_FORMAT(inbound_date, '%Y-%m-%d') = DATE_FORMAT(#{inboundDate}, '%Y-%m-%d')
</if>

然后执行查询方法dao.pages(GoodsAcceptanceRecord)的时候就报错

1
2
3
4
5
6
7
8
9
10
11
12
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
### Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:122)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
at com.sun.proxy.$Proxy0.selectByCreateTime(Unknown Source)
at mybatis.Test.buyerInfoTimeTest(Test.java:53)
at mybatis.Test.main(Test.java:39)

看样子是因为类型不符合, 但是想了想, Date类型对应MySQL的datetime, 以及mapper中jdbcType都没问题啊. 而且完全一样的东西在原工程中是完全正常的. 既然都是一样的代码

后来查询 这是mybatis 3.3.0中对于时间参数进行比较时的一个bug. 如果拿传入的时间类型参数与空字符串’’进行对比判断则会引发异常. 所以在上面的代码中去该该判断, 只保留非空判断就正常了

1
2
3
4
5
6
7
8
<select id="pages" resultMap="BaseResultMap" parameterType="com.wjikai.goodsacceptancerecord.GoodsAcceptanceRecord" >
select
<include refid="Base_Column_List" />
from goodsacceptancerecord
where 1 = 1
<if test="inboundDate != null " >
and DATE_FORMAT(inbound_date, '%Y-%m-%d') = DATE_FORMAT(#{inboundDate}, '%Y-%m-%d')
</if>

2 mysql Date类型与String类型转换

Mysql 时间转换用DATE_FORMAT(now(),’%y-%m-%d’) Oracle时间转换用to_char()

3 详解mysql 日期类型额如下:

1.Date  ——>  String

使用的函数:DATE_FORMAT(date,format)     date:需要转换的日期       format:格式化的样式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   format样式整理:

        年:  %Y  显示四位 : 2015            %y    只显示后两位  :15

        月:  %M 月份的英文显示:October %m  月份的阿拉伯显示:01-12  %b 月份的英文缩略显示:Oct  %c  月份的阿拉伯显示:1-12

        日:  %d 阿拉伯显示:00-31        %D 带有英文后缀:1st-31th     %e 阿拉伯显示:1-31          %j   年的天:001-366   

        时:  %H :00-23           %h:01-12        %I:01-12      %k:0-23      %l:1-12

        分:   %i:00-59

        秒:   %S:00-59        %s:00-59

        微妙: %f

        AM/PM:%p

        12小时制时间:%r:   02:02:44 PM

        24小时制时间: %T:  14:02:44

         周: %W:周的英文显示      %w 周的阿拉伯显示 :0(星期日)-6(星期六)  %a   周的英文缩略显示:Mon-

例:

1
2
3
DATE_FORMAT(now(),"%Y-%m-%d %T")   2015-09-01 17:10:52

DATE_FORMAT(now(),"%Y-%m-%d %H:%i:%s %p")     2015-09-01 17:10:52 PM

2.String ——>Date

2.1使用的函数:STR_TO_DATE(str,format)       str:字符形式的日期       format:格式化样式
例:

1
STR_TO_DATE('1992-04-12',"%Y-%m-%d")   输出:1992-04-12(日期形式)

    2.2直接用date(20170101)格式
例:

1
start_time BETWEEN date(20170603) AND date(20170604)

3.mysql的日期类型

mysql(5.5)所支持的日期时间类型有:DATETIME、 TIMESTAMP、DATE、TIME、YEAR。

几种类型比较如下:

日期时间类型 占用空间 日期格式 最小值 最大值 零值表示
DATETIME 8 bytes YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 9999-12-31 23:59:59 0000-00-00 00:00:00
TIMESTAMP 4 bytes YYYY-MM-DD HH:MM:SS 19700101080001 2038 年的某个时刻
DATE 4 bytes YYYY-MM-DD 1000-01-01 9999-12-31 0000-00-00
TIME 3 bytes HH:MM:SS -838:59:59 838:59:59 00:00:00
YEAR 1 bytes YYYY 1901 2155 0000
DATETIME

DATETIME 用于表示 年月日 时分秒,是 DATE 和 TIME 的组合,并且记录的年份(见上表)比较长久。如果实际应用中有这样的需求,就可以使用 DATETIME 类型。

TIMESTAMP

TIMESTAMP 用于表示 年月日 时分秒,但是记录的年份(见上表)比较短暂。

TIMESTAMP 和时区相关,更能反映当前时间。当插入日期时,会先转换为本地时区后再存放;当查询日期时,会将日期转换为本地时区后再显示。所以不同时区的人看到的同一时间是  不一样的。
表中的第一个 TIMESTAMP 列自动设置为系统时间(CURRENT_TIMESTAMP)。当插入或更新一行,但没有明确给 TIMESTAMP 列赋值,也会自动设置为当前系统时间。如果表中有第二个 TIMESTAMP 列,则默认值设置为0000-00-00 00:00:00。
TIMESTAMP 的属性受 Mysql 版本和服务器 SQLMode 的影响较大。

如果记录的日期需要让不同时区的人使用,最好使用 TIMESTAMP。

DATE

DATE 用于表示 年月日,如果实际应用值需要保存 年月日 就可以使用 DATE。

TIME

TIME 用于表示 时分秒,如果实际应用值需要保存 时分秒 就可以使用 TIME。

YEAR

YEAR 用于表示 年份,YEAR 有 2 位(最好使用4位)和 4 位格式的年。 默认是4位。如果实际应用只保存年份,那么用 1 bytes 保存 YEAR 类型完全可以。不但能够节约存储空间,还能提高表的操作效率。

在 SpringBoot中配置PageHelper分页

发表于 2021-03-20
字数统计: 340 字 | 阅读时长 ≈ 2 min

PageHelper是一个比较简单的分页插件,但是好些人在用的时候却无法生效了。

pom.xml 引入的mybatis 和 pagehelper 要匹配

1
2
3
4
5
6
7
8
9
10
11
12
<!-- mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- pagehelper 分页 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.9</version>
</dependency>

Mybatis的配置文件 MybatisConfig

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import com.github.pagehelper.PageHelper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Properties;

/**
* mybatis分页插件配置
*/
@Configuration
public class MybatisConfig {
@Bean
public PageHelper pageHelper(){
PageHelper pageHelper=new PageHelper();
Properties properties=new Properties();
//把这个设置为true,会带RowBounds第一个参数offset当成PageNum使用
properties.setProperty("offsetAsPageNum","true");
//设置为true时,使用RowBounds分页会进行count查询
properties.setProperty("rowBoundsWithCount","true");
properties.setProperty("reasonable","true");
pageHelper.setProperties(properties);
return pageHelper;
}
}

如果在使用注解配置的时候,需要加一个@Configuration 表示这个类是一个配置类,相当于Spring配置文件中的,再加上@Bean 进行Bean注入

然后再看看分页查询是不是在查询语句之前 

1
2
3
PageHelper.startPage(start, length,true );
List<GoodsAcceptanceRecord> list = this.service.pages(goodsAcceptanceRecord);
PageInfo<GoodsAcceptanceRecord> pageInfo = new PageInfo<>(list);

若发现查出来的还是全部数据。

然后选择刷一下缓存,删除编译的文件重新编译

在 SpringBoot 中设置允许跨域请求(包含Vue代码)

发表于 2021-03-08
字数统计: 838 字 | 阅读时长 ≈ 4 min

1.前言

HTML5 支持了 CORS 协议。CORS 是一个 W3C 标准,全称是”跨域资源共享”(Cross-origin resource sharing),允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。它通过服务器增加一个特殊的 Header[Access-Control-Allow-Origin]来告诉客户端跨域的限制,如果浏览器支持 CORS、并且判断 Origin 通过的话,就会允许 XMLHttpRequest 发起跨域请求。

前端使用了 CORS 协议,就需要后端设置支持非同源的请求,对于SpringBoot 对于CORS 同样有着良好的支持,
首先附上官网地址:
https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#boot-features-cors

2、后端增加代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.wangjikai.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
* 实现基本的跨域请求
* @author linhongcun
*
*/
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 允许任何域名使用
corsConfiguration.addAllowedHeader("*"); // 允许任何头
corsConfiguration.addAllowedMethod("*"); // 允许任何方法(post、get等)
return corsConfiguration;
}

@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); // 对接口配置跨域设置
return new CorsFilter(source);
}
}

3.前端重要代码

axios.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import Vue from "vue";
import axios from "axios";

// 响应时间
axios.defaults.timeout = 600 * 1000;
Vue.prototype.$axios = axios;
// 配置cookie
// axios.defaults.withCredentials = true
// 配置请求头
// axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'
// 静态资源
Vue.prototype.$static = "";
// 配置接口地址
//这里的接口地址是你地址的相同的前半部分,方便管理
// axios.defaults.baseURL = ''
// 发送请求
//post请求

if (process.env.NODE_ENV == "production") {

axios.defaults.baseURL = "";
//axios.defaults.baseURL = process.env.BASE_API;
} else {
//axios.defaults.baseURL = 'http://127.0.0.1:8088'
axios.defaults.baseURL = 'http://127.0.0.1:10002'
//axios.defaults.baseURL = "http://172.168.10.4:10002"
}

axios.interceptors.request.use(
config => {
try {
var userInfo = window.sessionStorage.getItem("userInfo");
if(userInfo){
let {loginname} = JSON.parse(userInfo)
config.headers.loginName = loginname
console.log("loginname",loginname);
console.log("config.headers",config.headers);
}
} catch (e) {
console.error(e)
}
return config
},
error => {
return Promise.reject(error)
}
)

export function post(url, params) {
return new Promise((resolve, reject) => {
// console.log(1)
// console.log()
axios
.post(axios.defaults.baseURL + url, params)
.then(
res => {
resolve(res.data);
},
err => {
reject(err.data);
}
)
.catch(err => {});
});
}
//get请求
export function get(url, params) {
return new Promise((resolve, reject) => {
axios
.get(axios.defaults.baseURL + url, {
params: params
})
.then(res => {
resolve(res.data);
})
.catch(err => {});
});
}
//get请求
export function exp(url, params) {
return new Promise((resolve, reject) => {
axios
.post(axios.defaults.baseURL + url, params, {
responseType: "blob"
})
.then(response => {
let fileName = window.decodeURI(
response.headers["content-disposition"].split("=")[1]
);
let link = document.createElement("a");
link.href = window.URL.createObjectURL(
new Blob([response.data], {
type:
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"
})
);
link.target = "_blank";
link.download = fileName;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
});
});
}
export function baseUrl() {
return axios.defaults.baseURL;
}

写请求的js
req.js

1
2
3
4
5
6
7
import {
get,
post
} from '../utils/axios'
export function getAll() {//表格数据
return get(`/getAll`)
}

页面使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<script>
import {
getAll
} from "@/api/warehouse";


export default {
methods: {
getList(){
getAll()
.then(res => {
console.log(res);
})
.catch(error => {
console.log(error);
});
}

},
}
</script>

Docker集群swarm安装和简单使用搭建nginx

发表于 2021-01-20
字数统计: 348 字 | 阅读时长 ≈ 2 min

docker安装swarm

操作的ip地址:192.168.0.200

1、下载swarm

下载swarm插件

1
docker pull swarm

2、安装swarm

1
docker swarm init --advertise-addr 192.168.0.200:2377 --listen-addr 192.168.0.200:2377

输出

1
2
3
4
5
6
7
8
[root@localhost ~]# docker swarm init --advertise-addr 192.168.0.200:2377 --listen-addr 192.168.0.200:2377
Swarm initialized: current node (r3a32j3o9gr964xoksyha2i8m) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-1f48vzkywen673g6fuj6xl9m6pq8niuizw3tm1b75zjt7ak8o6-7c87bf6qurrp3vrlpq6cysd82 192.168.43.49:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

3、将本机加入节点

1
docker swarm join-token manager

输出

1
2
3
[root@localhost ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1f48vzkywen673g6fuj6xl9m6pq8niuizw3tm1b75zjt7ak8o6-2ofub2vc7qteetwyi92d1krek 192.168.43.49:2377

用yml文件启动nginx

1、下载nginx

1
docker pull nginx:1.19.5

2、编写启动文件nginx.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@localhost nginx]# cat nginx.yml 
version: '3'

services:
nginx:
image: nginx:1.19.5
deploy:
replicas: 3
ports:
- "18081:80"
networks:
- net
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- net

networks:
net:

3.启动nginx

1
docker stack deploy --with-registry-auth -c nginx.yml rb

4.查看启动情况

1
docker stack services rb

输出

1
2
3
4
[root@localhost nginx]# docker stack services rb
ID NAME MODE REPLICAS IMAGE PORTS
0p33122t1wy5 rb_nginx replicated 3/3 nginx:1.19.5 *:18081->80/tcp
tyzq1h1cz0v0 rb_visualizer replicated 1/1 dockersamples/visualizer:stable *:8080->8080/tcp
1…242526…38

继开

一辈子很短,努力的做好两件事就好:第一件事是热爱生活,好好的去爱身边的人;第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱。

303 日志
171 标签
RSS
gitee E-Mail
0%
鲁ICP备18007712号
© 2025 继开 | 站点字数统计: 262.2k
博客使用 Hexo 搭建
|
主题 — NexT.Mist v5.1.4
人访问 次查看