-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
697 lines (334 loc) · 344 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
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>计算机新生笔记本购买指南</title>
<link href="/2024/07/26/ComputerFreshmanComputerBuyingGuide/"/>
<url>/2024/07/26/ComputerFreshmanComputerBuyingGuide/</url>
<content type="html"><![CDATA[<p class='p center logo large'>计算机新生笔记本购买指南</p><p class='p center small span blue'>引导你如何挑选出自己心仪的笔记本</p><div class="note info simple"><p>本书纯属个人观点,不完全带有客观性和正确性,如有疑问欢迎留言指正</p></div><h1 id="性能本or全能本or轻薄本?"><a href="#性能本or全能本or轻薄本?" class="headerlink" title="性能本or全能本or轻薄本?"></a>性能本or全能本or轻薄本?</h1><blockquote><p>温馨提示:所谓的游戏本就是性能本,游戏本是一个错误且狭窄的称呼,原意是以更高的性能释放作为卖点的笔记本,却被各大厂商作为一种营销噱头(针对游戏宅男),安上了游戏本的称呼,表现的好像只能用来打游戏一样,其实这是极为错误的认知,性能本在同价位会展现出最高的配置和体验。请大家不要用偏见看待游戏本。</p></blockquote><p><strong>先说结论,作为一名计算机学生,我只推荐性能本。</strong></p><h2 id="性能本"><a href="#性能本" class="headerlink" title="性能本"></a>性能本</h2><p>性能本在CPU、显卡等硬件上拥有更好的配置。在机身上也会安置更多的接口以便拓展。是以最高的性能体验为核心的笔记本。缺点是笨重,续航差。</p><h2 id="轻薄本"><a href="#轻薄本" class="headerlink" title="轻薄本"></a>轻薄本</h2><p>轻薄本则是牺牲了硬件配置,以最小最薄最轻最便携为理念,同时也会拥有更长的续航时间,这类笔记本适合于非理工科专业,业余使用者。</p><h2 id="全能本"><a href="#全能本" class="headerlink" title="全能本"></a>全能本</h2><p>全能本是介于性能本和全能本之间,这种最不推荐,上不去下不来。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>作为计算机学生,计算机是我们最重要、最常使用的工具,我们所要用到的软件和功能大多都需要强大的性能支撑。接下来我将列举哪些硬件在我们的使用中会作为瓶颈。</p><hr><h1 id="我需要什么样的配置?"><a href="#我需要什么样的配置?" class="headerlink" title="我需要什么样的配置?"></a>我需要什么样的配置?</h1><h2 id="CPU"><a href="#CPU" class="headerlink" title="CPU"></a>CPU</h2><blockquote><p>中央处理器(Central Processing Unit,简称CPU)作为<a href="https://baike.baidu.com/item/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F/7210959?fromModule=lemma_inlink">计算机系统</a>的<a href="https://baike.baidu.com/item/%E8%BF%90%E7%AE%97/5866856?fromModule=lemma_inlink">运算</a>和控制核心,是<a href="https://baike.baidu.com/item/%E4%BF%A1%E6%81%AF%E5%A4%84%E7%90%86/9855337?fromModule=lemma_inlink">信息处理</a>、程序运行的最终<a href="https://baike.baidu.com/item/%E6%89%A7%E8%A1%8C%E5%8D%95%E5%85%83/22689638?fromModule=lemma_inlink">执行单元</a>。</p></blockquote><p><strong>tips:英特尔酷睿的CPU配置不能只看i系列数,也要看世代数。同世代的CPU才能通过i系列数判断性能优劣,否则一律看实际评测。比如i7 14700(14代i7)就吊打i9 9900(9代i9)</strong><br><img src="/local_pic/D/2024-07-26-%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%96%B0%E7%94%9F%E7%94%B5%E8%84%91%E8%B4%AD%E4%B9%B0%E6%8C%87%E5%8D%97/intel-core-i3-i5-i7-and-i9-p3.avif" alt="CPU"></p><p>在一些渲染软件和平面设计软件中(如PS,Arnold,V-Ray……),CPU是最为重要的。不过如今CPU的性能已经溢出了,绝大多数情况下都不会产生CPU瓶颈。</p><h2 id="显卡"><a href="#显卡" class="headerlink" title="显卡"></a>显卡</h2><blockquote><p><strong>显卡</strong>(<strong>Video card</strong>、<strong>Display card</strong>、<strong>Graphics card</strong>、<strong>Video adapter</strong>)是个人<a href="https://baike.baidu.com/item/%E8%AE%A1%E7%AE%97%E6%9C%BA/140338?fromModule=lemma_inlink">计算机</a><a href="https://baike.baidu.com/item/%E5%9F%BA%E7%A1%80/5578582?fromModule=lemma_inlink">基础</a>的组成部分之一,将<a href="https://baike.baidu.com/item/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F/7210959?fromModule=lemma_inlink">计算机系统</a>需要的<a href="https://baike.baidu.com/item/%E6%98%BE%E7%A4%BA/9985945?fromModule=lemma_inlink">显示</a>信息进行<a href="https://baike.baidu.com/item/%E8%BD%AC%E6%8D%A2/197560?fromModule=lemma_inlink">转换</a><a href="https://baike.baidu.com/item/%E9%A9%B1%E5%8A%A8/2765136?fromModule=lemma_inlink">驱动</a><a href="https://baike.baidu.com/item/%E6%98%BE%E7%A4%BA%E5%99%A8/362722?fromModule=lemma_inlink">显示器</a>,并向显示器提供逐行或<a href="https://baike.baidu.com/item/%E9%9A%94%E8%A1%8C%E6%89%AB%E6%8F%8F/2081106?fromModule=lemma_inlink">隔行扫描</a>信号,控制<a href="https://baike.baidu.com/item/%E6%98%BE%E7%A4%BA%E5%99%A8/362722?fromModule=lemma_inlink">显示器</a>的正确显示,是连接<a href="https://baike.baidu.com/item/%E6%98%BE%E7%A4%BA%E5%99%A8/362722?fromModule=lemma_inlink">显示器</a>和<a href="https://baike.baidu.com/item/%E4%B8%AA%E4%BA%BA%E8%AE%A1%E7%AE%97%E6%9C%BA/3731770?fromModule=lemma_inlink">个人计算机</a><a href="https://baike.baidu.com/item/%E4%B8%BB%E6%9D%BF/104636?fromModule=lemma_inlink">主板</a>的重要组件,是“人机”的<a href="https://baike.baidu.com/item/%E9%87%8D%E8%A6%81%E8%AE%BE%E5%A4%87/417127?fromModule=lemma_inlink">重要设备</a>之一,其内置的<a href="https://baike.baidu.com/item/%E5%B9%B6%E8%A1%8C%E8%AE%A1%E7%AE%97/113443?fromModule=lemma_inlink">并行计算</a>能力现阶段也用于<a href="https://baike.baidu.com/item/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/3729729?fromModule=lemma_inlink">深度学习</a>等运算。</p></blockquote><p>显卡目前性能需求最大的硬件,随着人工智能时代来临,显卡的需求是永无止境的。对于训练人工智能(大语言模型,Topaz Gigapixel AI,torch),游戏开发(unreal engine),3D建模(blender,3DMax)等等,显卡都起到决定性作用,尤其在显存方面,是极大的瓶颈,至少需要<strong>6G</strong>显存才能玩本地大模型。轻薄本很少会有独立显卡,可以说是完全告别了这些软件了,所以再次强调,不要买轻薄本。</p><h2 id="内存条"><a href="#内存条" class="headerlink" title="内存条"></a>内存条</h2><blockquote><p>内存条是<a href="https://baike.baidu.com/item/CPU/120556?fromModule=lemma_inlink">CPU</a>可通过总线寻址,并进行读写操作的电脑部件。内存条在<a href="https://baike.baidu.com/item/%E4%B8%AA%E4%BA%BA%E7%94%B5%E8%84%91/3688503?fromModule=lemma_inlink">个人电脑</a>历史上曾经是<a href="https://baike.baidu.com/item/%E4%B8%BB%E5%86%85%E5%AD%98/8742017?fromModule=lemma_inlink">主内存</a>的扩展。随着电脑软、硬件技术不断更新的要求,内存条已成为读写内存的整体。我们通常所说电脑内存(<a href="https://baike.baidu.com/item/RAM/144481?fromModule=lemma_inlink">RAM</a>)的大小,即是指内存条的总容量。</p></blockquote><p>无论你是做什么,我都推荐你至少拥有<strong>16G</strong>的内存,在最常见的前后端开发岗位,例如Springboot+Vue,光是启动程序就能让16G内存吃满。如果你还使用了VMware,Wsl或是本地微服务,甚至会出现爆内存的现象。因此你将来如果需求够大,建议将内存加装到32G。</p><h2 id="硬盘"><a href="#硬盘" class="headerlink" title="硬盘"></a>硬盘</h2><blockquote><p>硬盘(hard disk)是计算机中最重要的<a href="https://baike.baidu.com/item/%E5%AD%98%E5%82%A8%E5%99%A8/0?fromModule=lemma_inlink">存储器</a>之一。计算机需要正常运行所需的大部分软件都存储在硬盘上。</p></blockquote><p><strong>tips:硬盘的存储空间一般称为辅存,内存条的存储空间一般称为内存(主存)。手机界的运行内存和内存是错误的概念。</strong></p><p>许多电脑默认硬盘空间是500GB,我推荐你至少将电脑硬盘加装到<strong>1TB</strong>。Windows系统所占空间十分庞大,正常使用两年,系统所占可达到<strong>200~300</strong>GB。对于计算机学生,会下载很多应用软件或程序项目,如果要用到Linux,还需要安装wsl,Vmware或是双系统。硬盘空间不够是经常能遇到的事情,我就后悔大一的时候没有将硬盘加装到2TB。</p><hr><h1 id="我该如何选择笔记本?"><a href="#我该如何选择笔记本?" class="headerlink" title="我该如何选择笔记本?"></a>我该如何选择笔记本?</h1><p><em>对于每个人来说,自己的需求和预算都不一样,并且大部分同学对硬件概念模糊,不可能给出所谓的标准答案。</em></p><p><strong>下面,我根据不同价位进行推荐</strong></p><h2 id="5000-6000"><a href="#5000-6000" class="headerlink" title="5000~6000"></a>5000~6000</h2><h3 id="七彩虹-隐星P15-12代i5版"><a href="#七彩虹-隐星P15-12代i5版" class="headerlink" title="七彩虹 隐星P15 (12代i5版)"></a>七彩虹 隐星P15 (12代i5版)</h3><ul><li>重量:2.15kg</li><li>固志硬盘:512GB</li><li>适配器重量: 595g</li><li>处理器:17-13620H</li><li>厚度: 24.9~26.0mm</li><li>内存:16GB DDR5 5600MHz</li><li>显卡:RTX 4060 8GB 独立显卡</li><li>屏幕:15.6英寸2560x1440分辨率</li><li>100%SRGB色域 165Hz刷新率IPS屏</li><li>参考价:5299</li></ul><p><strong>优点:1Z代i5性价比高,自色配色少见</strong><br><strong>缺点:性能释放保守,内部空间浪费</strong></p><p><a href="https://union-click.jd.com/jdc?p=JF8BATMJK1olXwICV15UCEkTB18IGloVXAQFVV5eAUMnRzBQRQQlBENHFRxWFlVPRjtUBABAQlRcCEBdCUoXAm0PGlsWVA4dDRsBVXtSazAAAQJSW2ZCAAtabzxVWzBBRA1TUQoyVFpaAU4VAmcAGmsVXAcDXVxUAEoSM18IHmtDMwYDVV9fDUkUBG04GVoUXQILUl1bDXsXBWwKG1oSVQQAVlldOEsfB197zcG9iI2hjO_l3MOZ18-zK2slXjYyV19fDEoWAm0KGzUQXQcCV1ZbCUMVbW0IGlsUWAcAV1ZtCHsUMzFmGggdXQcAAVYzVQBKAzpUUhN7XQULVlhbCkMnAW4JGVklbTYCMgMDAT9JBQ8PT19xNWN0ES4NXTFcURVmGT59HnZGUjwjaApDazBgZCF9bQMy&e=29551916_BV1R2YWevEd7_C_1723458518367q172a27a9a241q9566">七彩虹P15隐星24款4060游戏本15.6英寸笔记本电脑(12代i5/RTX4060-8G/16G/512G白色)1号会员店专供款</a></p><hr><h3 id="机械革命-蛟龙16Q"><a href="#机械革命-蛟龙16Q" class="headerlink" title="机械革命 蛟龙16Q"></a>机械革命 蛟龙16Q</h3><ul><li>重量:2.15kg</li><li>固态硬盘:512GB</li><li>适配器重量: 5959</li><li>处理器:17-13620H</li><li>厚度: 24.9~26.0mm</li><li>内存:16GB DDR5 5600MHz</li><li>显卡:RTX 4060 8GB 独立显卡</li><li>屏幕:15.6英寸 2560x1440分辨率</li><li>100%SRGB色域 165Hz刷新率IPS屏</li><li>参考价:5399</li></ul><p><strong>优点:超低售价,接口较多</strong></p><p><strong>缺点:屏幕亮度低,性能释放一般</strong></p><p><a href="https://union-click.jd.com/jdc?p=JF8BATUJK1olXwIDXFpbCksTBV8IGlocVAcCV11bDEwTCl9MRANLAjZbERscSkAJHTdNTwcKBlMdBgABFksWAmYBGlsWXgAGU1pUFxJSXzI4cgt8FWAHFws4awNHSgl-cD1sL3lLElJROEsTBGYNGVodVQcyVF9cCUIVCmcJHmslXQMyFTBdDUoSBm0JG2sXXAcCUFdbC00SM28OGFkVXAEKVlxcCk4nA2cMKyjDx67X3_2FufPDi-Hcu-AlbTYBZG5eCUkTAm4JGVkVMwMCVV5eAE0WC21mGVsUXQcHVVxeAHsXM2w4RTUUDgAKUVcNDSVKSDIITgdLVWgCV1daCkkTBF8KGloXXzYyZF1UcSNXSmlWcgdQOlRUKyEJbTseCzh4QDUXDllhICA7UUJ-SzdLawlWGFYyUW4&e=29551916_BV1R2YWevEd7_C_1723458518367q172a27a9a241q9566">机械革命(MECHREVO)蛟龙16Q锐龙R5-7535H满血独显RTX4060学生电竞游戏笔记本电脑 锐龙R5-7535H/4060 16G/1T(升级) 165Hz</a></p><hr><h2 id="6000-7000"><a href="#6000-7000" class="headerlink" title="6000~7000"></a>6000~7000</h2><h3 id="宏碁-暗影骑士·龙16"><a href="#宏碁-暗影骑士·龙16" class="headerlink" title="宏碁 暗影骑士·龙16"></a>宏碁 暗影骑士·龙16</h3><ul><li>重量:2.57kg</li><li>处理器:R9 7940H</li><li>适配器重量:2.57kg</li><li>厚度:26.7~30.3mm</li><li>固态硬盘:512GB 固态硬盘</li><li>屏幕:16英寸 2560x1600分辨率</li><li>165Hz刷新率 IPS屏</li><li>内存:16GB DDR5 5600MHz 内存</li><li>显卡:RTX4070 8GB 独立显卡(140W)</li><li>参考价:6199</li></ul><p><strong>优点:性价比不错,可以类到RX4D7D</strong><br><strong>缺点:噪音巨大,屏幕下边框宽</strong></p><p><a href="https://union-click.jd.com/jdc?p=JF8BAckJK1olXQADVVtZDk8RAV8KGFIUXAYAV1pcCntTXDdWRGtMGENDFlVDFhBPXDlfTwQKBlMdBgABFhNSVzMXQh5JAAhADhpRbzQUBA5yGShPHXx_UwEpXw5LY2pdUlpqMwR1IghYeklcQDVTQCBQA0VrHEkdBD9Iezx_aDxSKVl6MikuYxxwegx3bz9cHWNaLyEkfyxXZydvZyxPCwBnCzU0cS9eRApXbCRhB1NDIiwlUDx0fCh8Yg1xKk9XFyYtYwBDA2dJewNQNHJlIwkpcT9xegwIWCwXNW97Nj5JCj4nURpNH19qIGBgBFkgACNuVG58blJQGwoOZF5ZD0ISAW4AE1olXQcDVVdfAUMWBl84G14lHGgCVV9eCEMQBl8KGloVWQ8EV1hYOEsRAG0IGlwdXwQDU1htCEMTMxzegfPA1qXa5eaJgMXDo9Q4K2sWbTYBVVxZCUoWAW0IdV4VXAYBXFhcAEl5AW8JG1oQXAQBXG5dC3sUMzFmGggdXQABBlczVQBKAzpURRh7XQULUV5cCk0nAW4JGVklbTZlK11aaTEVcDVIYSYSAnJVEQI9DR5eAhBmGSxjCwNwVhUeUhBMeCpWWDJdbQMy&e=29551916_BV1R2YWevEd7_C_1723458518367q172a27a9a241q9566">宏碁(acer)宏基暗影骑士龙2024新16英寸4060显卡畅玩黑神话悟空非液金散热Ai算力高性能吃鸡游戏本笔记本电脑 龙5 R7-7840H/4060/165HZ 16G 512固态 官方标配</a></p><hr><h3 id="机械革命-极光X"><a href="#机械革命-极光X" class="headerlink" title="机械革命 极光X"></a>机械革命 极光X</h3><ul><li>重量:2.32kg</li><li>固态硬盘:1TB</li><li>适配器重量: 601g</li><li>厚度:22.5~25.0mm</li><li>处理器:17-12800HX</li><li>屏幕:16英寸 2560x1600分辨率</li><li>100%SRGB色域 165Hz刷新率 IPS屏</li><li>内存:16GB DDR5 4800MHz</li><li>显卡:RTX 4070 8GB 独立显卡(140W)</li><li>参考价:6199</li></ul><p><strong>优点:噪音相对较低,搭载4070性价比高</strong><br><strong>缺点:12代酷套拖累内存性能,键盘温度高</strong></p><p><a href="https://union-click.jd.com/jdc?p=JF8BATgJK1olXgEEU1ZdCU4WBF8IGloVXgMCV1pVC0gnRzBQRQQlBENHFRxWFlVPRjtUBABAQlRcCEBdCUoXAGoIGF8dXgUdDRsBVXtycQduexBrWWNyDCoBaQ1NUD1MWyhlUQoyVFpaAU4VAmcAGmsVXAcDXVxUAEoSM18IHmtXM9Gv34nOiZO7m7uolwtFDTYAVV9dDEIRAGkNK1sTXgQCVVlVCkkWBm84G1MRbXXUzvaIg-jPstfck9XB_b0yZG5eOHsUAm0MGloUXwQCOltdCUsUC2kJE1l7XwYDVF9YCUkUC18IK1glA2gDB1lYD0tFVgFVUAYVCFpcFjBdC0weAWgOGGsXXAcAVm5tOBZeAS9YcgBVD29SBBUAYx5Od2doXg1KPGgACFcgYyNRRmdacl9rOlV2ElhtDXs&e=29551916_BV1R2YWevEd7_C_1723458518367q172a27a9a241q9566">机械革命(MECHREVO)极光X 16英寸 酷睿i7HX 16核游戏本笔记本电脑(i7-12800HX 16G 512G RTX4060 2.5K屏 165Hz)</a></p><hr><h2 id="7000-8000"><a href="#7000-8000" class="headerlink" title="7000~8000"></a>7000~8000</h2><h3 id="宏碁-掠夺者·擎Ne0"><a href="#宏碁-掠夺者·擎Ne0" class="headerlink" title="宏碁 掠夺者·擎Ne0"></a>宏碁 掠夺者·擎Ne0</h3><ul><li>重量:2.62kg</li><li>固态硬盘:1TB</li><li>适配器重量:1.2kg</li><li>厚度:25.6~27.9mm</li><li>处理器:17-14700HX</li><li>内存:16GB DDR5 5600MHz</li><li>屏幕:16英寸2560x1600分辨率</li><li>100%DCI-P3色域 240Hz刷新率IPS屏</li><li>显卡:RTX4060 8GB独立显卡(140W)</li><li>参考价:7299</li></ul><p><strong>优点:散热好、接口多,促销时降价幅度大</strong><br><strong>缺点:风扇噪音很大,且风扇启动策略需要优化</strong></p><p><a href="https://union-click.jd.com/jdc?p=JF8BAdAJK1olXQADVVtZDk8RAV8IGloTXA8CV1xVDEMUCl9MRANLAjZbERscSkAJHTRQRA1CCVkdDwtCWhVLHTdNTwcKBENeCVAfUg8bAGZxcxtcW1hrCBslaypKdQ5tYD5TXQNXOlwOVyhjfQlREjJdBUdCJx9dWFxXDxtxaz5hFGFeICclaDJ0cDB8GQ1NOWJ-Eig_Uil1AhtObABlOGFbEhcqaktlYSZ8WztnB1VgHS4bfxRKdBsJeAxhJG5gIz1dST9IdzxzfSdrCllXJDcHABd0AR9QbDhyA3JdDg0qezBTd258D1lgbVZWE1YkXDdDZgd-eyFHAwJiNzZfCR0bD18IH1wcWAQDXFZcOEsWAm4BGVIdXAMyZF5YOAp5A24JGFsdWgMyVl9cCE8eBWwOHmsVWwUAVF9aAEkVAWcJK1sdWTZxgsT13cC0296wz9Obiaa5ZG5tC3snAG4KH1oUXAQAVDBYCEoXAGcOGlMXMwQCVV5cDUoVAGc4G1glXjZcOl8OD05DAm1YdQZeAAZXCBYKZksUBGYKHVIXbQQDVVxfOHsnAGZxcxtcW1hrCBslaypKdQ5tYD5TXQNXOlwOVyhjfQlREjJdBUdCJx9dWHsSMw&e=29551916_BV1R2YWevEd7_C_1723458518367q172a27a9a241q9566">宏碁(acer)宏基掠夺者擎Neo2023/2024新款暗影骑士擎6高端高性能旗舰机AI算力电竞本大学生游戏本笔记本电脑 13代13500HX-4060/8G/165定制 16G 1T固态 升级</a></p><hr><h3 id="华硕-天选5-Pro-锐龙版"><a href="#华硕-天选5-Pro-锐龙版" class="headerlink" title="华硕 天选5 Pro 锐龙版"></a>华硕 天选5 Pro 锐龙版</h3><ul><li>重量:2.23kg</li><li>固态硬盘:1TB</li><li>适配器重量: 7809</li><li>厚度:22.4~28.3mm</li><li>处理器:R9 7940HX</li><li>内存:16GB DDR5 5200MHz 内存</li><li>屏幕:16英寸 2560x1600分辨率</li><li>100%SRGB色域 165Hz刷新率 IPS屏</li><li>显卡:RTX 4070 8GB 独立显卡</li><li>参考价:7999</li></ul><p><strong>优点:CPU、内存、屏幕规格有提升</strong><br><strong>缺点:失去了4代续航优势</strong></p><p><a href="https://union-click.jd.com/jdc?p=JF8BASoJK1olXDYCVV9cAUkQAmsOHF8lGVlaCgFtUQ5SQi0DBUVNGFJeSwUIFxlJX3EIGloUVAQFVVpbD08IWipURmtuIGF5UFwqcS5JfSYOGD9pPWELIEQLBEcnA2sPEl4XXA4KVW5dCUoWCm0BE1oQbTYCUW4LZksWAm4JGloVVAUyVl9cCE8eBWwOHmsVWwUAVF9bCUoRCmcOK1sdWTZxgsT13cC0296wz9Obiaa5ZG5tC3snAG4KH1oUXAQAVDBYCEoXAGcOGlMXMwQCVV5cDUoVAGc4G2sWbVhsVQ1bCksSBG5mRhBIXVELAg0zCEgQAmsPH10lXwcDVlxtOHtRWxl9cC5TGFZWIgI2YBJ2WSR_cDxrIgRsVg4fAT53SDRKSyMWWV9wBgRUOE4n&e=29551916_BV1R2YWevEd7_C_1723458518354q172a26a174a207q9901">华硕天选5 Pro 锐龙版 16英寸电竞游戏本 笔记本电脑(R9-7940HX 16G 1T RTX4060 2.5K 165Hz 高色域)灰</a></p><hr><h2 id="8000-9000"><a href="#8000-9000" class="headerlink" title="8000~9000"></a>8000~9000</h2><h3 id="机械革命-耀世16Pro"><a href="#机械革命-耀世16Pro" class="headerlink" title="机械革命 耀世16Pro"></a>机械革命 耀世16Pro</h3><ul><li>重量:2.23kg</li><li>固态硬盘:1TB</li><li>适配器重量:697g</li><li>厚度:20.9~26.5mm</li><li>处理器:17-14650HX</li><li>内存:32CB DDR5 5600MHz</li><li>屏幕:16英寸2560x1600分辨率</li><li>100%SRCB色域 240Hz刷新率IPS屏</li><li>显卡:RIX4060 8GB独立显卡(140W)</li><li>参考价:8199</li></ul><p><strong>优点:性能释放激进,屏幕素质好</strong><br><strong>缺点:键盘中间热,同尺寸中电池小</strong></p><p><a href="https://union-click.jd.com/jdc?p=JF8BATgJK1olXgEEU1ZdCU4WBF8IGloVXQQDUlZZD0snRzBQRQQlBENHFRxWFlVPRjtUBABAQlRcCEBdCUoXA20JHVMRWgYdDRsBVXttAjJTfz9RVGNWCAghDUMWXQRUHQ5TUQoyVFpaAU4VAmcAGmsVXAcDXVxUAEoSM18IHmtXM9Gv34nOiZO7m7uolwtFDTYAVV9dDEIRAGkNK1sTXgQCVVhcCU0eBWY4G1MRbXXUzvaIg-jPstfck9XB_b0yZG5eOHsUAm0MGloUXwQCOltdCUsUC2kJE1l7XwYDVF9YCUkUC18IK1glA2gDB1lYAUsUBgFVUAYVCg9VHTBdC00VAmkLHWsXXAcAVm5tOCpvADR9GRhuBFt2H18NbilhU24OcBxFB2gAID0tdhx2dzxRQxsSDVZ_AwRtDXs&e=29551916_BV1R2YWevEd7_C_1723458518354q172a26a174a207q9901">机械革命耀世16Pro英特尔酷睿14代i7 16英寸游戏笔记本电脑(i7-14650HX 32G 1T RTX4060 240HZ 2.5K灰)</a></p><hr><h3 id="联想-拯救者-Y7000P-2024"><a href="#联想-拯救者-Y7000P-2024" class="headerlink" title="联想 拯救者 Y7000P 2024"></a>联想 拯救者 Y7000P 2024</h3><ul><li>重量:2.42kg</li><li>固态硬盘:1TB</li><li>适配器重量:8559</li><li>厚度:20.7~25.4mm</li><li>处理器:7-14700HX</li><li>屏幕:16英寸2560x1600分辨率</li><li>100%SRGB色域 165Hz刷新率IPS屏</li><li>内存:16GB DDR5 5600MHz内存</li><li>显卡:RTX4060 8CB独立显卡(140W)</li><li>参考价:8699</li></ul><p><strong>优点:散热进步大,支持140WE口充电</strong><br><strong>缺点:口壳质感廉价,超能模式噪音大</strong></p><p><a href="https://union-click.jd.com/jdc?p=JF8BAcEJK1olXDYCVV9cAU0TBm0KElglGVlaCgFtUQ5SQi0DBUVOBVlUAwoCFxBCHD1WR0VNGFJeSwcYVBYZQTVMF1gcJG5CHVgDYRdSe2tBGSYTOH1LPTw9USUVUDBrbyVzBA9rKQ5fbyBfej8fW1dhJHZnIy1dSTxuYw9_UltXJXNmPTwEbEljYWZYeQJpGXJ3LDc_QRlcdR0Bfz9mXARhJlcOahF_BBtQYzJuPmVBIicPbT90ZC5_byxICH9cDikFfxhgAxcBYyJhP3JhKxwqChF-ehx7TGtvHXhhLAFUfy50Wwd7TVhVVU5APVsbBEcnA2sPEl4XXA4KVW5dCUoWCm0BE1oQbTYCUW4LZksWAm4JGloVWQAyVl9cCE8eBWwOHmsVWwUAVF9bCUoRC2wOK1sdWTZxgsT13cC0296wz9Obiaa5ZG5tC3snAG4KH1oUXAQAVDBYCEoXAGcOGlMXMwQCVV5cDUoVAGc4G1glXjZcOl8ODkgXB2hadQZeAAZVXQgDZksUC28OHlkWbQQDVVxfOHsnAGZxcxtcW1hrCBslDAIVfmltYBJ8P2ZbOlwOVyhjfQlREjJoDQRlPxYkWHsSMw&e=29551916_BV1R2YWevEd7_C_1723458518354q172a26a174a207q9901">联想(Lenovo)拯救者Y7000P 2024 14代酷睿i7 16英寸电竞游戏笔记本电脑(i7-14650HX 16G 1T RTX4060 2.5K高刷)</a></p><hr><p><strong>望各位新生能买到自己心仪的笔记本</strong></p>]]></content>
<tags>
<tag> 生活杂谈 </tag>
</tags>
</entry>
<entry>
<title>MybatisPlus分页</title>
<link href="/2024/06/10/MybatisPlus%E5%8A%A0%E5%AF%86%E4%B8%8E%E5%88%86%E9%A1%B5/"/>
<url>/2024/06/10/MybatisPlus%E5%8A%A0%E5%AF%86%E4%B8%8E%E5%88%86%E9%A1%B5/</url>
<content type="html"><![CDATA[<h2 id="配置分页插件"><a href="#配置分页插件" class="headerlink" title="配置分页插件"></a>配置分页插件</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MybatisConfig</span> {</span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> MybatisPlusInterceptor <span class="title function_">mybatisPlusInterceptor</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">// 1.初始化核心插件</span></span><br><span class="line"> <span class="type">MybatisPlusInterceptor</span> <span class="variable">interceptor</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MybatisPlusInterceptor</span>();</span><br><span class="line"> <span class="comment">// 2.添加分页插件</span></span><br><span class="line"> <span class="type">PaginationInnerInterceptor</span> <span class="variable">pageInterceptor</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PaginationInnerInterceptor</span>(DbType.MYSQL);</span><br><span class="line"> pageInterceptor.setMaxLimit(<span class="number">1000L</span>); <span class="comment">// 设置分页上限</span></span><br><span class="line"> interceptor.addInnerInterceptor(pageInterceptor);</span><br><span class="line"> <span class="keyword">return</span> interceptor;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="使用示例"><a href="#使用示例" class="headerlink" title="使用示例"></a>使用示例</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testPageQuery</span><span class="params">()</span> { </span><br><span class="line"> <span class="comment">// 1.查询 </span></span><br><span class="line"> <span class="type">int</span> <span class="variable">pageNo</span> <span class="operator">=</span> <span class="number">1</span>, pageSize = <span class="number">5</span>; </span><br><span class="line"> <span class="comment">// 1.1.分页参数 </span></span><br><span class="line"> Page<User> page = Page.of(pageNo, pageSize); </span><br><span class="line"> <span class="comment">// 1.2.排序参数, 通过OrderItem来指定 </span></span><br><span class="line"> page.addOrder(<span class="keyword">new</span> <span class="title class_">OrderItem</span>(<span class="string">"balance"</span>, <span class="literal">false</span>)); </span><br><span class="line"> <span class="comment">// 1.3.分页查询 </span></span><br><span class="line"> Page<User> p = userService.page(page); </span><br><span class="line"> <span class="comment">// 2.总条数 </span></span><br><span class="line"> System.out.println(<span class="string">"total = "</span> + p.getTotal()); </span><br><span class="line"> <span class="comment">// 3.总页数</span></span><br><span class="line"> System.out.println(<span class="string">"pages = "</span> + p.getPages()); </span><br><span class="line"> <span class="comment">// 4.分页数据 </span></span><br><span class="line"> List<User> records = p.getRecords();</span><br><span class="line"> records.forEach(System.out::println);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> SpringBoot </category>
</categories>
<tags>
<tag> SpringBoot </tag>
</tags>
</entry>
<entry>
<title>SpringBoot自动注入实体类的创建与更新时间</title>
<link href="/2024/05/29/SpringBoot%E8%87%AA%E5%8A%A8%E6%B3%A8%E5%85%A5%E5%AE%9E%E4%BD%93%E7%B1%BB%E7%9A%84%E5%88%9B%E5%BB%BA%E6%97%B6%E9%97%B4%E5%92%8C%E6%9B%B4%E6%96%B0%E6%97%B6%E9%97%B4/"/>
<url>/2024/05/29/SpringBoot%E8%87%AA%E5%8A%A8%E6%B3%A8%E5%85%A5%E5%AE%9E%E4%BD%93%E7%B1%BB%E7%9A%84%E5%88%9B%E5%BB%BA%E6%97%B6%E9%97%B4%E5%92%8C%E6%9B%B4%E6%96%B0%E6%97%B6%E9%97%B4/</url>
<content type="html"><![CDATA[<h2 id="创建元对象处理类"><a href="#创建元对象处理类" class="headerlink" title="创建元对象处理类"></a>创建元对象处理类</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// handler/MyMetaObjectHandler</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyMetaObjectHandler</span> <span class="keyword">implements</span> <span class="title class_">MetaObjectHandler</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">insertFill</span><span class="params">(MetaObject metaObject)</span> {</span><br><span class="line"> <span class="built_in">this</span>.strictInsertFill(metaObject, <span class="string">"create_time"</span>, LocalDateTime.class, LocalDateTime.now()); <span class="comment">// 起始版本 3.3.0(推荐使用)</span></span><br><span class="line"> <span class="comment">// 或者</span></span><br><span class="line"><span class="comment">// this.strictUpdateFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)</span></span><br><span class="line"> <span class="comment">// 或者</span></span><br><span class="line"><span class="comment">// this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">updateFill</span><span class="params">(MetaObject metaObject)</span> {</span><br><span class="line"><span class="comment">// this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)</span></span><br><span class="line"> <span class="comment">// 或者</span></span><br><span class="line"> <span class="built_in">this</span>.strictUpdateFill(metaObject, <span class="string">"update_time"</span>, () -> LocalDateTime.now(), LocalDateTime.class); <span class="comment">// 起始版本 3.3.3(推荐)</span></span><br><span class="line"> <span class="comment">// 或者</span></span><br><span class="line"><span class="comment">// this.fillStrategy(metaObject, "updateTime", LocalDateTime.now()); // 也可以使用(3.3.0 该方法有bug)</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="实体类处理"><a href="#实体类处理" class="headerlink" title="实体类处理"></a>实体类处理</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 创建时间</span></span><br><span class="line"><span class="meta">@TableField(value = "create_time",fill = FieldFill.INSERT)</span></span><br><span class="line"><span class="keyword">private</span> LocalDateTime createTime;</span><br><span class="line"><span class="comment">// 修改时间</span></span><br><span class="line"><span class="meta">@TableField(value = "update_time",fill = FieldFill.UPDATE)</span></span><br><span class="line"><span class="keyword">private</span> LocalDateTime updateTime;</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> SpringBoot </category>
</categories>
<tags>
<tag> SpringBoot </tag>
</tags>
</entry>
<entry>
<title>AList使用须知</title>
<link href="/2024/05/29/AList%E4%BD%BF%E7%94%A8%E9%A1%BB%E7%9F%A5/"/>
<url>/2024/05/29/AList%E4%BD%BF%E7%94%A8%E9%A1%BB%E7%9F%A5/</url>
<content type="html"><![CDATA[<h2 id="网站说明"><a href="#网站说明" class="headerlink" title="网站说明"></a>网站说明</h2><p><strong>这是一个提供不限速直链的无需账号无需代理无需转存,点击即下的资源站。本站资源只供学习,完全公开免费。</strong></p><hr><h2 id="使用须知"><a href="#使用须知" class="headerlink" title="使用须知"></a>使用须知</h2><p><strong>若要下载在baidu目录下的资源,需要做一点简单的配置,以下列出两种方法,选其一即可</strong></p><h3 id="方法一:使用浏览器插件-只支持Chorme和Edge"><a href="#方法一:使用浏览器插件-只支持Chorme和Edge" class="headerlink" title="方法一:使用浏览器插件(只支持Chorme和Edge)"></a>方法一:使用浏览器插件(只支持Chorme和Edge)</h3><p><strong>点击获取浏览器拓展</strong></p><p><img src="/local_pic/D/2024-05-29-AList%E4%BD%BF%E7%94%A8%E9%A1%BB%E7%9F%A5/image-20240529180924551.png" alt="image-20240529181557485"></p><p><strong>在搜索框输入User-Agent Switcher and Manager,点击获取。</strong></p><p><strong>在下载本站资源前,点击插件,完全替换userAgent里的内容为pan.baidu.com然后点击Apply(all windows)即可</strong></p><p><img src="/local_pic/D/2024-05-29-AList%E4%BD%BF%E7%94%A8%E9%A1%BB%E7%9F%A5/image-20240529181245693.png" alt="image-20240529181557485"></p><p><strong>在下载完毕后,再次打开插件,点击Reset(以避免影响其他网站的使用)</strong></p><h3 id="方法二:修改控制台"><a href="#方法二:修改控制台" class="headerlink" title="方法二:修改控制台"></a>方法二:修改控制台</h3><p><strong>首先不进行任何设置,直接选择一个文件进行下载,会弹出以下报错页面</strong></p><p><img src="/local_pic/D/2024-05-29-AList%E4%BD%BF%E7%94%A8%E9%A1%BB%E7%9F%A5/image-20240529181557485.png" alt="image-20240529181557485"></p><p><strong>在报错页面,点击键盘上的F12打开控制台</strong></p><p><strong>点击控制台的网络选项(Network),点击里面的更多网络条件(是一个wifi的图标)</strong></p><p><strong>在下方的User agent区域,取消勾选Use browser default,然后在下面第二个输入框内输入pan.baidu.com。</strong></p><p><strong>输入完毕后直接点击左上角的刷新即可</strong></p>]]></content>
<categories>
<category> 网站搭建 </category>
</categories>
<tags>
<tag> 网站搭建 </tag>
</tags>
</entry>
<entry>
<title>AList部署</title>
<link href="/2024/05/28/AList%E9%83%A8%E7%BD%B2/"/>
<url>/2024/05/28/AList%E9%83%A8%E7%BD%B2/</url>
<content type="html"><![CDATA[<h2 id="部署AList"><a href="#部署AList" class="headerlink" title="部署AList"></a>部署AList</h2><h3 id="新建路径文件夹"><a href="#新建路径文件夹" class="headerlink" title="新建路径文件夹"></a>新建路径文件夹</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> /www/wwwroot/alist.yumefusaka</span><br></pre></td></tr></table></figure><h3 id="安装AList"><a href="#安装AList" class="headerlink" title="安装AList"></a>安装AList</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL <span class="string">"https://alist.nn.ci/v3.sh"</span> | bash -s install /www/wwwroot/alist.yumefusaka</span><br></pre></td></tr></table></figure><blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">官方提供的命令:</span><br><span class="line"><span class="comment"># Install</span></span><br><span class="line">curl -fsSL <span class="string">"https://alist.nn.ci/v3.sh"</span> | bash -s install /www/wwwroot/alist.yumefusaka</span><br><span class="line"><span class="comment"># update</span></span><br><span class="line">curl -fsSL <span class="string">"https://alist.nn.ci/v3.sh"</span> | bash -s update /www/wwwroot/alist.yumefusaka</span><br><span class="line"><span class="comment"># Uninstall</span></span><br><span class="line">curl -fsSL <span class="string">"https://alist.nn.ci/v3.sh"</span> | bash -s uninstall /www/wwwroot/alist.yumefusaka</span><br><span class="line"></span><br><span class="line">启动: systemctl start alist</span><br><span class="line">关闭: systemctl stop alist</span><br><span class="line">状态: systemctl status alist</span><br><span class="line">重启: systemctl restart alist</span><br></pre></td></tr></table></figure></blockquote><h3 id="修改密码"><a href="#修改密码" class="headerlink" title="修改密码"></a>修改密码</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /www/wwwroot/alist.yumefusaka/alist</span><br><span class="line">./alist admin <span class="built_in">set</span> NEW_PASSWORD</span><br></pre></td></tr></table></figure><h3 id="进入AList"><a href="#进入AList" class="headerlink" title="进入AList"></a>进入AList</h3><p><strong>开放安全组和防火墙后即可通过ip:5244访问AList</strong></p><hr><h2 id="宝塔设置反向代理"><a href="#宝塔设置反向代理" class="headerlink" title="宝塔设置反向代理"></a><strong>宝塔设置反向代理</strong></h2><h3 id="登录宝塔面板,添加站点"><a href="#登录宝塔面板,添加站点" class="headerlink" title="登录宝塔面板,添加站点"></a>登录宝塔面板,添加站点</h3><p><img src="/local_pic/D/2024-05-28-AList%E9%83%A8%E7%BD%B2/bt_new_website.png" alt="bt_new_website"></p><h3 id="修改站点设置"><a href="#修改站点设置" class="headerlink" title="修改站点设置"></a>修改站点设置</h3><p><img src="/local_pic/D/2024-05-28-AList%E9%83%A8%E7%BD%B2/bt_new_website_01.png" alt="bt_new_website_01"></p><h3 id="删除面板默认代码"><a href="#删除面板默认代码" class="headerlink" title="删除面板默认代码"></a>删除面板默认代码</h3><p><img src="/local_pic/D/2024-05-28-AList%E9%83%A8%E7%BD%B2/bt_delete_default_config_01.png" alt="bt_delete_default_config_01"></p><p><img src="/local_pic/D/2024-05-28-AList%E9%83%A8%E7%BD%B2/bt_delete_default_config_02.png" alt="bt_delete_default_config_02"></p><p>在网站配置文件的 server 字段中添加</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">location / {</span><br><span class="line"> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line"> proxy_set_header X-Forwarded-Proto $scheme;</span><br><span class="line"> proxy_set_header Host $http_host;</span><br><span class="line"> proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line"> proxy_set_header Range $http_range;</span><br><span class="line">proxy_set_header If-Range $http_if_range;</span><br><span class="line"> proxy_redirect off;</span><br><span class="line"> proxy_pass http://127.0.0.1:5244;</span><br><span class="line"> # the max size of file to upload</span><br><span class="line"> client_max_body_size 20000m;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>如果需要使用HTTP/3,需要将对应<code>HOST</code>行修改为:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">proxy_set_header Host $host:$server_port;</span><br></pre></td></tr></table></figure><p>这样修改后的配置同时也可以兼容HTTP/2及更低版本的请求。</p><p>并在<code>/www/server/nginx/conf/proxy.conf</code>中或对应网站配置文件中设置禁用Nginx缓存,否则默认配置下访问较大文件时Nginx会先尝试将远程文件缓存至本机,导致播放失败</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">proxy_cache cache_one; # 删除这一行</span><br><span class="line">proxy_max_temp_file_size 0; #加上这一行</span><br></pre></td></tr></table></figure><h3 id="添加反向代理"><a href="#添加反向代理" class="headerlink" title="添加反向代理"></a>添加反向代理</h3><p><img src="https://alist.nn.ci/img/guide/reverse_proxy/bt_reverse_proxy.png" alt="bt_reverse_proxy"></p><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> 网站搭建 </category>
</categories>
<tags>
<tag> 网站搭建 </tag>
</tags>
</entry>
<entry>
<title>在Linux下使用Clash</title>
<link href="/2024/05/12/%E5%9C%A8Linux%E4%B8%8B%E4%BD%BF%E7%94%A8Clash/"/>
<url>/2024/05/12/%E5%9C%A8Linux%E4%B8%8B%E4%BD%BF%E7%94%A8Clash/</url>
<content type="html"><![CDATA[<h1 id="准备Clash"><a href="#准备Clash" class="headerlink" title="准备Clash"></a>准备Clash</h1><h2 id="全程以管理员身份进行"><a href="#全程以管理员身份进行" class="headerlink" title="全程以管理员身份进行"></a>全程以管理员身份进行</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">su</span><br></pre></td></tr></table></figure><h2 id="下载Clash"><a href="#下载Clash" class="headerlink" title="下载Clash"></a>下载Clash</h2><p><strong>下载链接:<a href="https://down.clash.la/Clash/Core/Premium/clash-linux-amd64-v3-latest.gz">Clash</a></strong></p><h2 id="解压并进入文件夹"><a href="#解压并进入文件夹" class="headerlink" title="解压并进入文件夹"></a>解压并进入文件夹</h2><h3 id="设置为可执行文件"><a href="#设置为可执行文件" class="headerlink" title="设置为可执行文件"></a>设置为可执行文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x clash-linux-amd64-v3 </span><br></pre></td></tr></table></figure><h3 id="移动并改名"><a href="#移动并改名" class="headerlink" title="移动并改名"></a>移动并改名</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mv</span> clash-linux-amd64-v3 /usr/local/bin/clash</span><br></pre></td></tr></table></figure><h3 id="查看版本"><a href="#查看版本" class="headerlink" title="查看版本"></a>查看版本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">clash -v</span><br></pre></td></tr></table></figure><h3 id="首次启动"><a href="#首次启动" class="headerlink" title="首次启动"></a>首次启动</h3><p><strong>启动Clash客户端生成config.yaml文件</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">clash</span><br></pre></td></tr></table></figure><p><strong>INFO[0000] Can’t find config, create a initial config file</strong><br><strong>INFO[0000] Can’t find MMDB, start download</strong><br><strong>ERRO[0002] create addr 127.0.0.1:7890 tcp listener error. err:listen tcp 127.0.0.1:7890: bind: address already in use</strong><br><strong>启动 clash 提示以上错误,你就直接使用 ctrl+c 跳过执行 cd $HOME/.config/clash/</strong></p><h3 id="进入目录"><a href="#进入目录" class="headerlink" title="进入目录"></a>进入目录</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> <span class="variable">$HOME</span>/.config/clash/</span><br></pre></td></tr></table></figure><h3 id="导入订阅"><a href="#导入订阅" class="headerlink" title="导入订阅"></a>导入订阅</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget -O config.yaml 订阅地址</span><br></pre></td></tr></table></figure><h3 id="再次启动"><a href="#再次启动" class="headerlink" title="再次启动"></a>再次启动</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">clash</span><br></pre></td></tr></table></figure><div class="note info simple"><p><strong>如果报错则说明订阅地址不是clash格式,需要转换一下</strong></p><p><strong>转换网址:<a href="https://subconverters.com/">https://subconverters.com/</a></strong></p><p><strong>如果转换后的地址无法用wget写入,则可以手动进入地址,将内容复制到config.yaml中</strong></p></div><hr><h1 id="生成-systemd-配置文件"><a href="#生成-systemd-配置文件" class="headerlink" title="生成 systemd 配置文件"></a>生成 systemd 配置文件</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> > /etc/systemd/system/clash.service << <span class="string">EOF</span></span><br><span class="line"><span class="string">[Unit]</span></span><br><span class="line"><span class="string">Description=Clash - A rule-based tunnel in Go</span></span><br><span class="line"><span class="string">Documentation=https://github.com/Dreamacro/clash/wiki</span></span><br><span class="line"><span class="string">[Service]</span></span><br><span class="line"><span class="string">OOMScoreAdjust=-1000</span></span><br><span class="line"><span class="string">ExecStart=/usr/local/bin/clash -f /root/.config/clash/config.yaml</span></span><br><span class="line"><span class="string">Restart=on-failure</span></span><br><span class="line"><span class="string">RestartSec=5</span></span><br><span class="line"><span class="string">[Install]</span></span><br><span class="line"><span class="string">WantedBy=multi-user.target</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><hr><h1 id="配置开机自启"><a href="#配置开机自启" class="headerlink" title="配置开机自启"></a>配置开机自启</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="built_in">enable</span> clash</span><br></pre></td></tr></table></figure><hr><h1 id="启动-clash-服务"><a href="#启动-clash-服务" class="headerlink" title="启动 clash 服务"></a>启动 clash 服务</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl start clash</span><br></pre></td></tr></table></figure><hr><h1 id="配置环境变量"><a href="#配置环境变量" class="headerlink" title="配置环境变量"></a>配置环境变量</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> -e <span class="string">"export http_proxy=http://127.0.0.1:7890\nexport https_proxy=http://127.0.0.1:7890"</span> >> ~/.bashrc</span><br></pre></td></tr></table></figure><hr><h1 id="配置系统代理"><a href="#配置系统代理" class="headerlink" title="配置系统代理"></a>配置系统代理</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># HTTP 代理</span></span><br><span class="line">127.0.0.1:7890</span><br><span class="line"></span><br><span class="line"><span class="comment"># HTTPS 代理</span></span><br><span class="line">127.0.0.1:7890</span><br><span class="line"></span><br><span class="line"><span class="comment"># Socks 主机</span></span><br><span class="line">127.0.0.1:7891</span><br></pre></td></tr></table></figure><p><img src="/local_pic/D/2024-05-12-%E5%9C%A8Linux%E4%B8%8B%E4%BD%BF%E7%94%A8Clash/4be43706735d38c58f27b831775cb302.png" alt="img"></p><hr><h1 id="节点管理"><a href="#节点管理" class="headerlink" title="节点管理"></a>节点管理</h1><p><strong>全部设置完成后,在浏览器输入以下网址,即可进行节点管理</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://clash.razord.top</span><br></pre></td></tr></table></figure><p><img src="/local_pic/D/2024-05-12-%E5%9C%A8Linux%E4%B8%8B%E4%BD%BF%E7%94%A8Clash/b4170e02533f8ab7f8e48cb79dec6e3e_720.png" alt="img"></p><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> Linux </category>
</categories>
<tags>
<tag> Linux </tag>
</tags>
</entry>
<entry>
<title>Grub多系统引导美化</title>
<link href="/2024/05/11/Grub%E5%A4%9A%E7%B3%BB%E7%BB%9F%E5%BC%95%E5%AF%BC/"/>
<url>/2024/05/11/Grub%E5%A4%9A%E7%B3%BB%E7%BB%9F%E5%BC%95%E5%AF%BC/</url>
<content type="html"><![CDATA[<h1 id="下载美化主题"><a href="#下载美化主题" class="headerlink" title="下载美化主题"></a>下载美化主题</h1><p><strong><a href="https://www.gnome-look.org/browse?cat=109&ord=latest">GRUB Themes</a></strong></p><hr><h1 id="安装主题"><a href="#安装主题" class="headerlink" title="安装主题"></a>安装主题</h1><p><strong>以joker主题为例</strong></p><h2 id="将解压后的-joker-复制到-grub-themes-目录"><a href="#将解压后的-joker-复制到-grub-themes-目录" class="headerlink" title="将解压后的 joker 复制到 grub themes 目录"></a>将解压后的 joker 复制到 grub themes 目录</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">cp</span> -r joker /usr/share/grub/themes</span><br></pre></td></tr></table></figure><h2 id="编辑-grub-文件"><a href="#编辑-grub-文件" class="headerlink" title="编辑 grub 文件"></a>编辑 grub 文件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /etc/default/grub</span><br></pre></td></tr></table></figure><h2 id="将主题添加到-grub-文件"><a href="#将主题添加到-grub-文件" class="headerlink" title="将主题添加到 grub 文件"></a>将主题添加到 grub 文件</h2><p><strong>文件的底部</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GRUB_THEME="/usr/share/grub/themes/theme.txt"</span><br></pre></td></tr></table></figure><h2 id="更新-grub"><a href="#更新-grub" class="headerlink" title="更新 grub"></a>更新 grub</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo grub-mkconfig -o /boot/grub/grub.cfg</span><br></pre></td></tr></table></figure><h2 id="重新启动计算机"><a href="#重新启动计算机" class="headerlink" title="重新启动计算机"></a>重新启动计算机</h2><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> Linux </category>
</categories>
<tags>
<tag> Linux </tag>
</tags>
</entry>
<entry>
<title>搭建OneIndex个人网盘</title>
<link href="/2024/05/09/%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/"/>
<url>/2024/05/09/%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/</url>
<content type="html"><![CDATA[<h2 id="下载OneIndex安装包"><a href="#下载OneIndex安装包" class="headerlink" title="下载OneIndex安装包"></a>下载OneIndex安装包</h2><p><strong>下载链接:<a href="https://codeload.github.com/xieqifei/OneindexN/zip/refs/tags/v2.0">https://codeload.github.com/xieqifei/OneindexN/zip/refs/tags/v2.0</a></strong></p><p><strong>解压在服务器上你所指定的位置</strong></p><hr><h2 id="安装环境"><a href="#安装环境" class="headerlink" title="安装环境"></a>安装环境</h2><p><strong>用宝塔面板,安装PHP(选择7.x版本)和Nginx</strong></p><p><img src="/local_pic/D/2024-05-09-%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/image-20240509172916779.png" alt="image-20240509172916779"></p><hr><h2 id="部署网站"><a href="#部署网站" class="headerlink" title="部署网站"></a>部署网站</h2><p><strong>选择网站→PHP项目→添加站点</strong></p><p><strong>根目录就是你解压的目录,记得指定你安装的php版本</strong></p><p><strong>部署好后使用指定的域名进入网站</strong></p><p><img src="/local_pic/D/2024-05-09-%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/image-20240509210224137.png" alt="image-20240509210224137"></p><p><strong>点击下一步后出现页面</strong></p><p><img src="/local_pic/D/2024-05-09-%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/image-20240509210259406.png" alt="image-20240509210259406"></p><p><strong>我们需要三个参数:</strong></p><ul><li>client_secret:应用机密,即:<strong>客户端密码</strong>。</li><li>client_id:应用ID,即:<strong>应用代号</strong>。</li><li>URL:这个URL用于创建应用时,授权验证。</li></ul><hr><h2 id="创建应用"><a href="#创建应用" class="headerlink" title="创建应用"></a>创建应用</h2><p><a href="https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade">https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade</a></p><h4 id="点击新注册"><a href="#点击新注册" class="headerlink" title="点击新注册"></a>点击新注册</h4><p><strong>之后,我们填入需要的参数:</strong></p><ul><li>名称:最好为<strong>纯英文</strong>。</li><li>受支持的帐户类型:如图:<strong>选择任何组织目录的账号和个人</strong></li><li>重定向 URI:这里填入我建立的API: <code>https://tool.mintimate.cn/oneindexM/</code></li></ul><p><img src="/local_pic/D/2024-05-09-%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/image-20240509210657280.png" alt="image-20240509210657280"></p><p><strong>填写完点击注册即可</strong></p><hr><h2 id="设置权限"><a href="#设置权限" class="headerlink" title="设置权限"></a>设置权限</h2><p><strong>在获取应用机密前,我们需要设置权限,点击:<code>API权限</code>-<code>Microsoft Graph</code>:</strong><br><img src="/local_pic/D/2024-05-09-%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/image-20240509210922778.png" alt="image-20240509210922778"></p><p><strong>依此勾选:</strong></p><ul><li><strong>offline_access</strong></li><li><strong>Files.Read</strong></li><li><strong>Files.Read.All</strong></li></ul><p><strong>最后更新权限即可:</strong></p><p><img src="/local_pic/D/2024-05-09-%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/image-20240509211056249.png" alt="image-20240509211056249"></p><p><strong>到此,设置权限结束,接下来,我们可以去获取机密了。</strong></p><hr><h2 id="获取应用ID"><a href="#获取应用ID" class="headerlink" title="获取应用ID"></a>获取应用ID</h2><p><strong>应用ID很好获取,注册了后,即可获得:</strong><br><img src="/local_pic/D/2024-05-09-%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/image-20240509211607575.png" alt="image-20240509211607575"></p><hr><h2 id="获取机密"><a href="#获取机密" class="headerlink" title="获取机密"></a>获取机密</h2><p><strong>最后,我们可以获取应用机密(密钥)了,点击:<code>证书和密码</code>-<code>新建客户端密码</code>:</strong></p><p><img src="/local_pic/D/2024-05-09-%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/image-20240509211219452.png" alt="image-20240509211219452"></p><p><strong>按提示设置即可得到密钥</strong></p><p><strong>回到OneIndex设置并下一步,然后绑定账号,提示安装成功</strong></p><hr><h2 id="管理后台"><a href="#管理后台" class="headerlink" title="管理后台"></a>管理后台</h2><p><strong>首先更改密码</strong></p><p><img src="/local_pic/D/2024-05-09-%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/image-20240509212221465.png" alt="image-20240509212221465"></p><p><strong>设置起始目录,这样,就等于将根目录下Share文件夹以及Share文件夹下的子文件夹以及文件划给OneIndex,其他文件夹OneIndex依旧不可读,也就不会公开。避免隐私泄露。</strong></p><p><img src="/local_pic/D/2024-05-09-%E6%90%AD%E5%BB%BAOneIndex%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%9B%98/image-20240509212454174.png" alt="image-20240509212454174"></p><p><strong>最后我们需要初始化网盘,点击页面缓存,选择重建所有缓存。</strong></p><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> 网站搭建 </category>
</categories>
<tags>
<tag> 网站搭建 </tag>
</tags>
</entry>
<entry>
<title>安装Maven与MySQL</title>
<link href="/2024/05/08/%E5%AE%89%E8%A3%85maven%E4%B8%8Emysql/"/>
<url>/2024/05/08/%E5%AE%89%E8%A3%85maven%E4%B8%8Emysql/</url>
<content type="html"><![CDATA[<h2 id="Maven"><a href="#Maven" class="headerlink" title="Maven"></a>Maven</h2><h4 id="下载Maven"><a href="#下载Maven" class="headerlink" title="下载Maven"></a>下载Maven</h4><p><strong><a href="https://maven.apache.org/download.cgi">Maven – Download Apache Maven</a></strong></p><p><img src="/local_pic/D/2024-05-08-%E5%AE%89%E8%A3%85maven%E4%B8%8Emysql/image-20240508203420101.png" alt="image-20240508203420101"></p><p><strong>下载后无需安装,解压在想要的目录即可</strong></p><h4 id="配置镜像源"><a href="#配置镜像源" class="headerlink" title="配置镜像源"></a>配置镜像源</h4><p><strong>路径为~/apache-maven-3.6.1/conf/setting.xml</strong></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">mirrors</span>></span></span><br><span class="line"> <span class="comment"><!--阿里镜像的配置--></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">id</span>></span>nexus-aliyun<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mirrorOf</span>></span>central<span class="tag"></<span class="name">mirrorOf</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>Nexus 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">mirror</span>></span></span><br><span class="line"><span class="tag"></<span class="name">mirrors</span>></span></span><br></pre></td></tr></table></figure><h4 id="Idea配置maven路径"><a href="#Idea配置maven路径" class="headerlink" title="Idea配置maven路径"></a>Idea配置maven路径</h4><p><strong>每次打开新项目都需要配置</strong></p><p><img src="/local_pic/D/2024-05-08-%E5%AE%89%E8%A3%85maven%E4%B8%8Emysql/image-20240508204947164.png" alt="image-20240508204947164"></p><p><img src="/local_pic/D/2024-05-08-%E5%AE%89%E8%A3%85maven%E4%B8%8Emysql/image-20240508205002510.png" alt="image-20240508205002510"></p><hr><h2 id="MySQL"><a href="#MySQL" class="headerlink" title="MySQL"></a>MySQL</h2><h4 id="下载MySQL"><a href="#下载MySQL" class="headerlink" title="下载MySQL"></a>下载MySQL</h4><p><a href="https://dev.mysql.com/downloads/mysql/">MySQL :: Download MySQL Community Server</a></p><p><img src="/local_pic/D/2024-05-08-%E5%AE%89%E8%A3%85maven%E4%B8%8Emysql/image-20240508205503583.png" alt="image-20240508205503583"></p><h4 id="安装MySQL"><a href="#安装MySQL" class="headerlink" title="安装MySQL"></a>安装MySQL</h4><p><strong>会自动进行两次安装,初次全按默认配置一直按next即可</strong></p><p><strong>第二次安装基本按照默认配置,需指定root用户的密码</strong></p><p><strong>中间会出现选择路径和应用设置,参考下图</strong></p><div class="note info simple"><p><strong>路径可随意选择,但不要点击右侧按钮,选择自己手动写入路径</strong></p></div><p><img src="/local_pic/D/2024-05-08-%E5%AE%89%E8%A3%85maven%E4%B8%8Emysql/a1434ef09b57b0048ed200fa092887d1.png" alt="a1434ef09b57b0048ed200fa092887d1"></p><p><img src="/local_pic/D/2024-05-08-%E5%AE%89%E8%A3%85maven%E4%B8%8Emysql/38e2d5821de04e79d9c43cfd61e75d3a.png" alt="38e2d5821de04e79d9c43cfd61e75d3a"></p><h4 id="Idea配置MySQL数据库"><a href="#Idea配置MySQL数据库" class="headerlink" title="Idea配置MySQL数据库"></a>Idea配置MySQL数据库</h4><p><strong>安装驱动(推荐安装8.0.21版本)</strong></p><p><img src="/local_pic/D/2024-05-08-%E5%AE%89%E8%A3%85maven%E4%B8%8Emysql/image-20240508211156491.png" alt="image-20240508211156491"></p><p><strong>安装并应用后输入密码,点击测试连接会弹出失败弹窗,此时只需设置时域(按默认的UTC即可)</strong></p><p><img src="/local_pic/D/2024-05-08-%E5%AE%89%E8%A3%85maven%E4%B8%8Emysql/b3d086b5104fde1252a8ba4c1eeb389a.png" alt="b3d086b5104fde1252a8ba4c1eeb389a"></p><p><img src="/local_pic/D/2024-05-08-%E5%AE%89%E8%A3%85maven%E4%B8%8Emysql/380eb8c9ea1160516fd33492b0045902.png" alt="380eb8c9ea1160516fd33492b0045902"></p><p><strong>重新输入账号密码,点击测试连接,提示成功则配置完毕</strong></p><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> SpringBoot </category>
</categories>
<tags>
<tag> SpringBoot </tag>
</tags>
</entry>
<entry>
<title>搭建属于自己的AI网站</title>
<link href="/2024/05/06/%E6%90%AD%E5%BB%BA%E5%B1%9E%E4%BA%8E%E8%87%AA%E5%B7%B1%E7%9A%84AI%E7%BD%91%E7%AB%99/"/>
<url>/2024/05/06/%E6%90%AD%E5%BB%BA%E5%B1%9E%E4%BA%8E%E8%87%AA%E5%B7%B1%E7%9A%84AI%E7%BD%91%E7%AB%99/</url>
<content type="html"><![CDATA[<div class="note info flat"><p><strong>必须要拥有一台服务器,且安装了宝塔面板,nginx,docker</strong></p></div><h2 id="获取AI工具的API-key"><a href="#获取AI工具的API-key" class="headerlink" title="获取AI工具的API key"></a>获取AI工具的API key</h2><p><strong>以下推荐两个渠道,请按需选择其一</strong></p><h4 id="OpenAI-HK"><a href="#OpenAI-HK" class="headerlink" title="OpenAI-HK"></a>OpenAI-HK</h4><p> <strong><a href="https://openai-hk.com/v3/ai">OpenAI-HK</a> 是收费的,可以使用几乎所有AI工具</strong></p><h4 id="GPT-API-free"><a href="#GPT-API-free" class="headerlink" title="GPT-API-free"></a>GPT-API-free</h4><p><strong><a href="https://github.com/chatanywhere/GPT_API_free">GPT-API-free</a> 可以申请免费API,但是只能使用GPT3.5。当然也可以选择付费API</strong></p><hr><h2 id="部署网站"><a href="#部署网站" class="headerlink" title="部署网站"></a>部署网站</h2><h4 id="创建部署引导文件"><a href="#创建部署引导文件" class="headerlink" title="创建部署引导文件"></a>创建部署引导文件</h4><div class="note info flat"><p><strong>选择一个文件夹并创建deploy.sh和docker-compose.yml</strong></p></div><h4 id="deploy-sh"><a href="#deploy-sh" class="headerlink" title="deploy.sh"></a>deploy.sh</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">set</span> -e</span><br><span class="line">docker compose pull</span><br><span class="line">docker compose up -d --remove-orphans</span><br><span class="line">docker compose restart</span><br><span class="line"><span class="comment">#老版docker 下面的</span></span><br><span class="line"><span class="comment"># docker-compose pull</span></span><br><span class="line"><span class="comment"># docker-compose up -d --remove-orphans</span></span><br></pre></td></tr></table></figure><h4 id="docker-compose-yml"><a href="#docker-compose-yml" class="headerlink" title="docker-compose.yml"></a>docker-compose.yml</h4><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line"> <span class="attr">gptweb:</span></span><br><span class="line"> <span class="attr">image:</span> <span class="string">ydlhero/chatgpt-web-midjourney-proxy:latest</span></span><br><span class="line"> <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line"> <span class="attr">environment:</span></span><br><span class="line"> <span class="attr">OPENAI_API_KEY:</span> {{ <span class="string">Key</span> }}</span><br><span class="line"> <span class="attr">OPENAI_API_BASE_URL:</span> {{ <span class="string">Key的url</span> }}</span><br><span class="line"> <span class="attr">MJ_SERVER:</span> {{ <span class="string">Key的url</span> }}</span><br><span class="line"> <span class="attr">MJ_API_SECRET:</span> {{ <span class="string">Key</span> }}</span><br><span class="line"> <span class="attr">HIDE_SERVER:</span> <span class="number">1</span></span><br><span class="line"> <span class="attr">API_UPLOADER:</span> <span class="number">1</span></span><br><span class="line"> <span class="attr">MJ_API_GALLERY:</span> <span class="number">1</span></span><br><span class="line"> <span class="attr">AUTH_SECRET_ERROR_COUNT:</span> <span class="number">3</span></span><br><span class="line"> <span class="attr">AUTH_SECRET_ERROR_TIME:</span> <span class="number">10</span></span><br><span class="line"> <span class="comment">#你的密码 必须由英文或者数字或者下划线组成 (不能用中文)</span></span><br><span class="line"> <span class="attr">AUTH_SECRET_KEY:</span> {{ <span class="string">网站密码</span> }}</span><br><span class="line"> <span class="attr">FILE_SERVER:</span> <span class="string">http://up.openai-hk.com:3102/v1/upload</span></span><br><span class="line"> <span class="attr">ports:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">"<span class="template-variable">{{ 开放端口 }}</span>:3002"</span></span><br><span class="line"> <span class="attr">volumes:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">/data/mj_uploads:/app/uploads</span></span><br></pre></td></tr></table></figure><p><strong>OpenAI-HK的url: <a href="https://api.openai-hk.com/">https://api.openai-hk.com</a></strong></p><p><strong>GPT-API-free的url: <a href="https://api.chatanywhere.tech/">https://api.chatanywhere.tech</a></strong></p><p><strong>填入的开放端口一定要记得在安全组里设置好哦</strong></p><h4 id="启动部署"><a href="#启动部署" class="headerlink" title="启动部署"></a>启动部署</h4><p><strong>在控制台输入</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash deploy.sh</span><br></pre></td></tr></table></figure><p><strong>部署完毕后就可以访问啦</strong></p><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> 网站搭建 </category>
</categories>
<tags>
<tag> 网站搭建 </tag>
</tags>
</entry>
<entry>
<title>vue打包为单文件html</title>
<link href="/2024/05/05/vue%E6%89%93%E5%8C%85%E4%B8%BA%E5%8D%95%E6%96%87%E4%BB%B6html/"/>
<url>/2024/05/05/vue%E6%89%93%E5%8C%85%E4%B8%BA%E5%8D%95%E6%96%87%E4%BB%B6html/</url>
<content type="html"><![CDATA[<h2 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h2><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">pnpm i vite<span class="literal">-plugin-singlefile</span></span><br><span class="line">pnpm i unplugin<span class="literal">-auto-import</span></span><br><span class="line">pnpm i unplugin<span class="literal">-vue-components</span></span><br></pre></td></tr></table></figure><hr><h2 id="修改vite-config-ts"><a href="#修改vite-config-ts" class="headerlink" title="修改vite.config.ts"></a>修改vite.config.ts</h2><figure class="highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> {viteSingleFile} <span class="keyword">from</span> <span class="string">"vite-plugin-singlefile"</span>; <span class="comment">// [!code ++]</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title function_">defineConfig</span>({</span><br><span class="line"> <span class="attr">plugins</span>: [</span><br><span class="line"> <span class="title function_">vue</span>(),</span><br><span class="line"> <span class="title function_">viteSingleFile</span>(), <span class="comment">// [!code ++]</span></span><br><span class="line"> ],</span><br><span class="line"> ...</span><br><span class="line">})</span><br></pre></td></tr></table></figure><hr><h2 id="执行构建命令"><a href="#执行构建命令" class="headerlink" title="执行构建命令"></a>执行构建命令</h2><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm build</span><br></pre></td></tr></table></figure><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> VUE </category>
</categories>
<tags>
<tag> VUE </tag>
</tags>
</entry>
<entry>
<title>pnpm安装并指定存储路径</title>
<link href="/2024/05/05/pnpm%E5%AE%89%E8%A3%85%E5%B9%B6%E6%8C%87%E5%AE%9A%E5%AD%98%E5%82%A8%E8%B7%AF%E5%BE%84/"/>
<url>/2024/05/05/pnpm%E5%AE%89%E8%A3%85%E5%B9%B6%E6%8C%87%E5%AE%9A%E5%AD%98%E5%82%A8%E8%B7%AF%E5%BE%84/</url>
<content type="html"><![CDATA[<h2 id="安装pnpm"><a href="#安装pnpm" class="headerlink" title="安装pnpm"></a>安装pnpm</h2><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install <span class="literal">-g</span> pnpm</span><br></pre></td></tr></table></figure><hr><h2 id="配置镜像源"><a href="#配置镜像源" class="headerlink" title="配置镜像源"></a>配置镜像源</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm set registry https://registry.npmmirror.com</span><br></pre></td></tr></table></figure><hr><h2 id="配置全局安装路径"><a href="#配置全局安装路径" class="headerlink" title="配置全局安装路径"></a>配置全局安装路径</h2><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 允许设置全局安装包的 bin 文件的目标目录。</span></span><br><span class="line">pnpm config <span class="built_in">set</span> global<span class="literal">-bin-dir</span> <span class="string">"E:\Tool\pnpm"</span> </span><br><span class="line"><span class="comment"># 包元数据缓存的位置。</span></span><br><span class="line">pnpm config <span class="built_in">set</span> cache<span class="literal">-dir</span> <span class="string">"E:\Tool\pnpm\cache"</span> </span><br><span class="line"><span class="comment"># pnpm 创建的当前仅由更新检查器使用的 pnpm-state.json 文件的目录。</span></span><br><span class="line">pnpm config <span class="built_in">set</span> state<span class="literal">-dir</span> <span class="string">"E:\Tool\pnpm\state"</span> </span><br><span class="line"><span class="comment"># 指定储存全局依赖的目录。</span></span><br><span class="line">pnpm config <span class="built_in">set</span> global<span class="literal">-dir</span> <span class="string">"E:\Tool\pnpm\global"</span> </span><br><span class="line"><span class="comment"># 所有包被保存在磁盘上的位置。</span></span><br><span class="line">pnpm config <span class="built_in">set</span> store<span class="literal">-dir</span> <span class="string">"E:\Tool\pnpm\store"</span></span><br></pre></td></tr></table></figure><hr><p><strong>记得要先在指定的位置创建好文件夹哦</strong></p><h2 id="配置系统环境变量"><a href="#配置系统环境变量" class="headerlink" title="配置系统环境变量"></a>配置系统环境变量</h2><p><img src="/local_pic/D/2024-05-05-pnpm%E5%AE%89%E8%A3%85%E5%B9%B6%E6%8C%87%E5%AE%9A%E5%AD%98%E5%82%A8%E8%B7%AF%E5%BE%84/image-20240505180253106.png" alt="image-20240505180253106"></p><p><img src="/local_pic/D/2024-05-05-pnpm%E5%AE%89%E8%A3%85%E5%B9%B6%E6%8C%87%E5%AE%9A%E5%AD%98%E5%82%A8%E8%B7%AF%E5%BE%84/image-20240505180319651.png" alt="image-20240505180319651"></p><hr><h2 id="验证设置是否正确"><a href="#验证设置是否正确" class="headerlink" title="验证设置是否正确"></a>验证设置是否正确</h2><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm c get</span><br></pre></td></tr></table></figure><p><img src="/local_pic/D/2024-05-05-pnpm%E5%AE%89%E8%A3%85%E5%B9%B6%E6%8C%87%E5%AE%9A%E5%AD%98%E5%82%A8%E8%B7%AF%E5%BE%84/image-20240505171608675.png" alt="image-20240505171608675"></p><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> VUE </category>
</categories>
<tags>
<tag> VUE </tag>
</tags>
</entry>
<entry>
<title>安装wsl2</title>
<link href="/2024/05/04/%E5%AE%89%E8%A3%85wsl2/"/>
<url>/2024/05/04/%E5%AE%89%E8%A3%85wsl2/</url>
<content type="html"><![CDATA[<h2 id="wsl安装"><a href="#wsl安装" class="headerlink" title="wsl安装"></a>wsl安装</h2><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--install</span></span><br><span class="line">dism.exe /online /<span class="built_in">enable-feature</span> /featurename:Microsoft<span class="literal">-Windows-Subsystem-Linux</span> /all /norestart</span><br><span class="line">dism.exe /online /<span class="built_in">enable-feature</span> /featurename:VirtualMachinePlatform /all /norestart</span><br><span class="line">wsl <span class="literal">--set-default-version</span> <span class="number">2</span></span><br></pre></td></tr></table></figure><p><strong>然后重启重启电脑!!!!wsl的安装就完成了。</strong></p><hr><h2 id="安装Ubuntu子系统"><a href="#安装Ubuntu子系统" class="headerlink" title="安装Ubuntu子系统"></a>安装Ubuntu子系统</h2><h4 id="列出可安装的系统版本"><a href="#列出可安装的系统版本" class="headerlink" title="列出可安装的系统版本"></a>列出可安装的系统版本</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl.exe <span class="literal">--list</span> <span class="literal">--online</span></span><br></pre></td></tr></table></figure><p><img src="/local_pic/D/2024-05-04-%E5%AE%89%E8%A3%85wsl2/image-20240504143749485.png" alt="image-20240504143749485"></p><h4 id="选择一个系统版本安装-这里我选择Ubuntu-24-04"><a href="#选择一个系统版本安装-这里我选择Ubuntu-24-04" class="headerlink" title="选择一个系统版本安装(这里我选择Ubuntu-24.04)"></a>选择一个系统版本安装(这里我选择Ubuntu-24.04)</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl.exe <span class="literal">--install</span> Ubuntu<span class="literal">-24</span>.<span class="number">04</span></span><br></pre></td></tr></table></figure><p><strong>安装好后设置账号密码即可</strong></p><hr><h2 id="迁移Wsl至其他盘"><a href="#迁移Wsl至其他盘" class="headerlink" title="迁移Wsl至其他盘"></a>迁移Wsl至其他盘</h2><blockquote><p>列如这里我迁移到E:\Ubuntu下</p></blockquote><h4 id="导出子系统为tar包"><a href="#导出子系统为tar包" class="headerlink" title="导出子系统为tar包"></a>导出子系统为tar包</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--export</span> Ubuntu<span class="literal">-24</span>.<span class="number">04</span> E:\Ubuntu\Ubuntu.tar</span><br></pre></td></tr></table></figure><h4 id="注销子系统"><a href="#注销子系统" class="headerlink" title="注销子系统"></a>注销子系统</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--unregister</span> Ubuntu<span class="literal">-24</span>.<span class="number">04</span></span><br></pre></td></tr></table></figure><h4 id="导入子系统到指定文件夹"><a href="#导入子系统到指定文件夹" class="headerlink" title="导入子系统到指定文件夹"></a>导入子系统到指定文件夹</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--import</span> Ubuntu<span class="literal">-24</span>.<span class="number">04</span> E:\Ubuntu E:\Ubuntu\Ubuntu.tar</span><br></pre></td></tr></table></figure><p><strong>成功导入后即可删除tar包</strong></p><hr><h2 id="设置wsl2属性"><a href="#设置wsl2属性" class="headerlink" title="设置wsl2属性"></a>设置wsl2属性</h2><div class="note danger flat"><p><strong>需要Windows 11 23H2 或更高版本</strong></p></div><h4 id="设置网络模式为镜像模式"><a href="#设置网络模式为镜像模式" class="headerlink" title="设置网络模式为镜像模式"></a>设置网络模式为镜像模式</h4><p><strong>在镜像模式下主机可以直接通过localhost访问到wsl的端口</strong></p><p><strong>打开主机的 C:\Users{用户名} 目录,创建.wslconfig文件并写入</strong></p><figure class="highlight properties"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">[experimental]</span></span><br><span class="line"><span class="attr">networkingMode</span>=<span class="string">mirrored</span></span><br></pre></td></tr></table></figure><h4 id="以下还有其他的属性可以配置,请按需写入"><a href="#以下还有其他的属性可以配置,请按需写入" class="headerlink" title="以下还有其他的属性可以配置,请按需写入"></a>以下还有其他的属性可以配置,请按需写入</h4><figure class="highlight properties"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Settings apply across all Linux distros running on WSL 2</span></span><br><span class="line"><span class="attr">[wsl2]</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"># Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB</span></span><br><span class="line"><span class="attr">memory</span>=<span class="string">8GB</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"># Sets the VM to use two virtual processors</span></span><br><span class="line"><span class="attr">processors</span>=<span class="string">8</span></span><br><span class="line"></span><br><span class="line"><span class="attr">[experimental]</span></span><br><span class="line"><span class="attr">autoMemoryReclaim</span>=<span class="string">gradual # 开启自动回收内存,可在 gradual, dropcache, disabled 之间选择</span></span><br><span class="line"><span class="attr">networkingMode</span>=<span class="string">mirrored # 开启镜像网络</span></span><br><span class="line"><span class="attr">dnsTunneling</span>=<span class="string">true # 开启 DNS Tunneling</span></span><br><span class="line"><span class="attr">firewall</span>=<span class="string">true # 开启 Windows 防火墙</span></span><br><span class="line"><span class="attr">autoProxy</span>=<span class="string">true # 开启自动同步代理</span></span><br><span class="line"><span class="attr">sparseVhd</span>=<span class="string">true # 开启自动释放 WSL2 虚拟硬盘空间</span></span><br></pre></td></tr></table></figure><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> Windows </category>
</categories>
<tags>
<tag> Windows </tag>
</tags>
</entry>
<entry>
<title>安装pytorch环境与配置</title>
<link href="/2024/05/04/%E5%AE%89%E8%A3%85pytorch%E7%8E%AF%E5%A2%83%E4%B8%8E%E9%85%8D%E7%BD%AE/"/>
<url>/2024/05/04/%E5%AE%89%E8%A3%85pytorch%E7%8E%AF%E5%A2%83%E4%B8%8E%E9%85%8D%E7%BD%AE/</url>
<content type="html"><![CDATA[<h2 id="下载anaconda安装包"><a href="#下载anaconda安装包" class="headerlink" title="下载anaconda安装包"></a>下载anaconda安装包</h2><p><strong>点击去下载</strong> <a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/">anaconda清华镜像</a>,<strong>下载完成后安装</strong></p><hr><h2 id="点击win键搜索Anaconda-Prompt打开控制台"><a href="#点击win键搜索Anaconda-Prompt打开控制台" class="headerlink" title="点击win键搜索Anaconda Prompt打开控制台"></a>点击win键搜索Anaconda Prompt打开控制台</h2><div class="note danger flat"><p><strong>版本取决于你的显卡,需要去pytorch和显卡驱动官网查阅</strong></p></div><h4 id="下载python"><a href="#下载python" class="headerlink" title="下载python"></a>下载python</h4><div class="note info simple"><p><strong>若anaconda默认python版本符合要求,则可直接使用默认,跳过这一小节</strong></p></div><p><strong>安装python并启用环境</strong></p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">conda create <span class="literal">-n</span> pytorch python=<span class="number">3.6</span></span><br><span class="line">conda activate pytorch</span><br></pre></td></tr></table></figure><h4 id="下载pytorch"><a href="#下载pytorch" class="headerlink" title="下载pytorch"></a>下载pytorch</h4><p><img src="/local_pic/D/2024-05-04-%E5%AE%89%E8%A3%85pytorch%E7%8E%AF%E5%A2%83%E4%B8%8E%E9%85%8D%E7%BD%AE/image-20240505211319492.png" alt="image-20240505211319492"></p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">conda install pytorch torchvision torchaudio pytorch<span class="literal">-cuda</span>=<span class="number">11.8</span> <span class="literal">-c</span> pytorch <span class="literal">-c</span> nvidia</span><br></pre></td></tr></table></figure><h4 id="安装完毕后进入python进行测试"><a href="#安装完毕后进入python进行测试" class="headerlink" title="安装完毕后进入python进行测试"></a>安装完毕后进入python进行测试</h4><p><img src="/local_pic/D/2024-05-04-%E5%AE%89%E8%A3%85pytorch%E7%8E%AF%E5%A2%83%E4%B8%8E%E9%85%8D%E7%BD%AE/image-20240505214607208.png" alt="image-20240505214607208"></p><h4 id="若成功显示为True则说明安装成功"><a href="#若成功显示为True则说明安装成功" class="headerlink" title="若成功显示为True则说明安装成功"></a>若成功显示为True则说明安装成功</h4><hr><h2 id="在pycharm中开发pytorch项目"><a href="#在pycharm中开发pytorch项目" class="headerlink" title="在pycharm中开发pytorch项目"></a>在pycharm中开发pytorch项目</h2><h4 id="新建项目选择添加解释器"><a href="#新建项目选择添加解释器" class="headerlink" title="新建项目选择添加解释器"></a>新建项目选择添加解释器</h4><p><img src="/local_pic/D/2024-05-04-%E5%AE%89%E8%A3%85pytorch%E7%8E%AF%E5%A2%83%E4%B8%8E%E9%85%8D%E7%BD%AE/image-20240505220411259.png" alt="image-20240505220411259"></p><h4 id="然后选择anaconda目录下的python-exe"><a href="#然后选择anaconda目录下的python-exe" class="headerlink" title="然后选择anaconda目录下的python.exe"></a>然后选择anaconda目录下的python.exe</h4><p><img src="/local_pic/D/2024-05-04-%E5%AE%89%E8%A3%85pytorch%E7%8E%AF%E5%A2%83%E4%B8%8E%E9%85%8D%E7%BD%AE/image-20240505220507146.png" alt="image-20240505220507146"></p><p><strong>点击确定,创建即可</strong></p><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> Python深度学习 </category>
</categories>
<tags>
<tag> Python深度学习 </tag>
</tags>
</entry>
<entry>
<title>安装docker-desktop</title>
<link href="/2024/05/04/%E5%AE%89%E8%A3%85docker-desktop/"/>
<url>/2024/05/04/%E5%AE%89%E8%A3%85docker-desktop/</url>
<content type="html"><![CDATA[<h2 id="下载Docker-Desktop"><a href="#下载Docker-Desktop" class="headerlink" title="下载Docker Desktop"></a>下载Docker Desktop</h2><p><a href="">点击链接下载 Docker Desktop:[https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe](https://desktop.docker.com/win/main/amd64/Docker Desktop Installer.exe)</a></p><p><strong>下载完毕后安装即可</strong></p><hr><h2 id="启动Ubuntu子系统的集成"><a href="#启动Ubuntu子系统的集成" class="headerlink" title="启动Ubuntu子系统的集成"></a>启动Ubuntu子系统的集成</h2><p><strong>打开docker,在settings中启用</strong></p><p><img src="/local_pic/D/2024-05-04-%E5%AE%89%E8%A3%85docker-desktop/image-20240504155028109.png" alt="image-20240504155028109"></p><hr><h2 id="迁移Docker镜像位置"><a href="#迁移Docker镜像位置" class="headerlink" title="迁移Docker镜像位置"></a>迁移Docker镜像位置</h2><h4 id="关闭wsl和docker"><a href="#关闭wsl和docker" class="headerlink" title="关闭wsl和docker"></a>关闭wsl和docker</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--shutdown</span></span><br></pre></td></tr></table></figure><p><strong>在电脑桌面的右下角点击Docker Desktop图标退出当前应用</strong></p><h4 id="检查是否关闭完全"><a href="#检查是否关闭完全" class="headerlink" title="检查是否关闭完全"></a>检查是否关闭完全</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--list</span> <span class="literal">-v</span></span><br></pre></td></tr></table></figure><p><img src="/local_pic/D/2024-05-04-%E5%AE%89%E8%A3%85docker-desktop/image-20240504153608240.png" alt="image-20240504153608240"></p><h4 id="导出docker为tar包"><a href="#导出docker为tar包" class="headerlink" title="导出docker为tar包"></a>导出docker为tar包</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--export</span> docker<span class="literal">-desktop</span> E:\Tool\docker\docker<span class="literal">-desktop</span>.tar </span><br><span class="line">wsl <span class="literal">--export</span> docker<span class="literal">-desktop-data</span> E:\Tool\docker\docker<span class="literal">-desktop-data</span>.tar</span><br></pre></td></tr></table></figure><h4 id="注销docker"><a href="#注销docker" class="headerlink" title="注销docker"></a>注销docker</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--unregister</span> docker<span class="literal">-desktop-data</span></span><br><span class="line">wsl <span class="literal">--unregister</span> docker<span class="literal">-desktop</span></span><br></pre></td></tr></table></figure><h4 id="导入jar包至指定文件夹"><a href="#导入jar包至指定文件夹" class="headerlink" title="导入jar包至指定文件夹"></a>导入jar包至指定文件夹</h4><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">wsl <span class="literal">--import</span> docker<span class="literal">-desktop</span> E:\Tool\docker E:\Tool\docker\docker<span class="literal">-desktop</span>.tar </span><br><span class="line">wsl <span class="literal">--import</span> docker<span class="literal">-desktop-data</span> E:\Tool\docker\data E:\Tool\docker\docker<span class="literal">-desktop-data</span>.tar </span><br></pre></td></tr></table></figure><p><strong>导入完成后可删除tar包</strong></p><hr><h2 id="修改docker的data文件夹路径"><a href="#修改docker的data文件夹路径" class="headerlink" title="修改docker的data文件夹路径"></a>修改docker的data文件夹路径</h2><p><strong>打开docker的settings设置</strong></p><p><img src="/local_pic/D/2024-05-04-%E5%AE%89%E8%A3%85docker-desktop/image-20240504155230472.png" alt="image-20240504155230472"></p><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> Windows </category>
</categories>
<tags>
<tag> Windows </tag>
</tags>
</entry>
<entry>
<title>win11安装系统指定用户名</title>
<link href="/2024/05/03/win11%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F%E6%8C%87%E5%AE%9A%E7%94%A8%E6%88%B7%E5%90%8D/"/>
<url>/2024/05/03/win11%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F%E6%8C%87%E5%AE%9A%E7%94%A8%E6%88%B7%E5%90%8D/</url>
<content type="html"><![CDATA[<h2 id="问题引入"><a href="#问题引入" class="headerlink" title="问题引入"></a>问题引入</h2><p><strong>微软在win11 做了策略改变。</strong></p><p><strong>win11 家庭版 和 专业版,安装时,默认需联网,诱导用户注册和登录微软账户。</strong></p><p><strong>win11 企业版 和 教育版,安装时,仍然保持老样子 —— 无需联网,无需注册和登录微软账户。</strong></p><p><strong>所以,如果不想麻烦,那就安装 win11 企业版 和 教育版,而不安装 win11 家庭版和专业版。</strong></p><p><strong>如果你想在当前系统里修改本地用户名,那不好,后续会有一大堆麻烦,最好是重装系统,重新创建本地用户名和本地密码。</strong></p><p><strong>如果你在当前系统里改名,改完后,各个软件会失效,需重新安装软件,那跟重装没区别了。</strong></p><br /><p><strong>C 盘 User 的用户名,取决于你安装系统时是否联了网,是否登录了微软账户。</strong></p><p><strong>如果你安装 win11 时联网了,并且注册和登录了微软账户,</strong></p><p><strong>那它默认会截取你的微软账户的前 5 位,作为你的 C 盘 User 的用户名。这是微软的机制。</strong></p><p><strong>无论你的微软账户名有多长,它始终都只截取前 5 位,作为 C:\Users\用户名。</strong></p><p><strong>如果你安装win11时联网并登录了微软账户,那你以后每次开机都必须登录微软账户(需联网)。</strong></p><p><strong>但 C:\Users\用户名 不是微软账户的完整名,而只是微软账户的前 5 位。</strong></p><br /><p><strong>只有在断网状态下安装(重装) win11,它才允许你创建本地用户名。</strong></p><p><strong>断网状态下,你创建的本地用户名,可以任意取,它与微软账户毫无关联!</strong></p><p><strong>此时,这个本地用户名,既是你 C 盘 User 用户名,也是开机登录的用户名。</strong></p><p><strong>以后,你每次开机都是登录这个本地用户名。无论是否联网,都能正常登录。</strong></p><p><strong>现在的问题在于,微软要求你联网,才让你安装 win11。</strong> </p><p><strong>win11无论全新安装还是重装,默认都要求你联网,要求你注册微软账户,并登录微软账户。</strong></p><p><strong>微软这么做,是为了逼迫(诱导)用户注册微软账户,扩大自己的影响力。</strong></p><p><strong>假如你不联网,那个“下一步”按钮就一直是灰色的,点不了。安装过程将无法继续。</strong></p><p><strong>一旦你联网并登录了微软账户,那它会截取微软账户的前 5 位,作为 C盘 User 文件夹的名字。</strong></p><p><strong>要想不被微软挟持,必须在断网状态下安装 win11。</strong></p><p><strong>但是断网状态,“下一步”是灰色的,点不了。死循环。应该怎么办呢?</strong></p><hr><h2 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h2><p><strong>在 “让我们为你连接到网络”的页面, 按 Shift + F10 ,调出 cmd 黑框。</strong></p><p><strong>笔记本如果 Shift + F10 没反应,那就按 Fn + Shift + F10 。</strong></p><p><strong>在 cmd 黑框内先任意点一下鼠标左键,再输入 oobe\bypassnro 回车,它会立刻自动重启。</strong></p><p><strong>oobe\bypassnro 这串字母是连续的,不含空格, e 后面是一个右斜杠,别打成左斜杠了。</strong></p><p><strong>这串字母,不区分大小写。全大写 或 全小写,均可。但那个右斜杠必须有。</strong></p><p><strong>重启后,再次到“让我们为你连接到网络”的页面,右下角会多一个“我没有 internet 连接”。</strong></p><p><strong>你点击 “我没有 internet 连接” → “继续执行受限设置”,就能创建本地用户名和密码了。</strong></p><p><strong>这样进了桌面后,你就会发现 C 盘的 User 文件夹的名字与你的本地用户名完全相同。</strong></p><p><strong>以后,每次开机登录时,都是这个本地用户名和密码。(开机登录本地用户,无需联网)</strong></p><hr><h2 id="温馨提示"><a href="#温馨提示" class="headerlink" title="温馨提示"></a>温馨提示</h2><p><strong>创建本地用户名,有讲究,不可乱取名,一般按以下三个原则取名:</strong></p><p><strong>1、最好是全字母、全数字、或 字母与数字的组合。</strong></p><p><strong>2、不含中文,且不含空格。别取个全中文的名,也别取个中英文混合的名。</strong></p><p><strong>3、不要太长,最好不超过 10 个字符。</strong></p><p><strong>如果你的本地用户名里含了中文或空格,将来安装某些外国软件时,会出 bug。</strong></p><p><strong>许多外国软件,它要求每一层路径里都不能含中文,也不能含空格。</strong></p><p><strong>举几个很坏的例子。假设你取个中文名张鹏。</strong></p><p><strong>那你的用户数据目录就是 C:\Users\张鹏\AppData 含了中文,将来可能出错。</strong></p><p><strong>再比如,你取名叫 zhang peng (zhang后面有空格)</strong></p><p><strong>User 目录就是 C:\Users\zhang peng\AppData 含了空格,将来可能出错。</strong></p><br /><p><strong>什么样的本地用户名是“好”名字?我也举几个正面例子:</strong></p><p><strong>zhang 全字母型。这个人姓张,所以这样取名。</strong> </p><p><strong>lenovo 全字母型。这台电脑是联想,联想的英文是 lenovo,所以这样取名。</strong></p><p><strong>985211 全数字型。这个人希望考上 985 或 211 重点大学,所以这样取名。</strong></p><p><strong>cyx2003 字母数字混合型。这个人叫 陈奕迅,生于2003年,首字母加年份,所以这样取名。</strong></p><p><strong>23h2 字母数字混合型。这个人安装的是 win11,版本号是 23H2,所以这样取名。</strong></p><p><strong>凡是涉及字母的,最好统一写成小写字母。一来容易识别,二来输入时不必按 Caps 大写灯。</strong></p><br /><p><strong>不要用完整的手机号取名,那样太长了。</strong></p><p><strong>不要用完整的QQ号取名,那样太长了。</strong></p><p><strong>不要用完整的邮箱取名,那样太长了,而且里面含有特殊符号 @ 和 .</strong></p><p><strong>不要用别人的名字,万一 ta 离开了你,你每次开机会难受,还得重装系统、重新取名,麻烦。</strong></p><hr><p><strong>完结撒花</strong></p><blockquote><p>参考文章: <a href="https://www.zhihu.com/question/630225998/answer/3289931612">https://www.zhihu.com/question/630225998/answer/3289931612</a></p></blockquote>]]></content>
<categories>
<category> Windows </category>
</categories>
<tags>
<tag> Windows </tag>
</tags>
</entry>
<entry>
<title>vue的实用utils</title>
<link href="/2024/05/03/vue%E7%9A%84%E5%AE%9E%E7%94%A8utils/"/>
<url>/2024/05/03/vue%E7%9A%84%E5%AE%9E%E7%94%A8utils/</url>
<content type="html"><![CDATA[<h2 id="对象类型转表单类型"><a href="#对象类型转表单类型" class="headerlink" title="对象类型转表单类型"></a>对象类型转表单类型</h2> <figure class="highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> <span class="title function_">ObjectToFormData</span> = (<span class="params"><span class="built_in">object</span>: <span class="built_in">any</span></span>) => {</span><br><span class="line"> <span class="keyword">const</span> formData = <span class="keyword">new</span> <span class="title class_">FormData</span>();</span><br><span class="line"> <span class="title class_">Object</span>.<span class="title function_">keys</span>(<span class="built_in">object</span>).<span class="title function_">forEach</span>(<span class="function">(<span class="params">key</span>) =></span> {</span><br><span class="line"> <span class="keyword">const</span> value = <span class="built_in">object</span>[key];</span><br><span class="line"> <span class="keyword">if</span> (<span class="title class_">Array</span>.<span class="title function_">isArray</span>(value)) {</span><br><span class="line"> value.<span class="title function_">forEach</span>(<span class="function">(<span class="params">subValue, i</span>) =></span> {</span><br><span class="line"> formData.<span class="title function_">append</span>(key + <span class="string">`[<span class="subst">${i}</span>]`</span>, subValue);</span><br><span class="line"> });</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> formData.<span class="title function_">append</span>(key, <span class="built_in">object</span>[key]);</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> <span class="keyword">return</span> formData;</span><br><span class="line">};</span><br></pre></td></tr></table></figure><hr><h2 id="标准日期、中国标准时间、时间戳、毫秒数互转"><a href="#标准日期、中国标准时间、时间戳、毫秒数互转" class="headerlink" title="标准日期、中国标准时间、时间戳、毫秒数互转"></a>标准日期、中国标准时间、时间戳、毫秒数互转</h2><p><strong>四种格式的分别是以下的样子:</strong><br><strong>标准日期:2021-08-15 或 2021-08-15 09:15:00</strong><br><strong>中国标准时间:Sun Aug15 202109:15:00 GMT+0800 (中国标准时间)</strong><br><strong>时间戳:1628990100</strong><br><strong>毫秒数:1628990100000</strong><br><strong>注意:时间戳*1000就是毫秒数</strong></p><h3 id="日期或中国标准时间转毫秒数"><a href="#日期或中国标准时间转毫秒数" class="headerlink" title="日期或中国标准时间转毫秒数"></a>日期或中国标准时间转毫秒数</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//变量</span></span><br><span class="line"><span class="keyword">let</span> <span class="title class_">Date1</span>= <span class="string">'Sun Aug 15 2021 09:15:00 GMT+0800 (中国标准时间)'</span>;</span><br><span class="line"><span class="keyword">let</span> <span class="title class_">Date2</span>= <span class="string">'2021-08-15'</span>;</span><br><span class="line"><span class="keyword">let</span> <span class="title class_">Date3</span>= <span class="string">'2021-08-15 09:15:00'</span>;</span><br><span class="line"> </span><br><span class="line"><span class="comment">//实现方法</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">date</span> (date) {</span><br><span class="line"> <span class="keyword">let</span> result = <span class="keyword">new</span> <span class="title class_">Date</span>(date).<span class="title function_">getTime</span>();</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">//例子</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(date (<span class="title class_">Date1</span>));<span class="comment">//--->1628990100000</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(date (<span class="title class_">Date2</span>));<span class="comment">//--->1628985600000</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(date (<span class="title class_">Date3</span>));<span class="comment">//--->1628990100000</span></span><br></pre></td></tr></table></figure><h3 id="毫秒数或中国标准时间转日期"><a href="#毫秒数或中国标准时间转日期" class="headerlink" title="毫秒数或中国标准时间转日期"></a>毫秒数或中国标准时间转日期</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//变量</span></span><br><span class="line"><span class="keyword">let</span> myTime1 = <span class="number">1628990100000</span>;</span><br><span class="line"><span class="keyword">let</span> myTime2 = <span class="string">'Sun Aug 15 2021 09:15:00 GMT+0800 (中国标准时间)'</span>;</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"><span class="comment">//实现方法 @return 返回2个值,一个是带时分秒,另一个不带。</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">msToDate</span> (msec) {</span><br><span class="line"> <span class="keyword">let</span> datetime = <span class="keyword">new</span> <span class="title class_">Date</span>(msec);</span><br><span class="line"> <span class="keyword">let</span> year = datetime.<span class="title function_">getFullYear</span>();</span><br><span class="line"> <span class="keyword">let</span> month = datetime.<span class="title function_">getMonth</span>();</span><br><span class="line"> <span class="keyword">let</span> date = datetime.<span class="title function_">getDate</span>();</span><br><span class="line"> <span class="keyword">let</span> hour = datetime.<span class="title function_">getHours</span>();</span><br><span class="line"> <span class="keyword">let</span> minute = datetime.<span class="title function_">getMinutes</span>();</span><br><span class="line"> <span class="keyword">let</span> second = datetime.<span class="title function_">getSeconds</span>();</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">let</span> result1 = year + </span><br><span class="line"> <span class="string">'-'</span> + </span><br><span class="line"> ((month + <span class="number">1</span>) >= <span class="number">10</span> ? (month + <span class="number">1</span>) : <span class="string">'0'</span> + (month + <span class="number">1</span>)) + </span><br><span class="line"> <span class="string">'-'</span> + </span><br><span class="line"> ((date + <span class="number">1</span>) < <span class="number">10</span> ? <span class="string">'0'</span> + date : date) + </span><br><span class="line"> <span class="string">' '</span> + </span><br><span class="line"> ((hour + <span class="number">1</span>) < <span class="number">10</span> ? <span class="string">'0'</span> + hour : hour) +</span><br><span class="line"> <span class="string">':'</span> + </span><br><span class="line"> ((minute + <span class="number">1</span>) < <span class="number">10</span> ? <span class="string">'0'</span> + minute : minute) + </span><br><span class="line"> <span class="string">':'</span> + </span><br><span class="line"> ((second + <span class="number">1</span>) < <span class="number">10</span> ? <span class="string">'0'</span> + second : second);</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">let</span> result2 = year + </span><br><span class="line"> <span class="string">'-'</span> + </span><br><span class="line"> ((month + <span class="number">1</span>) >= <span class="number">10</span> ? (month + <span class="number">1</span>) : <span class="string">'0'</span> + (month + <span class="number">1</span>)) + </span><br><span class="line"> <span class="string">'-'</span> + </span><br><span class="line"> ((date + <span class="number">1</span>) < <span class="number">10</span> ? <span class="string">'0'</span> + date : date);</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">let</span> result = {</span><br><span class="line"> <span class="attr">hasTime</span>: result1,</span><br><span class="line"> <span class="attr">withoutTime</span>: result2</span><br><span class="line"> };</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">//例子</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">msToDate</span>(myTime1).<span class="property">hasTime</span>);<span class="comment">//2021-08-15 9:15:00</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">msToDate</span>(myTime1).<span class="property">withoutTime</span>);<span class="comment">//2021-08-15</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">msToDate</span>(myTime2).<span class="property">hasTime</span>);<span class="comment">//2021-08-15 9:15:00</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">msToDate</span>(myTime2).<span class="property">withoutTime</span>);<span class="comment">//2021-08-15</span></span><br></pre></td></tr></table></figure><h3 id="标准日期转中国标准时间"><a href="#标准日期转中国标准时间" class="headerlink" title="标准日期转中国标准时间"></a><strong>标准日期转中国标准时间</strong></h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//变量</span></span><br><span class="line"><span class="keyword">let</span> <span class="title class_">Date1</span> = <span class="string">'2021-08-15'</span>;</span><br><span class="line"><span class="keyword">let</span> <span class="title class_">Date2</span> = <span class="string">'2021-08-15 09:15:00'</span>;</span><br><span class="line"> </span><br><span class="line"><span class="comment">//实现方法</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">dateTrans</span> (date) {</span><br><span class="line"> <span class="keyword">let</span> result = <span class="keyword">new</span> <span class="title class_">Date</span>(date);</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="comment">//例子</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">dateTrans</span>(<span class="title class_">Date1</span>));<span class="comment">//Sun Aug 15 2021 08:00:00 GMT+0800 (中国标准时间)</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">dateTrans</span>(<span class="title class_">Date2</span>));<span class="comment">//Sun Aug 15 2021 09:15:00 GMT+0800 (中国标准时间)</span></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> VUE </category>
<category> UniApp </category>
</categories>
<tags>
<tag> VUE </tag>
<tag> UniApp </tag>
</tags>
</entry>
<entry>
<title>Fisco区块链部署(Ubuntu)</title>
<link href="/2024/05/03/fisco%E5%8C%BA%E5%9D%97%E9%93%BE%E9%83%A8%E7%BD%B2/"/>
<url>/2024/05/03/fisco%E5%8C%BA%E5%9D%97%E9%93%BE%E9%83%A8%E7%BD%B2/</url>
<content type="html"><![CDATA[<h2 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install -y openssl curl</span><br></pre></td></tr></table></figure><hr><h2 id="创建操作目录-下载安装脚本"><a href="#创建操作目录-下载安装脚本" class="headerlink" title="创建操作目录, 下载安装脚本"></a>创建操作目录, 下载安装脚本</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">## 创建操作目录</span></span><br><span class="line"><span class="built_in">cd</span> ~ && <span class="built_in">mkdir</span> -p fisco && <span class="built_in">cd</span> fisco</span><br><span class="line"></span><br><span class="line"><span class="comment">## 下载脚本</span></span><br><span class="line">curl -<span class="comment">#LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.9.1/build_chain.sh && chmod u+x build_chain.sh</span></span><br></pre></td></tr></table></figure><hr><h2 id="搭建单群组4节点联盟链"><a href="#搭建单群组4节点联盟链" class="headerlink" title="搭建单群组4节点联盟链"></a>搭建单群组4节点联盟链</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545</span><br></pre></td></tr></table></figure><hr><h2 id="启动FISCO-BCOS链"><a href="#启动FISCO-BCOS链" class="headerlink" title="启动FISCO BCOS链"></a>启动FISCO BCOS链</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash nodes/127.0.0.1/start_all.sh</span><br></pre></td></tr></table></figure><hr><h2 id="检查进程"><a href="#检查进程" class="headerlink" title="检查进程"></a>检查进程</h2><h4 id="检查进程是否启动"><a href="#检查进程是否启动" class="headerlink" title="检查进程是否启动"></a>检查进程是否启动</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ps -ef | grep -v grep | grep fisco-bcos</span><br></pre></td></tr></table></figure><h4 id="正常情况会有类似下面的输出;-如果进程数不为4,则进程没有启动(一般是端口被占用导致的)"><a href="#正常情况会有类似下面的输出;-如果进程数不为4,则进程没有启动(一般是端口被占用导致的)" class="headerlink" title="正常情况会有类似下面的输出; 如果进程数不为4,则进程没有启动(一般是端口被占用导致的)"></a>正常情况会有类似下面的输出; 如果进程数不为4,则进程没有启动(一般是端口被占用导致的)</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">fisco 5453 1 1 17:11 pts/0 00:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node0/../fisco-bcos -c config.ini</span><br><span class="line">fisco 5459 1 1 17:11 pts/0 00:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node1/../fisco-bcos -c config.ini</span><br><span class="line">fisco 5464 1 1 17:11 pts/0 00:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node2/../fisco-bcos -c config.ini</span><br><span class="line">fisco 5476 1 1 17:11 pts/0 00:00:02 /home/ubuntu/fisco/nodes/127.0.0.1/node3/../fisco-bcos -c config.ini</span><br></pre></td></tr></table></figure><hr><h2 id="配置及使用控制台"><a href="#配置及使用控制台" class="headerlink" title="配置及使用控制台"></a>配置及使用控制台</h2><h4 id="安装java"><a href="#安装java" class="headerlink" title="安装java"></a>安装java</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt install -y default-jdk</span><br></pre></td></tr></table></figure><h4 id="获取控制台并回到fisco目录"><a href="#获取控制台并回到fisco目录" class="headerlink" title="获取控制台并回到fisco目录"></a>获取控制台并回到fisco目录</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/fisco && curl -LO https://github.com/FISCO-BCOS/console/releases/download/v2.9.2/download_console.sh && bash download_console.sh</span><br></pre></td></tr></table></figure><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> Fisco区块链 </category>
</categories>
<tags>
<tag> Fisco区块链 </tag>
</tags>
</entry>
<entry>
<title>SpringBoot整合Fisco区块链</title>
<link href="/2024/05/02/SpringBoot%E6%95%B4%E5%90%88fisco%E5%8C%BA%E5%9D%97%E9%93%BE/"/>
<url>/2024/05/02/SpringBoot%E6%95%B4%E5%90%88fisco%E5%8C%BA%E5%9D%97%E9%93%BE/</url>
<content type="html"><![CDATA[<blockquote><p>请先阅读前置文章 《fisco区块链部署》</p></blockquote><div class="note info simple"><p>SpringBoot的版本必须选择<span class='p red'>2</span> , jdk版本必须选择<span class='p red'>11</span> ,可参照文章<<SpringBoot 项目起步>></p></div><h2 id="编写合约"><a href="#编写合约" class="headerlink" title="编写合约"></a>编写合约</h2><p><strong>位置: ~/fisco/console/contracts/solidity,可通过文件夹下案例或网络资料模仿编写</strong></p><hr><h2 id="部署合约于fisco"><a href="#部署合约于fisco" class="headerlink" title="部署合约于fisco"></a>部署合约于fisco</h2><h4 id="开启fisco节点"><a href="#开启fisco节点" class="headerlink" title="开启fisco节点"></a>开启fisco节点</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash ~/fisco/nodes/127.0.0.1/start_all.sh</span><br></pre></td></tr></table></figure><h4 id="进入控制台"><a href="#进入控制台" class="headerlink" title="进入控制台"></a>进入控制台</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">bash ~/fisco/console/start.sh</span><br></pre></td></tr></table></figure><h4 id="部署合约"><a href="#部署合约" class="headerlink" title="部署合约"></a>部署合约</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">deploy {合约名}.sol</span><br></pre></td></tr></table></figure><p><strong>记住部署后输出的contractAddress</strong></p><hr><h2 id="编译合约"><a href="#编译合约" class="headerlink" title="编译合约"></a>编译合约</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用sol2java.sh将contracts/solidity下的所有合约编译产生bin,abi,java工具类。</span></span><br><span class="line"><span class="comment"># 当前目录~/fisco/console</span></span><br><span class="line">bash sol2java.sh -p org.com.fisco</span><br></pre></td></tr></table></figure><hr><h2 id="pow文件引入fisco依赖"><a href="#pow文件引入fisco依赖" class="headerlink" title="pow文件引入fisco依赖"></a>pow文件引入fisco依赖</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!-- fisco --></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.fisco-bcos.java-sdk<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>fisco-bcos-java-sdk<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.9.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span> </span><br></pre></td></tr></table></figure><hr><h2 id="创建并编写配置文件"><a href="#创建并编写配置文件" class="headerlink" title="创建并编写配置文件"></a>创建并编写配置文件</h2><h4 id="位置-SpringBoot项目的resource-config-fisco-toml"><a href="#位置-SpringBoot项目的resource-config-fisco-toml" class="headerlink" title="位置: SpringBoot项目的resource/config-fisco.toml"></a>位置: SpringBoot项目的resource/config-fisco.toml</h4><figure class="highlight toml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[cryptoMaterial]</span></span><br><span class="line"></span><br><span class="line"><span class="attr">certPath</span> = <span class="string">"conf"</span> <span class="comment"># The certification path </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># The following configurations take the certPath by default if commented</span></span><br><span class="line"><span class="comment"># caCert = "conf/ca.crt" # CA cert file path</span></span><br><span class="line"> <span class="comment"># If connect to the GM node, default CA cert path is ${certPath}/gm/gmca.crt</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># sslCert = "conf/sdk.crt" # SSL cert file path</span></span><br><span class="line"> <span class="comment"># If connect to the GM node, the default SDK cert path is ${certPath}/gm/gmsdk.crt</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># sslKey = "conf/sdk.key" # SSL key file path</span></span><br><span class="line"> <span class="comment"># If connect to the GM node, the default SDK privateKey path is ${certPath}/gm/gmsdk.key</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># enSslCert = "conf/gm/gmensdk.crt" # GM encryption cert file path</span></span><br><span class="line"> <span class="comment"># default load the GM SSL encryption cert from ${certPath}/gm/gmensdk.crt</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># enSslKey = "conf/gm/gmensdk.key" # GM ssl cert file path</span></span><br><span class="line"> <span class="comment"># default load the GM SSL encryption privateKey from ${certPath}/gm/gmensdk.key</span></span><br><span class="line"></span><br><span class="line"><span class="section">[network]</span></span><br><span class="line"><span class="attr">peers</span>=[<span class="string">"127.0.0.1:20200"</span>, <span class="string">"127.0.0.1:20201"</span>] <span class="comment"># The peer list to connect</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># AMOP configuration</span></span><br><span class="line"><span class="comment"># You can use following two methods to configure as a private topic message sender or subscriber.</span></span><br><span class="line"><span class="comment"># Usually, the public key and private key is generated by subscriber.</span></span><br><span class="line"><span class="comment"># Message sender receive public key from topic subscriber then make configuration.</span></span><br><span class="line"><span class="comment"># But, please do not config as both the message sender and the subscriber of one private topic, or you may send the message to yourself.</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Configure a private topic as a topic message sender.</span></span><br><span class="line"><span class="comment"># [[amop]]</span></span><br><span class="line"><span class="comment"># topicName = "PrivateTopic"</span></span><br><span class="line"><span class="comment"># publicKeys = [ "conf/amop/consumer_public_key_1.pem" ] # Public keys of the nodes that you want to send AMOP message of this topic to.</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Configure a private topic as a topic subscriber.</span></span><br><span class="line"><span class="comment"># [[amop]]</span></span><br><span class="line"><span class="comment"># topicName = "PrivateTopic"</span></span><br><span class="line"><span class="comment"># privateKey = "conf/amop/consumer_private_key.p12" # Your private key that used to subscriber verification.</span></span><br><span class="line"><span class="comment"># password = "123456"</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="section">[account]</span></span><br><span class="line"><span class="attr">keyStoreDir</span> = <span class="string">"account"</span> <span class="comment"># The directory to load/store the account file, default is "account"</span></span><br><span class="line"><span class="comment"># accountFilePath = "" # The account file path (default load from the path specified by the keyStoreDir)</span></span><br><span class="line"><span class="attr">accountFileFormat</span> = <span class="string">"pem"</span> <span class="comment"># The storage format of account file (Default is "pem", "p12" as an option)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># accountAddress = "" # The transactions sending account address</span></span><br><span class="line"> <span class="comment"># Default is a randomly generated account</span></span><br><span class="line"> <span class="comment"># The randomly generated account is stored in the path specified by the keyStoreDir</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># password = "" # The password used to load the account file</span></span><br><span class="line"></span><br><span class="line"><span class="section">[threadPool]</span></span><br><span class="line"><span class="comment"># channelProcessorThreadSize = "16" # The size of the thread pool to process channel callback</span></span><br><span class="line"> <span class="comment"># Default is the number of cpu cores</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># receiptProcessorThreadSize = "16" # The size of the thread pool to process transaction receipt notification</span></span><br><span class="line"> <span class="comment"># Default is the number of cpu cores</span></span><br><span class="line"></span><br><span class="line"><span class="attr">maxBlockingQueueSize</span> = <span class="string">"102400"</span> <span class="comment"># The max blocking queue size of the thread pool</span></span><br></pre></td></tr></table></figure><hr><h2 id="编译后的合约整合进项目"><a href="#编译后的合约整合进项目" class="headerlink" title="编译后的合约整合进项目"></a>编译后的合约整合进项目</h2><p><strong>将~/fisco/console/concontracts/sdk下的abi和bin文件夹复制到SpringBoot的resource文件夹下</strong></p><hr><h2 id="区块链证书整合进项目"><a href="#区块链证书整合进项目" class="headerlink" title="区块链证书整合进项目"></a>区块链证书整合进项目</h2><p><strong>将~/fisco/nodes/127.0.0.1/sdk下的所有文件复制到SpringBoot的resource/conf文件夹下</strong></p><hr><h2 id="编写SpringBoot的fisco调用组件"><a href="#编写SpringBoot的fisco调用组件" class="headerlink" title="编写SpringBoot的fisco调用组件"></a>编写SpringBoot的fisco调用组件</h2><h4 id="初始化组件"><a href="#初始化组件" class="headerlink" title="初始化组件"></a>初始化组件</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// component/SoildityComponent.java</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SoildityComponent</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String configFile;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String abiFile;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="type">String</span> <span class="variable">contractAddress</span> <span class="operator">=</span> <span class="string">"部署在fisco后的给出的contractAddress"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> AssembleTransactionProcessor transactionProcessor;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">SoildityComponent</span><span class="params">()</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> </span><br><span class="line"> configFile = SoildityComponent.class.getClassLoader().getResource(<span class="string">"config-fisco.toml"</span>).getPath();</span><br><span class="line"> abiFile = SoildityComponent.class.getClassLoader().getResource(<span class="string">"abi/"</span>).getPath();</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 初始化BcosSDK对象</span></span><br><span class="line"> <span class="type">BcosSDK</span> <span class="variable">sdk</span> <span class="operator">=</span> BcosSDK.build(configFile);</span><br><span class="line"> <span class="comment">// 获取Client对象,此处传入的群组ID为1</span></span><br><span class="line"> <span class="type">Client</span> <span class="variable">client</span> <span class="operator">=</span> sdk.getClient(Integer.valueOf(<span class="number">1</span>));</span><br><span class="line"> <span class="comment">// 构造AssembleTransactionProcessor对象,需要传入client对象,CryptoKeyPair对象和abi、binary文件存放的路径。abi和binary文件需要在上一步复制到定义的文件夹中。</span></span><br><span class="line"> <span class="type">CryptoKeyPair</span> <span class="variable">keyPair</span> <span class="operator">=</span> client.getCryptoSuite().createKeyPair();</span><br><span class="line"></span><br><span class="line"> transactionProcessor = TransactionProcessorFactory.createAssembleTransactionProcessor</span><br><span class="line"> (client, keyPair, abiFile, <span class="string">""</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h4 id="组件方法示例-仅供参考-具体需对应合约"><a href="#组件方法示例-仅供参考-具体需对应合约" class="headerlink" title="组件方法示例(仅供参考,具体需对应合约)"></a>组件方法示例(仅供参考,具体需对应合约)</h4><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> String <span class="title function_">addRecord</span><span class="params">(String account, String type_id, String consume, String id)</span> <span class="keyword">throws</span> ABICodecException, TransactionBaseException {</span><br><span class="line"> List<Object> params = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> params.add(account);</span><br><span class="line"> params.add(type_id);</span><br><span class="line"> params.add(consume);</span><br><span class="line"> params.add(id);</span><br><span class="line"> <span class="type">TransactionResponse</span> <span class="variable">transactionResponse</span> <span class="operator">=</span></span><br><span class="line"> transactionProcessor.sendTransactionAndGetResponseByContractLoader(<span class="string">"Carbon_trading"</span>, contractAddress, <span class="string">"addRecord"</span>, params);</span><br><span class="line"> List<Object> valuesList = transactionResponse.getValuesList();</span><br><span class="line"> log.info(<span class="string">"区块链发起交易成功返回map_id为:{}"</span>, valuesList.get(<span class="number">1</span>).toString());</span><br><span class="line"> <span class="keyword">return</span> valuesList.get(<span class="number">1</span>).toString();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Carbon_trading <span class="title function_">getRecord</span><span class="params">(String map_id)</span> <span class="keyword">throws</span> ABICodecException, TransactionBaseException {</span><br><span class="line"> List<Object> params = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> params.add(map_id);</span><br><span class="line"> <span class="type">CallResponse</span> <span class="variable">callResponse</span> <span class="operator">=</span></span><br><span class="line"> transactionProcessor.sendCallByContractLoader(<span class="string">"Carbon_trading"</span>, contractAddress, <span class="string">"getRecord"</span>, params);</span><br><span class="line"> List<Object> valuesList = callResponse.getReturnObject();</span><br><span class="line"> log.info(<span class="string">"返回交易信息为:{}"</span>, valuesList);</span><br><span class="line"> <span class="type">Carbon_trading</span> <span class="variable">carbon_trading</span> <span class="operator">=</span> Carbon_trading.builder()</span><br><span class="line"> .account(valuesList.get(<span class="number">0</span>).toString())</span><br><span class="line"> .type_id(valuesList.get(<span class="number">1</span>).toString())</span><br><span class="line"> .consume(valuesList.get(<span class="number">2</span>).toString())</span><br><span class="line"> .map_id(valuesList.get(<span class="number">3</span>).toString())</span><br><span class="line"> .build();</span><br><span class="line"> <span class="keyword">return</span> carbon_trading;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> SpringBoot </category>
<category> Fisco区块链 </category>
</categories>
<tags>
<tag> SpringBoot </tag>
<tag> Fisco区块链 </tag>
</tags>
</entry>
<entry>
<title>SpringBoot2打包</title>
<link href="/2024/05/02/SpringBoot%E6%89%93%E5%8C%85/"/>
<url>/2024/05/02/SpringBoot%E6%89%93%E5%8C%85/</url>
<content type="html"><![CDATA[<h2 id="修改pom文件"><a href="#修改pom文件" class="headerlink" title="修改pom文件"></a>修改pom文件</h2><h4 id="jar包"><a href="#jar包" class="headerlink" title="jar包"></a>jar包</h4><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--code ++--></span></span><br><span class="line"><span class="tag"><<span class="name">packaging</span>></span>jar<span class="tag"></<span class="name">packaging</span>></span> </span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">build</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">plugins</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">plugin</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">configuration</span>></span></span><br><span class="line"> <span class="comment"><!--code ++--></span></span><br><span class="line"> <span class="tag"><<span class="name">compilerArgs</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">arg</span>></span>--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED<span class="tag"></<span class="name">arg</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">arg</span>></span>--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED<span class="tag"></<span class="name">arg</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">arg</span>></span>--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED<span class="tag"></<span class="name">arg</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">arg</span>></span>--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED<span class="tag"></<span class="name">arg</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">compilerArgs</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">configuration</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">plugin</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"><<span class="name">plugin</span>></span></span><br><span class="line"> <span class="comment"><!--code ++--></span></span><br><span class="line"> <span class="tag"><<span class="name">executions</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">execution</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">goals</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">goal</span>></span>repackage<span class="tag"></<span class="name">goal</span>></span><span class="comment"><!--可以把依赖的包都打包到生成的Jar包中 --></span></span><br><span class="line"> <span class="tag"></<span class="name">goals</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">execution</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">executions</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">plugin</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">plugins</span>></span></span><br><span class="line"><span class="tag"></<span class="name">build</span>></span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="控制台执行命令"><a href="#控制台执行命令" class="headerlink" title="控制台执行命令"></a>控制台执行命令</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mvn clean package -Dmaven.test.skip=<span class="literal">true</span></span><br></pre></td></tr></table></figure><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> SpringBoot </category>
</categories>
<tags>
<tag> SpringBoot </tag>
</tags>
</entry>
<entry>
<title>hexo部署云服务器</title>
<link href="/2024/05/02/hexo%E9%83%A8%E7%BD%B2%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
<url>/2024/05/02/hexo%E9%83%A8%E7%BD%B2%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/</url>
<content type="html"><![CDATA[<h2 id="部署宝塔面板-已部署过的可跳过"><a href="#部署宝塔面板-已部署过的可跳过" class="headerlink" title="部署宝塔面板(已部署过的可跳过)"></a>部署宝塔面板(已部署过的可跳过)</h2><h4 id="安装宝塔"><a href="#安装宝塔" class="headerlink" title="安装宝塔"></a>安装宝塔</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh</span><br></pre></td></tr></table></figure><h4 id="安装完毕后开放宝塔给出的端口"><a href="#安装完毕后开放宝塔给出的端口" class="headerlink" title="安装完毕后开放宝塔给出的端口"></a>安装完毕后开放宝塔给出的端口</h4><p><img src="/local_pic/D/2024-05-02-hexo%E9%83%A8%E7%BD%B2%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20240502185240842.png" alt="image-20240502185240842"></p><p><img src="/local_pic/D/2024-05-02-hexo%E9%83%A8%E7%BD%B2%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20240502185108872.png" alt="image-20240502185108872"></p><h4 id="登录宝塔给出的外网面板地址-并绑定宝塔账号-没有就注册"><a href="#登录宝塔给出的外网面板地址-并绑定宝塔账号-没有就注册" class="headerlink" title="登录宝塔给出的外网面板地址,并绑定宝塔账号(没有就注册)"></a>登录宝塔给出的外网面板地址,并绑定宝塔账号(没有就注册)</h4><h4 id="在宝塔中安装Nginx-FTP-MYSQL-Node"><a href="#在宝塔中安装Nginx-FTP-MYSQL-Node" class="headerlink" title="在宝塔中安装Nginx,FTP,MYSQL,Node"></a>在宝塔中安装Nginx,FTP,MYSQL,Node</h4><h4 id="在宝塔中点击网站→PHP项目→添加站点→创建站点-暂时设置域名为-服务器ip-12000-方便调试-别忘了要先开放12000端口哦"><a href="#在宝塔中点击网站→PHP项目→添加站点→创建站点-暂时设置域名为-服务器ip-12000-方便调试-别忘了要先开放12000端口哦" class="headerlink" title="在宝塔中点击网站→PHP项目→添加站点→创建站点,暂时设置域名为 {服务器ip}:12000 方便调试(别忘了要先开放12000端口哦)"></a>在宝塔中点击网站→PHP项目→添加站点→创建站点,暂时设置域名为 {服务器ip}:12000 方便调试(别忘了要先开放12000端口哦)</h4><p><img src="/local_pic/D/2024-05-02-hexo%E9%83%A8%E7%BD%B2%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/image-20240502190815500.png" alt="image-20240502190815500"></p><hr><h2 id="配置root用户远程ssh无密连接-已配置的可跳过"><a href="#配置root用户远程ssh无密连接-已配置的可跳过" class="headerlink" title="配置root用户远程ssh无密连接(已配置的可跳过)"></a>配置root用户远程ssh无密连接(已配置的可跳过)</h2><p><strong>使用宝塔中的图形化文件界面拷贝主机中的rsa文件的内容到服务器/root/.ssh/authorized_keys,</strong></p><p><strong>主机rsa路径为C:/user/{用户名}/.ssh/id_rsa.pub(没有的话就去生成,网上有教程)</strong></p><hr><h2 id="设置服务器的远程git仓库"><a href="#设置服务器的远程git仓库" class="headerlink" title="设置服务器的远程git仓库"></a>设置服务器的远程git仓库</h2><h4 id="创建git仓库"><a href="#创建git仓库" class="headerlink" title="创建git仓库"></a>创建git仓库</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/ && <span class="built_in">mkdir</span> repos && <span class="built_in">cd</span> repos</span><br><span class="line">git init --bare blog.yumefusaka.git</span><br><span class="line"><span class="built_in">cd</span> blog.yumefusaka.git/hooks</span><br><span class="line">vim post-receive</span><br></pre></td></tr></table></figure><h4 id="进入到post-receive"><a href="#进入到post-receive" class="headerlink" title="进入到post-receive"></a>进入到post-receive</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># /root/repos/blog.yumefusaka.git/hooks/post-receive</span></span><br><span class="line">git --work-tree=/www/wwwroot/blog.yumefusaka --git-dir=/root/repos/blog.yumefusaka.git checkout -f</span><br></pre></td></tr></table></figure><h4 id="设置post-receive为可执行文件"><a href="#设置post-receive为可执行文件" class="headerlink" title="设置post-receive为可执行文件"></a>设置post-receive为可执行文件</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x post-receive</span><br></pre></td></tr></table></figure><hr><h2 id="设置主机的hexo远程部署地址"><a href="#设置主机的hexo远程部署地址" class="headerlink" title="设置主机的hexo远程部署地址"></a>设置主机的hexo远程部署地址</h2><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># _config.yml</span></span><br><span class="line"><span class="attr">deploy:</span></span><br><span class="line"> <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line"> <span class="attr">repository:</span> <span class="string">root@{服务器ip}:/root/repos/blog.yumefusaka.git</span></span><br><span class="line"> <span class="attr">branch:</span> <span class="string">master</span></span><br></pre></td></tr></table></figure><p><strong>现在主机hexo三连就可以直接部署在服务器中啦,可以访问我们用于调试的{服务器ip}:12000来看看是否部署成功</strong></p><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> Hexo </category>
</categories>
<tags>
<tag> Hexo </tag>
</tags>
</entry>
<entry>
<title>VUE3项目起步</title>
<link href="/2024/04/24/VUE3%E9%A1%B9%E7%9B%AE%E8%B5%B7%E6%AD%A5/"/>
<url>/2024/04/24/VUE3%E9%A1%B9%E7%9B%AE%E8%B5%B7%E6%AD%A5/</url>
<content type="html"><![CDATA[<h2 id="创建vue3项目"><a href="#创建vue3项目" class="headerlink" title="创建vue3项目"></a>创建vue3项目</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm create vue@latest</span><br></pre></td></tr></table></figure><p><img src="/local_pic/D/2024-04-24-VUE3%E9%A1%B9%E7%9B%AE%E8%B5%B7%E6%AD%A5/VUE3_ProjectStart1.png" alt="img"></p><hr><h2 id="安装pnpm依赖"><a href="#安装pnpm依赖" class="headerlink" title="安装pnpm依赖"></a>安装pnpm依赖</h2><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm install</span><br><span class="line">pnpm install <span class="literal">--save-dev</span> @types/node</span><br></pre></td></tr></table></figure><hr><h2 id="tsconfig-json配置别名路径"><a href="#tsconfig-json配置别名路径" class="headerlink" title="tsconfig.json配置别名路径"></a>tsconfig.json配置别名路径</h2><blockquote><p>配置别名路径可以在写代码时联想提示路径</p></blockquote><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="attr">"compilerOptions"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"baseUrl"</span> <span class="punctuation">:</span> <span class="string">"./"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"paths"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"@/*"</span><span class="punctuation">:</span><span class="punctuation">[</span><span class="string">"src/*"</span><span class="punctuation">]</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><br></pre></td></tr></table></figure><hr><h2 id="elementPlus引入"><a href="#elementPlus引入" class="headerlink" title="elementPlus引入"></a>elementPlus引入</h2><p><strong>官方文档:</strong> <a href="https://element-plus.org/zh-CN/">https://element-plus.org/zh-CN/</a></p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm add element-plus</span><br><span class="line">pnpm add @element-plus/icons-vue</span><br></pre></td></tr></table></figure><p><strong>自动按需:</strong></p><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">pnpm add -D unplugin-vue-components unplugin-auto-<span class="keyword">import</span></span><br><span class="line">pnpm i unplugin-element-plus -D</span><br><span class="line">pnpm install unplugin-icons -D </span><br></pre></td></tr></table></figure><h4 id="修改配置文件:"><a href="#修改配置文件:" class="headerlink" title="修改配置文件:"></a>修改配置文件:</h4><figure class="highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// vite.config.ts</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 引入插件</span></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">AutoImport</span> <span class="keyword">from</span> <span class="string">'unplugin-auto-import/vite'</span></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">Components</span> <span class="keyword">from</span> <span class="string">'unplugin-vue-components/vite'</span></span><br><span class="line"><span class="keyword">import</span> { <span class="title class_">ElementPlusResolver</span> } <span class="keyword">from</span> <span class="string">'unplugin-vue-components/resolvers'</span></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">ElementPlus</span> <span class="keyword">from</span> <span class="string">'unplugin-element-plus/vite'</span></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">Icons</span> <span class="keyword">from</span> <span class="string">'unplugin-icons/vite'</span></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">IconsResolver</span> <span class="keyword">from</span> <span class="string">'unplugin-icons/resolver'</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title function_">defineConfig</span>({</span><br><span class="line"> <span class="attr">plugins</span>: [</span><br><span class="line"> <span class="title function_">vue</span>(),</span><br><span class="line"> <span class="title class_">AutoImport</span>({</span><br><span class="line"> <span class="comment">// Auto import functions from Vue, e.g. ref, reactive, toRef...</span></span><br><span class="line"> <span class="comment">// 自动导入 Vue 相关函数,如:ref, reactive, toRef 等</span></span><br><span class="line"> <span class="attr">imports</span>: [<span class="string">'vue'</span>],</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Auto import functions from Element Plus, e.g. ElMessage, ElMessageBox... (with style)</span></span><br><span class="line"> <span class="comment">// 自动导入 Element Plus 相关函数,如:ElMessage, ElMessageBox... (带样式)</span></span><br><span class="line"> <span class="attr">resolvers</span>: [</span><br><span class="line"> <span class="title class_">ElementPlusResolver</span>(),</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Auto import icon components</span></span><br><span class="line"> <span class="comment">// 自动导入图标组件</span></span><br><span class="line"> <span class="title class_">IconsResolver</span>({</span><br><span class="line"> <span class="attr">prefix</span>: <span class="string">'Icon'</span>,</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="title class_">Components</span>({</span><br><span class="line"> <span class="attr">resolvers</span>: [</span><br><span class="line"> <span class="comment">// Auto register icon components</span></span><br><span class="line"> <span class="comment">// 自动注册图标组件</span></span><br><span class="line"> <span class="title class_">IconsResolver</span>({</span><br><span class="line"> <span class="attr">enabledCollections</span>: [<span class="string">'ep'</span>],</span><br><span class="line"> }),</span><br><span class="line"> <span class="comment">// Auto register Element Plus components</span></span><br><span class="line"> <span class="comment">// 自动导入 Element Plus 组件</span></span><br><span class="line"> <span class="title class_">ElementPlusResolver</span>(),</span><br><span class="line"> ],</span><br><span class="line"> <span class="attr">directoryAsNamespace</span>: <span class="literal">true</span></span><br><span class="line"> }),</span><br><span class="line"></span><br><span class="line"> <span class="title class_">Icons</span>({</span><br><span class="line"> <span class="attr">autoInstall</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">compiler</span>: <span class="string">'vue3'</span></span><br><span class="line"> }),</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 按需定制主题配置</span></span><br><span class="line"> <span class="title class_">ElementPlus</span>({</span><br><span class="line"> <span class="attr">useSource</span>: <span class="literal">true</span>,</span><br><span class="line"> })</span><br><span class="line"> ],</span><br><span class="line">})</span><br></pre></td></tr></table></figure><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/main.ts</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">'element-plus/theme-chalk/src/index.scss'</span> <span class="comment">// [!code ++]</span></span><br></pre></td></tr></table></figure><hr><h2 id="安装sass"><a href="#安装sass" class="headerlink" title="安装sass"></a>安装sass</h2><blockquote><p>基于vite的项目默认不支持css预处理器,需要开发者单独安装</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i sass -D</span><br></pre></td></tr></table></figure><hr><h2 id="定制化样式"><a href="#定制化样式" class="headerlink" title="定制化样式"></a>定制化样式</h2><figure class="highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// vite.config.ts</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title function_">defineConfig</span>({</span><br><span class="line"> <span class="attr">plugins</span>: [</span><br><span class="line"> ...</span><br><span class="line"> ],</span><br><span class="line"> <span class="attr">css</span>: {</span><br><span class="line"> <span class="attr">preprocessorOptions</span>: {</span><br><span class="line"> <span class="attr">scss</span>: {</span><br><span class="line"> <span class="comment">// 自动导入定制化样式文件进行样式覆盖</span></span><br><span class="line"> <span class="comment">// additionalData: </span></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><hr><h2 id="配置pinia和持久化插件"><a href="#配置pinia和持久化插件" class="headerlink" title="配置pinia和持久化插件"></a>配置pinia和持久化插件</h2><p>安装持久化存储插件: <a href="https://prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/config.html#storage">pinia-plugin-persistedstate</a></p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i pinia-plugin-persistedstate</span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/stores/index.ts</span></span><br><span class="line"><span class="keyword">import</span> { createPinia } <span class="keyword">from</span> <span class="string">'pinia'</span></span><br><span class="line"><span class="keyword">import</span> persist <span class="keyword">from</span> <span class="string">'pinia-plugin-persistedstate'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建 pinia 实例</span></span><br><span class="line"><span class="keyword">const</span> pinia = <span class="title function_">createPinia</span>()</span><br><span class="line"><span class="comment">// 使用持久化存储插件</span></span><br><span class="line">pinia.<span class="title function_">use</span>(persist)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 默认导出,给 main.ts 使用</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> pinia</span><br><span class="line"></span><br><span class="line"><span class="comment">// 模块统一导出</span></span><br><span class="line"><span class="keyword">export</span> * <span class="keyword">from</span> <span class="string">'./modules/client'</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/stores/modules/client.ts</span></span><br><span class="line"><span class="keyword">import</span> { defineStore } <span class="keyword">from</span> <span class="string">'pinia'</span></span><br><span class="line"><span class="keyword">import</span> { ref } <span class="keyword">from</span> <span class="string">'vue'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义 Store</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> useClientStore = <span class="title function_">defineStore</span>(</span><br><span class="line"> <span class="string">'client'</span>,</span><br><span class="line"> <span class="function">() =></span> {</span><br><span class="line"> <span class="keyword">const</span> token = <span class="title function_">ref</span>()</span><br><span class="line"> <span class="keyword">const</span> <span class="title function_">setToken</span> = (<span class="params">val:string</span>)=>{</span><br><span class="line"> token.<span class="property">value</span> = val</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">const</span> <span class="title function_">clearToken</span> = (<span class="params"></span>)=>{</span><br><span class="line"> token.<span class="property">value</span> = <span class="literal">undefined</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> {</span><br><span class="line"> token,</span><br><span class="line"> setToken,</span><br><span class="line"> clearToken</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">persist</span>: <span class="literal">true</span></span><br><span class="line"> },</span><br><span class="line">)</span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/main.ts</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> pinia <span class="keyword">from</span> <span class="string">'./stores'</span> <span class="comment">// [!code ++]</span></span><br><span class="line">app.<span class="title function_">use</span>(pinia) <span class="comment">// [!code ++]</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> { createPinia } <span class="keyword">from</span> <span class="string">'pinia'</span> <span class="comment">// [!code --]</span></span><br><span class="line">app.<span class="title function_">use</span>(<span class="title function_">createPinia</span>()) <span class="comment">// [!code --]</span></span><br></pre></td></tr></table></figure><hr><h2 id="设置router为哈希模式"><a href="#设置router为哈希模式" class="headerlink" title="设置router为哈希模式"></a>设置router为哈希模式</h2><figure class="highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> { createRouter, createWebHashHistory } <span class="keyword">from</span> <span class="string">'vue-router'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> router = <span class="title function_">createRouter</span>({</span><br><span class="line"> <span class="attr">history</span>: <span class="title function_">createWebHashHistory</span>(<span class="keyword">import</span>.<span class="property">meta</span>.<span class="property">env</span>.<span class="property">BASE_URL</span>),</span><br><span class="line">...</span><br><span class="line">})</span><br></pre></td></tr></table></figure><hr><h2 id="懒加载指令实现"><a href="#懒加载指令实现" class="headerlink" title="懒加载指令实现"></a>懒加载指令实现</h2><h4 id="安装vueuse插件"><a href="#安装vueuse插件" class="headerlink" title="安装vueuse插件"></a>安装vueuse插件</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i @vueuse/core</span><br></pre></td></tr></table></figure><h4 id="1-封装全局指令"><a href="#1-封装全局指令" class="headerlink" title="1. 封装全局指令"></a>1. 封装全局指令</h4><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/directives/index.ts</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义懒加载插件</span></span><br><span class="line"><span class="keyword">import</span> { useIntersectionObserver } <span class="keyword">from</span> <span class="string">'@vueuse/core'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> lazyPlugin = {</span><br><span class="line"> install (<span class="attr">app</span>:any) {</span><br><span class="line"> <span class="comment">// 懒加载指令逻辑</span></span><br><span class="line"> app.<span class="title function_">directive</span>(<span class="string">'img-lazy'</span>, {</span><br><span class="line"> mounted (<span class="attr">el</span>:any, <span class="attr">binding</span>:any) {</span><br><span class="line"> <span class="comment">// el: 指令绑定的那个元素 img</span></span><br><span class="line"> <span class="comment">// binding: binding.value 指令等于号后面绑定的表达式的值 图片url</span></span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(el, binding.<span class="property">value</span>)</span><br><span class="line"> <span class="keyword">const</span> { stop } = <span class="title function_">useIntersectionObserver</span>(</span><br><span class="line"> el,</span><br><span class="line"> <span class="function">(<span class="params">[{ isIntersecting }]</span>) =></span> {</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(isIntersecting)</span><br><span class="line"> <span class="keyword">if</span> (isIntersecting) {</span><br><span class="line"> <span class="comment">// 进入视口区域</span></span><br><span class="line"> el.<span class="property">src</span> = binding.<span class="property">value</span></span><br><span class="line"> <span class="title function_">stop</span>()</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></pre></td></tr></table></figure><h4 id="2-注册全局指令"><a href="#2-注册全局指令" class="headerlink" title="2. 注册全局指令"></a>2. 注册全局指令</h4><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 全局指令注册</span></span><br><span class="line"><span class="keyword">import</span> { lazyPlugin } <span class="keyword">from</span> <span class="string">'@/directives'</span></span><br><span class="line">app.<span class="title function_">use</span>(lazyPlugin)</span><br></pre></td></tr></table></figure><hr><h2 id="axios组件"><a href="#axios组件" class="headerlink" title="axios组件"></a>axios组件</h2><h4 id="1-安装axios"><a href="#1-安装axios" class="headerlink" title="1. 安装axios"></a>1. 安装axios</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i axios</span><br></pre></td></tr></table></figure><h4 id="2-基础配置"><a href="#2-基础配置" class="headerlink" title="2. 基础配置"></a>2. 基础配置</h4><blockquote><p>官方文档地址:<a href="https://axios-http.com/zh/docs/intro">https://axios-http.com/zh/docs/intro</a><br>基础配置通常包括:</p><ol><li>实例化 - baseURL + timeout</li><li>拦截器 - 携带token 401拦截等</li></ol></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> { useClientStore } <span class="keyword">from</span> <span class="string">'@/stores'</span></span><br><span class="line"><span class="keyword">import</span> axios <span class="keyword">from</span> <span class="string">'axios'</span></span><br><span class="line"><span class="keyword">import</span> router <span class="keyword">from</span> <span class="string">'@/router'</span></span><br><span class="line"><span class="keyword">import</span> { <span class="title class_">ElMessage</span> } <span class="keyword">from</span> <span class="string">'element-plus'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> baseURL = <span class="string">'http://localhost:8080'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> instance = axios.<span class="title function_">create</span>({</span><br><span class="line"> baseURL,</span><br><span class="line"> <span class="attr">timeout</span>: <span class="number">100000</span></span><br><span class="line">})</span><br><span class="line"></span><br><span class="line">instance.<span class="property">interceptors</span>.<span class="property">request</span>.<span class="title function_">use</span>(</span><br><span class="line"> <span class="function">(<span class="params">config</span>) =></span> {</span><br><span class="line"> <span class="keyword">const</span> clientStore = <span class="title function_">useClientStore</span>()</span><br><span class="line"> <span class="keyword">if</span> (clientStore.<span class="property">token</span>) {</span><br><span class="line"> config.<span class="property">headers</span>.<span class="property">Authorization</span> = clientStore.<span class="property">token</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> config</span><br><span class="line"> },</span><br><span class="line"> <span class="function">(<span class="params">err</span>) =></span> <span class="title class_">Promise</span>.<span class="title function_">reject</span>(err)</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">instance.<span class="property">interceptors</span>.<span class="property">response</span>.<span class="title function_">use</span>(</span><br><span class="line"> <span class="function">(<span class="params">res</span>) =></span> {</span><br><span class="line"> <span class="keyword">if</span> (res.<span class="property">data</span>.<span class="property">code</span> === <span class="number">200</span>) {</span><br><span class="line"> <span class="keyword">return</span> res </span><br><span class="line"> }</span><br><span class="line"> <span class="title class_">ElMessage</span>({ <span class="attr">message</span>: res.<span class="property">data</span>.<span class="property">message</span> || <span class="string">'服务异常'</span>, <span class="attr">type</span>: <span class="string">'error'</span> })</span><br><span class="line"> <span class="keyword">return</span> <span class="title class_">Promise</span>.<span class="title function_">reject</span>(res.<span class="property">data</span>)</span><br><span class="line"> },</span><br><span class="line"> <span class="function">(<span class="params">err</span>) =></span> {</span><br><span class="line"> <span class="title class_">ElMessage</span>({ <span class="attr">message</span>: err.<span class="property">response</span>.<span class="property">data</span>.<span class="property">message</span> || <span class="string">'服务异常'</span>, <span class="attr">type</span>: <span class="string">'error'</span> })</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(err)</span><br><span class="line"> <span class="keyword">if</span> (err.<span class="property">response</span>?.<span class="property">status</span> === <span class="number">401</span>) {</span><br><span class="line"> router.<span class="title function_">push</span>(<span class="string">'/login'</span>)</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="title class_">Promise</span>.<span class="title function_">reject</span>(err)</span><br><span class="line"> }</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> instance</span><br><span class="line"><span class="keyword">export</span> { baseURL }</span><br><span class="line"><span class="keyword">export</span> interface <span class="title class_">Data</span><T> {</span><br><span class="line"> <span class="attr">code</span>: string</span><br><span class="line"> <span class="attr">msg</span>: string</span><br><span class="line"> <span class="attr">result</span>: T</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h4 id="3-API模板"><a href="#3-API模板" class="headerlink" title="3.API模板"></a>3.API模板</h4><figure class="highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> { <span class="title class_">LoginParams</span>, <span class="title class_">LoginResult</span> } <span class="keyword">from</span> <span class="string">'@/types/login'</span></span><br><span class="line"><span class="keyword">import</span> request <span class="keyword">from</span> <span class="string">'@/utils/axios.ts'</span></span><br><span class="line"><span class="keyword">import</span> { <span class="title class_">Data</span> } <span class="keyword">from</span> <span class="string">'@/utils/axios.ts'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> loginAPI = (<span class="attr">params</span>: <span class="title class_">LoginParams</span>): <span class="title class_">Promise</span><<span class="title class_">Data</span><<span class="title class_">LoginResult</span>>> => {</span><br><span class="line"> <span class="keyword">return</span> <span class="title function_">request</span>({</span><br><span class="line"> <span class="attr">url</span>: <span class="string">'/login'</span>,</span><br><span class="line"> <span class="attr">method</span>: <span class="string">'post'</span>,</span><br><span class="line"> <span class="attr">data</span>: params</span><br><span class="line"> }).<span class="title function_">then</span>(<span class="function"><span class="params">res</span>=></span>res.<span class="property">data</span> <span class="keyword">as</span> <span class="title class_">Data</span><<span class="title class_">LoginResult</span>>)</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="使用tailwindcss"><a href="#使用tailwindcss" class="headerlink" title="使用tailwindcss"></a>使用tailwindcss</h2><h4 id="1-安装插件"><a href="#1-安装插件" class="headerlink" title="1.安装插件"></a>1.安装插件</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm install -D tailwindcss</span><br><span class="line">npx tailwindcss init</span><br></pre></td></tr></table></figure><h4 id="2-配置tailwindcss-config-js"><a href="#2-配置tailwindcss-config-js" class="headerlink" title="2.配置tailwindcss.config.js"></a>2.配置tailwindcss.config.js</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/** <span class="doctag">@type</span> {<span class="type">import('tailwindcss').Config</span>} */</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> {</span><br><span class="line"> <span class="attr">content</span>: [</span><br><span class="line"> <span class="string">"./index.html"</span>,</span><br><span class="line"> <span class="string">"./src/**/*.{vue,js,ts,jsx,tsx}"</span>,</span><br><span class="line"> ],</span><br><span class="line"> <span class="attr">theme</span>: {</span><br><span class="line"> <span class="attr">extend</span>: {},</span><br><span class="line"> },</span><br><span class="line"> <span class="attr">plugins</span>: [],</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h4 id="3-增入样式"><a href="#3-增入样式" class="headerlink" title="3.增入样式"></a>3.增入样式</h4><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">// <span class="attribute">src</span>/<span class="selector-tag">input</span><span class="selector-class">.css</span> </span><br><span class="line"></span><br><span class="line"><span class="keyword">@tailwind</span> base;</span><br><span class="line"><span class="keyword">@tailwind</span> components;</span><br><span class="line"><span class="keyword">@tailwind</span> utilities;</span><br></pre></td></tr></table></figure><h4 id="4-构建编译"><a href="#4-构建编译" class="headerlink" title="4.构建编译"></a>4.构建编译</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx tailwindcss -i ./src/input.css -o ./src/output.css</span><br></pre></td></tr></table></figure><h4 id="5-添加至项目"><a href="#5-添加至项目" class="headerlink" title="5.添加至项目"></a>5.添加至项目</h4><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">// index.html</span><br><span class="line"></span><br><span class="line"><span class="meta"><!doctype <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> ...,</span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">href</span>=<span class="string">"./output.css"</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span>></span> [! code++]</span><br><span class="line"> <span class="tag"></<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> ...</span><br><span class="line"> <span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure><h2 id="使用Echarts"><a href="#使用Echarts" class="headerlink" title="使用Echarts"></a>使用Echarts</h2><h4 id="1-安装插件-1"><a href="#1-安装插件-1" class="headerlink" title="1.安装插件"></a>1.安装插件</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm add echarts vue-echarts</span><br></pre></td></tr></table></figure><h4 id="2-全局导出组件"><a href="#2-全局导出组件" class="headerlink" title="2.全局导出组件"></a>2.全局导出组件</h4><figure class="highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/main.ts</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="string">'echarts'</span> [! code++]</span><br></pre></td></tr></table></figure><h4 id="3-项目引入"><a href="#3-项目引入" class="headerlink" title="3.项目引入"></a>3.项目引入</h4><figure class="highlight ts"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="title class_">VChart</span> <span class="keyword">from</span> <span class="string">"vue-echarts"</span>;</span><br></pre></td></tr></table></figure><hr><h2 id="ESLint-prettier-配置代码风格"><a href="#ESLint-prettier-配置代码风格" class="headerlink" title="ESLint & prettier 配置代码风格"></a>ESLint & prettier 配置代码风格</h2><p><strong>环境同步:</strong></p><ol><li><strong>安装了插件 ESlint,开启保存自动修复</strong></li><li><strong>禁用了插件 Prettier,并关闭保存自动格式化</strong></li></ol><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ESlint插件 + Vscode配置 实现自动格式化修复</span></span><br><span class="line"><span class="string">"editor.codeActionsOnSave"</span>: {</span><br><span class="line"> <span class="string">"source.fixAll"</span>: <span class="literal">true</span></span><br><span class="line">},</span><br><span class="line"><span class="string">"editor.formatOnSave"</span>: <span class="literal">false</span>,</span><br></pre></td></tr></table></figure><p><strong>配置文件 .eslintrc.cjs</strong></p><ol><li><p>prettier 风格配置 <a href="https://prettier.io/docs/en/options.html">https://prettier.io</a></p><ol><li><p>单引号</p></li><li><p>不使用分号</p></li><li><p>每行宽度至多80字符</p></li><li><p>不加对象|数组最后逗号</p></li><li><p>换行符号不限制(win mac 不一致)</p></li></ol></li><li><p>vue组件名称多单词组成(忽略index.vue)</p></li><li><p>props解构(关闭)</p></li></ol><figure class="highlight jsx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">rules</span>: {</span><br><span class="line"> <span class="string">'prettier/prettier'</span>: [</span><br><span class="line"> <span class="string">'warn'</span>,</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">singleQuote</span>: <span class="literal">true</span>, <span class="comment">// 单引号</span></span><br><span class="line"> <span class="attr">semi</span>: <span class="literal">false</span>, <span class="comment">// 无分号</span></span><br><span class="line"> <span class="attr">printWidth</span>: <span class="number">80</span>, <span class="comment">// 每行宽度至多80字符</span></span><br><span class="line"> <span class="attr">trailingComma</span>: <span class="string">'none'</span>, <span class="comment">// 不加对象|数组最后逗号</span></span><br><span class="line"> <span class="attr">endOfLine</span>: <span class="string">'auto'</span> <span class="comment">// 换行符号不限制(win mac 不一致)</span></span><br><span class="line"> }</span><br><span class="line"> ],</span><br><span class="line"> <span class="string">'vue/multi-word-component-names'</span>: [</span><br><span class="line"> <span class="string">'warn'</span>,</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">ignores</span>: [<span class="string">'index'</span>] <span class="comment">// vue组件名称多单词组成(忽略index.vue)</span></span><br><span class="line"> }</span><br><span class="line"> ],</span><br><span class="line"> <span class="string">'vue/no-setup-props-destructure'</span>: [<span class="string">'off'</span>], <span class="comment">// 关闭 props 解构的校验</span></span><br><span class="line"> <span class="comment">// 💡 添加未定义变量错误提示,[email protected] 关闭,这里加上是为了支持下一个章节演示。</span></span><br><span class="line"> <span class="string">'no-undef'</span>: <span class="string">'error'</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> VUE </category>
</categories>
<tags>
<tag> VUE </tag>
</tags>
</entry>
<entry>
<title>UniApp基于Vscode项目起步</title>
<link href="/2024/04/24/UniApp%E5%9F%BA%E4%BA%8EVscode%E9%A1%B9%E7%9B%AE%E8%B5%B7%E6%AD%A5/"/>
<url>/2024/04/24/UniApp%E5%9F%BA%E4%BA%8EVscode%E9%A1%B9%E7%9B%AE%E8%B5%B7%E6%AD%A5/</url>
<content type="html"><![CDATA[<h2 id="命令行创建-uni-app-项目:"><a href="#命令行创建-uni-app-项目:" class="headerlink" title="命令行创建 uni-app 项目:"></a><strong>命令行创建 uni-app 项目:</strong></h2><p>vue3 + ts 版</p><figure class="highlight sh"><figcaption><span>[github]</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 通过 npx 从 github 下载</span></span><br><span class="line">npx degit dcloudio/uni-preset-vue<span class="comment">#vite-ts 项目名称</span></span><br></pre></td></tr></table></figure><figure class="highlight sh"><figcaption><span>[👉国内 gitee]</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 通过 git 从 gitee 克隆下载 (👉备用地址)</span></span><br><span class="line">git <span class="built_in">clone</span> -b vite-ts https://gitee.com/dcloud/uni-preset-vue.git</span><br></pre></td></tr></table></figure><p>安装依赖 <code>pnpm install</code></p><hr><h2 id="用-VS-Code-开发配置"><a href="#用-VS-Code-开发配置" class="headerlink" title="用 VS Code 开发配置"></a>用 VS Code 开发配置</h2><ul><li><p>👉 前置工作:安装 Vue3 插件,<a href="https://cn.vuejs.org/guide/typescript/overview.html#ide-support">点击查看官方文档</a></p><ul><li>安装 <strong>Vue Language Features (Volar)</strong> :Vue3 语法提示插件</li><li>安装 <strong>TypeScript Vue Plugin (Volar)</strong> :Vue3+TS 插件</li><li><strong>工作区禁用</strong> Vue2 的 Vetur 插件(Vue3 插件和 Vue2 冲突)</li><li><strong>工作区禁用</strong> @builtin typescript 插件(禁用后开启 Vue3 的 TS 托管模式)</li></ul></li><li><p>👉 安装 uni-app 开发插件</p><ul><li><p><strong>uni-create-view</strong> :快速创建 uni-app 页面</p></li><li><p><strong>uni-helper uni-app</strong> :代码提示</p></li><li><p><strong>uniapp 小程序扩展</strong> :鼠标悬停查文档</p><p>—————————————-以上只需安装一次,后续无需重复安装————————————-</p></li></ul></li><li><p>👉 TS 类型校验</p><ul><li>安装 <strong>类型声明文件</strong> <code>pnpm i -D miniprogram-api-typings @uni-helper/uni-app-types</code></li><li>配置 <code>tsconfig.json</code></li></ul></li><li><p>👉 JSON 注释问题</p><ul><li>设置文件关联,把 <code>manifest.json</code> 和 <code>pages.json</code> 设置为 <code>jsonc</code></li></ul></li></ul><p><code>tsconfig.json</code> </p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// tsconfig.json</span></span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"extends"</span><span class="punctuation">:</span> <span class="string">"@vue/tsconfig/tsconfig.json"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"compilerOptions"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"ignoreDeprecations"</span><span class="punctuation">:</span> <span class="string">"5.0"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sourceMap"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"baseUrl"</span><span class="punctuation">:</span> <span class="string">"."</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"paths"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"@/*"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"./src/*"</span><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">"lib"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"esnext"</span><span class="punctuation">,</span> <span class="string">"dom"</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="comment">// 类型声明文件</span></span><br><span class="line"> <span class="attr">"types"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="string">"@dcloudio/types"</span><span class="punctuation">,</span> <span class="comment">// uni-app API 类型</span></span><br><span class="line"> <span class="string">"miniprogram-api-typings"</span><span class="punctuation">,</span> <span class="comment">// 原生微信小程序类型</span></span><br><span class="line"> <span class="string">"@uni-helper/uni-app-types"</span> <span class="comment">// uni-app 组件类型</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="comment">// vue 编译器类型,校验标签类型</span></span><br><span class="line"> <span class="attr">"vueCompilerOptions"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="comment">// 原配置 `experimentalRuntimeMode` 现调整为 `nativeTags`</span></span><br><span class="line"> <span class="attr">"nativeTags"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"block"</span><span class="punctuation">,</span> <span class="string">"component"</span><span class="punctuation">,</span> <span class="string">"template"</span><span class="punctuation">,</span> <span class="string">"slot"</span><span class="punctuation">]</span><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">"include"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"src/**/*.ts"</span><span class="punctuation">,</span> <span class="string">"src/**/*.d.ts"</span><span class="punctuation">,</span> <span class="string">"src/**/*.tsx"</span><span class="punctuation">,</span> <span class="string">"src/**/*.vue"</span><span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure><p><strong>工作区设置(ctrl+shift+p打开面板)</strong></p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// .vscode/settings.json</span></span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="comment">// 在保存时格式化文件</span></span><br><span class="line"> <span class="attr">"editor.formatOnSave"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="comment">// 文件格式化配置</span></span><br><span class="line"> <span class="attr">"[json]"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"editor.defaultFormatter"</span><span class="punctuation">:</span> <span class="string">"esbenp.prettier-vscode"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="comment">// 配置语言的文件关联</span></span><br><span class="line"> <span class="attr">"files.associations"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"pages.json"</span><span class="punctuation">:</span> <span class="string">"jsonc"</span><span class="punctuation">,</span> <span class="comment">// pages.json 可以写注释</span></span><br><span class="line"> <span class="attr">"manifest.json"</span><span class="punctuation">:</span> <span class="string">"jsonc"</span> <span class="comment">// manifest.json 可以写注释</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><hr><h2 id="引入-uni-ui-组件库"><a href="#引入-uni-ui-组件库" class="headerlink" title="引入 uni-ui 组件库"></a>引入 uni-ui 组件库</h2><p>安装 <a href="https://uniapp.dcloud.net.cn/component/uniui/quickstart.html#npm%E5%AE%89%E8%A3%85">uni-ui 组件库</a></p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i @dcloudio/uni-ui</span><br></pre></td></tr></table></figure><p><strong>配置自动导入组件</strong></p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// pages.json</span></span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="comment">// 组件自动导入</span></span><br><span class="line"> <span class="attr">"easycom"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"autoscan"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"custom"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="comment">// uni-ui 规则如下配置 // [!code ++]</span></span><br><span class="line"> <span class="attr">"^uni-(.*)"</span><span class="punctuation">:</span> <span class="string">"@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue"</span> <span class="comment">// [!code ++]</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">"pages"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="comment">// …省略</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><p><strong>安装类型声明文件</strong></p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i -D @uni-helper/uni-ui-types</span><br></pre></td></tr></table></figure><p><strong>配置类型声明文件</strong></p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// tsconfig.json</span></span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"compilerOptions"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="comment">// ...</span></span><br><span class="line"> <span class="attr">"types"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="string">"@dcloudio/types"</span><span class="punctuation">,</span> <span class="comment">// uni-app API 类型</span></span><br><span class="line"> <span class="string">"miniprogram-api-typings"</span><span class="punctuation">,</span> <span class="comment">// 原生微信小程序类型</span></span><br><span class="line"> <span class="string">"@uni-helper/uni-app-types"</span><span class="punctuation">,</span> <span class="comment">// uni-app 组件类型</span></span><br><span class="line"> <span class="string">"@uni-helper/uni-ui-types"</span> <span class="comment">// uni-ui 组件类型 // [!code ++]</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="comment">// vue 编译器类型,校验标签类型</span></span><br><span class="line"> <span class="attr">"vueCompilerOptions"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"nativeTags"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"block"</span><span class="punctuation">,</span> <span class="string">"component"</span><span class="punctuation">,</span> <span class="string">"template"</span><span class="punctuation">,</span> <span class="string">"slot"</span><span class="punctuation">]</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><hr><h2 id="增加h5端"><a href="#增加h5端" class="headerlink" title="增加h5端"></a>增加h5端</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// manifest.json</span></span><br><span class="line"><span class="comment">/* 网页端特有相关 */</span></span><br><span class="line"> <span class="string">"h5"</span> : {</span><br><span class="line"> <span class="string">"router"</span> : {</span><br><span class="line"> <span class="string">"base"</span> : <span class="string">""</span>,</span><br><span class="line"> <span class="string">"mode"</span> : <span class="string">"hash"</span></span><br><span class="line"> },</span><br><span class="line"> <span class="string">"devServer"</span> : {</span><br><span class="line"> <span class="string">"port"</span> : <span class="number">5173</span></span><br><span class="line"> },</span><br><span class="line"> <span class="string">"usingComponents"</span> : <span class="literal">true</span></span><br><span class="line"> },</span><br></pre></td></tr></table></figure><hr><h2 id="安装pinia和持久化插件"><a href="#安装pinia和持久化插件" class="headerlink" title="安装pinia和持久化插件"></a>安装pinia和持久化插件</h2><p>安装pinia: </p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i pinia</span><br></pre></td></tr></table></figure><p>安装持久化存储插件: <a href="https://prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/config.html#storage">pinia-plugin-persistedstate</a></p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i pinia-plugin-persistedstate</span><br></pre></td></tr></table></figure><p>插件默认使用 <code>localStorage</code> 实现持久化,小程序端不兼容,需要替换持久化 API。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/stores/index.ts</span></span><br><span class="line"><span class="keyword">import</span> { createPinia } <span class="keyword">from</span> <span class="string">'pinia'</span></span><br><span class="line"><span class="keyword">import</span> persist <span class="keyword">from</span> <span class="string">'pinia-plugin-persistedstate'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建 pinia 实例</span></span><br><span class="line"><span class="keyword">const</span> pinia = <span class="title function_">createPinia</span>()</span><br><span class="line"><span class="comment">// 使用持久化存储插件</span></span><br><span class="line">pinia.<span class="title function_">use</span>(persist)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 默认导出,给 main.ts 使用</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> pinia</span><br><span class="line"></span><br><span class="line"><span class="comment">// 模块统一导出</span></span><br><span class="line"><span class="keyword">export</span> * <span class="keyword">from</span> <span class="string">'./modules/client'</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/stores/modules/client.ts</span></span><br><span class="line"><span class="keyword">import</span> { defineStore } <span class="keyword">from</span> <span class="string">'pinia'</span></span><br><span class="line"><span class="keyword">import</span> { ref } <span class="keyword">from</span> <span class="string">'vue'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义 Store</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> useClientStore = <span class="title function_">defineStore</span>(</span><br><span class="line"> <span class="string">'client'</span>,</span><br><span class="line"> <span class="function">() =></span> {</span><br><span class="line"> <span class="keyword">const</span> token = <span class="title function_">ref</span>()</span><br><span class="line"> <span class="keyword">const</span> <span class="title function_">setToken</span> = (<span class="params">val:string</span>)=>{</span><br><span class="line"> token.<span class="property">value</span> = val</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">const</span> <span class="title function_">clearToken</span> = (<span class="params"></span>)=>{</span><br><span class="line"> token.<span class="property">value</span> = <span class="literal">undefined</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> {</span><br><span class="line"> token,</span><br><span class="line"> setToken,</span><br><span class="line"> clearToken</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> 持久化</span></span><br><span class="line"> {</span><br><span class="line"> <span class="attr">persist</span>: {</span><br><span class="line"> <span class="comment">// 调整为兼容多端的API</span></span><br><span class="line"> <span class="attr">storage</span>: {</span><br><span class="line"> <span class="title function_">setItem</span>(<span class="params">key, value</span>) {</span><br><span class="line"> uni.<span class="title function_">setStorageSync</span>(key, value) <span class="comment">// [!code warning]</span></span><br><span class="line"> },</span><br><span class="line"> <span class="title function_">getItem</span>(<span class="params">key</span>) {</span><br><span class="line"> <span class="keyword">return</span> uni.<span class="title function_">getStorageSync</span>(key) <span class="comment">// [!code warning]</span></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><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/main.ts</span></span><br><span class="line"><span class="keyword">import</span> { createSSRApp } <span class="keyword">from</span> <span class="string">"vue"</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="title class_">App</span> <span class="keyword">from</span> <span class="string">"./App.vue"</span>;</span><br><span class="line"><span class="keyword">import</span> pinia <span class="keyword">from</span> <span class="string">"./stores"</span>; <span class="comment">// [!code ++]</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">function</span> <span class="title function_">createApp</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">const</span> app = <span class="title function_">createSSRApp</span>(<span class="title class_">App</span>);</span><br><span class="line"> app.<span class="title function_">use</span>(pinia) <span class="comment">// [!code ++]</span></span><br><span class="line"> <span class="keyword">return</span> {</span><br><span class="line"> app,</span><br><span class="line"> };</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="http-请求封装"><a href="#http-请求封装" class="headerlink" title="http 请求封装"></a>http 请求封装</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// src/utils/http.ts</span></span><br><span class="line"><span class="comment">// 请求基地址</span></span><br><span class="line"><span class="keyword">const</span> baseURL = <span class="string">'http://localhost:8080'</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 拦截器配置</span></span><br><span class="line"><span class="keyword">const</span> httpInterceptor = {</span><br><span class="line"> <span class="comment">// 拦截前触发</span></span><br><span class="line"> <span class="title function_">invoke</span>(<span class="params">options: UniApp.RequestOptions</span>) {</span><br><span class="line"> <span class="comment">// 1. 非 http 开头需拼接地址</span></span><br><span class="line"> <span class="keyword">if</span> (!options.<span class="property">url</span>.<span class="title function_">startsWith</span>(<span class="string">'http'</span>)) {</span><br><span class="line"> options.<span class="property">url</span> = baseURL + options.<span class="property">url</span></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 2. 请求超时</span></span><br><span class="line"> options.<span class="property">timeout</span> = <span class="number">10000</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 3. 添加 token 请求头标识</span></span><br><span class="line"> <span class="keyword">const</span> clientStore = <span class="title function_">useClientStore</span>()</span><br><span class="line"> <span class="keyword">const</span> token = clientStore.<span class="property">token</span></span><br><span class="line"> <span class="keyword">if</span>(token){</span><br><span class="line"> options.<span class="property">header</span>.<span class="property">Authorization</span> = token</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">// 拦截 request 请求</span></span><br><span class="line">uni.<span class="title function_">addInterceptor</span>(<span class="string">'request'</span>, httpInterceptor)</span><br><span class="line"><span class="comment">// 拦截 uploadFile 文件上传</span></span><br><span class="line">uni.<span class="title function_">addInterceptor</span>(<span class="string">'uploadFile'</span>, httpInterceptor)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 添加类型,支持泛型</span></span><br><span class="line">interface <span class="title class_">Data</span><T> {</span><br><span class="line"> <span class="attr">code</span>: string</span><br><span class="line"> <span class="attr">msg</span>: string</span><br><span class="line"> <span class="attr">data</span>: T</span><br><span class="line">}</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> http = <T><span class="function">(<span class="params">options: UniApp.RequestOptions</span>) =></span> {</span><br><span class="line"> <span class="comment">// 1. 返回 Promise 对象</span></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Promise</span><<span class="title class_">Data</span><T>>(<span class="function">(<span class="params">resolve, reject</span>) =></span> {</span><br><span class="line"> uni.<span class="title function_">request</span>({</span><br><span class="line"> ...options,</span><br><span class="line"> <span class="comment">// 响应成功</span></span><br><span class="line"> <span class="title function_">success</span>(<span class="params">res</span>) {</span><br><span class="line"> <span class="comment">// 状态码 2xx,参考 axios 的设计</span></span><br><span class="line"> <span class="keyword">if</span> (res.<span class="property">statusCode</span> >= <span class="number">200</span> && res.<span class="property">statusCode</span> < <span class="number">300</span>) {</span><br><span class="line"> <span class="comment">// 2.1 提取核心数据 res.data</span></span><br><span class="line"> <span class="title function_">resolve</span>(res.<span class="property">data</span> <span class="keyword">as</span> <span class="title class_">Data</span><T>)</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (res.<span class="property">statusCode</span> == <span class="number">401</span>) {</span><br><span class="line"> <span class="comment">// 401错误 -> 清理用户信息,跳转到登录页</span></span><br><span class="line"> <span class="keyword">const</span> clientStore = <span class="title function_">useClientStore</span>()</span><br><span class="line"> clientStore.<span class="title function_">clearToken</span>()</span><br><span class="line"> uni.<span class="title function_">navigateTo</span>({ <span class="attr">url</span>: <span class="string">'/pages/login/login'</span> })</span><br><span class="line"> <span class="title function_">reject</span>(res)</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">// 其他错误 -> 根据后端错误信息轻提示</span></span><br><span class="line"> uni.<span class="title function_">showToast</span>({</span><br><span class="line"> <span class="attr">icon</span>: <span class="string">'none'</span>,</span><br><span class="line"> <span class="attr">title</span>: (res.<span class="property">data</span> <span class="keyword">as</span> <span class="title class_">Data</span><T>).<span class="property">msg</span> || <span class="string">'请求错误'</span>,</span><br><span class="line"> })</span><br><span class="line"> <span class="title function_">reject</span>(res)</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> <span class="comment">// 响应失败</span></span><br><span class="line"> <span class="title function_">fail</span>(<span class="params">err</span>) {</span><br><span class="line"> uni.<span class="title function_">showToast</span>({</span><br><span class="line"> <span class="attr">icon</span>: <span class="string">'none'</span>,</span><br><span class="line"> <span class="attr">title</span>: <span class="string">'网络错误,请检查网络'</span>,</span><br><span class="line"> })</span><br><span class="line"> <span class="title function_">reject</span>(err)</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><hr><h1 id="【拓展】代码规范"><a href="#【拓展】代码规范" class="headerlink" title="【拓展】代码规范"></a>【拓展】代码规范</h1><h2 id="统一代码风格"><a href="#统一代码风格" class="headerlink" title="统一代码风格"></a>统一代码风格</h2><ul><li>安装 <code>eslint</code> + <code>prettier</code></li></ul><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i -D eslint prettier eslint-plugin-vue @vue/eslint-config-prettier @vue/eslint-config-typescript @rushstack/eslint-patch @vue/tsconfig</span><br></pre></td></tr></table></figure><ul><li>新建 <code>.eslintrc.cjs</code> 文件,添加以下 <code>eslint</code> 配置</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* eslint-env node */</span></span><br><span class="line"><span class="built_in">require</span>(<span class="string">'@rushstack/eslint-patch/modern-module-resolution'</span>)</span><br><span class="line"></span><br><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span> = {</span><br><span class="line"> <span class="attr">root</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">extends</span>: [</span><br><span class="line"> <span class="string">'plugin:vue/vue3-essential'</span>,</span><br><span class="line"> <span class="string">'eslint:recommended'</span>,</span><br><span class="line"> <span class="string">'@vue/eslint-config-typescript'</span>,</span><br><span class="line"> <span class="string">'@vue/eslint-config-prettier'</span>,</span><br><span class="line"> ],</span><br><span class="line"> <span class="comment">// 小程序全局变量</span></span><br><span class="line"> <span class="attr">globals</span>: {</span><br><span class="line"> <span class="attr">uni</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">wx</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="title class_">WechatMiniprogram</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">getCurrentPages</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">getApp</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="title class_">UniApp</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="title class_">UniHelper</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="title class_">App</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="title class_">Page</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="title class_">Component</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="title class_">AnyObject</span>: <span class="literal">true</span>,</span><br><span class="line"> },</span><br><span class="line"> <span class="attr">parserOptions</span>: {</span><br><span class="line"> <span class="attr">ecmaVersion</span>: <span class="string">'latest'</span>,</span><br><span class="line"> },</span><br><span class="line"> <span class="attr">rules</span>: {</span><br><span class="line"> <span class="string">'prettier/prettier'</span>: [</span><br><span class="line"> <span class="string">'warn'</span>,</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">singleQuote</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">semi</span>: <span class="literal">false</span>,</span><br><span class="line"> <span class="attr">printWidth</span>: <span class="number">100</span>,</span><br><span class="line"> <span class="attr">trailingComma</span>: <span class="string">'all'</span>,</span><br><span class="line"> <span class="attr">endOfLine</span>: <span class="string">'auto'</span>,</span><br><span class="line"> },</span><br><span class="line"> ],</span><br><span class="line"> <span class="string">'vue/multi-word-component-names'</span>: [<span class="string">'off'</span>],</span><br><span class="line"> <span class="string">'vue/no-setup-props-destructure'</span>: [<span class="string">'off'</span>],</span><br><span class="line"> <span class="string">'vue/no-deprecated-html-element-is'</span>: [<span class="string">'off'</span>],</span><br><span class="line"> <span class="string">'@typescript-eslint/no-unused-vars'</span>: [<span class="string">'off'</span>],</span><br><span class="line"> },</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li>配置 <code>package.json</code></li></ul><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"script"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="comment">// ... 省略 ...</span></span><br><span class="line"> <span class="attr">"lint"</span><span class="punctuation">:</span> <span class="string">"eslint . --ext .vue,.js,.ts --fix --ignore-path .gitignore"</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><ul><li>运行</li></ul><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm lint</span><br></pre></td></tr></table></figure><hr><h2 id="Git-工作流规范"><a href="#Git-工作流规范" class="headerlink" title="Git 工作流规范"></a>Git 工作流规范</h2><ul><li>安装并初始化 <code>husky</code></li></ul><p>::: code-group</p><figure class="highlight sh"><figcaption><span>[pnpx]</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm dlx husky-init</span><br></pre></td></tr></table></figure><figure class="highlight sh"><figcaption><span>[npx]</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx husky-init</span><br></pre></td></tr></table></figure><p>:::</p><ul><li>安装 <code>lint-staged</code></li></ul><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pnpm i -D lint-staged</span><br></pre></td></tr></table></figure><ul><li>配置 <code>package.json</code></li></ul><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"script"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="comment">// ... 省略 ...</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lint-staged"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"*.{vue,ts,js}"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"eslint --fix"</span><span class="punctuation">]</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><ul><li>修改 <code>.husky/pre-commit</code> 文件</li></ul><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm test // [!code --]</span><br><span class="line">npm run lint-staged // [!code ++]</span><br></pre></td></tr></table></figure><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> UniApp </category>
</categories>
<tags>
<tag> UniApp </tag>
</tags>
</entry>
<entry>
<title>SpringBoot项目起步</title>
<link href="/2024/04/24/SpringBoot%E9%A1%B9%E7%9B%AE%E8%B5%B7%E6%AD%A5/"/>
<url>/2024/04/24/SpringBoot%E9%A1%B9%E7%9B%AE%E8%B5%B7%E6%AD%A5/</url>
<content type="html"><![CDATA[<h2 id="创建springboot项目"><a href="#创建springboot项目" class="headerlink" title="创建springboot项目"></a>创建springboot项目</h2><p><strong>选择Spring Web,MySQL Driver,Lombok</strong></p><hr><h2 id="添加jwt和json依赖"><a href="#添加jwt和json依赖" class="headerlink" title="添加jwt和json依赖"></a>添加jwt和json依赖</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!-- JWT依赖 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>io.jsonwebtoken<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jjwt<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>0.9.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- fastjson --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>fastjson<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.2.76<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure><hr><h2 id="添加knife4j-swagger依赖"><a href="#添加knife4j-swagger依赖" class="headerlink" title="添加knife4j swagger依赖"></a>添加knife4j swagger依赖</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--knife4j--></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.github.xiaoymin<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>knife4j-openapi3-jakarta-spring-boot-starter<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="comment"><!--springboot2换成knife4j-openapi3-spring-boot-starter 版本为4.3.0--></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>4.4.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure><hr><h2 id="添加mybatis-plus依赖"><a href="#添加mybatis-plus依赖" class="headerlink" title="添加mybatis-plus依赖"></a>添加mybatis-plus依赖</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--MybatisPlus--></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.baomidou<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>mybatis-plus-boot-starter<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.5.5<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.mybatis<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>mybatis-spring<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.0.3<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="comment"><!--springboot2 版本为2.0.6--></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>javax.xml.bind<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jaxb-api<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.3.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure><hr><h2 id="根据依赖编写application-yml"><a href="#根据依赖编写application-yml" class="headerlink" title="根据依赖编写application.yml"></a>根据依赖编写application.yml</h2><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">spring.application.name:</span> {<span class="string">项目名</span>}</span><br><span class="line"></span><br><span class="line"><span class="attr">server:</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">8080</span> </span><br><span class="line"></span><br><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">main:</span></span><br><span class="line"> <span class="attr">allow-circular-references:</span> <span class="literal">true</span> <span class="comment"># 允许依赖循环</span></span><br><span class="line"> <span class="attr">datasource:</span></span><br><span class="line"> <span class="attr">driver-class-name:</span> <span class="string">com.mysql.cj.jdbc.Driver</span></span><br><span class="line"> <span class="attr">url:</span> <span class="string">jdbc:mysql://localhost:3306/{数据库名}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true</span></span><br><span class="line"> <span class="attr">username:</span> <span class="string">root</span></span><br><span class="line"> <span class="attr">password:</span> <span class="string">j</span></span><br><span class="line"></span><br><span class="line"><span class="attr">mybatis-plus:</span></span><br><span class="line"> <span class="attr">type-aliases-package:</span> <span class="string">com.{项目名}.pojo.Entity</span> <span class="comment"># 别名扫描包</span></span><br><span class="line"> <span class="attr">mapper-locations:</span> <span class="string">"classpath*:/mapper/**/*.xml"</span> <span class="comment"># Mapper.xml文件地址,默认值</span></span><br><span class="line"> <span class="attr">configuration:</span></span><br><span class="line"> <span class="attr">map-underscore-to-camel-case:</span> <span class="literal">false</span> <span class="comment"># 是否开启下划线和驼峰的映射</span></span><br><span class="line"> <span class="attr">cache-enabled:</span> <span class="literal">false</span> <span class="comment"># 是否开启二级缓存</span></span><br><span class="line"> <span class="attr">global-config:</span></span><br><span class="line"> <span class="attr">db-config:</span></span><br><span class="line"> <span class="attr">update-strategy:</span> <span class="string">not_null</span> <span class="comment"># 更新策略:只更新非空字段</span></span><br><span class="line"></span><br><span class="line"><span class="attr">logging:</span></span><br><span class="line"> <span class="attr">level:</span></span><br><span class="line"> <span class="attr">com:</span></span><br><span class="line"> {<span class="string">项目名</span>}<span class="string">:</span></span><br><span class="line"> <span class="attr">mapper:</span> <span class="string">debug</span></span><br><span class="line"> <span class="attr">service:</span> <span class="string">info</span></span><br><span class="line"> <span class="attr">controller:</span> <span class="string">info</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># jwt令牌信息</span></span><br><span class="line"><span class="attr">jwt:</span></span><br><span class="line"> <span class="attr">token-name:</span> <span class="string">token</span></span><br><span class="line"> <span class="attr">ttl:</span> <span class="number">432000000000</span></span><br><span class="line"> <span class="attr">secret-key:</span> <span class="string">yumefusaka</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># knife4j配置信息</span></span><br><span class="line"><span class="attr">springdoc:</span></span><br><span class="line"> <span class="attr">api-docs:</span></span><br><span class="line"> <span class="attr">enabled:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">path:</span> <span class="string">/v3/api-docs</span></span><br><span class="line"> <span class="attr">swagger-ui:</span></span><br><span class="line"> <span class="attr">enabled:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">path:</span> <span class="string">/swagger-ui.html</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><hr><h2 id="Result信息包装"><a href="#Result信息包装" class="headerlink" title="Result信息包装"></a>Result信息包装</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// common/result/Result.java</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Result</span><T> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Integer code; <span class="comment">//编码:200为成功,其它数字为失败</span></span><br><span class="line"> <span class="keyword">private</span> String msg; <span class="comment">//错误信息</span></span><br><span class="line"> <span class="keyword">private</span> T data; <span class="comment">//数据</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T> Result<T> <span class="title function_">success</span><span class="params">()</span> {</span><br><span class="line"> Result<T> result = <span class="keyword">new</span> <span class="title class_">Result</span><T>();</span><br><span class="line"> result.code = <span class="number">200</span>;</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T> Result<T> <span class="title function_">success</span><span class="params">(T object)</span> {</span><br><span class="line"> Result<T> result = <span class="keyword">new</span> <span class="title class_">Result</span><T>();</span><br><span class="line"> result.data = object;</span><br><span class="line"> result.code = <span class="number">200</span>;</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T> Result<T> <span class="title function_">noToken</span><span class="params">(T object)</span> {</span><br><span class="line"> Result<T> result = <span class="keyword">new</span> <span class="title class_">Result</span><T>();</span><br><span class="line"> result.data = object;</span><br><span class="line"> result.code = <span class="number">401</span>;</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T> Result<T> <span class="title function_">error</span><span class="params">(String msg)</span> {</span><br><span class="line"> <span class="type">Result</span> <span class="variable">result</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Result</span>();</span><br><span class="line"> result.msg = msg;</span><br><span class="line"> result.code = <span class="number">500</span>;</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="Jwt设置与组件"><a href="#Jwt设置与组件" class="headerlink" title="Jwt设置与组件"></a>Jwt设置与组件</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// common/properties/JwtProperties.java</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@ConfigurationProperties(prefix="jwt")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">JwtProperties</span> {</span><br><span class="line"> <span class="keyword">private</span> String secretKey;</span><br><span class="line"> <span class="keyword">private</span> <span class="type">long</span> ttl;</span><br><span class="line"> <span class="keyword">private</span> String tokenName;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// utils/JwtUtils.java</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">JwtUtils</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 生成JWT令牌</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> claims JWT第二部分负载 payload 中存储的内容</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">createToken</span><span class="params">(String signKey,<span class="type">long</span> expire,Map<String, Object> claims)</span>{</span><br><span class="line"> <span class="type">String</span> <span class="variable">jwt</span> <span class="operator">=</span> Jwts.builder()</span><br><span class="line"> .addClaims(claims)<span class="comment">//自定义信息(有效载荷)</span></span><br><span class="line"> .signWith(SignatureAlgorithm.HS256, signKey)<span class="comment">//签名算法(头部)</span></span><br><span class="line"> .setExpiration(<span class="keyword">new</span> <span class="title class_">Date</span>(System.currentTimeMillis() + expire))<span class="comment">//过期时间</span></span><br><span class="line"> .compact();</span><br><span class="line"> <span class="keyword">return</span> jwt;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 解析JWT令牌</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> jwt JWT令牌</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> JWT第二部分负载 payload 中存储的内容</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Claims <span class="title function_">parseToken</span><span class="params">(String signKey,String jwt)</span>{</span><br><span class="line"> <span class="type">Claims</span> <span class="variable">claims</span> <span class="operator">=</span> Jwts.parser()</span><br><span class="line"> .setSigningKey(signKey)<span class="comment">//指定签名密钥</span></span><br><span class="line"> .parseClaimsJws(jwt)<span class="comment">//指定令牌Token</span></span><br><span class="line"> .getBody();</span><br><span class="line"> <span class="keyword">return</span> claims;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="token登录自定义拦截器"><a href="#token登录自定义拦截器" class="headerlink" title="token登录自定义拦截器"></a>token登录自定义拦截器</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// interceptor/LoginCheckInterceptor.java</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//自定义拦截器</span></span><br><span class="line"><span class="meta">@Component</span> <span class="comment">//当前拦截器对象由Spring创建和管理</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">LoginCheckInterceptor</span> <span class="keyword">implements</span> <span class="title class_">HandlerInterceptor</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> JwtProperties jwtProperties;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//前置方式</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">preHandle</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> System.out.println(<span class="string">"preHandle .... "</span>);</span><br><span class="line"> <span class="comment">//1.获取请求url</span></span><br><span class="line"> <span class="comment">//2.判断请求url中是否包含login,如果包含,说明是登录操作,放行</span></span><br><span class="line"> <span class="comment">//3.获取请求头中的令牌(token)</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">token</span> <span class="operator">=</span> request.getHeader(<span class="string">"token"</span>);</span><br><span class="line"> log.info(<span class="string">"从请求头中获取的令牌:{}"</span>, token);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//4.判断令牌是否存在,如果不存在,返回错误结果(未登录)</span></span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.hasLength(token)) {</span><br><span class="line"> log.info(<span class="string">"Token不存在"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//创建响应结果对象</span></span><br><span class="line"> <span class="type">Result</span> <span class="variable">responseResult</span> <span class="operator">=</span> Result.noToken(<span class="string">"NOT_LOGIN"</span>);</span><br><span class="line"> <span class="comment">//把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">json</span> <span class="operator">=</span> JSONObject.toJSONString(responseResult);</span><br><span class="line"> <span class="comment">//设置状态码</span></span><br><span class="line"> response.setStatus(<span class="number">401</span>);</span><br><span class="line"> <span class="comment">//设置响应头(告知浏览器:响应的数据类型为json、响应的数据编码表为utf-8)</span></span><br><span class="line"> response.setContentType(<span class="string">"application/json;charset=utf-8"</span>);</span><br><span class="line"> <span class="comment">//响应</span></span><br><span class="line"> response.getWriter().write(json);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;<span class="comment">//不放行</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//5.解析token,如果解析失败,返回错误结果(未登录)</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">Claims</span> <span class="variable">claims</span> <span class="operator">=</span> JwtUtils.parseToken(jwtProperties.getSecretKey(), token);</span><br><span class="line"> BaseContext.setCurrentId((String) claims.get(<span class="string">"id"</span>));</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> log.info(<span class="string">"令牌解析失败!"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//创建响应结果对象</span></span><br><span class="line"> <span class="type">Result</span> <span class="variable">responseResult</span> <span class="operator">=</span> Result.noToken(<span class="string">"NOT_LOGIN"</span>);</span><br><span class="line"> <span class="comment">//把Result对象转换为JSON格式字符串 (fastjson是阿里巴巴提供的用于实现对象和json的转换工具类)</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">json</span> <span class="operator">=</span> JSONObject.toJSONString(responseResult);</span><br><span class="line"> <span class="comment">//设置响应头</span></span><br><span class="line"> response.setContentType(<span class="string">"application/json;charset=utf-8"</span>);</span><br><span class="line"> <span class="comment">//设置状态码</span></span><br><span class="line"> response.setStatus(<span class="number">401</span>);</span><br><span class="line"> <span class="comment">//响应</span></span><br><span class="line"> response.getWriter().write(json);</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//6.放行</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="当前用户信息存储"><a href="#当前用户信息存储" class="headerlink" title="当前用户信息存储"></a>当前用户信息存储</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// common/context/BaseContent.java</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BaseContext</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> ThreadLocal<String> threadLocal = <span class="keyword">new</span> <span class="title class_">ThreadLocal</span><>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">setCurrentId</span><span class="params">(String id)</span> {</span><br><span class="line"> threadLocal.set(id);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">getCurrentId</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> threadLocal.get();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">removeCurrentId</span><span class="params">()</span> {</span><br><span class="line"> threadLocal.remove();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="全局异常处理"><a href="#全局异常处理" class="headerlink" title="全局异常处理"></a>全局异常处理</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// handler/GlobalExceptionHandler.java</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@RestControllerAdvice(basePackages = {"com.{项目名}.controller"},annotations = {RestController.class})</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GlobalExceptionHandler</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//处理异常</span></span><br><span class="line"> <span class="meta">@ExceptionHandler(Exception.class)</span> <span class="comment">//指定能够处理的异常类型</span></span><br><span class="line"> <span class="keyword">public</span> Result <span class="title function_">ex</span><span class="params">(Exception e)</span>{</span><br><span class="line"> e.printStackTrace();<span class="comment">//打印堆栈中的异常信息</span></span><br><span class="line"> <span class="comment">//捕获到异常之后,响应一个标准的Result</span></span><br><span class="line"> <span class="keyword">return</span> Result.error(e.getMessage());</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="Web统一配置类并注册自定义拦截器"><a href="#Web统一配置类并注册自定义拦截器" class="headerlink" title="Web统一配置类并注册自定义拦截器"></a>Web统一配置类并注册自定义拦截器</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// config/WebMvcConfiguration.java</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WebMvcConfiguration</span> <span class="keyword">implements</span> <span class="title class_">WebMvcConfigurer</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//自定义的拦截器对象</span></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> LoginCheckInterceptor loginCheckInterceptor;</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//注册自定义拦截器</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">addInterceptors</span><span class="params">(InterceptorRegistry registry)</span> {</span><br><span class="line"> log.info(<span class="string">"开始注册自定义拦截器..."</span>);</span><br><span class="line"> registry.addInterceptor(loginCheckInterceptor)</span><br><span class="line"> .addPathPatterns(<span class="string">"/user/**"</span>)</span><br><span class="line"> .excludePathPatterns(<span class="string">"/*/login"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//设置静态资源映射</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">addResourceHandlers</span><span class="params">(ResourceHandlerRegistry registry)</span> {</span><br><span class="line"> log.info(<span class="string">"开始设置静态资源映射"</span>);</span><br><span class="line"> registry.addResourceHandler(<span class="string">"/doc.html"</span>).addResourceLocations(<span class="string">"classpath:/META-INF/resources/"</span>);</span><br><span class="line"> registry.addResourceHandler(<span class="string">"/webjars/**"</span>).addResourceLocations(<span class="string">"classpath:/META-INF/resources/webjars/"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="跨域过滤器配置"><a href="#跨域过滤器配置" class="headerlink" title="跨域过滤器配置"></a>跨域过滤器配置</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// config/GlobalCorsConfig.java</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GlobalCorsConfig</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> CorsFilter <span class="title function_">corsFilter</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//1. 添加 CORS配置信息</span></span><br><span class="line"> <span class="type">CorsConfiguration</span> <span class="variable">config</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">CorsConfiguration</span>();</span><br><span class="line"> <span class="comment">// 放行哪些原始域</span></span><br><span class="line"> config.addAllowedOrigin(<span class="string">"*"</span>);</span><br><span class="line"> <span class="comment">// 放行哪些请求方式</span></span><br><span class="line"> config.addAllowedMethod(<span class="string">"*"</span>);</span><br><span class="line"> <span class="comment">// 放行哪些原始请求头部信息</span></span><br><span class="line"> config.addAllowedHeader(<span class="string">"*"</span>);</span><br><span class="line"> <span class="comment">// 暴露哪些头部信息</span></span><br><span class="line"> config.addExposedHeader(<span class="string">"*"</span>);</span><br><span class="line"> <span class="comment">//2. 添加映射路径</span></span><br><span class="line"> <span class="type">UrlBasedCorsConfigurationSource</span> <span class="variable">corsConfigurationSource</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UrlBasedCorsConfigurationSource</span>();</span><br><span class="line"> corsConfigurationSource.registerCorsConfiguration(<span class="string">"/**"</span>,config);</span><br><span class="line"> <span class="comment">//3. 返回新的CorsFilter</span></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">CorsFilter</span>(corsConfigurationSource);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="时间转字符串配置"><a href="#时间转字符串配置" class="headerlink" title="时间转字符串配置"></a>时间转字符串配置</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// config/LocalDateTimeConfig.java</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.time.LocalDateTime;</span><br><span class="line"><span class="keyword">import</span> java.time.format.DateTimeFormatter;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">LocalDateTimeConfig</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> LocalDateTimeSerializer <span class="title function_">localDateTimeDeserializer</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">LocalDateTimeSerializer</span>(DateTimeFormatter.ofPattern(<span class="string">"yyyy-MM-dd HH:mm:ss"</span>));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> Jackson2ObjectMapperBuilderCustomizer <span class="title function_">jackson2ObjectMapperBuilderCustomizer</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> SpringBoot </category>
</categories>
<tags>
<tag> SpringBoot </tag>
</tags>
</entry>
<entry>
<title>Qt基于VS项目起步</title>
<link href="/2024/04/24/Qt%E5%9F%BA%E4%BA%8EVS%E9%A1%B9%E7%9B%AE%E8%B5%B7%E6%AD%A5/"/>
<url>/2024/04/24/Qt%E5%9F%BA%E4%BA%8EVS%E9%A1%B9%E7%9B%AE%E8%B5%B7%E6%AD%A5/</url>
<content type="html"><![CDATA[<h2 id="配置项目的qt模块"><a href="#配置项目的qt模块" class="headerlink" title="配置项目的qt模块"></a>配置项目的qt模块</h2><p><strong>导航栏点击项目→属性→配置属性→Qt Project Settings→General→Qt Modules (Core,GUI,Widgets必选)</strong></p><hr><h2 id="添加Qt资源文件"><a href="#添加Qt资源文件" class="headerlink" title="添加Qt资源文件"></a>添加Qt资源文件</h2><p><strong>添加→新建项→Qt→Qt Resource File→命名为Resource.qrc</strong></p><hr><h2 id="修改Resource-qrc"><a href="#修改Resource-qrc" class="headerlink" title="修改Resource.qrc"></a>修改Resource.qrc</h2><p><strong>Prefix的值修改为 /</strong></p><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> Qt C++ </category>
</categories>
<tags>
<tag> Qt C++ </tag>
</tags>
</entry>
<entry>
<title>Java爬虫项目起步</title>
<link href="/2024/04/24/Java%E7%88%AC%E8%99%AB%E9%A1%B9%E7%9B%AE%E8%B5%B7%E6%AD%A5/"/>
<url>/2024/04/24/Java%E7%88%AC%E8%99%AB%E9%A1%B9%E7%9B%AE%E8%B5%B7%E6%AD%A5/</url>
<content type="html"><![CDATA[<h2 id="创建springboot项目"><a href="#创建springboot项目" class="headerlink" title="创建springboot项目"></a>创建springboot项目</h2><p><strong>选择Spring Web,MySQL Driver,Lombok</strong></p><hr><h2 id="添加Webmagic依赖"><a href="#添加Webmagic依赖" class="headerlink" title="添加Webmagic依赖"></a>添加Webmagic依赖</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--WebMagic核心包--></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>us.codecraft<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>webmagic-core<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>0.10.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">exclusions</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">exclusion</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.slf4j<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>slf4j-log4j12<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">exclusion</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">exclusions</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="comment"><!--WebMagic扩展--></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>us.codecraft<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>webmagic-extension<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>0.10.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="comment"><!--WebMagic对布隆过滤器的支持--></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.google.guava<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>guava<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>16.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure><hr><h2 id="添加mybatis-plus依赖"><a href="#添加mybatis-plus依赖" class="headerlink" title="添加mybatis-plus依赖"></a>添加mybatis-plus依赖</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--MybatisPlus--></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.baomidou<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>mybatis-plus-boot-starter<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.5.5<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.mybatis<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>mybatis-spring<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.0.3<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure><hr><h2 id="配置application-yml"><a href="#配置application-yml" class="headerlink" title="配置application.yml"></a>配置application.yml</h2><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">server:</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">8080</span> <span class="comment"># 端口</span></span><br><span class="line"></span><br><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">main:</span></span><br><span class="line"> <span class="attr">allow-circular-references:</span> <span class="literal">true</span> <span class="comment"># 是否允许循环依赖</span></span><br><span class="line"> <span class="attr">datasource:</span></span><br><span class="line"> <span class="attr">driver-class-name:</span> <span class="string">com.mysql.cj.jdbc.Driver</span></span><br><span class="line"> <span class="attr">url:</span> <span class="string">jdbc:mysql://localhost:3306/{database}?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true</span></span><br><span class="line"> <span class="attr">username:</span> <span class="string">root</span></span><br><span class="line"> <span class="attr">password:</span> <span class="string">j</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="attr">mybatis-plus:</span></span><br><span class="line"> <span class="attr">type-aliases-package:</span> <span class="string">com.bangumi_crawler.pojo</span> <span class="comment"># 扫描实体类的包名</span></span><br><span class="line"> <span class="attr">mapper-locations:</span> <span class="string">"classpath*:/mapper/**/*.xml"</span> <span class="comment"># Mapper.xml</span></span><br><span class="line"> <span class="attr">configuration:</span></span><br><span class="line"> <span class="attr">map-underscore-to-camel-case:</span> <span class="literal">false</span> <span class="comment"># 是否开启下划线与驼峰映射</span></span><br><span class="line"> <span class="attr">cache-enabled:</span> <span class="literal">false</span> <span class="comment"># 是否开启二级缓存</span></span><br><span class="line"> <span class="attr">global-config:</span></span><br><span class="line"> <span class="attr">db-config:</span></span><br><span class="line"> <span class="attr">update-strategy:</span> <span class="string">not_null</span> <span class="comment"># 是否只更新非空字段</span></span><br></pre></td></tr></table></figure><hr><h2 id="手动获取Bean的Utils"><a href="#手动获取Bean的Utils" class="headerlink" title="手动获取Bean的Utils"></a>手动获取Bean的Utils</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// utils/BeanUtils.java</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BeanUtils</span> <span class="keyword">implements</span> <span class="title class_">ApplicationContextAware</span> {</span><br><span class="line"> <span class="keyword">protected</span> <span class="keyword">static</span> ApplicationContext applicationContext ;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setApplicationContext</span><span class="params">(ApplicationContext arg0)</span> <span class="keyword">throws</span> BeansException {</span><br><span class="line"> <span class="keyword">if</span> (applicationContext == <span class="literal">null</span>) {</span><br><span class="line"> applicationContext = arg0;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title function_">getBean</span><span class="params">(String name)</span> {</span><br><span class="line"> <span class="comment">//name表示其他要注入的注解name名</span></span><br><span class="line"> <span class="keyword">return</span> applicationContext.getBean(name);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 拿到ApplicationContext对象实例后就可以手动获取Bean的注入实例对象</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T> T <span class="title function_">getBean</span><span class="params">(Class<T> clazz)</span> {</span><br><span class="line"> <span class="keyword">return</span> applicationContext.getBean(clazz);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="task模板"><a href="#task模板" class="headerlink" title="task模板"></a>task模板</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// task/Pipeline.java</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BangumiPipeline</span> <span class="keyword">implements</span> <span class="title class_">Pipeline</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">// ResultItems保存了抽取结果,它是一个Map结构,</span></span><br><span class="line"> <span class="comment">// 在page.putField(key,value)中保存的数据,</span></span><br><span class="line"> <span class="comment">//可以通过ResultItems.get(key)获取</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">process</span><span class="params">(ResultItems resultItems, Task task)</span> {</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><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// task/Processor.java</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Processor</span> <span class="keyword">implements</span> <span class="title class_">PageProcessor</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">process</span><span class="params">(Page page)</span>{</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="type">Site</span> <span class="variable">site</span> <span class="operator">=</span> Site.me()</span><br><span class="line"> .setCharset(<span class="string">"UTF-8"</span>)<span class="comment">//编码</span></span><br><span class="line"> .setSleepTime(<span class="number">1</span>)<span class="comment">//抓取间隔时间</span></span><br><span class="line"> .setTimeOut(<span class="number">1000</span>*<span class="number">10</span>)<span class="comment">//超时时间</span></span><br><span class="line"> .setRetrySleepTime(<span class="number">3000</span>)<span class="comment">//重试时间</span></span><br><span class="line"> .setRetryTimes(<span class="number">3</span>);<span class="comment">//重试次数</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> Site <span class="title function_">getSite</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> site;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">""</span>;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> Pipeline pipeline;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Scheduled(initialDelay = 1000,fixedDelay = 100*1000)</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">process</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">HttpClientDownloader</span> <span class="variable">httpClientDownloader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HttpClientDownloader</span>();</span><br><span class="line"> Spider.create(<span class="keyword">new</span> <span class="title class_">Processor</span>())</span><br><span class="line"> .addUrl(url) <span class="comment">//初始访问url地址</span></span><br><span class="line"> .setScheduler(<span class="keyword">new</span> <span class="title class_">QueueScheduler</span>().setDuplicateRemover(<span class="keyword">new</span> <span class="title class_">BloomFilterDuplicateRemover</span>(<span class="number">1000000</span>))) <span class="comment">//参数设置需要对多少条数据去重</span></span><br><span class="line"> .thread(<span class="number">10</span>) <span class="comment">//设置线程数</span></span><br><span class="line"> .setDownloader(httpClientDownloader)</span><br><span class="line"> .addPipeline(pipeline)</span><br><span class="line"> .run();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><h2 id="启动类开启定时任务"><a href="#启动类开启定时任务" class="headerlink" title="启动类开启定时任务"></a>启动类开启定时任务</h2><h4 id="在application上添加-EnableScheduling注解"><a href="#在application上添加-EnableScheduling注解" class="headerlink" title="在application上添加@EnableScheduling注解"></a>在application上添加@EnableScheduling注解</h4><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> Java爬虫 </category>
</categories>
<tags>
<tag> Java爬虫 </tag>
</tags>
</entry>
<entry>
<title>Dijkstra(堆优化)</title>
<link href="/2023/05/31/Dijkstra/"/>
<url>/2023/05/31/Dijkstra/</url>
<content type="html"><![CDATA[<p class='p center logo large'>Dijkstra算法</p><p class='p center small'>图论:单源最短路</p><div class="note info simple"><p>这是一篇讲解单源最短路算法<span class='p red'>Dijkstra</span>的文章,阅读前先了解图的数据结构(带权图,无向图,有向图)</p></div><h1 id="概念"><a href="#概念" class="headerlink" title="概念:"></a>概念:</h1><h2 id="单源最短路"><a href="#单源最短路" class="headerlink" title="单源最短路:"></a>单源最短路:</h2><p>给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。<br>要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称<br>为单源最短路径问题。</p><h2 id="Dijkstra"><a href="#Dijkstra" class="headerlink" title="Dijkstra"></a>Dijkstra</h2><p>迪杰斯特拉算法(Dijkstra),是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。<br>迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶<br>点的邻接节点,直到扩展到终点为止。</p><div class="note info simple"><p>需要注意的是,dijkstra算法只能解决正权图问题。</p></div><h1 id="算法原理与实现"><a href="#算法原理与实现" class="headerlink" title="算法原理与实现:"></a>算法原理与实现:</h1><p>我们使用<span class='p red'>链式前向星存图</span>,存储每一条边,以edge数组作为容器<br>edge的下标是cnt,而不是节点名称,cnt作为该条边的编号,规定cnt单增,每一条新的边的编号都是当前cnt+1<br>edge[cnt].to的值表示这条边指向的目标点<br>edge[cnt].next的值是一个cnt,它指向的是下一个与起点连接的节点的cnt<br>如果该节点不指向任何一个节点,那么规定next 的值为-1<br>edge[cnt].w指的是边的权值<br>head数组存储每一个点存储的第一条边的编号,下标就是该点的编号</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Edge</span> {</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="type">int</span> to, next, w;</span><br><span class="line">}edge[Num];</span><br><span class="line"><span class="type">int</span> head[Num], dis[Num], cnt = <span class="number">0</span>;</span><br><span class="line"><span class="type">bool</span> vis[Num];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">init</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="built_in">memset</span>(head, <span class="number">-1</span>, <span class="built_in">sizeof</span>(head));</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">addEdge</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v, <span class="type">int</span> w)</span> </span>{</span><br><span class="line">edge[++cnt].to = v;</span><br><span class="line">edge[cnt].w = w;</span><br><span class="line">edge[cnt].next = head[u];</span><br><span class="line">head[u] = cnt;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><p>将所有点归类为两个点集,点集A存储还未找到最短路径的点,点集B则存储已找到最短路的点。<br>我们创建一个Bool类型vis数组区分每一个点在哪个点集,若为false则说明在A点集,为true则在B点集,<br>初始所有点的vis默认为false(bool数组的特性,在不初始化时,默认值都为false)<br>然后设置数组dis,表示源点到每个点距离,在初始时,我们将源点距离设置为0,并将vis设置为true,<br>其他所有点的距离用memset设置为<span class='p red'>0x3f</span>(memst函数的赋值方式是逐字节的,而int类型<br>占4个字节,故memset会将每一个点的距离设置为0x3f3f3f3f,这是一个极大数,用来表示目前无法到达该点)。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> dis[Num];</span><br><span class="line"><span class="type">bool</span> vis[Num];</span><br><span class="line"><span class="built_in">memset</span>(dis, <span class="number">0x3f</span>, <span class="built_in">sizeof</span>(dis));</span><br><span class="line">dis[Start] = <span class="number">0</span>;</span><br><span class="line">vis[Start] = <span class="literal">true</span>;</span><br></pre></td></tr></table></figure><hr><p>由于Dijkstra算法是一种贪心算法,要将当前点集B的所有边进行排序,选出终点不在点集B而且距离最短的边,<br>使用传统容器每次存储后需要进行排序,这种遍历行为的时间复杂度是O(N)级别,而Dijkstra算法本身就需要<br>进行O(N)次选点,这样下来总的时间复杂度是O(N^2)级别的,我们能否将其优化,使得将边排序的复杂度降低?<br>这就需要一个名为堆的数据结构了,堆是一种完全二叉树,是以自上而下升序(降序)的方式排列,插入的复杂度<br>是O(logN)级别,我们需要的是当前最短的边,因此选择小根堆(升序),C++中的stl中含有一个名为优先队列(priority_queue)的容器内部实现就是堆,所以我们可以直接使用,在堆中存储对组(点的距离,点的编号)<br>,为了方便,我们用pii命名pair< int, int>。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> pii = pair<<span class="type">int</span>, <span class="type">int</span>>;</span><br><span class="line">priority_queue<pii, vector<pii>, greater<pii>> heap;</span><br></pre></td></tr></table></figure><hr><p>最后便是Dijkstra算法的具体实现,基本原理就是每次存入一个距离源点最短的点,将距离和编号放入堆,然后<br>查询放入点后源点能到达所有点中,距离最短的点,重复操作,直至所有点都进入点集B,则算法完成</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">dijkstra</span><span class="params">(<span class="type">int</span> Start)</span> </span>{</span><br><span class="line">heap.<span class="built_in">emplace</span>(dis[Start], Start);</span><br><span class="line"><span class="keyword">while</span>(heap.<span class="built_in">empty</span>()==<span class="number">0</span>) {</span><br><span class="line"><span class="keyword">auto</span> now = heap.<span class="built_in">top</span>();</span><br><span class="line"><span class="keyword">if</span> (vis[now.second]){</span><br><span class="line">heap.<span class="built_in">pop</span>();</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line">}</span><br><span class="line">vis[now.second] = <span class="literal">true</span>;</span><br><span class="line">heap.<span class="built_in">pop</span>();</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = head[now.second]; ~i; i = edge[i].next) {</span><br><span class="line"><span class="type">int</span> v = edge[i].to;</span><br><span class="line"><span class="keyword">if</span> (dis[v] > edge[i].w + dis[now.second]) {</span><br><span class="line">dis[v] = edge[i].w + dis[now.second];</span><br><span class="line">heap.<span class="built_in">emplace</span>(dis[v], v);</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><h1 id="代码总览"><a href="#代码总览" class="headerlink" title="代码总览:"></a>代码总览:</h1><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string"><bits/stdc++.h></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> lim = <span class="number">2e+5</span>;</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Edge</span> {</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="type">int</span> to, next, w;</span><br><span class="line">}edge[lim+<span class="number">5</span>];</span><br><span class="line"><span class="keyword">using</span> pii = pair<<span class="type">int</span>, <span class="type">int</span>>;</span><br><span class="line">priority_queue<pii, vector<pii>, greater<pii>> heap;</span><br><span class="line"><span class="type">int</span> head[lim+<span class="number">5</span>], dis[lim+<span class="number">5</span>], cnt = <span class="number">0</span>;</span><br><span class="line"><span class="type">bool</span> vis[lim+<span class="number">5</span>];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">init</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="built_in">memset</span>(head, <span class="number">-1</span>, <span class="built_in">sizeof</span>(head));</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">addEdge</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v, <span class="type">int</span> w)</span> </span>{</span><br><span class="line">edge[++cnt].to = v;</span><br><span class="line">edge[cnt].w = w;</span><br><span class="line">edge[cnt].next = head[u];</span><br><span class="line">head[u] = cnt;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dijkstra</span><span class="params">(<span class="type">int</span> Start)</span> </span>{</span><br><span class="line"><span class="built_in">memset</span>(dis, <span class="number">0x3f</span>, <span class="built_in">sizeof</span>(dis));</span><br><span class="line">dis[Start] = <span class="number">0</span>;</span><br><span class="line">heap.<span class="built_in">emplace</span>(dis[Start], Start);</span><br><span class="line"><span class="keyword">while</span> (heap.<span class="built_in">empty</span>() == <span class="number">0</span>) {</span><br><span class="line"><span class="keyword">auto</span> now = heap.<span class="built_in">top</span>();</span><br><span class="line"><span class="keyword">if</span> (vis[now.second]) {</span><br><span class="line">heap.<span class="built_in">pop</span>();</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line">}</span><br><span class="line">vis[now.second] = <span class="literal">true</span>;</span><br><span class="line">heap.<span class="built_in">pop</span>();</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = head[now.second]; ~i; i = edge[i].next) {</span><br><span class="line"><span class="type">int</span> v = edge[i].to;</span><br><span class="line"><span class="keyword">if</span> (dis[v] > edge[i].w + dis[now.second]) {</span><br><span class="line">dis[v] = edge[i].w + dis[now.second];</span><br><span class="line">heap.<span class="built_in">emplace</span>(dis[v], v);</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="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="type">int</span> n, m, s;</span><br><span class="line">cin >> n >> m >> s;</span><br><span class="line"><span class="built_in">init</span>();</span><br><span class="line"><span class="type">int</span> u, v, w;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i <= m; i++) {</span><br><span class="line">cin >> u >> v >> w;</span><br><span class="line"><span class="built_in">addEdge</span>(u, v, w);</span><br><span class="line">}</span><br><span class="line"><span class="built_in">dijkstra</span>(s);</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i <= n; i++) {</span><br><span class="line"><span class="keyword">if</span> (i == <span class="number">1</span>)cout << dis[i];</span><br><span class="line"><span class="keyword">else</span> cout << <span class="string">" "</span> << dis[i];</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><p><strong>完结撒花</strong></p>]]></content>
<categories>
<category> 数据结构与算法 </category>
</categories>
<tags>
<tag> 数据结构与算法 </tag>
</tags>
</entry>
<entry>
<title>欢迎来到梦浮坂</title>
<link href="/2023/05/29/%E6%AC%A2%E8%BF%8E%E6%9D%A5%E5%88%B0%E6%A2%A6%E6%B5%AE%E5%9D%82/"/>
<url>/2023/05/29/%E6%AC%A2%E8%BF%8E%E6%9D%A5%E5%88%B0%E6%A2%A6%E6%B5%AE%E5%9D%82/</url>
<content type="html"><![CDATA[<font size = 4,font color=pink>Ciallo~(∠・ω< )⌒★ 我是MonPanache,欢迎来到我的小站,这是我的个人空间,也是我时光的记录簿<br/>我将在这里记录下我生活中经历的点点滴滴,与追逐梦想的历程,希望大家共同见证这个网站与我的成长</font>]]></content>
</entry>
</search>