-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
3839 lines (3822 loc) · 342 KB
/
search.xml
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
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>29岁,再见!</title>
<url>//*/1873749776.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><blockquote>
<p>我:儿子,你再也没有29岁的爸爸了。<br>
冬冬:因为你明天过生日了吗?</p>
</blockquote>
]]></content>
<categories>
<category>生活</category>
</categories>
<tags>
<tag>29岁</tag>
<tag>30岁</tag>
</tags>
</entry>
<entry>
<title>1. 低代码</title>
<url>//*/2967963195.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>代码技术路线,整体功能介绍。</p>
<span id="more"></span>
<h2 id="0技术路线"><a class="markdownIt-Anchor" href="#0技术路线"></a> 0.技术路线</h2>
<table>
<thead>
<tr>
<th>服务端</th>
<th>前端</th>
</tr>
</thead>
<tbody>
<tr>
<td>Java</td>
<td>react</td>
</tr>
<tr>
<td>springboot</td>
<td>ant-design</td>
</tr>
<tr>
<td>shenyu</td>
<td>formily</td>
</tr>
<tr>
<td>redis</td>
<td>Form-render</td>
</tr>
<tr>
<td>mysql</td>
<td>Designable</td>
</tr>
<tr>
<td>magic-api</td>
<td></td>
</tr>
<tr>
<td>dataway</td>
<td></td>
</tr>
<tr>
<td>es(全文检索)</td>
<td></td>
</tr>
<tr>
<td>flowable</td>
<td></td>
</tr>
<tr>
<td>Paddle</td>
<td></td>
</tr>
</tbody>
</table>
<h2 id="1功能"><a class="markdownIt-Anchor" href="#1功能"></a> 1.功能</h2>
<table>
<thead>
<tr>
<th>名称</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>系统权限</td>
<td>用户管理、菜单管理、角色管理、权限管理、系统字典…</td>
</tr>
<tr>
<td>组织机构</td>
<td>行政区域、机构、部门、职位、人员…</td>
</tr>
<tr>
<td>流程引擎</td>
<td>流程设计器、表单、按钮、流程事务、流程监控、钉钉通知…</td>
</tr>
<tr>
<td>开发者工具</td>
<td>数据库维护、代码生成、数据源、模板管理、任务调度、git提交…</td>
</tr>
<tr>
<td>页面设计器</td>
<td>api接口维护、业务逻辑编辑、中后台页面拖拽设计…待开发(流程页面拖拽设计、小程序页面拖拽设计、前台页面拖拽设计)</td>
</tr>
</tbody>
</table>
<h2 id="2介绍"><a class="markdownIt-Anchor" href="#2介绍"></a> 2.介绍</h2>
<h5 id="系统"><a class="markdownIt-Anchor" href="#系统"></a> 系统</h5>
<p><img src="/images/image-20240109101551889.png" alt="image-20240109101551889"></p>
<p><img src="/images/image-20240109101856167.png" alt="image-20240109101856167"></p>
<h4 id="工作流"><a class="markdownIt-Anchor" href="#工作流"></a> 工作流</h4>
<p><img src="/images/image-20240109102001046.png" alt="image-20240109102001046"></p>
<p><img src="/images/image-20240109102023589.png" alt="image-20240109102023589"></p>
<h4 id="开发者"><a class="markdownIt-Anchor" href="#开发者"></a> 开发者</h4>
<p><img src="/images/image-20240109102152348.png" alt="image-20240109102152348"></p>
<h4 id="页面设计"><a class="markdownIt-Anchor" href="#页面设计"></a> 页面设计</h4>
<p><img src="/images/image-20240109101322427.png" alt="image-20240109101322427"></p>
<p><img src="/images/image-20240109101351478.png" alt="image-20240109101351478"></p>
<p><img src="/images/image-20240109102332963.png" alt="image-20240109102332963"></p>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>国立软件</tag>
<tag>低代码</tag>
<tag>权限管理</tag>
<tag>流程引擎</tag>
<tag>组织管理</tag>
<tag>flowable</tag>
<tag>bpmn</tag>
<tag>lowcode</tag>
</tags>
</entry>
<entry>
<title>Reveal.js使用</title>
<url>//*/6befbd07.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><div class="hexo-reveal-embed"><iframe src="/slide/Reveal.js%E5%B9%BB%E7%81%AF%E7%89%87/" allowfullscreen loading="lazy"></iframe></div>
<br>
<br>
<details open>
<summary><span class="pre-summary"> </span><mark><strong>代码:</strong></mark></summary><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- .slide: id="slide1" data-background-image="./1.jpeg" data-background-opacity="0.5" --></span></span><br><span class="line"></span><br><span class="line"># Index 1</span><br><span class="line"></span><br><span class="line">### 我是第一个页面</span><br><span class="line"><span class="comment"><!-- .element: class="fragment custom blur animated scale-down" data-animated-scale-down-from="10" data-animated-scale-down-to="1" --></span></span><br><span class="line"></span><br><span class="line">`js [1|2|3|4]</span><br><span class="line"> let a = 1;</span><br><span class="line"> let b = 2;</span><br><span class="line"> let c = x => 1 + 2 + x;</span><br><span class="line"> c(3);</span><br><span class="line">`</span><br><span class="line"><span class="comment"><!-- .element: class="fragment fade-in animated rotate" data-animated-rotate-to="360deg"--></span></span><br><span class="line"></span><br><span class="line">`mermaid</span><br><span class="line">gantt</span><br><span class="line">dateFormat YYYY-MM-DD</span><br><span class="line">title 流程中心、表单中心</span><br><span class="line">excludes weekdays</span><br><span class="line"></span><br><span class="line">section 需求阶段</span><br><span class="line">需求调研 :desc1, 2023-11-15,2023-12-05</span><br><span class="line"></span><br><span class="line">section 设计阶段</span><br><span class="line">设计 :desc2,2023-12-05,2023-12-10</span><br><span class="line"></span><br><span class="line">section 开发阶段</span><br><span class="line">开发 :desc3,2023-12-01,2023-12-29</span><br><span class="line"></span><br><span class="line">section 测试阶段</span><br><span class="line">测试 :desc4,2023-12-20,2023-12-29</span><br><span class="line"></span><br><span class="line">section 上线启动</span><br><span class="line">部署培训 :desc5,2023-12-22,2023-12-29</span><br><span class="line">`</span><br><span class="line"><span class="comment"><!-- .element: class=" fragment fade-in animated move-to rotate" data-animated-rotate-to="360deg" data-animated-move-to-top="-50px" data-animated-move-to-left="0px" ---></span></span><br><span class="line"></span><br><span class="line">Note:</span><br><span class="line">第一个页面的备注文件</span><br><span class="line"></span><br><span class="line">----</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- .slide: id="slide2" data-background-image="./2.jpeg" data-background-opacity="0.5"--></span></span><br><span class="line"></span><br><span class="line"># Index 2</span><br><span class="line"></span><br><span class="line">### 我是第二个页面</span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- .element: class="fragment fade-in" --></span></span><br><span class="line"></span><br><span class="line">[打开index1](#/slide1)</span><br><span class="line"><span class="comment"><!-- .element: class="fragment fade-in" --></span></span><br><span class="line"></span><br><span class="line">[打开index3](#/slide3)</span><br><span class="line"><span class="comment"><!-- .element: class="fragment fade-in" --></span></span><br><span class="line"></span><br><span class="line">[打开index3.1](#/slide3.1)</span><br><span class="line"><span class="comment"><!-- .element: class="fragment fade-in" --></span></span><br><span class="line"></span><br><span class="line">[打开index3.2](#/slide3.2)</span><br><span class="line"><span class="comment"><!-- .element: class="fragment fade-in" --></span></span><br><span class="line"></span><br><span class="line">[打开index4](#/slide4)</span><br><span class="line"><span class="comment"><!-- .element: class="fragment fade-in" --></span></span><br><span class="line"></span><br><span class="line">Note:</span><br><span class="line">第二个页面的备注文件</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">----</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- .slide: id="slide3" data-background-image="./3.jpeg" data-background-opacity="0.5"--></span></span><br><span class="line"></span><br><span class="line"># Index 3</span><br><span class="line"></span><br><span class="line">### 我是第三个页面</span><br><span class="line"></span><br><span class="line">我是<span class="comment"><!-- .element: style="color: lightred" --></span></span><br><span class="line">第三<span class="comment"><!-- .element: style="color: lightyellow" --></span></span><br><span class="line">个页面<span class="comment"><!-- .element: style="color: lightblue" --></span></span><br><span class="line"></span><br><span class="line">* 一 <span class="comment"><!-- .element: class="fragment fade-in" --></span></span><br><span class="line">* 二 <span class="comment"><!-- .element: class="fragment highlight-red" --></span></span><br><span class="line">* 三 <span class="comment"><!-- .element: class="fragment fade-out" --></span></span><br><span class="line"></span><br><span class="line">Note:</span><br><span class="line">第三个页面的备注文件</span><br><span class="line"></span><br><span class="line">--</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- .slide: id="slide3.1" data-background-image="./3.jpeg" data-background-opacity="0.5" --></span></span><br><span class="line"></span><br><span class="line"># Index 3.1</span><br><span class="line"></span><br><span class="line">### 我是第三个页面</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">`mermaid</span><br><span class="line">gantt</span><br><span class="line">dateFormat YYYY-MM-DD</span><br><span class="line">title 流程中心、表单中心</span><br><span class="line">excludes weekdays</span><br><span class="line"></span><br><span class="line">section 需求阶段</span><br><span class="line">需求调研 :desc1, 2023-11-15,2023-12-05</span><br><span class="line"></span><br><span class="line">section 设计阶段</span><br><span class="line">设计 :desc2,2023-12-05,2023-12-10</span><br><span class="line"></span><br><span class="line">section 开发阶段</span><br><span class="line">开发 :desc3,2023-12-01,2023-12-29</span><br><span class="line"></span><br><span class="line">section 测试阶段</span><br><span class="line">测试 :desc4,2023-12-20,2023-12-29</span><br><span class="line"></span><br><span class="line">section 上线启动</span><br><span class="line">部署培训 :desc5,2023-12-22,2023-12-29</span><br><span class="line">`</span><br><span class="line"></span><br><span class="line">Note:</span><br><span class="line">第三个页面的备注文件</span><br><span class="line"></span><br><span class="line">--</span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- .slide: id="slide3.2" data-background-image="./3.jpeg" data-background-opacity="0.5" --></span></span><br><span class="line"></span><br><span class="line"># Index 3.2</span><br><span class="line"></span><br><span class="line">### 我是第三个页面</span><br><span class="line"></span><br><span class="line">> 我是一个备注文件</span><br><span class="line"></span><br><span class="line">Note:</span><br><span class="line">第三个页面的备注文件</span><br><span class="line"></span><br><span class="line">----</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- .slide: id="slide4" data-background-image="./4.jpeg" data-background-opacity="0.5" --></span></span><br><span class="line"></span><br><span class="line"># Index 4</span><br><span class="line"></span><br><span class="line">### 我是第四个页面</span><br><span class="line"></span><br><span class="line">Note:</span><br><span class="line">第四个页面的备注文件</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
</details>
]]></content>
<categories>
<category>学习</category>
</categories>
<tags>
<tag>reveal.js</tag>
</tags>
</entry>
<entry>
<title>0. 低代码</title>
<url>//*/725797460.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h2 id="0什么是低代码"><a class="markdownIt-Anchor" href="#0什么是低代码"></a> 0.什么是低代码?</h2>
<blockquote>
<p>低代码(Low Code)是一种可视化的应用开发方法,用较少的代码、以较快的速度来交付应用程序,将程序员不想开发的代码做到自动化,称之为低代码。</p>
<p>低代码是一组数字技术工具平台,基于图形化拖拽、参数化配置等更为高效的方式,实现快速构建、数据编排、连接生态、中台服务。通过少量代码或不用代码实现数字化转型中的场景应用创新。</p>
</blockquote>
<span id="more"></span>
<h2 id="1低代码的特点"><a class="markdownIt-Anchor" href="#1低代码的特点"></a> 1.低代码的特点</h2>
<ol>
<li class="lvl-3">
<p>不能仅用于或主要应用构建特定行业的应用;不能仅限于在依赖其他解决方案或平台上运行;</p>
</li>
<li class="lvl-3">
<p>需要能提供给IT技术人员使用,不能只给平民开发者使用;</p>
</li>
<li class="lvl-3">
<p>全生命周期:覆盖应用和相关资源的开发、版本管理、测试、部署、执行、管制、监控和管理的全生命周期;</p>
</li>
<li class="lvl-3">
<p>内建数据存储:内建数据存储机制,不能依赖其他的数据库等存储服务;</p>
</li>
<li class="lvl-3">
<p>数据与逻辑设计:支持用来设计数据结构和应用逻辑;</p>
</li>
<li class="lvl-3">
<p>完整的界面设计:支持创建完整的应用界面,不能仅支持创建表单或管理界面;</p>
</li>
<li class="lvl-3">
<p>第三方集成:支持引入第三方API或事件驱动机制;</p>
</li>
<li class="lvl-3">
<p>自动运维:提供自动化的应用升级和版本管理机制;</p>
</li>
<li class="lvl-3">
<p>多环境部署:支持针对多环境的一键部署,包括开发环境、测试环境、验证环境和生产环境;</p>
</li>
<li class="lvl-4">
<p>社区共享:提供可供访问的应用市场,用来共享组件、模块、连接器和模板;</p>
</li>
</ol>
<h2 id="2谁在使用低代码"><a class="markdownIt-Anchor" href="#2谁在使用低代码"></a> 2.谁在使用低代码?</h2>
<p> 低代码技术显著降低了软件开发的技术门槛,让更多人可以参与到软件开发中,进一步扩大软件开发者的规模,加速信息化建设。都有谁适合使用低代码技术开发软件?</p>
<p> 从事低代码开发人员可以分成两类:服务于企业IT部门或软件的公司的IT技术人员(包含但不限于程序员、项目经理、实施顾问等);以及来自业务部门,本职工作与IT无关但参与到软件开发中的业务开发者。</p>
<h3 id="低代码赋能it技术人员"><a class="markdownIt-Anchor" href="#低代码赋能it技术人员"></a> 低代码赋能IT技术人员</h3>
<p> 这里的IT技术人员是与“业务开发者”相对的概念,包含但不限于程序员,特指在企业或信息化提供商中,本职工作为企业信息化相关的技术人员。IT技术人员主要集中在企业信息化部门和为企业提供信息化服务(如外包开发、系统集成等)的软件公司中,典型岗位有项目经理、架构师、程序员、测试人员、实施和运维人员、DevOps等。</p>
<p>####整体而言,IT技术人员具备以下特征:</p>
<p> 具备技能:通常具有计算机相关的教育背景,或通过自学的方式掌握了一定的IT技能(如编程语言、数据库管理、配置管理、系统管理等)<br>
考核指标:能否保质保量地满足本单位或客户的信息化需求是核心指标<br>
学习意愿:需要紧跟技术发展趋势,跟随团队和企业技术决策,及时更新技术能力</p>
<h2 id="3赋能业务人员"><a class="markdownIt-Anchor" href="#3赋能业务人员"></a> 3.赋能业务人员</h2>
<p> 在低代码技术被命名之前,国际知名的研究机构们就提出了“业务开发者/平民开发者”的概念。这两个概念与专业开发者对应,专指那些向业务部门汇报有开发能力来辅助业务发展的员工。这些人和向IT部门报告的专业开发者不同,他们的主要工作职责是业务发展,软件开发只是一个辅助性工作,通常不会有相关的考核指标,得到的资源也较为有限。在传统的编码开发时代,业务开发者较为少见,有能力从事辅助性软件开发的业务人员主要集中在数据分析师、软件公司的程序员(程序员的主要工作是开发软件产品或对外交付软件项目,而不是辅助性的软件工具)等具备编程能力的人群。而低代码技术的出现,让更多的业务人员可以成为业务开发者,比如构建订单管理应用的销售主管、人事档案系统的HR、库存盘点APP的库管人员等。</p>
<h3 id="整体而言业务开发者具备以下特征"><a class="markdownIt-Anchor" href="#整体而言业务开发者具备以下特征"></a> 整体而言,业务开发者具备以下特征:</h3>
<p> 具备技能:通常没有计算机相关的教育背景,部分掌握Excel等办公软件的常用功能;<br>
考核指标:能否完成业务目标是核心指标,通常不包含信息化建设相关内容;<br>
学习意愿:不得不参与软件开发,通常没有主动学习IT相关技术的动力和投入;</p>
<h2 id="4对业务开发者的价值"><a class="markdownIt-Anchor" href="#4对业务开发者的价值"></a> 4.对业务开发者的价值</h2>
<p> 与帮助IT技术人员提升软件开发效率不同,低代码对于大多数业务开发者而言,是解决了“能不能开发软件”的问题。这就意味着,业务人员可以根据自身的应用场景,快速构建起对应的软件应用,减少了与IT部门协调确认的沟通成本,在IT部门资源紧缺的背景下,尽快扫清信息化死角。<br>
业务开发者构建的应用主要有以下几类,除数据报表应用的业务逻辑复杂度较高而且通常需要与第三方系统集成,对业务开发者有较高的学习能力要求外,其他应用场景相对简单,更适合业务开发者使用低代码构建。</p>
<h2 id="5低代码的应用价值"><a class="markdownIt-Anchor" href="#5低代码的应用价值"></a> 5.低代码的应用价值</h2>
<p> 低代码开发平台可以显著提升软件开发的效率,可广泛应用于各行业数字化转型升级。具体而言,开发者可以使用低代码开发平台,更简单、更快速地构建个性化应用,打造数字化平台。</p>
<p><img src="/images/e5b623cf911d4b69996bb63cce5b7927.png" alt="在这里插入图片描述"></p>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>国立软件</tag>
<tag>低代码</tag>
<tag>权限管理</tag>
<tag>流程引擎</tag>
<tag>组织管理</tag>
</tags>
</entry>
<entry>
<title>Cas Server 本地部署</title>
<url>//*/1854714444.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="cas"><a class="markdownIt-Anchor" href="#cas"></a> Cas</h1>
<blockquote>
<p><strong><a href="https://github.com/apereo/cas">Cas</a></strong> 中心认证服务。Cas 是一种面向 Web 的企业级、多语言单点登录解决方案,它是满足身份验证和授权管理的综合平台</p>
<p>Cas 是一种开放优秀的身份验证协议。</p>
</blockquote>
<span id="more"></span>
<p><img src="https://user-images.githubusercontent.com/1205228/30969994-e2fe6bf0-a470-11e7-80f9-d54d1e4d348e.png" alt="1205228/30969994-e2fe6bf0-a470-11e7-80f9-d54d1e4d348e"></p>
<p>我在本地部署的是**<a href="https://github.com/apereo/cas-overlay-template">cas-overlay-template</a>** 分支 5.2</p>
<h2 id="部署-cas-server"><a class="markdownIt-Anchor" href="#部署-cas-server"></a> 部署 Cas Server</h2>
<figure class="highlight powershell"><table><tr><td class="code"><pre><span class="line">git clone https://github.com/apereo/cas<span class="literal">-overlay-template</span>.git</span><br><span class="line"><span class="built_in">cd</span> cas<span class="literal">-overlay-template</span></span><br><span class="line">git checkout <span class="number">5.2</span></span><br><span class="line">mvn package //因为本地jdk1.<span class="number">8</span> <span class="number">5.2</span>版本支持</span><br><span class="line"></span><br><span class="line">mkdir <span class="literal">-p</span> src/main/resources</span><br><span class="line">mkdir <span class="literal">-p</span> src/main/resources/services</span><br><span class="line"><span class="built_in">cp</span> /target/cas/WEB<span class="literal">-INF</span>/classes/application.prpperties src/main/resources/application.prpperties</span><br><span class="line"><span class="built_in">cp</span> /target/cas/WEB<span class="literal">-INF</span>/classes/services/HTTPSandIMAPS<span class="literal">-10000001</span>.json src/main/resources/services/HTTPSandIMAPS<span class="literal">-10000001</span>.json</span><br></pre></td></tr></table></figure>
<h4 id="applicationproperties"><a class="markdownIt-Anchor" href="#applicationproperties"></a> application.properties</h4>
<figure class="highlight powershell"><table><tr><td class="code"><pre><span class="line"><span class="comment">##</span></span><br><span class="line"><span class="comment"># CAS Server Context Configuration</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">server.context<span class="literal">-path</span>=/cas</span><br><span class="line">server.port=<span class="number">8443</span></span><br><span class="line"></span><br><span class="line">cas.tgc.secure=false</span><br><span class="line">cas.serviceRegistry.initFromJson=true</span><br><span class="line">server.ssl.enabled=false <span class="comment">#禁用https访问</span></span><br><span class="line"><span class="comment">#...省略</span></span><br><span class="line">cas.authn.accept.users=admin::admin <span class="comment">#静态访问用户名密码 admin/admin</span></span><br></pre></td></tr></table></figure>
<h4 id="serviceshttpsandimaps-10000001json"><a class="markdownIt-Anchor" href="#serviceshttpsandimaps-10000001json"></a> services/HTTPSandIMAPS-10000001.json</h4>
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"@class"</span><span class="punctuation">:</span> <span class="string">"org.apereo.cas.services.RegexRegisteredService"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"serviceId"</span><span class="punctuation">:</span> <span class="string">"^(https|imaps|http)://.*"</span><span class="punctuation">,</span> <span class="comment">//增加http访问规则</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"HTTPS and IMAPS"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">10000001</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"description"</span><span class="punctuation">:</span> <span class="string">"This service definition authorizes all application urls that support HTTPS and IMAPS protocols."</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"evaluationOrder"</span><span class="punctuation">:</span> <span class="number">10000</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
<p>以上操作按照顺序执行</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">./build.sh run</span><br></pre></td></tr></table></figure>
<p>打开浏览器访问 <a href="http://cas.simple.org:8443/cas" target="_blank">http://cas.simple.org:8443/cas</a></p>
<p>Cas Server 已经 setup 起来了。</p>
<p>明天继续更新 Cas Client 与 Spring boot 集成,并实现 Cas Server 的用户存储数据库。</p>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>spring boot</tag>
<tag>cas client</tag>
<tag>cas server</tag>
<tag>sso</tag>
</tags>
</entry>
<entry>
<title>4月份wbs</title>
<url>//*/c2cb16de.html</url>
<content><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="糟糕!密码错误了." data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">
<script id="hbeData" type="hbeData" data-hmacdigest="9f5b05b711cd8d76c78f522186c670c84ac386564dc4d3dd96eea637bcd65112">89730641517f40fad9fb11d8e72e80bf06c939f51e30e9318348e356012ae93802623e7e7460999b3f7e8ba755c0d29599ae788f4544e2d8c77419f7d87eed449b7d6813e006fe13f540d0d66182fef8c50ebd9d211e40be206647f7e00fd685b86946fa705ad4651c18ab2a320b4a69699ab0980126725a179cb3c64faa8f2509c4dddd4adebe64d5cd4207643b74cb951ade33149cd6cd51d669bce78e7df026fe1abb945332d7c0a9e2f0c8bc51b46617f418a10ed53af1ad8a5de091ee7b9161a36c5a28454693301b254151eaad572fe3718480827cbcb2b29cbbe2dd52029dfad21eac08db5c648820175597abb4a0c5ff69693595d1d3fe51de4c4f9c4194b77a63e7b407560fa73f56328d3cbee56843f26b4272acb3eeeaa0e46d01b15f88bbf2f997a33ad0e4769faa2f375c06bbd0f0afbcebbc908a2fe4364deaf4f72f036cb807ae265943182dfb5bbe20ddce9924d0b51c7a7b667d702f15bb01847cd66970a3280b2ad672ba9f970f36becada1fb6c8e16bd97fe8122bbf3617184d08ec68939ade86ad83698f447e1f8119d12295fc3d4506a7f5c99ef3a9c61fdc9c7b558de110d0360dfc88ea84b02e20aa9564467bafa4dca79e88e11cd567128ef4bbe395ebdb7dd9a8279f3e3d0260261d41878b90418135fe46e100ca78ecd0e6f9753c5b3757cf29d0b71e2fdbb08848b51c8b99cc109c2cd80cbd34c9dd34e29906c0df3351353120fa9e045c94e232bbbe462fd3aab6fa3351bfbd857bd1eb32968916d6a12703c290f9e28a3b0b503d538f8358b8e007c54ca591c8e8dc7540724a58eab4f1c5845f1e27b76e639e78d17423b1c806f3f41f18bf176afd62e13d0b60f456b223e3a6bedfe2007cd3557d5fe8bdafb5d452da0979e169a72f8eed5208da7cd82514d85837708c9842661acf486198d1d3fcd7bab421f49fb1f86ae7662b96e9e5f656d07e1710f75d35653efe19fd03490f624429b157ce990fcbdfc3cf1cb28697b2807e7ba8c5b9e242a5eb24cf16dc2751218784374d3b196f02f34fa64e52c94c04f217aa44574ef1fae4936ddb7b4a05cc1cf83ea7fdbf441589da61a168e13fd51b40e20d634992fb5d5e35223c18fb1fbf87aa2e7db1997cbf592aa24f7683913436b1d46f5b3ab51e0090f1c0988d95608244eed85b8fb0c1857424b0c502613f019a0de482a242b703f14df8bfcb26fe1ea62de73cc826452ef10e4673714760da97f3a45f1fbb6d72d8527c8e54fa48bdc6020cb1650742e722d99df070303ed4fcfa1281d0dcf35a85543af3b578679282168877d886854c0d8593cbf17a6bc8fae57b6d05d459ee9b2f911935474562741036a9d1f71e0367f428cd770adebca9d7b96a3209ebb67077b79065f7b7566e28e271b9b7df3ec1d40f1e15ce6a84e248bf91e1606d2157bc2a93e96e9d2fe9d7eee2d2ce4e4a90655e7c3e09c4398a3b8de17623d2ad576b168d4d7e2de9fc0a02c08fe4a9ae5302b5256d940e8ae37a7d0c95a3b7833bb83423f6dae16410b57b7a667809fe58203e109f1fec151b082ce61596d5c2d445a342cd738f0f878a460d41dc7d971d2b6e2637eb8d10430129a0e356525eac5e4b1d8c3e759633a4923a07446397e206d511f8c66887d0cc9b8c00fa7a0eeb39532e65fc6bc7a9827bd941e38b775adbfa03d7adeb50d47ea4eccf1ce3b3445932dc111e56282f775d8e6b610c536824cced3de1f99519753e4eea4d32afbb4e3765a153887c7a16e3876072494702c179af7d2e8bdce142374c49ba16d0d8ee6d0d5121afa1c4efad18b5f855cb0f3e59160bde78ee21557ddc006808cf391dac622d5aa9d21ddfcfc0d6bce9e560b576a63a32c394a7dd4a4ed8dc1504f9801e94da547d4c3f44a8d5611703f3c9a9c2bde310dfc158ccce17413832b106234e8c2b6af7b2a6131ea8c727452c44ac37a49a0e6a26c4c46c9eb337e7033aa43ca37d338f100a06f5891b6a194581a27fbc11a251b1b7ed5d3228afa6ebe78d6ecf26277a6dc7b9ef309191eab42826f2daf2641522510e0357b64b1c25d4f1bab2b57d98caf3569e9252a05755f0de3a0d27216fcd07cf40de7fad8fbe70dadd3c557ca6d302313391b7a6d6b8bb0b8248779cb4b9bb0a3d23daa00fadb84f9ba4d53d7639463d02cb1886f98bc82e71290b7ca9f3cc6e476ffa6e1b2f215e843e4f7a625bdefd3a3a5687aaffa3bf2ff4a467924844fc9e0fb66bb488f722a7bc8d6ac4d90a795dbb4d5469f2a98ef64266e47f5aed1cdbdb94bdc21bf67d067552fba6fd551cb0f3a0521b12993b98d55577acc10c71730ad10712df52fc28710825d53e5e59a3ce0c21ef68f7381ae6c5eb84f906ac9ae992cf374db7a44594486e336e21c007d72b29f569054bf1c5e1277491a02bb54373351b12317bd174c46dd64bdac0dd6b542f92cb6f9b53ba9ab5ca2fbf5cba495c1f509d89661f18c83ee2b81e3b26ba3c777c8e12bf05e528028f991b91756cd3f609ed9cdaa000286ceacaa30c1fbdc8903674aa31d0ec1a2a5091c20be91a01e1af4bdc7c26a90661b8df6831eb5a9b5edbcf81ffbe00dafd370445a625bde337f12df1e4722a097e4557c6ab79404fb0f543ee1864fc17d9d6e1e1d96f5b8f89ca5601231c6278b468afc3dd02012006c95039eed28ec36687d32ae2ad1fded9026ee6deeda4281a05d6e511ce7f507318c03a8b0396613a3d566ab2498c6bcdb5fd285efe03341ca6e97d64f78fc767e6ef328b82bd8bd449a4d21c5b01c60650aa8d19f88feb1df7bf40f8c70b352437ce1b85fd0259de9951dadf82e1f828f8528101b59b5fcfb2e6caab15d3bf75f8c857d420cb04368ed96d3aab6fb58fcd31ee46d88bb64ccf50b84c4feb967d1734c944e71f76b6f01e2df5a445489ded42edf740c56a4a29e7ba771b8e8800a6c3e8e68a726458d62fe06f1d5f527394cdf7e8d9ff54bf0f007f607a05abc2b2af66f81c9b161fa426f93a70a35baecbe682d9d3d9e91ccf6eb22b992b0543ab56a89f223ab734855d7b809306b00b252125f2ac34a6b6635564f2d203121a1a16c4347a686a95253826d04993d96933c3570742c862647a9c32281ba94491fdb54734dcf438c7e357013318c25cd18b781f5a1282adb3ef0827047c1de9edee3258c3a5f473447e96206663b668c09a5fae2324a306658a2e13f45e23fc6a61a6b7f5736ff2e0e1232779c717b3c0006d71b4907f85284d9a267fbed7d4d8643921ddf5ea6d4402ee96b07b446071adcd91d577d8e5104133f49c115fa293a829b5d34b9d27606a1f480f7611b8d8b7c441bc2caf2cd5c34630cfae78d3240981df2fe2969015824231c98ddc4ce3991f85268bda68e12e1604fda7132e7edb358d7af6f62a2184360dfb5e9e67f0442aa685e753a068077897176bf6fce3009c54c0d1c3b2bafcc9f2311a6978e515f81bd97781402b40ff0ebf8cc7ffaec3e8eccd5d0352108f35a8586d119d4f19533a63851e1e231e665d87fdccc613e744fd03f72367b4810ebf6711862e09ad287706716a29ff512b61b5c72548b6a3178af5b5f4ba3929961bc7ee009f6f4d5bc94b1a8c6b9537cc4a64a53b77af173968fcbb5853f5c75090938a55de4a60c733ec065dd3aaa94817ea389493f4c6347a6e663773b2c01d766be76ec60836acc6115e999c9ea9899c12d6c52a811b382751e1c5ff84bb0e6316ddf12254810ee183d1c66593ea8fd76d7142af7884fb951d930962b638d586f967994caaa189e6f156155e8ebeab3072bbc8da26d92dab7d6f59333b7250f34244ef858827785f6b1ef8bab94285b911e4f894b9f2ad13706656b6917137c70eab8af371af427545fa207029377e72bb7bbc4b76b4275b944eef5150cee1dc7a8bb5004b293a82f2bb7f8b3d671e090287a72527e623ed1d039dfde88fc488c93d54bbfe463cf80e540ad4a96766db1e00485c2d663686af4c7d4b21b47fbdcb21d179032b69a35ac6cfeb8fe0c75b36c2c33858a604528328940cc43024dce297d9270f49ac2c9ff8a688e70022b9fd64f461edd3221b624ab97c10cfb9b95c40daa28d8e5b502da68d569dc2596e941d9fb631884325812bd91077e6472df0597f883984270d6f0e86bcf2d64b218fc4e02ff0bd33097da63dce68b5f55f98f2a60c2b9dc9bf4b247d800246780b65300640f0683b69b0d8cf48b50d3511c51238b055d8f0b6d3bb2c4552425f40308f1aeb5341c848382e57a3f9b364529a07c5fe773106ce13b4cdd0fd163564d0c4f3a9781c132d1e5bd9714b96496aa33db1749e25c66e5f954e2e1102e58c331cdbbfc7aa735abc6574e47862afe28fc4ec72e0a2995a525cacaa2b9cf61e09462f3b4e55068d331fb33f8869b179995a1261f5b9d92a1a37094919a5e953889c677c3293ce519910fb80bd21c28a870bb9330a66f37060623cedb74084084726b1c4edf8bab5f9190b1791fb8d8a76fb6c2d84d9814ae33c456d5138d9806cfec8205a41192c5bc227a6f615afa70fe2dc719ad26074ee8bb2eb798ff7eb3de39a2488fcfd609632ac32a224802930f62d9526bc0ef5ebddf82af05dc699763da36bc0309a6cf0b9352f4a9640f80bddfcd6e2b4db6974a6e2923d08185147c28f9d41b6e01a244e5948d5fdac9611a700aa0e1ed93711f21cb974a5bb9daa598bb19b23595b01e93fc9f4572c41bb126da96373c089083599ec7ca64e4aa75be9b59447f0ca80f6c385bbc01116f456e0fd389195ba2ef8f0a23769d35e108740d7bdae7bddb242aef6902be760d7299b41473e27ae7c3a3a0890355a92f294c2a463de8213ae61e7ea01e9f00ca6892898ae80e373f988fef69fa6b5594930632557d39e44b8a0658b7ae1451b3174d0e544d7346281d8fbbcc49dd7c7cc2b2f1f2a4d56dc09d252ac2a1bc501af1448c6e0e18fecf58da2e7d70da702d2e0363e162f18eff395206ab655321f815feb0deb6645ada785bc8def166813a644cd7e41dc591b6563fc296ddab92086cc89d621e02a80ad04d9ee302aec4ff17a9482a9c384e5f9135e77b7dabd0c2d9e6c76c97444a196311992e7e695c39693a05a119cd1daacc4ef926f74a0a19cb92165680afd79154175c0febdc17764bec76b279838f7e67c3023c5243fe94d5e0628375109e36377b81ff7e83023f2caf5a7100bf9fdbe8ac70fe6c89f8ae21923f6b0e169fd216b67a9a8e4d96d1f64b0aadb55fd872fa8b701244287f4946d5503adf83b82ff6b8246486a49508b4b9460aad0134f423f18693b166551bb20323a608180e0eea9342f08c048ceea25f855cccfa63b9ba0634e8d70220e5a9bb27ae6b8d7e499da8cf2cc721e159477b92b9cb9fd7bd14502ca55fa4a621643c7ff11e98d59b3bb5dcbe0f510754d143fad2b6c07aa243cbf46d8fec8eed3b29509b46041db1bf224143194356d5762914bed7d3eac7ff64a88b94975308a5983d1b22aea5f9f40d4f44f0610c3d58b8a9827b039ace5f4c74709979919ccd8165a57ae3b1f25e9118320b6842dafb527f6837c7f579e041e9457750c8b1beec33efe7fcc891b57e46d4f5fa1f5753bed0bdfadf56eb337d8375972aeec844d58f9126ad5ede92d62e3c6b7ad7f611d6cd5f9aaea486818c77f2cc32d4d2d6875467ec557603399e7fe82fedb8475cc24c113e56457617be85964e49d61973e5225039d404fb6f25d635868216376ddc309f3f42034a85a5e2863ca3bb8ff6ccbc2db92b08b010124b076e58366cf87d1b51128ba2947366a8689bc6dae386b84257a69af3a89db0ceb6073c6cb967a218ac2b34eaa2cc60541dad6303f3122102940be39f493b1f5a328874f6fe051c6d385e456b56e9d6948d3859f605582161e61671e351b384cac4a5826fa7fffbd9b6f667bb26c5924a1734f65ce32c4af3b0d4aff9c245cd7c450f14d234d807b05a6a5533be2bd0fd4a238de55fc63908e25af6f85d60ee235121e8f6a6b4f0d958191ccba30364949e159ab6700438e792e49b1014504e63fa705384da67e092964209481999aac14d363f423fdcedf518c50ed77e57d57fb5d44b17fe8bb9a268fe93cf4becde42c9a6e7286b463ee513ac8fc2403b165d362ba98926455282dedba38dc75206f56a09d3b0f3fb913c03ba333c7aa9289039634599120c1bbdac9618218c63a6a10e35ac9664f868adbf7b4ee4263aa3434e32dff12a01f9848c2e3774d177d7498533d4c9b17c329e401742ada870b03e219eb5405d9634eb65580243fec5ea4ce4f9051d174986d377b861c9b6dfb658ef52bbf3fdb37c0cf439f303430618b30f295a03dab8b04e36d1b2393e01ba06efd4b794c9f9703e720659c645b6b32f0a43adf18aad34df5f564e3a2f927f05d277ee323ea13bf3ae14996705c003eee829d81a7e1c733c35bca73dd548cbd5438111f4a682eb92a1cd2861a2c6206eeb8f3545d6e22fa9a7216307570d3eaa0cadec58ab32b7c3ec7e91d12a7d37491abe8f0307daa42af63f2a9b5d0c5fc4b16cc9aa6e4d1f1526b5b32db21ce991186f56a45c14ac4e8b837ca709e908f36f1950fc181e8fc198173adb6917ea9245d1a7819fe4abe881606fbc21079fc392cb9fb1240538547836967eeade86619f592cd56cb8e0c3e97ddc1bc604d364c188c79c364f1b3822b9ad667f0396491b2e430ec617ac93a863bf75de6f8410afe400a3242f8778607b90b9def2dad43256a766d01d5875714d2eb937c943875397dbfc205e921edf0f9971310229ad9d19c8f5bb6ab5b0d5e71f2dfe916ec432a59d74de498e39ba84627d4805d0280e4b472aa4aa61a4522a16e73cd6fe4ea0456a36d1d5ba2d6315b9bc30029d06df180f9820ab66a39ea04d769e0738b3206491c6035dfa60c3fd5438ef5e2380ea72fe409e2c12a84a2ad041d8fb97ddfc585b2bd62dd100d27495ec2ee510c14560816a3eb5f910df81f5f7a15593cb23561406538b438fdd63e661c11423ddd06e2e9a28724d92efeba6be1ffc3b6ff0dd25327864efa3279870956e284686386771c117818881717b507ee828fc0de5dd4c71a88c67fa24d856fbc188da664a59c9aa379e8831b6900ddbf8b696f1dc7abb361e42290c8a55e7401afe89e487f9269b5af8e7cc0b2101c6b7de40ef2f8b9473dc88d38e5d3b761d893f595ec1e8ac264033fac65641631bf802209ab292af69ff1df543b2b6df2ab46701a109b8603455787802cc23681839c92c59484d0c53be11944cefdec685dc65feae1611ddee454d94800e69f8353d52fc5f7d496d1d38681fbbdf70905bc23392872bcaa09f787b2e450c485a26a56deb94eb0f4667e299a06d6653ed8e59fe9ee5db8fde53399bab990cf417d8a61af3009bf44946b2f2fcf06d5f2fbda7c6e74174f4309ea4a9d50172a45b9444d96d7eaa46ffc16c3f787d670bab222fe03419bf27029e9cacdb0e8b29f2623aff1b8f45c8063fe7f5a633e302d87aa10172848c42969ebb4efb00e84bf03019feccb3538f9ff18004662ce1b4fd0aaaaa3a8cac1d45c8d36667892542db38e5d70dde98d1d134024e330d7b7fd991b7d1a9afe5b145486a8eb0e7f8761f9593edaba4ad95abe89238c3ec9f1166f9dafa59801fae06c9e93a2f0b9ee81853005ee3363a9b44d4f6d43d55d57fb1a3b5704433cf0f307345d832ba721c0e2d8c81400773e7ead18c85ebcd5210e536f3bbef12a84305f4adc3057acbcdb249f95968fcc0bd7d8780e36f6a4451a8a1d65ebf32627c00c4bef340247acb7280866b0e3404614dcbe67ab8a7ff75d63274c7d60b968e7a17052ffabb991f1c2d08c1e1a164495ee28edfd60f5012ab2f58acc895b3a66ce0702a401a1d9cd12a684a4c9aa46e118663b261118eb24d7daf933cbe8dd5488f98e0e735bcf21a46c91f01c4463ae7325a94e98ebd438c2ad0711182fed297a5fe5b32e6e47f3bc81ab8f4c2e7d91d40e4c46934e91907d06bd5c465e1cfb64954d631aa94ec3e17607dc18ce1d079d1e0a2edb76daefcdc54e35ae51844e034fce1b95945c9b0052b42dcd9f88b694dd4bd9cfbe65781a6e7083621e638a91f4bb006582a1c6a3a9a181a4a2b35569ddd1afae6bbb40c232ce923890aab5d0ec0dbb953b73c24c7b7ee817f9bee7c14b8dc9062a9116ece55eacc1289824a3392b4193b64f32bb776c16e858099326205e3d162729808440741ceedd8469e93ede590d72040171291dc04bd91db995e773eb30348b3d20cf423a37b3a21a61afda389c839b2ce600a009a80895e8e5d21b8dde91cd15f993c4bca4336251c82c3189a404b31570b601ed48312bbf325fafa46560b267e24d433bd74a261bf0fdd0fc547a45a8fade0ca30266a87b2800a76ca19ef3115ed6bae63831093cd5c172c50884a9508ec7a6096a1b875793f70d6a9b6f333ffee54b540be47c5947b2744bb1b205f2a74ad4982bd6eb43acdc680e591c5df85223130640942182028cb790a015404fcb2559fa0ebe3603268b83c94df857d964aa43c2ab694b341c62e9cb58f832b239ccf0dea16b9bfa989328506a6ea581310c8c36bc4a2b57460259b9ef98217ae1ddbfb233026ffffba6d5ec3f30b5ade5f6662f1c70ccc7eb12f2f094b8aadde8330ac6a58f826d523bba35faa9fb5239d47ea83fa00a8dec1dff252e8fc34945ccc465a1bad9448ca8c7531189110fb013fbf74c5acf46a939ae85fcac9b78c66f6f7d422cdcf31e6dce85b4732ce84d92f47df0fadba913893bfb44be710a0bff640468bc757503a49ab173aca63f0e43dc2f5e801fe09bab571ccabab11e43034c1dd41cf589483959a555f4dd5248cd945aa8f708be5a0df488bf9beaa66a267cb030ef2a419b5f7b21c4c0a70f030f61bd46fba808f0237f1a399fa3801a0eb183622fd9c2cf41cf4dc36aefbbf2d6a7c8341ff47b8f9de6c24648c5ca0291e59131c2e56ccc0ad9d79e0185f2d3abd86568b6dc83503ef31423c7e1f6888e677f8626c9ef0d087764a228cb864261f7e7a4f178b5609600c658ee7deaacfc23d8df20a0de8704ed71d29512315005bc6ce0318baaf843ce6fb2ba96c576be0acf7308044fdfb4b156b0c81c2613e28c064a334b02cdf45b6b6432438b339e4a0d90f9c9b3543772ce72c651af7379699e51aa93177bc86adaa6763494e57cd128300124b5d31664c8b6178e3f439ff3c9e8b6bef389cc38df6da2d5f0186e09097c0d6d325c7e3efdefee2f84ed521cfda5a88294244ba07573259b59fd58e19fdfb2753465c5c75c70a50a590440bf759bc0ce4546fc4675af494fee28954281fac9507ee358fc29c27ff3860920aa9271d0cf93e10ab4cafcd9d9c84e0c293e9d84c0e96bfd2205448e1f5975097c15fec2036a3f423f403dcebf0c8397f15503db90e797c4df07128c5f08051f8b6e04269a7534e366f2556358828afb510ea9c02aff3b99056f7622344066ad446ac0fb3bab874efc4b3b371effe9213f68f1fbfe68c1500ee7cd941a49fcb660d3a42abe23c39069feb6230c937e882c15384df948c7a22f560876d34d5740e7a201515de1c80c9e2c935b621547d2c5acfb25313d8eb8608b8e2a6bcdd460294962fc833990d40d9f199f56c567a5fe37a6ff45739210113d465822bf1cdae63c8b15c9eca8fd15080c5ceb5547fa3417be44c5d09a8f6a9f1d4cd6b85e51fd6d71782d1dc39f304743f564e0bbfe955474b171cf874d3976a75d323ab1bb84a162ef09b1b56aa708b468e190f1f4de321250667e3f1f70e3218cf194621778993036edfaa1d665b6d562d8cb973ff07cf1930b6056f4a0460f855f0771ac0e5aec0f5dcc28780e8c559b0a0133173c31c6e9852ca7bf3e93cfce4562857635ed80c9b74c3dd08967cc01ba0cb91e56373a21329dee4ed48e17884381cc5026a85845f4226cdbd1e79fc99fd954944f52386e0c59ecad2867b39795be69424933a58f4720b75703a8bae2970ea8be2fd447f26582520955563b6d5ff950794afba581c9354813e7c2b78da8419d5cfb8bcb5807f2058c8485b07c70dc0f547f51ec37df7cdf869ffcf1731d59e175f09f06ffbf8b16bba439f4a185fd40d64951f1622f296dc84c83b30f3efcb30fa33aaf720d1d690f409fda1fd5a9087d048028afcefda712b67d27c49202f8b21cca438d5144832c8f09ecb4f51ecce15e02d011a3c6a078b7bc050c6ef3100800b4856ba751fffbd3ea94335d8d95879046dc97241be521fa198103b82f5d4767319de5bcb3bebfea430481e72e6c2aca4967e3b798d1a6e944db7a93a65ed52d05e82f528d071a673238f6ca0e6d7da4022b20207db3bd2019dbeaea71df423afd94f09bf6980ef354a3fcba866c845079baf0dab62705abe94319921085faaba8a023ffb547b6ee369184e47832a7598bf327721a25175549bee2c92dd7167d34ed1bea37b965ec209181472f51e0c4964907cbf450b8637295dcf4e9ae595b0e3b4637516d8575e8b6b4887276f398e26db33dd49fc5d0707ea9ba64bde9ed179d54e2d6d68e9ad6b3921f9b57dcbc191687608f91399d68b8c9c91f43f1722a0bdad8ca2a116f7efdbb2b5968ad29735f443b2ed47be93b6c976657a1712f9016c0ec0c33bc2e8023d1f0f9cc77f021f6966483b1efea619eff7c7f37ec935e6a8b7fe0ee0ed830df96922a61206e3e7435abc2889643b6c8400c4ca0920f2c91b5e1de5a6fee6e0c462271ea402ae25ef9314fc5682109b074577007345edf02b4f85f074b8463e633a6d4b5f8a4127d2a179942c79d000d20b8b76bc4e1a57c10dc3d08cf2dc65ab969b26ea249308bcf7154655bd10234b1528a0e500da85b8f55f0280ff6c09099b4088b0054ff4381a064e5cc8dc52f0902b02608f5cbb1a2acc8c38c3d3483f462dae09d48b73acc8f88c611a387ad42e95504c4a41e2e814fdc66cb0abc5f692e3c7ed224a9f7ef03882ee8ecbc254131785696cbed509338bc1a57c2b3a46065491353f65c8313330c11bf12506ed0d0bec294f8fc544bbbaa4143de0c4581136fc2c36e540a6646c38ce2dcf621ac0a8b8ba96c30d209c9</script>
<div class="hbe hbe-content">
<div class="hbe hbe-input hbe-input-wave">
<input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass">
<label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass">
<span class="hbe hbe-input-label-content hbe-input-label-content-wave">输入密码查看内容</span>
</label>
<svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">
<path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>
</svg>
</div>
</div>
</div>
<script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>wbs</tag>
<tag>项目一览</tag>
</tags>
</entry>
<entry>
<title>gitlab & OKR 进行项目管理 </title>
<url>//*/2050102104.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><blockquote>
<p>本文章围绕gitlab 和 OKR,使用gitlab已有功能,进行项目管理、问题追踪和开发流程规范。</p>
</blockquote>
<span id="more"></span>
<h2 id="需求管理"><a class="markdownIt-Anchor" href="#需求管理"></a> 需求管理</h2>
<pre class="mermaid">graph TB
A[需求池] -->|产品/研发共同确认| B[需求分类]
B --> High[高优先级:high] ----C
B --> Medium[普通优先级:medium]----C
B --> Low[低优先级:low]----C
B --> Trivial[微小改动:trivial]----C
C(需求队列)</pre>
<h2 id="版本管理"><a class="markdownIt-Anchor" href="#版本管理"></a> 版本管理</h2>
<pre class="mermaid">graph LR
A[个人开发分支:feat]
B[开发分支:dev]
C[测试分支:test]
D[预发布分支:stag]
E[稳定版本分支:realse]
F[hot/fix分支]
subgraph P1 [分支管理流程]
direction BT
A-->|合并|B
B-->|合并|C
C-->|合并|D
D-->|合并|E
end
subgraph P2 [紧急修复]
direction LR
F:::pureRed -.-> B & C & E
end
classDef red fill:#eeaa9c,color:#fff;
classDef blue fill:#93b5cf,color:#fff;
classDef yellow fill:#fcd217,color:#fff;
classDef purple fill:#e0c8d1,color:#fff;
classDef green fill:#0f0;
classDef pureRed fill:#f00,color:#fff;
classDef pureBlue fill:#00f,color:#fff;
classDef lightBlue fill:#2e317c,color:#fff;
classDef lightGreen fill:#a4cab6,color:#fff;</pre>
<h2 id="里程碑管理"><a class="markdownIt-Anchor" href="#里程碑管理"></a> 里程碑管理</h2>
<p>里程碑可以是具体的项目、要发布的版本、特定的研发类需求…</p>
<p>里程碑作为【售前】【产品】【研发】 【测试】【运维】目标(O)</p>
<p>根据目标来拆解各自的KR。</p>
<ul class="lvl-0">
<li class="lvl-2">
<p><strong>售前: 跟踪项目进展、时间把控;客户问题沟通;</strong></p>
</li>
<li class="lvl-2">
<p>产品: 跟进项目进展、业务答疑;测试跟进;</p>
</li>
<li class="lvl-2">
<p><strong>研发: 完成既定研发目标;项目进展反馈;</strong></p>
</li>
<li class="lvl-2">
<p>测试: 测试方案推敲;</p>
</li>
<li class="lvl-2">
<p>运维: 准备开发、测试、预发布环境;</p>
</li>
</ul>
<pre class="mermaid">graph LR
A[Timeline]
B[里程碑]
C[看板]
D[OKR]
E[Bug]
F[发布上线]
subgraph 里程碑管理
direction LR
A --> B
B --->|个人OKR拆解|D
B --->|bug关联里程碑|E
B --->|日常项目看板|C
C & D & E --> F
end</pre>
<pre class="mermaid">gantt
dateFormat YYYY/MM/DD
title 项目一览
excludes weekdays 2023-03-28
section 需求阶段
启动会议 : des1,2023-04-01,2023-04-10
客户调研 : des2,2023-04-01,2d
需求整理 : des3,after desc2,2d
需求报告 : des4,after des3,2d
section 开发阶段
需求分析 : des21,after des4,2d
原型选定 : des22,after des21,2d
代码开发 : des23,after des22,2d
内测 : des24,after des23,2d
section 测试阶段
部署 : des1,2023-04-06,2023-05-08
客户测试 : des2,2023-04-06,2d
bug修复 : desc3,after des2,2d
问题修复 : desc4,after des3,5d
section 上线启动
培训 : des1,2023-04-06,2023-04-08
问题日结 : des2,2023-04-09,2d
问题修复 : des3,after des2,2d
发版 : des4,after des3,2d
项目验收 : des5,after des4,2d
section 运维阶段
问题整理 : des1,2023-04-10,2023-04-20
问题修复 : des2,after des1,2d
发版 : des3,after des2,2d</pre>
<h2 id="工作流程"><a class="markdownIt-Anchor" href="#工作流程"></a> 工作流程</h2>
<pre class="mermaid">sequenceDiagram
Actor A as 售前
Actor B as 产品
Actor C as 设计
Actor D as 测试
Actor E as 研发
Actor F as 运维
par 售前解决方案
A->> B: 需求调研
note left of A: 产品和售前做充分调研、客户问题跟踪、项目进展跟踪
and 产品 -> 设计、测试
B -->>C: 原型、设计评审
note left of C: 根据项目情况是否需要原型、设计
B ->>D: 测试用例评审
B ->>E: 需求评审(拆解)
par 研发 -> 测试、运维
E ->>D: 提交版本测试、问题修复
E -->>F: 开发、预发布环境准备
and 测试 -> 产品、售前
D ->> B: 分支管理、版本发布、交付验收
note left of C: 分支管理由测试统一管理、测试问题跟踪、内部演示验收
end
end</pre>
<ol>
<li class="lvl-3">
<p>需求分析:首先,需要了解客户的需求,并定义项目的目标、范围和可交付成果。</p>
</li>
<li class="lvl-3">
<p>规划阶段:在这一阶段,需要确定项目的资源、时间表和预算。制定项目计划,并确定项目的关键里程碑和交付时间。</p>
</li>
<li class="lvl-3">
<p>执行阶段:在这一阶段,需要跟踪项目的进度,分配任务,并确保项目按计划进行。确保与客户和利益相关者进行沟通和协调。</p>
</li>
<li class="lvl-3">
<p>控制阶段:在这一阶段,需要监控项目的进度和成本,并及时采取纠正措施。需要定期评估项目的绩效和成果,并与客户和利益相关者分享进展。</p>
</li>
<li class="lvl-3">
<p>收尾阶段:在这一阶段,需要完成项目并提交可交付成果。需要评估项目的成功和教训,并为下一个项目做准备。</p>
</li>
</ol>
<p>此外,以下是一些有助于软件项目管理的最佳实践:</p>
<ul class="lvl-0">
<li class="lvl-2">
<p>使用项目管理软件:使用项目管理软件可以帮助您轻松跟踪任务、资源、时间表和预算。</p>
</li>
<li class="lvl-2">
<p>与利益相关者沟通:确保您与客户、团队成员和其他利益相关者进行沟通和协调。</p>
</li>
<li class="lvl-2">
<p>采用敏捷开发方法:敏捷开发方法强调快速反馈和快速迭代,可以帮助您更快地实现项目目标。</p>
</li>
<li class="lvl-2">
<p>风险管理:在整个项目周期内,您需要识别和管理风险,并制定应对措施。</p>
</li>
<li class="lvl-2">
<p>团队管理:鼓励团队成员进行有效的协作和沟通,并激励他们为项目成功做出贡献。</p>
</li>
<li class="lvl-2">
<p>持续学习:了解新的技术和工具,以保持对软件项目管理最新的见解和技能。</p>
</li>
</ul>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>gitlab</tag>
<tag>git</tag>
<tag>okr</tag>
<tag>项目管理</tag>
</tags>
</entry>
<entry>
<title>Transformer模型</title>
<url>//*/e4b8a22b.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p> Transformer模型最早是由Google的研究团队在2017年提出的,并在论文《Attention is All You Need》<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> 中进行了详细的介绍。这个模型是为了解决自然语言处理(NLP)任务中的一些问题而设计的,特别是为了克服传统循环神经网络(RNN)和长短期记忆网络(LSTM)在处理长序列时的局限性,如梯度消失或梯度爆炸问题。</p>
<p> Transformer模型的核心思想是使用自注意力机制(Self-Attention Mechanism)来捕捉输入序列中的依赖关系。这种机制允许模型在处理每个输入元素时,都能够关注到输入序列中的所有其他元素,从而能够捕捉到更长的依赖关系。此外,Transformer模型还采用了位置编码(Positional Encoding)来弥补模型本身不具备处理序列顺序的能力。</p>
<p> Transformer模型由两部分组成:编码器(Encoder)和解码器(Decoder)。编码器负责将输入序列转换为一系列向量表示,而解码器则负责根据这些向量表示生成输出序列。这两部分都由多个相同的层堆叠而成,每一层都包含一个多头自注意力子层和一个简单的全连接前馈神经网络。</p>
<p> 由于Transformer模型不依赖RNN的顺序结构,因此它可以实现高效的并行化训练,这使得它在处理大规模数据集时具有显著的优势。此外,Transformer模型的强大表示能力和灵活性使得它在多个NLP任务上都取得了显著的效果,成为了自然语言处理领域的一种主流模型。</p>
<p> 总的来说,Transformer模型是Google研究团队在2017年提出的一种基于自注意力机制的深度学习模型,它的出现为自然语言处理领域的发展带来了革命性的突破。</p>
<p>引用:</p>
<ul class="lvl-0">
<li class="lvl-2">
<p><a href="https://zhuanlan.zhihu.com/p/647249972">Text-to-SQL小白入门(一)</a></p>
</li>
<li class="lvl-2">
<p><a href="https://zhuanlan.zhihu.com/p/650407036">Text-to-SQL小白入门(二)</a></p>
</li>
</ul>
<p>原论文:</p>
<div class="row">
<embed src="/images/1706.03762.pdf" width="100%" height="550" type="application/pdf">
</div>
<hr class="footnotes-sep">
<section class="footnotes">
<ol class="footnotes-list">
<li id="fn1" class="footnote-item"><p>《Attention is All You Need》 <a href="#fnref1" class="footnote-backref">↩︎</a></p>
</li>
</ol>
</section>
]]></content>
<categories>
<category>学习</category>
</categories>
<tags>
<tag>NLP</tag>
<tag>text2sql</tag>
<tag>机器学习</tag>
</tags>
</entry>
<entry>
<title>一次gogs踩坑之路</title>
<url>//*/1398242790.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>一定要按照操作步骤走</p>
<span id="more"></span>
<p>1.创建用户,一定要记住密码</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sudo adduser git</span><br><span class="line">su git</span><br><span class="line">cd ~</span><br></pre></td></tr></table></figure>
<p>2.下载并解压安装包</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">wget https://dl.gogs.io/0.11.43/gogs_0.11.43_linux_amd64.zip</span><br><span class="line">unzip gogs_0.11.43_linux_amd64.zip</span><br></pre></td></tr></table></figure>
<p>3.拷贝启动项到系统下</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cp /home/xx/gogs/scripts/init/debian/gogs /etc/init.d/</span><br><span class="line">chmod +x /etc/init.d/gogs</span><br></pre></td></tr></table></figure>
<p>4.安装 mysql</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">apt update</span><br><span class="line">apt install mysql-server</span><br><span class="line">mysql -u root -p < /home/xx/gogs/scripts/mysql.sql</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">mysql -u root -p</span><br><span class="line">> # (输入密码)</span><br><span class="line">> create user 'gogs'@'localhost' identified by '密码';</span><br><span class="line">> grant all privileges on gogs.* to 'gogs'@'localhost';</span><br><span class="line">> flush privileges;</span><br><span class="line">> exit;</span><br></pre></td></tr></table></figure>
<p>5.启动 gogs</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">service gogs start</span><br><span class="line">curl -I http://localhost:3000 => HTTP OK 200</span><br></pre></td></tr></table></figure>
<p>6.nginx 配置</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">server {</span><br><span class="line"> listen 80;</span><br><span class="line"> server_name www.example.com;</span><br><span class="line"> location / {</span><br><span class="line"> proxy_pass http://localhost:3000/;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>7.访问 <a href="http://www.example.com/install">www.example.com/install</a> 进行初始化</p>
<p>8.你可能遇到的问题</p>
<p><a href="https://blog.csdn.net/u013710784/article/details/78778044">Gogs 与 Linux 主机共享 SSH22 端口</a></p>
<p><a href="https://blog.csdn.net/bigsea622/article/details/53956786">装 Gogs 后 ssh 无法和远程登录同时使用的解决方案</a></p>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>git</tag>
<tag>aliyun</tag>
<tag>阿里云</tag>
<tag>gogs</tag>
<tag>ubuntu 14.04</tag>
</tags>
</entry>
<entry>
<title>mybatis动态查询实现</title>
<url>//*/3058125875.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>model Product,我们希望通过实现 service 的一个方法,并支持所有类型的查询,如 >、>=、<、<=、like 、order by 等常用的查询、排序。</p>
<span id="more"></span>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Product</span> {</span><br><span class="line"> <span class="type">long</span> id;</span><br><span class="line"> String name;</span><br><span class="line"> String category;</span><br><span class="line"> String price;</span><br><span class="line"> String ...;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="分析"><a class="markdownIt-Anchor" href="#分析"></a> 分析:</h2>
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> product</span><br><span class="line"><span class="keyword">where</span> id <span class="operator">></span> <span class="number">1</span> <span class="keyword">or</span> price <span class="operator">></span> <span class="string">'100.00'</span> ...;</span><br></pre></td></tr></table></figure>
<p>Where 条件中包含 字段名称、运算符、值。</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* 查询类型</span></span><br><span class="line"><span class="comment">* lt 小于</span></span><br><span class="line"><span class="comment">* lte 小于等于</span></span><br><span class="line"><span class="comment">* gt 大于</span></span><br><span class="line"><span class="comment">* gte 大于等于</span></span><br><span class="line"><span class="comment">* slike 'value%' start_with</span></span><br><span class="line"><span class="comment">* elike '%value' end_with</span></span><br><span class="line"><span class="comment">* like '%value%'</span></span><br><span class="line"><span class="comment">* in 1,2,3,4,5</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Item</span> {</span><br><span class="line"> String name; <span class="comment">//字段名称</span></span><br><span class="line"> String value; <span class="comment">//值</span></span><br><span class="line"> String itemType; <span class="comment">//查询类型</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">type</span> <span class="operator">=</span> <span class="string">"and"</span>; <span class="comment">// 逻辑运算 and or</span></span><br><span class="line"> String[] values; <span class="comment">//如果是in查询转换为字符串数组</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>以上是对查询条件的简单封装,如果我们需要满足多个条件的话。</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">QueryParam</span>{</span><br><span class="line"> List<Item> items = <span class="literal">null</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>mybatis 公共 xml 文件配置</p>
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span> ?></span></span><br><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">mapper</span> <span class="keyword">PUBLIC</span> <span class="string">"-//mybatis.org//DTD Mapper 3.0//EN"</span> <span class="string">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"</span> ></span></span><br><span class="line"><span class="tag"><<span class="name">mapper</span> <span class="attr">namespace</span>=<span class="string">"BaseMapper"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">sql</span> <span class="attr">id</span>=<span class="string">"BaseQuery"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"items != null "</span>></span></span><br><span class="line"> where 1 = 1</span><br><span class="line"> <span class="tag"><<span class="name">foreach</span> <span class="attr">collection</span>=<span class="string">"items"</span> <span class="attr">item</span>=<span class="string">"item"</span> <span class="attr">index</span>=<span class="string">"index"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">separator</span>=<span class="string">" "</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"item.itemType == 'eq' "</span>></span></span><br><span class="line"> ${item.type} ${item.fieldName} = #{item.value}</span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"item.itemType == 'lt' "</span>></span></span><br><span class="line"> <![CDATA[ ${item.type} ${item.name} < #{item.value} ]]></span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"item.itemType == 'lte' "</span>></span></span><br><span class="line"> <![CDATA[ ${item.type} ${item.name} <= #{item.value} ]]></span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"item.itemType == 'gt' "</span>></span></span><br><span class="line"> <![CDATA[ ${item.type} ${item.name} > #{item.value} ]]></span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"item.itemType == 'gte' "</span>></span></span><br><span class="line"> <![CDATA[ ${item.type} ${item.name} >= #{item.value} ]]></span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"item.itemType == 'slike' "</span>></span></span><br><span class="line"> <![CDATA[ ${item.type} ${item.name} like '${item.value}%' ]]></span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"item.typeitemType == 'elike' "</span>></span></span><br><span class="line"> <![CDATA[ ${item.type} ${item.name} like '%${item.value}' ]]></span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"item.itemType == 'like' "</span>></span></span><br><span class="line"> <![CDATA[ AND ${item.name} like '%${item.value}%' ]]></span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"item.itemType == 'in' "</span>></span></span><br><span class="line"> ${item.type}</span><br><span class="line"> <span class="tag"><<span class="name">foreach</span> <span class="attr">collection</span>=<span class="string">"item.values"</span> <span class="attr">item</span>=<span class="string">"value"</span> <span class="attr">index</span>=<span class="string">"index"</span> <span class="attr">open</span>=<span class="string">"("</span> <span class="attr">close</span>=<span class="string">")"</span> <span class="attr">separator</span>=<span class="string">"OR"</span>></span></span><br><span class="line"> ${item.name} = #{value}</span><br><span class="line"> <span class="tag"></<span class="name">foreach</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">foreach</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">sql</span>></span></span><br><span class="line"><span class="tag"></<span class="name">mapper</span>></span></span><br></pre></td></tr></table></figure>
<p>Product mapper.xml</p>
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span> ?></span></span><br><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">mapper</span> <span class="keyword">PUBLIC</span> <span class="string">"-//mybatis.org//DTD Mapper 3.0//EN"</span> <span class="string">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"</span> ></span></span><br><span class="line"><span class="tag"><<span class="name">mapper</span> <span class="attr">namespace</span>=<span class="string">"com.yqwoe.codegenerator.dao.ProductMapper"</span> ></span></span><br><span class="line"> <span class="tag"><<span class="name">resultMap</span> <span class="attr">id</span>=<span class="string">"BaseResultMap"</span> <span class="attr">type</span>=<span class="string">"com.yqwoe.codegenerator.model.Product"</span> ></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span> <span class="attr">column</span>=<span class="string">"u_id"</span> <span class="attr">property</span>=<span class="string">"uId"</span> <span class="attr">jdbcType</span>=<span class="string">"VARCHAR"</span> /></span></span><br><span class="line"> <span class="comment"><!--省略 --></span></span><br><span class="line"> <span class="tag"></<span class="name">resultMap</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">sql</span> <span class="attr">id</span>=<span class="string">"Base_Column_List"</span> ></span></span><br><span class="line"> id, name, category, price ,.....</span><br><span class="line"> <span class="tag"></<span class="name">sql</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"selectAll"</span> <span class="attr">resultMap</span>=<span class="string">"BaseResultMap"</span> <span class="attr">parameterType</span>=<span class="string">"com.yqwoe.model.param.QueryParam"</span>></span></span><br><span class="line"> select</span><br><span class="line"> <span class="tag"><<span class="name">include</span> <span class="attr">refid</span>=<span class="string">"Base_Column_List"</span> /></span></span><br><span class="line"> from s_user</span><br><span class="line"> <span class="tag"><<span class="name">include</span> <span class="attr">refid</span>=<span class="string">"BaseMapper.BaseQuery"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">include</span> <span class="attr">refid</span>=<span class="string">"BaseMapper.BaseOrder"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">select</span>></span></span><br><span class="line"><span class="tag"></<span class="name">mapper</span>></span></span><br></pre></td></tr></table></figure>
<p>ProductController</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">ProductController</span>{</span><br><span class="line"> ProductService productService;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@GetMapping("/products")</span></span><br><span class="line"> <span class="keyword">public</span> Pageinfo <span class="title function_">index</span><span class="params">(QueryParam param)</span>{</span><br><span class="line"> <span class="keyword">return</span> productService.selectAll(param);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="演示"><a class="markdownIt-Anchor" href="#演示"></a> 演示</h3>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">api: http://localhost:8000/products?items[0].name=name&items[0].value=nil?,超级管理员&items[0].itemType=in</span><br><span class="line"></span><br><span class="line">sql: select * from product where 1 = 1 and (name = 'nil?' OR name = '超级管理员')</span><br><span class="line"></span><br><span class="line">//type 默认为 and</span><br><span class="line">response:</span><br><span class="line">{</span><br><span class="line"> data:[</span><br><span class="line"> ....</span><br><span class="line"> ]</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>以上为动态查询,照这样的思路,可以继续围绕 mapper 扩展排序或者更复杂的查询。</p>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>mybatis</tag>
<tag>mysql</tag>
<tag>api</tag>
</tags>
</entry>
<entry>
<title>搭建maven私库</title>
<url>//*/1406322052.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="1-docker-搭建maven私库"><a class="markdownIt-Anchor" href="#1-docker-搭建maven私库"></a> 1. docker 搭建maven私库</h1>
<span id="more"></span>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run -d --name nexus -p 8081:8081 -d --restart always -u root --privileged=true -v ~/opt/nexus-data:/nexus-data sonatype/nexus3</span><br></pre></td></tr></table></figure>
<figure class="highlight text"><table><tr><td class="code"><pre><span class="line">docker exec -it nexus //进入容器</span><br><span class="line">cd /nexus-data</span><br><span class="line">cat admin.password //复制密码</span><br></pre></td></tr></table></figure>
<p>访问 <a href="http://ip:8081">http://ip:8081</a><br>
修改密码后 admin.password自动删除</p>
<h1 id="2-配置maven私库"><a class="markdownIt-Anchor" href="#2-配置maven私库"></a> 2. 配置maven私库</h1>
<h4 id="21添加-role"><a class="markdownIt-Anchor" href="#21添加-role"></a> 2.1添加 role</h4>
<p>develop => nx-all</p>
<h5 id="22-添加-user"><a class="markdownIt-Anchor" href="#22-添加-user"></a> 2.2 添加 user</h5>
<p>developer => develop</p>
<h1 id="3-插件开发环境配置"><a class="markdownIt-Anchor" href="#3-插件开发环境配置"></a> 3. 插件开发环境配置</h1>
<h4 id="31-mavensettingxml配置"><a class="markdownIt-Anchor" href="#31-mavensettingxml配置"></a> 3.1 maven/setting.xml配置</h4>
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"><span class="tag"><<span class="name">settings</span> <span class="attr">xmlns</span>=<span class="string">"http://maven.apache.org/SETTINGS/1.0.0"</span> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">servers</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">server</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>maven-public-gl<span class="tag"></<span class="name">id</span>></span> <span class="comment"><!--对应pom.xml的id=maven-public-gl的仓库--></span></span><br><span class="line"> <span class="tag"><<span class="name">username</span>></span>developer<span class="tag"></<span class="name">username</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">password</span>></span>Glrj@1234<span class="tag"></<span class="name">password</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">server</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">server</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>maven-releases-gl<span class="tag"></<span class="name">id</span>></span> <span class="comment"><!--对应pom.xml的id=maven-releases-gl的仓库--></span></span><br><span class="line"> <span class="tag"><<span class="name">username</span>></span>developer<span class="tag"></<span class="name">username</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">password</span>></span>Glrj@1234<span class="tag"></<span class="name">password</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">server</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">server</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>maven-snapshots-gl<span class="tag"></<span class="name">id</span>></span> <span class="comment"><!--对应pom.xml中id=maven-snapshots-gl的仓库--></span></span><br><span class="line"> <span class="tag"><<span class="name">username</span>></span>developer<span class="tag"></<span class="name">username</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">password</span>></span>Glrj@1234<span class="tag"></<span class="name">password</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">server</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">servers</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mirrors</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mirror</span>></span> <span class="comment"><!--对应pom.xml中id=maven-public-gl的仓库--></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>maven-public-gl<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mirrorOf</span>></span>*<span class="tag"></<span class="name">mirrorOf</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>GZ Repository Mirror.<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>https://nexus.corebrew.net/repository/maven-public/<span class="tag"></<span class="name">url</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">mirror</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">mirrors</span>></span></span><br><span class="line"><span class="tag"></<span class="name">settings</span>></span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="32-插件项目pomxml配置"><a class="markdownIt-Anchor" href="#32-插件项目pomxml配置"></a> 3.2 插件项目pom.xml配置</h4>
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">project</span> <span class="attr">xmlns</span>=<span class="string">"http://maven.apache.org/POM/4.0.0"</span> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">modelVersion</span>></span>4.0.0<span class="tag"></<span class="name">modelVersion</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.yq<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>low-code<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">packaging</span>></span>pom<span class="tag"></<span class="name">packaging</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.0-SNAPSHOT<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">modules</span>></span></span><br><span class="line"> <...></span><br><span class="line"> <span class="tag"></<span class="name">modules</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>low-code<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">description</span>></span>低代码开放平台<span class="tag"></<span class="name">description</span>></span></span><br><span class="line"></span><br><span class="line"> <...></span><br><span class="line"> <span class="tag"><<span class="name">distributionManagement</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">repository</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>maven-releases-gl<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>https://nexus.corebrew.net/repository/maven-releases/<span class="tag"></<span class="name">url</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">repository</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">snapshotRepository</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>maven-snapshots-gl<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>https://nexus.corebrew.net/repository/maven-snapshots/<span class="tag"></<span class="name">url</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">snapshotRepository</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">distributionManagement</span>></span></span><br><span class="line"><span class="tag"></<span class="name">project</span>></span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h5 id="33-项目依赖pomxml"><a class="markdownIt-Anchor" href="#33-项目依赖pomxml"></a> 3.3 项目依赖pom.xml</h5>
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">project</span> <span class="attr">xmlns</span>=<span class="string">"http://maven.apache.org/POM/4.0.0"</span> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">repositories</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">repository</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>maven-public-gl<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>https://nexus.corebrew.net/repository/maven-public/<span class="tag"></<span class="name">url</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">repository</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">repository</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>aliyun-nexus<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>aliyun<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>http://maven.aliyun.com/nexus/content/groups/public/<span class="tag"></<span class="name">url</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">repository</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">repositories</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">pluginRepositories</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">pluginRepository</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>aliyun-nexus<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>aliyun<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>http://maven.aliyun.com/nexus/content/groups/public/<span class="tag"></<span class="name">url</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">pluginRepository</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">pluginRepository</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>maven-public-gl<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>https://nexus.corebrew.net/repository/maven-public/<span class="tag"></<span class="name">url</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">pluginRepository</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">pluginRepositories</span>></span></span><br><span class="line"><span class="tag"></<span class="name">project</span>></span></span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>java</tag>
<tag>maven</tag>
<tag>docker</tag>
</tags>
</entry>
<entry>
<title>nginx支持ssl+acme.sh定时更新证书</title>
<url>//*/1101146699.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>不废话,直接进入实战。</p>
<span id="more"></span>
<p>1.安装 nginx</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">apt update</span><br><span class="line">apt install nginx</span><br></pre></td></tr></table></figure>
<p>2.配置 nginx</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">vi /etc/nginx/sites-enabled/default</span><br><span class="line"></span><br><span class="line">server {</span><br><span class="line"> listen 80;</span><br><span class="line"> server_name example.com ;</span><br><span class="line"> return 301 https://example.com$request_uri;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">server {</span><br><span class="line"> listen 443 ssl;</span><br><span class="line"></span><br><span class="line"> server_name example.com;</span><br><span class="line"></span><br><span class="line"> ssl on;</span><br><span class="line"> ssl_certificate /var/www/ssl/example.com.cer;</span><br><span class="line"> ssl_certificate_key /var/www/ssl/example.com.key;</span><br><span class="line"> ssl_dhparam /var/www/ssl/dhparam.pem;</span><br><span class="line"> ssl_protocols TLSv1 TLSv1.1 TLSv1.2;</span><br><span class="line"> ssl_prefer_server_ciphers on;</span><br><span class="line"> ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; #加密算法(CloudFlare 推荐的加密套件组)</span><br><span class="line"> ssl_session_timeout 5m; #客户端会话缓存时间</span><br><span class="line"> ssl_session_cache builtin:1000 shared:SSL:10m; #SSL 会话缓存类型和大小</span><br><span class="line"></span><br><span class="line"> root /var/www/example/current/public;</span><br><span class="line"> access_log /var/www/example/current/log/nginx.access.log;</span><br><span class="line"> error_log /var/www/example/current/log/nginx.error.log info;</span><br><span class="line"></span><br><span class="line"> error_page 500 502 503 504 /500.html;</span><br><span class="line"> client_max_body_size 10M;</span><br><span class="line"> keepalive_timeout 10;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<p>3.安装 <a href="http://acme.sh">acme.sh</a></p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">curl https://get.acme.sh | sh</span><br><span class="line">source ~/.bashrc</span><br><span class="line">备注:如果本地创建了.bash_profie建议把此命令加入</span><br></pre></td></tr></table></figure>
<p>4.申请证书</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">acme.sh --issue -d example.com -w /var/www/example/current/public</span><br><span class="line">备注: 命令中的目录一定是通过nginx 80端口能够访问到的位置。命令执行成功后证书会存放在 ~/.acme.sh/example.com/</span><br></pre></td></tr></table></figure>
<p>5.设置证书,并重启 nginx</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">acme.sh --installcert -d example.com \</span><br><span class="line"> --keypath /var/www/ssl/example.com.key \</span><br><span class="line"> --fullchainpath /var/www/ssl/example.com.cer \</span><br><span class="line"> --reloadcmd "nginx -s reload"</span><br></pre></td></tr></table></figure>
<p>6.生成 dhparam.pem 文件</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">openssl dhparam -out /var/www/ssl/dhparam.pem 2048</span><br><span class="line">备注:注意观察的话,证书和dhparam.pem的目录和nginx中是保持一致的。</span><br></pre></td></tr></table></figure>
<p>7.查看定时更换任务</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">$ crontab -l</span><br><span class="line">0 0 * * * "/home/ubuntu/.acme.sh"/acme.sh --cron --home "/home/ubuntu/.acme.sh" > /dev/null</span><br></pre></td></tr></table></figure>
<p>8.验证 <a href="http://acme.sh">acme.sh</a> 定时更换任务</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">acme.sh --cron -f</span><br></pre></td></tr></table></figure>
<p>9.你可能遇到的问题</p>
<p><a href="https://ruby-china.org/topics/31983">使用 acme.sh 给 Nginx 安装 Let’ s Encrypt 提供的免费 SSL 证书</a></p>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>aliyun</tag>
<tag>阿里云</tag>
<tag>ubuntu 14.04</tag>
<tag>nginx</tag>
<tag>ssl</tag>
<tag>acme.sh</tag>
</tags>
</entry>
<entry>
<title>阿里云mysql外网访问</title>
<url>//*/3031836898.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>转载原文评论: <a href="https://segmentfault.com/q/1010000009603559?sort=created">阿里云 ecs 上安装了 mysql 但是外网访问不了</a></p>
<span id="more"></span>
<p>1.阿里云 ECS 有安全组防火墙.默认只开了 ICMP,22,3389. 在服务器控制台找到 安全组-配置规则-添加安全组规则</p>
<p><img src="/images/1950746143-596a46107163e_articlex.png" alt="1950746143-596a46107163e_articlex"></p>
<p>2.如果是用 root 登录 MySQL,在登陆后 use mysql, user 表 root 对应的 localhost 改为%</p>
<p>3.mysql 默认只能自本机访问</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">/etc/mysql/mysql.conf.d/mysqld.cnf</span><br><span class="line">#bind-address = 127.0.0.1</span><br><span class="line"></span><br><span class="line">service mysql restart</span><br></pre></td></tr></table></figure>
<p>4.检查是不是在监听状态</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">netstat -ntpl |grep 3306</span><br></pre></td></tr></table></figure>
<p>5.防火墙是否对 mysql 端口限制,设置防火墙</p>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>aliyun</tag>
<tag>阿里云</tag>
<tag>ubuntu 14.04</tag>
<tag>mysql</tag>
</tags>
</entry>
<entry>
<title>mysql 'No DataSource Set'解决办法</title>
<url>//*/202678719.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>mysql 8.0.13开始,使用sslMode属性代替了原来的useSSL属性, 所以把<code>useSSL=true</code>改成<code>sslMode=DISABLED</code> 或者添加<code>allowPublicKeyRetrieval=true</code></p>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>mysql</tag>
<tag>java</tag>
<tag>error</tag>
<tag>jdbc</tag>
<tag>springboot</tag>
</tags>
</entry>
<entry>
<title>ruby 爬虫 一</title>
<url>//*/1911085415.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p> 拖延了半个多月,把之前写的东西整理一下发现,好多内容都在脑子里,没有形成转化后的内容,所以,吃过晚饭就决定写完在睡觉。</p>
<span id="more"></span>
<figure class="highlight ruby"><table><tr><td class="code"><pre><span class="line"><span class="title class_">Time</span>.now.to_s => <span class="string">"2018-10-30 20:29:36 +0800"</span></span><br></pre></td></tr></table></figure>
<p> 印象中,大多数人做爬虫第一个想到的肯定是 python,“python 解决方案多,代码简洁,容易上手…”,blah…blah</p>
<p> 事实上我也写 python,但是强制缩进这点让我很伤脑筋,没用 ruby 之前,我觉得 python 可能是我做 java 以来最优雅的语言。直到我用 ruby。</p>
<figure class="highlight ruby"><table><tr><td class="code"><pre><span class="line"><span class="number">10</span>.times <span class="keyword">do</span> |<span class="params">i</span>|</span><br><span class="line"> puts <span class="string">"I Love Ruby!!"</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line">=></span><br><span class="line"><span class="string">"I Love Ruby!!"</span></span><br><span class="line"><span class="string">"I Love Ruby!!"</span></span><br><span class="line"><span class="string">"I Love Ruby!!"</span></span><br><span class="line"><span class="string">"I Love Ruby!!"</span></span><br><span class="line"><span class="string">"I Love Ruby!!"</span></span><br><span class="line"><span class="string">"I Love Ruby!!"</span></span><br><span class="line"><span class="string">"I Love Ruby!!"</span></span><br><span class="line"><span class="string">"I Love Ruby!!"</span></span><br><span class="line"><span class="string">"I Love Ruby!!"</span></span><br><span class="line"><span class="string">"I Love Ruby!!"</span></span><br></pre></td></tr></table></figure>
<p> 废话不多说。</p>
<p> 为什么选择用 ruby,而不用 python 呢?</p>
<p> 不为别的,就是顺手而已。</p>
<h1 id="kimurai"><a class="markdownIt-Anchor" href="#kimurai"></a> kimurai</h1>
<blockquote>
<p>Kimurai 是一个用 Ruby 实现的现代网络爬虫框架,和 <strong>Headless Chromium</strong> / <strong>Firefox</strong> 、<strong>PhantomJS</strong> 一样开箱即用,并且能够模拟**“用户”**访问抓取 javascript 交互的网站。</p>
<p>Kimurai 基于 <strong><a href="https://github.com/teamcapybara/capybara">Capybara</a></strong> 和 <strong><a href="https://github.com/sparklemotion/nokogiri">Nokogir</a></strong> gems,所以你不必学习新的东西。</p>
</blockquote>
<h2 id="实操"><a class="markdownIt-Anchor" href="#实操"></a> 实操</h2>
<h4 id="1安装"><a class="markdownIt-Anchor" href="#1安装"></a> 1.安装</h4>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">gem install kimurai</span><br></pre></td></tr></table></figure>
<p>使用<a href="http://npm.taobao.org/mirrors/chromedriver/">chromiumdriver</a> 或<a href="https://github.com/ariya/phantomjs">phantomJS</a>需另外安装。</p>
<h4 id="2创建项目-demo"><a class="markdownIt-Anchor" href="#2创建项目-demo"></a> 2.创建项目 demo</h4>
<p>kimurai 提供了像 rails new project 这样的命令式创建项目。</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">kimurai generate project demo</span><br></pre></td></tr></table></figure>
<p>等待命令执行完成会生成如下结构</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">|demo</span><br><span class="line"> |config #用于存放全局配置</span><br><span class="line"> |application.rb #全局配置</span><br><span class="line"> |automaiton.yml #用于配置浏览器和部署</span><br><span class="line"> |schedule.rb #支持定时任务</span><br><span class="line"> |db #数据库文件?</span><br><span class="line"> |helpers #辅助方法</span><br><span class="line"> |lib #插件</span><br><span class="line"> |log #日志</span><br><span class="line"> |pipelines</span><br><span class="line"> |spiders #爬虫存放目录</span><br><span class="line"> |tmp #缓存文件</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="3创建-spider"><a class="markdownIt-Anchor" href="#3创建-spider"></a> 3.创建 spider</h4>
<figure class="highlight ruby"><table><tr><td class="code"><pre><span class="line">kimurai generate spider test_spider</span><br><span class="line"></span><br><span class="line"><span class="comment">#demo/spiders/test_spider.rb</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">TestSpider</span> < <span class="title class_ inherited__">ApplicationSpider</span></span><br><span class="line"> <span class="variable">@name</span> = <span class="string">"test_spider"</span></span><br><span class="line"> <span class="variable">@start_urls</span> = []</span><br><span class="line"> <span class="variable">@config</span> = {}</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">parse</span>(<span class="params">response, <span class="symbol">url:</span>, <span class="symbol">data:</span> {}</span>)</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="4修改-spider"><a class="markdownIt-Anchor" href="#4修改-spider"></a> 4.修改 spider</h4>
<figure class="highlight ruby"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">TestSpider</span> < <span class="title class_ inherited__">ApplicationSpider</span></span><br><span class="line"> <span class="variable">@name</span> = <span class="string">"test_spider"</span></span><br><span class="line"> <span class="variable">@start_urls</span> = [<span class="string">"https://baike.pcbaby.com.cn"</span>]</span><br><span class="line"></span><br><span class="line"> <span class="keyword">def</span> <span class="title function_">parse</span>(<span class="params">response, <span class="symbol">url:</span>, <span class="symbol">data:</span> {}</span>)</span><br><span class="line"> items = {}</span><br><span class="line"> items[<span class="symbol">:links</span>] = []</span><br><span class="line"> response.xpath(<span class="string">"//div[@class='baike-th main']"</span>).each <span class="keyword">do</span> |<span class="params">row</span>|</span><br><span class="line"> logger.info row.to_s</span><br><span class="line"> items[<span class="symbol">:links</span>] << {</span><br><span class="line"> <span class="symbol">title:</span> row.css(<span class="string">"/a"</span>).text.squish,</span><br><span class="line"> <span class="symbol">url:</span> <span class="string">"https:<span class="subst">#{row.css(<span class="string">"/a"</span>).first[<span class="string">"href"</span>]}</span>"</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> save_to <span class="string">"results.json"</span>, items, <span class="symbol">format:</span> <span class="symbol">:pretty_json</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<h5 id="resultsjson"><a class="markdownIt-Anchor" href="#resultsjson"></a> results.json</h5>
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"links"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"备孕百科"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://baike.pcbaby.com.cn/yunqian.html"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"孕期百科"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://baike.pcbaby.com.cn/yunqi.html"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"分娩百科"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://baike.pcbaby.com.cn/fenmian.html"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"月子百科"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://baike.pcbaby.com.cn/yuezi.html"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"新生儿百科"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://baike.pcbaby.com.cn/xinshenger.html"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"0-1岁百科"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://baike.pcbaby.com.cn/yinger.html"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"1-3岁百科"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://baike.pcbaby.com.cn/youer.html"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"3-6岁百科"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://baike.pcbaby.com.cn/xuelingqian.html"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"用品百科"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://baike.pcbaby.com.cn/yongpin.html"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"美食百科"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://baike.pcbaby.com.cn/meishi.html"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"生活百科"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://baike.pcbaby.com.cn/shenghuo.html"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"position"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure>
<h4 id="5application_spiderrb"><a class="markdownIt-Anchor" href="#5application_spiderrb"></a> 5.application_spider.rb</h4>
<figure class="highlight ruby"><table><tr><td class="code"><pre><span class="line"><span class="comment"># ApplicationSpider is a default base spider class. You can set here</span></span><br><span class="line"><span class="comment"># default settings for all spiders inherited from ApplicationSpider.</span></span><br><span class="line"><span class="comment"># To generate a new spider, run: `$ kimurai generate spider spider_name`</span></span><br><span class="line"><span class="keyword">require</span> <span class="string">'net/http'</span></span><br><span class="line"><span class="keyword">require</span> <span class="string">'kimurai'</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">ApplicationSpider</span> < <span class="title class_ inherited__">Kimurai::Base</span></span><br><span class="line"> <span class="keyword">include</span> <span class="title class_">ApplicationHelper</span></span><br><span class="line"></span><br><span class="line"> <span class="variable">@engine</span> = <span class="symbol">:selenium_chrome</span></span><br><span class="line"> <span class="variable constant_">USER_AGENTS</span> = []</span><br><span class="line"></span><br><span class="line"> <span class="comment"># PROXIES = ["127.0.0.1:1086:socks5"]</span></span><br><span class="line"></span><br><span class="line"> <span class="variable">@config</span> = {</span><br><span class="line"> <span class="symbol">user_agent:</span> <span class="string">"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"</span>,</span><br><span class="line"> <span class="symbol">skip_request_errors:</span> [{ <span class="symbol">error:</span> <span class="title class_">RuntimeError</span>, <span class="symbol">message:</span> <span class="string">"404 => Net::HTTPNotFound"</span> }],</span><br><span class="line"> <span class="symbol">retry_request_errors:</span> [<span class="title class_">Net</span><span class="symbol">:</span><span class="symbol">:ReadTimeout</span>],</span><br><span class="line"> <span class="symbol">restart_if:</span> {</span><br><span class="line"> },</span><br><span class="line"> <span class="symbol">before_request:</span> {</span><br><span class="line"> <span class="symbol">delay:</span> <span class="number">4</span>..<span class="number">7</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="6运行"><a class="markdownIt-Anchor" href="#6运行"></a> 6.运行</h4>
<figure class="highlight ruby"><table><tr><td class="code"><pre><span class="line">bundle exec kimurai runner -j <span class="number">3</span></span><br></pre></td></tr></table></figure>
<p>可以依次运行多个爬虫。</p>
<p>按照以上步骤可以运行示例中的代码。</p>
<p>更多细节配置可以查看 <a href="https://github.com/vifreefly/kimuraframework#installation">kimurai</a></p>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>java</tag>
<tag>ruby</tag>
<tag>爬虫</tag>
<tag>python</tag>
<tag>kimurai</tag>
</tags>
</entry>
<entry>
<title>mysql count函数正确使用姿势</title>
<url>//*/9f600c63.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p> <code>count()</code> 是<code>mysql</code>聚合函数,返回指定匹配条件的行数。开发中常用来统计表中数据,全部数据,不为null数据,或者去重数据。</p>
<span id="more"></span>
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 统计表中数据包括null</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(<span class="number">1</span>) <span class="keyword">from</span> zs_access_log;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计表中数据包括null</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> zs_access_log;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计表中指定列不为null的数据</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(id) <span class="keyword">from</span> zs_access_log;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计表中指定列去重不为null的数据</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(<span class="keyword">distinct</span> id) <span class="keyword">from</span> zs_access_log;</span><br></pre></td></tr></table></figure>
<h1 id="1-背景"><a class="markdownIt-Anchor" href="#1-背景"></a> 1. 背景</h1>
<p> 生产环境使用 <code>mysql: 8.0.18 Innodb</code>, <code>mybatis</code>分页查询由两次查询完成,第一次获取总的记录行数,再次获取具体分页数据。<br>
以下查询可以看到<code>count</code>是存在性能问题的,接口的响应<code>> 800ms</code> <code>< 4s</code>,但是该如何优化呢?</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mysql> <span class="keyword">select</span> count(*) from zs_access_log;</span><br><span class="line">+----------+</span><br><span class="line">| count(*) |</span><br><span class="line">+----------+</span><br><span class="line">| 37485 |</span><br><span class="line">+----------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.53 sec)</span><br><span class="line"></span><br><span class="line">mysql> <span class="keyword">select</span> * from zs_access_log <span class="built_in">limit</span> 0,10;</span><br><span class="line">10 rows <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h1 id="2-count性能对比"><a class="markdownIt-Anchor" href="#2-count性能对比"></a> 2. count性能对比</h1>
<p> 对比 <code>count</code> 几种使用姿势,在<code>InnoDB</code>和<code>MyISAM</code>引擎的性能对比。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mysql> show engines;</span><br><span class="line">+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+</span><br><span class="line">| Engine | Support | Comment | Transactions | XA | Savepoints |</span><br><span class="line">+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+</span><br><span class="line">| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |</span><br><span class="line">| MEMORY | YES | Hash based, stored <span class="keyword">in</span> memory, useful <span class="keyword">for</span> temporary tables | NO | NO | NO |</span><br><span class="line">| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |</span><br><span class="line">| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |</span><br><span class="line">| MyISAM | YES | MyISAM storage engine | NO | NO | NO |</span><br><span class="line">| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |</span><br><span class="line">| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |</span><br><span class="line">| CSV | YES | CSV storage engine | NO | NO | NO |</span><br><span class="line">| ARCHIVE | YES | Archive storage engine | NO | NO | NO |</span><br><span class="line">+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+</span><br><span class="line">9 rows <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br></pre></td></tr></table></figure>
<p> 数据表 <code>zs_access_log</code> 和 <code>zs_access_log_myisam</code></p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mysql> <span class="keyword">select</span> TABLE_NAME , ENGINE from information_schema.tables <span class="built_in">where</span> TABLE_SCHEMA = <span class="string">'unified-form'</span> and TABLE_NAME like <span class="string">'%zs_access%'</span>;</span><br><span class="line">+----------------------+--------+</span><br><span class="line">| TABLE_NAME | ENGINE |</span><br><span class="line">+----------------------+--------+</span><br><span class="line">| zs_access_log | InnoDB |</span><br><span class="line">| zs_access_log_myisam | MyISAM |</span><br><span class="line">+----------------------+--------+</span><br><span class="line">2 rows <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br></pre></td></tr></table></figure>
<h2 id="21-innodb"><a class="markdownIt-Anchor" href="#21-innodb"></a> 2.1 InnoDB</h2>
<h3 id="211-count1"><a class="markdownIt-Anchor" href="#211-count1"></a> 2.1.1 count(1)</h3>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mysql> <span class="keyword">select</span> count(1) from zs_access_log;</span><br><span class="line">+----------+</span><br><span class="line">| count(1) |</span><br><span class="line">+----------+</span><br><span class="line">| 37485 |</span><br><span class="line">+----------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.53 sec)</span><br></pre></td></tr></table></figure>
<h3 id="212-count"><a class="markdownIt-Anchor" href="#212-count"></a> 2.1.2 count(*)</h3>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mysql> <span class="keyword">select</span> count(*) from zs_access_log;</span><br><span class="line">+----------+</span><br><span class="line">| count(*) |</span><br><span class="line">+----------+</span><br><span class="line">| 37485 |</span><br><span class="line">+----------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.52 sec)</span><br></pre></td></tr></table></figure>
<h3 id="213-countcolumn"><a class="markdownIt-Anchor" href="#213-countcolumn"></a> 2.1.3 count(column)</h3>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mysql> <span class="keyword">select</span> count(<span class="built_in">id</span>) from zs_access_log;</span><br><span class="line">+-----------+</span><br><span class="line">| count(<span class="built_in">id</span>) |</span><br><span class="line">+-----------+</span><br><span class="line">| 37485 |</span><br><span class="line">+-----------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.50 sec)</span><br></pre></td></tr></table></figure>
<p> 数据表明以上几种方式查询效率相差无几,为什么会出现这样的问题呢?</p>
<h2 id="22-myisam"><a class="markdownIt-Anchor" href="#22-myisam"></a> 2.2 MyISAM</h2>
<h3 id="211-count1-2"><a class="markdownIt-Anchor" href="#211-count1-2"></a> 2.1.1 count(1)</h3>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mysql> <span class="keyword">select</span> count(1) from zs_access_log_myisam;</span><br><span class="line">+----------+</span><br><span class="line">| count(1) |</span><br><span class="line">+----------+</span><br><span class="line">| 37485 |</span><br><span class="line">+----------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br></pre></td></tr></table></figure>
<h3 id="212-count-2"><a class="markdownIt-Anchor" href="#212-count-2"></a> 2.1.2 count(*)</h3>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mysql> <span class="keyword">select</span> count(*) from zs_access_log_myisam;</span><br><span class="line">+----------+</span><br><span class="line">| count(*) |</span><br><span class="line">+----------+</span><br><span class="line">| 37485 |</span><br><span class="line">+----------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br></pre></td></tr></table></figure>
<h3 id="213-countcolumn-2"><a class="markdownIt-Anchor" href="#213-countcolumn-2"></a> 2.1.3 count(column)</h3>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mysql> <span class="keyword">select</span> count(<span class="built_in">id</span>) from zs_access_log_myisam;</span><br><span class="line">+-----------+</span><br><span class="line">| count(<span class="built_in">id</span>) |</span><br><span class="line">+-----------+</span><br><span class="line">| 37485 |</span><br><span class="line">+-----------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br></pre></td></tr></table></figure>
<p> 数据表明以上几种方式在<code>InnoDB</code>和<code>MyISAM</code>引擎中,查询效率差别很大。</p>
<p> <code>MyISAM</code>把总行数存在磁盘(<code>information_schema.partitions</code>)中,<code>count(*)</code>和<code>count(1)</code>的性能会好很多。</p>
<p> <code>InnoDB</code>获取所有数据,并逐行计算总行数,<code>count(*)</code>和<code>count(1)</code>的性能会差很多。`</p>
<p><a href="https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_count">mysql文档原文</a></p>
<h1 id="3-性能优化"><a class="markdownIt-Anchor" href="#3-性能优化"></a> 3. 性能优化</h1>
<p> 在实际开发过程中,业务系统的数据表均使用<code>InnoDB</code>支持事务。</p>
<p> 该如何优化<code>InnoDB</code>中<code>count</code>的性能?</p>
<ul class="lvl-0">
<li class="lvl-2">
<p>使用<code>redis</code>记录数据行数</p>
</li>
<li class="lvl-2">
<p>使用除了<code>主键</code>以外索引列</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">mysql> <span class="keyword">select</span> count(<span class="built_in">id</span>) from zs_access_log;</span><br><span class="line">+-----------+</span><br><span class="line">| count(<span class="built_in">id</span>) |</span><br><span class="line">+-----------+</span><br><span class="line">| 37485 |</span><br><span class="line">+-----------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.54 sec)</span><br><span class="line"></span><br><span class="line">mysql> <span class="keyword">select</span> count(action) from zs_access_log;</span><br><span class="line">+---------------+</span><br><span class="line">| count(action) |</span><br><span class="line">+---------------+</span><br><span class="line">| 37485 |</span><br><span class="line">+---------------+</span><br><span class="line">1 row <span class="keyword">in</span> <span class="built_in">set</span> (0.01 sec)</span><br><span class="line"></span><br></pre></td></tr></table></figure>
</li>
</ul>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>mybatis</tag>
<tag>mysql</tag>
<tag>count</tag>
<tag>聚合函数</tag>
<tag>InnoDB</tag>
<tag>MyISAM</tag>
</tags>
</entry>
<entry>
<title>nginx 负载均衡</title>
<url>//*/1506548690.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><h1 id="nginx-是什么"><a class="markdownIt-Anchor" href="#nginx-是什么"></a> nginx 是什么?</h1>
<span id="more"></span>
<blockquote>
<p>Nginx:Nginx (“engine x”) ,Nginx (“engine x”) 是俄罗斯人 Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器。也是一个 IMAP/POP3/SMTP 代理服务器;也就是说,Nginx 本身就可以托管网站,进行 HTTP 服务处理,也可以作为反向代理服务器使用。</p>
</blockquote>
<h1 id="nginx-特点"><a class="markdownIt-Anchor" href="#nginx-特点"></a> nginx 特点</h1>
<ul class="lvl-0">
<li class="lvl-2">
<p>跨平台:Nginx 可以在大多数 Unix like OS 编译运行,而且也有 Windows 的移植版本。</p>
</li>
<li class="lvl-2">
<p>配置异常简单:非常容易上手。配置风格跟程序开发一样,神一般的配置</p>
</li>
<li class="lvl-2">
<p>非阻塞、高并发连接:数据复制时,磁盘 I/O 的第一阶段是非阻塞的。官方测试能够支撑 5 万并发连接,在实际生产环境中跑到 2 ~ 3 万并发连接数.(这得益于 Nginx 使用了最新的 epoll 模型)</p>
</li>
<li class="lvl-2">
<p>事件驱动:通信机制采用 epoll 模型,支持更大的并发连接。</p>
</li>
</ul>
<h1 id="nginx-特性"><a class="markdownIt-Anchor" href="#nginx-特性"></a> nginx 特性</h1>
<p><strong>master/worker 结构:</strong> 一个 master 进程,生成一个或多个 worker 进程</p>
<p><strong>内存消耗小:</strong> 处理大并发的请求内存消耗非常小。在 3 万并发连接下,开启的 10 个 Nginx 进程才消耗 150M 内存(15M*10=150M)</p>
<p><strong>成本低廉:</strong> Nginx 为开源软件,可以免费使用。而购买 F5 BIG-IP、NetScaler 等硬件负载均衡交换机则需要十多万至几十万人民币</p>
<p><strong>内置的健康检查功能:</strong> 如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。</p>
<p><strong>节省带宽:</strong> 支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。</p>
<p><strong>稳定性高:</strong> 用于反向代理,宕机的概率微乎其微</p>
<p>1、nginx 代理和后端 web 服务器间无需长连接;</p>
<p>2、接收用户请求是异步的,即先将用户请求全部接收下来,再一次性发送后后端 web 服务器,极大的减轻后端 web 服务器的压力</p>
<p>3、发送响应报文时,是边接收来自后端 web 服务器的数据,边发送给客户端的</p>
<p>4、网络依赖型低。NGINX 对网络的依赖程度非常低,理论上讲,只要能够 ping 通就可以实施负载均衡,而且可以有效区分内网和外网流量</p>
<p>5、支持服务器检测。NGINX 能够根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障,并及时返回错误的请求重新提交到其它节点上</p>
<h1 id="nginx-配置"><a class="markdownIt-Anchor" href="#nginx-配置"></a> nginx 配置</h1>
<figure class="highlight nginx"><table><tr><td class="code"><pre><span class="line"><span class="section">upstream</span> www.blog.com {</span><br><span class="line"> <span class="comment">#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。</span></span><br><span class="line"> <span class="attribute">server</span> <span class="number">192.168.80.121:80</span> weight=<span class="number">3</span>;</span><br><span class="line"> <span class="attribute">server</span> <span class="number">192.168.80.122:80</span> weight=<span class="number">2</span>;</span><br><span class="line"> <span class="attribute">server</span> <span class="number">192.168.80.123:80</span> weight=<span class="number">3</span>;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
]]></content>
<categories>
<category>工作</category>
</categories>
<tags>
<tag>nginx</tag>
<tag>epoll</tag>
<tag>poll</tag>
<tag>linux</tag>
<tag>unix like os</tag>
</tags>
</entry>
<entry>
<title>revealjs-animated动画文档</title>
<url>//*/8212ba91.html</url>
<content><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p><a href="https://rogeralmeida.github.io/revealjs-animated-examples/">查看示例</a></p>
<h2 id="如何安装"><a class="markdownIt-Anchor" href="#如何安装"></a> 如何安装</h2>
<ol>
<li class="lvl-3">
<p>安装revealjs-animated插件</p>
</li>
</ol>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">npm install revealjs-animated</span><br></pre></td></tr></table></figure>
<ol start="2">
<li class="lvl-3">
<p>在Reveal.js中初始化安装路径</p>
</li>
</ol>
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">//index.html</span></span><br><span class="line"><span class="title class_">Reveal</span>.<span class="title function_">initialize</span>({</span><br><span class="line"> <span class="attr">dependencies</span>: [</span><br><span class="line"> <span class="comment">// Other plugins</span></span><br><span class="line"> {<span class="attr">src</span>: <span class="string">'node_modules/revealjs-animated/dist/revealjs-animated.js'</span>, <span class="attr">async</span>: <span class="literal">true</span>}</span><br><span class="line"> ]</span><br><span class="line">});</span><br></pre></td></tr></table></figure>
<h2 id="如何使用"><a class="markdownIt-Anchor" href="#如何使用"></a> 如何使用?</h2>
<h3 id="居中移动动画"><a class="markdownIt-Anchor" href="#居中移动动画"></a> 居中移动动画</h3>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--html--></span></span><br><span class="line"><span class="tag"><<span class="name">h1</span> <span class="attr">id</span>=<span class="string">"titulo"</span> <span class="attr">class</span>=<span class="string">"fragment animated move-to-middle-top"</span>></span>居中<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--md--></span></span><br><span class="line"># 居中<span class="comment"><!-- .element: class="fragment animated move-to-middle-top" --></span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="属性"><a class="markdownIt-Anchor" href="#属性"></a> 属性</h4>
<p>此动画不允许使用任何属性。</p>
<h3 id="自定义位置移动动画"><a class="markdownIt-Anchor" href="#自定义位置移动动画"></a> 自定义位置移动动画</h3>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--html--></span> </span><br><span class="line"><span class="tag"><<span class="name">p</span> <span class="attr">class</span>=<span class="string">"fragment animated move-to"</span>></span>默认参数<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--md--></span></span><br><span class="line">默认参数<span class="comment"><!-- .element: class="fragment animated move-to" --></span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="属性-2"><a class="markdownIt-Anchor" href="#属性-2"></a> 属性</h4>
<table>
<thead>
<tr>
<th>名称</th>
<th>默认值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>data-animated-move-to-left</td>
<td>50px</td>
<td>动画对象应在X轴上移动的距离</td>
</tr>
<tr>
<td>data-animated-move-to-top</td>
<td>25px</td>
<td>动画对象应在Y轴上移动的距离</td>
</tr>
</tbody>
</table>
<h3 id="放大动画"><a class="markdownIt-Anchor" href="#放大动画"></a> 放大动画</h3>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--html--></span> </span><br><span class="line"><span class="tag"><<span class="name">p</span> <span class="attr">class</span>=<span class="string">"fragment animated scale-up"</span>></span>放大<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"><span class="comment"><!--md--></span></span><br><span class="line">放大<span class="comment"><!-- .element: class="fragment animated scale-up" --></span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="属性-3"><a class="markdownIt-Anchor" href="#属性-3"></a> 属性</h4>
<table>
<thead>
<tr>
<th>名称</th>
<th>默认值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>data-animated-scale-up-from</td>
<td>1</td>
<td>起始值</td>
</tr>
<tr>
<td>data-animated-scale-up-to</td>
<td>2</td>
<td>最大值</td>
</tr>
</tbody>
</table>
<h3 id="缩小动画"><a class="markdownIt-Anchor" href="#缩小动画"></a> 缩小动画</h3>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--html--></span> </span><br><span class="line"><span class="tag"><<span class="name">p</span> <span class="attr">class</span>=<span class="string">"fragment animated scale-down"</span>></span>缩小<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"><span class="comment"><!--md--></span></span><br><span class="line">缩小<span class="comment"><!-- .element: class="fragment animated scale-down" --></span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="属性-4"><a class="markdownIt-Anchor" href="#属性-4"></a> 属性</h4>
<table>
<thead>
<tr>
<th>名称</th>
<th>默认值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>data-animated-scale-down-from</td>
<td>1</td>
<td>起始值</td>
</tr>
<tr>
<td>data-animated-scale-down-to</td>
<td>0.5</td>
<td>最小值</td>
</tr>
</tbody>
</table>
<h3 id="旋转动画"><a class="markdownIt-Anchor" href="#旋转动画"></a> 旋转动画</h3>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--html--></span> </span><br><span class="line"><span class="tag"><<span class="name">p</span> <span class="attr">class</span>=<span class="string">"fragment animated rotate"</span>></span>旋转<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"><span class="comment"><!--md--></span></span><br><span class="line">旋转<span class="comment"><!-- .element: class="fragment animated rotate" --></span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h4 id="属性-5"><a class="markdownIt-Anchor" href="#属性-5"></a> 属性</h4>
<table>
<thead>
<tr>
<th>名称</th>
<th>默认值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>data-animated-rotate-from</td>
<td><code>0deg</code></td>
<td>起始角度</td>
</tr>
<tr>
<td>data-animated-rotate-to</td>
<td><code>180deg</code></td>
<td>最大角度</td>
</tr>
</tbody>
</table>
<h2 id="时间属性"><a class="markdownIt-Anchor" href="#时间属性"></a> 时间属性</h2>
<p><code>duration</code>, <code>iteration</code> 和 <code>fill</code> 动画属性可以通过以下属性进行控制:</p>
<h4 id="属性-6"><a class="markdownIt-Anchor" href="#属性-6"></a> 属性</h4>
<table>
<thead>
<tr>
<th>名称</th>
<th>必填</th>
<th>默认值</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>data-animated-duration</td>
<td>否</td>
<td>1000</td>
<td>动画持续时间(毫秒)</td>
</tr>
<tr>
<td>data-animated-iterations</td>
<td>否</td>
<td>1</td>
<td>动画循环次数</td>
</tr>
<tr>
<td>data-animated-fill</td>
<td>否</td>
<td>forwards</td>
<td>动画最终状态 <code>forwards</code>, <code>none</code>, <code>backwards</code>, <code>both</code>, <code>auto</code>. 更多属性设置 <a href="https://developer.mozilla.org/en-US/docs/Web/API/EffectTiming/fill">MDN: EffectTiming.fill</a></td>
</tr>
</tbody>
</table>
<h1 id="组合动画"><a class="markdownIt-Anchor" href="#组合动画"></a> 组合动画</h1>
<p>从1.2.0版本开始,可以将多个动画组合在一起以创建动画。只需要添加多个CSS类。</p>
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--html--></span></span><br><span class="line"><span class="tag"><<span class="name">p</span> <span class="attr">class</span>=<span class="string">"fragment animated move-to-middle-top rotate"</span>></span>移动并旋转<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"><span class="comment"><!--md--></span></span><br><span class="line">移动并旋转<span class="comment"><!-- .element: class="fragment animated move-to-middle-top rotate" --></span></span><br></pre></td></tr></table></figure>
<p><a href="#general-time-attributes">时间属性</a> 只能用于组合动画,不能单独用于每个动画;</p>