继开 | 博客

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


  • 短诗的序

  • 迷途自渡

  • 寒星三两

  • 林深见鹿

  • 记昨日书

  • 顾探往昔

常用的U盘格式对比

发表于 2021-05-27
字数统计: 820 字 | 阅读时长 ≈ 3 min

常见格式一:FAT32

FAT32是windows传统的文件格式,突破FAT16对每个分区只有4GB的容量,是任何一种usb存储设备都会预装的文件系统。由于FAT32文件系统是用4个字节(32位)空间表示每个扇区的配置文件,所以才被成为FAT32。
FAT32格式的兼容性特别好,可以在不同的操作系统上进行读写,还能够兼容电视机,游戏机等大多数的数码产品,所以在默认情况下格式化U盘的时候都会选择FAT32这种文件系统,仅仅是出于兼容性的考虑。但是我们都知道,水可载舟亦可覆舟,FAT32的文件系统最大问题就是对于文件本身的大小有严格的限制,不支持4G以上的单个文件,同时最大仅支持2TB的硬盘。重点来了!!很多大型的游戏,镜像文件以及压缩包等都无法使用此格式!这样让那些经常储存游戏或者大容量文件的人怎么办。
总的来说:FAT32格式兼容性特别好,但任何文件只要超过4G就无法拷贝到U盘。

常见格式二:NTFS

NTFS是微软制定并且使用最广泛的硬盘格式系统,适用于所有windows版本。并且消除了FAT32的容量限制,支持超大容量文件,在安全性和稳定性方面更加出色,拥有数据保护和恢复,加密访问等高级技术。而且目前大多数电脑硬盘都是使用NTFS格式,所以我们对磁盘进行分区的时候首选NTFS分区类型。
虽然NTFS相较于FAT32来讲各种性能更加稳定,但我们不知道的隐情是,NTFS格式是为机械硬盘量身定做的,会详细记录硬盘的读写操作,但是闪存存储芯片(U盘)的读写次数并不是无限的,如果使用这种文件系统,意味着所有对U盘的操作都会被详细记录。文件虽小,但是大量的小文件读写也会增加闪存的负担,减短U盘的使用寿命,闪存表示实在伤不起啊。
总的来讲:NTFS格式支持超大容量文件和分区,但是会减短U盘的使用寿命。

常见格式三:exFAT

exFAT又称之为FAT64,是FAT32的替代品,是微软为闪存量身定制的。为什么这么说呢?因为它对文件的大小和分区限制很小,可以存储单个超过4G的文件,最大支持单文件1EB(1EB=1073741824 GB),适合存储超大容量文件,甚至还能在Windows和Mac进行读取和使用,是计算机和Mac上读写和使用usb闪存盘的理想选择,具有十分强大的跨平台能力,比NTFS的兼容性更加好。
总的来说:exFAT支持大容量文件,兼容性好并且具有强大的跨平台能够,能够在windows和Mac上进行使用,是U盘等移动设备的最佳选择。

Linux需要安装exFAT工具(针对Ubuntu14.04以上), 不需重启

1
sudo apt-get install exfat-utils

Linux链接远程mysql数据库

发表于 2021-05-14
字数统计: 166 字 | 阅读时长 ≈ 1 min

连接MYSQL:

1
格式: mysql -h主机地址 -u用户名 -p用户密码

连接到本机上的MYSQL

找到mysql的安装目录,一般可以直接键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中

了,MYSQL的提示符是:mysql>

连接到远程主机上的MYSQL

假设远程主机的IP为:10.0.0.1,用户名为root,密码为123。则键入以下命令:

mysql -h10.0.0.1 -uroot -p123

(注:u与root可以不用加空格,其它也一样)

退出MYSQL命令

exit (回车)

Mongo数据库的一些基本操作

发表于 2021-04-29
字数统计: 814 字 | 阅读时长 ≈ 3 min

选择数据库

创建一个数据mydb,若没有mydb数据库,则创建,如果有这个数据库则返回已经有的数据库

1
use mydb

登录数据库

使用用户mydb,密码password登录数据库

1
db.auth('mydb','password')

查看表

查看数据库下所有的表

1
show tables

查看表数据

查看tablename表的数据

1
db.tablename.find()

删除表

删除tablename表

1
db.tablename.drop()

##其他操作(未验证)

新建用户 db.createUser({user:”账号”,pwd:”密码”,roles:[{“role”:”userAdmin”,”db”:”admin”},{“role”:”root”,”db”:”admin”},{“role”:”userAdminAnyDatabase”,”db”:”admin”}]})

Read:允许用户读取指定数据库

readWrite:允许用户读写指定数据库

dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户

clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。

readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限

readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限

userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限

dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。

root:只在admin数据库中可用。超级账号,超级权限(本次创建的就是超级账号)

对账号授权:db.auth(“账号”,”密码”)

重启mongo 加上 –auth 参数

此时如不使用用户名密码登录,show dbs, 和 show tables 都无权限

使用账号密码登录:mongo -u admin -p 12345 localhost:27017/admin (该账户admin,虽然是admin库中的用户,但是具有所有数据库的权限:userAdminAnyDatabase)

新建用户 db.createUser({user:”账号”,pwd:”密码”,roles:[{“role”:”userAdmin”,”db”:”admin”},{“role”:”root”,”db”:”admin”},{“role”:”userAdminAnyDatabase”,”db”:”admin”}]})
Read:允许用户读取指定数据库

readWrite:允许用户读写指定数据库

dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile

userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户

clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。

readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限

readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限

userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限

dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。

root:只在admin数据库中可用。超级账号,超级权限(本次创建的就是超级账号)

对账号授权:db.auth(“账号”,”密码”)

重启mongo 加上 –auth 参数

此时如不使用用户名密码登录,show dbs, 和 show tables 都无权限

使用账号密码登录:mongo -u admin -p 12345 localhost:27017/admin (该账户admin,虽然是admin库中的用户,但是具有所有数据库的权限:userAdminAnyDatabase
)

Dockerswarm的基本操作,查看镜像启动到那个节点

发表于 2021-04-28
字数统计: 1,395 字 | 阅读时长 ≈ 6 min

查看服务启动到那个节点并且查询服务

1
2
3
4
5
docker service ls | grep mongo       #查询mongo的服务
docker service ps 服务id #查询mongo的服务启动到那个节点
#到服务启动的接点
docker ps | grep mongo #查询容器的id
docker logs -f 容器id #查询容器服务的日志

用yml启动服务

1
docker stack deploy --with-registry-auth --compose-file yml文件名 服务别名

docker swarm 的一些基本操作

1.管理配置文件

docker config

1
2
3
4
# 查看已创建配置文件
- docker config ls
# 将已有配置文件添加到docker配置文件中
- docker config create docker 配置文件名 本地配置文件

2.管理swarm节点

docker node

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看集群中的节点
- docker node ls
# 将manager角色降级为worker
- docker node demote 主机名
# 将worker角色升级为manager
- docker node promote 主机名
# 查看节点的详细信息,默认json格式
- docker node inspect 主机名
# 查看节点信息平铺格式
- docker node inspect --pretty 主机名
# 查看运行的一个或多个及节点任务数,默认当前节点
- docker node ps
# 从swarm中删除一个节点
- docker node rm 主机名
# 更新一个节点
- docker node update
# 对节点设置状态(“active”正常|“pause”暂停|“drain”排除自身work任务)
- docker node update --availability

3.管理敏感数据存储

docker secret

4.服务栈,栈的形式,一般作为编排使用,格式与docker compose相同。

docker stack

1
2
3
4
# 通过.yml文件指令部署
- docker stack deploy -c 文件名.yml 编排服务名
# 查看编排服务
- docker stack ls

5.作为集群的管理

docker swarm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 初始化一个swarm
- docker swarm init
# 指定初始化ip地址节点
- docker swarm init --advertise-addr 管理端IP地址
# 去除本地之外的所有管理器身份
- docker swarm init --force-new-cluster
# 将节点加入swarm集群,两种加入模式manager与worker
- docker swarm join
# 工作节点加入管理节点需要通过join-token认证
- docker swarm join-token
# 重新获取docker获取初始化命令
- docker swarm join-token worker
# 离开swarm
- docker swarm leave
# 对swarm集群更新配置
- docker swarm update

6.服务管理

docker service

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
# 创建一个服务
- docker service create
# 创建的副本数
- docker service create --replicas 副本数
# 指定容器名称
- docker service create --name 名字
# 每次容器与容器之间的更新时间间隔。
- docker service create --update-delay s秒
# 更新时同时并行更新数量,默认1
- docker service create --update-parallelism 个数
# 任务容器更新失败时的模式,(“pause”停止|”continue“继续),默认pause。
- docker service create --update-failure-action 类型
# 每次容器与容器之间的回滚时间间隔。
- docker service create --rollback-monitor 20s
# 回滚故障率如果小于百分比允许运行
- docker service create --rollback-max-failure-ratio .数值(列“.2”为%20)
# 添加网络
- docker service create --network 网络名
# 创建volume类型数据卷
- docker service create --mount type=volume,src=volume名称,dst=容器目录
# 创建bind读写目录挂载
- docker service create --mount type=bind,src=宿主目录,dst=容器目录
# 创建bind只读目录挂载
- docker service create --mount type=bind,src=宿主目录,dst=容器目录,readonly
# 创建dnsrr负载均衡模式
- docker service create --endpoint-mode dnsrr 服务名
# 创建docker配置文件到容器本地目录
- docker service create --config source=docker配置文件,target=配置文件路径
# 创建添加端口
- docker service create --publish 暴露端口:容器端口 服务名
# 查看服务详细信息,默认json格式
- docker service inspect
# 查看服务信息平铺形式
- docker service inspect --pretty 服务名
# 查看服务内输出
- docker service logs
# 列出服务
- docker service ls
# 列出服务任务信息
- docker service ps    
# 查看服务启动信息
- docker service ps 服务名
# 过滤只运行的任务信息
- docker service ps -f "desired-state=running" 服务名
# 删除服务
- docker service rm
# 缩容扩容服务
- docker service scale
# 扩展服务容器副本数量
- docker service scale 服务名=副本数
# 更新服务相关配置
- docker service update
# 容器加入指令
- docker service update --args “指令” 服务名
# 更新服务容器版本
- docker service update --image 更新版本 服务名
# 回滚服务容器版本
- docker service update --rollback 回滚服务名
# 添加容器网络
- docker service update --network-add 网络名 服务名
# 删除容器网络
- docker service update --network-rm 网络名 服务名
# 服务添加暴露端口
- docker service update --publish-add 暴露端口:容器端口 服务名
# 移除暴露端口
- docker service update --publish-rm 暴露端口:容器端口 服务名
# 修改负载均衡模式为dnsrr
- docker service update --endpoint-mode dnsrr 服务名
# 添加新的配置文件到容器内
- docker service update --config-add 配置文件名称,target=/../容器内配置文件名 服务名
使用方法
---更新配置文件----

# 1创建配置文件
docker config create nginx2_config nginx2.conf
# 2删除旧配置文件
docker service update --config-rm ce_nginx_config 服务名
# 3添加新配置文件到服务
ocker service update --config-add src=nginx2_config,target=/etc/nginx/nginx.conf ce_nginx
# 删除配置文件
- docker service update --config-rm 配置文件名称 服务名
# 强制重启服务
- docker service update --force 服务名

Npm Run Build无法打包的可能原因

发表于 2021-04-21
字数统计: 162 字 | 阅读时长 ≈ 1 min

npm run build报错

结果报错npm ERR! missing script: build,后来发现package.json中scripts参数为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"scripts": {
"dev": "vue-cli-service serve",

"build:prod": "vue-cli-service build", #这里!!!

"build:stage": "vue-cli-service build --mode staging",

"preview": "node build/index.js --preview",

"lint": "eslint --ext .js,.vue src",

"test:unit": "jest --clearCache && vue-cli-service test:unit",

"test:ci": "npm run lint && npm run test:unit",

"svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml"

},

 

 

所以正确的命令应该为

1
npm run build:prod --report

注意

还有就是注意node 的版本,现在node支持npm的版本最高是12,注意不要使用超过node12版本的环境进行打包

钉钉获取打卡数据的操作类

发表于 2021-04-20
字数统计: 1,765 字 | 阅读时长 ≈ 10 min

pom.xml

1
2
3
4
5
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>alibaba-dingtalk-service-sdk</artifactId>
<version>2.0.0</version>
</dependency>

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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
 


/**
* 钉钉类
*
*/
@Component
public class DingdingUtil {

// 应用的appKey
private static String appKey = "";
// 应用的appSecret
private static String appSecret = "";
// access_token url
private static String accessTokenUrl = "https://oapi.dingtalk.com/gettoken";
// 考勤记录 url
private static String attendanceUrl = "https://oapi.dingtalk.com/attendance/list";

// 部门 url
private static String departmentUrl = "https://oapi.dingtalk.com/department/list";
// 员工 url
private static String userUrl = "https://oapi.dingtalk.com/user/listbypage";

@Autowired
private RedisUtils redisUtils;

/**
* 通过调用接口获取access_token
* @return String
* 2022/03/08 09:30
*/
public String getAccessToken() {
String token = (String) redisUtils.get(CacheKey.DINGDING_TOKEN);
if (ToolUtil.isEmpty(token)) {
DingTalkClient client = new DefaultDingTalkClient(accessTokenUrl);
OapiGettokenRequest request = new OapiGettokenRequest();
request.setAppkey(appKey);
request.setAppsecret(appSecret);
request.setHttpMethod("GET");
OapiGettokenResponse response = null;
try {
response = client.execute(request);
} catch (ApiException e) {
e.printStackTrace();
}
token = response.getAccessToken();
if (ToolUtil.isNotEmpty(token)) {
redisUtils.set(CacheKey.DINGDING_TOKEN, token,7200);
}
}
return token;
// DingTalkClient client = new DefaultDingTalkClient(accessTokenUrl);
// OapiGettokenRequest request = new OapiGettokenRequest();
// request.setAppkey(appKey);
// request.setAppsecret(appSecret);
// request.setHttpMethod("GET");
// OapiGettokenResponse response = null;
// try {
// response = client.execute(request);
// } catch (ApiException e) {
// e.printStackTrace();
// }
// return response.getAccessToken();
}

/**
* 获取 部门信息,
*/
public OapiDepartmentListResponse getDepartmentList(){
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/list");
OapiDepartmentListRequest req = new OapiDepartmentListRequest();
req.setFetchChild(true);
//req.setId("1");
req.setId("529205900");
req.setHttpMethod("GET");
String token = getAccessToken();
OapiDepartmentListResponse rsp = null;
try {
rsp = client.execute(req, token);
} catch (ApiException e) {
e.printStackTrace();
}
return rsp;

}



/**
* 获取 人员信息,
* @return OapiAttendanceListResponse
*/
public OapiUserSimplelistResponse getEmpList(Long deptid,Long offset,Long size){
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/listbypage");
OapiUserSimplelistRequest req = new OapiUserSimplelistRequest();
req.setDepartmentId(deptid);
req.setOffset(offset);
req.setSize(size);
req.setHttpMethod("GET");
String token = getAccessToken();
OapiUserSimplelistResponse rsp = null;
try {
rsp = client.execute(req, token);
} catch (ApiException e) {
e.printStackTrace();
}
return rsp;
}



/**
* 获取 人员信息,化简版,只传部门id
* @return OapiAttendanceListResponse
* 2022-04-14
*/
public OapiUserSimplelistResponse getEmpSimpleList(Long deptid){
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/simplelist");
OapiUserSimplelistRequest req = new OapiUserSimplelistRequest();
req.setDepartmentId(deptid);
req.setHttpMethod("GET");
String token = getAccessToken();
OapiUserSimplelistResponse rsp = null;
try {
rsp = client.execute(req, token);
} catch (ApiException e) {
e.printStackTrace();
}
return rsp;
}


// 7100704, 工作时长
// 7100705, 迟到次数
// 7100706, 迟到时长
// 7100710, 早退次数
// 7100711, 早退时长
// 7100724, 第一次打卡时间
// 7100726, 第二次打卡时间
// 7100728, 第三次打卡时间
// 7100730, 第四次打卡时间
// 7100732, 第五次打卡时间
// 7100734, 第六次打卡时间
// 7100736, 关联表单日期及详情
// 7100701, 出勤班次
// 7100715, 出差时长
// 7100716, 外出时长
// 7100723, 班次
private static final String COLS="7100704,7100705,7100706,7100710,7100711,7100724,7100726,7100728,7100730,7100732,7100734,7100736,7100701,7100715,7100716,7100723";



/**
* 获取 人员考勤信息
* @param userId
* @param from
* @param to
* @return OapiAttendanceListResponse
*/

public OapiAttendanceGetcolumnvalResponse getColumnvalList(String userId, String from, String to) {

// 获取access_token
String access_token = getAccessToken();
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval");
OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest();
req.setUserid(userId);
req.setColumnIdList(COLS);
req.setFromDate(StringUtils.parseDateTime(from +" 00:00:00"));
req.setToDate(StringUtils.parseDateTime(to + " 23:59:59"));
OapiAttendanceGetcolumnvalResponse response = null;
try {
response = client.execute(req, access_token);

} catch (ApiException e) {
e.printStackTrace();
}
return response;
}

/**
* 判断是否有打卡结果
* @return OapiAttendanceListResponse
* 2022/03/08 09:45
*/
public OapiAttendanceListResponse getAttendanceList(String from, String to, String userId) {
// 获取access_token
String access_token = getAccessToken();
// 通过调用接口获取考勤打卡结果
DingTalkClient clientDingTalkClient = new DefaultDingTalkClient(attendanceUrl);
OapiAttendanceListRequest requestAttendanceListRequest = new OapiAttendanceListRequest();
// 查询考勤打卡记录的起始工作日
requestAttendanceListRequest.setWorkDateFrom(from);
// 查询考勤打卡记录的结束工作日
requestAttendanceListRequest.setWorkDateTo(to);
// 员工在企业内的userid列表,最多不能超过50个。
requestAttendanceListRequest.setUserIdList(Arrays.asList(userId));
// 表示获取考勤数据的起始点
requestAttendanceListRequest.setOffset(0L);
// 表示获取考勤数据的条数,最大不能超过50条。
requestAttendanceListRequest.setLimit(50L);
OapiAttendanceListResponse response = null;
try {
response = clientDingTalkClient.execute(requestAttendanceListRequest, access_token);
} catch (ApiException e) {
e.printStackTrace();
}
return response;
}

public Boolean deleteEmp(String userId) {
// 获取access_token
String access_token = getAccessToken();
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/delete");
OapiUserDeleteRequest req = new OapiUserDeleteRequest();
req.setUserid(userId);
Boolean ret = false;
try {
OapiUserDeleteResponse rsp = client.execute(req, access_token);
if (rsp.getErrcode() == 0) {
ret = true;
}
} catch (ApiException e) {
e.printStackTrace();
}
return ret;
}

public HashMap<String, Object> deleteEmps(List<String> list) {
List<String> result = new ArrayList<>();
HashMap<String, Object> map = new HashMap<>();
if (list.size() > 0) {
for (String id : list) {
if (!deleteEmp(id)) {
result.add(id);
}
}
}
if (result.size() > 0) {
map.put("code", 1);
} else {
map.put("code", 0);
}
map.put("data", result);
return map;
}

public OapiAttendanceGetcolumnvalResponse.ColumnValListForTopVo getColumnval(String userId, String from, String to) {
// 获取access_token
String access_token = getAccessToken();
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval");
OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest();
req.setUserid(userId);
// 7100724 上班1打卡时间 7100726 下班1打卡时间 7100728 上班2打卡时间 7100730 下班2打卡时间 7100732 上班3打卡时间 7100734 下班3打卡时间7100736 关联的审批单
req.setColumnIdList("7100724,7100726,7100728,7100730,7100732,7100734,7100736");
req.setFromDate(StringUtils.parseDateTime(from));
req.setToDate(StringUtils.parseDateTime(to));
OapiAttendanceGetcolumnvalResponse response = null;
OapiAttendanceGetcolumnvalResponse.ColumnValListForTopVo ret = null;
try {
response = client.execute(req, access_token);
if (response.isSuccess()) {
ret = response.getResult();
}
} catch (ApiException e) {
e.printStackTrace();
}
return ret;
}
/**
* 昨日某个员工打卡记录
* @return List
* 2022/03/08 11:00
*/
public List getRecordByUserId(String userId) {
String yestoday = DingdingUtil.getYestoday();
String from = yestoday + " 00:00:00";
String to = yestoday + " 23:59:59";
List<OapiAttendanceListResponse.Recordresult> list = new ArrayList();
OapiAttendanceListResponse attendanceListResponse = getAttendanceList(from, to, userId);
if (attendanceListResponse.isSuccess() && attendanceListResponse.getRecordresult().size() > 0) {
list = attendanceListResponse.getRecordresult();
}
return list;
}

/*时间函数*/
public static String getPastDate(int past) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
Date today = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
String result = format.format(today);
return result;
}

/**
* 昨日日期
*
* @return
*/

public static String getYestoday() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
String yesterday = new SimpleDateFormat( "yyyy-MM-dd").format(cal.getTime());
return yesterday;
}

/**
* 获取上午下午
*
* @param seconds
* @return
*/
public static String timestamp2A(Long seconds) {
SimpleDateFormat sdf = new SimpleDateFormat("a");
return sdf.format(new Date(seconds));
}

/**
* 获取年
*
* @return
*/
public static String getYear() {
SimpleDateFormat format = new SimpleDateFormat("yyyy");
Date date = new Date();
return format.format(date);
}

/**
* 时间戳转换成时间格式字符串
*
* @param seconds
* @return
*/
public static String timestamp2Time(Long seconds) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
return sdf.format(new Date(seconds));
}

/**
* 时间戳转换成日期格式字符串
*
* @param strDate
* @return
*/
public static Date strToDate(String strDate) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
ParsePosition pos = new ParsePosition(0);
Date strtodate = formatter.parse(strDate, pos);
return strtodate;
}

public static String dateToHms(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date);
}

/*时间函数*/
}


//"dingvvrsivpeg6bqm4qb";
//"wly_IoMnP0QXZzaWh-NiSOUxZJgpmDzZeKyy6LPQMktm9iO65RfO14LVYUliokL-";


// OapiDepartmentListResponse rsp = dingdingUtil.getDepartmentList();
// Map map = (Map) JSON.parse(rsp.getBody());
// Integer errcode= (Integer) map.get("errcode");
// List<DgdDingdingDayDept> deptList=new ArrayList<DgdDingdingDayDept>();
// if(errcode==0){
// List departments= (List) map.get("department");
// }

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

Docker不指定网络驱动时默认创建的bridge网络

发表于 2021-04-14
字数统计: 268 字 | 阅读时长 ≈ 1 min

常用命令:创建查看删除

不指定网络驱动时默认创建的bridge网络

1
docker network create --subnet=172.100.0.0/16 test-net

注:test-net为自定义网桥的名字,可自己任意取名。

注:这里选取了172.100.0.0网段,可自己指定其他任意空闲的网段。

查看网络内部信息

1
docker network inspect test-net

列所有列表的网络

1
docker network  ls

移除指定的网络

1
docker network rm test-net

docker 容器启动指定ip

分配IP地址

1
docker run -d --name myNginx -it --net test-net --ip 172.100.0.2 nginx -->分配固定ip

–net   使用网段的名字

–ip   使用哪一个ip

注:172.100.0.1 是网段的网关地址,是不能用的

docker-compose 容器启动指定ip

docker-compose.yml 配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '2'
services:
nginx:
image: nginx:1.13.12
container_name: nginx
restart: always
tty: true
networks:
test-net:
ipv4_address: 172.100.0.2
networks:
test-net:
external: true

重点 在services同级生命外部网络

1
2
3
networks:
test-net:
external: true

在SpringBoot中的时区问题处理

发表于 2021-04-11
字数统计: 170 字 | 阅读时长 ≈ 1 min

将时区设置为东八时区

1数据库链接

在application.properties中配置MySQL 数据链接配置serverTimezone=GMT%2B8

1
spring.datasource.db.jdbc-url=jdbc:mysql://127.0.0.1:3306/database?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=true

2 启动类添加 TimeZone.setDefault(TimeZone.getTimeZone(“GMT+8”));

1
2
3
4
5
6
7
8
9
10
11
12
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

@PostConstruct
void started() {
// 设置用户时区为 UTC
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
}

}

3 处理类中的时间配置 @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”,timezone=”GMT+8”)

1
2
3
4
5
//入库日期
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@JSONField(format="yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date updateTime;
1…232425…38

继开

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

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