-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathmadaoo.sql
More file actions
1356 lines (1323 loc) · 430 KB
/
madaoo.sql
File metadata and controls
1356 lines (1323 loc) · 430 KB
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
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
Navicat Premium Data Transfer
Source Server : bj-cdb-b50en7ie.sql.tencentcdb.com
Source Server Type : MySQL
Source Server Version : 50718
Source Host : bj-cdb-b50en7ie.sql.tencentcdb.com:60895
Source Schema : madaoo
Target Server Type : MySQL
Target Server Version : 50718
File Encoding : 65001
Date: 26/07/2021 11:37:16
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for ar_article
-- ----------------------------
DROP TABLE IF EXISTS `ar_article`;
CREATE TABLE `ar_article` (
`id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`create_at` bigint(20) NULL DEFAULT NULL,
`update_at` bigint(20) NULL DEFAULT NULL,
`comment` int(11) NULL DEFAULT NULL,
`content` text CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`description` varchar(500) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`importance` float NULL DEFAULT NULL,
`is_public` bit(1) NULL DEFAULT NULL,
`is_top` bit(1) NULL DEFAULT NULL,
`keywords` varchar(200) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`origin` int(11) NOT NULL,
`review_state` int(11) NULL DEFAULT NULL,
`thumb` varchar(200) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`title` varchar(50) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`type` int(11) NULL DEFAULT NULL,
`upvote` int(11) NULL DEFAULT NULL,
`url` varchar(200) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`user_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`visits` int(11) NULL DEFAULT NULL,
`category_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `article_keywords`(`keywords`(191)) USING BTREE,
INDEX `article_title`(`title`) USING BTREE,
INDEX `article_create_at`(`create_at`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf16 COLLATE = utf16_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of ar_article
-- ----------------------------
INSERT INTO `ar_article` VALUES ('1238640274759094272', 1584178628978, 1587804880130, 0, '我们来扒一扒国外的,大多都是比较好玩的网站。也有非常奇葩的,如鳗鱼网站、无聊网站聚集地。部分网站用IE9以下的浏览器访问会有错误,不建议使用。网站无需翻墙。\n\n1、千人在线联机版炸弹人 http://bombermine.com/(国外)\n\n游戏本身就不多说了,网站是html5又一经典力作,实现了千人在线联机FC炸弹人游戏,场景相当恢宏,画面采用精致的8位图像,操作也很灵活,如果你的lag给力的话,杀个老外片甲不留也不是不可能。。。\n\n2、国外用HTML5做的打飞机游戏 http://phoboslab.org/xtype (国外)\n\nX-type是一个采用了html5标准的打飞机小游戏,画面、音效方面都很精致。由于采用了html5标准,IE9.0以下浏览器无法正常访问,推荐大家用chrome浏览器访问。游戏操作很简单,W、S、A、D或方向键控制飞机移动,鼠标控制射击与射击方位、ESC键暂停。手机也能玩呦!\n\n3、丧失来了你们会怎样安排自己的背包呢? http://innawoods.net(国外)\n\nInnawoods是一款DIY军事类装扮小游戏,游戏中有近千种武器、装备、医疗用品等。想象一下,如果现在全球生化危机爆发,街上到处都是丧尸,想让自己活下去,你会怎么安排背包呢?\n\n4、无聊网站聚集地 http://www.theuselessweb.com (国外)\n\nThe Useless Web收集了大量来自世界各地的无聊网站。用户每点击一次PLEASE按钮,就会为你随机挑选一个无聊网站。虽然这种行为看起来挺无聊的,不过其中可能有部分网站还是会让你感到异常得新奇好玩。\n\n5、最奇葩的网站 没有之一 http://www.staggeringbeauty.com(国外)\n\nStaggering Beauty真是一个着实令人蛋疼的奇葩网站,进入网站后会看到一个黑色的鳗鱼形像,晃动鼠标后此货也随之晃动。但剧烈晃动鼠标后就会有出现鬼畜般的画面和声音,另类之极。\n\n6、独具创意的罩杯美女演奏 http://www.cupsizechoir.com/?k=1(国外)\n\nthe Cup Size Choir是由加拿大某著名内衣品牌推出的有趣网页,七位身着性感内衣的美女躺在白色的床垫上,摆出各种撩人的姿势,七位美女的罩杯为A-G,也对应着七个音阶。\n\n7、在线组装你的专属枪械 http://pimpmygun.doctornoob.com(国外)\n\nPimp My Gun是一个军事迷们必须收藏的网站,它可以让我们DIY各种主流或独一无二枪械,网站的特色是通过把枪械零件用2D矢量图案保存为一个个单独部件,只需要用移动、旋转、缩放三种操作即可组合出独一无二的枪械.....进入网页后 点击最上面的PLAY就可以了\n\n8、毁童年版坦克大战 http://juleswang.github.io/BattleCity.AI(国外)\n\n还记得那些年和小伙伴一起玩过的坦克大战(Battle City)吗?现在就可以重温经典,但你的对手不再是当初那蠢蠢的坦克了,而会是拥有超高智商的敌人(我和小伙伴都惊呆了!),准备接受挑战吧!\n\n9、制作出只属于你的Q版头像 http://www.faceyourmanga.com(国外)\n\nFace Your Manga是一个在线生成Q版头像的网站,无需申请帐号,进入网站后点击左上方的CREATE! 就可以开始免费使用这项服务。自由度相当高,别怕会和其他人“撞头”,赶快做出只属于你自己的的Q版形象吧!创建完毕后填写你的邮箱地址,Face Your Manga 会将头像发送到你的邮箱。\n\n10、预测你死亡时间的网站 http://www.deathclock.com(国外)\n\n死亡时钟(The Death Clock)只需简单地输入几个相关信息,如出生日期,选择性别、BMI范围等,就可以测算出你的死期。游戏仅为娱乐,切勿当真,生命易逝,请珍惜时间,珍惜生命!\n\n11、美到一塌糊涂超梦幻涂鸦 http://new.weavesilk.com(国外)\n\nSilk 是一个独具匠心的绘画网页,它告诉我们关于对称的美丽传说,伴着梦境般的音乐,你可以在网页上绘出唯美的绚彩效果,不用担心你画得不好,因为网站默认是对称模式,无论怎么画都漂亮,还不试试!\n\n12、手机与电脑神同步的小游戏 http://chrome.com/supersyncsports/(国外)\n\n这是一个极具创意的小游戏,你可以完全体验到智能手机与PC之间的互动,将手机变成手柄是那么的简单,再找上几个基友一起玩,场面虽然二了点,但那种惬意,不玩是感受不到的。\n\n13、非常有意思的多人协作游戏 http://cn.transformice.com(国外)\n\nTransformice译为搬运鼠,是一款来自于法国Atelier 801公司出品并运营的Flash多人在线合作网页游戏。因其多元化的娱乐模式,此游戏于一经推出便风靡欧美国家。游戏内容很简单,就是在一定时间内,用你扮演的小老鼠完成偷取奶酪的任务,当然,过程可不是那么容易的,各式各样、五花八门的关卡绝对让你挠破头皮,而有些关卡是需要协作完成的。\n\n14、twitter上最火的gif图 http://www.gifhell.com(国外)\n\n大家都知道在我们国内是无法访问到twitter的,但很多人又特别想知道在twitter上每天都会发生什么.gif hell会实时展示twitter上面被分享过的GIF图片,大多都是新鲜出炉,有搞笑的、明星的、恶搞的,网站还提供TOP排行,让你知道这些日子在twitter最火的什么。\n\n15、全球随机匹配聊天 http://www.omegle.com(国外)\n\nOmegle 是一个很有趣的全球速配匿名聊天网站,不用注册,不用下载,只要进入网站点击“开始聊天”,系统就会为你随机匹配一个在线网友,而这位网友可能来自全球的任何一个地方。\n\n16、完爆CF的网页3D FPS射击游戏!http://www.nplay.com/BeGone(国外)\n\n相信大家都玩过经典的CS射击游戏吧?下面为大家介绍一款画质超赞的3D第一人称射击类(FPS)免费网页游戏——《Begone》(中文暂译为走开或滚开),号称是网页版的CS!\n\n17、给你的朋友发封恶搞邮件吧 http://www.hairy-mail.com(国外)\n\nHairy Mail是一个名副其实的flash恶搞网站,你可以在一个长满体毛的男人背上用除毛膏写字,想象一下,会有什么结果呢?完成你的恶搞作品后可以用邮件发送给你的朋友,怎么样,你是不是已经猜到对方的表情了呢。\n\n18、一画换一画,你换到了什么? http://www.sketchswap.com(国外)\n\n进入网站,在空白的“画板”上信手涂鸦后提交,就有一幅可能来自世界各地网友的神秘画作跟你交换,看着笔画的起落,小小的惊喜。\n\n19、给你水+火+土,你能创造什么 http://littlealchemy.com(国外)\n\n这是一个很长姿势的小游戏,可爱的元素图标,清新的界面,独特的创意,在这个世界了,你可以发挥天马行空的想象力来完成炼金任务 ,将两个你认为会起到“化学反应”的两个元素放在一起,生成一个全新的元素。\n\n20、无限延续的MJ太空步 http://www.eternalmoonwalk.com(国外)\n\n了纪念迈克尔.杰克逊和他独创的太空步,国外专门制作了一个名叫Eternal Moonwalk的网站。在网站中,我们可以把自己录制的模仿MJ太空步视频上传到网站,系统就会将所有视频随机自动连接成动画连续播放,并且还有一个虚拟的行动路程计数器,让大家一起努力把MJ的太空步无限延续下去。\n\n21、宇宙的刻度 http://m.wanga.me/2013/04/Scale2.swf(国外)\n\n“从普朗克常量到整个宇宙,人类在宇宙中既是渺小的、又是巨大的。” ——《The Scale of the Universe 2(宇宙的刻度2)》,一个震撼人心灵的科普神作。它将带你认识这个宇宙,小到显微镜看不到的东西,大到望远镜无法观望的宇宙。操作很简单,用鼠标滚轮放大或缩小,点击物体可查看详细说明。\n\n22、看看你的体重相当于啥?http://www.weightandthings.com(国外)\n\n可以你的体重换算某些物品的国外网站 - Weight And Things,让你更直观的了解你的体重,也更直观地去感受自己。\n\n23、看看你在全球的收入排名 http://www.globalrichlist.com(国外)\n\nGlobalrichlist顾名思义,这是一个提供全球富豪排行的地方,不过其主要的功能是,你可以查看你的收入在全球排名在多少位。在网站页面中可以选择货币单位,有美元、欧元、英镑、日元等等可选,将自己的年薪换算成美元或英镑,输入你的年收入后点击按钮,就能知道你的收入在全球排名在多少位。\n\n24、生成草泥马字体 http://llamafont.com(国外)\n\nlama font是一个在线生成的搞笑草泥马字体的网站,进入网站后在输入框里输入文字(不支持中文)点击Save it即可生成短链。\n\n分享:', '24个有趣的网站', 0, b'0', b'0', NULL, 0, 0, 'https://static-admin.madaoo.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202019-12-21%2009.35.30%20PM.png', '扒一扒国外的24个有趣的网站', 1, 2, NULL, '1234533425', 0, '1');
INSERT INTO `ar_article` VALUES ('1254031401452441600', 1587819359536, 1587819470276, 0, '今天无意发现一个有趣的小游戏,玩了一下感觉挺不错的。\n\n作者是**Bruno Simon**,\n[在线试玩](https://bruno-simon.com/)\n[Github地址](https://github.com/brunosimon)\n\n当你开始游戏后往右下角走一点会看到作者的作品系列,作者做成广告牌的方式在页面展示,作者挺有创意的\n\n\n\n', '在线3D', 0, b'0', b'0', NULL, 0, 0, 'https://static-admin.madaoo.com/3d.png', '发现一个好玩的网站', 1, 6, NULL, '1234533425', 0, '4');
INSERT INTO `ar_article` VALUES ('1256240408762126336', 1620014827921, 1620014827921, 0, '\n## 策略模式是什么\n使用策略模式优化你的If else\n**定义**:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。\n\n**分类**:行为类模式\n\n**类图**:\n\n\n\n策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换。在前面说过的行为类模式中,有一种模式也是关注对算法的封装——模版方法模式,对照类图可以看到,策略模式与模版方法模式的区别仅仅是多了一个单独的封装类Context,它与模版方法模式的区别在于:在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中,抽象策略Strategy一般是一个接口,目的只是为了定义规范,里面一般不包含逻辑。其实,这只是通用实现,而在实际编程中,因为各个具体策略实现类之间难免存在一些相同的逻辑,为了避免重复的代码,我们常常使用抽象类来担任Strategy的角色,在里面封装公共的代码,因此,在很多应用的场景中,在策略模式中一般会看到模版方法模式的影子。\n\n\n### 策略模式的结构\n\n* 封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。\n* 抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。\n* 具体策略:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要自由替换。\n\n### 策略模式代码实现\n\n```\ninterface IStrategy {\n void doSomething(String par);\n}\nclass CaseOneStrategy implements IStrategy {\n public void doSomething(String par) {\n System.out.println(\"具体策略:\"+par);\n }\n}\nclass CaseTwoStrategy implements IStrategy {\n public void doSomething(String par) {\n System.out.println(\"具体策略:\"+par);\n }\n}\nclass Context {\n private IStrategy strategy;\n\n public Context(IStrategy strategy){\n this.strategy = strategy;\n }\n\n public void execute(String par){\n strategy.doSomething(par);\n }\n}\n\npublic class Client {\n public static void main(String[] args){\n Context context;\n context = new Context(new CaseOneStrategy());\n context.execute(\"1\");\n\n context = new Context(new CaseTwoStrategy());\n context.execute(\"2\");\n }\n}\n\n```\n\n### java8方式实现策略模式\n业务复杂的不建议使用\n```\n\n@FunctionalInterface\ninterface IStrategy {\n void doSomething(String par);\n}\nclass Context {\n private IStrategy strategy;\n\n public Context(IStrategy strategy){\n this.strategy = strategy;\n }\n\n public void execute(String par){\n strategy.doSomething(par);\n }\n}\n\npublic class Client {\n public static void main(String[] args){\n Context context;\n context = new Context((String pre) -> System.out.println(\"具体策略:\"+pre));\n context.execute(\"1\");\n\n context = new Context((String pre) -> System.out.println(\"具体策略:\"+pre));\n context.execute(\"2\");\n }\n}\n\n```\n\n### 实际应用\n上面的简单案例最终还是要判断选择不同的类型,那么能不能真正去除if判断,直接加载指定策略?\n\n参考如下场景:前端发送验证码场景,根据不同类型发送手机验证码或者图片验证码,发送手机验证码=sms,图片验证码=captcha\n```\n// 加载所有策略,key为sms或者captcha+Strategy,获取指定策略,这样就不需要Context封装类了。\n@Autowired\nMap<String, IStrategy> iStrategy\n\n// 根据前端传入sms,xxx查找策略\nxxxutil.findxxxProcessor(\"sms或者xxx\").execute();\n\n```\n篇幅限制,详情[参考](https://github.com/GuoGuang/codeway_service/blob/develop/codeway-authentication-server/src/main/java/com/codeway/auth/validate)\n\n\n\n### 策略模式的优缺点\n> 策略模式的主要优点:\n\n* 策略类之间可以自由切换,由于策略类实现自同一个抽象,所以他们之间可以自由切换。\n* 易于扩展,增加一个新的策略对策略模式来说非常容易,基本上可以在不改变原有代码的基础上进行扩展。\n* 避免使用多重条件,如果不使用策略模式,对于所有的算法,必须使用条件语句进行连接,通过条件判断来决定使用哪一种算法,在上一篇文章中我们已经提到,使用多重条件判断是非常不容易维护的。\n\n> 策略模式的缺点主要有两个:\n\n* 维护各个策略类会给开发带来额外开销,可能大家在这方面都有经验:一般来说,策略类的数量超过5个,就比较令人头疼了。\n* 必须对客户端(调用者)暴露所有的策略类,因为使用哪种策略是由客户端来决定的,因此,客户端应该知道有什么策略,并且了解各种策略之间的区别,否则,后果很严重。例如,有一个排序算法的策略模式,提供了快速排序、冒泡排序、选择排序这三种算法,客户端在使用这些算法之前,是不是先要明白这三种算法的适用情况?再比如,客户端要使用一个容器,有链表实现的,也有数组实现的,客户端是不是也要明白链表和数组有什么区别?就这一点来说是有悖于迪米特法则的。\n \n\n### 适用场景\n做面向对象设计的,对策略模式一定很熟悉,因为它实质上就是面向对象中的继承和多态,在看完策略模式的通用代码后,我想,即使之前从来没有听说过策略模式,在开发过程中也一定使用过它吧?至少在在以下两种情况下,大家可以考虑使用策略模式,\n\n几个类的主要逻辑相同,只在部分逻辑的算法和行为上稍有区别的情况。\n有几种相似的行为,或者说算法,客户端需要动态地决定使用哪一种,那么可以使用策略模式,将这些算法封装起来供客户端调用。\n 策略模式是一种简单常用的模式,我们在进行开发的时候,会经常有意无意地使用它,一般来说,策略模式不会单独使用,跟模版方法模式、工厂模式等混合使用的情况比较多。\n\n### 结语\n策略模式是优化大型项目代码的一种手段,使你的业务清晰易懂,但对于项目初期、业务逻辑不复杂的情况下不要为了使用而使用,设计模式带来好处的同时也增加了系统复杂性,何时使用需要掌握好一个度,不然只会弊大于利。\n\n## REF\n- [策略模式](https://blog.csdn.net/zhengzhb/article/details/7609670/)', '策略模式', 0, b'0', b'0', NULL, 0, 0, 'https://static-admin.madaoo.com/%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F.png', '使用策略模式优化你的If else', 1, 2, NULL, '1234533425', 0, '1');
INSERT INTO `ar_article` VALUES ('1257548347275874304', 1588686664760, 1588686884089, 0, '### 如何快速进入学习状态?\n\n在说这个之前啊,我想我们很有必要说一下,为什么我们要快速进入学习状态呢?\n\n\n\n学习状态嘛,顾名思义,适合我们学习的状态,我们经常会说,什么什么状态不佳,这个时候我们是很难做好一件事情的,想要完美的做好一件事情,完美的状态不可或缺,学习也是一样的,也是需要一个好的状态,这个状态的目的一般是要达到:**大脑处于高度的学习状态!**\n\n\n\n这个时候我们的学习效率会提高,而且会让你学习比正常时间快得多,如果我们学习一直不在状态,基本上时间会白白浪费掉,而且也学不到什么东西。\n\n\n\n### 那什么情况下我们很难进入学习状态呢?\n\n\n\n一般来说,这里要看我们所做事情的**反馈刺激**,举个例子你就知道了,就比如我有的时候打王者荣耀,遇见比较坑的队友,简直气的不要不要的,这个时候你说让我快速进入学习状态?开什么玩笑,俺完全办不到啊,你等我骂完他再说……\n\n\n\n所以啊,类似王者这种,**反馈刺激比较强烈的,带来的直接结果就是你的情绪波动比较大**,这个时候我们想快速进入学习状态真的是比较困难的。\n\n\n\n所以啊,**如果今天你觉得自己主要的任务是学习,那千万不要做那些让你情绪变化很大的事情**,不然,不知不觉中你会浪费掉很多的时间,那么如果真的是没办法,遇到了一些让自己情绪波动比较大的事情,但是今天又有必须要完成的学习任务,那该**怎么办呢?**\n\n\n\n我的经验是坐在书桌前,深吸一口,找一些轻音乐,戴上耳机,音量调大,先让自己慢慢沉浸在其中,使得自己的情绪慢慢稳定下来……\n\n\n\n记住,这是在弥补你之前做的错事:那些让你情绪波动很大的事情!\n\n\n\n除此之外,外界环境嘈杂,引诱因素过多同样是导致我们不能快速进入学习状态的因素,那有什么具体的办法让我们快速进入学习状态嘛,我们看看以下的方法。\n\n\n\n### 想要快速进入学习状态,你需要这样做!\n\n\n\n1. 学习时间与空间\n\n什么意思嘞,就是如果你想快速进入学习状态的话,你必须首先保证在接下来的时间,你有足够的可控的时间段可以供自己来学习,不然,学不了多久你就要去干嘛干嘛,有这个顾虑,都会成为你进入学习状态的障碍。\n\n不要半个小时后就要去相亲了,还来句“我学会习吧”……\n\n其次,我们最好有一个不错的学习空间,比如一个安静的书房或者卧室等等,就是外界环境适合你学习,不要旁边有人在激情五黑,你说“我学会习吧”……\n\n学啥,下把带我……\n\n经研究证明,**混乱和压力之间是存在着之间联系的**,学习,应该没什么压力吧!\n\n\n\n2. 顺从猎奇心态\n\n啥意思嘞?咱们人呐,其实都是好奇心蛮重的,你看看那,围一堆人干哈的,赶紧凑上去看看:\n\n \n\n杀个猪有什么好看的……\n\n看吧,我们对新鲜事物都是很感兴趣的,因为我们对这类事物觉得不费啥劲轻松啊,毫无压力,所以啊,我们在学习的时候刚开始就可以利用这一点,一般来说,万事开头难,一坐下就想进入高度学习状态不太现实。\n\n一上来就去搞那些学习中的疑难杂症也不太现实,你想啊,对有些人来说,学习本身就是一件痛苦的事情(说的就是你),你说你让他一想到等会要学习去解决那道难题,这怎么快速进入学习状态啊,人都是喜欢趋利避害的,往往趋向于那些简单的事情,一上来就这整大餐,消化不了啊。\n\n这还谈何快速进入学习状态嘞?那咋整?简单啊!\n\n这个时候我们可以另辟蹊径,去学习新的东西,比如之前一直听说什么这概念那概念的,比如Java中吧,经常听说MQ,那啥是MQ啊,因为这是新知,出于我们的好奇心,我们想去探索他,自然也不会有太大的压力。\n\n\n\n也就是由它慢慢进入高度的学习状态,就是所谓的渐入佳境……\n\n\n\n但是这个时候一定要提防了,我们这个时候学习的新知(比如这里的MQ),我们一定要将自己学到的记录下来,不然这块的时间就白白浪费掉了,最好定个学习目标,比如要搞定基于这个知识点的三个问题:\n\n1、是什么?\n\n2、有什么用?\n\n3、简单使用\n\n把这些记录下来,此时你的学习状态就已经很不错了……\n\n\n\n3. 设定正确的学习目标和反馈机制\n\n接下来的时间,你就可以进入你的正题学习环节了,也就是说之前的学习,只是个引导,接下来才是你今天的首要学习任务,这个才是重点!\n\n\n\n那如何进入高效的学习状态嘞,我们常说啊,生活得有奔头,这个学习也是一样,你说我要学习,好,往那一坐,学吧,这没目标没啥的,多没劲,啥时候是个头啊,你说是不是?\n\n\n\n所以啊,要想进入高效的学习状态,只有之前那些准备工作还不够,你还需要给自己今天主要的学习任务定个目标以及设置反馈机制,这里的反馈机制我们主要说的就是对自己的奖赏。\n\n\n\n学习目标也就是今天要学什么,学到什么程度,要完成哪些指标,这些你都要清清楚楚的列出来,这就是你的目标,就是你今天的奔头啊,有了这些,你的学习才不是漫无目的的,是清晰可循的,这样你的目标感强,动力才会强,自然而然,学习状态才不会萎靡!\n\n\n\n至于反馈机制嘛,同样很重要,人呐,总是得有点甜头才好,你看看,我都学习那么久了,完成了那么多指标,难道就没有什么奖励吗?为啥好多人玩游戏上瘾,那就是因为游戏带给我们的即时反馈比较强,打个怪抢个人头,都可以看到自身经验的提升,但是学习的话,就是个持久战了,短期你是看不到啥收益的。\n\n\n\n咋整,那还不给自己来点奖励,学习本身短时间内提供不了即时反馈,那我们就人为给自己提供奖励机制嘛,比如当我们完成学习目标之后,我们可以奖励自己一些什么,就好比我喜欢玩王者,当我把今天该做的学习任务都搞定之后,我就会奖励自己玩一把王者荣耀,当然,我会确定接下来是否还有学习任务,如果还有,我是万万不会玩的……不然,打完游戏又要开骂了……\n\n\n\n所以,你学到了吗?设定目标和对自己的奖励,这对你快速进入学习状态很有帮助哦!\n\n\n\n我觉得我很有必要提醒一下,以上我说了三个步骤,都是循序渐进的,也就是说你只要按照上诉三个步骤一个个来,其实你就已经进入学习状态了,而且是不浪费时间的那种。\n\n\n\n好啦,以上是具体的步骤,接下来我们还需要聊聊心态的问题。\n\n\n\n### 如何快速进入学习状态,这些心态不可少!\n\n人呐!始终是情绪化的,我们做任何事情都会受到自身情绪的影响,所以啊,一个良好的心态必不可少,那如果你想快速的进入学习状态,拥有以下心态将对你是锦上添花般的存在!\n\n\n\n**1、不断的学习**\n\n\n\n想必大家都经历过这样的事情,就是经过长时间的放假之后,我们再次回到课堂之上,班主任会反复叮嘱我们“**把心收收**”,其实真的是这个样子,一般我们放假,大家普遍很少有人保持高频率的学习,有些根本不会学习,那么学习这件事情一旦被搁置一段时间之后,我们再次捡回,就会发现,自己要花好大力气和时间去适应它……\n\n\n\n这个时候,想要重回高效学习的状态是比较困难的,说白了,就是生了,不是手生是心生,你应该懂我的意思吧,所以啊,学习这件事情,应该是持续不断的,间隔时间不能太久了,**不管怎样,每天都要学点,重要的是要保持住学习的那种感觉!**\n\n\n\n**2、知道为什么而学**\n\n\n\n我们经常说,你永远叫不醒那个装睡的人,所以学习这件事情,你自己必须从心底里认为它是重要的,起码知道通过学习这件事,你可以改变什么得到什么,这也就是学习的内在动力。\n\n\n\n也许你会发现,有些人不用外界给予鞭策与压力,人家就会主动去学习,但是有些人,即使后面有人追着赶着,好像也不怎么情愿去学习。\n\n\n\n其根本原因就在于,你是否知道,自己为什么而学,有什么用?\n\n\n\n可能有人根本没有想过这个问题,自然也就没有什么内在的学习动力,我这里告诉你怎么做,一个非常有效的办法就是:\n\n\n\n有机会,你多出去走走,多进入那些比较高档的地方,就是尽量让自己靠近那些高端大气上档次的地方,然后你就会发现自己土里土气,畏手畏脚,觉得格格不入,这时候,你的自尊心也许会被触碰到。\n\n\n\n然后你也许会内心暗暗发誓“LZ要努力,也要高端大气上档次”\n\n\n\n当然,我说的是也许,毕竟“xzhu不怕开水烫”,因为有些人,无论你怎么叫,都是叫不醒的!\n\n\n\n**3、睡眠与饮食**\n\n\n\n最后说一个这个,因为这两点我目前执行的是比较差的,也是自我思考,自我反省一下。\n\n\n\n要想长久保持一个比较好的学习状态,最好有一个好的睡眠质量,当你睡觉的时候,你的身体会恢复活力,思想会巩固你的记忆,这样你可以充分的吸收并且记住你昨天学习到的知识。\n\n\n\n而且如果你第二天醒来精力充沛,那么你一整天的学习状态都是比较高的一个峰值,这样的话你还会担心自己不能进入学习状态嘛?\n\n\n\n健康饮食同样如此!\n\n\n\n所以要记住,睡眠和健康饮食都可以帮助你集中自己的精力,以此提高你的生产力,保证一个不错的学习状态!', '如何快速进入学习状态?', 0, b'0', b'0', NULL, 0, 0, 'https://static-admin.madaoo.com/640.jpeg', '如何快速进入学习状态?', 1, 1, NULL, '1234533425', 0, '1');
INSERT INTO `ar_article` VALUES ('1262724998418796544', 1589920874573, 1589902077268, 0, '## HTTPS是什么?\n\nHTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷是为了保证数据安全。 近两年,Google、Baidu、Facebook 等这样的互联网巨头,不谋而合地开始大力推行 HTTPS, 国内外的大型互联网公司很多也都已经启用了全站 HTTPS,这也是未来互联网发展的趋势。\n\n## 使用HTTPS之前有什么问题?\n\n- 窃听:传输内容监听。\n- 篡改:对传输数据修改。\n- 冒充:黑客冒充与你通信的人。\n\n# HTTPS诞生之路\n\n## 诞生速览\n\n对称加密--->(RSA)非对称加密--->对称加密+非对称加密(结合版)--->CA证书\n\n## 演进\n\n> 任何技术并非一开始都是十全十美的,HTTPS也不例外。\n\n想象如下场景:\n张三与李四在网络上通信聊天,此时通信是没有任何加密的,黑客可以任意监听我们的消息,简直就是在网络上裸奔,此时最常见的办法就是**对称加密**了,张三李四需要有同样的秘钥进行加密解密。\n\n但是此时问题又来了,秘钥在张三手里可是要怎么传输黑李四?纵使对称加密再安全,也得有个先给对方秘钥的过程,如果此时是被监听的,那么传输的秘钥同样会被截取,同样白费功夫,即使让张三当面传输给李四,可是张三的好友还有王五、赵六孙钱等等等,不可能挨个发给他们。\n\n不过还有一个办法,使用**非对称加**密,私钥在张三手里,公钥是公开的,用私钥加密的数据只有公钥能解密,用公钥加密的数据只有私钥能解密,这样安全性就提高了不少。\n\n但是问题依然存在,公钥是公开的,那么黑客也会有公钥,虽然黑客看不到李四的数据(李四使用公钥加密的数据只有私钥能解密)但是依然可以看到张三的数据,并且非对称加密算法性能比对称加密算法差太多,如果全靠非对称加密通信那么体验会差很多。\n\n性能不好并且同样有泄露算法的风险该怎么办呢?可以试试非对称加密+对称加密算法(结合),首先,张三使用非对称加密算法加密对称加密算法发送给李四,李四使用公钥解密获得对称加密算法,后续的通信使用加密算法通信。\n\n但是此种方式虽然解决了性能问题,但是黑客监听问题依然没有解决,公钥、对称加密的分发都没有得到解决,这个时候CA(Certificate Authority)证书就派上用场了,HTTPS如图所示:\n\n\n\n> 其实用咱大白话讲https就是结合对称加密和非对称加密再搭配CA机构(一个可信的数字证书颁发实体)对网站进行安全加密的技术。\n\n\n## 为网站配置HTTPS\n\n### 一、获取证书\n\n在 [freessl](https://freessl.cn/apply?domains=codeway.me%2Cwww.codeway.me&product=trustasia01&from=)网站生成证书,需要用到keymanager软件。\n\n### 二、解析证书获取.crt和.key\n\n### 三、配置Nginx\n\n```\n# formation on configuration, see:\n# * Official English Documentation: http://nginx.org/en/docs/\n# * Official Russian Documentation: http://nginx.org/ru/docs/\n\n# user nginx;\nworker_processes auto;\nerror_log /var/log/nginx/error.log;\npid /run/nginx.pid;\n\n\n# Load dynamic modules. See /usr/share/nginx/README.dynamic.\n# include /usr/share/nginx/modules/*.conf;\n\nevents {\n worker_connections 1024;\n}\n\nhttp {\n log_format main \'$remote_addr - $remote_user [$time_local] \"$request\" \'\n \'$status $body_bytes_sent \"$http_referer\" \'\n \'\"$http_user_agent\" \"$http_x_forwarded_for\"\';\n\n access_log /var/log/nginx/access.log main;\n\n sendfile on;\n tcp_nopush on;\n tcp_nodelay on;\n keepalive_timeout 65;\n types_hash_max_size 2048;\n\n #include /etc/nginx/mime.types;\n # default_type application/octet-stream;\n\n # Load modular configuration files from the /etc/nginx/conf.d directory.\n # See http://nginx.org/en/docs/ngx_core_module.html#include\n # for more information.\n #include /etc/nginx/conf.d/*.conf;\n\n # server{\n # listen 80;\n # server_name codeway.me www.codeway.me;\n # return 302 https://codeway.me$request_uri;\n#}}\n\n# 配置支持socket的二级域名,因为用了https://www.nodecache.com不支持\n server {\n listen 443 ssl;\n server_name socket.codeway.me;\n root /usr/share/nginx/html;\n ssl_certificate /usr/share/nginx/html/socket.codeway.me_chain.crt;\n ssl_certificate_key /usr/share/nginx/html/socket.codeway.me_key.key;\n ssl_session_cache shared:SSL:10m;\n ssl_session_timeout 10m;\n location ~* \\.io {\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Host $http_host;\n proxy_set_header X-NginX-Proxy false;\n proxy_pass http://202.182.114.223:3000;\n proxy_redirect off;\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n }\n}\n server {\n #listen 80;\n listen 443 ssl;\n server_name codeway.me;\n root /usr/share/nginx/html;\n ssl_certificate /usr/share/nginx/html/codeway.me_chain.crt;\n ssl_certificate_key /usr/share/nginx/html/codeway.me_key.key;\n ssl_session_cache shared:SSL:10m;\n ssl_session_timeout 10m;\n # Load configuration files for the default server block.\n # include /etc/nginx/default.d/*.conf;\n location ~* \\.io {\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header Host $http_host;\n proxy_set_header X-NginX-Proxy false;\n\n proxy_pass http://202.182.114.223:3000;\n proxy_redirect off;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n } \n location ^~ /api/ {\n proxy_pass http://121.36.158.84:8080$request_uri;\n} \n location / {\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n proxy_connect_timeout 6000;\n proxy_read_timeout 6000;\n proxy_set_header Host $host;\n proxy_set_header X-Real-IP $remote_addr;\n proxy_set_header X-Forwarded-Host $host;\n proxy_set_header X-Forwarded-Server $host;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_pass http://202.182.114.223:3000/;\n # proxy_pass http://202.182.114.223:3000/;\n # index index.html; \n}\n\n error_page 404 /404.html;\n location = /40x.html {\n index 400.html;\n }\n\n error_page 500 502 503 504 /50x.html;\n location = /50x.html {\n # index 500.html;\n }\n} \n}\n\n\n```\n\n\n\n\n## 坑\n\n### 1. 400 bad request“The plain HTTP request was sent to HTTPS port\n\n因为每一次客户试图通过HTTP访问你的网站,这个请求被重定向到HTTPS。于是Nginx预计使用SSL交互,但原来的请求(通过端口80接收)是普通的HTTP请求,于是会产生错误。\n\n解决办法:\n\n```nginx\n# ssl on; # 注释掉这一行\n# 在nginx.conf的server里使用如下配置\nserver {\n listen 80;\n listen 443 ssl;\n xxx...\n }\n```\n\n这样,Nginx就可以同时处理HTTP请求和HTTPS请求了。\n\n### 2. 查看左上角安全图标,提示“您与此网站之间建立的连接并非完全安全”。\n\n首先需要确保证书是否正确配置且有效的,如果证书正确配置,那么检查网页内容是否有存在http://的请求,比如文章图片。\n也可以打开F12,选中security标签,查看,这里会提示哪个地址不安全导致的\n\n\n\n\n\n> 本文章仅为个人工作中记录,如果您觉得本文章有任何不妥的地方请联系我修改,谢谢。', 'HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)', 0, b'0', b'0', NULL, 0, 0, 'https://static-admin.madaoo.com/ddd.png', 'HTTPS是什么', 1, 2, NULL, '1234533425', 0, '1');
INSERT INTO `ar_article` VALUES ('1263480522076721152', 1618374827921, 1590101005447, 0, '> 任何一门新技术,新语言,或者新工具的出现 必然会有其解决的问题或者痛点\n\n\n## docker 是什么?\n一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验\nDocker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案\n环境配置如此麻烦,换一台机器,就要重新来一次,费力费时,很多人想到,能不能从根本上解决问题,软件可以带环境安装吗?\n\n也就是说,安装的时候把原始环境一模一样的复制过来,开发人员利用Docker可以消除编码时\"在我的机器上可以正常工作\"的问题\n\n\n\n* 这只鲸鱼就是Docker\n* 鲸鱼背上的集装箱就是一个个的容器,每一个容器里面安装的一个软件,比如 nginx,mysql等 这也就是多个集装箱(\"软件\")\n\n\n## docker未出现时存在哪些问题?\n> 相信大家总是听到的一句话: \"在我电脑上运行的好好的啊!!!!\"\n\njava开发者写完程序后交给运维工程师进行部署,但是部署时总是出现这样那样的问题,导致运维人员总是去问java开发者是不是代码写的有问题,java开发者就说\"在我本机运行的好好的啊\"! 环境不一样,程序无法正常运行\n\n现在基本都是分布式集群环境了,那么服务器也不止一台,10台起步吧,那么运维人员部署完第一台服务器后,继续做同样的操作部署第二台,一直到第十台,机器固定还好说,咬咬牙就坚持过去了,但是说不定哪天搞活动,要搞弹性云扩容,再添加20台服务器,那么运维就疯了;同样的操作重复几十遍;\n\n\n## docker 核心理念\n> 一次构建,到处运行\n\n## 三大要素\n\n1. 镜像\n2. 容器\n3. 仓库\n\n### 镜像\n\n镜像(Image)是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器\n\n\n### 容器\n根据个Person(镜像)创建多个Person实例(容器)\n\n``` java\nPerson p1 = new Person();\nPerson p1 = new Person();\nPerson p1 = new Person();\n```\n\nPerson类就是一个模板,每次new都是一个实例(容器);\n\nDocker利用容器独立运行的一个或一组应用,容器是用镜像创建的运行实例\n\n它可以被启动,开始,停止,删除,每个容器都是相互隔离的,保证安全的平台;\n\n可以把容器看做一个简单的Linux环境(包括root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序\n\n\n### 仓库\n仓库是一个集中存放镜像文件的场所,你可以把它理解成github。\n\nDockerHub 是docker的中央仓库,开发人员可以将程序发布到dockerHub然后告诉运维人员下载即可获得与开发一模一样的运行环境\n\n\n## Docker 的用途\n1. 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。\n\n2. 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。\n\n3. 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。\n\n\n## 基本概念\n### run 和start区别\n1. docker run : 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可,\ndocker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)。\n\n2. docker start:重新启动已存在的镜像。也就是说,如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,我们可以使用docker ps找到这个容器的信息。\n\n\n## 上手docker\n搞懂了docker基本概念,现在我们直接上手操作\n```\n// 1. yum设置为阿里源\nwget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo & wget -O epel.repo http://mirrors.aliyun.com/repo/epel-7.repo\nyum clean all & yum makecache\n\n// 2. 第一次安装 设置存储库\n// 安装所需的包\nyum install -y yum-utils device-mapper-persistent-data lvm2\n\n// 设置稳定存储库\nyum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo\n\n// 3. 安装 docker-ce\nyum install docker-ce\n\n// 4. 更新yum软件包\nyum makecache fast\n\n// 5. 启动\nsystemctl start docker\n5. 验证\ndocker -v\ndocker run hello-world:latest :latest (最新) 不写的话默认是最新,可以自己定义\n```\n\n\n## Docker命令\n\n### 帮助命令\n命令 | 描述\n---|---\ndocker version | 版本\ndocker info | 列出docker的详细信息\ndocker --help | 帮助命令\n\n### 镜像命令\n\n命令 | 描述\n---|---\ndocker images | 列出本地所有镜像\ndocker search | 搜索镜像,相当于网站上的搜索\ndocker pull 镜像的名字| 将镜像下拉到本地上\ndocker rmi 镜像的名字 | 删除镜像\n\n### 容器命令\n命令 | 描述\n---|---\ndocker run 镜像名字 | 第一次启动使用run,后面使用start\ndocker ps | 列出容器\ndocker start 容器id或名字 | 启动容器\ndocker stop 容器id或名字 | 停止容器\ndocker kill 容器id或名字 | 强制停止容器\ndocker run -it -p tomcat | -it交互模式,-p指定端口\ndocker run -it -P tomcat | 大写P随机端口\ndocker run --rm | 容器停止时删除 容器内部的文件系统仍然被保留,也就是docker ps -a 查不到了\n\n### 常用的基本命令\n\n命令 | 描述\n---|---\ndocker logs 容器名称 | 查看服务日志\ndocker restart 容器id或名字 | 重启容器\ndocker rm 容器id或名字 | 删除容器\ndocker rm -f $(docker ps -a \\| grep \"模糊搜索的服务名称*\" \\| awk \'{print $1}\') | 按照名称批量删除容器\ndocker stop $(docker ps -a \\| grep \"模糊搜索的服务名称*\" \\| awk \'{print $1}\') | 按照名称批量停止容器\ndocker exec -it 容器id或名字 bash | 进入容器内部\n\n\n1. 交互式启动\n\n> 例子: docker run -it -p 8888:8080 tomcat \n\n> 8888是docker访问tomcat的端口,tomcat自己端口还是8080,相当于是映射\n\n2. 后台启动\n\n> docker run -d -p 8888:8080 tomcat \n\n3. 将容器制作成镜像\n\n> docker commit -m=\"提交的信息描述\" -a=\"作者\" 容器id 要创建的镜像名称:标签名\n\n> docker commit -a=\"lgg\" -m=\"666\" d928634aac1d testmytomcat:1.2\n\n## 推送到远程仓库\n\n```\ndocker login --username=dockerhub用户名 --password 密码\ndocker tag 镜像名称 dockerhub用户名/镜像名称\ndocker push dockerhub用户名/镜像名称:版本\n```\n\n\n## Docker加速\nvim /etc/docker/daemon.json\n\n```\n{\n\n \"registry-mirrors\":[\"https://almtd3fa.mirror.aliyuncs.com\"] \n\n}\n\nservice docker restart\n```\n\n\n\n## Dockerfile\n\n### dockerfile\n1. WORKDIR : 是指定工作目录,在宿主机看不到这个目录,一般是在第一行FROM这个容器里,比如先这个,WORKDIR指定app在node这个\n```\n FROM node:10.15.3\n MAINTAINER GuoGuang\n ENV NODE_ENV=production\n ENV HOST 0.0.0.0\n RUN mkdir -p /app\n COPY . /app\n WORKDIR /app\n EXPOSE 3000\n RUN npm install\n RUN npm run build\n CMD [\"npm\", \"start\"]\n```\n\n2. CMD : 类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:\n\n * CMD 在docker run 时运行。\n * RUN 是在 docker build。\n\n```\n// COPY 宿主机文件路径 容器路径\nCOPY overrides /opt/overrides\n\n// 列出数据卷 https://www.cnblogs.com/51kata/p/5266626.html\ndocker volume ls\nvolume 和 run命令里的 -v 区别是 volume不能指定宿主机的目录,是自动生成的,volume存在云Dockerfile中,所有通过此文件创建的容器都有次挂载点\n\n```\n\n\n## docker 容器数据卷\ndocker容器产生的数据,如果不通过docker commit 生成新的镜像将数据保存下来的话,那么当容器删除后,数据也就没了;\n> 为了能保存数据,我们使用数据卷保存,类似redis 的持久化\n\n\n\n## DockerCompose\nDocker一般搭配微服务使用,一个docker实例对应一个服务,但是当我们的服务多了的时候,需要编写多个dockerfile文件,非常麻烦,使用DockerCompose即可解决这个问题,先来看一下官方定义:\n\n> Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。\n\n模板如下:\n\n```\nversion: \'自定义版本\'\n\n# 指定启动的服务\nservices:\n redis: # 服务名称\n image: redis:4.0.6 # 镜像\n command: redis-server --requirepass \"qwWDRRR5..D\" --appendonly yes # 扩展命令\n volumes: # 绑定的物理卷\n - \'/root/xxx/redis:/data\'\n networks:\n - easy-mock\n restart: always\n```\n\n### 三大概念\n- Services:一个service代表一个container,支持从dockerhub拉取。或者从本地build\n- Networks:指定使用网络端口等\n- Volumes:绑定的物理卷\n\n### 安装Docker-compose\n\n```\nsudo curl -L \"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose\n\n// 修改文件权限为可执行文件\nsudo chmod +x /usr/local/bin/docker-compose\n\ndocker-compose version \n\n// 启动,docker-compose默认执行当前目录下的docker-compose.yml文件,如果没有需要使用 -f 指定\ndocker-compose up -d\n```\n\n\n> 如果你在阅读过程中有自己的见解或观点,烦请不吝指教,谢谢。', '任何一门新技术,新语言,或者新工具的出现 必然会有其解决的问题或者痛点', 2, b'0', b'0', NULL, 0, 0, 'https://static-admin.madaoo.com/docker.png', 'docker快速入门', 1, 10, NULL, '1234533425', 38, '1');
INSERT INTO `ar_article` VALUES ('1264436933417897984', 1590329031685, 1590329526847, 0, '> 原文链接:https://blog.csdn.net/weixin_45728976/article/details/104439087\n\n命令 | 释义\n---|---\ninurl:Login |将返回url中含有Login的网页\nintitle:后台登录管理员 | 将返回含有管理员后台的网页\nintext:后台登录 | 将返回含有后台的网页\ninurl:/admin/login.php | 将返回含有admin后台的网页\ninurl:/phpmyadmin/index.php | 将返回含有phpmyadmin后台的网页\nsite:baidu.com inur:Login | 将只在baidu.com中查找urI中含有Login的网页\nsite:baidu.com filetype:pdf | 将只返回baidu.com站点上文件类型为pdf的网页\nlink:www.baidu.com | 将返回所有包含指向www.baidu.com的网页\nrelated:www.llhc.edu.cn | 将返回与www.llhc.edu.cn相似的页面,相似指的是网页的布局相似\nindex of /admin | 发现允许目录浏览的web网站\ninurl:share.cgi?ssid= | 云服务器文件和文件夹共享\nintitle:\"Welcome to QNAP Turbo NAS\" | QNAP登录页面\ninurl:\"img/main.cgi?next_file\" | 在线摄像头\next:log inurl:\"/pgadmin\" | 包含多媒体信息的文件,pgAdmin客户端日志文件\n\"m.zippyshare.com/\" | 敏感目录\n\"-- Account dump\" ext:sql-git | 使用标签查找关于MySQL转储的信息\ninurl:_vti_pvt/administrators.pwd | 用于检索MS FrontPage共享点的敏感信息登录/密码\ninurl:front/central.php | 包含登录门户的页面\ninurl:zabbix.php AND intext:\"Zabbix SIA\" | zxbbix网络监控系统\ninurl:\"/wp-admin/setup-config.php\" intitle:\"Setup Configuration File\" | 找未完成的安装Wordpress \ninurl:scgi-bin intitle:\"NETGEAR ProSafe\" | 千兆防火墙。默认用户名:admin。默认密码:密码inurl:scgi-bin \ninurl:index of= %2F /admin login %2F intitle:\"Administration Login - | 网络托管公司的管理员登录 \nintitle:\"twonky server\" inurl:\"9000\" -intext:\"9000\" | 查找Twonky媒体共享服务器\ninurl:\"sitemanager.xml\" ext:xml -git | 查找FileZilla站点管理器文件,其中包含FTP用户名和密码Dxtroyer\nintitle:\"Sign in · GitLab\" | 查找GitLab登录页面\ninurl:\"/api/index.php\" intitle:UniFi | 查找具有多信息的UniFi API浏览器,如WiFi密码redstoner2014\ninurl:\"wp-content/uploads/file-manager/log.txt\" | WordPress插件文件管理器日志文件有趣的信息\n\"TX_start\" \"card_name\" ext:log | 从商店查找交易记录,其中包含多汁的信用卡/借记卡信息\nintitle:\"Namenode information\" AND inurl:\":50070/dfshealth.html\" | 用于基础设施Hadoop的NameNode存储信息\ninurl:/_layouts/mobile/view.aspx?List= | 包含用户名的文件\ninurl:\".php?id=\" \"You have an error in your SQL syntax\" | 找到sql注入的网站\ninurl:/proc/self/cwd | 遭到入侵的易受攻击的Web服务器\ninurl:/remote/login?lang=en | 查找FortiGate防火墙的SSL-VPN登录门户\nintitle:\"Plesk Onyx\" intext:\"Interface language\" | 查找Plesk Onyx登录页面\nintitle:\"GitBucket\" intext:\"Recent updated repositories\" intext:\"Sign In\" | 查找GitBucket服务器\nintitle:\"cuckoo sandbox\" \"failed_reporting\" | cuckoo| 失败报考 \n\"You‘re successfully running JSON Server\" | 成功运行JSON服务器\nindex of /htdocs | 用于查找未经授权的Web服务器,并通过‘htdocs‘文件夹查找所有敏感信息\ninurl:login.cgi intitle:NETGEAR NETGEAR | 在线查找GSS108E ProSAFE PoE +点击开关,默认密码password \ninurl:\"/ap/recuperadocumentossql.aspx\" | AuraPortal:内部文件\nintitle:\"Namenode information\" | 查找无密封的文件系统,等待被利用\ninurl:\"/ADVANCED/COMMON/TOP\" | 查找无密码的爱普生打印机\nfiletype:ini \"wordfence\". | 找到运行Wordfence WAF的WordPress网站\nintitle:\"Index of\" \"Apache/2.4.7 (Ubuntu) Server\" | 用于查找Ubuntu服务器和某个版本的Apache\n\"Sorting Logs:\" \"Please enter your password\" \"Powered By\" -urlscan -alamy | 找到stealer僵尸网络控制面板\nintitle:\"Index of /\" \"mod_ssl 2.2.22 OpenSSL/1.0.1\" | 找到易受攻击的Bug Dxtroyer的OpenSSL服务器\nintitle:\"Index of /\" \"Proudly Served by Surftown at\" | 查找Surftown HTTP服务器Dxtroyer\n\"Blocking Reason:\" ext:log -git | 找到安全漏洞日志Dxtroyer\ninurl:\"/logs/www\" ext:log | 查找连接日志,用户代理,错误等\nintitle:\"Index of /\" \"joomla_update.php\" | 找到具有Joomla日志的目录,通常包含多汁的信息\nintext:uploadOverwrite || intext:OPEN || intext:cwd | cwd作者\nintext:DB_PASSWORD || intext:\"MySQL hostname\" ext:txt | 允许你搜索WordPress配置\nsite:pastebin.com intext:\"*@*.com:*\" | 查找pastebin.com转储的邮件列表,密码TPNight\ninurl:\"g2_view=webdav.WebDavMount\" | 查找启用WebDAV的网站TPNight\n-inurl:htm -inurl:html intitle:\"index of\" NIKON | 浏览尼康数码单反相机和相机目录中上传和保存的图像和照片\n-inurl:htm -inurl:html intitle:\"index of\" 100CANON | 浏览佳能的目录中上传和保存的图像和照片\n\"Protocol=unreal\" ext:ini -git | 到虚幻游戏文件,可能包含管理员密码\ninurl:\"/Windows/Cookies/\"ext:txt -telecom -forbidden -git | 查找Windows存储的Cookie,可能包含加密的用户名和密码\n\"[FFFTP]\" ext:ini | 使用FTP登录,服务器信息等查找文件\n\"random‘s system information tool\" ext:txt | 从系统信息工具找信息\ninurl:app/config/intext:parameters.yml intitle:index.of | 目录:Symfony(PHP Framework)包含\ninurl:\"dcwp_twitter.php?1=\" | 使用私人消息,加密凭证等查找Twitter API日志\nintitle:\"Setup Home\" \"Internet Status\" -belkin | 找到互联网连接的Arris路由器\ninurl:\"ftp://www.\" \"Index of /\" | 查找在线FTP服务器\nintitle:\"CGIWrap Error\" | 查找包含一些有趣信息的CGIWrap脚本错误\n\"Consola de Joomla! Debug\" inurl:index.php | 提供以下信息>会话>配置文件信息>内存使用>数据库注册表\ninurl:\"pubdlcnt.php?file=\" ext:php | 找到重定向漏洞.\n\"-- MySQL Administrator dump\" ext:sql | 找到一些不错的数据库转储,可能包含用户名,密码和其他\n\"-----BEGIN X509 CERTIFICATE-----\" ext:pem -git | 查找X.509服务器证书\n\"START securepay\" ext:log | 查找交易记录(有时包含信用卡号码和其他多汁的信息\ninurl:\"8080/jmx-console\" | 将列出所有未经身份验证的jboss服务器与jmx-console访问\ninurl:\"Login;jsessionid=\" | 查找通用的JS登录门户\ninurl:\"idx_config\" | 找到通过shell抓取配置\ninurl:\"exit.php?url=\" -entry_id | 页面易受任意重定向\n\"KVP_ENCDATA:Version=1.0\" ext:log | 查找具有银行帐户信息的交易记录\nallinurl:\"/wp-content/plugins/wp-noexternallinks\" | 找到易受XSS影响的“无外部链接”插件“”错误\n\"resources.db.params.password\" ext:ini -git | 找数据库用户名和密码\nintitle:\"Dell SonicWALL - Authentication\" | 发现戴尔防火墙服务器\nintitle:\"webcamXP 5\" -download | 查找WebcamXP相机\ninurl:\"http://ftp.dlink\" | 允许我们找到D-Link路由器的FTP目录列表\nintitle:\"Authorization\" \"TF\" inurl:\"admin.php\" | 找到一堆未受保护的僵尸网络控制面板\ninurl:\"http://webmail.\" | 查找各种网络邮件服务器\ninurl:\"/siteadmin/index.php\" | 找到管理控制台\next:reg\"[HKEY_CURRENT_USER\\Software\\ORL\\WinVNC3]\" -git | 使用WinVNC密码查找文件\n\"mysqli_connect\" ext:inc | 查找包含MySQL用户名和密码的脚本\n\"MiniToolBox by Farbar\" ext:txt | 查找具有IP配置,DNS信息,应用程序错误等的日志!\n\"WEB Browser Password Recovery\" ext:txt | WEB浏览器密码重置\n\"Operating System Intel Recovery\" ext:txt | 操作系统英特尔恢复\n\"iSpy Keylogger\" \"Passwords Log\" ext:txt | iSpy Keylogger日志密码\next:php intext:\"-rwxr-xr-x\" site:.in | 受影响的软件\ninurl:core.windows.net ext:xlsx | 可以更改文件扩展名或运行没有扩展名\n\"-- MySQL dump\" ext:sql -git | 查找MySQL数据库转储,用户名,密码\ninurl:/helpdesk/staff/index.php? | 找到“Kayako软件票务门户登录页面”\ninurl:/_catalogs | 识别sharepoint服务器\ninurl:/pub/ inurl:_ri_ | 使用Oracle Responsys的服务器*\ninurl:\"/data/urllist.txt\" ext:txt -git | 文网站地图,其中包含robots.txt\n\"Log in\" \"Magento is a trademark of Magento Inc.\" | 查找Magento管理登录\nintitle:index of intext:@WanaDecryptor@.exe | Wannacry Ransonware感染的服务器\n\" End Stealer \" ext:txt | 333从“Black Stealer” | 中查找日志,这是一个互联网密码\n\"--- WebView Livescope Http Server Error ---\" -git | WebView服务器错误,主要发现在旧服务器\nintitle:index of intext:wncry | 找到受Wannacry Ransomware影响的服务器\ninurl:\"/view/view.shtml?id=\" | 查找Axis IP摄像机\nintitle:\"Welcome to ZyXEL\" -zyxel.com | 查找ZyXEL路由器,IP摄像机和其他设备\n\"FileZilla\" inurl:\"recentservers.xml\" -git | 查找FileZilla最新的服务器文件,带有纯文本用户名/密码\n\"SECRET//NOFORN\" ext:pdf | 找到秘密政府文件\n\"PHP Fatal error: require()\" ext:log | 找到PHP错误日志\ninurl:\"go.cgi?url=\" | 找到可以利用来重定向| 可以将其用于网络钓鱼\n(site:onion.link | site:onion.cab | site:tor2web.org | site:onion.sh | site:tor2web.fi | site:onion.direct) | 查找托管在Tor网络托管的网站\ninurl:\"http://voicemail.\" | 各种语音邮件服务器\n\"Stealer by W33DY\" ext:txt | 找到具有用户名,密码和网站\ninurl:\"this.LCDispatcher?nav=\" | 查找连接到互联网Dxtroyer的HP打印机\ninurl:\"multimon.cgi\" intitle:\"UPS\" | 找到现场交通显示器\ninurl:\"member.php?action=login\" | 查找由MyBB| 登录页面\n\"Section\" inurl:\"xorg.conf\" ext:conf -wiki | Xorg X的配置文件,包含受害者的计算机信息\ninurl:\"lvappl.htm\" | 找到连接到互联网服务器(主要是安全摄像头\ninurl:\"/zebra.conf\" ext:conf -git | 查找GNU Zebra登录凭据\n\"screen mode id:\" ext:rdp | RDP基本上是Windows认证的后门\ninurl:\"/Windows/Cookies/\" ext:txt -git | 所有种类的网站的Cookie\ninurl:\"/drive/folders/\" site:drive.google.com | Google云端硬盘文件夹\ninurl:\"/fmi/webd\" | 登录另一个文件云文件夹\n\"HTTP\" inurl:\"access.log\" ext:log | 查找包含有关网站活动信息的日志\ninurl:\"folderview?id=\" site:drive.google.com | 查找人员的私人文件夹\n\"Index of\" inurl:\"/$Recycle.Bin/\" | Windows回收箱\ninurl:\"Makefile.in\" ext:in | 使用私有服务器信息查找配置文件\ninurl:/j_security_check;jsessionid= | 可以访问很多登录页面\nintext:VIEWS · Server: - Database: information_schema - Table: SCHEMA_PRIVILEGES · Browse · Structure · SQL · Search · Export | 访问网站phpmyadmin的web服务器\n\"[dirs]\" inurl:\"mirc.ini\" -git | 查找mIRC配置文件\next:fetchmailrc | 查找.fetchmailrc文件与电子邮件登录信息\n\"[main]\" \"enc_GroupPwd=\" ext:txt | 找到Cisco VPN客户端密码\n\"InnoDB:\" ext:log | 找到MySQL错误日志\n\"-----BEGIN RSA PRIVATE KEY-----\" ext:key ### | 一些哈希(密码,证书等\n\"Scan result of Farbar Recovery Scan Tool\" ext:txt | Farbar恢复扫描工具扫描结果\n\" AdwCleaner\" ext:txt | 查找AdwCleaner logfiles\n\"/wp-admin/admin-ajax\" ext:txt | 查找robots.txt文件,其中提供有关服务器更敏感方面的信息\n\"WHMCS Auto Xploiter\" | 发现WHMCS在站点Dxtroyer中利用shellz\npowered by h5ai | 由h5ai提供*您可以浏览文件\n\"[PHPSESSID]\" ext:log | 查找由PHP Dxtroyer生成的会话ID的日志\n\"Access Denied\" \"Powered by Incapsula\" ext:php | 查找触发了Incapsula WAF Dxtroyer的易受攻击的页面\n\"authentication failure; logname=\" ext:log | 查找失败登录的日志文件,其中包含用户名和登录路径\nfiletype:bak inurl:php \"mysql_connect\" | 包含MySQL数据库密码的PHP备份\ninurl:\"/load.cgi\" ext:cgi | 查找更多页面易受重定向的\n\"Logfile of Trend Micro HijackThis\" ext:log | 趋势微劫持的日志文件\n\"LGD_CARDNUM\" ext:log -site:camper.com | 查找部分信用卡号,银行帐户信息\ninurl:\"/HtmlAdaptor?action=\" | \n\"[boot loader]\" \"WINNT\" ext:ini | 查找boot.ini文件,显示在服务器\ninurl:\"mail\" ext:mai | 发送的私人电子邮件\n\"%@\" ext:ascx | 查找ASP配置和设置\nintitle:\"Nessus Scan Report\" ext:html | 查找Nessus(漏洞扫描程序\n\"SERVER_ADDR\" \"SERVER_PORT\" \"SERVER_NAME\" ext:log | 查找具有服务器信息的日志\ninurl:\"exit.php?site=\" | 查找允许您将用户重定向到任何网站的文件\ninurl:\"/SecureAuth1\" | SecureAuth登录,密码重置i\ninurl:\"/admin.php?cont=\" | 找到Radius Manager登录页面\n\" -FrontPage-\" ext:pwd | 查找MS Frontpage密码\ninurl:\"/sitemap.xsd\" ext:xsd | 找到导致站点地图的文件...有用于查找登录门户和内容\ninurl:\"/fb_ca_chain_bundle.crt\" ext:crt | 查找Facebook留下的安全证书,可能有一些有用的信息\n\"El Moujahidin Bypass Shell\" ext:php | 简单上传\n\" This file was generated by libcurl! Edit at your own risk.\" ext:txt | cookie数据,有时包含易受攻击的信息\n\"END_FILE\" inurl:\"/password.log\" | 查找用户特定的登录信息\n-english -help -printing -companies -archive -wizard -pastebin -adult -keywords \"Warning: this page requires Javascript. To correctly view, please enable it in your browser\" | 用于fortinet防火墙登录网络的\n\"INSERT INTO phpbb_users\" ext:sql | 查找具有用户名和散列密码的文件\n\"havij report\" \"Target\" ext:html | 显示havij sqli注射报告\ninurl:\"/admin/index.php?msg=\" inurl:\"%20\" | 找到可以XSS‘d和编辑的页面\nintitle:\"Priv8 Mailer Inbox 2015\" ext:php | 只是另一个邮件:P请不要使用垃圾邮件\ninurl:\"-wp13.txt\" | 找到MySQL,ABSPATH,Wordpress等配置文件\nintext:Table structure for table `wp_users` filetype:sql | 网站数据库转储信息\n\"Joomla! Administration Login\" inurl:\"/index.php\" | 查找Joomla管理员登录页面\n\"Index of\" \"logins.json\" \"key3.db\" | 查找包含保存的Firefox密码,浏览历史记录等\n\"Greenstone receptionist\" inurl:\"/etc/main.cfg\" | 查找Web应用程序配置\n\"PGP SIGNED MESSAGE-----\" inurl:\"md5sums\" | FINDs(MD5,SHA1等\ninurl:\"/phpinfo.php\" \"PHP Version\" | 找到phpinfo()页面\ninurl:\".php?cat=\" inurl:\"‘\" | 查找易受SQL注入攻击的站点\n\"Fatal NI connect error\" \", connecting to:\" ext:log | 找到不同应用程序日志的全部负载\ninurl:\"/attachment/\" ext:log | 查找具有LOTS信息的Web应用程序日志\n\"Below is a rendering of the page up to the first error.\" ext:xml | 错误信息\ninurl:\"/irclogs/\" ext:log | 找到IRC日志\n( ext:php ) ( inurl:/wp-content/uploads/AAPL/loaders/ ) | 找到网络shell\nfiletype:pcmcfg | 搜索pulseway应用程序\ninurl:cgi-bin/lsnodes_web?node | 在线无线电状态节点\ninurl:/profile.php?lookup=1 | 网站和论坛的管理员名称\n\"your default password is\" filetype:pdf | 初始密码 \ninurl:\".Admin;-aspx }\" \"~Login\" | 管理员登录-Xploit \ninurl:?filesrc=**** ~\"Current\" ~\"asp\" | 不同的上传的shell名称\next:svc inurl:wsdl | Web服务描述语言\ninurl:\".reset;-.pwd }\" \"~ User\" | 门户登录存储用户信息\n\"CF-Host-Origin-IP\" \"CF-Int-Brand-ID\" \"CF-RAY\" \"CF-Visitor\" \"github\" -site:github.com -site:cloudfare.com | cloudfare.com替换“github.com\nhttrack inurl:hts-log.txt ext:txt -github.com | httrack网站复制日志的数据\ninurl:sendmessage.php?type=skype | 反映XSS易受攻击的\nsite:onedrive.live.com shared by | 识别共享存档\nintitle:\"Login - OpenStack Dashboard\" inurl:\"dashboard\" | 登录 - OpenStack仪表板登录 \ninurl:\"/graphs\" intext:\"Traffic and system resource graphing\" | 查看mikrotik图形界面inurl的结果\nintitle:\"FormAssembly Enterprise :\" | 包含表单组织用于收集信息。有些敏感\ninurl:forgot.do;jsessionid= | 忘记密码门户\nsite:cloudshark.org/captures password | 包含密码的PCAP捕获\ninurl:/o/oauth2 inurl:client_id | 搜索这个将返回与OAuth2协议中的认证过程一起使用的各种客户端ID\nintitle:Login \"Login to pfSense\" \"Password\" \"LLC\" | pfSense防火墙管理登录页面\ninurl:iProber2.php ext:php | 类别:包含多媒体信息的文件漏洞作者\ninurl:/\\\\filesrc=**** ~\"Current\" ~\":/\" ~\"upload\" | 网站上涵盖的大量外壳后门鼠标列表\ninurl:~/ftp://193 filetype:(php | txt | html | asp | xml | cnf | sh) ~‘/html‘ | 通过IP地址查找FTP服务器列表\ninurl:/index.php?option=com_artforms | 组件SQL注入\n\"dirLIST - PHP Directory Lister\" \"Banned files: php | php3 | php4 | php5 | htaccess | htpasswd | asp | aspx\" \"index of\" ext:php | 禁止文件\nintitle:\"index of/\" CCCam.cfg | 配置文件包含CCCam服务器的用户和密码\ninurl:cgi-bin \"ARRIS Enterprises\" | 面板ARRIS路由器\ninurl:\"/viewlsts.aspx?BaseType=\"|\n\"Powered by AutoIndex PHP Script\" ext:php | 敏感目录和文件包含多媒体信息\ninurl:action=php.login | 你可以找到不同的管理页面\n\"All site content\" ext:aspx | Sharepoint管理网\ninurl:admin inurl:uploads | 从上传网站捕获图像和文字\ninurl:/fckeditor/editor/plugins/ajaxfilemanager/ajaxfilemanager.php | 敏感目录\ninurl:github.com intitle:config intext:\"/msg nickserv identify\" | 原始密码\ninurl:\"/html/modeminfo.asp? | NetGear路由器信息\nintitle:\"Log In to AR Web\" | 华为AR路由器登录面板\ninurl:user_guide intext:\"CodeIgniter User Guide\" | 离线用户指南\nallinurl: drive.google.com/open?id= | 文件和用户共享谷歌驱动器的数据\nsite:webex.com inurl:tc3000 | 访问一些会议信息\ninurl:\"/debug/default\" intitle:\"Yii Debugger\" | Yii调试器PHP框架服务器信息\ninurl:proftpdpasswd | proftpd密码\ninurl:/mjpg/video.mjpg | 在线设备\nintitle:\"Vigor Login Page\" | Vigor路由器登录面板\nMeg4-Mail ext:php | PHP邮箱\nintitle:\"Integrated Dell Remote Access Controller 6 - Enterprise\"| 戴尔远程访问控制器\nHostinger ? 2016. All rights reserved inurl:default.php | Hostinger虚拟主机客户端默认公开页面,敏感目录列表\n\"PHP Credits\" \"Configuration\" \"PHP Core\" ext:php inurl:info | info另一种查看Phpinfo()的方式\ninurl:\".esy.es/default.php\" | public_html文件夹中的文件列表\n\"PHP Mailer\" \"priv8 Mailer\" ext:php|\nintitle:\"SonicWALL - Authentication\" | SonicWALL防火墙登录门户\nintitle:\"Login\" inurl:\"/doc/page/login.asp\" | HikVision网络摄像头的界面\ninurl:/php/info.php | Web服务器检测\n\"PHP eMailer is created by\" ext:php|\nintitle:Leaf PHP Mailer by [leafmailer.pw] ext:php|\n\"File Manager Version 1.0\" \"Coded By\" | 文件管理器\ninurl:ManageFilters.jspa?filterView=popular | 提供热门的JIRA问题主题\nintext:SOAP 1.1 intext:SOAP 1.2 intext:UPLOAD intext:GET intext:POST inurl:op | 识别易受攻击的网站\nhttps://paper.dropbox.com inurl:/doc/|\nintitle:\"HFS\" \"Server Uptime\" \"Server time\" | Web服务器检测\ninurl:\"apc.php\" intitle:\"APC INFO\"|\n\"PHP Version\" inurl:/php/phpinfo.php | 关PHP安装的信息的页面\n\"Upload\" inurl:\"https://webfiles\" | 发现页面易受目录遍历,上传和下载文件的影响\ninurl:\"-/monitoring\" \"statistics of JavaMelody\" | 监控JavaEE应用程序。允许可视化sql请求\n\"[HKEY_CURRENT_USER\\Software\\sota\\FFFTP]\" filetype:reg | Windows服务器的多媒体信息的文件\ninurl:calendar.google.com/calendar/embed?src= | 公开的Google日历\n(@gmail.com || @yahoo.com || @hotmail.com) ext:php inurl:compose | mail邮件服务器的邮件帐户名和其他数据\nintitle:\"open webif\" \"Linux set-top-box\" | 允许完全控制Dreambox TV机顶盒的Web界面\ninurl:/mjpgmain.asp | 名称= Y-cam的实时视图\ninurl:/web/device/login?lang=1 h3c | web管理登录页面\nintitle:\"StrongLoop API Explorer\" intext:\"Token Not Set\" | 寻找开放的Strongloop的环回API资源管理器\n\"This WebUI administration tool requires scripting support\" intitle:‘Login‘ intext:‘Admin Name:‘ -score | Juniper Netscreen WebUI登录页面\ninurl:\"https://vdi\" | Horizo??n登录页面\nindex:\"html/js/editor/fckeditor/editor/filemanager/connectors\" | 敏感目录\ninurl:/?skipANDROID=true intext:\"Pydio Community\" | Pydio社区,云和安全的FTP服务器登录\ninurl:\"html/js/editor/ckeditor/\" | 敏感目录入口\n\"generated by Munin\" inurl:index -intext:index localhost | Munin网络小组\n\"You have selected the following files for upload (0 Files).\" | 查找文件上传页面\ninurl:/human.aspx?r= | 安全的ftp服务器登录\ninurl:\"/wp-content/wpclone-temp/wpclone_backup/\" | 备份目录包含WordPress用户名和密码\ninurl:\"/sgdadmin/\" Secure Global Desktop | Oracle Secure Global桌面控制台和管理员帮助\nintitle:\"nstview v2.1:: nst.void.ru\" | intext:\"nsTView v2.1 :: nst.void.ru. Password: Host:\" | \nfiletype:php intext:Your Email: intext:Your Name: intext:Reply-To: intext:mailer| 邮箱用户名修改页面\ninurl:log -intext:log ext:log inurl:wp- | 从wordpress网站上获取日志\ninurl:ipf.conf -intext:ipf.conf ext:conf | Solaris系统防火墙\ninurl:wp-content/debug.log | 启用调试日志的一些操作...\nintitle:Sign In inurl:/adfs/ls/?wa=wsignin1.0 | 用户登录页面\n(inurl:\"8080/monitorix\" & intext:\"Hostname\") | inurl:\"8080/monitorix-cgi\" | Monitorix系统监控工具web界面\ninurl:\"/login/login.html\" intitle:\"Greenbone Security Assistant\" | OpenVAS登录页面\ninurl:\"/weathermap/weathermap-cacti-plugin.php\" | 通过Weathermap Cacti插件映射IT基础设施\nintext:\"Web Application Report\" intext:\"This report was created by IBM Security AppScan\" ext:pdf | 搜索IBMAppScan漏洞报告\n\"Web Application Assessment Report\" ext:pdf | 搜索HP WebInspect扫描报告\ninurl:index of driver.php?id= | 发现操作系统警告\nintitle:\"bandwidthd\" \"programmed by david hinkle, commissioned by derbytech wireless networking.\" | BandwidthD搜索报告\ninurl:/Portal/Portal.mwsl | 这是西门子S7系列PLC控制器的代号\ninurl:/FCKeditor/editor/filemanager/upload/ | 受保护的文件进行身份验证。\ninurl:Dialin/Conference.aspx | 登录门户的页面\ninurl:pictures intitle:index.of | 负载的个人图片\ninurl:sgms/auth | 找到Sonicwall GMS服务器\nsite:static.ow.ly/docs/ intext:@gmail.com | Password | 缓存中的密码的文档\ninurl:DiGIR.php | fnkym0nky描述\nintext:\"Dumping data for table `orders`\" | 个人信息的SQL转储文件\nfiletype:sql intext:wp_users | phpmyadmin wp漏洞报告\n\"index of\" bigdump.php | 交错的MySQL转储进口商文件\n\"Index of /wp-content/uploads/backupbuddy_backups\" zip | 搜索iThemes BackupBuddy备份拉链\nintext:\"/showme.asp\" HTTP_ACCEPT | HTTP_ACCEPT服务器的应用程序和会话内容\nintext:\"/LM/W3SVC/\" ext:asp | 提供信息的asp ServerVariables\ninurl:top.htm inurl:currenttime | 在线相机\nintext:\"Hello visitor from\" ext:asp | \nintext:\"expects parameter 1 to be resource, boolean given\" filetype:php | 易受攻击的基于mysql的网站\ninurl:/awcuser/cgi-bin/ | Mitel系统 \nsite:github.com ext:csv userid | username | user -example password | 用户| 示例密码诱饵\ninurl:\"/wp-content/uploads/levoslideshow/\" | Webshel??l上传\nZixmail inurl:/s/login? | Zixmail安全电子邮件登录门户\ninurl:\"/wp-content/plugins/wp-mobile-detector/\" ext:php | Detector 3.5远程Shell上传\ninurl:trash intitle:index.of | 敏感目录\ninurl:.ssh intitle:index.of authorized_keys | SSH密钥\ninurl:/remote/login/ intext:\"please login\"|intext:\"FortiToken clock drift detected\" | 录门户的页面\nintitle:\"Hamdida X_Shell Backd00r\" | 后门\ninurl:/WebInterface/login.html | CrushFTP的登录页面可能会弹出其他程序的FTP页面\nintext:\"Powered by BOMGAR\" | BOMGAR在线设备\nintext:\"Forum software by XenForo?\" | 论坛软件”XenForo SQLi漏洞\next:php inurl:\"api.php?action=\" | SQLi漏洞\ninurl:\"/webmail/\" intitle:\"Mail - AfterLogic WebMail\" -site:afterlogic.org -site:afterlogic.com | WebMail XXE注入漏洞\nfiletype:txt \"gmail\" | \"hotmail\" | \"yahoo\" -robots site:gov | site:us | 电子邮件\ninurl:citrix inurl:login.asp -site:citrix.com | Citrix登录门户网站\ninurl:vidyo -site:vidyo.com inurl:portal | Vidyo门户\nintitle:\"MODX CMF Manager Login\" | 搜索MODX登录门户\n\"Fenix Final Version v2.0\" filetype:php | Web-Shell新的\ninurl:demo.browse.php intitle:getid3 | getID3演示可以允许目录遍历,删除文件等\ninurl:/sites/default/files/webform/ | Drupal默认的Web表单的存储路径\nintext:\"eav\" filetype:txt | NOD32防病毒帐户的用户名和密码的文件\nintitle:\"Struts Problem Report\" intext:\"development mode is enabled.\" | Struts问题报告\nindex of /wp-content/uploads/userpro | csv文件发现有很多个人信息\ninurl:\"/owncloud/public.php\" -github -forum | 共享文件Owncloud\ninurl:\"/eyeos/index.php\" -github -forum | 登录门户的页面\ninurl:\"/owncloud/index.php\" -github -forum | owncloud门户页面\ninurl:configfile.cgi | configfile.cgi D0bby\nfiletype:pwd intitle:index | 登录门户的页面\nsite:github.com filetype:md | filetype:js | filetype:txt \"xoxp-\" | 松散认证令牌\n/@fmb80_encoder.htm | 声音技术在广播fm\nfiletype:pdf intitle:\"SSL Report\" | SSL报告主机 \nintitle:\"Skipfish . scan\" Skipfish|\nfiletype:pcf \"cisco\" \"GroupPwd\" | 具有组密码的Cisco VPN文件进行远程访问\nfiletype:rcf inurl:vpn | VPN客户端文件包含敏感信息和登录\nintitle:Index of /__MACOSX ... | 父目录Wordpress信息\ninurl:dynamic.php?page=mailbox | Webmail登录页面\ninurl:inmotionhosting.com:2096/ | Webmail登录页面\nsite:pastebin.com intext:@gmail.com | @yahoo.com | @hotmail.com daterange:2457388-2457491 | 包含电子邮件和相关密码列表的文件\ninurl:userRpm inurl:LoginRpm.htm | 列出所有TPLink路由器\ninurl:https://pma. | 登录门户\ninurl:/dynamic/login-simple.html? | 访问linksys智能WiFi帐户\ninurl:/Remote/logon?ReturnUrl | /远程/登录ReturnUrl易受攻击的Windows服务\ninurl:index.php?app=main intitle:sms | 登录门户到播放器webapp默认密码admin:admin\ninurl:/view/viewer_index.shtm|\nintitle:index of AND intext:mirai.x86 OR intext:mirai.mips OR intext:mirai.mpsl OR intext:mirai.arm OR intext:mirai.arm7 OR intext:mirai.ppc OR intext:mirai.spc OR intext:mirai.m68k OR intext:mirai.sh4 | 查找感染服务器', '通过这些搜索语句你可以搜索到想要的任何东西,一条一条试总会有惊喜~~如果你还有其他更好的语句欢迎补充!', 0, b'0', b'0', NULL, 0, 0, 'https://static-admin.madaoo.com/hack%20%281%29.png', 'Google 黑客常用搜索语句一览', 1, 18, NULL, '1234533425', 88, '1');
INSERT INTO `ar_article` VALUES ('1271825246982377472', 1592090542898, 1595024518453, 0, '\n### 什么是单元测试?\n一个单元测试是一段代码(方法),调用另一段代码(方法),然后校验(断言)某些假设的正确性,单元测试主要是验证 SUT ( system under test )本身的实现逻辑的正确性\n\n### 一个优秀的单元测试应该具备哪些条件?\n- 快速\n- 容易编写、易读\n- 可重复执行的\n- 覆盖被测方法的所有分支\n- 结果是稳定的\n- 无论时间间隔多久得到的结果是相同的\n\n### 单元测试有哪些好处?\n单元测试可以说是项目稳定运行的保障,一套成熟的单元测试系统不仅可以增加项目的稳定性、健壮性,同时也能增加你对自己代码的信心,方便你的后期维护、重构等工作。\n\n或者当你维护千级别甚至万级别代码,时不时的需要修bug,更严重的是该程序还是跑在商业服务器上,出问题往往意味着真金白银的时候,你改动一点点可能就要考虑半天,这时候你可能会切身体会到单元测试的好处了\n\n### 不使用单元测试行不行?\n一部分人应该经历过维护老项目,经常出现改了A,B出问题了,就像下图中的小熊。\n为什么会这样呢?我想这其中一很大部分是你并不清楚上一个人这块为什么这么写,这样写解决什么问题,这里不用我说想必大家也知道如果这里有单元测试,那么改之前和改之后有没有影响其他地方应该一目了然了吧。\n\n\n\n\n### 测试,不仅仅关于未知\n说起测试,往往与未知相关联。我们通过试验、调试、检测来获取获取反馈,不断调整。\n\n\n\n### 误区\n很多人没搞明白单元测试和集成测试的区别,\npostman测试的接口一般就是集成测试。\n\n- 单元测试:测试的是程序员写的代码逻辑,函数拆分、架构是否合理等,代码对于程序员来说是透明的,可以做代码逻辑的覆盖性测试,做逻辑覆盖,使用 mock 就可以了,不需要连接数据库\n- 集成测试:一般是集成数据库、MQ等,端到端(End-to-End,这里简单理解为:从需求发起,到需求满足的全程)的测试:属于黑盒、灰盒测试的范畴,不属于单元测试了,\n\n\n### 在公司中如何应用单元测试?\n1. 代码覆盖率\n2. 代码审查\n\n#### 代码覆盖率\n项目中代码覆盖率至少达到80%以上,如果严格些100%也是可以,但是一般情况下单元测试并不能很好的测试全部方法,例如一些支付成功回调接口。\n\n#### 代码审查\n单纯使用代码覆盖率并不能保证你的项目真正应用了单元测试,如果没有一个好的制度管理约束那么只会使项目更乱,没有代码审查你可能都发现不了竟然有人写的单元测试连断言都没有。\n\n我认为一个稳定项目的背后必然少不了代码审查这个流程,没有这项流程你可能会错过学习和提高生产力中很大很有趣的一部分,代码审查可以帮助你创造出可读,高质量、能持续使用多年的代码,并让你充满自信。\n\n> 世间万物讲究个循环,正向和恶向,正确的方式、引导会使你创作的孩子越来越好正向循环,反之亦然。\n\n如果你的公司没有单元测试,那么你可以工作部门变革的倡导者去尝试提出建议和优化,这种变革其实更多的是同事们心理上的改变,而非技术上的,人都是不喜欢改变的,因为那通常伴随着大量的害怕、不确定和怀疑。\n\n当领导接受了你的建议,那么你必然成为这个领取的领导者,你会发现你将进入正向循环中,在此领域你会发挥出你的力量,让自己深耕这片领域。\n> 请记住:机会都是争取来的。\n\n### 单元测试\n单元测试是从测试**最小单元**为维度展开,也就是只测一个方法,只关注代码逻辑,其他的都不关心,这里我使用mockito+junit为案例演示\n参考 [Github](https://github.com/GuoGuang/spring_junit_mockito_example)\n\n#### 配置Mockito和MockMvc\n```\npublic class UserControllerUnitTest {\n\n private MockMvc mockMvc;\n\n /**\n * 被测类中用的类使用@Mock模拟\n */\n @Mock\n private UserService userService;\n\n /**\n * 模拟被测类\n */\n @InjectMocks\n private UserController userController;\n\n @Before\n public void init(){\n MockitoAnnotations.initMocks(this);\n mockMvc = MockMvcBuilders\n .standaloneSetup(userController)\n .addFilters(new CORSFilter())\n .build();\n }\n \n @Ignore\n @Test\n public void test_page() throws Exception {\n /*MvcResult result = mockMvc.perform(MockMvcRequestBuilders.get(\"/welcomeController\").param(\"pn\", \"5\"))\n .andReturn();\n //请求成功以后,请求域中会有pageInfo;我们可以取出pageInfo进行验证\n MockHttpServletRequest request = result.getRequest();\n PageInfo pi = (PageInfo) request.getAttribute(\"pageInfo\");\n assertEquals(1,pi.getPageNum());*/\n }\n}\n\n```\n\n#### 查询所有数据\n\n```\n @Test\n public void test_get_all_success() throws Exception {\n List<User> users = Arrays.asList(\n new User(1, \"Foo\"),\n new User(2, \"Bar\"));\n\n // 执行userService.getAll()时,返回users,这里是为了模拟/user接口的userService调用getAll返回的数据\n when(userService.getAll()).thenReturn(users);\n\n mockMvc.perform(get(\"/user\"))\n .andExpect(status().isOk())\n .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))\n .andExpect(jsonPath(\"$\", hasSize(2)))\n .andExpect(jsonPath(\"$[0].id\", is(1)))\n .andExpect(jsonPath(\"$[0].username\", is(\"Foo\")))\n .andExpect(jsonPath(\"$[1].id\", is(2)))\n .andExpect(jsonPath(\"$[1].username\", is(\"Bar\")));\n\n // 验证调用次数\n verify(userService, times(1)).getAll();\n verifyNoMoreInteractions(userService);\n }\n```\n\n\n\n### 集成测试\n集成测试每次测试都需要启动一次容器\n\n```\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class ResourceServiceTest {\n\n @Autowired\n private ResourceService resourceService;\n\n @Test\n public void findResourceByCondition() {\n QueryVO queryVO = new QueryVO();\n List<Resource> dictByCondition = resourceService.findResourceByCondition(new Resource(), queryVO);\n Assert.assertTrue(dictByCondition.size() > 0);\n\n }\n}\n```\n\n\n实际开发中业务并非如此简单,可能涉及三方、MQ、等中间件服务,其实这也是上文所说为什么测试覆盖率80%也可以的原因。具体测试案例需要根据业务需求来定。\n\n\n### 如何进行TDD \n说到单元测试就离不开TDD,TDD:Test Driven Development(测试驱动开发),强调测试优先开发:红-绿-黑(重构)循环,具体参考下图\n\n\nTDD更大意义在于驱动接口,而不仅仅是驱动代码细节\n\nTDD要求根据需求先写粗粒度的功能测试,这些测试能驱动出程序的接口, 然后写细粒度的单元测试,驱动出细节代码\n\n#### 流程\n1. 写一个失败的测试用例,这一步通常测试接口而非实现,重点在于被测单元需要完成什么功能\n2. 写一点代码实现,让这个测试通过\n3. 重构代码(如果需要的话),转到第一步\n\n\n\n\n### 自动化构建、部署、发布\n最后分享一下我的博客后端[仓库](https://github.com/GuoGuang/codeway_service)中包含一条线流程图,此发布线相对简单但也基本流程都包括了\n\n> 如果你在阅读过程中有自己的见解或观点,烦请不吝指教,谢谢。\n\n', '一个单元测试是一段代码(方法),调用另一段代码(方法),然后校验(断言)某些假设的正确性,单元测试主要是验证 SUT ( system under test )本身的实现逻辑的正确性', 3, b'0', b'1', NULL, 0, 0, 'https://static-admin.madaoo.com/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95.png', '单元测试Junit+mockito', 1, 12, NULL, '1234533425', 20, '1');
INSERT INTO `ar_article` VALUES ('1279588510763978752', 1593941449225, 1593941449225, 0, '转载于 [微信公众号](https://mp.weixin.qq.com/s/8A_TSDhNEishLqkN1867lg)\n\n张东升是一家互联网公司的程序员,一直以来都勤勤恳恳老实工作。\n\n可最近一段时间,老板接了几个项目回来,不但开启了996的工作模式,更要命的是频频更改需求,弄得大家是敢怒不敢言。\n\n时间一久,东升慢慢开始消极怠工,晚上也不怎么加班了。终于有一天,和老板在会议室吵了起来,老板决意让其忙完手头的项目就离职。\n\n老板看大家最近一段时间都很辛苦,决定组织一次团建,在群里询问大家有什么活动建议。\n\n这时,张东升提议:“最近大家都工作挺累,也没有什么机会锻炼,身体要紧,要不一起去爬六峰山吧”?\n\n东升的提议获得了不少人的赞同,团建活动就这么定了下来。\n\n团建这天,爬至半山腰,东升问老板:“您看我还有机会吗?”\n\n\n老板看了他一眼,没有说话,继续抽烟。\n\n爬至山顶,大家三三两两都在拍照发朋友圈。\n\n这时东升拉住老板到一旁说给他拍照,老板知道东升是为讨好自己,也就没有拒绝。\n\n东升举起手机,却说老板衣服有褶皱,上前为其整理,竟趁其不备将其推下山崖......\n\n晚上,张东升还在电脑前调试着代码,突然,一封主题为“警告”的邮件窗口从侧边弹了出来。\n\n\n东升的心跳立刻加速,小心翼翼的点开了这封邮件,正文只有四个字:“请看附件”。\n\n附件是一个word文档,东升并没有立即打开,职业习惯让他打开了VMware虚拟机,在虚拟机中打开了这个文件。\n\n原来以为白天的事无人知晓,没想到这一幕正好被对面山头正在拍摄抖音短视频的三个小孩用手机录了下来。\n\n三个小孩看到了张东升T恤上的公司名字,并在公司网站上找到了他的邮箱,这才给他发了这封邮件。\n\n张东升看到后,大惊失色,想找到对方,却不知道对方是什么来头。\n\n这时他注意到附件是一个docx文件,想到office2007及其以后的版本才用这个格式,其实际上是一个压缩文件格式zip。\n\n东升思索片刻将其重命名为一个zip文件,然后解压,想看看是否能发现些什么信息。\n\n\n\n接着在docProps目录下找到了app.xml:\n\n...\n<AppVersion>15.0000</AppVersion>\n...\n\n版本号是15,看来对方用的是一个Office2013版本的word。\n\n东升很快在网络上搜到了一个漏洞:CVE-2017-11882,这是一个可以远程执行代码的漏洞,字符串拷贝没有对长度进行校验导致栈溢出。\n\n说干就干,东升打开了metasploit,通过它很快生成一段包含恶意代码的word文件,将其作为附件回复给了对方。\n\n三个小孩此刻正聚集在朱朝阳的家里,自从他们发送了警告邮件,心里就忐忑难耐,一直盯着电脑屏幕,看看是否会有回复。\n\n一看到邮件弹窗,就赶紧点了开来。邮件正文也只写了一句话:我想说的都在附件中。\n\n朱朝阳没有犹豫,又立刻点了附件。电脑上的Word进程随即启动,解析附件doc文件时,触发了漏洞,执行了张东升事先编写的恶意代码。而此时,朱朝阳却一无所知。\n\n\n\n恶意程序很快和张东升的电脑建立了网络连接,并开始收集朱朝阳电脑的信息,IP地址、MAC地址、电脑文件等等。\n\n东升不愧是经验丰富的程序员,为了躲过电脑防火墙的拦截,他编写的恶意代码通过ICMP协议的负载字段进行数据传输。\n\n朱朝阳正瞅着空白的word文档感到疑惑,突然电脑屏幕上出现了一个视频聊天窗口,一陌生男子的画面突然出现吓得朱朝阳惊出了一身冷汗。\n\n定睛一看,这男子不是别人,正是推人的张东升。\n\n张东升先开口了:“没想到竟然是个小孩。我已经知道你电脑的IP地址,也知道你家住在哪里,明天上午出来聊聊,就在你家巷子口的面馆。”说完就切断了视频信号。\n\n张东升的突然出现,显然吓坏了朱朝阳。一旁的严良问到:“什么是IP地址?他又是怎么知道你家的位置,连面馆都知道,这简直太可怕了。”\n\n朱朝阳镇定了两分钟,缓过神来,说到:“一定是刚才的邮件附件有问题,我的电脑已经被他控制。IP地址是电脑接入网络分配的通信身份证号码,通过IP地址就能锁定电脑的位置,再用地图一看就能知道附近的街道布局和街景画面,知道面馆也就不足为奇了”。\n\n这一夜注定是个不眠之夜。\n\n第二天,双方如约相见。张表示可以用钱买下手机,严良威胁张东升,要卖可以,必须30万。\n\n东升愣了一下,“你们小小年纪,要这么多钱做什么?”\n\n严良顶了一句:“不关你的事”。\n\n东升无奈,表示要先看到手机视频再说。\n\n朱朝阳拿出手机,刚打开视频,手机竟然没电。张见状拿出自己手机的充电器给朱朝阳。\n\n待手机充电,张看到了视频。张表示他一个程序员,挣得不多,要等到四月份发了年终奖才凑得齐。\n\n三小孩却只给了他一个星期时间。\n\n一个星期过去,见东升未曾联系,三小孩主动联系张。张却不以为意,说让他们去报警吧。\n\n三小孩不解,正想拿着手机去报警,却发现手机竟然已经死机无法打开了。\n\n原来张东升拿出的那个充电器是事先精心准备,充电器里面内置了一个小型芯片,数据线一旦连接到手机就植入病毒程序,等待时机进行手机数据破坏。\n\n\n\n不过,让张东升没有想到的是,朱朝阳竟然提前备份了数据,再次发来邮件威胁。\n\n夜晚,洗完澡的张东升看着镜子里在自己,回想这些年多少次熬夜加班,不记得何时竟已经秃头,戴上了假发。\n\n\n\n怒从心中起,恶向胆边生。张东升决定把这三个小孩一并收拾了。\n\n东升跟踪数日,终于找到另外两个小孩原来住在海边浅滩的破船上,一天夜里洒满汽油纵火焚烧。\n\n随即又潜到朱朝阳的住处,竟发现虽然已是深夜,朱朝阳还在电脑旁写着代码,旁边的书桌上放满了C/C++编程、数据结构与算法、操作系统等书籍。不禁想起了当年挑灯学习编程的自己。没想到一失足成千古恨,如今自己再也回不了头了。\n\n不知何故,张东升竟改变主意,悄然离开了。\n\n第二天,张向朱朝阳的电子邮箱里发送了一份学习资料,什么剑指offer、分布式计算、云计算、微服务、Dubbo、高并发、数据库实战,琳琅满目,应接不暇,足足有100多G。\n\n不久,海边纵火一事案发,警方通过在电信局部署的网络流量采集中心的木马警报日志,溯源恢复了之前的邮件来往信息,很快锁定了程序员张东升。\n\n张东升再次来到朱朝阳家,挟持了朱,警方随后赶到。\n\n朱问张:你杀了我的小伙伴,为什么却给我发了一堆学习资料?\n\n张东升笑着说:“杀了你有什么意思,我要你像我一样,成为一个程序员。”\n\n朝阳却说:“那你干嘛给我放网盘,100多G的资料,60KB/s,你知道要下多久吗?”\n\n东升一听大怒,举起手中利器便要作势刺向朝阳,只听一声枪响,东升应声倒下。\n\n编者注:以上故事纯属虚构。', '张东升是一家互联网公司的程序员,一直以来都勤勤恳恳老实工作。可最近一段时间,老板接了几个项目回来,不但开启了996的工作模式,更要命的是频频更改需求,弄得大家是敢怒不敢言。', 4, b'0', b'0', NULL, 1, 0, 'https://static-admin.madaoo.com/a0.jpg', '可怕!如果张东升是个程序员......', 1, 13, NULL, '1234533425', 83, '1');
INSERT INTO `ar_article` VALUES ('1280520740491366400', 1594163710114, 1599613874273, 0, '> 微服务架构中网络断开怎么办,一致性还是可用性\n\n### CAP定理是什么\n\n> 2000年7月,加州大学伯克利分校的Eric Brewer教授在ACM PODC会议上提出CAP猜想。2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。之后,CAP理论正式成为分布式计算领域的公认定理。\n\nCAP定理即:分布式数据库系统最多只能保证三分之二的这三个特点:\n- 一致性(Consistency)\n- 可用性(Availability)\n- 分区容错性(Partition tolerance)\n\n\n\n\n## cap的定义\n\n### 一致性(Consistency)\n> 一致性一般值数据一致性\n\n如果所有节点同时看到相同的数据,则认为系统是一致的。\n\n简而言之,如果我们在一致的系统上执行读取操作,则它应该返回最新写入操作的值。\n\n> all nodes see the same data at the same time \n\n所有节点同时能看到相同的数据,这就是一致性,但是一致性细化分为三种不同类型:\n\n\n#### 三种一致性分类\n注意:一般中大型项目都使用主从库,这里需要你有主从库的概念\n\n- 强一致性:用户更新头像后,并使其他用户可见,即从库复制属于同步是为强一致。\n- 弱一致性:用户更新头像后,后续部分用户访问不到新头像,即从库复制属于异步是为弱一致。\n- 最终一致性:当用户从异步从库读取时,如果此异步从库落后,他可能会看到过时的信息。这种不一致只是一个暂时的状态——如果等待一段时间,从库最终会赶上并与主库保持一致。这称为最终一致性\n\n> cap理论中的一致性是指强一致性\n\n### 可用性(Availability)\n分布式系统中的可用性可确保系统100%的时间保持运行。不管节点的状态如何,每个请求都会得到一个(非错误)响应。\n\n> Reads and writes always succeed (读写一直可用)\n\n\n### 分区容错性(Partition tolerance)\n现在的微服务基本都是分区部署,即使其中几台服务器挂掉了,那么剩余的服务器也要能够对外提供正常的系统需求.\n\n## cap取舍\n在cap理论中,P是绝对成立的,现在微服务分区部署是一个绝对的事实,多节点部署是基础设施,如果没有P,也就等于没有分布式系统,更何谈cap理论。所以在cap理论中,我们一般谈论的是ca之间的权衡,然后尽量提升P\n\n\n### cp舍a\n如果系统能够接受一段时间无响应或者停机的话,就可以在CAP中保留CP舍A,付出的代价将会是用户的体验感下降,这类设计一般只适用于内部系统,或者用户访问量不多的情况下,相较ap这种设计是比较少的。\n\n### ap舍c\n保留系统可用性和分区容错性,放弃一致性(CAP中一致性指强一致性),AP注重用户体验,分布式系统中,最大的问题就是网络传输问题,如果服务网络出现问题,那么各节点只能使用自身库(缓存)返回数据,导致用户看到的数据可能不一致。系统中舍弃强一致性并不意味着系统数据就不一致了,只是换了一种方式,不使用强一致性,而使用最终一致性,允许数据短暂时间内不同步,但是类似银行这种系统是必须要使用强一致性的。大多数互联网场景使用AP多一些,但是万事没有绝对,应该根据业务场景来进行架构设计,只有适合的才是最好的\n\n\n### 为什么CAP无法同时满足?\n可用性、分区容错性、一致性能否同时满足呢,答案是否定的。\n\n假设现在有两台服务器,NodeA和NodeB这两台服务器组成分布式系统:\n\n\n\n- 在满足一致性的时候两台服务器的数据是一样的,DB0=DB0。\n- 在满足可用性的时候,用户不管是请求NodeA还是NodeB,都会得到立即响应。\n- 在满足分区容错性的情况下,NodeA和NodeB有任何一方宕机,或者网络不通的时候,都不会影响NodeA和NodeB彼此之间的正常运作。\n\n如果NodeA和NodeB之间通信的时候网络突然出现故障,有用户向NodeA发送数据更新请求,那NodeA中的数据DB0将被更新为DB1,由于网络是断开的,NodeB中的数据库仍旧是DB0;\n\n\n\n如果这个时候,有用户向NodeB发送数据读取请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据NodeB,一般有\n二种选择:\n1. 牺牲数据一致性,响应旧的数据DB0给用户;ap舍c\n2. 牺牲可用性,阻塞等待,直到网络连接恢复,数据更新操作完成之后,再给用户响应最新的数据DB1。cp舍a\n\n> p 上面说过分布式架构特殊性,p是必选的\n\n通过以上说明了要满足分区容错性的分布式系统,只能在一致性和可用性两者中,选择其中一个。所以说分布式系统不可能同时满足三个特性。\n\n## 总结\n简而言之:\n- 一致性:无论返回哪个节点,都必须返回相同的Data。\n- 可用性:节点应该响应(必须可用)。\n- 分区容忍性:集群应该响应(必须提供),即使有节点间AA分区(即网络故障)。\n\n无论架构师、普通开发还是项目经理,cap是必须在系统设计之初做出取舍,选择最适合自己的方案。\n\n## Ref\n- [Seth Gilbert论文](https://groups.csail.mit.edu/tds/papers/Gilbert/Brewer2.pdf)', 'CAP定理即:分布式数据库系统最多只能保证三分之二的这三个特点: 一致性(Consistency)可用性(Availability)分区容错性(Partition tolerance)', 1, b'0', b'1', NULL, 0, 0, 'https://static-admin.madaoo.com/1_mWAEHYGpEjYQuCzfPg_-1g.jpg', 'CAP定理是什么?', 1, 3, NULL, '1234533425', 59, '1');
INSERT INTO `ar_article` VALUES ('1281931346926768128', 1594500024896, 1594848245036, 0, '## 什么是ClassLoader\nClassLoader在Java中有非常重要的作用,它主要工作在Class装载的加载阶段,其主要的作用是从系统外部获得Class二进制数据流。\n\n它是Java的核心组件,所有的class都是由ClassLoader进行加载的,ClassLoader负责将Class文件里的二进制数据装载进系统,然后交给Java虚拟机进行连接,初始化等操作。\n\n### ClassLoader种类\n\n名称 | 作用\n---|---\n启动类加载器(Bootstrap ClassLoader)| C++编写,在java里无法获取,负责加载<JAVA_HOME>/lib(Java.*)下的类。\n扩展类加载器(Extension ClassLoader)| Java编写,可以在java里获取,负责加载<JAVA_HOME>/lib/ext下的类。\n系统类加载器/应用程序类加载器(Application ClassLoader)| 是与我们接触对多的类加载器,我们写的代码默认就是由它来加载,ClassLoader.getSystemClassLoader返回的就是它。\n自定义ClassLoader | Java编写,定制化加载\n\n### ClassLoader的双亲委派机制\n\nJava中任意一个类,都需要由加载它的类加载器和这个类本身来一同确立其在Java虚拟机中的唯一性,判断一个类是否相同,通常用equals()方法,isInstance()方法和isAssignableFrom()方法。来判断,对于同一个类,如果没有采用相同的类加载器来加载,在调用的时候,会产生意想不到的结果;\n\n如果不是同一个类加载器加载,即时是相同的class文件,也会出现判断不想同的情况,从而引发一些意想不到的情况,为了保证相同的class文件,在使用的时候,是相同的对象,jvm设计的时候,采用了双亲委派的方式来加载类,同时也避免多份同样字节码的加载:类似于单例模式,多个ClassLoader只需要加载一个类字节码即可。形成一个整体的一种机制。\n\n如图所示,自下而上查找某个类是否被加载过,首先从CustomClassLoader开始查找(findClass)如果有加载过直接返回,如果没加载过就会委派给AppClassLoader去查找,依次查询。\n\n\n### 类的装载过程\n\n\n### 双亲委派代码解析\n一起看下在java.lang.ClassLoader中的loadClass方法,由递归实现\n\n大体流程:\n1. 子类先委托父类加载\n2. 父类加载器有自己的加载范围,范围内没有找到,则不加载,并返回给子类\n3. 子类在收到父类无法加载的时候,才会自己去加载\n\n```\n// 使用指定的<a href=\"#name\">二进制名称</a>加载类,默认实现按以下顺序搜索类\n// 1. 调用findLoadedClass()检查类是否已经加载\n// 2. 调用父类加载器方法的loadClass。 如果父级为null,则该类使用内置虚拟机的加载程序。\n// 3. 调用父类加载器没找到则自己调用findClass(String)方法来找到类\n// 如果使用上述步骤找到了该类,并且resolve标志为true,然后此方法将调用生成的Class 对象上的#resolveClass(Class)}方法。\nprotected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{\n synchronized (getClassLoadingLock(name)) {\n // First, check if the class has already been loaded (首先先查看这个类是不是已经加载过)\n Class<?> c = findLoadedClass(name);\n if (c == null) {\n long t0 = System.nanoTime();\n try {\n if (parent != null) {\n c = parent.loadClass(name, false);\n } else {\n c = findBootstrapClassOrNull(name);\n }\n } catch (ClassNotFoundException e) {\n // ClassNotFoundException thrown if class not found\n // from the non-null parent class loader\n }\n\n if (c == null) {\n // If still not found, then invoke findClass in order to find the class.(如果还是没有获得该类,调用findClass找到类)\n long t1 = System.nanoTime();\n c = findClass(name);\n\n // this is the defining class loader; record the stats (记录JVM数据)\n sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);\n sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);\n sun.misc.PerfCounter.getFindClasses().increment();\n }\n }\n // 链接到指定的类,初始化等\n if (resolve) {\n resolveClass(c);\n }\n return c;\n }\n}\n\n```\n\n## 破坏双亲委派\n待续...\n', 'ClassLoader在Java中有非常重要的作用,它主要工作在Class装载的加载阶段,其主要的作用是从系统外部获得Class二进制数据流。', 0, b'0', b'1', NULL, 0, 0, 'https://static-admin.madaoo.com/%E7%B1%BB%E7%9A%84%E8%A3%85%E8%BD%BD%E8%BF%87%E7%A8%8B.png', '什么是ClassLoader', 1, 16, NULL, '1234533425', 76, '1');
INSERT INTO `ar_article` VALUES ('1281943476912656384', 1594502916911, 1594502916911, 0, '\n\n链接:https://pan.baidu.com/s/1OVUIlH3vzYg7Cn_xi9UYHQ 提取码:v3y6\n\n包含常用的端口扫描、SQL注入、旁站扫描、提权社工等具体用途自己发挥。\n\n此工具不提供脱裤数据。\n\n> 声明:本破解教程仅作为技术探讨,由本博客产生的一切侵权、泄露数据等违法行为,与本人无关!', '包含常用的端口扫描、SQL注入、旁站扫描、提权社工等', 1, b'0', b'1', NULL, 0, 0, 'https://static-admin.madaoo.com/Hack%E7%B3%BB%E7%BB%9F%E5%B7%A5%E5%85%B7.png', '分享两套Hack工具系统', 1, 9, NULL, '1234533425', 54, '3');
INSERT INTO `ar_article` VALUES ('1290323417089478712', 1596502827272, 1597674177245, 0, '\n\n## Mac安装Fiddler\n1. 到 [官网](https://www.telerik.com/fiddler?_ga=2.190206187.1958941109.1597395530-790500829.1595069840) 下载Fiddler\n2. 安装、登录\n3. \n出现这个页面PC端基本安装完成,不需要额外配置。\n\n### 配置手机访问\n以iOS为例\n\n1. 首先在设置里的 HTTPS 标签栏里勾上 Capture HTTPS traffic,并点击 Trust root certifcate(信任证书) 按钮\n\n2. 点击Connections标签,勾选Allow remote computers to connect\n\n3. 打开电脑命令行查看ip地址\n\n```\nifconfig\n```\n4. 用**Safari**浏览器打开地址 192.168.1.6:8866 (电脑ip:端口)下载证书文件。\n\n5. 打开手机设置,会看到 已下载描述文件 这个选项,打开会看到证书直接安装即可\n\n6. 接下来需要信任证书,在关于本机里找到刚才下载的证书,Fiddler的证书一般叫(DO_NOT_TRUNS_FiddlerRoot)信任即可\n\n7. 最后一步在WIFI里找到跟电脑连接同一WIFI的进入设置里,最底部 设置代理 \n\n\n\n## Windows配置\nWindows配置手机访问跟上述一致,只是Windows上的软件配置方式不一样,但大致原理相同,这里不在详述\n\n\n## Ref\n- [参考](https://www.jianshu.com/p/d312ac54c730)', '\n\nMac安装、配置Fiddler ', 3, b'0', b'1', NULL, 0, 0, 'https://yd-note.oss-cn-beijing.aliyuncs.com/blog/Fiddler/aa.png', 'Fiddler配置', 1, 17, NULL, '1234533425', 17, '1');
INSERT INTO `ar_article` VALUES ('1290331708947828736', 1596502827272, 1596554125377, 0, '\n### 定时任务\n在开发中相信大家或多或少都会用过 @Scheduled处理定时任务,在以前都是单体服务,没有多实例的概念,但是现在随着发展越来越多的项目应用上了微服务分布式系统,分布式引发的一系列问题也随之而来,像前面说的CAP理论、分布式事务,以及这里说的分布式定时任务等等问题。\n\n定时任务如果不处理的话,N个实例会导致定时任务N次触发,后果不亚于银行转账不用强一致性导致的灾难。\n\n### 解决方案\n只要涉及到分布式,基本上就是使用分布式锁解决,定时任务也不列外,一般有以下几种:\n\n#### 一:幂等\n定时任务相对简单,比如定时清理不活跃的用户,只要保证此任务是幂等,那么执行多少次都没关系。缺点是多实例都会执行,浪费资源,虽然简洁但不推荐。\n\n#### 二:开源分布式定时任务\n[ShedLock](https://github.com/lukas-krecan/ShedLock)\n\nShedLock只做一件事。它确保您的计划任务最多同时执行一次。如果正在一个节点上执行任务,它将获取一个锁,以防止从另一个节点(或线程)执行相同的任务。请注意,如果一个任务已在一个节点上执行,则其他节点上的执行不会等待,只会跳过它。\n\nUse: 添加依赖\n\n```\n<!-- 确保spring-boot版本大于2.1.0 -->\n <parent>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-parent</artifactId>\n <version>2.2.6.RELEASE</version>\n <relativePath/> <!-- lookup parent from repository -->\n</parent>\n \n<dependencies>\n <dependency>\n <groupId>redis.clients</groupId>\n <artifactId>jedis</artifactId>\n <version>3.2.0</version>\n <scope>compile</scope>\n </dependency>\n <dependency>\n <groupId>net.javacrumbs.shedlock</groupId>\n <artifactId>shedlock-provider-redis-jedis</artifactId>\n <version>4.13.0</version>\n </dependency>\n <dependency>\n <groupId>net.javacrumbs.shedlock</groupId>\n <artifactId>shedlock-spring</artifactId>\n <version>4.13.0</version>\n </dependency>\n</dependencies>\n\n```\n\n2. 添加配置\n\n\n```\n@EnableSchedulerLock(defaultLockAtMostFor = \"10m\")\n@Configuration\n@EnableScheduling\npublic class demoConfig {\n\n @Primary\n @Bean\n public JedisPool jedisPool() {\n JedisPoolConfig config = new JedisPoolConfig();\n return new JedisPool(config, \"IP\", 6379,10000, \"密码\");\n }\n @Bean\n public LockProvider lockProvider(JedisPool jedisPool) {\n return new JedisLockProvider(jedisPool);\n }\n}\n```\n3. 测试多实例相同任务是否加锁\n\n```\n@Component\npublic class ScheduledTest {\n\n @Scheduled(cron = \"0/5 * * * * ?\")\n @SchedulerLock(name = \"scheduledTaskName\", lockAtMostFor = \"5s\",lockAtLeastFor = \"1s\")\n public void getInfoa() {\n System.out.println(System.currentTimeMillis());\n System.out.println(new Date());\n System.out.println(\"Lock one\");\n }\n\n @Scheduled(cron = \"0/5 * * * * ?\")\n @SchedulerLock(name = \"scheduledTaskName\", lockAtMostFor = \"5s\",lockAtLeastFor = \"1s\")\n public void getInfoaa() {\n System.out.println(System.currentTimeMillis());\n System.out.println(new Date());\n System.out.println(\"Lock two\");\n }\n}\n```\n\n#### 三:在代码中使用redis分布式锁\n```\n@Scheduled(cron = \"0 0 8 * * ? \")\npublic void sendMessage() {\n RLock rLock = null;\n try {\n rLock = this.redisson.getLock(\"gene_sms_state\");\n if (!rLock.tryLock(0L, 300, TimeUnit.SECONDS)) {\n return;\n }\n // do something\n } catch (Exception e) {\n this.log.warn(\"\", e.getMessage());\n } finally {\n if (rLock != null) {\n rLock.forceUnlock();\n }\n }\n}\n```\n但是每个定时任务都需要写这一套,非常繁琐。或者即使想使用上面提到的ShedLock但是引入新依赖需要考虑团队因素,最低版本限制等等,\n那么这里就可以使用切面注解进行优化,注解相对比较简单,这里就不阐述了。可以参考\n- [OptLogAspect](https://github.com/GuoGuang/codeway_service/blob/master/codeway-service-api/src/main/java/com/codeway/aspect/OptLogAspect.java)\n- [OptLog](https://github.com/GuoGuang/codeway_service/blob/master/codeway-common/src/main/java/com/codeway/annotation/OptLog.java)\n\n### 优化\n\n```\n@Scheduled(cron = \"*/1 0 0 * * ?\")\n```\n像这种每秒都执行的或者几分钟执行不建议使用以上的分布式定时任务,这种情况应该根据业务场景去写脚本走批量或者单独使用任务调度服务去解决。', '在开发中相信大家或多或少都会用过 @Scheduled处理定时任务,在以前都是单体服务,没有多实例的概念,但是现在随着发展越来越多的项目应用上了微服务分布式系统,分布式引发的一系列问题也随之而来,像前面说的CAP理论、分布式事务,以及这里说的分布式定时任务等等问题。', 3, b'0', b'1', NULL, 0, 0, 'https://static-admin.madaoo.com/time.png', '分布式定时任务的处理', 1, 17, NULL, '1234533425', 17, '1');
INSERT INTO `ar_article` VALUES ('1303501704297320448', 1599613998851, 1599616331532, 0, '\n\n## 业务场景\n在分布式框架 SpringCloud-Ribbon 中有多种负载均衡策略:\n1. 随机访问策略。系统随机访问,缺点:可能造成服务器负载压力不均衡,俗话讲就是撑的撑死,饿的饿死。\n2. 轮询策略。请求均匀分配,如果服务器有性能差异,则无法实现性能好的服务器能够多承担一部分。\n3. 权重轮询策略。权值需要静态配置,无法自动调节,不适合对长连接和命中率有要求的场景。\n4. Hash取模策略。不稳定,如果列表中某台服务器宕机,则会导致路由算法产生变化,由此导致命中率的急剧下降。\n5. ...\n\nRibbon默认使用轮询到服务列表中选取一个实例,但是现在我们需要的是一个根据请求中的某个key进行Hash之后来实现同一个key每次只会访问到同一个实例的功能,Ribbon并没有提供这种实现方式,下面就需要用到自定义一致性hash来实现这个功能\n\n## 什么是一致性Hash?\n> 一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。\n\n### 特性\n- 容错性\n- 拓展性\n- 平衡性(Balance):哈希的结果尽可能分布到所有节点中\n- 单调性(Monotonicity):如果一些内容已经分派到了响应的节点中,此时又有新的节点加入,Hash结果应能够保证原有分派的内容可以被映射到新的节点中去,而不会被映射到旧的节点中去。比如求余Hash(object % N)无法满足单调性\n- 平滑性(Smoothness):服务节点数目平滑改变和负载的平滑改变一致\n\n\n### 一致性 Hash 算法\n一致性hash之前是hash取模,hash取模的方式增加或删除了一个节点时,所有的 Key 都需要重新计算,显然并不完善,而采用一致性哈希可以解决所有的 Key 都需要重新计算的问题。\n\n一致 Hash 算法核心是将所有的哈希值构成一个环,范围在 0 ~ 2^32-1。\n然后将各个节点Hash之后到这个环上,可以用节点的 IP、hostname 等唯一字段作为 Key 进行 hash(key),散列之后如下:\n\n\n\n之后将请求定位到对应的节点上,使用同样的 hash 函数 将 Key 也映射到这个环上。\n\n\n\n这样按照顺时针方向就可以把 key1 定位到 Node1节点,key2 定位到 Node2节点,key3 定位到 Node3节点,这样既可实现一个ip每次都只访问同一节点\n\n\n### 容错性 \n\n一致性 Hash有很好的容错性支持,现在假设Node1、Node4节点挂了\n\n\n\n那么请求依然会根据顺时针方向,key3 保持不变,key1、key2、key4 被重新映射到了 Node2。这样就很好的保证了容错性,当一个节点挂掉时只会影响到少部分的数据。\n\n### 扩展性\n当我们新增一个节点时\n\n\n\n在 Node1 和 Node3 之间新增了一个节点 Node4 ,这时受影响的数据只有 Key4,其余数据保持不变,完美保证其拓展性。\n\n\n### 虚拟节点\n目前为止该算法依然存在问题,当节点较少时会出现数据分布不均匀的情况:\n\n\n\n当只有很少例如两个节点时会导致大部分数据都在 N1 节点,只有少量的数据在 N2 节点。\n\n为了解决这个问题,一致哈希算法引入了虚拟节点。将每一个节点都进行多次 hash,生成多个节点放置在环上称为虚拟节点:\n\n\n\n计算时可以在 IP 后加上编号来生成哈希值。这样只需要在原有的基础上多一步由虚拟节点映射到实际节点的步骤即可让少量节点也能满足均匀性。\n\n### 实践\n以上皆为理论概述,下面来实现在Spring Cloud 中根据用户请求中某个字段进行哈希后每次只访问同一个节点的功能\n\n```\n// 新增 Ribbon 实现类\n\n```\n\n\n## 总结\n一致性hash解决了增减服务器导致的大量震荡问题\n\n\n## REF\n- [一致性哈希](https://crossoverjie.top/2018/01/08/Consistent-Hash/)', '一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用。', 3, b'0', b'1', NULL, 0, 0, 'https://static-admin.madaoo.com/cross_scratches_%402X.png', '一致性Hash', NULL, 13, NULL, '1234533425', 63, '1');
INSERT INTO `ar_article` VALUES ('1308425784444194816', 1600787991044, 1600787991044, 0, ' \n程序员不喜欢写文档,如果有时间写文档,还不如把代码重构一遍。早前我也这么认为,究其原因,一则自己不喜欢也不擅长写文档,代码是给机器读的,只要语法和逻辑没问题,计算机就会听命执行,而文档是写给人看的,除了语法和逻辑,好文档还要照顾读者的心理感受;二则传统软件的客户对文档无感,它仅仅作为合同约定的交付物存在,客户压根就不会读这些文档,他们更依赖我们提供的现场培训和技术支持,让客户看文档自学太不符合甲方的身份了。\n\n但现如今大部分软件产品都通过互联网向用户提供服务了,在线文档才是最高效的客户服务通道,我们熟知的那些开源软件都配有高质量的在线文档。好文档是优秀产品的标配,它不仅可以帮你带来更多的用户,而且还可以帮你服务更多的用户。作为互联网程序员的你,要是不懂如何写一份好的技术文档,都不好意思跟人打招呼,更别想做出好的产品。\n\n### 好文档的评判标准是什么\n无从下手,不知道从什么角度写,写些什么,这是我们经常遭遇的情况,那为什么会发生这种情况呢?通常是没有找到写作的意义,如果是为了交差而写,脑袋很容易卡壳,思路无法拓展。在敲键盘之前,我们先要想清楚这份文档是写给谁看的,通过这份文档可以帮读者解决什么问题。写作是我们输出影响力的一种能力,其最终目的是为了改变读者的信息、行为或信仰等,否则就是言之无物的垃圾。等明确了目标读者和意义之后,我们的思路也就打开了。\n\n在想清楚这个问题之前,我们最好不要动手写文档,但真实情况是在不知道该写什么时,许多人就拿大量的实现细节来滥竽充数,包括代码片段和配置说明等,主要目的就是增加文档的篇幅,他的出发点不是用户需不需要,而是我擅长和熟悉什么,用户很容易被你的细节内容搞的不知所云。这就好比某个人的武艺很高,总爱在人前炫技,而不是在帮助他人解决问题的过程中显露自己的本领,通常这种人很遭人反感的。\n\n编写技术文档的过程中会遇到哪些常见问题呢?通常我们习惯一上来就非常详尽地介绍这款产品有哪些特性,具体怎么安装、配置和使用等等,其实大部分潜在用户都是初次接触此类产品,他对我们的产品还没有完整的认知,压根不知道这款产品到底能帮他解决什么问题,对他而言有什么价值,一上来就深入细节就很容易把潜在用户搞蒙。\n\n记得当年研究生毕业准备答辩幻灯片,导师给我们传授了一些经验:“答辩就是将自己的研究结果展示给评委,改变评委对这个研究课题上的认知,以及对自己的印象,从而获得较高的评分。幻灯片最好从Why开始,告诉评委这个研究课题的背景和意义,有了这个上下文做铺垫,评委才可能对你的研究感兴趣,才会跟随你了解后面的What和How。”\n\n非功能特性是依附在功能特性上的,一款对用户毫无价值的产品,即使其非功能特性很优秀,那也引不起用户的兴趣。技术文档的开篇必须要通过介绍产品或方案的价值来跟用户建立连接,让他知道这款产品或方案跟他的工作是息息相关的,它可以帮助他优化工作。接下来才是让用户了解这款产品或方案是什么,以及怎么使用。这其实跟软件研发的流程类似,从用户需求开始,先分析梳理用户的痛点,再到产品需求,设计一款产品来解决用户的痛点,最后才是开发实现。\n\n### 文档目录设计与用户思维\n当我们明确了文档的目标读者,也明确了可以为读者解决哪些问题,写作本身就有了指向和价值,这样我们就可以调动身心和大脑,让自己文思泉涌,这就是用户思维。在此基础上,我们就可以开始考虑文档应该包含哪些内容,目录章节该怎样安排设计才更符合用户的学习规律。文档就是我们对外输出的一个产品,做产品就要学会换位思考,站在用户的视角考虑他们需要什么样的产品或方案,用户在技术选型时也是先确认产品或方案对其是否有价值,等他认可了这个价值之后才会进一步了解产品或方案的功能特性和使用方法。\n\n今年上半年我们团队研发了一套微服务开发运维平台,下半年我们要把它推广给集团各个专业公司的研发团队,这时候我们就在思考目标用户当中哪些角色可以决定是否采用这款产品?通常是应用架构师,但他首先要了解这款产品的整体定位和作用,相较于其他同类产品有什么优势,这个阶段他不太关心产品的实现和操作等细节。另外,掌控感,或者说安全感,每个人都希望拥有的,那我们要帮用户建立这种感觉。在帮用户解决具体问题之前,我们要先搞定用户的情绪问题,让他在阅读文档时体验更佳。\n\n如何帮用户获得掌控感或安全感呢?全景视图,让用户拥有上帝视角,从整体上把握产品或方案的情况,这个视图不会包含太多细节。就像要穿越一片热带雨林到达某个地方,如果一头就扎进森林里,那我们很容易就迷路了,最好是先爬上某处高地或树冠,从那里观察整片森林的情况,包括河流走向和地标特征等,掌握了这些信息之后我们就会更有安全感,更有把握走出这片森林。全景视图就像一个装载信息的框架,我们要先帮用户建立这个框架,后续再给用户介绍详细信息,这时候用户就可以把它们收纳进这个框架的不同位置,这样他就不轻易迷路了。因此,文档第一部分是产品概述,包括背景说明、功能定位和优势比较等等。\n\n在对这款产品有了整体了解之后,那应用架构师这个角色接下来就要搭建一套演示环境了,以便对产品有更加感性的认知。这个阶段他不需要特别全面或深入地了解各种细节,只需要知道如何以最简单、最快速的方式把它配置运行起来,他可以借助这套环境给团队内的开发测试人员介绍这款产品。因此,文档第二部分是快速入门,主要是协助应用架构师把对概念理论的理解变成一套真实可见的演示环境。\n\n通过上述两部分内容,我们让用户知道这款产品可以帮他解决什么问题,以及它是怎样运行的。接下来用户当中的开发、测试工程师等角色才会介入进来,他们需要深入了解产品的功能特性和使用方法,以便指导具体的编码实现。因此,文档的第三部分才是介绍产品特性的开发指南。不同角色的用户对文档有不同的需求,文档的章节目录设计要依照上述顺序来满足各类用户的需求。第四部分,除了知道怎样使用这款产品之外,用户还会关心在日常使用过程中怎样运营维护它,有没有一些配套工具或管理控制台,借助它监控微服务的运行情况,以及对微服务进行管控治理等等。第五部分,使用过程中遇到问题怎么办,尤其某些出现频率非常高的问题,这部分就要对这些常见问题做梳理,遭遇问题时方便用户查阅。\n\n1. 产品简介\n2. 快速入门\n - 快速搭建环境\n - 快速开发应用\n3. 开发指南\n - 基础开发指南\n - 进阶开发指南\n - 扩展开发指南\n4. 操作指南\n - 服务治理指南\n - 网关配置指南\n5. 常见问题\n6. 经典案例\n7. 历史版本\n8. 下载说明\n\n### 故事思维让文档不再枯燥\n文档的章节目录设计要围绕用户需求:首先,我们要分析用户的类型,明确哪些类型的用户会先接触到这款产品;再者,说服了这批用户之后会带来哪些新类型的用户,这就是产品推广过程中接触用户的自然过程。在线文档的主要作用就是帮助我们获得新的用户,但我们必须要记住,推广产品是我们一厢情愿的想法,是站在我们的立场角度考虑问题,它是第二位的。写文档必须要先站在用户的立场角度,帮他们解决具体的问题,在解决问题的过程中顺便推销了产品,这才是用户思维的价值所在。\n\n与用户思维同等重要的另一个思维模式叫做故事思维,这是人类大脑在漫长的进化过程中形成的生理特质所决定的,我们对故事类信息的接收会更加高效一些。如果你干巴巴地罗列产品功能特性,就像传统的产品使用说明书一样,那用户在阅读这份文档时是无感的,他会觉得枯燥无味、困难重重,无法将产品跟他遇到的问题联系起来。此时,我们就需要采用故事思维来组织包装这些素材,结合用户的使用场景讲故事。\n\n故事思维的落地关键在于设计一个故事剧本,就像拍摄一部电影或者创作一本小说,你需要设计好每一幕的故事梗概,第一步干什么,第二步干什么,第三步干什么,...... 把每一步会出现哪些角色元素、这一步他们需要完成什么事情想清楚。那怎样设计这个故事剧本呢?窍门就是思考用户是怎样使用我们这款产品的,还是以微服务开发运维平台为例,我们在“快速入门 -> 快速搭建环境”章节就设计了这样一个剧本:\n\n1. 介绍微服务应用的标准架构\n2. 搭建微服务必备组件:注册中心\n3. 构建一个扮演Provider的微服务\n4. 构建一个扮演Consumer的微服务\n5. 搭建微服务必备组件:API网关\n6. 搭建微服务必备组件:配置中心\n7. 搭建微服务必备组件:治理中心\n8. 对照标准架构介绍演示环境\n\n这个剧本是根据用户真实使用过程设计的,通过收集整理这些典型场景提炼出故事剧本,通过剧本组织各种素材。在阅读这份文档时,用户就会自然而然地代入到他真实的工作场景中,因为在用户脑海里原本就存在一些上下文,故事就是帮用户把上下文调度出来,这会有助于更好地理解文档,对文档可以带给他的价值有更清晰的认知。通过自助阅读文档解决了真实的问题,做到不求人会让他更有成就感。\n\n### 故事线模拟用户学习过程\n等故事的基本框架确定之后,我们就可以依次填充故事的各个部分,第一步该搭建哪个部件,第二步又该搭建哪个部件等等,一步一步层级递进,后续步骤依赖于前序步骤,从而构成一个向导式循序渐进过程,引导用户由浅入深、由易到难,这符合自然的学习过程,这样更容易让用户接受。\n\n编写技术文档时有一种常见问题就是章节之间没有关联,彼此之间没有转承衔接,各部分内容比较零散,就像把不同主题的文章做成了杂文集。用户在阅读此类文档时思维很跳跃,刚看完一个内容,再看另外一个,这两者没有必然的联系。这其实也是没有站在用户角度思考问题,用户跟我们不一样,他对产品或方案不像我们这样熟悉,缺少我们所掌握的隐性信息,章节内容上的跳跃加重了用户阅读文档的难度。最好就是找到一条线索将每个章节的内容衔接起来,就像章回体小说一样,看完这章想下章。借鉴Oracle JDK的示例工程宠物商店(Java Pet Store) ,我们也设计了一个简单但完整的用户信息管理服务来贯穿整个故事。\n\n### 进阶式设计跨越学习曲线\n在文档内容编排方面,我们不要一次性让用户学习太多新东西,向导里每个步骤的内容分布,必须要符合进阶式的学习模型,一下子给用户展示太多信息,只会把用户搞懵圈,让他产生畏难的情绪,对学习丧失兴趣。每个小节的内容不能填充的太多,尽量控制在十五分钟到半个小时以内,用户只要稍稍努力就可以完成挑战,这样用户就会感受到学习的乐趣,小步快跑,每一次小小的进步都可以激励自我,这样他就有信心自助式地完成整个系统的学习了。这样的学习方式是符合人性的,符合学习心理学的。\n\n近段时间参与外部客户项目写标书,刚开始大家都无从下手,打不开思路,想着从网络上摘抄一些内容粘贴进去,但这样写作味同嚼蜡,写的不开心,读的也没感觉。后来就想到我们必须要揣摩读者,想象对面就坐着读者。标书的读者是跟我们一样在专业领域有着丰富经验的评委,我们没有必要向他讲解任何概念性的内容,在标书中我们只需要围绕客户的问题提供解决方案,简明扼要,点到为止,这样即是对评委的尊重,也是体现我们的专业性,我们不是出售文字,而是出售专业经验,就是有个流传甚广的故事里说的,一个专家被请去给工厂诊断故障原因,他在工厂里转了一圈只用粉笔花了一个叉叉,就挣了十万美金。\n\n不同的读者要采用不同的沟通方式,除了要清楚读者的角色和能力等级,还要知道自己在这次对话中扮演的角色,俯视时要就低不就高,仰视时也要就低不就高,平视时做到点到为止,即读者的能力水平跟自己相似,那就要做到简明扼要、切中要害。从读者角度看,照顾对方的心理,让他感到舒服就对了。\n\n### 不同视图服务不同的用户\n那你可能会说,除了新用户还有许多老用户需要看在线文档,上述这种设计是否符合他们的使用习惯了呢?针对不同类型的用户,我们必须要提供不同的视图,或者说不同的入口,例如按照产品的功能特性建立一个索引视图,类似Hao123一样的导航页面,或者提供一个搜索框,深度用户对我们的产品已经非常熟悉了,他们可以通过这些入口快速找到他们想要的内容,从而更加高效地使用这份文档。同样的内容通过不同的组织方式呈现给不同的用户,这就是视图法带给我们的价值,横看成岭侧成峰,远近高低各不同。\n\n### 实战\n[参考阿里云短信文档](https://www.google.com/search?q=springcloud+%E6%B7%BB%E5%8A%A0%E9%82%AE%E4%BB%B6%E6%8A%A5%E8%AD%A6&oq=springcloud+%E6%B7%BB%E5%8A%A0%E9%82%AE%E4%BB%B6%E6%8A%A5%E8%AD%A6&aqs=chrome..69i57.10841j0j7&sourceid=chrome&ie=UTF-8)\n\n基于三个原则:\n- What:是什么,解决了什么问题。\n- Why:为什么采用这个,技术选型对比,优缺点\n- How:如何下手...\n\n\n\n## Ref \n- [如何写出好的产品帮助文档?](https://segmentfault.com/a/1190000021372464)', '如何正确编写服务文档,微服务文档如何正确编写?', 1, b'0', b'1', NULL, 2, 0, 'https://static-admin.madaoo.com/%E9%BB%98%E8%AE%A4%E6%96%87%E4%BB%B61600787966444.png', '如何正确编写服务文档?', NULL, 2, NULL, '1234533425', 12, '1');
INSERT INTO `ar_article` VALUES ('1309499624968556544', 1601044014576, 1601139283461, 0, '\n\n## 什么是信息搜集\n信息搜集也称踩点,信息搜集毋庸置疑就是尽可能的搜集目标的信息,包括端口信息、DNS信息、员工邮箱等等看似并不起眼的一些信息都算是信息搜集,这些看似微乎其微的信息,对于渗透测试而言就关乎到成功与否了。\n\n### 信息搜集的重要性\n信息搜集是渗透测试的最重要的阶段,占据整个渗透测试的60%,可见信息搜集的重要性。根据收集的有用信息,可以大大提高我们渗透测试的成功率。\n\n### 信息搜集的分类\n1. 主动式信息搜集(可获取到的信息较多,但易被目标发现)\n2. 通过直接发起与被测目标网络之间的互动来获取相关信息,如通过Nmap扫描目标系统。\n3. 被动式信息搜集(搜集到的信息较少,但不易被发现)\n4. 通过第三方服务来获取目标网络相关信息。如通过搜索引擎方式来搜集信息。\n\n### 信息收集哪些东西\n* whois信息\n* 子域名\n* 旁站\n* 端口\n* 目录,敏感信息泄露\n* C段\n* 网站架构\n* 判断WAF\n* 判断CMS\n* 真实IP\n* DNS信息\n* 社工利用 \n\n\n### 信息收集流程\n\n网站由域名,服务器,WEB应用组成。\n\n可以先从域名开始\n\n* 域名:whois,备案,子域名等\n* 服务器:真实IP,DNS信息,端口,等\n* WEB:网站框架,目录信息敏感信息泄露,旁站,C段,WAF,CMS等\n* 企业:天眼查,信用信息等 \n\n信息收集脑图:  \n\n\n## 域名信息收集\n\n### Whois查询\n\n> Whois 简单来说,就是一个用来查询域名是否已经被注册,以及注册域名的详细信息的数据库(如域名所有人、域名注册商、域名注册日期和过期日期、DNS等)。通过域名Whois服务器查询,可以查询域名归属者联系方式,以及注册和到期时间\n\n可以通过whois信息进行反查,邮箱,联系人等信息来反查到更多的信息\n\n查询域名注册邮箱通过域名查询备案号通过备案号查询域名反查注册邮箱反查注册人通过注册人查询到的域名在查询邮箱通过上一步邮箱去查询域名查询以上获取出的域名的子域名\n\n### 主动查询\n\nkali 自带whois查询 命令:whois + ip/域名\n\n### 被动查询\n\n* [http://tool.chinaz.com/ipwhois/](http://tool.chinaz.com/ipwhois/)\n* [http://whois.xinnet.com/](http://whois.xinnet.com/)\n* [https://whois.cloud.tencent.com/](https://whois.cloud.tencent.com/)\n* [https://site.ip138.com/](https://site.ip138.com/)\n* [https://www.whois.net/](https://www.whois.net/)\n* [https://whois.aizhan.com/](https://whois.aizhan.com/) \n\n### IP反查\n\nDnslytics地址:[https://dnslytics.com/](https://dnslytics.com/)\n\n利用Dnslytics反查IP可以得到如下信息:\n\nIP informationNetwork informationHosting informationSPAM database lookupOpen TCP/UDP portsBlocklist lookupWhois informationGeo informationCountry informationUpdate information \n\n利用Dnslytics反查域名可以得到如下信息:\n\nDomain and Ranking InformationHosting Information{ A / AAAA Record NS Record MX Record SPF Record}Web InformationWhois Information\n\n### 浏览器插件\n- myip.ms\n- TCPIPUTILS\n- DNSlytics\n\n### 子域名收集\n\n> 子域名收集可以发现更多目标,以增加渗透测试成功的可能性,探测到更多隐藏或遗忘的应用服务,这些应用往往可导致一些严重漏洞。当一个主站坚不可摧时,我们可以尝试从分站入手。\n\n#### 主动收集\n\n* layer子域名挖掘机5.0:[https://pan.baidu.com/s/1wEP_Ysg4qsFbm_k1aoncpg](https://pan.baidu.com/s/1wEP_Ysg4qsFbm_k1aoncpg) 提取码:uk1j\n* subDomainsBrute:[https://github.com/lijiejie/subDomainsBrute](https://github.com/lijiejie/subDomainsBrute)\n* wydomain:[https://github.com/ring04h/wydomain](https://github.com/ring04h/wydomain)\n* broDomain:[https://github.com/code-scan/BroDomain](https://github.com/code-scan/BroDomain)\n* ESD:[https://github.com/FeeiCN/ESD](https://github.com/FeeiCN/ESD)\n* aiodnsbrute:[https://github.com/blark/aiodnsbrute](https://github.com/blark/aiodnsbrute)\n* OneForAll:[https://github.com/shmilylty/OneForAll](https://github.com/shmilylty/OneForAll)\n* subfinder:[https://github.com/projectdiscovery/subfinder](https://github.com/projectdiscovery/subfinder)\n* Sublist3r:[https://github.com/aboul3la/Sublist3r](https://github.com/aboul3la/Sublist3r) \n\n#### 被动收集\n\n* ip138:[https://site.ip138.com/](https://site.ip138.com/)\n* 站长工具:[http://tool.chinaz.com/subdomain/?domain=](http://tool.chinaz.com/subdomain/?domain=)\n* hackertarget:[https://hackertarget.com/find-dns-host-records/](https://hackertarget.com/find-dns-host-records/)\n* phpinfo:[https://phpinfo.me/domain/](https://phpinfo.me/domain/)\n* t1h2ua:[https://www.t1h2ua.cn/tools/](https://www.t1h2ua.cn/tools/)\n* dnsdumpster:[https://dnsdumpster.com/](https://dnsdumpster.com/)\n* chinacycc:[https://d.chinacycc.com/index.php?m=Login&a=index](https://d.chinacycc.com/index.php?m=Login&a=index)\n* zcjun:[http://z.zcjun.com/](http://z.zcjun.com/)\n* 搜索引擎语法site:域名\n\n### 工具使用\n- layer子域名挖掘机5.0: 使用这款工具首先要安装.net framework 4.0以上\n\n## 备案信息\n\n> 备案信息分为两种,一种是IPC备案信息查询,一种是公安部备案信息查询。如果是国外的服务器是不需要备案的,因此可以忽略此步骤,国内的服务器是需要备案的,因此可以尝试获取信息。\n\n### 被动收集\n\n* ICP备案查询网:[http://www.beianbeian.com/](http://www.beianbeian.com/)\n* ICP备案查询-站长工具:[http://icp.chinaz.com/](http://icp.chinaz.com/)\n* SEO综合查询-爱站:[https://www.aizhan.com/cha/](https://www.aizhan.com/cha/)\n* 批量查询-站长工具:[http://icp.chinaz.com/searchs](http://icp.chinaz.com/searchs)\n* 美国企业备案查询:[https://www.sec.gov/edgar/searchedgar/companysearch.html](https://www.sec.gov/edgar/searchedgar/companysearch.html)\n* 公安部备案查询:[http://www.beian.gov.cn/portal/recordQuery](http://www.beian.gov.cn/portal/recordQuery)\n\n### 主动收集\n\n- 社工\n- 服务器信息收集\n\n### DNS信息收集\n\n> 通过查询DNS信息,我们可能可以发现网站的真实ip地址,也可以尝试测试是否存在DNS域传送漏洞。\n\n### 主动收集\n\n* Kali(host、big命令)\n* windows(nslookup命令) \n\n### 被动收集\n\n* dnsdb:[https://www.dnsdb.io/zh-cn/](https://www.dnsdb.io/zh-cn/)\n* viewdns:[https://viewdns.info/](https://viewdns.info/)\n* 站长工具:[http://tool.chinaz.com/dns/](http://tool.chinaz.com/dns/)\n* tool:[https://tool.lu/dns/](https://tool.lu/dns/) \n\n## 端口信息收集\n\n### 主动收集\n\n* Nmap:[https://github.com/nmap/nmap](https://github.com/nmap/nmap)\n* Masscan:[https://github.com/robertdavidgraham/masscan](https://github.com/robertdavidgraham/masscan)\n* masnmapscan:[https://github.com/hellogoldsnakeman/masnmapscan-V1.0](https://github.com/hellogoldsnakeman/masnmapscan-V1.0)\n* ZMap:[https://github.com/zmap/zmap](https://github.com/zmap/zmap) \n\n### 被动收集\n\n* FOFA:[https://fofa.so/](https://fofa.so/)\n* 钟馗之眼:[https://www.zoomeye.org/](https://www.zoomeye.org/)\n* shodan:[https://www.shodan.io/](https://www.shodan.io/) \n\n## 浏览器插件\n\n* Shodan\n* TCPIPUTILS\n* DNSlytics\n* fofa-view \n\n## 工具使用\n\n### Nmap 扫描多个ip\n\n 扫描整个子网 nmap 192.168.6.1/24 nmap 192.168.1.1/16 nmap 192.168.1-30.1-254 nmap 192.168.1-254.6扫描多个主机 namp 192.168.6.2 192.168.6.6扫描一个小范围 nmap 192.168.6.2-10扫描txt内的ip列表 nmap -iL text.txt扫描除某个目标外 nmap 192.168.6.1/24 -exclude 192.168.6.25\n\n* 绕过Firewalld扫描主机端口:\n\n \n\n通过不同的协议(TCP半连接、TCP全连接、ICMP、UDP等)的扫描绕过Firewalld的限制\n\nnmap -sP 192.33.6.128nmap -sT 192.33.6.128nmap -sS 192.33.6.128nmap -sU 192.33.6.128nmap -sF 192.33.6.128nmap -sX 192.33.6.128nmap -sN 192.33.6.128\n\n* 初步扫描端口信息\n\n nmap -T4 -A -v -Pn 192.168.1.1/24 -p 21,22,23,25,80,81,82,83,88,110,143,443,445,512,513,514,1433,1521,2082,2083,2181,2601,2604,3128,3306,3389,3690,4848,5432,5900,5984,6379,7001,7002,8069,8080,8081,8086,8088,9200,9300,11211,10000,27017,27018,50000,50030,50070 -oN nmap\\_result.txt\n\n* 扫描端口并且标记可以爆破的服务\n\n nmap 127.0.0.1 --script=ftp-brute,imap-brute,smtp-brute,pop3-brute,mongodb-brute,redis-brute,ms-sql-brute,rlogin-brute,rsync-brute,mysql-brute,pgsql-brute,oracle-sid-brute,oracle-brute,rtsp-url-brute,snmp-brute,svn-brute,telnet-brute,vnc-brute,xmpp-brute\n\n* 判断常见的漏洞并扫描端口\n\n nmap 127.0.0.1 --script=auth,vuln\n\n* 精确判断漏洞并扫描端口\n\n nmap 127.0.0.1 --script=dns-zone-transfer,ftp-anon,ftp-proftpd-backdoor,ftp-vsftpd-backdoor,ftp-vuln-cve2010-4221,http-backup-finder,http-cisco-anyconnect,http-iis-short-name-brute,http-put,http-php-version,http-shellshock,http-robots.txt,http-svn-enum,http-webdav-scan,iis-buffer-overflow,iax2-version,memcached-info,mongodb-info,msrpc-enum,ms-sql-info,mysql-info,nrpe-enum,pptp-version,redis-info,rpcinfo,samba-vuln-cve-2012-1182,smb-vuln-ms08-067,smb-vuln-ms17-010,snmp-info,sshv1,xmpp-info,tftp-enum,teamspeak2-version \n\n### Masscan+Nmap\n有些时候网站的入口点属于非常规端口,因此是必须要做全端口扫描,做全端口扫描的时候由于**namp**发包量大经常出现各种问题,如端口扫描不全、获得信息不准等等,为了解决上述问题,这里提供一个**masscan+nmap**结合的方式进行快速扫描。\n\n原理:使用masscan做全端口开放检测,检测出来端口信息后,用nmap进行服务信息识别。\n\n```\n// 终端输入以下命令执行即可\nmasscan 192.33.6.145 -p1-65535 --rate 1000 -oL ports# ports=$(cat ports | awk -F \" \" \'{print $3}\' | sort -n | tr \'\\\\n\' \',\' | sed \'s/,$//\' | sed \'s/^,,//\') \nnmap -sV -p $ports 192.33.6.145\n```\n \n#### 一些常见端口渗透用途汇总:\n 端口号 | 端口服务/协议简要说明 | 关于端口可能的一些渗透用途\n---|---|---\ntcp 20,21 | ftp 默认的数据和命令传输端口[可明文亦可加密传输] | 允许匿名的上传下载,爆破,嗅探,win提权,远程执行(proftpd 1.3.5),各类后门(proftpd,vsftp 2.3.4)\ntcp 22 | ssh[数据ssl加密传输] | 可根据已搜集到的信息尝试爆破,v1版本可中间人,ssh隧道及内网代理转发,文件传输,等等…常用于linux远程管理…\ntcp 23 | telnet[明文传输] | 爆破,嗅探,一般常用于路由,交换登陆,可尝试弱口令,也许会有意想不到的收获\ntcp 25 | smtp[简单邮件传输协议,多数linux发行版可能会默认开启此服务] | 邮件伪造,vrfy/expn 查询邮件用户信息,可使用smtp-user-enum工具来自动跑\ntcp/udp 53| dns[域名解析] | 允许区域传送,dns劫持,缓存投毒,欺骗以及各种基于dns隧道的远控\ntcp/udp 69| tftp[简单文件传输协议,无认证] | 尝试下载目标及其的各类重要配置文件\ntcp 110 | [邮局协议,可明文可密文] | 可尝试爆破,嗅探\ntcp 143 | imap[可明文可密文] | 可尝试爆破\nudp 161 | snmp[明文] | 爆破默认团队字符串,搜集目标内网信息\ntcp 389 | ldap[轻量级目录访问协议] | ldap注入,允许匿名访问,弱口令\ntcp 873 | rsync备份服务 | 匿名访问,文件上传\ntcp 1194 | openvpn | 想办法钓vpn账号,进内网\ntcp 1352 | Lotus domino邮件服务 | 弱口令,信息泄漏,爆破\ntcp 1433 | mssql数据库 | 注入,提权,sa弱口令,爆破\ntcp 1521 | oracle数据库 | tns爆破,注入,弹shell…\ntcp 1500 | ispmanager | 主机控制面板 弱口令\ntcp 1723 | pptp | 爆破,想办法钓vpn账号,进内网\ntcp 2181 | zookeeper | 未授权访问\ntcp 3128 | squid代理服务 | 弱口令\ntcp 3306 | mysql数据库 | 注入,提权,爆破\ntcp 3389 | windows | rdp远程桌面 shift后门[需要03以下的系统],爆破,ms12-020[蓝屏exp]\ntcp 4848 | glassfish控制台 | 弱口令\ntcp 4899 | radmin远程桌面管理工具,现在已经非常非常少了 | 抓密码拓展机器\ntcp 5000 | sybase/DB2数据库 | 爆破,注入\ntcp 5432 | postgresql数据库 | 爆破,注入,弱口令\ntcp 5632 | pcanywhere远程桌面管理工具 | 抓密码,代码执行,已经快退出历史舞台了\ntcp 5984 | CouchDB | 未授权导致的任意指令执行\ntcp 6379 | redis未授权 | 可尝试未授权访问,弱口令爆破\ntcp 7778 | kloxo | 主机面板登录\ntcp 8000 | Ajenti主机控制面板 | 弱口令\ntcp 8443 | plesk主机控制面板 | 弱口令\ntcp 8069 | zabbix | 远程执行,sql注入\ntcp 10000 | webmin | linux主机web控制面板入口 弱口令\ntcp 11211 | memcached | 未授权访问\ntcp 3690 | svn服务 | svn泄露,未授权访问\ntcp 50000 | SAP Management Console | 远程执行\ntcp 80-89,443,8440-8450,8080-8089 | web[各种常用的web服务端口] | 各种常用web服务端口,可尝试经典的top n,vpn,owa,webmail,目标oa,各类java控制台,各类服务器web管理面板,各类web中间件漏洞利用,各类web框架漏洞利用等等……\ntcp 137,139,445 | samba[smb实现windows和linux间文件共享,明文] | 可尝试爆破以及smb自身的各种远程执行类漏洞利用,如,ms08-067,ms17-010,嗅探等……\ntcp 512,513,514 | linux rexec | 可爆破,rlogin登陆\ntcp 1025,111,2049 | nfs | 权限配置不当\ntcp 2082,2083 | cpanel主机管理面板登录 | 弱口令\ntcp 2601,2604 | zebra路由 | 默认密码zerbra\ntcp 3312,3311 | kangle主机管理登录 | 弱口令\ntcp 5900,5901,5902 | vnc远程桌面管理工具 | 弱口令爆破,如果信息搜集不到位,成功几率很小\ntcp 7001,7002 | weblogic控制台 | java反序列化,弱口令\ntcp 8080-8089 | Jenkins,jboss | 反序列化,控制台弱口令\ntcp 9080-9081,9090 | websphere控制台 | java反序列化/弱口令\ntcp 9200,9300 | elasticsearch | 远程执行\ntcp 27017,27018 | mongodb | 爆破,未授权访问\ntcp 50070,50030 | hadoop | 默认端口未授权访问\n\n \n#### 端口利用总结\n##### 21端口渗透解析\n介绍:Ftp一般是用于对远程服务器进行管理,大多数都用于对Web系统进行管理。一般密码泄露是直接威胁Web[系统安全](http://www.ichunqiu.com/courses/247)的,一旦让黑客知道是可以通过提权直接控制服务器。\n* 爆破:Ftp爆破工具很多,如你所使用的系统为Kali,这里我推荐hydra(九头蛇)以及metasploit(msf)中的ftp爆破模块。因为Kali下集成了hydra和msf。\n* Ftp匿名访问:有些小白会选择一些小型的主机服务商,这些服务商Ftp服务默认都是匿名可登陆。例如:用户名:admin,密码:空或者任意邮箱等。\n* 后门vsftpd:version 2到2.3.4都存在了后门漏洞,黑客可以通过该漏洞获取ROOT权限。这里推荐msf下的exploit/unix/ftp/vsftpd_234_backdoor模块。\n* 嗅探:如Ftp使用明文传输技术,可以使用Cain进行渗透。但是要存在于同一局域网,并且需要用到欺骗技术,且已经监听网关。\n* Ftp远程代码溢出:推荐使用nmap扫描Ftp版本号,使用msf搜索(searc)对应模块。 \n\n\n##### 22端口渗透解析\n介绍:SSH是协议,是使用在协议应用上的,SSH是Secure Shell的缩写。有IETF的网络工作小组所制定;SSH是建立在应用层和传输层基础上的安全协议。\n* 弱口令:推荐使用hydra(九头蛇)或msf中的ssh爆破模块。\n* 防火墙SSH后门\n* 退格 OpenSSL\n* Openssh 用户枚举 例如:CVE-2018-15473。 \n\n\n##### 23端口渗透解析\n介绍:Telnet是一种很老的远程管理方式,使用telnet工具登陆系统的过程中,网络上的传输用户和密码都是以明文的方式去传送的,所以这是一种很不安全的管理方式,黑客可以使用嗅探技术进行劫取此类密码等。\n* 爆破:暴力破解技术是[黑客技术](http://bbs.ichunqiu.com/forum-41-1.html)中最常见的技术,推荐使用hydra或者msf中的telnet模块进行暴力破解。\n* 嗅探:在Linux系统里面一般是采用SSH进行远程连接访问的,传输的敏感数据都是进行加密的。但是对于windows下的telnet是脆弱的,因为在windows中是默认没有经过任何加密就在网络中进行传输,可以使用cain等嗅探工具进行截获密文对其远程控制。\n* 绕口令:弱口令大部分用于大批量的爆破,对单个主机,推荐使用暴力破解。 \n\n\n##### 25/465端口渗透解析\n介绍:smtp:邮箱协议,在linux中是默认回开启这个服务的,是一个相对简单的基于文本的协议。smtps:这是smtp协议基于ssl安全协议之上的一种变种协议。它继承了ssl安全协议的非对称的加密。我对smtps协议也很头疼所以给不出太多的建议。\n* 爆破\n* 弱口令\n* 未授权访问\n* 钓鱼 \n\n\n##### 53端口渗透解析\n介绍:53端口一般是DNS域名服务器的通信端口,用于域名的解析。也是比较关键的服务器之一,但是这类服务器很 容易就受到攻击。\n* 使用DNS远程溢出的漏洞直接对主机进行溢出攻击,成功后一般会直接获得系统权限。如:Windows DNS API(CVE-2017-11779)\n* 使用DNS欺骗攻击,可以对DNS域名服务器进行欺骗,可以配合网页的木马进行挂马攻击,这是一种很酷的攻击方法。也是内网渗透中比较常用的方法。(DNS欺骗重定向Web流量)\n* 拒绝服务攻击,我相信大家对这个攻击方法并不陌生,这是一种利用可快速攻击可导致服务器运行缓慢或网络瘫痪。如果[黑客攻击](http://bbs.ichunqiu.com/forum-41-1.html)其DNS服务器,将会导致该服务器进行域名解析的用户无法上网。(DNS劫持或DNS拒绝服务攻击)常见的说法:D死! \n\n\n##### 80端口渗透解析\n介绍:80端口是提供Web服务的端口,对于各位我想的是进入一个新的Web站点可能最会先想到SQL注入的方法,当然脚本渗透液是一项极强的Web渗透技术,同时也能对80端口造成威胁。\n* 针对windows2000的iis5.5版本,黑客可以使用远程溢出直接对主机进行攻击,从而获取系统权限\n* 针对windows2000的iis5.5版本,黑客也可以利用“Microsoft IISCGI”文件名错误的解码进行漏洞攻击,可以使用X-SCAN直接探测到IIS漏洞\n* IIS写权漏洞是由于IIS配置不当所造成的安全问题。黑客可以向存在此漏洞的服务器上传恶意的执行代码。比如脚本木马(马儿)控制权限\n* 普通的http封包是没有经过加密就在网络中传输的,这样就可以通过嗅探类的工具截取敏感的数据,比如使用cain工具等。\n* 80端口的攻击,渗透等。更多的是使用脚本渗透的技术,比如SQL,XSS等。利用Web应用程序的漏洞进行渗透是目前来说比较流行的方法\n* 对于渗透只开放80端口的服务器来说,难度可以很大。利用一些端口复用工具可以解决这个技术难题\n* CC攻击的效果是不如DDOS效果明显的,但是对于一些小型的Web站点来说还是有点用处的。CC攻击可以对目标站点运行出错或页面无法打开,打开过慢。有时候还会爆出Web程序的绝对路径哦\n* windows中使用iis搭建Web站点,可查找IIS上传或解析漏洞,进行马儿上传的渗透,从而获取系统权限等 \n\n\n##### 135端口渗透解析\n介绍:135端口主要是用于RPC协议是提供DCOM服务,PRC可以保证一台计算机上运行的程序可以顺利的执行远程计算机上的代码;使用DCOM可以通过网络进行通信。同时这个端口也爆出了不少的漏洞,最严重的还是我们熟悉的缓冲区溢出的漏洞\n* 查找存在RPC溢出的主机,进行远程溢出的攻击,可以直接获取系统的权限。如果你使用“DSScan”扫描存在漏洞的主机,你可以直接使用\'ms05011.exe\'进行溢出的攻击\n* 弱口令:可以扫描弱口令的主机,利用RPC远程过程调用开启telnet服务并登陆且执行系统命令。系统的弱口令一般用hydra,对于telnet服务的开启可以使用工具直接连接。 \n\n\n##### 139/445端口渗透解析\n介绍:139端口是提供windows文件和打印机共享以及Unix中的Samba服务,家庭很少会开启这个服务,但是学校就不一样了,我可没有暗示你们什么。445端口其实也是为windows提供文件很打印机的共享,这两个端口在内网中是使用次数最多的,但是这两个端口的漏洞都比较多,而且出现过很多高危漏洞。\n* 139/445端口的开放主机,大多数都是使用溢出漏洞进行攻击,比如445漏洞在msf中的ms-017\n* 445端口的开放主机,黑客一般是使用‘MS06040’或‘MS08067’或‘ms017010’(可以自己查一下),可以使用nmap工具中-p命令扫描445端口是否开放,但是MS08067对win03系统十分有效不知道为什么\n* 139/445端口的开放主机,黑客可以使用IPC$进行渗透。在没有使用特定的的账户密码进行空的连接,权限是最小的,但是获得特定账号密码是成为提升权限的关键,比如获取admin的账户口令。\n* 139/445端口的开放主机,可利用共享获取敏感信息,这也是内网渗透中收集信息的基本途径\n* 自从ms017010的出世,在windows7下445端口进行溢出渗透,大部分在msf中进行的 \n\n\n##### 1433端口渗透解析\n介绍:1433是SQLServer默认的端口,SQL Server服务使用两个端口:tcp-1433、UDP-1434.其中1433用于供SQLServer对外提供服务,1434用于向请求者返回SQLServer使用了哪些TCP/IP端口。1433端口通常遭到黑客的攻击,最严重的还是远程溢出漏洞了,如由于SQL注射攻击的方式,数据库面临着很多威胁,这种攻击方式是属于脚本渗透技术的。\n* 对开放1433端口的数据库服务器,黑客可以尝试利用溢出的漏洞对主机直接进行攻击,可以直接获取到系统的权限。\n* 暴力破解是一项采用实用的技术,一般对于sql数据库破解的对象都是SA用户,通过社工的收集使用的字典很快就能破解出SA的密码。\n* 嗅探技术也能嗅探到SQL数据库的登陆密码哦。\n* 如数据库脚本编写的漏洞问题,黑客也可以对其进行sql注入,例如:过滤不严,就会造成很严重的注射漏洞。可以使用针对sql注入的工具直接扫描。 \n\n\n##### 1521端口渗透解析\n介绍:1521一般是大型数据库Oracle的默认端口,对于一些没有安全工作经验的人来说,还是比较陌生的,以为大多数接触到的数据库都是Access、msssql、mysql。一般大型的站点才会使用Oracle[数据库系统](http://www.ichunqiu.com/courses/277),以为这个数据库系统比较复杂。\n* Oracle拥有非常非常多的默认用户名和密码,破解数据库这样也是一种方法,但是离不开我们的暴力破解\n* SQL注射是对所有数据库都有效的方法\n* 可以在注入点直接创建java,从而执行系统命令 \n\n\n##### 2049端口渗透解析\n介绍:FS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。如今NFS具备了防止被利用导出文件夹的功能,但遗留系统中的NFS服务配置不当,则仍可能遭到恶意攻击者的利用。\n* 未授权访问 \n\n\n##### 3306端口渗透解析\n介绍:3306是MYSQL数据库默认的监听端口,通常部署在中型web系统中。在国内LAMP的配置是非常流行的,对于php+mysql构架的攻击也是属于比较热门的话题。mysql数据库允许用户使用自定义函数功能,这使得黑客可编写恶意的自定义函数对服务器进行渗透,最后取得服务器最高权限。\n* 由于管理者安全意识淡薄,通常管理密码设置过于简单,甚至为空口令。使用破解软件很容易破解此类密码,利用破解的密码登录远程mysql数据库,上传构造的恶意UDF自定义函数代码进行注册,通过调用注册的恶意函数执行系统命令。或者向web目录导出恶意的脚本程序,以控制整个web系统\n* 嗅探对支持3306端口的数据库也存在支持\n* Sql注入也对mysql数据库有用,可以获取数据库的敏感信息。还可以使用函数去读取系统的敏感配置文件,还可以从web数据库的连接文件中获得root口令等\n* 暴力破解弱口令都是不错的选择 \n\n\n##### 3389端口渗透解析\n介绍:3389是windows远程桌面服务默认监听的端口,管理员通过远程桌面对服务器进行维护,这给管理工作带来的极大的方便。通常此端口也是黑客们较为感兴趣的端口之一,利用它可对远程服务器进行控制,而且不需要另外安装额外的软件,实现方法比较简单。当然这也是系统合法的服务,通常是不会被杀毒软件所查杀的。使用‘输入法漏洞’进行渗透。\n* 对于win2000的版本系统,可以使用‘输入法漏洞’进行渗透,这也是很老的方法了\n* cain同样也支持3389端口的嗅探\n* Shift粘滞键后门:5次shift后门\n* [社会工程学](http://www.ichunqiu.com/#profession)、爆破可以使用msf中的爆破模块或者hydra、弱口令\n* ms12\\_020蓝屏攻击 \n\n\n##### 4899端口渗透解析\n介绍:4899端口是remoteadministrator远程控制软件默认监听的端口,也就是平时常说的radmini影子。radmini目前支持TCP/IP协议,应用十分广泛,在很多服务器上都会看到该款软件的影子。\n* readmini也存在很多弱口令的主机,可以通过特定的工具扫描此类型主机\n* readmini远控的连接密码和端口都是写入到注册表系统中的,通过使用webshell注册表读取功能可读取radmini在注册表的各项键值内容。 \n\n\n##### 5432端口渗透解析\n介绍:PostgreSQL是一种特性非常齐全的自由软件的对象–关系型数据库管理系统,可以说是目前世界上最先进,功能最强大的自由数据库管理系统。包括kali系统中msf也使用这个数据库;浅谈postgresql数据库攻击技术 大部分关于它的攻击依旧是sql注入。\n* 爆破、弱口令:postgres postgres\n* 缓冲区溢出:CVE-2014-2669 \n\n\n##### 5631端口渗透解析\n介绍:5631端口是著名远程控制软件pcanywhere的默认监听端口,同时也是世界领先的远程控制软件。此软件设计有缺陷,可以随意的下载保存连接密码的.cif文件。可以用专门的破解软件破解。\n* 密码文件破解\n* PcAnyWhere提权 \n\n\n##### 5900端口渗透解析\n介绍:5900端口是远程控制软件VNC的默认端口,VNC是基于UNIX和LINUX操作系统免费开放的源码\n* VNC软件存在密码验证的绕过漏洞,此高危漏洞可以让黑客不需要密码就能登录到一个系统\n* cain同样可以嗅探,还可以端口修改。\n* VNC的配置同样是写入注册表中的,可以利用注册表的读取功能进行加密算法破解\n* VNC拒绝服务攻击(CVE-2015-5239)\n* VNC权限提升(CVE-2013-6886) \n\n\n##### 6379端口渗透解析\n介绍:Redis是一个开源的使用c语言写的,支持网络、可基于内存亦可持久化的日志型、key-value数据库。关于这个数据库这两年还是很火的,暴露出来的问题也很多。特别是暴露的未授权访问。\n* 爆破和弱口令\n* 未授权访问+配合ssh key提权 \n\n\n##### 7001/7002端口渗透解析\n介绍:好像没什么介绍,就是weblogic中间插件的端口。\n* 弱口令、爆破、弱密码等\n* 管理后台部署可能有war后门\n* SSRF\n* 反序列化漏洞\n* WebLogic\\_uac \n\n\n##### 8080端口渗透解析\n介绍:8080端口通常是apache\\_Tomcat服务器默认监听端口,apache是世界使用排名第一的web服务器。国内就有很多人喜欢有这种服务器。\n* tomcat远程代码执行漏洞\n* tomcat任意文件上传漏洞\n* tomcat远程代码执行信息泄露漏洞\n* jboss远程代码执行漏洞\n* jboss反序列化漏洞\n* jboss漏洞利用。 \n\n\n##### 27017端口渗透解析\n介绍:没什么可以说的,和其他数据库攻击方法差不多。\n* 爆破、弱口令\n* 未授权访问。 \n\n## 绕过CND,获取网站真实IP \nCND绕过思路\n\n* 二级域名法 一般网站不会所有的二级域名放CDN,因此我们可以利用这点来获取网站的真实ip\n* 多地ping法 由CDN的原理,不同的地方去Ping服务器,如果IP不一样,则目标网站肯定使用了CDN\n* nslookup法 找国外的比较偏僻的DNS解析服务器进行DNS查询,因为大部分CDN提供商只针对国内市场,而对国外市场几乎是不做CDN,所以有很大的几率会直接解析到真实IP\n* 查看邮件法 通过查看邮件原文来确定ip地址,CDN总不会发送邮件吧\n* RSS订阅法 RSS原理于邮件法差不多\n* 查看历史解析记录法 查找域名历史解析记录,域名在上CDN之前用的IP,很有可能就是CDN的真实源IP地址\n* 利用网站漏洞(XSS、命令执行、SSRF、php探针、phpinfo页面等) 可以通过一些页面和漏洞获取到服务器ip地址也是可能的。 \n\n### 主动收集\n\n* 小米范WEB查找器:[http://pan.baidu.com/s/1pLjaQKF](http://pan.baidu.com/s/1pLjaQKF)\n* nslookup \n\n### 被动收集\n\n* 国外ping:[https://tools.ipip.net/newping.php](https://tools.ipip.net/newping.php)\n* 国外ping:[https://asm.ca.com/en/ping.php](https://asm.ca.com/en/ping.php)\n* shodan:[https://www.shodan.io/](https://www.shodan.io/)\n* fofa:[https://fofa.so/](https://fofa.so/)\n* zoomeye:[https://www.zoomeye.org/](https://www.zoomeye.org/) \n\n## 域名解析记录\n\n* dnsdb:[https://www.dnsdb.io/zh-cn/](https://www.dnsdb.io/zh-cn/)\n* NETCRAFT:[https://sitereport.netcraft.com/?url=](https://sitereport.netcraft.com/?url=)\n* viewdns:[https://viewdns.info/](https://viewdns.info/)\n* threatbook:[https://x.threatbook.cn/](https://x.threatbook.cn/)\n* securitytrails:[https://securitytrails.com/](https://securitytrails.com/) \n* [世界各地DNS服务器地址大全](http://www.ab173.com/dns/dns_world.php)\n\n## 网站架构\n### 操作系统\n* wappalyzer插件\n* 云悉 \n* Nmap\n* 手动探测\n\n### 中间件、Web容器、数据、编程语言\n* wappalyzer插件\n* 云悉 \n\n\n### WEB应用层\n\n#### 敏感目录及敏感信息、源码泄露:\n* 御剑\n* 搜索引擎\n* BBscan:[https://github.com/lijiejie/BBScan](https://github.com/lijiejie/BBScan)\n* GSlL:[https://github.com/FeeiCN/GSIL](https://github.com/FeeiCN/GSIL)\n* GetHub:[https://github.com](https://github.com/)\n* 御剑后台扫描珍藏版\n* DirBuster\n* 7kbscan-WebPathBrute 1.6.2:\n* WVS 1.24.001 \n\n### 工具使用\n- 御剑: 御剑这款工具主要用于扫描网站的敏感目录、敏感文件。这里必须要说明一下字典必须要足够强大才可以扫到别人发现不了的点。因此我们必须完善一下自己的字典。\n- 敏感目录: robots.txt、crossdomin.xml、sitemap.xml、源码泄漏文件、/WEB-INF/\n\n#### 搜索引擎\n搜索引擎也可以用于搜索网站的敏感目录、敏感文件和敏感信息。\n这里就必须提一下搜索引擎的语法了,这里以google 黑客语法为例,语法同样适用于百度搜索引擎。\n- 基本语法\n ```\n \"\" 双引号表示强制搜索 \n - 表示搜索不包含关键词的网页 \n | 或者的意思 \n site 指定域名 \n intext 搜索到的网页正文部分包含关键词 \n intitle 搜索到的网页标题包含关键词 \n cache 搜索关于某些内容的缓存 \n definne 搜索某个词语的定义 \n filetype 搜索指定的文件类型 \n info 查找指定站点的一些基本信息 \n inurl 搜索包含关键词的URL \n link 可以返回所有和baidu.com做了链接的URL\n ```\n\n```\n// 查看已经被黑的网站\nintext:hacked by\n\n// 搜索站点内容\nsite:example.com 内容\n\n// 搜索后台登陆页面\nintitle: 后台登陆\n\n// 查找后台地址\nsite:域名 inurl:login|admin|manage|member|admin_login|login_admin|system|login|user|main|cms\n\n// 找eweb编辑器:\nsite:域名 inurl:ewebeditor|editor|uploadfile|eweb|edit\n\n// 匹配URl\ninurl:login\n\n// 查找可注入点\nsite:域名 inurl:aspx|jsp|php|asp\n\n// 查找文件后缀\nfiletype:sql | doc\n\n// 匹配URl\ninurl:login\n```\n\n\n\n#### [BBscan](https://github.com/lijiejie/BBScan):BBscan是一款信息泄漏批量扫描脚本。它是依旧还是由lijiejie大佬用python写的安全工具。\n\n```\n// 扫描单个web服务 [www.target.com](http://www.target.com)\npython BBScan.py --host [www.target.com](http://www.target.com)\n\n\n// 扫描[www.target.com和\\[url\\]www.target.com/28](http://www.target.com和)\\[/url\\]下的其他主机\npython BBScan.py --host [www.target.com](http://www.target.com) --network 28\n\n\n// 扫描txt文件中的所有主机\npython BBScan.py -f wandoujia.com.txt\n\n\n// 从文件夹中导入所有的主机并扫描\npython BBScan.py -d targets/ --browser\n\n\n// 如果是为了去各大src刷漏洞,可以考虑把所有域名保存到targets文件夹下,然后\npython BBScan.py -d targets/ --network 30\n```\n\n\n\n#### [GSIL](https://github.com/FeeiCN/GSIL)\nGSIL是一款由python3写的从github上寻找敏感文件的安全工具。\n\n```\npython3 gsil.py test# 测试token有效性\npython3 gsil.py --verify-tokens\n```\n\n**旁站收集**\n* 站长之家:[http://s.tool.chinaz.com/same](http://s.tool.chinaz.com/same)\n* Tscan:[https://scan.top15.cn/web/](https://scan.top15.cn/web/) \n\n#### C段收集\n> C端是和目标服务器ip处在同一个C段的其它服务器\n\n- Nmap\n- 北极熊扫描器扫C端:[http://www.xitongzhijia.net/soft/71774.html](http://www.xitongzhijia.net/soft/71774.html)\n\n\n\n### 指纹识别\n指纹是指定路径下指定名称的js文件或代码。指定路径下指定名称的css文件或代码。title中的内容,有些程序标题中会带有程序标识meta标记中带程序标识\n\n```\n<meta name=\"description\"/><meta name=\"keywords\"/><meta name=\"generator\"/><meta name=\"author\"/><meta name=\"copyright\"/>\n```\n中带程序标识。display:none中的版权信息。页面底部版权信息,关键字© Powered by等。readme.txt、License.txt、help.txt等文件。指定路径下指定图片文件,如一些小的图标文件,后台登录页面中的图标文件等,一般管理员不会修改它们。注释掉的html代码中<!–http头的X-Powered-By中的值,有的应用程序框架会在此值输出。cookie中的关键字robots.txt文件中的关键字404页面302返回时的旗标\n\n通过识别目标网站所使用的CMS信息,可以帮助我们进一步了解渗透测试环境,可以利用已知的一些CMS漏洞来进行攻击。\n\n#### 主动收集\n* CMSeeK:[https://github.com/Tuhinshubhra/CMSeeK](https://github.com/Tuhinshubhra/CMSeeK)\n* CMSmap:[https://github.com/Dionach/CMSmap](https://github.com/Dionach/CMSmap)\n* ACMSDiscovery:[https://github.com/aedoo/ACMSDiscovery](https://github.com/aedoo/ACMSDiscovery)\n* TideFinger:[https://github.com/TideSec/TideFinger](https://github.com/TideSec/TideFinger)\n* AngelSword:[https://github.com/Lucifer1993/AngelSword](https://github.com/Lucifer1993/AngelSword) \n\n#### 被动收集\n* 云悉\n* wappalyzer插件\n* TideFinger:[http://finger.tidesec.net/](http://finger.tidesec.net/)\n* BugScaner:[http://whatweb.bugscaner.com/look/](http://whatweb.bugscaner.com/look/)\n* 数字观星:[https://fp.shuziguanxing.com/#/](https://fp.shuziguanxing.com/#/) \n\n\n### WAF判断\n> WAF也称Web应用防护系统,Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。\n\n**原理:WAF识别大多基于Headers头信息。通过发送恶意的内容,对比响应,寻找数据包被拦截、拒绝或者检测到的标识。**\n\n- 第三方判断:\n * Tscan:[https://scan.top15.cn/web/](https://scan.top15.cn/web/) \n- 手工判断\n- Nmap判断:两种脚本\n * http-waf-detect\n * http-waf-fingerprint\n \n\n- wafw00f:[https://github.com/EnableSecurity/wafw00f](https://github.com/EnableSecurity/wafw00f)\n \n\n### 企业\n- 天眼查地址:[https://www.tianyancha.com/](https://www.tianyancha.com/)\n- 企业信用信息公示系统:[http://www.gsxt.gov.cn/index.html](http://www.gsxt.gov.cn/index.html)\n- 悉知-全国企业信息查询:[https://company.xizhi.com/](https://company.xizhi.com/)\n- 信用中国:[https://www.creditchina.gov.cn/](https://www.creditchina.gov.cn/)\n\n\n\n## 收集其他敏感信息\n\n> 常见源码泄露:**/.bzr//CVS/Entries/CVS/Root/.DS\\_Store MacOS自动生成/.hg//.svn/ (/.svn/entries)/.git//WEB-INF/src//WEB-INF/lib//WEB-INF/classes//WEB-INF/database.properties/WEB-INF/web.xmlRobots.txt\n\n### 源码泄露利用工具\n* git源码泄露:[https://github.com/lijiejie/GitHack](https://github.com/lijiejie/GitHack)\n* .DS\\_Store泄露:[https://github.com/lijiejie/ds_store_exp](https://github.com/lijiejie/ds_store_exp)\n* .bzr、CVS、.svn、.hg源码泄露:[https://github.com/kost/dvcs-ripper](https://github.com/kost/dvcs-ripper) \n\n### 备份文件泄露\n- 网站备份文件泄露常见名称:backupdbdatawebwwwrootdatabasewwwcodetestadminusersql\n- 网站备份文件泄露常见后缀:.bak.html\\_index.html.swp.rar.txt.zip.7z.sql.tar.gz.tgz.tar.bak.html\\_index.html.swp.rar.txt.zip.7z.sql.tar.gz.tgz.tar\n\n\n\n### JS获取敏感接口\n#### [JSFinder](https://github.com/Threezh1/JSFinder.git)\n> SFinder是一款用作快速在网站的js文件中提取URL,子域名的工具。\n\n```\npython3 JSFinder.py -u [http://www.mi.compython3](http://www.mi.compython3) JSFinder.py -u [http://www.mi.com](http://www.mi.com) -d\n```\n\n\n#### [LinkFinder](https://github.com/GerbenJavado/LinkFinder.git)\n> 该工具通过网站中的JS文件来发现服务端、敏感信息、隐藏控制面板的URL链接等有用信息,可最大化地提高URL发现效率\n\n```\n// 在线JavaScript文件中查找端点的最基本用法,并将结果输出到results.html:\npython linkfinder.py -i [https://example.com/1.js](https://example.com/1.js) -o results.html\n\n\n// CLI输出(不使用jsbeautifier,这使得它非常快): \npyhon linkfinder.py -i [https://example.com/1.js](https://example.com/1.js) -o cli\n\n\n// 分析整个域及其JS文件:\npython linkfinder.py -i [https://example.com](https://example.com) -d\n\n\n// Burp输入(在目标中选择要保存的文件,右键单击,Save selected items将该文件作为输入):\npython linkfinder.py -i burpfile -b\n\n\n// 枚举JavaScript文件的整个文件夹,同时查找以/ api /开头的终结点,并最终将结果保存到results.html:\npython linkfinder.py -i \'Desktop/\\*.js\' -r ^/api/ -o results.html\n```\n\n\n## 目录扫描\n- 收集方向\n * Robots.txt (根据robots文件查看是否存在管理界面,比如http://m.qufutuan.com/robots.txt文件中定义了disallow:manage,那么可以尝试访问http://m.qufutuan.com/manage)\n * 后台目录\n * 上传目录\n * mysql管理界面\n * 后台目录扫描\n * 端口扫描\n * 旁站、C端扫描(在线工具)\n * readme.txt尝试(http://m.qufutuan.com/readme.txt)\n\n\n### 常用工具\n* 7kbscan-WebPathBrute:[https://github.com/7kbstorm/7kbscan-WebPathBrute](https://github.com/7kbstorm/7kbscan-WebPathBrute)\n* DirMap:[https://github.com/H4ckForJob/dirmap](https://github.com/H4ckForJob/dirmap)\n* dirsearch:[\\[url\\]https://github.com/maurosoria/dirsearch](https://github.com/maurosoria/dirsearch)\\[/url\\]\n* Fuzz-gobuster:[https://github.com/OJ/gobuster](https://github.com/OJ/gobuster)\n* Fuzz-dirbuster OWASP (kali自带)\n* Fuzz-wfuzz[https://github.com/xmendez/wfuzz](https://github.com/xmendez/wfuzz)\n* 御剑 \n\n\n### 获取公开文件工具\n#### [snitch](https://github.com/Smaash/snitch.git):\n> Snitch可以针对指定域自动执行信息收集过程。此工具可帮助收集可通过Web搜索引擎找到的指定信息。在渗透测试的早期阶段,它可能非常有用。\n\n```\npython2.7 snitch.py -C \"site:whitehouse.gov filetype:pdf\" -P 100\n```\n\n#### Google Hacking \n```\nsite:{域名} {filetype}\n```\n- filetype\n * .doc \n * .docx \n * .xls \n * .xlsx \n * .ppt \n * .pptx \n * .odt \n * .pdf \n * .rtf \n * .sxw \n * .psw \n * .csv\n\n\n\n### 邮箱信息收集工具\n#### [Infoga](https://github.com/m4ll0k/Infoga.git):\n\n> Infoga可从不同的公共源网络(搜索引擎,pgp密钥服务器和shodan)收集电子邮件帐户信息(ip,主机名,国家/地区...)。是一个用法非常简单的工具,但是,对于渗透测试的早期阶段,或者只是为了了解自己公司在互联网上的可见性是非常有效的。\n\n```\npython3 infoga.py --domain site.com --source all -v 3 | grep Email | cut -d \' \' -f 3 | uniq | sed -n \'/-/!p\'\npython3 infoga.py --info \\[email\\]emailtest@site.com\npython3 \\[/email\\] infoga.py --info \\[email\\]emailtest@site.com\\[/email\\] -b\n```\n\n\n#### 通过全球最大的几个数据泄露站点在线查询邮箱信息泄露情况\n- [https://monitor.firefox.com/](https://monitor.firefox.com/)\n- [https://haveibeenpwned.com/](https://haveibeenpwned.com/)\n- [https://ghostproject.fr/](https://ghostproject.fr/)\n\n## 社工工程学 \n### 社工库\n- [https://dehashed.com/](https://dehashed.com/)\n- [https://aleph.occrp.org/](https://aleph.occrp.org/)\n- [https://www.blackbookonline.info/](https://www.blackbookonline.info/)\n\n## 注册信息\n通过用户的一些信息(Mail、Name、ID、Tel)查询用户注册过哪些应用\n- [https://www.reg007.com/](https://www.reg007.com/)\n- [https://checkusernames.com/](https://checkusernames.com/)\n- [https://knowem.com/](https://knowem.com/)\n- [https://namechk.com/](https://namechk.com/)\n\n## IP定位\n- [https://chaipip.com/ip.php](https://chaipip.com/ip.php)\n- [https://www.opengps.cn/Data/IP/LocHighAcc.aspx](https://www.opengps.cn/Data/IP/LocHighAcc.aspx)\n- [https://www.ipip.net/ip.html](https://www.ipip.net/ip.html)\n- [https://www.ip2location.com/demo/](https://www.ip2location.com/demo/)\n- [https://www.maxmind.com/en/geoip2-precision-demo](https://www.maxmind.com/en/geoip2-precision-demo)\n- [https://www.ip138.com/](https://www.ip138.com/)\n\n## 社会工程学工具包\n- [https://github.com/trustedsec/social-engineer-toolkit](https://github.com/trustedsec/social-engineer-toolkit)\n\n## Ref\n> [御剑系统](https://codeway.fun/article/1281943476912656384)\n', '信息搜集也称踩点,信息搜集毋庸置疑就是尽可能的搜集目标的信息,包括端口信息、DNS信息、员工邮箱、社工等等看似并不起眼的一些信息都算是信息搜集,这些看似微乎其微的信息,对于渗透测试而言就关乎到成功与否了。', 4, b'0', b'0', NULL, 2, 0, 'https://static-admin.madaoo.com/hack.jpg', '信息收集之群魔乱舞', NULL, 19, NULL, '1234533425', 33, '3');
INSERT INTO `ar_article` VALUES ('1314949482479226880', 1602343361790, 1602343361790, 0, '## 接口安全问题\n* 请求身份是否合法?\n* 请求参数是否被篡改?\n* 请求是否唯一?\n\n## AccessKey&SecretKey (开放平台)\n\n### 请求身份\n\n为开发者分配 **AccessKey**(开发者标识,确保唯一)和 **SecretKey**(用于接口加密,确保不易被穷举,生成算法不易被猜测)。\n\n### 防止篡改\n\n#### 参数签名\n\n1. 按照请求参数名的字母升序排列非空请求参数(包含AccessKey),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA;\n2. 在stringA最后拼接上Secretkey得到字符串stringSignTemp;\n3. 对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为大写,得到sign值。\n\n请求携带参数**AccessKey**和**Sign**,只有拥有合法的身份AccessKey和正确的签名Sign才能放行。这样就解决了身份验证和参数篡改问题,即使请求参数被劫持,由于获取不到SecretKey(**仅作本地加密使用,不参与网络传输**),无法伪造合法的请求。\n\n### 重放攻击\n虽然解决了请求参数被篡改的隐患,但是还存在着重复使用请求参数伪造二次请求的隐患。\n\n**timestamp+nonce方案**\n\nnonce指**唯一的随机字符串**,用来标识每个被签名的请求。通过为每个请求提供一个唯一的标识符,服务器能够防止请求被多次使用(记录所有用过的nonce以阻止它们被二次使用)。\n\n然而,对服务器来说永久存储所有接收到的nonce的代价是非常大的。可以使用**timestamp来优化nonce的存储**。\n\n假设允许客户端和服务端最多能存在15分钟的时间差,同时追踪记录在服务端的nonce集合。当有新的请求进入时,首先检查携带的timestamp是否在15分钟内,如超出时间范围,则拒绝,然后查询携带的nonce,如存在已有集合,则拒绝。否则,记录该nonce,并删除集合内时间戳大于15分钟的nonce(可以使用redis的expire,新增nonce的同时设置它的超时失效时间为15分钟)。\n\n#### 实现\n\n`请求接口:http://api.test.com/test?name=hello&home=world&work=java`\n\n* 客户端\n \n 1. 生成当前时间戳timestamp=now和唯一随机字符串nonce=random\n 2. 按照请求参数名的字母升序排列非空请求参数(包含AccessKey) \n `stringA=\"AccessKey=access&home=world&name=hello&work=java×tamp=now&nonce=random\";`\n 3. 拼接密钥SecretKey \n `stringSignTemp=\"AccessKey=access&home=world&name=hello&work=java×tamp=now&nonce=random&SecretKey=secret\";`\n 4. MD5并转换为大写 \n `sign=MD5(stringSignTemp).toUpperCase();`\n 5. 最终请求 \n `http://api.test.com/test?name=hello&home=world&work=java×tamp=now&nonce=nonce&sign=sign;`\n* 服务端 \n \n \n\n## Token&AppKey(APP)\n\n在APP开放API接口的设计中,由于大多数接口涉及到用户的个人信息以及产品的敏感数据,所以要对这些接口进行身份验证,为了安全起见让用户暴露的明文密码次数越少越好,然而客户端与服务器的交互在请求之间是无状态的,也就是说,当涉及到用户状态时,每次请求都要带上身份验证信息。\n\n### Token身份验证\n\n1. 用户登录向服务器提供认证信息(如账号和密码),服务器验证成功后**返回Token**给客户端;\n2. 客户端将Token保存在本地,后续发起请求时,**携带此Token**;\n3. 服务器检查Token的有效性,有效则放行,无效(Token错误或过期)则拒绝。\n\n**安全隐患**:Token被劫持,伪造请求和篡改参数。\n\n### Token+AppKey签名验证\n\n与上面开发平台的验证方式类似,为客户端分配**AppKey**(密钥,用于接口加密,不参与传输),将AppKey和所有请求参数组合成源串,根据**签名算法**生成签名值,发送请求时将签名值一起发送给服务器验证。这样,即使Token被劫持,对方不知道AppKey和签名算法,就无法伪造请求和篡改参数。再结合上述的**重发攻击**解决方案,即使请求参数被劫持也无法伪造二次重复请求。\n\n### 实现\n\n#### 登陆和退出请求\n\n\n\n#### 后续请求\n\n* 客户端 \n 和上述开放平台的客户端行为类似,把AccessKey改为token即可。\n \n* 服务端 \n \n \n\n\n## Ref\n- 资料-合作方非微信登录鉴权接口说明.pdf', '如何保证你的接口安全问题?\n* 请求身份是否合法?\n* 请求参数是否被篡改?\n* 请求是否唯一?', 1, b'0', b'1', NULL, 2, 0, 'https://static-admin.madaoo.com/%E5%A6%82%E4%BD%95%E4%BF%9D%E8%AF%81%E6%8E%A5%E5%8F%A3%E5%AE%89%E5%85%A8.jpg', '如何保证你的接口安全问题?', NULL, 15, NULL, '1234533425', 6, '3');
INSERT INTO `ar_article` VALUES ('1315161119073112064', 1602393819956, 1602393819956, 0, '\n\n## Java架构师成长直通车配套资料\n\n废话不多说直接上干货\n\n## 第一阶段:单体项目开发与上线(1-5周)\n------------------------------------------------------------------------------------------------------------------------------------\n\n \n**学习安排:**\n\n**第1周 万丈高楼,地基首要** \n在开始系统化成长之初,先从整体上认知大型互联网系统架构演变历程,明确架构师需要具备哪些技术栈与核心能力,之后开始筑基-单体开发。\n\n**配套干货:** \n[《架构师的性格测试和升级打怪》](https://www.imooc.com/article/295814) \n[《架构师成长进阶方式》](http://www.imooc.com/article/297403) \n[《学完这100多技术,能当架构师么?(非广告)》](http://www.imooc.com/article/details/id/291107) \n[《【架构师成长必备】如何阅读一个开源项目的源码?》](http://www.imooc.com/article/283766) \n[《一柱擎天-单体架构模式》](https://www.imooc.com/article/294146)\n\n[知识拓展:《Java架构师成长直通车》](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji) \n\n**第2周 分类,推荐,搜索,评价,购物车开发** \n带大家分析电商首页需求,然后实现首页轮播图功能,分类功能,商品推荐功能,搜索功能,商品评价功能,最后带大家开发电商核心功能模块-购物车。\n\n**配套干货:** \n[《手把手教你实现电商网站开发》](https://www.imooc.com/learn/100) \n[《首页多栏目滑块动画实现》](http://www.imooc.com/article/266764) \n[《打造万能的BannerView(ViewPager)无限轮播图》](http://www.imooc.com/article/46680) \n[《图书管理系统【部署开发环境、解决分类、图书、前台页面模块】》](http://www.imooc.com/article/296450) \n[《【JavaWeb基础】购物车案例(修订版)》](http://www.imooc.com/article/296445)\n\n**知识拓展:**[《ElasticSearch+Spark 构建高相关性搜索服务&千人千面推荐系统》](https://coding.imooc.com/class/391.html?mc_marking=5cba2fcfe0d32fbeefeb7febc7ab3cb1&mc_channel=shouji) \n \n**第3周 收货地址,订单,支付 ,定时任务开发** \n本周首先带大家完成收获地址的开发,接着开发电商核心业务功能-订单,支付(微信支付,支付宝支付),最后设计一个定时任务,实现定时关闭超期未支付订单功能。\n\n**配套干货:** \n[《微信支付开发指南(内含微信账号借用)》](http://www.imooc.com/article/31607) \n[《微信支付和支付宝支付的三行代码开发教程—支付的demo》](http://www.imooc.com/article/23635) \n[《Spring Boot2 系列教程–定时任务的两种实现方式》](http://www.imooc.com/article/294304) \n[《利用 RabbitMQ 死信队列和 TTL 实现定时任务》](http://www.imooc.com/article/293860) \n[《死磕 java线程系列之线程池深入解析——定时任务执行流程》](http://www.imooc.com/article/294931)\n\n**知识拓展:**[《Java通用型支付+电商平台双系统实战》](https://coding.imooc.com/class/392.html?mc_marking=df5982198e77e30ab3a83dff1cbdedff&mc_channel=shouji) \n \n**第4周 用户中心 ,订单/评价管理开发** \n完成用户中心模块,之后一起完成订单管理,评价管理功能,完善中心首页。通过,我们完全有能力架构与开发任何一个单体的项目了。\n\n**配套干货:** \n[《单体数据库存储性能问题解决方案-读写分离》](https://www.imooc.com/article/295035) \n[《日均5亿查询量的京东订单中心,为什么舍MySQL用ES?》](http://www.imooc.com/article/292263) \n[《每秒上千订单场景下的分布式锁高并发优化实践!》](http://www.imooc.com/article/284954) \n[《每秒钟承载600万订单级别的无锁并行计算框架-Disruptor》](http://www.imooc.com/article/74619)\n\n**更多内容传送:**[《阿里新零售数据库设计与实战》](https://coding.imooc.com/class/353.html?mc_marking=84e6156690b477b1ed73599212b3eb03&mc_channel=shouji)\n\n**第5周 云服务器部署上线** \n打包与发布前端项目,后端项目到云服务器上,拥有一个上线电商项目\n\n**配套干货:** \n[《关于JDK源码:我想聊聊如何更高效地阅读》](http://www.imooc.com/article/296612) \n[《SpringBoot应用部署于外置Tomcat容器》](https://www.imooc.com/article/68945) \n[《SpringBoot应用War包形式部署到外部Tomcat》](https://www.imooc.com/article/49247) \n[《java项目部署到linux服务器,微信小程序后台springboot项目部署到腾讯云服务器(图文详解)》](https://www.imooc.com/article/291867)\n\n**知识拓展:**[**《从0开始 独立完成企业级Java电商网站开发》**](https://coding.imooc.com/class/96.html?mc_marking=5f18580ae6df64e956fb79353a625d81&mc_channel=shouji)\n\n## 第二阶段:从单体到高可用集群演进(6-8周)\n----------------------\n\n \n**课程安排:**\n\n**第6周 LVS+Keepalived+Nginx实现高可用集群** \n从单体演进到集群,首先学习Nginx,负载均衡等相关技术,之后通过LVS+Keepalived+Nginx实现高可用服务器集群, 从而降低单节点负载压力。\n\n**配套干货:** \n[《百万雄师-集群架构》](https://www.imooc.com/article/294147) \n[《Nginx 极简扫盲入门》](http://www.imooc.com/article/296624) \n[《强大,Nginx配置一键生成》](http://www.imooc.com/article/294655) \n[《负载均衡架构采用LVS中的nat和dr模式缺陷》](https://www.imooc.com/article/21731) \n[《网站访问量大,那就是一个大型网站吗?》](https://www.imooc.com/article/294150)\n\n**知识拓展:**[《Nginx入门到实践》](https://coding.imooc.com/class/121.html?mc_marking=a4ca2e3f6214e81c4d03348ace6f7e41&mc_channel=shouji)\n\n**第7周 主从复制高可用Redis集群** \n首先会对Redis的架构与原理进行解析,之后整合Redis,实现Redis哨兵,搭建主从复制高可用Redis集群等,最后解决缓存雪崩,穿透等问题。\n\n**配套干货:** \n[《Spring Boot 整合 Redis》](http://www.imooc.com/article/297362) \n[《吊打面试官-Redis哨兵、持久化、主从、手撕LRU》](http://www.imooc.com/article/297028) \n[《 生产环境的redis集群的部署架构是怎么样的》](http://www.imooc.com/article/286472) \n[《Redis集群模式的原理》](https://www.imooc.com/article/289034) \n[《Redis哨兵、复制、集群的设计原理,以及区别》](https://www.imooc.com/article/297326)\n\n**知识拓展:**[**《Java企业级电商项目架构演进之路Tomcat集群与Redis分布式》**](https://coding.imooc.com/class/161.html?mc_marking=5ff4f5f65503f4422504faa22869ae17&mc_channel=shouji)\n\n**第8周 Redis缓存雪崩,穿透** \n分析缓存雪崩现象,学习解缓存雪崩的解决方案,缓存穿透的解决方案,落地解决对应、拓展讲解Redis批量查询的优化设计。\n\n**配套干货:** \n[《集群、限流、缓存 BAT 大厂无非也就是这么做》](http://www.imooc.com/article/291901) \n[《面对海量请求,缓存设计还应该考虑哪些问题?》](https://www.imooc.com/article/29296) \n[《「缓存穿透」和「缓存雪崩」到底啥区别?》](http://www.imooc.com/article/285759) \n[《阿里一面:关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】问题的解决方案》](http://www.imooc.com/article/283986)\n\n**知识拓展:**[**《一站式学习Redis从入门到高可用分布式实践》**](https://coding.imooc.com/class/151.html?mc_marking=308280c85112a6e66214724242550310&mc_channel=shouji)\n\n## 第三阶段:逐个击破分布式核心问题(9-17周)\n-----------------------\n\n \n**课程安排:**\n\n**第9周 分布式会话与单点登录SSO** \n从集群演进到分布式架构,解决分布式会话与单点登录相关问题。\n\n**配套干货:** \n[《Java实现SSO单点登录》](https://www.imooc.com/learn/633) \n[《springboot 分布式会话原理》](http://www.imooc.com/article/267885) \n[《SSO单点登录系统的实战运用》](https://www.imooc.com/article/288908) \n[《spring-cloud | 分布式session共享》](https://www.imooc.com/article/70332) \n[《必须掌握的Cookie知识点都在这里》](http://www.imooc.com/article/289529)\n\n**知识拓展:**[**架构师成长直通车**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第10周 分布式搜索引擎-Elasticsearch** \n以架构师角度分析目前搜索业务的弊端,由浅入深讲解ES,集成ES集群,优化商品搜索与分类搜索等功能,最后拓展2个案例让大家更加深入的理解ES。\n\n**配套干货:** \n[《Elasticsearch入门》](https://www.imooc.com/article/285914) \n[《ElasticSearch 亿级数据检索案例实战!》](http://www.imooc.com/article/296317) \n[《ES 集群上,业务单点如何优化升级?》](https://www.imooc.com/article/285765) \n[《蛋疼的ElasticSearch之配置ElasticSearch Head插件》](https://www.imooc.com/article/22709)\n\n**知识拓展:**[《ElasticSearch+Spark 构建高相关性搜索服务&千人千面推荐系统》](https://coding.imooc.com/class/391.html?mc_marking=5cba2fcfe0d32fbeefeb7febc7ab3cb1&mc_channel=shouji)\n\n**第11周 分布式文件系统-FastDFS+阿里OSS** \n在分布式系统中,文件系统是必须被所有节点访问的,为了解决单体架构中文件服务的单一性问题,我们需要学习分布式文件存储(FastDFS、阿里OSS云存储)。\n\n**配套干货:** \n[《分布式文件系统FastDFS详解》](https://www.imooc.com/article/25606) \n[《整合FastDFS分布式文件系统》](https://www.imooc.com/article/295768) \n[《FastDFS分布式文件系统安装与使用》](https://www.imooc.com/article/26078) \n[《使用阿里云OSS上传文件》](https://www.imooc.com/article/286838)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第12周 分布式消息队列-RabbitMQ** \n首先会讲解业界主流消息队列技术选型,提升大家的技术判断能力,之后是SpringBoot与RabbitMQ整合,最后带大家进行RabbitMQ基础组件封装。一起感受代码设计魅力吧。\n\n**配套干货:** \n[《消息队列助你成为高薪 Node.js 工程师》](http://www.imooc.com/article/296194) \n[《RabbitMQ消息中间件极速入门与实战》](https://www.imooc.com/learn/1042) \n[《基于RabbitMQ消息队列的分布式事务解决方案》](http://www.imooc.com/article/295377) \n[《图文实践 RabbitMQ 不同类型交换机消息投递机制》](http://www.imooc.com/article/293815) \n[《拿走不谢:一份历经线上考验的大规模系统的消息队列技术方案!》](http://www.imooc.com/article/287542)\n\n**知识拓展:**[《RabbitMQ消息中间件技术精讲》](https://coding.imooc.com/class/262.html?mc_marking=4735c66dd5e7238c00236f1768384f09&mc_channel=shouji)\n\n**第13周 分布式消息队列-Kafka** \n深入学习另外一个分布式消息队列-Kafka,然后基于Kafka搭建一个高吞吐量日志收集平台,让大家在实战中彻底掌握Kafka。\n\n**配套干货:** \n[《真的,Kafka 入门一篇文章就够了》](http://www.imooc.com/article/296602) \n[《Kafka流处理平台》](https://www.imooc.com/learn/1043) \n[《全网最通俗易懂的Kafka入门》](http://www.imooc.com/article/297409) \n[《Kafka的秘技\"坂本\"之争》](http://www.imooc.com/article/291712) \n[《面试官:Kafka 如何优化内存缓冲机制造成的频繁 GC 问题?》](http://www.imooc.com/article/293301)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第14周 分布式锁** \n在高并发场景下资源共享问题是比较常见也是必须要解决的。本周我们就学习多种基于分布式锁的解决方案,对比它们各自的优缺点,最后大家可以根据自己项目实际情况进行选择。\n\n**配套干货:** \n[《图解悲观锁和乐观锁》](http://www.imooc.com/article/285147) \n[《Synchronized锁在Spring事务管理下,为啥还线程不安全?》](http://www.imooc.com/article/278891) \n[《拜托,面试请不要再问我Redis分布式锁的实现原理》](https://www.imooc.com/article/284859) \n[《大白话聊聊Java并发面试问题之公平锁与非公平锁是啥?》](https://www.imooc.com/article/284585) \n[《基于Zookeeper实现分布式事务之Zookeeper安装》](https://www.imooc.com/article/80669)\n\n**知识拓展:**[《ZooKeeper分布式专题与Dubbo微服务入门》](https://coding.imooc.com/class/201.html?mc_marking=e5be059747178a1cf9353bf96b0329d2&mc_channel=shouji)\n\n**第15周 读写分离、分库分表-MyCAT和Sharding-JDBC** \n随着系统数据量的增加,单体数据库存储性能问题日益凸显,本周我们就来学习2种数据源读写分离和分库分表的解决方案-MyCAT和Sharding-JDBC。\n\n**配套干货:** \n[《单体数据库存储性能问题解决方案-读写分离》](https://www.imooc.com/article/295035) \n[《海量数据的存储与访问瓶颈解决方案-数据切分》](https://www.imooc.com/article/295037) \n[《MyCat 入门:漫谈 MyCat 配置系统》](https://www.imooc.com/article/23233) \n[《SpringBoot使用Sharding-JDBC读写分离》](https://www.imooc.com/article/278023)\n\n**知识拓展:**[《MyCAT+MySQL搭建高可用企业级数据库集群》](https://coding.imooc.com/class/208.html?mc_marking=dc85edd4670a4ca58fb59c417572831f&mc_channel=shouji)\n\n**第16周 分布式全局唯一主键ID、分布式事务和数据一致性** \n分库分表后,引发了ID重复问题、分布式事务等问题,本周我们会学习多种分布式全局ID的解决方案以及多种分布式事务的解决方案。\n\n**配套干货:** \n[《逐个击破分布式系统核心问题》](https://www.imooc.com/article/294148) \n[《分布式唯一ID的几种生成方案》](https://www.imooc.com/article/43415) \n[《分布式事务解决方案》](https://www.imooc.com/article/289274) \n[《若面试官问到分布式架构如何容错,把这些东西告诉他!》](http://www.imooc.com/article/291945) \n[《高阶Java开发必备:分布式系统的唯一id生成算法你了解吗?》](https://www.imooc.com/article/285273) \n[《基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战》](https://www.imooc.com/article/295377)\n\n**知识拓展:**[《分布式事务实践》](https://coding.imooc.com/class/237.html?mc_marking=1da95fed9bfaabbc41956c47ebdf0f99&mc_channel=shouji)\n\n**第17周 分布式接口幂等性,分布式限流** \n分布式系统中接口繁多,重试机制必不可少,这就需要对接口进行幂等性设计; 当网站流量激增时,我们可以通过分布式限流技术来降低服务器负载压力。\n\n**配套干货:** \n[《什么是分布式系统中的幂等性,zookeeper与dubbo》](https://www.imooc.com/article/24635) \n[《大厂面试Kafka,一定会问到的幂等性》](https://www.imooc.com/article/290698) \n[《java面试–分布式服务接口的幂等性》](https://www.imooc.com/article/289133) \n[《微服务架构下的分布式限流方案思考》](https://www.imooc.com/article/290254) \n[《分布式系统关注点——想通关「限流」?只要这一篇》](https://www.imooc.com/article/266975)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n## 第四阶段:SpringCloud G版微服务(18-25周)\n------------------------------\n\n\n\n**学习安排**:\n\n**第18周 微服务架构认知、服务治理-Eureka** \n首先带大家从架构师的视角认识微服务架构以及SpringCloud和微服务架构的关系, 然后开始学习和改造服务治理Eureka。\n\n**配套干货:** \n[《大话微服务》](https://www.imooc.com/article/295174) \n[《为什么要将应用微服务化?》](https://www.imooc.com/article/295177) \n[《一起来探讨下如何做微服务架构的拆分(How)》](https://www.imooc.com/article/295181) \n[《微服务架构会面临哪些技术问题?》](https://www.imooc.com/article/295182) \n[《进击的Spring Cloud之Greenwich》](https://www.imooc.com/article/294156) \n[《Spring Cloud和微服务架构有啥关系?》](https://www.imooc.com/article/295183) \n[《Spring Cloud整体架构》](https://www.imooc.com/article/295184) \n[《Spring Cloud三派人马恩怨情仇录》](https://www.imooc.com/article/295187) \n[《姚半仙:面对这疯狂升级的SpringCloud,咱在项目当中该何去何从呢?》](https://www.imooc.com/article/297284) \n**知识拓展:**[《SpringCloud Finchley三版本微服务实战》](http://coding.imooc.com/class/187.html?mc_marking=eb3eee1bc5164595f94b7db4e6a0d5d2&mc_channel=shouji)\n\n**第19周 负载均衡-Ribbon、服务通信与调用-Feign** \n借助Ribbon组件提供的负载均衡功能缓解访问压力。同时为了改善编程体验,我们会学习服务间调用功能-Feign\n\n**配套干货:** \n[《Spring Cloud Ribbon:负载均衡的服务调用》](https://www.imooc.com/article/293008) \n[《负载均衡多可用区》](https://www.imooc.com/article/29145) \n[《跟我学Spring Cloud(Finchley版)-08-Ribbon深入》](http://www.imooc.com/article/283651) \n[《Feign常见问题总结》](http://www.imooc.com/article/289005)\n\n**知识拓展:**[《面向未来微服务:Spring Cloud Alibaba从入门到进阶》](https://coding.imooc.com/class/358.html?mc_marking=35de16ce4181072ec3c643cb0ebe2cef&mc_channel=shouji)\n\n**第20周 服务容错-Hystrix** \n服务异常是生产环境中再正常不过的情况,轻则一行error log,重则引发服务雪崩,把上下游的服务集群一波团灭。本周我们就来学习如果使用Hystrix处理服务调用异常。 \n**配套干货:** \n[《Spring Cloud Hystrix:服务容错保护》](https://www.imooc.com/article/293199) \n[《跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧》](http://www.imooc.com/article/283500) \n[《白话SpringCloud | 第五章:服务容错保护(Hystrix)》](http://www.imooc.com/article/80863) \n[《微服务架构之「 容错隔离 」》](https://www.imooc.com/article/287568) \n[《基于Ribbon和Hystrix的声明式服务调用》](https://www.imooc.com/article/293438)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第21周 分布式配置中心-Config** \n在项目中一定经常遇到数不清的配置项和配置文件,管理起来十分头大,本周就带你一起玩转微服务下的配置管理组件-Config。\n\n**配套干货:** \n[《为什么不用原生的spring cloud config!》](http://www.imooc.com/article/296729) \n[《Spring Cloud Config:外部集中化配置管理》](http://www.imooc.com/article/293609) \n[《跟我学Spring Cloud(Finchley版)-配置中心-Spring Cloud Config》](http://www.imooc.com/article/283237) \n[《SpringBoot2.0学习之Configuration配置类》](http://www.imooc.com/article/281375)\n\n**知识拓展:**[《阿里新零售数据库设计与实战》](https://coding.imooc.com/class/353.html?mc_marking=84e6156690b477b1ed73599212b3eb03&mc_channel=shouji)\n\n**第22周 消息总线-Bus、服务网关-Gateway** \n微服务架构中,少不了消息的传递和路由,本周我们就来学习一下消息总线-Bus和第二代服务网关-Gateway。\n\n**配套干货:** \n[《Spring Cloud Bus:消息总线》](http://www.imooc.com/article/293842) \n[《万字Spring Cloud Gateway2.0,面向未来的技术,了解一下?》](http://www.imooc.com/article/293853) \n[《Spring Cloud Gateway限流详解》](http://www.imooc.com/article/290828) \n[《Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单》](http://www.imooc.com/article/293881)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第23周 服务调用链追踪-Sleuth、消息驱动-Stream** \n**配套干货:** \n[《Spring Cloud Sleuth:分布式请求链路跟踪》](http://www.imooc.com/article/294045) \n[《Spring Cloud Sleuth使用ELK收集&分析日志》](http://www.imooc.com/article/291751) \n[《服务链路追踪—Sleuth》](http://www.imooc.com/article/44596) \n[《使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪》](http://www.imooc.com/article/25611)\n\n**知识拓展:**[《SpringCloud Finchley三版本微服务实战》](http://coding.imooc.com/class/187.html?mc_marking=eb3eee1bc5164595f94b7db4e6a0d5d2&mc_channel=shouji)\n\n**第24周 微服务下Sentinel流量防控卫兵** \n会手把手带大家学习一个高并发流量防护的利器-Sentinel,通过对Sentinel的学习和实践,让大家有能力解决你项目中的流控,降级等问题。\n\n**配套干货:** \n[《大家久等了,改造版阿里巴巴 sentinel 控制台终于开源了》](http://www.imooc.com/article/294166) \n[《Alibaba Sentinel 配置项总结》](http://www.imooc.com/article/289562) \n[《Alibaba Sentinel 规则参数总结》](http://www.imooc.com/article/289345) \n[《Spring Cloud Alibaba Sentinel 整合 Feign 的设计实现》](http://www.imooc.com/article/267908)\n\n**知识拓展:**[《面向未来微服务:Spring Cloud Alibaba从入门到进阶》](https://coding.imooc.com/class/358.html?mc_marking=35de16ce4181072ec3c643cb0ebe2cef&mc_channel=shouji)\n\n**第25周 服务治理的另一条路 - Dubbo** \n主要以图文的方式为大家拓展讲解Dubbo相关知识,希望通过本章的学习, 大家可以对基于RPC协议的服务治理有一个深刻的认知。\n\n**配套干货:** \n[《微服务应用要考虑的第一个问题什么?》](https://www.imooc.com/article/296161) \n[《服务治理这台戏的开场和第一步该怎么走?》](https://www.imooc.com/article/296166) \n[《大话RPC和Dubbo架构设计》](https://www.imooc.com/article/296861) \n[《Dubbo两个核心模块-Registry和Remoting简明教程》](https://www.imooc.com/article/296863)\n\n**知识拓展:**[《打造仿猫眼项目 以Dubbo为核心解锁微服务》](http://coding.imooc.com/class/273.html?mc_marking=d065fbc4618d4d70f2060695755b138a&mc_channel=shouji)\n\n## 第五阶段:Docker,K8S容器化(26-30周)\n--------------------------\n\n \n**学习安排:**\n\n**第26周 服务容器化-Docker** \n微服务架构改造后应用组件繁多,给服务部署带来了很大的挑战。本周我们就从热门技术Docker入手,解决服务部署难题。\n\n**配套干货:** \n[《积“微”致著,有“容”乃大》](https://www.imooc.com/article/294157) \n[《你的容器化学习第一课–Docker》](https://www.imooc.com/article/295006) \n[《Docker镜像知多少?》](https://www.imooc.com/article/295008) \n[《Docker数据持久化-撑起来容器服务的半边天》](https://www.imooc.com/article/295010) \n[《Docker仓库-Docker优于前任们的根本特质》](https://www.imooc.com/article/295011)\n\n**知识拓展:**[《Docker+Kubernetes(k8s)微服务容器化实践》](https://coding.imooc.com/class/198.html?mc_marking=8b170ca27cd52bfc812a909ebfddb2a3&mc_channel=shouji)\n\n**第27周 容器技术-Cloud Foundry** \n本周为大家讲解容器部署另一分支解决方案-Cloud Foundry, 从架构和功能介绍到容器生命周期管理、网络和数据服务;逐步向后续的容器编排延伸。\n\n**配套干货:** \n[《你的容器化学习第二课–Cloud Foundry》](https://www.imooc.com/article/295007) \n[《如何成规模地部署多云的无服务器程序和 Cloud Foundry API》](https://www.imooc.com/article/252583)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第28周 容器编排-Mesos+ Marathon** \n为大家提供容器编排第一套解决方案-Mesos+Marathon,助力大家搞定容器编排难题,让你的项目从应用架构向企业架构过渡。\n\n**配套干货:** \n[《docker之服务编排了解Mesos》](http://www.imooc.com/article/277610) \n[《CentOS7安装Mesos教程》](http://www.imooc.com/article/71113) \n[《Mesos 和 Kubernetes:不是竞争者》](http://www.imooc.com/article/43854)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第29周 容器编排-K8S** \n学习K8S容器编排。我们会以企业架构师的视野,重新审视容器化编排。 \n**配套干货:** \n[《Kubernets中存储的基本分类和区别》](https://www.imooc.com/article/295012) \n[《利用K8S技术栈打造个人私有云》](https://www.imooc.com/article/23355) \n[《基于Web的Dashboard来完成Kubernetes的图形化监控和管理》](https://www.imooc.com/article/295017)\n\n**知识拓展:**[《Docker+Kubernetes(k8s)微服务容器化实践》](https://coding.imooc.com/class/198.html?mc_marking=8b170ca27cd52bfc812a909ebfddb2a3&mc_channel=shouji)\n\n**第30周 容器弹性扩缩容架构思路** \n分享容器弹性扩缩容整体架构思路。我们会采用Cloud Foundry实现资源决策性弹性扩缩容; 采用Mesos+Marathon实现负载驱动型动态扩缩容;采用K8S增值插件实现全自由扩缩容。\n\n**配套干货:** \n[《设计可动态扩容缩的分库分表》](https://www.imooc.com/article/289334) \n[《聊聊我在阿里所经历的新零售业务商品中心微服务化的过程》](https://www.imooc.com/article/296954)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n## 第六阶段:Netty与JVM性能调优(31-40周)\n--------------------------\n\n \n**学习安排:**\n\n**第31周 高性能网络通信基石-Netty入门与提高** \n很多开源产品都使用了Netty作为底层的通信基础,比如Rocketmq、Dubbo等,在工作中,对数据通信、数据同步的场景也经常会使用到,所以这周我们先入门与提高Netty。\n\n**配套干货:** \n[《个人整理:TCP知识概要》](http://www.imooc.com/article/293957) \n[《使用Netty,我们到底在开发些什么?》](http://www.imooc.com/article/290202) \n[《Netty入门之webSocket聊天室》](http://www.imooc.com/article/297473) \n[《彤哥说netty系列之Java NIO核心组件之Selector》](http://www.imooc.com/article/297140) \n[《基于Netty的Http协议栈》](https://www.imooc.com/article/74744)\n\n**知识拓展:**[《Java读源码之Netty深入剖析》](https://coding.imooc.com/class/230.html?mc_marking=f9f38ec589c1a93a7b869cd8d6be0872&mc_channel=shouji)\n\n**第32周 高性能网络通信基石-Netty最佳实战** \n提升Netty实战能力,并掌握Netty在实际开发中的最近实践。 \n**配套干货:** \n[《Netty自动重连机制的Demo》](http://www.imooc.com/article/291714) \n[《一个异步无限发送的Netty实例》](http://www.imooc.com/article/291327) \n[《Kotlin + Netty 在 Android 上实现 Socket 的服务端》](http://www.imooc.com/article/290849) \n[《netty极简教程:从helloworld到编写一个聊天室》](http://www.imooc.com/article/279077) \n[《Java 200+ 面试题补充② Netty 模块》](http://www.imooc.com/article/282057)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第33周 基于Netty打造自己的RPC通信框架-1** \n从0到1开发一个基于Netty的RPC通信框架,从整体架构设计、模块拆分,到技术落地,手把手带着小伙伴们感受架构设计与落地之美。 \n**第34周 基于Netty打造自己的RPC通信框架-2** \n继续打造属于我们自己的RPC通信框架,并最后完成功能测试。 \n**配套干货:** \n[《浅谈 RPC》](http://www.imooc.com/article/291548) \n[《RPC服务治理框架实战(一) - 手写RPC》](http://www.imooc.com/article/295754) \n[《实现一个分布式调度系统-RPC》](http://www.imooc.com/article/278036) \n[《李狗蛋和二狗子因为HTTP or RPC打起来了》](http://www.imooc.com/article/288652) \n[《RPC框架是啥之Java自带RPC实现,RMI框架入门》](http://www.imooc.com/article/285566)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第35周 应用监控与调优-工具篇** \n先学习如何迅速发现系统瓶颈,然后掌握各种应用监控工具,从而为后面的监控与调优实战打好基础。\n\n**配套干货:** \n[《Centos 7搭建Skywalking》](https://www.imooc.com/article/273777) \n[《APM工具寻找了一圈,发现SkyWalking才是我的真爱》](http://www.imooc.com/article/294387) \n[《利用prometheus监控集群之间的数据对比》](http://www.imooc.com/article/294360) \n[《昔日教人类用火的prometheus,如今在努力报警》](http://www.imooc.com/article/296714)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第36周 应用监控与调优-技巧与实战篇** \n继续学习应用监控与调优,首先学习到各种应用调优常用技巧,之后进阶并发编程4板斧,并实战线程池调优,Tomcat调优的多种方式,最后综合实战,加深理解。 \n**配套干货:** \n[《linux安装tomcat》](https://www.imooc.com/article/44825) \n[《并发编程与锁的底层原理》](https://www.imooc.com/article/283248) \n[《2w字长文,让你瞬间拥有「调用链」开发经验》](https://www.imooc.com/article/297130)\n\n**知识拓展:**[《Java并发核心知识体系精讲》](https://coding.imooc.com/class/362.html?mc_marking=a2609ac01ddeba841989e3d9acd53b8b&mc_channel=shouji)\n\n**第37周 JVM性能调优-工具篇** \n首先要学习JVM核心算法,工具和参数。通过本周的学习,我们基本上可以具备JVM调优所需的一切准备,为后续真正的实战打下坚实的基础。\n\n**配套干货:** \n[《JVM性能调优入门》](http://www.imooc.com/article/33759) \n[《jvm调优-命令篇》](https://www.imooc.com/article/25983) \n[《JVM 调优及工具使用》](http://www.imooc.com/article/296677) \n[《Java命令行监控工具(jmap,jstack,jstat,jinfo,jps)》](https://www.imooc.com/article/43355)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第38周 JVM性能调优-实战篇** \n进入JVM调优实战,通过实战学习,大家基本上可以解决工作中80%以上JVM相关的性能调优问题。 \n**配套干货:** \n[《JVM调优分享》](http://www.imooc.com/article/294586) \n[《这一次,终于系统的学习了 JVM 内存结构》](http://www.imooc.com/article/294831) \n[《关于 JVM,都有哪些面试最常考的点需要重点掌握?》](http://www.imooc.com/article/295921) \n[《老司机生产实践经验:线上系统的JVM内存是越大越好吗?》](http://www.imooc.com/article/296787)\n\n**知识拓展:**[**《架构师成长直通车》**](https://class.imooc.com/sale/javaarchitect?mc_marking=c6615303b3175f848fccdb52abb833ec&mc_channel=shouji)\n\n**第39周 数据库监控与调优** \n解决数据库监控与调优的问题,通过学习,基本上可以搞定慢查询,索引等数据库重难点性能调优问题。 \n**配套干货:** \n[《SpringBoot使用prometheus监控》](https://www.imooc.com/article/281867) \n[《SQL优化器简介》](https://www.imooc.com/article/278659) \n[《MySQL优化配置之query\\_cache\\_size》](http://www.imooc.com/article/297479) \n[《MySQL 数据库优化,推荐看看这篇文章!》](http://www.imooc.com/article/296314)\n\n**知识拓展:**[《一线数据库工程师带你深入理解 MySQL》](https://www.imooc.com/read/43?mc_marking=101a56ee9974834d36ae88e5b969e572&mc_channel=shouji)\n\n**第40周 Linux调优与架构调优** \n学习Linux与架构优化,通过学习,相信大家已经对性能优化不再畏惧,反而会跃跃欲试。\n\n**配套干货:** \n[《教你在 Linux 下时光穿梭》](http://www.imooc.com/article/285807) \n[《还用什么Win,快来 Linux 当上帝》](http://www.imooc.com/article/289029) \n[《面试 / 工作必备 Linux 命令》](http://www.imooc.com/article/269976) \n[《架构秘笈:移花接木。使用mysql模拟redis》](http://www.imooc.com/article/292538)\n\n**知识拓展:**[《Linux核心技能与应用》](https://coding.imooc.com/class/386.html?mc_marking=762bbd958a5d46a2f17fdde1853f2679&mc_channel=shouji)\n\n## Ref\n- 慕课网官方运营中心', ' Java架构师成长直通车;第1周 万丈高楼,地基首要;数据库监控与调优', 0, b'0', b'1', NULL, 1, 0, 'https://static-admin.madaoo.com/WX20201011-131909%402x.png', ' Java架构师成长直通车', NULL, 2, NULL, '1234533425', 12, '4');
INSERT INTO `ar_article` VALUES ('1322178386327638016', 1604066866623, 1604067098801, 0, '## 接口安全问题\n\n> 无状态登录、token鉴权属于基础功能不在本文讨论范围\n\n接口安全一般分以下几种:\n* 请求的身份是否合法?(能否证明你是你)\n* 请求的参数是否被篡改?(参数真实性)\n* 请求是否唯一?(一个请求不允许重复使用)\n\n以及部署HTTPS协议基本可以防止大部分安全问题,但是正如我之前所说的只有用矛攻击过才知道怎么用盾防,当然攻击并不是让你非要攻击,之前文章提到的可以使用骇客系统模拟攻击至少能让你知道攻击者如何攻击,知其然更要知其所以然, 否则这里做的一系列安全措施搞不懂那可真是大雾里看天--迷迷糊糊。\n\n## AccessKey&SecretKey (开放平台)\n此处操作主要保证每次请求都是唯一且有效不被篡改的,一般用于三方接口对接\n\n### 1. 请求身份\n为开发者分配 **AccessKey**(开发者标识,确保唯一)和 **SecretKey**(用于接口加密,确保不易被穷举,生成算法不易被猜测)。\n\n### 2. 防止篡改()\n1. 按照请求参数名的字母升序排列非空请求参数(包含AccessKey),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA;\n2. 在stringA最后拼接上 [ SecretKey ] [ timestamp ] 得到字符串stringSignTemp;\n3. 对stringSignTemp进行MD5运算,并将得到的字符串所有字符转换为小写,得到sign值。\n\n#### 客户端:\n- (1)从内容算摘要(哈希算法)\n- (2)从摘要明文到摘要密文,也称数字签名(发送方私钥+加密算法)\n即:客户端将请求参数按照 key 字典序排序\n\n#### 服务端:\n- (1)从摘要密文(数字签名)到摘要明文(发送方公钥+解密算法)\n- (2)从收到的内容当中计算摘要(哈希算法),与(1)的结果比对是否一致\n即:发送方接收方两者都通过一样的算法和约定好的key SecretKey,提取出摘要,然后比对这两个摘要是否一致来完成验证,客户端对参数签名不可抵赖\n\n请求携带参数**AccessKey**和**Sign**,只有拥有合法的身份AccessKey和正确的签名Sign才能放行。这样就解决了身份验证和参数篡改问题,即使请求参数被劫持,由于获取不到SecretKey(**仅作本地加密使用,不参与网络传输**),无法伪造合法的请求。\n\n那么这里的签名算法中为什么要对请求参数按参数名做字典序升序排列?\n\n因为这种对接三方接口时传的参数大部分都是前端传参给后端,后端再传输给三方接口,这中间可能存在前端js处理参数、后端代码逻辑处理又或不同的客户端语言、及客户端语言都有各自的参数封装和解析实现,实现可能不尽相同导致参数顺序被打乱,这就导致客户端生成签名时拼接参数的顺序是无法确定的,所以为了保证客户端生成签名时用的参数顺序和服务器的顺序一致,不出现参数一致却签名对不上的情况,API方(第三方接口)提供一个排序方案,使用者遵循此方案,以此来保证大家保证签名一致。\n\n\n实践可以参考我之前对接过腾讯下某医疗功能接口: [Gist地址](https://gist.github.com/GuoGuang/c32e284b86f5ef980607721d13d6bdc1)\n\n```\n\n /**\n * 请求方参数签名\n * signature:接口签名\n * partnerId:合作方 ID\n * openId:用户唯一id\n * appId: 应用 ID,对应公众号、小程序或者自定义服务标识\n */\n @GetMapping\n public Result<String> getFullGuideParam() {\n log.info(\"start splicing url\");\n long timestamp = System.currentTimeMillis();\n String openId = SecurityUtils.getCurrentUserLogin();\n TreeMap<String,String> params = new TreeMap<>();\n params.put(\"appid\",appId);\n params.put(\"openId\",openId);\n params.put(\"partnerId\",partnerId);\n params.put(\"timestamp\",String.valueOf(timestamp));\n\n // key转小写,按照Key排序\n Map<String, String> targetTableColumnListMap = params.entrySet().stream().collect(Collectors.toMap(\n entry -> entry.getKey().toLowerCase(),\n Map.Entry::getValue,\n (e1, e2) -> e2,\n LinkedHashMap::new));\n // map转为url参数 ?a=1&b=2\n String partUrlEncrypt = getUrlParamsByMap(targetTableColumnListMap);\n String signature;\n try {\n signature = EncryptUtil.hmacSha256(partnerKey,partUrlEncrypt);\n } catch (Exception e) {\n log.error(\"签名加密异常:{}\",e.getMessage());\n return Result.badRequest(INTERNAL_SERVER_ERROR);\n }\n\n params.put(\"signature\",signature);\n params.put(\"loginType\",\"h5\");\n String urlParamsByMap = getUrlParamsByMap(params);\n log.info(\"签名参数url:{},params:{}\",MIYING_URL,urlParamsByMap);\n return Result.ok(MIYING_URL+urlParamsByMap);\n }\n```\n\n\n### 重放攻击\n虽然上边解决了请求参数被篡改的隐患,但是还存在着重复使用请求参数伪造二次请求的隐患,我们就在这里解决这个问题\n\n#### timestamp+nonce方案\n\nnonce指**唯一的随机字符串**,用来标识每个被签名的请求。通过为每个请求提供一个唯一的标识符,服务器能够防止请求被多次使用(记录所有用过的nonce以阻止它们被二次使用)。\n\n然而,对服务器来说永久存储所有接收到的nonce的代价是非常大的。可以使用**timestamp来优化nonce的存储**。\n\n假设允许客户端和服务端最多能存在15分钟的时间差,同时追踪记录在服务端的nonce集合。当有新的请求进入时,首先检查携带的timestamp是否在15分钟内,如超出时间范围,则拒绝,然后查询携带的nonce,如存在已有集合,则拒绝。否则,记录该nonce,并删除集合内时间戳大于15分钟的nonce(可以使用redis的expire,新增nonce的同时设置它的超时失效时间为15分钟)。\n\n\n### 代码实现\n\n请求接口:http://api.baidu.com/demo?a=Jams&b=Tom&c=Cilrs\n\n* 客户端\n1. 生成timestamp和唯一的随机字符串nonce=${保证唯一的值}\n2. 按照请求参数的字母升序排列非空请求参数(包含AccessKey) \n `stringA=\"AccessKey=access&a=Jams&b=Tom&c=Cilrs×tamp=now&nonce=random\";`\n3. 拼接密钥SecretKey \n `stringSignTemp=\"AccessKey=access&a=Jams&b=Tom&c=Cilrs×tamp=now&nonce=random&SecretKey=secret\";`\n4. MD5并且转换为小写 \n `sign=MD5(stringSignTemp).toLowerCase();`\n5. 最终请求 \n `http://api.baidu.com/demo?a=Jams&b=Tom&c=Cilrs×tamp=now&nonce=nonce&sign=sign;`\n\n* 服务端 \n \n \n\n## 结语\n每一套安全技术方案的背后都有一段让人心力交瘁、折磨不已痛并快乐着的红�����对抗,建议大家没事的时候也可以参考下面几篇文章了解\"how\",明白原理才是王道。\n\n\n## Ref\n- [前端爬虫攻防之接口签名方案](https://www.ershicimi.com/p/eba5cc54c3bf9cc7fa18f8e3589392f5)\n- 资料-合作方非微信登录鉴权接口说明.pdf', '接口安全一般分以下几种:\n请求的身份是否合法?(能否证明你是你)\n请求的参数是否被篡改?(参数真实性)\n请求是否唯一?(一个请求不允许重复使用)', 4, b'0', b'1', NULL, 0, 0, 'https://static-admin.madaoo.com/download%20%281%29.png', '如何保证你的接口安全?', NULL, 5, NULL, '1234533425', 16, '3');
INSERT INTO `ar_article` VALUES ('1326913120844779520', 1605195715520, 1605195715520, 0, '## 责任连模式\n\n**定义**:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。\n\n**类型**:行为类模式\n\n**类图**:\n\n\n\n#### 首先来看一段代码:\n\n\n```\npublic void test(int i, Request request){\n if(i==1){\n Handler1.response(request);\n }else if(i == 2){\n Handler2.response(request);\n }else if(i == 3){\n Handler3.response(request);\n }else if(i == 4){\n Handler4.response(request);\n }else{\n Handler5.response(request);\n }\n}\n```\n代码的业务逻辑是这样的,方法有两个参数:整数i和一个请求request,根据i的值来决定由谁来处理request,如果i == 1,由Handler1来处理,如果i == 2,由Handler2来处理,以此类推。在编程中,这种处理业务的方法非常常见,所有处理请求的类有if…else…条件判断语句连成一条责任链来对请求进行处理,相信大家都经常用到。这种方法的优点是非常直观,简单明了,并且比较容易维护,但是这种方法也存在着几个比较令人头疼的问题:\n\n代码臃肿:实际应用中的判定条件通常不是这么简单地判断是否为1或者是否为2,也许需要复杂的计算,也许需要查询数据库等等,这就会有很多额外的代码,如果判断条件再比较多,那么这个if…else…语句基本上就没法看了。\n耦合度高:如果我们想继续添加处理请求的类,那么就要继续添加else if判定条件;另外,这个条件判定的顺序也是写死的,如果想改变顺序,那么也只能修改这个条件语句。\n 既然缺点我们已经清楚了,就要想办法来解决。这个场景的业务逻辑很简单:如果满足条件1,则由Handler1来处理,不满足则向下传递;如果满足条件2,则由Handler2来处理,不满足则继续向下传递,以此类推,直到条件结束。其实改进的方法也很简单,就是把判定条件的部分放到处理类中,这就是责任连模式的原理。\n\n \n\n#### 责任连模式的结构\n> 责任连模式的类图非常简单,它由一个抽象地处理类和它的一组实现类组成:\n\n* 抽象处理类:抽象处理类中主要包含一个指向下一处理类的成员变量nextHandler和一个处理请求的方法handRequest,handRequest方法的主要思想是,如果满足处理的条件,则有本处理类来进行处理,否则由nextHandler来处理。\n* 具体处理类:具体处理类主要是对具体的处理逻辑和处理的适用条件进行实现。\n\n#### 了解了责任连模式的大体思想之后,再看代码就比较好理解了:\n\n```\n\nclass Level {\n private int level = 0;\n public Level(int level){\n this.level = level;\n };\n \n public boolean above(Level level){\n if(this.level >= level.level){\n return true;\n }\n return false;\n }\n}\n \nclass Request {\n Level level;\n public Request(Level level){\n this.level = level;\n }\n \n public Level getLevel(){\n return level;\n }\n}\n \nclass Response {\n \n}\n \nabstract class Handler {\n private Handler nextHandler; \n public final Response handleRequest(Request request){\n Response response = null;\n \n if(this.getHandlerLevel().above(request.getLevel())){\n response = this.response(request);\n }else{\n if(this.nextHandler != null){\n this.nextHandler.handleRequest(request);\n }else{\n System.out.println(\"-----没有合适的处理器-----\");\n }\n }\n return response;\n }\n public void setNextHandler(Handler handler){\n this.nextHandler = handler;\n }\n protected abstract Level getHandlerLevel();\n public abstract Response response(Request request);\n}\n \nclass ConcreteHandler1 extends Handler {\n protected Level getHandlerLevel() {\n return new Level(1);\n }\n public Response response(Request request) {\n System.out.println(\"-----请求由处理器1进行处理-----\");\n return null;\n }\n}\n \nclass ConcreteHandler2 extends Handler {\n protected Level getHandlerLevel() {\n return new Level(3);\n }\n public Response response(Request request) {\n System.out.println(\"-----请求由处理器2进行处理-----\");\n return null;\n }\n}\n \nclass ConcreteHandler3 extends Handler {\n protected Level getHandlerLevel() {\n return new Level(5);\n }\n public Response response(Request request) {\n System.out.println(\"-----请求由处理器3进行处理-----\");\n return null;\n }\n}\n \npublic class Client {\n public static void main(String[] args){\n Handler handler1 = new ConcreteHandler1();\n Handler handler2 = new ConcreteHandler2();\n Handler handler3 = new ConcreteHandler3();\n \n handler1.setNextHandler(handler2);\n handler2.setNextHandler(handler3);\n \n Response response = handler1.handleRequest(new Request(new Level(4)));\n }\n}\n```\n代码中Level类是模拟判定条件;Request,Response分别对应请求和响应;抽象类Handler中主要进行条件的判断,这里模拟一个处理等级,只有处理类的处理等级高于Request的等级才能处理,否则交给下一个处理者处理。在Client类中设置好链的前后执行关系,执行时将请求交给第一个处理类,这就是责任连模式,它完成的功能与前文中的if…else…语句是一样的。\n\n#### 责任链模式的优缺点\n责任链模式与if…else…相比,他的耦合性要低一些,因为它把条件判定都分散到了各个处理类中,并且这些处理类的优先处理顺序可以随意设定。责任链模式也有缺点,这与if…else…语句的缺点是一样的,那就是在找到正确的处理类之前,所有的判定条件都要被执行一遍,当责任链比较长时,性能问题比较严重。\n\n#### 区别\n- 责任链模式\n解决更多的是 条件属于模糊的判断,执行不同的逻辑,比如if(true || false) / else if() /…将判断条件内置于函数中,条件不符合需要链式传递继续执行函数\n\n- 策略模式\n有确定的判断条件,比如switch...case直接根据确定的判断条件调用\n\n\n#### 总结\n责任链模式其实就是一个灵活版的if…else…语句,它就是将这些判定条件的语句放到了各个处理类中,这样做的优点是比较灵活了,但同样也带来了风险,比如设置处理类前后关系时,一定要特别仔细,搞对处理类前后逻辑的条件判断关系,并且注意不要在链中出现循环引用的问题。\n\n另外Spring Security 中的过滤器链就是一种责任链模式。一个请求到达后,被过滤器链中的过滤器逐个进行处理,过滤器链中的过滤器每个都具有不同的职能并且互不相扰,感兴趣的同学可以参考 FilterChainProxy$VirtualFilterChain ', '使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。', 0, b'0', b'1', NULL, 2, 0, 'https://static-admin.madaoo.com/QQ20201112-234132%402x.png', '设计模式之责任连模式', NULL, 2, NULL, '1234533425', 3, '1');
INSERT INTO `ar_article` VALUES ('1329777365315883008', 1605878604616, 1610513532278, 0, '\n \n无论是工作,学习还是生活中,向别人提问都是不可或缺的一部分。\n\n有一个很有趣的故事,说一个肥宅逐渐把“这件事为什么发生在我身上”的想法替换成了“这件事要教会我什么”,他的人生境遇彻底改变了,从此一路开挂并且变成了成功人士,很多时候,提问的方式真的会改变人的一生。\n\n> 学会提问的艺术是通往成功的阶梯 ——\"沃兹基·辨德\"\n\n我们都应该遇这类情况,在互联网,或者论坛中,当自己要提问寻求帮助的时候,往往没有回应,最终,满心期待却只问出个寂寞。当你会觉得世风日下,人心不古,质问这种情况为什么总发生在我身上时。或许可以改变下思路,想一想这件事情教会了你什么?没错!它告诉你应该改一改提问的方式了。\n\n提问之前,先自己找一找答案,文献,书籍,百度,很多时候都能找到解决办法。如果还是无法解决,先理清问题,清楚自己为什么要问,打算为此问题做点什么? \n\n首先,提一个好的问题,要注意以下几点:\n\n0. 你是如何遇到要解决的问题的,什么场景。\n1. 知道你的目的,搞清楚你要问什么,比如为什么1+1=2,我想让他等于3,我作出如下尝试等等...\n2. 让你的问题精简。使用描述准确,含义丰富的标题或者主题。\n3. 只问基本问题。对问题无关紧要的信息不要出现,尊重对方的时间和注意力\n\n提问就是一个代入的过程,让回答者跟随你的想法走一遍这个问题,那么沟通障碍会少很多\n\n\n\n\n#### 例如计算机领域:\n提问前确保自己已经思考过这个问题,知道自己需要达到的目的是什么,对这个问题作出了哪些尝试,如果在网络、论坛问复杂一些的问题请提供一个简单的能够重现该问题的example。\n\n问题要文章一样,使用一句话(标题)来总结整个问题,你可以提供哪些详细信息来帮助对方识别并解决这个问题,包括任何错误消息,关键API或异常情况,如果提问题时不提供一些基本信息那么你就会和对方进入你问我答场景:“什么版本?”,“配置文件发来看看”...\n\n\n这里插一嘴:很多地方看到过一些人认为代码不应该有注释,“好的代码是自解释的”,“代码应该好到不需要任何多余的解释”等等等等,我目前经手的几个项目里也有很多那种所谓自解释的代码命名,但是这些代码让人看得无一例外的晕头转向,因为国内语言差异、混式散装英语会带给读你代码的人比中文注释更混乱的意思,读你代码的人除了重构这块代码就是单纯需要知道这块代码做了什么事情,如果没有注释,对于简单一点的代码还好,那种复杂业务逻辑的几百行难道让人去逐行阅读吗?所以代码注释以及提问就跟文章一样,给人一个大概主题,再详细深入去了解详细内容,而不是直接给人一堆细节让人去猜测你的意图。\n\n## Ref \n- 《学会提问》', '有一个有趣的故事,说一个肥宅逐渐把“这件事为什么发生在我身上”的想法替换成了“这件事要教会我什么”,他的人生境遇彻底改变了,从此一路开挂并且变成了成功人士,很多时候,提问的方式真的会改变人的一生', 3, b'0', b'1', NULL, 0, 0, 'https://static-admin.madaoo.com/good%20question.png', '我该怎么问一个好问题', NULL, 16, NULL, '1234533425', 67, '1');
INSERT INTO `ar_article` VALUES ('1354093378479984640', 1611675993925, 1614845153554, 0, '\n## OpenResty\nOpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。\n\nOpenResty在国内很多公司都在使用,包含京东在内的很多大公司都是在此基础上实现的自己内部高性能服务器,再加上lua本身小巧简单,生态好,在服务器端搭配nginx可以说是如虎添翼好不威风。\n\n\n## 为什么使用OpenResty?\nOpenResty其实就是nginx+lua增强版,这里直接说lua,lua的好处这里就不陈述了,官网有详细介绍,我们一般使用lua可以嵌入到已有的系统中,对原有系统功能增强且性能客观。\n\n本文中主要使用lua来实现token存在黑名单时禁止访问的功能,按理说这个功能在SpringCloud-Gateway 或者 Zuul中就可以实现,但是我司并没有使用这种网关组件且系统目前很稳定,所以没有必要现在再去大动干戈引入新组件,所以我使用lua脚本来实现这个功能。\n\nlua脚本可以做的功能还很多不仅限于此,像游戏领域、unity3D等等。\n\n\n\n### 快速启动\n这里使用Docker来运行,-v 后面的路径和nginx.conf请提前创建好,下面做映射会用到。\n\n> 注意版本openresty:1.19.3.1-alpine\n\n```\n# 安装opm\nsudo yum install -y openresty-opm\n\n# -v /data/nginx/conf/lua:/usr/local/openresty/nginx/conf/lua 映射自定义的脚本位置\ndocker run --name nginx -d -p 80:80 -p 443:443 -v /data/nginx/html:/usr/local/openresty/nginx/html -v /data/nginx/conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf -v /data/nginx/logs:/usr/local/openresty/nginx/logs -v /data/nginx/conf/lua:/usr/local/openresty/nginx/conf/lua -v /usr/local/openresty/site:/usr/local/openresty/site openresty/openresty:1.19.3.1-alpine\n```\n\n### 源码编译\n或者使用源码编译的方式\n```\nwget https://openresty.org/package/centos/openresty.repo\nsudo mv openresty.repo /etc/yum.repos.d/\nsudo yum check-update\nsudo yum install -y openresty-resty\nsudo yum install -y openresty-opm\nsudo yum --disablerepo=\"*\" --enablerepo=\"openresty\" list available\n\n# 如果使用源码编译就需要编辑 vim /usr/local/openresty/nginx/ 下的文件\n```\n\n\n### 添加新modules\n下面会用到三个modules:\n- lua-resty-jwt\n- lua-redis\n- lua-cjson\n- rsa\n其中cjson和redis是OpenResty自带的,所以需要安装新的modules\n\n```\nopm get SkyLothar/lua-resty-jwt\nopm install spacewander/lua-resty-rsa\n\n# 默认安装在usr/local/openresty/site,将此路径映射到docker容器中即可。\n```\n\n\n## 案例\n### nginx.conf \n\n```\npcre_jit on;\nevents {\n worker_connections 1024;\n}\nhttp {\n // 映射的自己的lua脚本位置,引用时: require(\'nginx-jwt\')\n lua_package_path \"/usr/local/openresty/nginx/conf/?.lua;;\";\n include mime.types;\n default_type application/octet-stream;\n sendfile on;\n keepalive_timeout 65;\n server {\n listen 80;\n server_name localhost;\n\n location / {\n lua_code_cache off;\n default_type \'text/html\';\n # rewrite_by_lua_file conf/lua/token.lua;\n # access_by_lua_file conf/lua/token.lua;\n # 这里使用access_by_lua_block,限制在访问阶段,lua有多个执行级别,具体参考lua文档\n access_by_lua_block {\n local obj = require(\'nginx-jwt\')\n obj.auth()\n }\n }\n \n # 根据referer处理逻辑\n location /filter{\n set $proxy \"\";\n lua_code_cache off;\n rewrite_by_lua_file conf/lua/filter.lua;\n # $proxy 被filter.lua动态改变\n proxy_pass http://$proxy$uri;\n\n }\n\n error_page 500 502 503 504 /50x.html;\n location = /50x.html {\n root html;\n }\n }\n}\n\n```\n\n### nginx-jwt.lua\n实现token存在黑名单时禁止访问\n其他情况不处理\n```\nlocal cjson = require \"cjson\"\nlocal jwt = require \"resty.jwt\"\nlocal redis = require(\"resty.redis\")\nlocal secret = \"internal\"\nlocal M = {}\n\nlocal function close_connection( red )\n if not red then\n return\n end\n local ok, err = red:close()\n if not ok then\n ngx.log(ngx.ERROR, \"close error \")\n end\nend\n\n-- 定义函数\nfunction M.auth()\n local auth_header = ngx.var.http_Authorization\n if auth_header == nil then\n -- pass 不处理\n return\n end\n ngx.log(ngx.INFO, \"LUA Authorization: \" .. auth_header)\n local _, _, token = string.find(auth_header, \"Bearer%s+(.+)\")\n\n if token == nil then\n return\n end\n\n ngx.log(ngx.INFO, \"Token: \" .. token)\n\n local red = redis:new()\n red:set_timeout(2000)\n local ip = \"xx.xx.xx.xx\"\n local port = 6379\n local ok, err = red:connect(ip, port)\n if not ok then\n return\n end\n \n local res, err = red:auth(\"xx\")\n if not res then\n ngx.say(\"connect to redis error : \", err)\n return\n end\n\n local jwt_obj = jwt:verify(secret, token)\n\n if ( jwt_obj[\"payload\"] ~= null ) then\n local jti = jwt_obj[\"payload\"][\"jti\"]\n local resp, err = red:get(\"token:logout:\"..jti)\n close_connection(red)\n if not resp then\n ngx.say(\"get msg erro:\", err)\n return\n end\n -- nred:get 的值是特殊null,需要使用ngx.null\n if resp ~= ngx.null then\n -- 设置响应状态返回\n ngx.log(ngx.WARN, \"the token has been withdrawn \".. jwt_obj.reason)\n ngx.status = ngx.HTTP_UNAUTHORIZED\n ngx.header.content_type = \"application/json; charset=utf-8\"\n ngx.say(cjson.encode(jwt_obj))\n ngx.exit(ngx.HTTP_UNAUTHORIZED)\n end\n end\n\n ngx.log(ngx.INFO, \"JWT: \" .. cjson.encode(jwt_obj))\n\nend\n\n-- 导出函数\nreturn M\n\n```\n\n### filter.lua\n根据http_referer判断,只处理符合条件的,比如带着参数a的跳转A网站,带着参数b的跳转B网站,\n```\nfunction urldecode(s)\n s = s:gsub(\'+\', \' \')\n :gsub(\'%%(%x%x)\', function(h)\n return string.char(tonumber(h, 16))\n end)\n return s\nend\n\nfunction parseurl(s)\n local ans = {}\n for k,v in s:gmatch(\'([^&=?]-)=([^&=?]+)\' ) do\n ans[ k ] = urldecode(v)\n end\n return ans\nend\n\n-- t = parseurl(\"www.baidu.com/?hosId=SDSL2015\")\nt = parseurl(ngx.var.http_referer)\nngx.say(t.hosId)\n-- proxy需要先定义\nngx.var.proxy = \"www.ServerA.com\"\nif (t.hosId) then\nngx.var.proxy = \"www.ServerB.com\"\nend\n\n\n-- 自身版\n set $proxy \"\";\nrewrite_by_lua_block {\n local s = ngx.var.http_referer\n local ans = {}\n for k,v in s:gmatch(\'([^&=?]-)=([^&=?]+)\' ) do\n ans[ k ] = v:gsub(\'+\', \' \'):gsub(\'%%(%x%x)\', function(h)\n return string.char(tonumber(h, 16))\n end)\n end\n ngx.say(ans.hosId)\n ngx.var.proxy = \"www.ServerA.com\"\n if (ans.hosId) then\n ngx.var.proxy = \"www.ServerB.com\"\n end\n ngx.say(ngx.var.proxy)\n}\n```\n\n## 对接口的请求和响应加密\n> 目前对称加密仅能对240字节以内的数据加密。所以下面使用的是对称加密\n\n[rest.rsa](https://github.com/spacewander/lua-resty-rsa) 只能用公钥加密数据,key_type 有两种类型:\n- rsa.KEY_TYPE.PKCS1 The input key is in PKCS#1 BEGIN ==RSA== PUBLIC格式(usually starts with -----BEGIN RSA PUBLIC).\n- rsa.KEY_TYPE.PKCS8 The input key is in PKCS#8 BEGIN PUBLIC格式(usually starts with -----BEGIN PUBLIC).\n```\n# 目前采用的对称加密\nhttp {\n lua_package_path \"/usr/local/openresty/nginx/conf/lua/?.lua;;\";\n include mime.types;\n default_type application/octet-stream;\n sendfile on;\n keepalive_timeout 65;\n server {\n listen 80;\n # 开启对请求body的数据获取,否则拿不到前端请求体数据\n lua_need_request_body on;\n server_name localhost;\n location / {\n # default_type \'text/html\';\n lua_code_cache off;\n rewrite_by_lua_file conf/lua/request.lua;\n proxy_pass https://api.madaoo.com/ar/category;\n # 重写响应体导致数据长度变换,这里需要置为nil\n header_filter_by_lua_block { ngx.header.content_length = nil }\n body_filter_by_lua_file conf/lua/response.lua;\n \n # body_filter_by_lua_block {\n # ngx.arg[1] = 6666\n # }\n }\n }\n}\n```\n\n- request.lua\n> aes:new(\"这个密码\")必须是十六位\n```\n# 前端传过来的是十六进制数据(便于传输),这里需要转换\nlocal aes = require \"resty.aes\"\nlocal str = require \"resty.string\"\nfunction hex2bin(hexstr)\n local str = \"\"\n for i = 1, string.len(hexstr) - 1, 2 do\n local doublebytestr = string.sub(hexstr, i, i+1);\n local n = tonumber(doublebytestr, 16);\n if 0 == n then\n str = str .. \'\\00\'\n else\n str = str .. string.format(\"%c\", n)\n end\n end\n return str\nend\n\n local aes_128_cbc_with_iv = assert(aes:new(\"1234567890123456\",nil, aes.cipher(128,\"cbc\"), {iv=\"1234567890123456\"}))\n local encrypted_body = ngx.req.get_body_data()\n ngx.log(ngx.ERR,\"param encrypted_body is: \", encrypted_body)\n local decrypted_body = aes_128_cbc_with_iv:decrypt(hex2bin(encrypted_body))\n ngx.log(ngx.ERR,\"AES 128 CBC (WITH IV) Decrypted: \", decrypted_body)\n ngx.req.set_body_data(decrypted_body)\n```\n\n- response.lua\n```\n-- 默认padding是pkcs7\nlocal aes = require \"resty.aes\"\nlocal str = require \"resty.string\"\nlocal aes_128_cbc_with_iv = assert(aes:new(\"shunnengcnsecret\",nil, aes.cipher(128,\"cbc\"), {iv=\"shunnengcnsecret\"}))\nlocal encrypted_body = aes_128_cbc_with_iv:encrypt(ngx.arg[1])\nngx.log(ngx.ERR,\"AES 128 CBC (WITH IV) Encrypted HEX: \", str.to_hex(encrypted_body))\nlocal chunk, eof = ngx.arg[1], ngx.arg[2]\nlocal info = ngx.ctx.buf\nchunk = chunk or \"\"\n-- 将原本的内容记录下来,因为body_filter_by_lua_file会执行多遍\nif info then\n ngx.ctx.buf = info .. chunk\n else\n ngx.ctx.buf = chunk\nend\nif eof then\n local encrypted_body = aes_128_cbc_with_iv:encrypt(ngx.ctx.buf)\n ngx.arg[1] = str.to_hex(encrypted_body)\n else\n ngx.arg[1] = nil\nend\n```\n- 前端\n> keyStr必须是十六位\n```\n#App.vue\nimport CryptoJS from \'@/api/article/CryptoJS\'\nexport default {\n name: \'App\',\n methods: {\n savePwd(e) {\n const a = CryptoJS.encrypt(\'123\')\n console.log(a)\n const b = CryptoJS.decrypt(\'5625a9e0f5894f98f1f3e506d64fcc80\')\n console.log(b)\n }\n }\n}\n\n\n# CryptoJS.js\nimport CryptoJS from \'crypto-js\'\nexport default {\n // 加密\n encrypt(word, keyStr, ivStr) {\n keyStr = keyStr || \'1234567890123456\'\n ivStr = ivStr || \'1234567890123456\'\n const key = CryptoJS.enc.Utf8.parse(keyStr)\n const iv = CryptoJS.enc.Utf8.parse(ivStr)\n const srcs = CryptoJS.enc.Utf8.parse(word)\n\n const encrypted = CryptoJS.AES.encrypt(srcs, key, {\n iv,\n mode: CryptoJS.mode.CBC,\n padding: CryptoJS.pad.Pkcs7\n })\n return encrypted.ciphertext.toString()\n },\n // 解密\n decrypt(encryptedStr, keyStr, ivStr) {\n // 拿到字符串类型的密文需要先将其用Hex方法parse一下\n var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr)\n\n // 将密文转为Base64的字符串\n // 只有Base64类型的字符串密文才能对其进行解密\n var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr)\n\n keyStr = keyStr || \'1234567890123456\'\n ivStr = ivStr || \'1234567890123456\'\n var key = CryptoJS.enc.Utf8.parse(keyStr)\n const iv = CryptoJS.enc.Utf8.parse(ivStr)\n\n var decrypt = CryptoJS.AES.decrypt(encryptedBase64Str, key, {\n iv,\n mode: CryptoJS.mode.CBC,\n padding: CryptoJS.pad.Pkcs7\n })\n return decrypt.toString(CryptoJS.enc.Utf8)\n }\n}\n```\n\n\n\n### note\n1. ngxin不正常工作时一般就是lua脚本有问题没写对检查下\n2. body_filter_by_lua_file 会执行多遍,所以需要将数据暂存在某个字段,然后拼接。参考response.lua\n3. 实现接口数据加解密时遇到 Error: incorrect header checkView in Console ,这是Kong导致的问题,[参考 Kong + Gzip doesn\'t work ](https://github.com/Kong/kong/issues/1200#issuecomment-257940259)\n\n## REF\n- [文档](https://openresty.org/cn/linux-packages.html#centos)', 'OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。', 0, b'0', b'1', NULL, 0, 0, 'https://static-admin.madaoo.com/%E9%BB%98%E8%AE%A4%E6%96%87%E4%BB%B61611671823240.png', 'Lua实战', NULL, 11, NULL, '1234533425', 6, '1');
INSERT INTO `ar_article` VALUES ('1355543846427168768', 1612021812431, 1612021812431, 0, '\n## 年终总结\n忙碌了一年,又到年底了,年底肯定少不了年终总结,那年终总结是个啥,大体就是回顾过去,展望未来,这是年终总结的使命、核心。告诉你的上司你去年做了什么,为公司做了什么贡献,一般这种就是给大领导看的,因为你的直属上司很清楚你一年的工作。\n\n年终总结这个东西在公司中还是比较重要的,写好了或者没写好都会让你的领导记住你,并且这玩意也可以让你自我总结一下今年赚了多少money,技术提升多了多少,相比去年竞争力有没有增长,所以我建议大家可以认真写写总结。\n\n工作了几年基本每年都会写这种东西,但内核从没变过,所以这里提供一个模板后面直接填空就行了。\n\n### 总结模板\n照此框架模板填空、润色 so easy\n\n- 开屏\n- 大纲\n- PPT1 标题:去年做的项目,内容:这个 XXX 多么牛逼,打败了 XXX,为公司创造 XXXX 的利润,提升 XXX 性能\n- PPT2 标题:去年做的项目,内容:这块可以这种统计下你写的服务QPS、接口日调用量多少,并发达到多少,这里要偏数字化,数字可以清晰表达你要说的东西。\n- PPT3 总结去年一年,这里主题就是学到了什么,自身提升,产出多少,团队协作,感谢领导,感谢同事,以后会XXX等等。\n- 新的一年工作规划。\n- 结束语\n\n\n\n### 案例\n\n一年以来,在单位领导的正确领导下,在直属 leader 和同事们的大力支持和帮助下,较好地履行了工作职责,完成了本职工作任务。现将一年来的工作情况作以总结。 \n\n第一,代码能力得到了锻炼,严格要求自身,对产出的代码高标准、严要求,在 Bug 率比去年同期水平降低 20%,交付时间也降低了 15%。\n\n第二,业务水平实现了增长,业务能力在领导的得力指挥下,在测试同事的积极反馈下、在产品同事的大力支持下,公司产品的业绩得到了显著增长,超过同行业标准的 30%,客户满意度再上新台阶。\n\n第三,思想觉悟不断提高,认真落实领导需求,积极投入到公司业务当中,进一步提高思想觉悟,认真学习业务知识,积极接触新的技术,主动抽出时间,在原有 Java 的知识上,学习了 PHP、Python、Go 等语言。不断加强自身码性锻炼和知识修养,为公司在技术领域的发展添砖加瓦。\n\n第四,改正了自身存在的缺点,在公司要求码农要成为复合型人才的基调下,我所处的后端的领导班子提出“班要多加,觉要少睡”的工作精神,在前期我对此有些抵触情绪,也收到了一些批评,在后期经过领导的不断教育和财务部门善意的减少补贴,我认识到了自己的不足,努力向单位优秀员工学习,以部门为家,以公司为家。(这段酌情自己修改,你可别把这段都给整上去啊!!!)\n\n第五,新的一年规划...\n\n...\n\n\n### 总结\n核心思想就这么多,后面我会提供一个我常用的PPT模板,这个模板我几年前收藏的,PPT里有大佬微信。\n\n有需要的可以参考此模板来写。\n\n> 链接:https://pan.baidu.com/s/1K5HVliFHe7VK7oOs9nKgDg 提取码:jqfd \n\n## REF \n- 述职报告', '忙碌了一年,又到年底了,年底肯定少不了年终总结,那年终总结是个啥,大体就是回顾过去,展望未来,这是年终总结的使命、核心', 1, b'0', b'1', NULL, 0, 0, 'https://static-admin.madaoo.com/%E9%BB%98%E8%AE%A4%E6%96%87%E4%BB%B61612021467523.png', '年终总结又到啦', NULL, 18, NULL, '1234533425', 46, '1');
INSERT INTO `ar_article` VALUES ('1376560897463554048', 1617032667800, 1617032667800, 0, '很多时候写代码基本都是增删改查,只是业务逻辑不一样,写一年CRUD和写十年CRUD结果都是一样的,重要的是业务中应用不同的技术点才能更快的成长\n\n所以我们是不是可以直接根据实体类生成CRUD代码呢?这样可以很方便的解放我们的双手使我们更加专注业务。\n\n那么现在可以在IDEA插件市场里搜索 “crud” 即可看到这款插件 Generate Crud,安装好之后只需要创建一个实体类,并在实体类上右键点击第一个选项即可生成这么一套代码啦\n\n目前支持的功能有:\n- Controller REST API with Swagger DOC API\n- DAO(JpaRepository)\n- DTO\n- Service (with page query)\n- Mapper mapstruct\n- Mockito Junit5 Unit Test\n\n后续大家如果有好的建议可以联系我,共同改进这款插件\n\n\n\n[源码可以在我的GitHub中获取](https://github.com/GuoGuang/generate-crud-code)', '很多时候写代码基本都是增删改查,只是业务逻辑不一样,写一年CRUD和写十年CRUD结果都是一样的,重要的是业务中应用不同的技术点才能更快的成长', 4, b'0', NULL, NULL, 0, 0, 'https://static-admin.madaoo.com/Xnip2021-03-29_23-25-44.jpg', '分享一款IDEA插件', NULL, 17, NULL, '1234533425', 50, '1');
INSERT INTO `ar_article` VALUES ('1389201197596020736', 1616046350144, 1616046350144, 0, '\n软件项目中,需求是不断变化的,需求也是项目中最难把控的,需求的变更也是无法避免的。我们写的软件程序,如何能实现拥抱变化,使我们的软件达到可维护和可复用,这是一代代软件工程师不断追寻的真理。\n\n#### 导致一个软件的可维护性较低的原因有四个:\n\n1. 过于僵硬(Rigidity):比如在系统中新增一个功能,会变得非常复杂,涉及到很多模块的调整,这就是系统僵硬的体现。\n2. 过于脆弱(Fragility):比如对程序中某一个地方的修改,导致看上去没有什么关系的其他地方产生了影响,修改的同时,没有人能预测改动会给系统带来什么风险。\n3. 复用率低(Immobility):比如想使用程序中已有的一段代码、函数、模块时,这些已有的代码总是依赖一大堆其它的东西,很难将它们独立出来使用。\n4. 黏度过高(Viscosity):如果一个系统设计,不能简单的复用一个类或者通过接口来实现扩展,想扩展一个系统功能,必须破坏原始架构,就是黏度过高。\n\n#### 一个好的系统设计应该有如下的性质:\n1. 可扩展性(Extensibility):可以很容易的在系统中加入一个新的功能。\n2. 灵活性(Flexibility):可以很容易的实现对某个代码的修改,而不担心对其他模块产生影响。\n3. 可插入性(Pluggability):可以很容易的将一个类抽出去复用,或者将另一个有同样功能的接口的类加入到系统里。\n常用的面向对象设计原则有6个,这6大设计原则都是以可维护性和可复用性为基础的,这些原则并不是孤立存在的,它们相互依赖相互补充,遵循这些设计原则可以有效地提高系统的复用性,同时提高系统的可维护性。\n\n\n\n\n1. OCP(开闭原则,Open-Closed Principle);\n> 一个软件实体 如类,模块和函数应该对扩展开放,对修改关闭;\n\n2. DIP(依赖倒置原则,Dependence Inversion Principle);\n> 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。 即针对接口编程,不要针对实现编程.\n\n3. LoD/LKP(迪米特法则,Law of Demeter / Least Knowledge Principle);\n> 又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用,通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少. 低耦合,高内聚\n\n4. CARP (组合/聚合复用原则,Composition/Aggregation Reuse Principle);\n> 尽量使用组合和聚合少使用继承的关系来达到复用的原则.\n\n5. ISP (接口隔离原则,Interface Segregation Principle);\n> 建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少.\n\n6. LSP (里氏替换原则,Liskov Substitution Principle);\n> 子类可以扩展父类的功能,但不能改变父类原有的功能\n\n7. SRP (单一职责原则,Single Responsibility Principle);\n> 一个类负责一项职责.\n', '\n软件项目中,需求是不断变化的,需求也是项目中最难把控的,需求的变更也是无法避免的。我们写的软件程序,如何能实现拥抱变化,使我们的软件达到可维护和可复用,这是一代代软件工程师不断追寻的真理。', 4, b'0', NULL, NULL, 2, 0, 'https://static-admin.madaoo.com/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%AE%BE%E8%AE%A1%E7%9A%84%E4%B8%83%E5%A4%A7%E5%9F%BA%E6%9C%AC%E5%8E%9F%E5%88%99%20%281%29.png', '面向对象设计的七大基本原则', NULL, 11, NULL, '1234533425', 52, '1');
-- ----------------------------
-- Table structure for ar_article_tag
-- ----------------------------
DROP TABLE IF EXISTS `ar_article_tag`;
CREATE TABLE `ar_article_tag` (
`id` varchar(40) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`article_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`tag_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `article_id`(`article_id`) USING BTREE,
INDEX `tag_id`(`tag_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf16 COLLATE = utf16_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of ar_article_tag
-- ----------------------------
INSERT INTO `ar_article_tag` VALUES ('1294974131510579200', '1238640274759094272', '5');
INSERT INTO `ar_article_tag` VALUES ('1294974131628019712', '1254031401452441600', '5');
INSERT INTO `ar_article_tag` VALUES ('1294974131728683008', '1256240408762126336', '1');
INSERT INTO `ar_article_tag` VALUES ('1294974131833540608', '1257548347275874304', '5');
INSERT INTO `ar_article_tag` VALUES ('1294974131934203904', '1262724998418796544', '4');
INSERT INTO `ar_article_tag` VALUES ('1294974132039061504', '1263480522076721152', '6');
INSERT INTO `ar_article_tag` VALUES ('1294974132143919104', '1264436933417897984', '4');
INSERT INTO `ar_article_tag` VALUES ('1294974132374605824', '1279588510763978752', '5');
INSERT INTO `ar_article_tag` VALUES ('1294974132475269120', '1281931346926768128', '1');
INSERT INTO `ar_article_tag` VALUES ('1294974132580126720', '1281943476912656384', '4');
INSERT INTO `ar_article_tag` VALUES ('1295034860154523648', '1271825246982377472', '1294911576750559232');
INSERT INTO `ar_article_tag` VALUES ('1295034860154523649', '1271825246982377472', '1294907297465765888');
INSERT INTO `ar_article_tag` VALUES ('1295034860158717952', '1271825246982377472', '1294907445914767360');
INSERT INTO `ar_article_tag` VALUES ('1295034860158717953', '1271825246982377472', '1294907097007394816');
INSERT INTO `ar_article_tag` VALUES ('1295034860158717954', '1271825246982377472', '1294906899224989696');
INSERT INTO `ar_article_tag` VALUES ('1295034860158717955', '1271825246982377472', '1');
INSERT INTO `ar_article_tag` VALUES ('1295034860158717956', '1271825246982377472', '2');
INSERT INTO `ar_article_tag` VALUES ('1295365500834025472', '1290323417089478712', '5');
INSERT INTO `ar_article_tag` VALUES ('1295365500909522944', '1290323417089478712', '1');
INSERT INTO `ar_article_tag` VALUES ('1295365500913717248', '1290323417089478712', '1294907097007394816');
INSERT INTO `ar_article_tag` VALUES ('1303501177492738048', '1280520740491366400', '1');
INSERT INTO `ar_article_tag` VALUES ('1303501177677287424', '1280520740491366400', '5');
INSERT INTO `ar_article_tag` VALUES ('1303511488262180864', '1303501704297320448', '1');
INSERT INTO `ar_article_tag` VALUES ('1303511488262180865', '1303501704297320448', '5');
INSERT INTO `ar_article_tag` VALUES ('1308425784448389120', '1308425784444194816', '1');
INSERT INTO `ar_article_tag` VALUES ('1308425784448389121', '1308425784444194816', '5');
INSERT INTO `ar_article_tag` VALUES ('1309899211629793280', '1309499624968556544', '4');
INSERT INTO `ar_article_tag` VALUES ('1309899211629793281', '1309499624968556544', '5');
INSERT INTO `ar_article_tag` VALUES ('1315161119077306368', '1315161119073112064', '1');
INSERT INTO `ar_article_tag` VALUES ('1315161119077306369', '1315161119073112064', '5');
INSERT INTO `ar_article_tag` VALUES ('1315161119077306370', '1315161119073112064', '1294907097007394816');
INSERT INTO `ar_article_tag` VALUES ('1319289214826844160', '1314949482479226880', '1');
INSERT INTO `ar_article_tag` VALUES ('1319289214826844161', '1314949482479226880', '5');
INSERT INTO `ar_article_tag` VALUES ('1349217660403060736', '1329777365315883008', '5');
INSERT INTO `ar_article_tag` VALUES ('1349217660516306944', '1329777365315883008', '1');
INSERT INTO `ar_article_tag` VALUES ('1349217733807575040', '1326913120844779520', '1');
INSERT INTO `ar_article_tag` VALUES ('1349217733807575041', '1326913120844779520', '5');
INSERT INTO `ar_article_tag` VALUES ('1349217771958964224', '1322178386327638016', '1');
INSERT INTO `ar_article_tag` VALUES ('1349217771958964225', '1322178386327638016', '5');
INSERT INTO `ar_article_tag` VALUES ('1349217771958964226', '1322178386327638016', '4');
INSERT INTO `ar_article_tag` VALUES ('1354083716279963649', '1354083716279963648', '1294906899224989696');
INSERT INTO `ar_article_tag` VALUES ('1354084195907014657', '1354084195907014656', '1294906899224989696');
INSERT INTO `ar_article_tag` VALUES ('1354084864269357056', '1354084864265162752', '1294906899224989696');
INSERT INTO `ar_article_tag` VALUES ('1354085425513369601', '1354085425513369600', '1294906899224989696');
INSERT INTO `ar_article_tag` VALUES ('1354085879345451009', '1354085879345451008', '1294906899224989696');
INSERT INTO `ar_article_tag` VALUES ('1354086481328738305', '1354086481328738304', '1294906899224989696');
INSERT INTO `ar_article_tag` VALUES ('1354088407629959168', '1354088407625764864', '1294906899224989696');
INSERT INTO `ar_article_tag` VALUES ('1354089006152945665', '1354089006152945664', '1294906899224989696');
INSERT INTO `ar_article_tag` VALUES ('1359892937940537344', '1355543846427168768', '1');
INSERT INTO `ar_article_tag` VALUES ('1367385796897804288', '1354093378479984640', '1294906899224989696');
INSERT INTO `ar_article_tag` VALUES ('1376560897526468608', '1376560897463554048', '1');
INSERT INTO `ar_article_tag` VALUES ('1389201197805735936', '1389201197596020736', '1');
INSERT INTO `ar_article_tag` VALUES ('1389205160378634240', '1389205160210862080', '');
-- ----------------------------
-- Table structure for ar_category
-- ----------------------------
DROP TABLE IF EXISTS `ar_category`;
CREATE TABLE `ar_category` (
`id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`create_at` bigint(20) NULL DEFAULT NULL,
`update_at` bigint(20) NULL DEFAULT NULL,
`name` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`parent_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`state` int(11) NULL DEFAULT NULL,
`summary` varchar(200) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`user_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `categories_name`(`name`) USING BTREE,
INDEX `categories_parent_id`(`parent_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf16 COLLATE = utf16_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of ar_category
-- ----------------------------
INSERT INTO `ar_category` VALUES ('1', 1583380077, 1583380077, '技术', '0', 1, '技术', NULL);
INSERT INTO `ar_category` VALUES ('3', 1588003346277, 1588003346277, '安全', '0', 1, '安全', NULL);
INSERT INTO `ar_category` VALUES ('4', 1588003346277, 1588003346277, '福利', '0', 1, '福利', NULL);
-- ----------------------------
-- Table structure for ar_comment
-- ----------------------------
DROP TABLE IF EXISTS `ar_comment`;
CREATE TABLE `ar_comment` (
`id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`user_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`parent_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`article_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`content` varchar(3000) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`upvote` int(11) NULL DEFAULT NULL,
`avatar` varchar(2000) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`user_name` varchar(300) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`to_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`to_avatar` varchar(2000) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`to_name` varchar(300) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`create_at` bigint(20) NOT NULL,
`update_at` bigint(20) NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `comments_article_id`(`article_id`) USING BTREE,
INDEX `comments_parent_id`(`parent_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf16 COLLATE = utf16_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of ar_comment
-- ----------------------------
-- ----------------------------
-- Table structure for ar_tag
-- ----------------------------
DROP TABLE IF EXISTS `ar_tag`;
CREATE TABLE `ar_tag` (
`id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`create_at` bigint(20) NULL DEFAULT NULL,
`update_at` bigint(20) NULL DEFAULT NULL,
`color` varchar(30) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`description` varchar(200) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`icon` varchar(50) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`name` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`slug` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`state` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `tag_name`(`name`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf16 COLLATE = utf16_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of ar_tag
-- ----------------------------
INSERT INTO `ar_tag` VALUES ('1', 1583380077, 1597564663358, 'rgba(144, 238, 144, ', 'Java', '0', 'Java', 'Java', 1);
INSERT INTO `ar_tag` VALUES ('1294906899224989696', 1597564837638, 1597564837638, 'rgba(61, 196, 61, 1)', 'Lua', '1', 'Lua', 'Lua', 1);
INSERT INTO `ar_tag` VALUES ('1294907097007394816', 1597564884793, 1597564884793, 'rgba(31, 147, 255, 0.73)', 'share', '1', '分享', 'share', 1);
INSERT INTO `ar_tag` VALUES ('1294907297465765888', 1597564932587, 1597564932587, 'rgba(255, 69, 0, 1)', 'spider', '1', '爬虫', 'spider', 1);
INSERT INTO `ar_tag` VALUES ('1294907445914767360', 1597564967979, 1600788095111, 'rgba(255, 69, 0, 0.68)', 'AI', '1', 'AI', 'AI', 1);
INSERT INTO `ar_tag` VALUES ('1294911576750559232', 1597565952843, 1600788108962, 'rgba(255, 215, 0, 1)', '2019', '0', '2019', '2019', 1);
INSERT INTO `ar_tag` VALUES ('2', 1583380077, 1583380077, '#ffbb50', 'LeetCode', 'aa', 'LeetCode', 'LeetCode', 1);
INSERT INTO `ar_tag` VALUES ('3', 1583380077, 1583380077, '#1ac756', 'Python', 'aa', 'Python', 'Python', 1);
INSERT INTO `ar_tag` VALUES ('4', 1583380077, 1583380077, '#19B5FE', 'Hack', 'aa', 'Hack', 'Hack', 1);
INSERT INTO `ar_tag` VALUES ('5', 1583380077, 1583380077, '#b1a8a8', '2020', 'aa', '2020', '2020', 1);
INSERT INTO `ar_tag` VALUES ('6', 1583380077, 1597564698763, 'rgba(144, 238, 144, 1)', 'Docker', '0', 'Docker', 'Docker', 1);
-- ----------------------------
-- Table structure for ba_dict
-- ----------------------------
DROP TABLE IF EXISTS `ba_dict`;
CREATE TABLE `ba_dict` (
`id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '树形字典',
`parent_id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '父节点ID',
`code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '编码',
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名称',
`description` varchar(1000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '描述',
`state` int(2) NULL DEFAULT NULL COMMENT '状态',
`type` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '类型',
`create_at` bigint(20) NULL DEFAULT NULL COMMENT '创建时间',
`update_at` bigint(20) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `dict_code`(`code`) USING BTREE,
INDEX `dict_parent_id`(`parent_id`) USING BTREE,
INDEX `dict_create_at`(`create_at`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '基础板块/字典管理' ROW_FORMAT = COMPACT;
-- ----------------------------
-- Records of ba_dict
-- ----------------------------
INSERT INTO `ba_dict` VALUES ('1133978689470599168', '1133978877252415931', '11', '北京市', '省市', 1, 'city', 1559196607257, 1559196607257);
INSERT INTO `ba_dict` VALUES ('1133978689890029568', '1133978689470599168', '110101', '东城区', '省市', 1, 'city', 1559196607361, 1559196607362);
INSERT INTO `ba_dict` VALUES ('1133978690313654272', '1133978689470599168', '110102', '西城区', '省市', 1, 'city', 1559196607431, 1559196607431);
INSERT INTO `ba_dict` VALUES ('1133978690737278976', '1133978689470599168', '110105', '朝阳区', '省市', 1, 'city', 1559196607500, 1559196607500);
INSERT INTO `ba_dict` VALUES ('1133978691156709376', '1133978689470599168', '110106', '丰台区', '省市', 1, 'city', 1559196607571, 1559196607571);
INSERT INTO `ba_dict` VALUES ('1133978691580334080', '1133978689470599168', '110107', '石景山区', '省市', 1, 'city', 1559196607642, 1559196607642);
INSERT INTO `ba_dict` VALUES ('1133978692003958784', '1133978689470599168', '110108', '海淀区', '省市', 1, 'city', 1559196607712, 1559196607712);
INSERT INTO `ba_dict` VALUES ('1133978692423389184', '1133978689470599168', '110109', '门头沟区', '省市', 1, 'city', 1559196607782, 1559196607782);
INSERT INTO `ba_dict` VALUES ('1133978692842819584', '1133978689470599168', '110111', '房山区', '省市', 1, 'city', 1559196607852, 1559196607852);
INSERT INTO `ba_dict` VALUES ('1133978693262249984', '1133978689470599168', '110112', '通州区', '省市', 1, 'city', 1559196607922, 1559196607922);
INSERT INTO `ba_dict` VALUES ('1133978693681680384', '1133978689470599168', '110113', '顺义区', '省市', 1, 'city', 1559196607993, 1559196607993);
INSERT INTO `ba_dict` VALUES ('1133978694105305088', '1133978689470599168', '110114', '昌平区', '省市', 1, 'city', 1559196608063, 1559196608063);
INSERT INTO `ba_dict` VALUES ('1133978694528929792', '1133978689470599168', '110115', '大兴区', '省市', 1, 'city', 1559196608133, 1559196608133);
INSERT INTO `ba_dict` VALUES ('1133978694948360192', '1133978689470599168', '110116', '怀柔区', '省市', 1, 'city', 1559196608202, 1559196608202);
INSERT INTO `ba_dict` VALUES ('1133978695371984896', '1133978689470599168', '110117', '平谷区', '省市', 1, 'city', 1559196608280, 1559196608280);
INSERT INTO `ba_dict` VALUES ('1133978695791415296', '1133978689470599168', '110118', '密云区', '省市', 1, 'city', 1559196608351, 1559196608351);
INSERT INTO `ba_dict` VALUES ('1133978696215040000', '1133978689470599168', '110119', '延庆区', '省市', 1, 'city', 1559196608446, 1559196608446);
INSERT INTO `ba_dict` VALUES ('1133978696215040001', '1133978877252415931', '12', '天津市', '省市', 1, 'city', 1559196608549, 1559196608549);
INSERT INTO `ba_dict` VALUES ('1133978696634470400', '1133978696215040001', '120101', '和平区', '省市', 1, 'city', 1559196608747, 1559196608747);
INSERT INTO `ba_dict` VALUES ('1133978697053900800', '1133978696215040001', '120102', '河东区', '省市', 1, 'city', 1559196608976, 1559196608976);
INSERT INTO `ba_dict` VALUES ('1133978697473331200', '1133978696215040001', '120103', '河西区', '省市', 1, 'city', 1559196609047, 1559196609047);
INSERT INTO `ba_dict` VALUES ('1133978697896955904', '1133978696215040001', '120104', '南开区', '省市', 1, 'city', 1559196609118, 1559196609118);
INSERT INTO `ba_dict` VALUES ('1133978698316386304', '1133978696215040001', '120105', '河北区', '省市', 1, 'city', 1559196609186, 1559196609186);
INSERT INTO `ba_dict` VALUES ('1133978698740011008', '1133978696215040001', '120106', '红桥区', '省市', 1, 'city', 1559196609256, 1559196609256);
INSERT INTO `ba_dict` VALUES ('1133978699163635712', '1133978696215040001', '120110', '东丽区', '省市', 1, 'city', 1559196609325, 1559196609325);
INSERT INTO `ba_dict` VALUES ('1133978699583066112', '1133978696215040001', '120111', '西青区', '省市', 1, 'city', 1559196609395, 1559196609395);
INSERT INTO `ba_dict` VALUES ('1133978700006690816', '1133978696215040001', '120112', '津南区', '省市', 1, 'city', 1559196609464, 1559196609464);
INSERT INTO `ba_dict` VALUES ('1133978700426121216', '1133978696215040001', '120113', '北辰区', '省市', 1, 'city', 1559196609534, 1559196609534);
INSERT INTO `ba_dict` VALUES ('1133978700849745920', '1133978696215040001', '120114', '武清区', '省市', 1, 'city', 1559196609605, 1559196609605);
INSERT INTO `ba_dict` VALUES ('1133978701269176320', '1133978696215040001', '120115', '宝坻区', '省市', 1, 'city', 1559196609673, 1559196609673);
INSERT INTO `ba_dict` VALUES ('1133978701696995328', '1133978696215040001', '120116', '滨海新区', '省市', 1, 'city', 1559196609742, 1559196609742);
INSERT INTO `ba_dict` VALUES ('1133978702120620032', '1133978696215040001', '120117', '宁河区', '省市', 1, 'city', 1559196609812, 1559196609812);
INSERT INTO `ba_dict` VALUES ('1133978702540050432', '1133978696215040001', '120118', '静海区', '省市', 1, 'city', 1559196609881, 1559196609881);
INSERT INTO `ba_dict` VALUES ('1133978702963675136', '1133978696215040001', '120119', '蓟州区', '省市', 1, 'city', 1559196609950, 1559196609950);
INSERT INTO `ba_dict` VALUES ('1133978702963675137', '1133978877252415931', '13', '河北省', '省市', 1, 'city', 1559196610020, 1559196610020);
INSERT INTO `ba_dict` VALUES ('1133978703383105536', '1133978702963675137', '1301', '石家庄市', '省市', 1, 'city', 1559196610091, 1559196610091);
INSERT INTO `ba_dict` VALUES ('1133978703802535936', '1133978702963675137', '1302', '唐山市', '省市', 1, 'city', 1559196610160, 1559196610160);
INSERT INTO `ba_dict` VALUES ('1133978704226160640', '1133978702963675137', '1303', '秦皇岛市', '省市', 1, 'city', 1559196610229, 1559196610229);
INSERT INTO `ba_dict` VALUES ('1133978704645591040', '1133978702963675137', '1304', '邯郸市', '省市', 1, 'city', 1559196610299, 1559196610299);
INSERT INTO `ba_dict` VALUES ('1133978705065021440', '1133978702963675137', '1305', '邢台市', '省市', 1, 'city', 1559196610375, 1559196610375);
INSERT INTO `ba_dict` VALUES ('1133978705488646144', '1133978702963675137', '1306', '保定市', '省市', 1, 'city', 1559196610444, 1559196610444);
INSERT INTO `ba_dict` VALUES ('1133978705912270848', '1133978702963675137', '1307', '张家口市', '省市', 1, 'city', 1559196610514, 1559196610514);
INSERT INTO `ba_dict` VALUES ('1133978706331701248', '1133978702963675137', '1308', '承德市', '省市', 1, 'city', 1559196610583, 1559196610583);
INSERT INTO `ba_dict` VALUES ('1133978706755325952', '1133978702963675137', '1309', '沧州市', '省市', 1, 'city', 1559196610652, 1559196610652);
INSERT INTO `ba_dict` VALUES ('1133978707174756352', '1133978702963675137', '1310', '廊坊市', '省市', 1, 'city', 1559196610721, 1559196610721);
INSERT INTO `ba_dict` VALUES ('1133978707598381056', '1133978702963675137', '1311', '衡水市', '省市', 1, 'city', 1559196610790, 1559196610790);
INSERT INTO `ba_dict` VALUES ('1133978707598381057', '1133978877252415931', '14', '山西省', '省市', 1, 'city', 1559196610860, 1559196610860);
INSERT INTO `ba_dict` VALUES ('1133978708022005760', '1133978707598381057', '1401', '太原市', '省市', 1, 'city', 1559196610931, 1559196610931);
INSERT INTO `ba_dict` VALUES ('1133978708441436160', '1133978707598381057', '1402', '大同市', '省市', 1, 'city', 1559196611002, 1559196611002);
INSERT INTO `ba_dict` VALUES ('1133978708865060864', '1133978707598381057', '1403', '阳泉市', '省市', 1, 'city', 1559196611073, 1559196611073);
INSERT INTO `ba_dict` VALUES ('1133978709284491264', '1133978707598381057', '1404', '长治市', '省市', 1, 'city', 1559196611143, 1559196611143);
INSERT INTO `ba_dict` VALUES ('1133978709703921664', '1133978707598381057', '1405', '晋城市', '省市', 1, 'city', 1559196611218, 1559196611218);
INSERT INTO `ba_dict` VALUES ('1133978710127546368', '1133978707598381057', '1406', '朔州市', '省市', 1, 'city', 1559196611292, 1559196611292);
INSERT INTO `ba_dict` VALUES ('1133978710551171072', '1133978707598381057', '1407', '晋中市', '省市', 1, 'city', 1559196611362, 1559196611362);
INSERT INTO `ba_dict` VALUES ('1133978710974795776', '1133978707598381057', '1408', '运城市', '省市', 1, 'city', 1559196611432, 1559196611432);
INSERT INTO `ba_dict` VALUES ('1133978711394226176', '1133978707598381057', '1409', '忻州市', '省市', 1, 'city', 1559196611505, 1559196611505);
INSERT INTO `ba_dict` VALUES ('1133978711817850880', '1133978707598381057', '1410', '临汾市', '省市', 1, 'city', 1559196611575, 1559196611575);
INSERT INTO `ba_dict` VALUES ('1133978712237281280', '1133978707598381057', '1411', '吕梁市', '省市', 1, 'city', 1559196611644, 1559196611644);
INSERT INTO `ba_dict` VALUES ('1133978712237281281', '1133978877252415931', '15', '内蒙古自治区', '省市', 1, 'city', 1559196611717, 1559196611717);
INSERT INTO `ba_dict` VALUES ('1133978712656711680', '1133978712237281281', '1501', '呼和浩特市', '省市', 1, 'city', 1559196611800, 1559196611800);
INSERT INTO `ba_dict` VALUES ('1133978713080336384', '1133978712237281281', '1502', '包头市', '省市', 1, 'city', 1559196611871, 1559196611871);
INSERT INTO `ba_dict` VALUES ('1133978713503961088', '1133978712237281281', '1503', '乌海市', '省市', 1, 'city', 1559196611941, 1559196611941);
INSERT INTO `ba_dict` VALUES ('1133978713923391488', '1133978712237281281', '1504', '赤峰市', '省市', 1, 'city', 1559196612035, 1559196612035);
INSERT INTO `ba_dict` VALUES ('1133978714342821888', '1133978712237281281', '1505', '通辽市', '省市', 1, 'city', 1559196612132, 1559196612132);
INSERT INTO `ba_dict` VALUES ('1133978714766446592', '1133978712237281281', '1506', '鄂尔多斯市', '省市', 1, 'city', 1559196612212, 1559196612212);
INSERT INTO `ba_dict` VALUES ('1133978715185876992', '1133978712237281281', '1507', '呼伦贝尔市', '省市', 1, 'city', 1559196612282, 1559196612282);
INSERT INTO `ba_dict` VALUES ('1133978715609501696', '1133978712237281281', '1508', '巴彦淖尔市', '省市', 1, 'city', 1559196612352, 1559196612352);
INSERT INTO `ba_dict` VALUES ('1133978716033126400', '1133978712237281281', '1509', '乌兰察布市', '省市', 1, 'city', 1559196612426, 1559196612426);
INSERT INTO `ba_dict` VALUES ('1133978716456751104', '1133978712237281281', '1522', '兴安盟', '省市', 1, 'city', 1559196612492, 1559196612492);
INSERT INTO `ba_dict` VALUES ('1133978716880375808', '1133978712237281281', '1525', '锡林郭勒盟', '省市', 1, 'city', 1559196612561, 1559196612561);
INSERT INTO `ba_dict` VALUES ('1133978717304000512', '1133978712237281281', '1529', '阿拉善盟', '省市', 1, 'city', 1559196612631, 1559196612631);
INSERT INTO `ba_dict` VALUES ('1133978717304000513', '1133978877252415931', '21', '辽宁省', '省市', 1, 'city', 1559196612708, 1559196612708);
INSERT INTO `ba_dict` VALUES ('1133978717727625216', '1133978717304000513', '2101', '沈阳市', '省市', 1, 'city', 1559196612804, 1559196612804);
INSERT INTO `ba_dict` VALUES ('1133978718147055616', '1133978717304000513', '2102', '大连市', '省市', 1, 'city', 1559196612892, 1559196612892);
INSERT INTO `ba_dict` VALUES ('1133978718570680320', '1133978717304000513', '2103', '鞍山市', '省市', 1, 'city', 1559196612960, 1559196612960);
INSERT INTO `ba_dict` VALUES ('1133978718990110720', '1133978717304000513', '2104', '抚顺市', '省市', 1, 'city', 1559196613030, 1559196613030);
INSERT INTO `ba_dict` VALUES ('1133978719413735424', '1133978717304000513', '2105', '本溪市', '省市', 1, 'city', 1559196613099, 1559196613099);
INSERT INTO `ba_dict` VALUES ('1133978719833165824', '1133978717304000513', '2106', '丹东市', '省市', 1, 'city', 1559196613195, 1559196613195);
INSERT INTO `ba_dict` VALUES ('1133978720260984832', '1133978717304000513', '2107', '锦州市', '省市', 1, 'city', 1559196613264, 1559196613264);
INSERT INTO `ba_dict` VALUES ('1133978720680415232', '1133978717304000513', '2108', '营口市', '省市', 1, 'city', 1559196613335, 1559196613335);
INSERT INTO `ba_dict` VALUES ('1133978721099845632', '1133978717304000513', '2109', '阜新市', '省市', 1, 'city', 1559196613406, 1559196613406);
INSERT INTO `ba_dict` VALUES ('1133978721523470336', '1133978717304000513', '2110', '辽阳市', '省市', 1, 'city', 1559196613475, 1559196613475);
INSERT INTO `ba_dict` VALUES ('1133978721942900736', '1133978717304000513', '2111', '盘锦市', '省市', 1, 'city', 1559196613545, 1559196613545);
INSERT INTO `ba_dict` VALUES ('1133978722366525440', '1133978717304000513', '2112', '铁岭市', '省市', 1, 'city', 1559196613619, 1559196613619);
INSERT INTO `ba_dict` VALUES ('1133978722790150144', '1133978717304000513', '2113', '朝阳市', '省市', 1, 'city', 1559196613694, 1559196613694);
INSERT INTO `ba_dict` VALUES ('1133978723209580544', '1133978717304000513', '2114', '葫芦岛市', '省市', 1, 'city', 1559196613764, 1559196613764);
INSERT INTO `ba_dict` VALUES ('1133978723209580545', '1133978877252415931', '22', '吉林省', '省市', 1, 'city', 1559196613833, 1559196613833);
INSERT INTO `ba_dict` VALUES ('1133978723633205248', '1133978723209580545', '2201', '长春市', '省市', 1, 'city', 1559196613903, 1559196613903);
INSERT INTO `ba_dict` VALUES ('1133978724056829952', '1133978723209580545', '2202', '吉林市', '省市', 1, 'city', 1559196613979, 1559196613979);
INSERT INTO `ba_dict` VALUES ('1133978724476260352', '1133978723209580545', '2203', '四平市', '省市', 1, 'city', 1559196614048, 1559196614048);
INSERT INTO `ba_dict` VALUES ('1133978724895690752', '1133978723209580545', '2204', '辽源市', '省市', 1, 'city', 1559196614117, 1559196614117);
INSERT INTO `ba_dict` VALUES ('1133978725319315456', '1133978723209580545', '2205', '通化市', '省市', 1, 'city', 1559196614186, 1559196614186);
INSERT INTO `ba_dict` VALUES ('1133978725742940160', '1133978723209580545', '2206', '白山市', '省市', 1, 'city', 1559196614260, 1559196614260);
INSERT INTO `ba_dict` VALUES ('1133978726166564864', '1133978723209580545', '2207', '松原市', '省市', 1, 'city', 1559196614329, 1559196614330);
INSERT INTO `ba_dict` VALUES ('1133978726590189568', '1133978723209580545', '2208', '白城市', '省市', 1, 'city', 1559196614407, 1559196614407);
INSERT INTO `ba_dict` VALUES ('1133978727009619968', '1133978723209580545', '2224', '延边朝鲜族自治州', '省市', 1, 'city', 1559196614493, 1559196614493);
INSERT INTO `ba_dict` VALUES ('1133978727009619969', '1133978877252415931', '23', '黑龙江省', '省市', 1, 'city', 1559196614564, 1559196614564);
INSERT INTO `ba_dict` VALUES ('1133978727433244672', '1133978727009619969', '2301', '哈尔滨市', '省市', 1, 'city', 1559196614632, 1559196614632);
INSERT INTO `ba_dict` VALUES ('1133978727852675072', '1133978727009619969', '2302', '齐齐哈尔市', '省市', 1, 'city', 1559196614700, 1559196614700);
INSERT INTO `ba_dict` VALUES ('1133978728276299776', '1133978727009619969', '2303', '鸡西市', '省市', 1, 'city', 1559196614769, 1559196614769);
INSERT INTO `ba_dict` VALUES ('1133978728699924480', '1133978727009619969', '2304', '鹤岗市', '省市', 1, 'city', 1559196614837, 1559196614837);
INSERT INTO `ba_dict` VALUES ('1133978729119354880', '1133978727009619969', '2305', '双鸭山市', '省市', 1, 'city', 1559196614906, 1559196614906);
INSERT INTO `ba_dict` VALUES ('1133978729542979584', '1133978727009619969', '2306', '大庆市', '省市', 1, 'city', 1559196614977, 1559196614977);
INSERT INTO `ba_dict` VALUES ('1133978729962409984', '1133978727009619969', '2307', '伊春市', '省市', 1, 'city', 1559196615049, 1559196615049);
INSERT INTO `ba_dict` VALUES ('1133978730381840384', '1133978727009619969', '2308', '佳木斯市', '省市', 1, 'city', 1559196615123, 1559196615123);
INSERT INTO `ba_dict` VALUES ('1133978730801270784', '1133978727009619969', '2309', '七台河市', '省市', 1, 'city', 1559196615193, 1559196615193);
INSERT INTO `ba_dict` VALUES ('1133978731224895488', '1133978727009619969', '2310', '牡丹江市', '省市', 1, 'city', 1559196615263, 1559196615264);
INSERT INTO `ba_dict` VALUES ('1133978731644325888', '1133978727009619969', '2311', '黑河市', '省市', 1, 'city', 1559196615333, 1559196615333);
INSERT INTO `ba_dict` VALUES ('1133978732067950592', '1133978727009619969', '2312', '绥化市', '省市', 1, 'city', 1559196615404, 1559196615404);
INSERT INTO `ba_dict` VALUES ('1133978732487380992', '1133978727009619969', '2327', '大兴安岭地区', '省市', 1, 'city', 1559196615475, 1559196615475);
INSERT INTO `ba_dict` VALUES ('1133978732487380993', '1133978877252415931', '31', '上海市', '省市', 1, 'city', 1559196615546, 1559196615546);
INSERT INTO `ba_dict` VALUES ('1133978732915200000', '1133978732487380993', '310101', '黄浦区', '省市', 1, 'city', 1559196615619, 1559196615619);
INSERT INTO `ba_dict` VALUES ('1133978733334630400', '1133978732487380993', '310104', '徐汇区', '省市', 1, 'city', 1559196615687, 1559196615687);
INSERT INTO `ba_dict` VALUES ('1133978733758255104', '1133978732487380993', '310105', '长宁区', '省市', 1, 'city', 1559196615755, 1559196615755);
INSERT INTO `ba_dict` VALUES ('1133978734177685504', '1133978732487380993', '310106', '静安区', '省市', 1, 'city', 1559196615824, 1559196615824);
INSERT INTO `ba_dict` VALUES ('1133978734597115904', '1133978732487380993', '310107', '普陀区', '省市', 1, 'city', 1559196615892, 1559196615892);
INSERT INTO `ba_dict` VALUES ('1133978735020740608', '1133978732487380993', '310109', '虹口区', '省市', 1, 'city', 1559196615963, 1559196615963);
INSERT INTO `ba_dict` VALUES ('1133978735440171008', '1133978732487380993', '310110', '杨浦区', '省市', 1, 'city', 1559196616031, 1559196616031);
INSERT INTO `ba_dict` VALUES ('1133978735863795712', '1133978732487380993', '310112', '闵行区', '省市', 1, 'city', 1559196616101, 1559196616101);
INSERT INTO `ba_dict` VALUES ('1133978736283226112', '1133978732487380993', '310113', '宝山区', '省市', 1, 'city', 1559196616171, 1559196616171);
INSERT INTO `ba_dict` VALUES ('1133978736706850816', '1133978732487380993', '310114', '嘉定区', '省市', 1, 'city', 1559196616270, 1559196616270);
INSERT INTO `ba_dict` VALUES ('1133978737126281216', '1133978732487380993', '310115', '浦东新区', '省市', 1, 'city', 1559196616374, 1559196616374);
INSERT INTO `ba_dict` VALUES ('1133978737545711616', '1133978732487380993', '310116', '金山区', '省市', 1, 'city', 1559196616476, 1559196616476);
INSERT INTO `ba_dict` VALUES ('1133978737969336320', '1133978732487380993', '310117', '松江区', '省市', 1, 'city', 1559196616607, 1559196616607);
INSERT INTO `ba_dict` VALUES ('1133978738392961024', '1133978732487380993', '310118', '青浦区', '省市', 1, 'city', 1559196616736, 1559196616736);
INSERT INTO `ba_dict` VALUES ('1133978738812391424', '1133978732487380993', '310120', '奉贤区', '省市', 1, 'city', 1559196616850, 1559196616850);
INSERT INTO `ba_dict` VALUES ('1133978739236016128', '1133978732487380993', '310151', '崇明区', '省市', 1, 'city', 1559196616984, 1559196616984);
INSERT INTO `ba_dict` VALUES ('1133978739236016129', '1133978877252415931', '32', '江苏省', '省市', 1, 'city', 1559196617055, 1559196617055);
INSERT INTO `ba_dict` VALUES ('1133978739659640832', '1133978739236016129', '3201', '南京市', '省市', 1, 'city', 1559196617123, 1559196617123);
INSERT INTO `ba_dict` VALUES ('1133978740079071232', '1133978739236016129', '3202', '无锡市', '省市', 1, 'city', 1559196617193, 1559196617193);
INSERT INTO `ba_dict` VALUES ('1133978740498501632', '1133978739236016129', '3203', '徐州市', '省市', 1, 'city', 1559196617262, 1559196617262);
INSERT INTO `ba_dict` VALUES ('1133978740922126336', '1133978739236016129', '3204', '常州市', '省市', 1, 'city', 1559196617332, 1559196617332);
INSERT INTO `ba_dict` VALUES ('1133978741341556736', '1133978739236016129', '3205', '苏州市', '省市', 1, 'city', 1559196617447, 1559196617447);
INSERT INTO `ba_dict` VALUES ('1133978741769375744', '1133978739236016129', '3206', '南通市', '省市', 1, 'city', 1559196617524, 1559196617524);
INSERT INTO `ba_dict` VALUES ('1133978742188806144', '1133978739236016129', '3207', '连云港市', '省市', 1, 'city', 1559196617768, 1559196617768);
INSERT INTO `ba_dict` VALUES ('1133978742608236544', '1133978739236016129', '3208', '淮安市', '省市', 1, 'city', 1559196617913, 1559196617913);
INSERT INTO `ba_dict` VALUES ('1133978743031861248', '1133978739236016129', '3209', '盐城市', '省市', 1, 'city', 1559196618040, 1559196618040);
INSERT INTO `ba_dict` VALUES ('1133978743455485952', '1133978739236016129', '3210', '扬州市', '省市', 1, 'city', 1559196618169, 1559196618169);
INSERT INTO `ba_dict` VALUES ('1133978743879110656', '1133978739236016129', '3211', '镇江市', '省市', 1, 'city', 1559196618270, 1559196618270);
INSERT INTO `ba_dict` VALUES ('1133978744298541056', '1133978739236016129', '3212', '泰州市', '省市', 1, 'city', 1559196618410, 1559196618410);
INSERT INTO `ba_dict` VALUES ('1133978744722165760', '1133978739236016129', '3213', '宿迁市', '省市', 1, 'city', 1559196618509, 1559196618509);
INSERT INTO `ba_dict` VALUES ('1133978744722165761', '1133978877252415931', '33', '浙江省', '省市', 1, 'city', 1559196618611, 1559196618611);
INSERT INTO `ba_dict` VALUES ('1133978745141596160', '1133978744722165761', '3301', '杭州市', '省市', 1, 'city', 1559196618698, 1559196618698);
INSERT INTO `ba_dict` VALUES ('1133978745565220864', '1133978744722165761', '3302', '宁波市', '省市', 1, 'city', 1559196618767, 1559196618767);
INSERT INTO `ba_dict` VALUES ('1133978745984651264', '1133978744722165761', '3303', '温州市', '省市', 1, 'city', 1559196618836, 1559196618836);
INSERT INTO `ba_dict` VALUES ('1133978746404081664', '1133978744722165761', '3304', '嘉兴市', '省市', 1, 'city', 1559196618905, 1559196618905);
INSERT INTO `ba_dict` VALUES ('1133978746831900672', '1133978744722165761', '3305', '湖州市', '省市', 1, 'city', 1559196618975, 1559196618976);
INSERT INTO `ba_dict` VALUES ('1133978747251331072', '1133978744722165761', '3306', '绍兴市', '省市', 1, 'city', 1559196619064, 1559196619064);
INSERT INTO `ba_dict` VALUES ('1133978747674955776', '1133978744722165761', '3307', '金华市', '省市', 1, 'city', 1559196619166, 1559196619166);
INSERT INTO `ba_dict` VALUES ('1133978748094386176', '1133978744722165761', '3308', '衢州市', '省市', 1, 'city', 1559196619259, 1559196619259);
INSERT INTO `ba_dict` VALUES ('1133978748513816576', '1133978744722165761', '3309', '舟山市', '省市', 1, 'city', 1559196619362, 1559196619363);
INSERT INTO `ba_dict` VALUES ('1133978748937441280', '1133978744722165761', '3310', '台州市', '省市', 1, 'city', 1559196619449, 1559196619449);
INSERT INTO `ba_dict` VALUES ('1133978749356871680', '1133978744722165761', '3311', '丽水市', '省市', 1, 'city', 1559196619521, 1559196619521);
INSERT INTO `ba_dict` VALUES ('1133978749356871681', '1133978877252415931', '34', '安徽省', '省市', 1, 'city', 1559196619592, 1559196619592);
INSERT INTO `ba_dict` VALUES ('1133978749776302080', '1133978749356871681', '3401', '合肥市', '省市', 1, 'city', 1559196619663, 1559196619663);
INSERT INTO `ba_dict` VALUES ('1133978750199926784', '1133978749356871681', '3402', '芜湖市', '省市', 1, 'city', 1559196619765, 1559196619765);
INSERT INTO `ba_dict` VALUES ('1133978750623551488', '1133978749356871681', '3403', '蚌埠市', '省市', 1, 'city', 1559196619837, 1559196619837);
INSERT INTO `ba_dict` VALUES ('1133978751042981888', '1133978749356871681', '3404', '淮南市', '省市', 1, 'city', 1559196619906, 1559196619907);
INSERT INTO `ba_dict` VALUES ('1133978751462412288', '1133978749356871681', '3405', '马鞍山市', '省市', 1, 'city', 1559196619976, 1559196619976);
INSERT INTO `ba_dict` VALUES ('1133978751881842688', '1133978749356871681', '3406', '淮北市', '省市', 1, 'city', 1559196620044, 1559196620044);
INSERT INTO `ba_dict` VALUES ('1133978752305467392', '1133978749356871681', '3407', '铜陵市', '省市', 1, 'city', 1559196620113, 1559196620113);
INSERT INTO `ba_dict` VALUES ('1133978752724897792', '1133978749356871681', '3408', '安庆市', '省市', 1, 'city', 1559196620185, 1559196620185);
INSERT INTO `ba_dict` VALUES ('1133978753144328192', '1133978749356871681', '3410', '黄山市', '省市', 1, 'city', 1559196620254, 1559196620254);
INSERT INTO `ba_dict` VALUES ('1133978753567952896', '1133978749356871681', '3411', '滁州市', '省市', 1, 'city', 1559196620322, 1559196620322);
INSERT INTO `ba_dict` VALUES ('1133978753987383296', '1133978749356871681', '3412', '阜阳市', '省市', 1, 'city', 1559196620398, 1559196620398);
INSERT INTO `ba_dict` VALUES ('1133978754411008000', '1133978749356871681', '3413', '宿州市', '省市', 1, 'city', 1559196620466, 1559196620466);
INSERT INTO `ba_dict` VALUES ('1133978754830438400', '1133978749356871681', '3415', '六安市', '省市', 1, 'city', 1559196620536, 1559196620536);
INSERT INTO `ba_dict` VALUES ('1133978755254063104', '1133978749356871681', '3416', '亳州市', '省市', 1, 'city', 1559196620605, 1559196620605);
INSERT INTO `ba_dict` VALUES ('1133978755673493504', '1133978749356871681', '3417', '池州市', '省市', 1, 'city', 1559196620675, 1559196620675);
INSERT INTO `ba_dict` VALUES ('1133978756097118208', '1133978749356871681', '3418', '宣城市', '省市', 1, 'city', 1559196620744, 1559196620744);
INSERT INTO `ba_dict` VALUES ('1133978756097118209', '1133978877252415931', '35', '福建省', '省市', 1, 'city', 1559196620812, 1559196620812);
INSERT INTO `ba_dict` VALUES ('1133978756516548608', '1133978756097118209', '3501', '福州市', '省市', 1, 'city', 1559196620882, 1559196620882);
INSERT INTO `ba_dict` VALUES ('1133978756940173312', '1133978756097118209', '3502', '厦门市', '省市', 1, 'city', 1559196620953, 1559196620953);
INSERT INTO `ba_dict` VALUES ('1133978757363798016', '1133978756097118209', '3503', '莆田市', '省市', 1, 'city', 1559196621021, 1559196621021);
INSERT INTO `ba_dict` VALUES ('1133978757783228416', '1133978756097118209', '3504', '三明市', '省市', 1, 'city', 1559196621089, 1559196621089);
INSERT INTO `ba_dict` VALUES ('1133978758206853120', '1133978756097118209', '3505', '泉州市', '省市', 1, 'city', 1559196621158, 1559196621158);
INSERT INTO `ba_dict` VALUES ('1133978758630477824', '1133978756097118209', '3506', '漳州市', '省市', 1, 'city', 1559196621226, 1559196621226);
INSERT INTO `ba_dict` VALUES ('1133978759049908224', '1133978756097118209', '3507', '南平市', '省市', 1, 'city', 1559196621295, 1559196621295);
INSERT INTO `ba_dict` VALUES ('1133978759469338624', '1133978756097118209', '3508', '龙岩市', '省市', 1, 'city', 1559196621363, 1559196621363);
INSERT INTO `ba_dict` VALUES ('1133978759892963328', '1133978756097118209', '3509', '宁德市', '省市', 1, 'city', 1559196621433, 1559196621433);
INSERT INTO `ba_dict` VALUES ('1133978759892963329', '1133978877252415931', '36', '江西省', '省市', 1, 'city', 1559196621504, 1559196621504);
INSERT INTO `ba_dict` VALUES ('1133978760316588032', '1133978759892963329', '3601', '南昌市', '省市', 1, 'city', 1559196621572, 1559196621572);
INSERT INTO `ba_dict` VALUES ('1133978760736018432', '1133978759892963329', '3602', '景德镇市', '省市', 1, 'city', 1559196621640, 1559196621640);
INSERT INTO `ba_dict` VALUES ('1133978761159643136', '1133978759892963329', '3603', '萍乡市', '省市', 1, 'city', 1559196621710, 1559196621710);
INSERT INTO `ba_dict` VALUES ('1133978761579073536', '1133978759892963329', '3604', '九江市', '省市', 1, 'city', 1559196621779, 1559196621779);
INSERT INTO `ba_dict` VALUES ('1133978761998503936', '1133978759892963329', '3605', '新余市', '省市', 1, 'city', 1559196621848, 1559196621848);
INSERT INTO `ba_dict` VALUES ('1133978762422128640', '1133978759892963329', '3606', '鹰潭市', '省市', 1, 'city', 1559196621917, 1559196621917);
INSERT INTO `ba_dict` VALUES ('1133978762845753344', '1133978759892963329', '3607', '赣州市', '省市', 1, 'city', 1559196621988, 1559196621988);
INSERT INTO `ba_dict` VALUES ('1133978763269378048', '1133978759892963329', '3608', '吉安市', '省市', 1, 'city', 1559196622058, 1559196622058);
INSERT INTO `ba_dict` VALUES ('1133978763688808448', '1133978759892963329', '3609', '宜春市', '省市', 1, 'city', 1559196622127, 1559196622127);
INSERT INTO `ba_dict` VALUES ('1133978764112433152', '1133978759892963329', '3610', '抚州市', '省市', 1, 'city', 1559196622197, 1559196622197);
INSERT INTO `ba_dict` VALUES ('1133978764531863552', '1133978759892963329', '3611', '上饶市', '省市', 1, 'city', 1559196622264, 1559196622264);
INSERT INTO `ba_dict` VALUES ('1133978764531863553', '1133978877252415931', '37', '山东省', '省市', 1, 'city', 1559196622334, 1559196622334);
INSERT INTO `ba_dict` VALUES ('1133978764955488256', '1133978764531863553', '3701', '济南市', '省市', 1, 'city', 1559196622404, 1559196622404);
INSERT INTO `ba_dict` VALUES ('1133978765374918656', '1133978764531863553', '3702', '青岛市', '省市', 1, 'city', 1559196622473, 1559196622473);
INSERT INTO `ba_dict` VALUES ('1133978765794349056', '1133978764531863553', '3703', '淄博市', '省市', 1, 'city', 1559196622542, 1559196622542);
INSERT INTO `ba_dict` VALUES ('1133978766213779456', '1133978764531863553', '3704', '枣庄市', '省市', 1, 'city', 1559196622611, 1559196622611);
INSERT INTO `ba_dict` VALUES ('1133978766637404160', '1133978764531863553', '3705', '东营市', '省市', 1, 'city', 1559196622682, 1559196622682);
INSERT INTO `ba_dict` VALUES ('1133978767061028864', '1133978764531863553', '3706', '烟台市', '省市', 1, 'city', 1559196622752, 1559196622752);
INSERT INTO `ba_dict` VALUES ('1133978767480459264', '1133978764531863553', '3707', '潍坊市', '省市', 1, 'city', 1559196622820, 1559196622820);
INSERT INTO `ba_dict` VALUES ('1133978767899889664', '1133978764531863553', '3708', '济宁市', '省市', 1, 'city', 1559196622890, 1559196622890);
INSERT INTO `ba_dict` VALUES ('1133978768323514368', '1133978764531863553', '3709', '泰安市', '省市', 1, 'city', 1559196622961, 1559196622961);
INSERT INTO `ba_dict` VALUES ('1133978768742944768', '1133978764531863553', '3710', '威海市', '省市', 1, 'city', 1559196623029, 1559196623029);
INSERT INTO `ba_dict` VALUES ('1133978769166569472', '1133978764531863553', '3711', '日照市', '省市', 1, 'city', 1559196623099, 1559196623099);
INSERT INTO `ba_dict` VALUES ('1133978769590194176', '1133978764531863553', '3712', '莱芜市', '省市', 1, 'city', 1559196623169, 1559196623169);
INSERT INTO `ba_dict` VALUES ('1133978770013818880', '1133978764531863553', '3713', '临沂市', '省市', 1, 'city', 1559196623237, 1559196623237);
INSERT INTO `ba_dict` VALUES ('1133978770433249280', '1133978764531863553', '3714', '德州市', '省市', 1, 'city', 1559196623307, 1559196623307);
INSERT INTO `ba_dict` VALUES ('1133978770856873984', '1133978764531863553', '3715', '聊城市', '省市', 1, 'city', 1559196623375, 1559196623375);
INSERT INTO `ba_dict` VALUES ('1133978771280498688', '1133978764531863553', '3716', '滨州市', '省市', 1, 'city', 1559196623444, 1559196623444);
INSERT INTO `ba_dict` VALUES ('1133978771704123392', '1133978764531863553', '3717', '菏泽市', '省市', 1, 'city', 1559196623512, 1559196623512);
INSERT INTO `ba_dict` VALUES ('1133978771704123393', '1133978877252415931', '41', '河南省', '省市', 1, 'city', 1559196623585, 1559196623585);
INSERT INTO `ba_dict` VALUES ('1133978772123553792', '1133978771704123393', '4101', '郑州市', '省市', 1, 'city', 1559196623653, 1559196623653);
INSERT INTO `ba_dict` VALUES ('1133978772547178496', '1133978771704123393', '4102', '开封市', '省市', 1, 'city', 1559196623726, 1559196623726);
INSERT INTO `ba_dict` VALUES ('1133978772970803200', '1133978771704123393', '4103', '洛阳市', '省市', 1, 'city', 1559196623795, 1559196623795);
INSERT INTO `ba_dict` VALUES ('1133978773390233600', '1133978771704123393', '4104', '平顶山市', '省市', 1, 'city', 1559196623863, 1559196623863);
INSERT INTO `ba_dict` VALUES ('1133978773813858304', '1133978771704123393', '4105', '安阳市', '省市', 1, 'city', 1559196623938, 1559196623938);
INSERT INTO `ba_dict` VALUES ('1133978774233288704', '1133978771704123393', '4106', '鹤壁市', '省市', 1, 'city', 1559196624009, 1559196624009);
INSERT INTO `ba_dict` VALUES ('1133978774656913408', '1133978771704123393', '4107', '新乡市', '省市', 1, 'city', 1559196624080, 1559196624080);
INSERT INTO `ba_dict` VALUES ('1133978775080538112', '1133978771704123393', '4108', '焦作市', '省市', 1, 'city', 1559196624149, 1559196624149);
INSERT INTO `ba_dict` VALUES ('1133978775504162816', '1133978771704123393', '4109', '濮阳市', '省市', 1, 'city', 1559196624218, 1559196624218);
INSERT INTO `ba_dict` VALUES ('1133978775923593216', '1133978771704123393', '4110', '许昌市', '省市', 1, 'city', 1559196624286, 1559196624286);
INSERT INTO `ba_dict` VALUES ('1133978776343023616', '1133978771704123393', '4111', '漯河市', '省市', 1, 'city', 1559196624356, 1559196624356);
INSERT INTO `ba_dict` VALUES ('1133978776762454016', '1133978771704123393', '4112', '三门峡市', '省市', 1, 'city', 1559196624425, 1559196624425);
INSERT INTO `ba_dict` VALUES ('1133978777186078720', '1133978771704123393', '4113', '南阳市', '省市', 1, 'city', 1559196624493, 1559196624493);
INSERT INTO `ba_dict` VALUES ('1133978777605509120', '1133978771704123393', '4114', '商丘市', '省市', 1, 'city', 1559196624570, 1559196624570);
INSERT INTO `ba_dict` VALUES ('1133978778029133824', '1133978771704123393', '4115', '信阳市', '省市', 1, 'city', 1559196624637, 1559196624637);
INSERT INTO `ba_dict` VALUES ('1133978778448564224', '1133978771704123393', '4116', '周口市', '省市', 1, 'city', 1559196624706, 1559196624706);
INSERT INTO `ba_dict` VALUES ('1133978778872188928', '1133978771704123393', '4117', '驻马店市', '省市', 1, 'city', 1559196624775, 1559196624775);
INSERT INTO `ba_dict` VALUES ('1133978779295813632', '1133978771704123393', '419001', '济源市', '省市', 1, 'city', 1559196624843, 1559196624843);
INSERT INTO `ba_dict` VALUES ('1133978779295813633', '1133978877252415931', '42', '湖北省', '省市', 1, 'city', 1559196624914, 1559196624914);
INSERT INTO `ba_dict` VALUES ('1133978779719438336', '1133978779295813633', '4201', '武汉市', '省市', 1, 'city', 1559196624983, 1559196624983);
INSERT INTO `ba_dict` VALUES ('1133978780143063040', '1133978779295813633', '4202', '黄石市', '省市', 1, 'city', 1559196625053, 1559196625053);
INSERT INTO `ba_dict` VALUES ('1133978780566687744', '1133978779295813633', '4203', '十堰市', '省市', 1, 'city', 1559196625122, 1559196625122);
INSERT INTO `ba_dict` VALUES ('1133978780986118144', '1133978779295813633', '4205', '宜昌市', '省市', 1, 'city', 1559196625191, 1559196625191);
INSERT INTO `ba_dict` VALUES ('1133978781405548544', '1133978779295813633', '4206', '襄阳市', '省市', 1, 'city', 1559196625262, 1559196625262);
INSERT INTO `ba_dict` VALUES ('1133978781824978944', '1133978779295813633', '4207', '鄂州市', '省市', 1, 'city', 1559196625331, 1559196625331);
INSERT INTO `ba_dict` VALUES ('1133978782244409344', '1133978779295813633', '4208', '荆门市', '省市', 1, 'city', 1559196625400, 1559196625400);
INSERT INTO `ba_dict` VALUES ('1133978782668034048', '1133978779295813633', '4209', '孝感市', '省市', 1, 'city', 1559196625469, 1559196625469);
INSERT INTO `ba_dict` VALUES ('1133978783087464448', '1133978779295813633', '4210', '荆州市', '省市', 1, 'city', 1559196625545, 1559196625545);
INSERT INTO `ba_dict` VALUES ('1133978783506894848', '1133978779295813633', '4211', '黄冈市', '省市', 1, 'city', 1559196625614, 1559196625614);
INSERT INTO `ba_dict` VALUES ('1133978783926325248', '1133978779295813633', '4212', '咸宁市', '省市', 1, 'city', 1559196625683, 1559196625683);
INSERT INTO `ba_dict` VALUES ('1133978784349949952', '1133978779295813633', '4213', '随州市', '省市', 1, 'city', 1559196625752, 1559196625752);
INSERT INTO `ba_dict` VALUES ('1133978784773574656', '1133978779295813633', '4228', '恩施土家族苗族自治州', '省市', 1, 'city', 1559196625821, 1559196625821);
INSERT INTO `ba_dict` VALUES ('1133978785193005056', '1133978779295813633', '429004', '仙桃市', '省市', 1, 'city', 1559196625891, 1559196625891);
INSERT INTO `ba_dict` VALUES ('1133978785616629760', '1133978779295813633', '429005', '潜江市', '省市', 1, 'city', 1559196625960, 1559196625960);
INSERT INTO `ba_dict` VALUES ('1133978786036060160', '1133978779295813633', '429006', '天门市', '省市', 1, 'city', 1559196626029, 1559196626029);
INSERT INTO `ba_dict` VALUES ('1133978786459684864', '1133978779295813633', '429021', '神农架林区', '省市', 1, 'city', 1559196626099, 1559196626099);
INSERT INTO `ba_dict` VALUES ('1133978786459684865', '1133978877252415931', '43', '湖南省', '省市', 1, 'city', 1559196626167, 1559196626167);
INSERT INTO `ba_dict` VALUES ('1133978786883309568', '1133978786459684865', '4301', '长沙市', '省市', 1, 'city', 1559196626236, 1559196626236);
INSERT INTO `ba_dict` VALUES ('1133978787302739968', '1133978786459684865', '4302', '株洲市', '省市', 1, 'city', 1559196626306, 1559196626306);
INSERT INTO `ba_dict` VALUES ('1133978787726364672', '1133978786459684865', '4303', '湘潭市', '省市', 1, 'city', 1559196626375, 1559196626375);
INSERT INTO `ba_dict` VALUES ('1133978788149989376', '1133978786459684865', '4304', '衡阳市', '省市', 1, 'city', 1559196626444, 1559196626444);
INSERT INTO `ba_dict` VALUES ('1133978788569419776', '1133978786459684865', '4305', '邵阳市', '省市', 1, 'city', 1559196626513, 1559196626513);
INSERT INTO `ba_dict` VALUES ('1133978788988850176', '1133978786459684865', '4306', '岳阳市', '省市', 1, 'city', 1559196626582, 1559196626582);
INSERT INTO `ba_dict` VALUES ('1133978789408280576', '1133978786459684865', '4307', '常德市', '省市', 1, 'city', 1559196626650, 1559196626650);
INSERT INTO `ba_dict` VALUES ('1133978789831905280', '1133978786459684865', '4308', '张家界市', '省市', 1, 'city', 1559196626719, 1559196626719);
INSERT INTO `ba_dict` VALUES ('1133978790251335680', '1133978786459684865', '4309', '益阳市', '省市', 1, 'city', 1559196626788, 1559196626789);
INSERT INTO `ba_dict` VALUES ('1133978790674960384', '1133978786459684865', '4310', '郴州市', '省市', 1, 'city', 1559196626856, 1559196626856);
INSERT INTO `ba_dict` VALUES ('1133978791094390784', '1133978786459684865', '4311', '永州市', '省市', 1, 'city', 1559196626924, 1559196626924);
INSERT INTO `ba_dict` VALUES ('1133978791518015488', '1133978786459684865', '4312', '怀化市', '省市', 1, 'city', 1559196626996, 1559196626996);
INSERT INTO `ba_dict` VALUES ('1133978791937445888', '1133978786459684865', '4313', '娄底市', '省市', 1, 'city', 1559196627064, 1559196627064);
INSERT INTO `ba_dict` VALUES ('1133978792361070592', '1133978786459684865', '4331', '湘西土家族苗族自治州', '省市', 1, 'city', 1559196627144, 1559196627144);
INSERT INTO `ba_dict` VALUES ('1133978792361070593', '1133978877252415931', '44', '广东省', '省市', 1, 'city', 1559196627213, 1559196627213);
INSERT INTO `ba_dict` VALUES ('1133978792780500992', '1133978792361070593', '4401', '广州市', '省市', 1, 'city', 1559196627282, 1559196627282);
INSERT INTO `ba_dict` VALUES ('1133978793199931392', '1133978792361070593', '4402', '韶关市', '省市', 1, 'city', 1559196627350, 1559196627350);
INSERT INTO `ba_dict` VALUES ('1133978793619361792', '1133978792361070593', '4403', '深圳市', '省市', 1, 'city', 1559196627423, 1559196627423);
INSERT INTO `ba_dict` VALUES ('1133978794038792192', '1133978792361070593', '4404', '珠海市', '省市', 1, 'city', 1559196627496, 1559196627496);
INSERT INTO `ba_dict` VALUES ('1133978794462416896', '1133978792361070593', '4405', '汕头市', '省市', 1, 'city', 1559196627565, 1559196627565);
INSERT INTO `ba_dict` VALUES ('1133978794881847296', '1133978792361070593', '4406', '佛山市', '省市', 1, 'city', 1559196627634, 1559196627635);
INSERT INTO `ba_dict` VALUES ('1133978795301277696', '1133978792361070593', '4407', '江门市', '省市', 1, 'city', 1559196627704, 1559196627704);
INSERT INTO `ba_dict` VALUES ('1133978795724902400', '1133978792361070593', '4408', '湛江市', '省市', 1, 'city', 1559196627781, 1559196627781);
INSERT INTO `ba_dict` VALUES ('1133978796144332800', '1133978792361070593', '4409', '茂名市', '省市', 1, 'city', 1559196627851, 1559196627851);
INSERT INTO `ba_dict` VALUES ('1133978796567957504', '1133978792361070593', '4412', '肇庆市', '省市', 1, 'city', 1559196627920, 1559196627920);
INSERT INTO `ba_dict` VALUES ('1133978796987387904', '1133978792361070593', '4413', '惠州市', '省市', 1, 'city', 1559196627990, 1559196627990);
INSERT INTO `ba_dict` VALUES ('1133978797411012608', '1133978792361070593', '4414', '梅州市', '省市', 1, 'city', 1559196628061, 1559196628061);
INSERT INTO `ba_dict` VALUES ('1133978797830443008', '1133978792361070593', '4415', '汕尾市', '省市', 1, 'city', 1559196628130, 1559196628130);
INSERT INTO `ba_dict` VALUES ('1133978798254067712', '1133978792361070593', '4416', '河源市', '省市', 1, 'city', 1559196628201, 1559196628201);
INSERT INTO `ba_dict` VALUES ('1133978798673498112', '1133978792361070593', '4417', '阳江市', '省市', 1, 'city', 1559196628271, 1559196628271);
INSERT INTO `ba_dict` VALUES ('1133978799097122816', '1133978792361070593', '4418', '清远市', '省市', 1, 'city', 1559196628355, 1559196628355);
INSERT INTO `ba_dict` VALUES ('1133978799516553216', '1133978792361070593', '4419', '东莞市', '省市', 1, 'city', 1559196628423, 1559196628423);
INSERT INTO `ba_dict` VALUES ('1133978799935983616', '1133978792361070593', '4420', '中山市', '省市', 1, 'city', 1559196628493, 1559196628493);
INSERT INTO `ba_dict` VALUES ('1133978800363802624', '1133978792361070593', '4451', '潮州市', '省市', 1, 'city', 1559196628562, 1559196628562);
INSERT INTO `ba_dict` VALUES ('1133978800783233024', '1133978792361070593', '4452', '揭阳市', '省市', 1, 'city', 1559196628631, 1559196628631);
INSERT INTO `ba_dict` VALUES ('1133978801206857728', '1133978792361070593', '4453', '云浮市', '省市', 1, 'city', 1559196628699, 1559196628699);
INSERT INTO `ba_dict` VALUES ('1133978801206857729', '1133978877252415931', '45', '广西壮族自治区', '省市', 1, 'city', 1559196628769, 1559196628769);
INSERT INTO `ba_dict` VALUES ('1133978801626288128', '1133978801206857729', '4501', '南宁市', '省市', 1, 'city', 1559196628845, 1559196628845);
INSERT INTO `ba_dict` VALUES ('1133978802045718528', '1133978801206857729', '4502', '柳州市', '省市', 1, 'city', 1559196628917, 1559196628917);
INSERT INTO `ba_dict` VALUES ('1133978802469343232', '1133978801206857729', '4503', '桂林市', '省市', 1, 'city', 1559196628994, 1559196628994);
INSERT INTO `ba_dict` VALUES ('1133978802888773632', '1133978801206857729', '4504', '梧州市', '省市', 1, 'city', 1559196629063, 1559196629063);
INSERT INTO `ba_dict` VALUES ('1133978803312398336', '1133978801206857729', '4505', '北海市', '省市', 1, 'city', 1559196629139, 1559196629139);
INSERT INTO `ba_dict` VALUES ('1133978803736023040', '1133978801206857729', '4506', '防城港市', '省市', 1, 'city', 1559196629215, 1559196629215);
INSERT INTO `ba_dict` VALUES ('1133978804155453440', '1133978801206857729', '4507', '钦州市', '省市', 1, 'city', 1559196629291, 1559196629291);
INSERT INTO `ba_dict` VALUES ('1133978804574883840', '1133978801206857729', '4508', '贵港市', '省市', 1, 'city', 1559196629359, 1559196629359);
INSERT INTO `ba_dict` VALUES ('1133978804994314240', '1133978801206857729', '4509', '玉林市', '省市', 1, 'city', 1559196629437, 1559196629437);
INSERT INTO `ba_dict` VALUES ('1133978805417938944', '1133978801206857729', '4510', '百色市', '省市', 1, 'city', 1559196629507, 1559196629507);
INSERT INTO `ba_dict` VALUES ('1133978805837369344', '1133978801206857729', '4511', '贺州市', '省市', 1, 'city', 1559196629578, 1559196629578);
INSERT INTO `ba_dict` VALUES ('1133978806260994048', '1133978801206857729', '4512', '河池市', '省市', 1, 'city', 1559196629653, 1559196629653);
INSERT INTO `ba_dict` VALUES ('1133978806680424448', '1133978801206857729', '4513', '来宾市', '省市', 1, 'city', 1559196629722, 1559196629722);
INSERT INTO `ba_dict` VALUES ('1133978807104049152', '1133978801206857729', '4514', '崇左市', '省市', 1, 'city', 1559196629801, 1559196629801);
INSERT INTO `ba_dict` VALUES ('1133978807104049153', '1133978877252415931', '46', '海南省', '省市', 1, 'city', 1559196629880, 1559196629880);
INSERT INTO `ba_dict` VALUES ('1133978807523479552', '1133978807104049153', '4601', '海口市', '省市', 1, 'city', 1559196629951, 1559196629951);
INSERT INTO `ba_dict` VALUES ('1133978807947104256', '1133978807104049153', '4602', '三亚市', '省市', 1, 'city', 1559196630022, 1559196630022);
INSERT INTO `ba_dict` VALUES ('1133978808366534656', '1133978807104049153', '4603', '三沙市', '省市', 1, 'city', 1559196630104, 1559196630104);
INSERT INTO `ba_dict` VALUES ('1133978808785965056', '1133978807104049153', '4604', '儋州市', '省市', 1, 'city', 1559196630180, 1559196630180);
INSERT INTO `ba_dict` VALUES ('1133978809209589760', '1133978807104049153', '469001', '五指山市', '省市', 1, 'city', 1559196630248, 1559196630248);
INSERT INTO `ba_dict` VALUES ('1133978809633214464', '1133978807104049153', '469002', '琼海市', '省市', 1, 'city', 1559196630317, 1559196630317);
INSERT INTO `ba_dict` VALUES ('1133978810052644864', '1133978807104049153', '469005', '文昌市', '省市', 1, 'city', 1559196630390, 1559196630390);
INSERT INTO `ba_dict` VALUES ('1133978810472075264', '1133978807104049153', '469006', '万宁市', '省市', 1, 'city', 1559196630459, 1559196630459);
INSERT INTO `ba_dict` VALUES ('1133978810891505664', '1133978807104049153', '469007', '东方市', '省市', 1, 'city', 1559196630537, 1559196630537);
INSERT INTO `ba_dict` VALUES ('1133978811315130368', '1133978807104049153', '469021', '定安县', '省市', 1, 'city', 1559196630608, 1559196630608);
INSERT INTO `ba_dict` VALUES ('1133978811738755072', '1133978807104049153', '469022', '屯昌县', '省市', 1, 'city', 1559196630678, 1559196630678);
INSERT INTO `ba_dict` VALUES ('1133978812158185472', '1133978807104049153', '469023', '澄迈县', '省市', 1, 'city', 1559196630749, 1559196630749);
INSERT INTO `ba_dict` VALUES ('1133978812581810176', '1133978807104049153', '469024', '临高县', '省市', 1, 'city', 1559196630818, 1559196630818);
INSERT INTO `ba_dict` VALUES ('1133978813005434880', '1133978807104049153', '469025', '白沙黎族自治县', '省市', 1, 'city', 1559196630887, 1559196630887);
INSERT INTO `ba_dict` VALUES ('1133978813424865280', '1133978807104049153', '469026', '昌江黎族自治县', '省市', 1, 'city', 1559196630972, 1559196630972);
INSERT INTO `ba_dict` VALUES ('1133978813844295680', '1133978807104049153', '469027', '乐东黎族自治县', '省市', 1, 'city', 1559196631041, 1559196631042);
INSERT INTO `ba_dict` VALUES ('1133978814267920384', '1133978807104049153', '469028', '陵水黎族自治县', '省市', 1, 'city', 1559196631113, 1559196631113);
INSERT INTO `ba_dict` VALUES ('1133978814687350784', '1133978807104049153', '469029', '保亭黎族苗族自治县', '省市', 1, 'city', 1559196631181, 1559196631181);
INSERT INTO `ba_dict` VALUES ('1133978815106781184', '1133978807104049153', '469030', '琼中黎族苗族自治县', '省市', 1, 'city', 1559196631251, 1559196631251);
INSERT INTO `ba_dict` VALUES ('1133978815106781185', '1133978877252415931', '50', '重庆市', '省市', 1, 'city', 1559196631319, 1559196631319);
INSERT INTO `ba_dict` VALUES ('1133978815530405888', '1133978815106781185', '500101', '万州区', '省市', 1, 'city', 1559196631390, 1559196631390);
INSERT INTO `ba_dict` VALUES ('1133978815949836288', '1133978815106781185', '500102', '涪陵区', '省市', 1, 'city', 1559196631458, 1559196631458);
INSERT INTO `ba_dict` VALUES ('1133978816369266688', '1133978815106781185', '500103', '渝中区', '省市', 1, 'city', 1559196631531, 1559196631531);
INSERT INTO `ba_dict` VALUES ('1133978816788697088', '1133978815106781185', '500104', '大渡口区', '省市', 1, 'city', 1559196631599, 1559196631599);
INSERT INTO `ba_dict` VALUES ('1133978817212321792', '1133978815106781185', '500105', '江北区', '省市', 1, 'city', 1559196631669, 1559196631669);
INSERT INTO `ba_dict` VALUES ('1133978817635946496', '1133978815106781185', '500106', '沙坪坝区', '省市', 1, 'city', 1559196631738, 1559196631738);
INSERT INTO `ba_dict` VALUES ('1133978818055376896', '1133978815106781185', '500107', '九龙坡区', '省市', 1, 'city', 1559196631806, 1559196631806);
INSERT INTO `ba_dict` VALUES ('1133978818479001600', '1133978815106781185', '500108', '南岸区', '省市', 1, 'city', 1559196631874, 1559196631874);
INSERT INTO `ba_dict` VALUES ('1133978818902626304', '1133978815106781185', '500109', '北碚区', '省市', 1, 'city', 1559196631942, 1559196631942);
INSERT INTO `ba_dict` VALUES ('1133978819326251008', '1133978815106781185', '500110', '綦江区', '省市', 1, 'city', 1559196632010, 1559196632010);
INSERT INTO `ba_dict` VALUES ('1133978819745681408', '1133978815106781185', '500111', '大足区', '省市', 1, 'city', 1559196632079, 1559196632079);
INSERT INTO `ba_dict` VALUES ('1133978820165111808', '1133978815106781185', '500112', '渝北区', '省市', 1, 'city', 1559196632148, 1559196632148);
INSERT INTO `ba_dict` VALUES ('1133978820588736512', '1133978815106781185', '500113', '巴南区', '省市', 1, 'city', 1559196632223, 1559196632223);
INSERT INTO `ba_dict` VALUES ('1133978821008166912', '1133978815106781185', '500114', '黔江区', '省市', 1, 'city', 1559196632295, 1559196632295);
INSERT INTO `ba_dict` VALUES ('1133978821431791616', '1133978815106781185', '500115', '长寿区', '省市', 1, 'city', 1559196632365, 1559196632365);
INSERT INTO `ba_dict` VALUES ('1133978821851222016', '1133978815106781185', '500116', '江津区', '省市', 1, 'city', 1559196632434, 1559196632434);
INSERT INTO `ba_dict` VALUES ('1133978822274846720', '1133978815106781185', '500117', '合川区', '省市', 1, 'city', 1559196632501, 1559196632501);
INSERT INTO `ba_dict` VALUES ('1133978822698471424', '1133978815106781185', '500118', '永川区', '省市', 1, 'city', 1559196632575, 1559196632575);
INSERT INTO `ba_dict` VALUES ('1133978823117901824', '1133978815106781185', '500119', '南川区', '省市', 1, 'city', 1559196632653, 1559196632653);
INSERT INTO `ba_dict` VALUES ('1133978823537332224', '1133978815106781185', '500120', '璧山区', '省市', 1, 'city', 1559196632725, 1559196632725);
INSERT INTO `ba_dict` VALUES ('1133978823960956928', '1133978815106781185', '500151', '铜梁区', '省市', 1, 'city', 1559196632798, 1559196632798);
INSERT INTO `ba_dict` VALUES ('1133978824380387328', '1133978815106781185', '500152', '潼南区', '省市', 1, 'city', 1559196632867, 1559196632867);
INSERT INTO `ba_dict` VALUES ('1133978824804012032', '1133978815106781185', '500153', '荣昌区', '省市', 1, 'city', 1559196632936, 1559196632936);
INSERT INTO `ba_dict` VALUES ('1133978825223442432', '1133978815106781185', '500154', '开州区', '省市', 1, 'city', 1559196633005, 1559196633005);
INSERT INTO `ba_dict` VALUES ('1133978825647067136', '1133978815106781185', '500155', '梁平区', '省市', 1, 'city', 1559196633073, 1559196633073);
INSERT INTO `ba_dict` VALUES ('1133978826066497536', '1133978815106781185', '500156', '武隆区', '省市', 1, 'city', 1559196633143, 1559196633144);
INSERT INTO `ba_dict` VALUES ('1133978826485927936', '1133978815106781185', '500229', '城口县', '省市', 1, 'city', 1559196633234, 1559196633234);
INSERT INTO `ba_dict` VALUES ('1133978826909552640', '1133978815106781185', '500230', '丰都县', '省市', 1, 'city', 1559196633346, 1559196633346);
INSERT INTO `ba_dict` VALUES ('1133978827328983040', '1133978815106781185', '500231', '垫江县', '省市', 1, 'city', 1559196633432, 1559196633432);
INSERT INTO `ba_dict` VALUES ('1133978827752607744', '1133978815106781185', '500233', '忠县', '省市', 1, 'city', 1559196633537, 1559196633537);
INSERT INTO `ba_dict` VALUES ('1133978828172038144', '1133978815106781185', '500235', '云阳县', '省市', 1, 'city', 1559196633626, 1559196633626);
INSERT INTO `ba_dict` VALUES ('1133978828595662848', '1133978815106781185', '500236', '奉节县', '省市', 1, 'city', 1559196633727, 1559196633727);
INSERT INTO `ba_dict` VALUES ('1133978829015093248', '1133978815106781185', '500237', '巫山县', '省市', 1, 'city', 1559196633796, 1559196633796);
INSERT INTO `ba_dict` VALUES ('1133978829434523648', '1133978815106781185', '500238', '巫溪县', '省市', 1, 'city', 1559196633865, 1559196633865);
INSERT INTO `ba_dict` VALUES ('1133978829862342656', '1133978815106781185', '500240', '石柱土家族自治县', '省市', 1, 'city', 1559196633933, 1559196633933);
INSERT INTO `ba_dict` VALUES ('1133978830281773056', '1133978815106781185', '500241', '秀山土家族苗族自治县', '省市', 1, 'city', 1559196634003, 1559196634003);
INSERT INTO `ba_dict` VALUES ('1133978830705397760', '1133978815106781185', '500242', '酉阳土家族苗族自治县', '省市', 1, 'city', 1559196634074, 1559196634074);
INSERT INTO `ba_dict` VALUES ('1133978831124828160', '1133978815106781185', '500243', '彭水苗族土家族自治县', '省市', 1, 'city', 1559196634143, 1559196634143);
INSERT INTO `ba_dict` VALUES ('1133978831124828161', '1133978877252415931', '51', '四川省', '省市', 1, 'city', 1559196634214, 1559196634214);
INSERT INTO `ba_dict` VALUES ('1133978831544258560', '1133978831124828161', '5101', '成都市', '省市', 1, 'city', 1559196634282, 1559196634282);
INSERT INTO `ba_dict` VALUES ('1133978831967883264', '1133978831124828161', '5103', '自贡市', '省市', 1, 'city', 1559196634350, 1559196634350);
INSERT INTO `ba_dict` VALUES ('1133978832387313664', '1133978831124828161', '5104', '攀枝花市', '省市', 1, 'city', 1559196634420, 1559196634420);
INSERT INTO `ba_dict` VALUES ('1133978832806744064', '1133978831124828161', '5105', '泸州市', '省市', 1, 'city', 1559196634514, 1559196634514);
INSERT INTO `ba_dict` VALUES ('1133978833230368768', '1133978831124828161', '5106', '德阳市', '省市', 1, 'city', 1559196634583, 1559196634583);
INSERT INTO `ba_dict` VALUES ('1133978833653993472', '1133978831124828161', '5107', '绵阳市', '省市', 1, 'city', 1559196634651, 1559196634651);
INSERT INTO `ba_dict` VALUES ('1133978834073423872', '1133978831124828161', '5108', '广元市', '省市', 1, 'city', 1559196634721, 1559196634721);
INSERT INTO `ba_dict` VALUES ('1133978834492854272', '1133978831124828161', '5109', '遂宁市', '省市', 1, 'city', 1559196634789, 1559196634789);
INSERT INTO `ba_dict` VALUES ('1133978834916478976', '1133978831124828161', '5110', '内江市', '省市', 1, 'city', 1559196634858, 1559196634858);
INSERT INTO `ba_dict` VALUES ('1133978835340103680', '1133978831124828161', '5111', '乐山市', '省市', 1, 'city', 1559196634928, 1559196634928);
INSERT INTO `ba_dict` VALUES ('1133978835759534080', '1133978831124828161', '5113', '南充市', '省市', 1, 'city', 1559196634996, 1559196634996);
INSERT INTO `ba_dict` VALUES ('1133978836183158784', '1133978831124828161', '5114', '眉山市', '省市', 1, 'city', 1559196635066, 1559196635066);
INSERT INTO `ba_dict` VALUES ('1133978836602589184', '1133978831124828161', '5115', '宜宾市', '省市', 1, 'city', 1559196635136, 1559196635136);
INSERT INTO `ba_dict` VALUES ('1133978837026213888', '1133978831124828161', '5116', '广安市', '省市', 1, 'city', 1559196635206, 1559196635206);
INSERT INTO `ba_dict` VALUES ('1133978837449838592', '1133978831124828161', '5117', '达州市', '省市', 1, 'city', 1559196635276, 1559196635276);
INSERT INTO `ba_dict` VALUES ('1133978837869268992', '1133978831124828161', '5118', '雅安市', '省市', 1, 'city', 1559196635345, 1559196635345);
INSERT INTO `ba_dict` VALUES ('1133978838288699392', '1133978831124828161', '5119', '巴中市', '省市', 1, 'city', 1559196635414, 1559196635414);
INSERT INTO `ba_dict` VALUES ('1133978838712324096', '1133978831124828161', '5120', '资阳市', '省市', 1, 'city', 1559196635483, 1559196635483);
INSERT INTO `ba_dict` VALUES ('1133978839131754496', '1133978831124828161', '5132', '阿坝藏族羌族自治州', '省市', 1, 'city', 1559196635560, 1559196635560);
INSERT INTO `ba_dict` VALUES ('1133978839555379200', '1133978831124828161', '5133', '甘孜藏族自治州', '省市', 1, 'city', 1559196635629, 1559196635629);
INSERT INTO `ba_dict` VALUES ('1133978839974809600', '1133978831124828161', '5134', '凉山彝族自治州', '省市', 1, 'city', 1559196635710, 1559196635710);
INSERT INTO `ba_dict` VALUES ('1133978839974809601', '1133978877252415931', '52', '贵州省', '省市', 1, 'city', 1559196635777, 1559196635777);
INSERT INTO `ba_dict` VALUES ('1133978840398434304', '1133978839974809601', '5201', '贵阳市', '省市', 1, 'city', 1559196635848, 1559196635848);
INSERT INTO `ba_dict` VALUES ('1133978840817864704', '1133978839974809601', '5202', '六盘水市', '省市', 1, 'city', 1559196635917, 1559196635917);
INSERT INTO `ba_dict` VALUES ('1133978841241489408', '1133978839974809601', '5203', '遵义市', '省市', 1, 'city', 1559196635986, 1559196635986);
INSERT INTO `ba_dict` VALUES ('1133978841665114112', '1133978839974809601', '5204', '安顺市', '省市', 1, 'city', 1559196636055, 1559196636055);
INSERT INTO `ba_dict` VALUES ('1133978842084544512', '1133978839974809601', '5205', '毕节市', '省市', 1, 'city', 1559196636125, 1559196636125);
INSERT INTO `ba_dict` VALUES ('1133978842508169216', '1133978839974809601', '5206', '铜仁市', '省市', 1, 'city', 1559196636193, 1559196636193);
INSERT INTO `ba_dict` VALUES ('1133978842927599616', '1133978839974809601', '5223', '黔西南布依族苗族自治州', '省市', 1, 'city', 1559196636282, 1559196636282);
INSERT INTO `ba_dict` VALUES ('1133978843347030016', '1133978839974809601', '5226', '黔东南苗族侗族自治州', '省市', 1, 'city', 1559196636358, 1559196636358);
INSERT INTO `ba_dict` VALUES ('1133978843770654720', '1133978839974809601', '5227', '黔南布依族苗族自治州', '省市', 1, 'city', 1559196636440, 1559196636440);
INSERT INTO `ba_dict` VALUES ('1133978843770654721', '1133978877252415931', '53', '云南省', '省市', 1, 'city', 1559196636509, 1559196636509);
INSERT INTO `ba_dict` VALUES ('1133978844190085120', '1133978843770654721', '5301', '昆明市', '省市', 1, 'city', 1559196636617, 1559196636617);
INSERT INTO `ba_dict` VALUES ('1133978844609515520', '1133978843770654721', '5303', '曲靖市', '省市', 1, 'city', 1559196636746, 1559196636746);
INSERT INTO `ba_dict` VALUES ('1133978845028945920', '1133978843770654721', '5304', '玉溪市', '省市', 1, 'city', 1559196636858, 1559196636858);
INSERT INTO `ba_dict` VALUES ('1133978845452570624', '1133978843770654721', '5305', '保山市', '省市', 1, 'city', 1559196636966, 1559196636966);
INSERT INTO `ba_dict` VALUES ('1133978845872001024', '1133978843770654721', '5306', '昭通市', '省市', 1, 'city', 1559196637067, 1559196637067);
INSERT INTO `ba_dict` VALUES ('1133978846299820032', '1133978843770654721', '5307', '丽江市', '省市', 1, 'city', 1559196637174, 1559196637174);
INSERT INTO `ba_dict` VALUES ('1133978846719250432', '1133978843770654721', '5308', '普洱市', '省市', 1, 'city', 1559196637285, 1559196637285);
INSERT INTO `ba_dict` VALUES ('1133978847142875136', '1133978843770654721', '5309', '临沧市', '省市', 1, 'city', 1559196637397, 1559196637397);
INSERT INTO `ba_dict` VALUES ('1133978847562305536', '1133978843770654721', '5323', '楚雄彝族自治州', '省市', 1, 'city', 1559196637510, 1559196637510);
INSERT INTO `ba_dict` VALUES ('1133978847985930240', '1133978843770654721', '5325', '红河哈尼族彝族自治州', '省市', 1, 'city', 1559196637621, 1559196637621);
INSERT INTO `ba_dict` VALUES ('1133978848409554944', '1133978843770654721', '5326', '文山壮族苗族自治州', '省市', 1, 'city', 1559196637735, 1559196637735);
INSERT INTO `ba_dict` VALUES ('1133978848833179648', '1133978843770654721', '5328', '西双版纳傣族自治州', '省市', 1, 'city', 1559196637853, 1559196637853);
INSERT INTO `ba_dict` VALUES ('1133978849252610048', '1133978843770654721', '5329', '大理白族自治州', '省市', 1, 'city', 1559196637959, 1559196637959);
INSERT INTO `ba_dict` VALUES ('1133978849676234752', '1133978843770654721', '5331', '德宏傣族景颇族自治州', '省市', 1, 'city', 1559196638071, 1559196638071);
INSERT INTO `ba_dict` VALUES ('1133978850099859456', '1133978843770654721', '5333', '怒江傈僳族自治州', '省市', 1, 'city', 1559196638191, 1559196638191);
INSERT INTO `ba_dict` VALUES ('1133978850519289856', '1133978843770654721', '5334', '迪庆藏族自治州', '省市', 1, 'city', 1559196638300, 1559196638300);
INSERT INTO `ba_dict` VALUES ('1133978850519289857', '1133978877252415931', '54', '西藏自治区', '省市', 1, 'city', 1559196638385, 1559196638385);
INSERT INTO `ba_dict` VALUES ('1133978850938720256', '1133978850519289857', '5401', '拉萨市', '省市', 1, 'city', 1559196638461, 1559196638461);
INSERT INTO `ba_dict` VALUES ('1133978851362344960', '1133978850519289857', '5402', '日喀则市', '省市', 1, 'city', 1559196638530, 1559196638530);
INSERT INTO `ba_dict` VALUES ('1133978851781775360', '1133978850519289857', '5403', '昌都市', '省市', 1, 'city', 1559196638599, 1559196638599);
INSERT INTO `ba_dict` VALUES ('1133978852205400064', '1133978850519289857', '5404', '林芝市', '省市', 1, 'city', 1559196638668, 1559196638668);
INSERT INTO `ba_dict` VALUES ('1133978852629024768', '1133978850519289857', '5405', '山南市', '省市', 1, 'city', 1559196638740, 1559196638740);
INSERT INTO `ba_dict` VALUES ('1133978853048455168', '1133978850519289857', '5406', '那曲市', '省市', 1, 'city', 1559196638807, 1559196638807);
INSERT INTO `ba_dict` VALUES ('1133978853467885568', '1133978850519289857', '5425', '阿里地区', '省市', 1, 'city', 1559196638876, 1559196638876);
INSERT INTO `ba_dict` VALUES ('1133978853467885569', '1133978877252415931', '61', '陕西省', '省市', 1, 'city', 1559196638945, 1559196638945);
INSERT INTO `ba_dict` VALUES ('1133978853887315968', '1133978853467885569', '6101', '西安市', '省市', 1, 'city', 1559196639019, 1559196639019);
INSERT INTO `ba_dict` VALUES ('1133978854310940672', '1133978853467885569', '6102', '铜川市', '省市', 1, 'city', 1559196639089, 1559196639089);
INSERT INTO `ba_dict` VALUES ('1133978854730371072', '1133978853467885569', '6103', '宝鸡市', '省市', 1, 'city', 1559196639159, 1559196639159);
INSERT INTO `ba_dict` VALUES ('1133978855153995776', '1133978853467885569', '6104', '咸阳市', '省市', 1, 'city', 1559196639228, 1559196639228);
INSERT INTO `ba_dict` VALUES ('1133978855573426176', '1133978853467885569', '6105', '渭南市', '省市', 1, 'city', 1559196639301, 1559196639301);
INSERT INTO `ba_dict` VALUES ('1133978855997050880', '1133978853467885569', '6106', '延安市', '省市', 1, 'city', 1559196639369, 1559196639369);
INSERT INTO `ba_dict` VALUES ('1133978856416481280', '1133978853467885569', '6107', '汉中市', '省市', 1, 'city', 1559196639443, 1559196639443);
INSERT INTO `ba_dict` VALUES ('1133978856840105984', '1133978853467885569', '6108', '榆林市', '省市', 1, 'city', 1559196639514, 1559196639514);
INSERT INTO `ba_dict` VALUES ('1133978857259536384', '1133978853467885569', '6109', '安康市', '省市', 1, 'city', 1559196639588, 1559196639588);
INSERT INTO `ba_dict` VALUES ('1133978857678966784', '1133978853467885569', '6110', '商洛市', '省市', 1, 'city', 1559196639658, 1559196639658);
INSERT INTO `ba_dict` VALUES ('1133978857678966785', '1133978877252415931', '62', '甘肃省', '省市', 1, 'city', 1559196639729, 1559196639729);
INSERT INTO `ba_dict` VALUES ('1133978858102591488', '1133978857678966785', '6201', '兰州市', '省市', 1, 'city', 1559196639797, 1559196639797);
INSERT INTO `ba_dict` VALUES ('1133978858522021888', '1133978857678966785', '6202', '嘉峪关市', '省市', 1, 'city', 1559196639866, 1559196639866);
INSERT INTO `ba_dict` VALUES ('1133978858941452288', '1133978857678966785', '6203', '金昌市', '省市', 1, 'city', 1559196639933, 1559196639933);
INSERT INTO `ba_dict` VALUES ('1133978859365076992', '1133978857678966785', '6204', '白银市', '省市', 1, 'city', 1559196640002, 1559196640002);
INSERT INTO `ba_dict` VALUES ('1133978859784507392', '1133978857678966785', '6205', '天水市', '省市', 1, 'city', 1559196640070, 1559196640070);
INSERT INTO `ba_dict` VALUES ('1133978860203937792', '1133978857678966785', '6206', '武威市', '省市', 1, 'city', 1559196640138, 1559196640139);
INSERT INTO `ba_dict` VALUES ('1133978860623368192', '1133978857678966785', '6207', '张掖市', '省市', 1, 'city', 1559196640205, 1559196640205);
INSERT INTO `ba_dict` VALUES ('1133978861046992896', '1133978857678966785', '6208', '平凉市', '省市', 1, 'city', 1559196640281, 1559196640281);
INSERT INTO `ba_dict` VALUES ('1133978861466423296', '1133978857678966785', '6209', '酒泉市', '省市', 1, 'city', 1559196640349, 1559196640349);
INSERT INTO `ba_dict` VALUES ('1133978861890048000', '1133978857678966785', '6210', '庆阳市', '省市', 1, 'city', 1559196640417, 1559196640417);
INSERT INTO `ba_dict` VALUES ('1133978862309478400', '1133978857678966785', '6211', '定西市', '省市', 1, 'city', 1559196640486, 1559196640486);
INSERT INTO `ba_dict` VALUES ('1133978862733103104', '1133978857678966785', '6212', '陇南市', '省市', 1, 'city', 1559196640555, 1559196640555);
INSERT INTO `ba_dict` VALUES ('1133978863152533504', '1133978857678966785', '6229', '临夏回族自治州', '省市', 1, 'city', 1559196640623, 1559196640623);
INSERT INTO `ba_dict` VALUES ('1133978863576158208', '1133978857678966785', '6230', '甘南藏族自治州', '省市', 1, 'city', 1559196640693, 1559196640693);
INSERT INTO `ba_dict` VALUES ('1133978863576158209', '1133978877252415931', '63', '青海省', '省市', 1, 'city', 1559196640762, 1559196640762);
INSERT INTO `ba_dict` VALUES ('1133978863999782912', '1133978863576158209', '6301', '西宁市', '省市', 1, 'city', 1559196640831, 1559196640831);
INSERT INTO `ba_dict` VALUES ('1133978864419213312', '1133978863576158209', '6302', '海东市', '省市', 1, 'city', 1559196640914, 1559196640914);
INSERT INTO `ba_dict` VALUES ('1133978864842838016', '1133978863576158209', '6322', '海北藏族自治州', '省市', 1, 'city', 1559196640990, 1559196640990);
INSERT INTO `ba_dict` VALUES ('1133978865262268416', '1133978863576158209', '6323', '黄南藏族自治州', '省市', 1, 'city', 1559196641059, 1559196641059);
INSERT INTO `ba_dict` VALUES ('1133978865681698816', '1133978863576158209', '6325', '海南藏族自治州', '省市', 1, 'city', 1559196641154, 1559196641154);
INSERT INTO `ba_dict` VALUES ('1133978866105323520', '1133978863576158209', '6326', '果洛藏族自治州', '省市', 1, 'city', 1559196641224, 1559196641224);
INSERT INTO `ba_dict` VALUES ('1133978866524753920', '1133978863576158209', '6327', '玉树藏族自治州', '省市', 1, 'city', 1559196641293, 1559196641293);
INSERT INTO `ba_dict` VALUES ('1133978866948378624', '1133978863576158209', '6328', '海西蒙古族藏族自治州', '省市', 1, 'city', 1559196641362, 1559196641362);
INSERT INTO `ba_dict` VALUES ('1133978866948378625', '1133978877252415931', '64', '宁夏回族自治区', '省市', 1, 'city', 1559196641431, 1559196641431);
INSERT INTO `ba_dict` VALUES ('1133978867367809024', '1133978866948378625', '6401', '银川市', '省市', 1, 'city', 1559196641509, 1559196641509);
INSERT INTO `ba_dict` VALUES ('1133978867787239424', '1133978866948378625', '6402', '石嘴山市', '省市', 1, 'city', 1559196641576, 1559196641576);
INSERT INTO `ba_dict` VALUES ('1133978868210864128', '1133978866948378625', '6403', '吴忠市', '省市', 1, 'city', 1559196641645, 1559196641645);
INSERT INTO `ba_dict` VALUES ('1133978868630294528', '1133978866948378625', '6404', '固原市', '省市', 1, 'city', 1559196641714, 1559196641714);
INSERT INTO `ba_dict` VALUES ('1133978869049724928', '1133978866948378625', '6405', '中卫市', '省市', 1, 'city', 1559196641783, 1559196641783);
INSERT INTO `ba_dict` VALUES ('1133978869049724929', '1133978877252415931', '65', '新疆维吾尔自治区', '省市', 1, 'city', 1559196641853, 1559196641853);
INSERT INTO `ba_dict` VALUES ('1133978869469155328', '1133978869049724929', '6501', '乌鲁木齐市', '省市', 1, 'city', 1559196641924, 1559196641924);
INSERT INTO `ba_dict` VALUES ('1133978869892780032', '1133978869049724929', '6502', '克拉玛依市', '省市', 1, 'city', 1559196642018, 1559196642018);
INSERT INTO `ba_dict` VALUES ('1133978870312210432', '1133978869049724929', '6504', '吐鲁番市', '省市', 1, 'city', 1559196642114, 1559196642114);
INSERT INTO `ba_dict` VALUES ('1133978870735835136', '1133978869049724929', '6505', '哈密市', '省市', 1, 'city', 1559196642183, 1559196642183);
INSERT INTO `ba_dict` VALUES ('1133978871155265536', '1133978869049724929', '6523', '昌吉回族自治州', '省市', 1, 'city', 1559196642280, 1559196642280);
INSERT INTO `ba_dict` VALUES ('1133978871574695936', '1133978869049724929', '6527', '博尔塔拉蒙古自治州', '省市', 1, 'city', 1559196642352, 1559196642352);
INSERT INTO `ba_dict` VALUES ('1133978871994126336', '1133978869049724929', '6528', '巴音郭楞蒙古自治州', '省市', 1, 'city', 1559196642427, 1559196642427);
INSERT INTO `ba_dict` VALUES ('1133978872413556736', '1133978869049724929', '6529', '阿克苏地区', '省市', 1, 'city', 1559196642533, 1559196642533);
INSERT INTO `ba_dict` VALUES ('1133978872837181440', '1133978869049724929', '6530', '克孜勒苏柯尔克孜自治州', '省市', 1, 'city', 1559196642618, 1559196642618);
INSERT INTO `ba_dict` VALUES ('1133978873256611840', '1133978869049724929', '6531', '喀什地区', '省市', 1, 'city', 1559196642686, 1559196642686);
INSERT INTO `ba_dict` VALUES ('1133978873680236544', '1133978869049724929', '6532', '和田地区', '省市', 1, 'city', 1559196642760, 1559196642760);
INSERT INTO `ba_dict` VALUES ('1133978874099666944', '1133978869049724929', '6540', '伊犁哈萨克自治州', '省市', 1, 'city', 1559196642830, 1559196642830);
INSERT INTO `ba_dict` VALUES ('1133978874523291648', '1133978869049724929', '6542', '塔城地区', '省市', 1, 'city', 1559196642939, 1559196642939);
INSERT INTO `ba_dict` VALUES ('1133978874942722048', '1133978869049724929', '6543', '阿勒泰地区', '省市', 1, 'city', 1559196643008, 1559196643008);
INSERT INTO `ba_dict` VALUES ('1133978875362152448', '1133978869049724929', '659001', '石河子市', '省市', 1, 'city', 1559196643078, 1559196643078);
INSERT INTO `ba_dict` VALUES ('1133978875785777152', '1133978869049724929', '659002', '阿拉尔市', '省市', 1, 'city', 1559196643146, 1559196643146);
INSERT INTO `ba_dict` VALUES ('1133978876209401856', '1133978869049724929', '659003', '图木舒克市', '省市', 1, 'city', 1559196643214, 1559196643214);
INSERT INTO `ba_dict` VALUES ('1133978876628832256', '1133978869049724929', '659004', '五家渠市', '省市', 1, 'city', 1559196643281, 1559196643281);
INSERT INTO `ba_dict` VALUES ('1133978877052456960', '1133978869049724929', '659006', '铁门关市', '省市', 1, 'city', 1559196643351, 1559196643351);
INSERT INTO `ba_dict` VALUES ('1133978877252415931', '0', '10', '全国城市代码表', '全国城市代码表', 1, 'city', 1559196607257, 1559196607257);
INSERT INTO `ba_dict` VALUES ('1203506627513290752', '0', '', 'a', 'a', 0, 'a', 1575773314612, 1575773314612);
-- ----------------------------
-- Table structure for ba_login_log
-- ----------------------------
DROP TABLE IF EXISTS `ba_login_log`;
CREATE TABLE `ba_login_log` (
`id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL,
`create_at` bigint(20) NULL DEFAULT NULL,
`update_at` bigint(20) NULL DEFAULT NULL,
`browser` varchar(50) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`client_ip` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`os_info` varchar(100) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`user_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
`user_name` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `login_log_client_ip`(`client_ip`) USING BTREE,
INDEX `login_log_user_id`(`user_id`) USING BTREE,
INDEX `login_log_create_at`(`create_at`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf16 COLLATE = utf16_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of ba_login_log
-- ----------------------------
INSERT INTO `ba_login_log` VALUES ('1235224543237378048', 1583335455120, 1583335455120, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235225000361988096', 1583335564112, 1583335564112, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235225207287975936', 1583335613448, 1583335613448, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235225295682932736', 1583335634522, 1583335634522, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235226006604877824', 1583335804019, 1583335804019, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235227058024615936', 1583336054697, 1583336054697, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235229138504257536', 1583336550722, 1583336550722, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235597929788608512', 1583424477395, 1583424477395, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235599001395531776', 1583424732908, 1583424732908, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235914876501757952', 1583500043396, 1583500043396, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235914941307949056', 1583500058854, 1583500058854, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235923884184834048', 1583502190993, 1583502190993, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235923995577159680', 1583502217560, 1583502217560, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235924574667935744', 1583502355625, 1583502355625, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1235940108507680768', 1583506059181, 1583506059181, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1236145362025189376', 1583554995406, 1583554995406, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1236148077916721152', 1583555642945, 1583555642945, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1253698103782019072', 1587739895175, 1587739895175, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1253700808575422464', 1587740540055, 1587740540055, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1253704172348510208', 1587741342040, 1587741342040, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1253744004999286784', 1587750838873, 1587750838873, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1253906808586768384', 1587789654282, 1587789654282, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1253907237555015680', 1587789756559, 1587789756559, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1253907641839783936', 1587789852948, 1587789852948, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1253909286216667136', 1587790244998, 1587790244998, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1253914492945960960', 1587791486374, 1587791486374, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1253947389270691840', 1587799329468, 1587799329468, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1253947536339767296', 1587799364538, 1587799364538, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1254017759067639808', 1587816106940, 1587816106940, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1256812370043473920', 1588482394113, 1588482394113, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1258053558121664512', 1588778316378, 1588778316378, 'Chrome 8', '127.0.0.1', 'Windows 10', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1258053614715408384', 1588778329910, 1588778329910, 'Chrome 8', '127.0.0.1', 'Windows 10', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1258053730268483584', 1588778357461, 1588778357461, 'Chrome 8', '127.0.0.1', 'Windows 10', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1258058401288687616', 1588779471113, 1588779471113, 'Chrome 8', '127.0.0.1', 'Windows 10', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1258058513284993024', 1588779497821, 1588779497821, 'Chrome 8', '127.0.0.1', 'Windows 10', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1258058943062740992', 1588779600288, 1588779600288, 'Chrome 8', '127.0.0.1', 'Windows 10', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1258060665701142528', 1588780010996, 1588780010996, 'Chrome 8', '127.0.0.1', 'Windows 10', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1260981260696817664', 1589476335098, 1589476335098, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1262400702605561856', 1589814756423, 1589814756423, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1262758581233651712', 1589900081313, 1589900081313, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1268198149449715712', 1591196975462, 1591196975462, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1279264870679842816', 1593864287403, 1593864287403, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1279290754627407872', 1593870458632, 1593870458632, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1279409845992296448', 1593898852220, 1593898852220, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1280508657427156992', 1594160829287, 1594160829287, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1281930364704657408', 1594499790716, 1594499790716, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1282293389592760320', 1594586342594, 1594586342594, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1283350664013025280', 1594838416459, 1594838416459, 'Chrome 8', '121.36.158.84', 'Windows 10', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1283387443533451264', 1594847185380, 1594847185380, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1283390256724447232', 1594847856097, 1594847856097, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1283809826446643200', 1594947889315, 1594947889315, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1284131088729509888', 1595024484211, 1595024484211, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1284391196306837504', 1595057698684, 1595057698684, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1285224101962715136', 1595285078873, 1595285078873, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1287739283033165824', 1595884744770, 1595884744770, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1288142100889735168', 1595980784031, 1595980784031, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1288144252806762496', 1595981297088, 1595981297088, 'Chrome 8', '121.36.158.84', 'Mac OS X', '123', NULL);
INSERT INTO `ba_login_log` VALUES ('1288148853337493504', 1595982393941, 1595982393941, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1288149567736516608', 1595982564267, 1595982564267, 'Chrome 8', '121.36.158.84', 'Mac OS X', '123', NULL);
INSERT INTO `ba_login_log` VALUES ('1290322747183992832', 1596500690622, 1596500690622, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294233864398573568', 1597404373606, 1597404373606, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294665303124480000', 1597507236634, 1597507236634, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294665751701098496', 1597507343588, 1597507343588, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294667959020687360', 1597507869855, 1597507869855, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294669089414975488', 1597508139361, 1597508139361, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294669174647427072', 1597508159682, 1597508159682, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294671215344095232', 1597508646217, 1597508646217, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294671478922547200', 1597508709065, 1597508709065, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294672800774230016', 1597509024218, 1597509024218, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294677165153062912', 1597510064767, 1597510064767, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294677271151513600', 1597510090039, 1597510090039, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294677763751546880', 1597510207484, 1597510207484, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294677794214776832', 1597510214748, 1597510214748, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294678621562212352', 1597510411999, 1597510411999, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294679248925233152', 1597510561577, 1597510561577, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294680996435857408', 1597510978216, 1597510978216, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294819007035215872', 1597543882508, 1597543882508, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294847118124650496', 1597550584700, 1597550584700, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294847122184736768', 1597550585681, 1597550585681, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294911706807537664', 1597565983852, 1597565983852, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1294993499623657472', 1597585484776, 1597585484776, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1295001762155073536', 1597587454713, 1597587454713, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1295226010719096832', 1597640919692, 1597640919692, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1295365099623682048', 1597674081081, 1597674081081, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1303500922026070016', 1599613812196, 1599613812196, 'Chrome 8', '121.36.158.84', 'Windows 10', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1304713636224307200', 1599902945939, 1599902945939, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1308423838446522368', 1600787527082, 1600787527082, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1308806780511457280', 1600878827530, 1600878827530, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1309489238613561344', 1601041538275, 1601041538275, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1309898849569083392', 1601139196983, 1601139196983, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1311968925222834176', 1601632741546, 1601632741546, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1314916563723358208', 1602335513416, 1602335513416, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1316011029058162688', 1602596454286, 1602596454286, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1317738286311149568', 1603008264450, 1603008264450, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317738403369979904', 1603008292415, 1603008292415, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317738753158156288', 1603008375811, 1603008375811, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317738933932658688', 1603008418910, 1603008418910, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317739373730598912', 1603008523767, 1603008523767, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317739420144766976', 1603008534834, 1603008534834, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317743319907962880', 1603009464605, 1603009464605, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1317743331203223552', 1603009467302, 1603009467302, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1317743622774460416', 1603009536815, 1603009536815, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1317749094357274624', 1603010841341, 1603010841341, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317749781640122368', 1603011005204, 1603011005204, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317751320719003648', 1603011372146, 1603011372146, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317753843890655232', 1603011973720, 1603011973720, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317754579487690752', 1603012149102, 1603012149102, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317766660505079808', 1603015029439, 1603015029439, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317821363490263040', 1603028071610, 1603028071610, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1317824635714277376', 1603028851807, 1603028851807, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318193286602690560', 1603116745019, 1603116745019, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318193535614324736', 1603116804395, 1603116804395, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318194373858562048', 1603117004252, 1603117004252, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318226586398494720', 1603124684285, 1603124684285, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318886846972956672', 1603282102672, 1603282102672, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318890050443939840', 1603282866474, 1603282866474, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318890261245464576', 1603282916732, 1603282916732, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318890363175440384', 1603282941035, 1603282941035, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318890812112769024', 1603283048070, 1603283048070, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318891432899121152', 1603283196077, 1603283196077, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318891604626509824', 1603283237017, 1603283237017, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318891806997483520', 1603283285269, 1603283285269, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318892072496926720', 1603283348568, 1603283348568, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1318893115599360000', 1603283597264, 1603283597264, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1319264860676165632', 1603372228121, 1603372228121, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1319268755133566976', 1603373156701, 1603373156701, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1319282491147816960', 1603376431623, 1603376431623, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1319282864818360320', 1603376520718, 1603376520718, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1319288430856900608', 1603377847767, 1603377847767, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1319611670410170368', 1603454914052, 1603454914052, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1319838757427482624', 1603509055809, 1603509055809, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1319838763299508224', 1603509057243, 1603509057243, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1319935682772340736', 1603532164637, 1603532164637, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1319936816161361920', 1603532434869, 1603532434869, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1320053615087456256', 1603560281869, 1603560281869, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1320745782894268416', 1603725307520, 1603725307520, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1320747035447660544', 1603725606200, 1603725606200, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1320976424718438400', 1603780296831, 1603780296831, 'Chrome 8', '121.36.158.84', 'Windows 10', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1320976811257106432', 1603780389021, 1603780389021, 'Chrome 8', '121.36.158.84', 'Windows 10', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321062537319550976', 1603800827683, 1603800827683, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321070704355053568', 1603802774869, 1603802774869, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321070930260267008', 1603802828741, 1603802828741, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321071167678844928', 1603802885346, 1603802885346, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321079350086471680', 1603804836185, 1603804836185, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321079642978914304', 1603804906016, 1603804906016, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321080123633569792', 1603805020613, 1603805020613, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321080284610957312', 1603805058993, 1603805058993, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321080467239342080', 1603805102533, 1603805102533, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321080897344245760', 1603805205080, 1603805205080, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321090845381890048', 1603807576877, 1603807576877, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321090980140683264', 1603807609005, 1603807609005, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321091119332855808', 1603807642192, 1603807642192, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321091502121816064', 1603807733455, 1603807733455, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321093095579848704', 1603808113365, 1603808113365, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321095216446443520', 1603808619020, 1603808619020, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321097889975504896', 1603809256398, 1603809256398, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321098444126949376', 1603809388557, 1603809388557, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321099183490469888', 1603809564836, 1603809564836, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321103717252075520', 1603810645727, 1603810645727, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321109311644110848', 1603811979577, 1603811979577, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321113263764803584', 1603812921836, 1603812921836, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321115346836525056', 1603813418422, 1603813418422, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321115554903363584', 1603813468084, 1603813468084, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321118067513757696', 1603814067138, 1603814067138, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321121673960886272', 1603814926974, 1603814926974, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321122281346437120', 1603815071795, 1603815071795, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321122899721064448', 1603815219226, 1603815219226, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321123150502694912', 1603815279015, 1603815279015, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321133113174265856', 1603817654303, 1603817654303, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321133169172418560', 1603817667655, 1603817667655, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321135214080167936', 1603818155146, 1603818155146, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321135442988503040', 1603818209775, 1603818209775, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321135633980329984', 1603818255310, 1603818255310, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321264241721872384', 1603848917785, 1603848917785, 'Chrome 8', '121.36.158.84', 'Windows 10', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321316529685532672', 1603861384207, 1603861384207, 'Chrome 8', '121.36.158.84', 'Windows 10', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321420835034107904', 1603886252540, 1603886252540, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321421035878354944', 1603886300377, 1603886300377, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321421137242099712', 1603886324593, 1603886324593, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321428351424008192', 1603888044587, 1603888044587, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321428521305903104', 1603888085091, 1603888085091, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321428650968616960', 1603888116004, 1603888116004, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321429978490998784', 1603888432511, 1603888432511, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321443965890859008', 1603891767366, 1603891767366, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321445965483347968', 1603892244052, 1603892244052, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321446037520519168', 1603892261281, 1603892261281, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321446217871396864', 1603892304281, 1603892304281, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321446619098517504', 1603892399940, 1603892399940, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321447787556114432', 1603892678523, 1603892678523, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321448504689823744', 1603892849500, 1603892849500, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321448593411936256', 1603892870653, 1603892870653, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321450038945255424', 1603893215295, 1603893215295, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321451739475480576', 1603893620732, 1603893620732, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321452890031788032', 1603893895047, 1603893895047, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321455719983222784', 1603894569758, 1603894569758, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321456361678180352', 1603894722752, 1603894722752, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321459973565321216', 1603895583892, 1603895583892, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321461272453189632', 1603895893570, 1603895893570, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321461993617625088', 1603896065511, 1603896065511, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321462939546423296', 1603896291035, 1603896291035, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321464636729593856', 1603896695679, 1603896695679, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321465586865278976', 1603896922208, 1603896922208, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321470665043349504', 1603898132940, 1603898132940, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321471657826717696', 1603898369639, 1603898369639, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321474703302463488', 1603899095654, 1603899095654, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321477028087730176', 1603899650007, 1603899650007, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321478398513647616', 1603899976743, 1603899976743, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321481699422507008', 1603900763739, 1603900763739, 'Chrome 8', '本地', 'Mac OS X', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1321753975896281088', 1603965679511, 1603965679511, 'Chrome 8', '121.36.158.84', 'Windows 10', '1317718676920733696', NULL);
INSERT INTO `ba_login_log` VALUES ('1322177911746334720', 1604066753694, 1604066753694, 'Chrome 8', '121.36.158.84', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1322192650945826816', 1604070267523, 1604070267523, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1322193465085399040', 1604070461898, 1604070461898, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1322195124511444992', 1604070857537, 1604070857537, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1322196966775590912', 1604071296726, 1604071296726, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1322197220442902528', 1604071357246, 1604071357246, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1322197888369037312', 1604071516492, 1604071516492, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1322199027403591680', 1604071788058, 1604071788058, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
INSERT INTO `ba_login_log` VALUES ('1322200279541747712', 1604072086592, 1604072086592, 'Chrome 8', '127.0.0.1', 'Mac OS X', '1234533425', NULL);
-- ----------------------------
-- Table structure for ba_opt_log
-- ----------------------------
DROP TABLE IF EXISTS `ba_opt_log`;
CREATE TABLE `ba_opt_log` (
`id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NOT NULL COMMENT '主键',
`create_at` bigint(20) NULL DEFAULT NULL COMMENT '创建于',
`update_at` bigint(20) NULL DEFAULT NULL COMMENT '更新于',
`browser` varchar(50) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL COMMENT '浏览器信息',
`client_ip` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL COMMENT '客户端ip',
`exception_detail` varchar(500) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL COMMENT '若异常,异常信息',
`method` varchar(100) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL COMMENT '调用的方法',
`os_info` varchar(50) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL COMMENT '系统信息',
`params` varchar(500) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL COMMENT '传入的参数',
`type` int(11) NULL DEFAULT NULL COMMENT '操作类型',
`user_id` varchar(20) CHARACTER SET utf16 COLLATE utf16_general_ci NULL DEFAULT NULL COMMENT '用户id',
PRIMARY KEY (`id`) USING BTREE,
INDEX `opt_log_client_ip`(`client_ip`) USING BTREE,
INDEX `opt_log_user_id`(`user_id`) USING BTREE,
INDEX `opt_log_create_at`(`create_at`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf16 COLLATE = utf16_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------