PageSourceSearch

https://gis90.github.io/articles/12268/

html gis90.github.io collected 2026-10-03 09:14:35 UTC 77,690 bytes, 2,137 lines download raw bytes

1<!DOCTYPE html>
2
3
4
5
6
7
8
9
10
11
12
13
14  
15
16
17<html class="theme-next gemini use-motion" lang="zh-CN">
18<head><meta name="generator" content="Hexo 3.8.0">
19  <meta charset="UTF-8">
20<meta name="google-site-verification" content="nOQH_Lr6zdiXCxCLRslnRmrnULAd7XsMJc-3MQo0iMI">
21<meta http-equiv="X-UA-Compatible" content="IE=edge">
22<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
23<meta name="theme-color" content="#222">
24<meta name="baidu-site-verification" content="3T5rDqaWUL">
25<meta name="baidu-site-verification" content="1hLVI7jmus">
26
27<!-- title、keywords、desc关键字 -->
28
29  <title>Hi</title>
30  <meta name="title" content="Hi">
31
32
33  <meta name="keywords" content="Python, Linux, Hexo, 技术, 影视说, 娱乐, 旅行记, 博客, 代码, 生活, 人生, 分享">
34
35
36
37
38  
39  
40  <link rel="stylesheet" href="/lib/needsharebutton/needsharebutton.css">
41
42
43
44  
45  
46    
47    
48  
48<script src="/lib/pace/pace.min.js?v=1.0.2"></script>
48
49  <link rel="stylesheet" href="/lib/pace/pace-theme-center-atom.min.css?v=1.0.2">
50
51
52
53
54
55  <meta http-equiv="Cache-Control" content="no-transform">
56  <meta http-equiv="Cache-Control" content="no-siteapp">
57
58
59
60  <meta name="google-site-verification" content="nOQH_Lr6zdiXCxCLRslnRmrnULAd7XsMJc-3MQo0iMI">
61
62
63
64
65
66
67
68
69
70
71
72  
73  
74  <link rel="stylesheet" href="/lib/fancybox/source/jquery.fancybox.css?v=2.1.5">
75
76
77
78
79
80
81
82<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2">
83
84<link rel="stylesheet" href="/css/main.css?v=7.0.1">
85
86
87  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=7.0.1">
88
89
90  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon32.ico?v=7.0.1">
91
92
93  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon16.ico?v=7.0.1">
94
95
96  <link rel="mask-icon" href="/images/logo.svg?v=7.0.1" color="#222">
97
98
99
100
101
102
103
104<script id="hexo.configurations">
105  var NexT = window.NexT || {};
106  var CONFIG = {
107    root: '/',
108    scheme: 'Gemini',
109    version: '7.0.1',
110    sidebar: {"position":"left","display":"post","offset":30,"onmobile":true,"dimmer":false},
111    back2top: true,
112    back2top_sidebar: false,
113    fancybox: true,
114    fastclick: false,
115    lazyload: true,
116    tabs: true,
117    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"flipXIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"fadeIn"}},
118    algolia: {
119      applicationID: '',
120      apiKey: '',
121      indexName: '',
122      hits: {"per_page":10},
123      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
124    }
125  };
126</script>
126
127
128
129  
130
131
132
133<div id="blog_header" class="blog_header">
134    <marquee>Enjoy the good life everyday!</marquee>
135</div>
136
137<div id="float_box" class="float_box" align="middle" onmouseover="window.clearInterval(interval)" onmouseout="interval = window.setInterval('changePos()', delay)">
138    <div class="float_box_close" onclick="closeBox()">
139        关闭
140
141    </div>
142    <div id="float_box_content" class="float_box_content">
143        <marquee class="float_box_content_text" direction="right">欢迎来PyGo个人空间 ^_^</marquee>
144        <!--
145        <br><img src="/images/card.jpg" class="float_box_content_img">
146        -->
147    </div>
148</div>
149
150
151  <meta name="description" content="Python实战 Demo系统 Web flask 脚手架 背景             项目基于Python+mysql+gunicorn+supervisor进行搭建的一个web脚手架,python的web框架使用的是flask。架子已经基本搭建起来,备具Restful API、验证session、页面模板功能、一键式安装包、启动等功能。通过这个脚手架开发的一个信息管理综合小系统,用来做Dem">
152<meta name="keywords" content="python, demo, 实例, 系统">
153<meta property="og:type" content="article">
154<meta property="og:title" content="开发实例之信息管理系统">
155<meta property="og:url" content="http://pygo2.top/articles/12268/index.html">
156<meta property="og:site_name" content="PyGo²">
157<meta property="og:description" content="Python实战 Demo系统 Web flask 脚手架 背景             项目基于Python+mysql+gunicorn+supervisor进行搭建的一个web脚手架,python的web框架使用的是flask。架子已经基本搭建起来,备具Restful API、验证session、页面模板功能、一键式安装包、启动等功能。通过这个脚手架开发的一个信息管理综合小系统,用来做Dem">
158<meta property="og:locale" content="zh-CN">
159<meta property="og:image" content="http://pygo2.top/images/article_python_system.jpg">
160<meta property="og:image" content="http://pygo2.top/articles/12268/demo.png">
161<meta property="og:updated_time" content="2020-06-25T05:09:00.000Z">
162<meta name="twitter:card" content="summary">
163<meta name="twitter:title" content="开发实例之信息管理系统">
164<meta name="twitter:description" content="Python实战 Demo系统 Web flask 脚手架 背景             项目基于Python+mysql+gunicorn+supervisor进行搭建的一个web脚手架,python的web框架使用的是flask。架子已经基本搭建起来,备具Restful API、验证session、页面模板功能、一键式安装包、启动等功能。通过这个脚手架开发的一个信息管理综合小系统,用来做Dem">
165<meta name="twitter:image" content="http://pygo2.top/images/article_python_system.jpg">
166
167
168
169
170
171
172  <link rel="canonical" href="http://pygo2.top/articles/12268/">
173
174
175
176<script id="page.configurations">
177  CONFIG.page = {
178    sidebar: "",
179  };
180</script>
180
181
182  <title>开发实例之信息管理系统 | PyGo²</title>
183  
184
185
186
187
188
189
190
191
192
193
194
195
196  <noscript>
197  <style>
198  .use-motion .motion-element,
199  .use-motion .brand,
200  .use-motion .menu-item,
201  .sidebar-inner,
202  .use-motion .post-block,
203  .use-motion .pagination,
204  .use-motion .comments,
205  .use-motion .post-header,
206  .use-motion .post-body,
207  .use-motion .collection-title { opacity: initial; }
208
209  .use-motion .logo,
210  .use-motion .site-title,
211  .use-motion .site-subtitle {
212    opacity: initial;
213    top: initial;
214  }
215
216  .use-motion .logo-line-before i { left: initial; }
217  .use-motion .logo-line-after i { right: initial; }
218  </style>
219</noscript>
220
221</head>
222
223<body itemscope itemtype="http://schema.org/WebPage" lang="zh-CN">
224
225  
226  
227    
228  
229
230  <div class="container sidebar-position-left page-post-detail">
231    <div class="headband"></div>
232    <!-- 头部github设置-->
233    <a target="_blank" href="https://github.com/GIS90" class="github-corner" aria-label="View source on GitHub"><svg width="80" height="80" viewbox="0 0 250 250" style="fill:#151513; color:#fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"/><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"/><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"/></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style>
234
235    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
236      <div class="header-inner"><div class="site-brand-wrapper">
237  <div class="site-meta" style="background: #3385ff;">
238    
239
240    <div class="custom-logo-site-title">
241      <a href="/" class="brand" rel="start">
242        <span class="logo-line-before"><i></i></span>
243        <span class="site-title" style="font-family: Monospace; font-size:35px;">
244            PyGo²
245        </span>
246        <span class="logo-line-after"><i></i></span>
247      </a>
248    </div>
249    
250      
251        <h1 class="site-subtitle" itemprop="description" style="color:black;font-size:18px;font-family: Monospace;">
252            一个爱<font size="5" color="#BF0060">老婆</font>的<font size="5" color="#FF4500">Python</font>程序猿。。。。。。
253        </h1>
254      
255    
256    
257  </div>
258
259  <div class="site-nav-toggle">
260    <button aria-label="切换导航栏">
261      <span class="btn-bar"></span>
262      <span class="btn-bar"></span>
263      <span class="btn-bar"></span>
264    </button>
265  </div>
266</div>
267
268
269
270<nav class="site-nav">
271  
272    <ul id="menu" class="menu">
273      
274        
275        
276        
277          
278          <li class="menu-item menu-item-home">
279
280    
281    
282    
283      
284    
285
286    
287
288    <a href="/index.html" rel="section"><i class="menu-item-icon fa fa-fw fa-home"></i> <br>首页</a>
289
290  </li>
291        
292        
293        
294          
295          <li class="menu-item menu-item-archives">
296
297    
298    
299    
300      
301    
302
303    
304
305    <a href="/archives/" rel="section"><i class="menu-item-icon fa fa-fw fa-history"></i> <br>时间轴</a>
306
307  </li>
308        
309        
310        
311          
312          <li class="menu-item menu-item-tags">
313
314    
315    
316    
317      
318    
319
320    
321
322    <a href="/tags/" rel="section"><i class="menu-item-icon fa fa-fw fa-tags"></i> <br>标签</a>
323
324  </li>
325        
326        
327        
328          
329          <li class="menu-item menu-item-categories">
330
331    
332    
333    
334      
335    
336
337    
338
339    <a href="/categories/" rel="section"><i class="menu-item-icon fa fa-fw fa-list"></i> <br>分类</a>
340
341  </li>
342        
343        
344        
345          
346          <li class="menu-item menu-item-movie">
347
348    
349    
350    
351      
352    
353
354    
355
356    <a href="/categories/影视说/" rel="section"><i class="menu-item-icon fa fa-fw fa-film"></i> <br>影视说</a>
357
358  </li>
359        
360        
361        
362          
363          <li class="menu-item menu-item-photo">
364
365    
366    
367    
368      
369    
370
371    
372
373    <a href="/photo/" rel="section"><i class="menu-item-icon fa fa-fw fa-camera"></i> <br>相册</a>
374
375  </li>
376        
377        
378        
379          
380          <li class="menu-item menu-item-enjoy">
381
382    
383    
384    
385      
386    
387
388    
389
390    <a href="/categories/娱乐/" rel="section"><i class="menu-item-icon fa fa-fw fa-battery-full"></i> <br>娱乐</a>
391
392  </li>
393        
394        
395        
396          
397          <li class="menu-item menu-item-messagepad">
398
399    
400    
401    
402      
403    
404
405    
406
407    <a href="/messagepad/" rel="section"><i class="menu-item-icon fa fa-fw fa-sticky-note"></i> <br>留言板</a>
408
409  </li>
410        
411        
412        
413          
414          <li class="menu-item menu-item-about">
415
416    
417    
418    
419      
420    
421
422    
423
424    <a href="/about/" rel="section"><i class="menu-item-icon fa fa-fw fa-user"></i> <br>
424关于我</a>
425
426  </li>
427
428      
429      
430        <li class="menu-item menu-item-search">
431          
432            <a href="javascript:;" class="popup-trigger">
433          
434            
435              <i class="menu-item-icon fa fa-search fa-fw"></i> <br>搜索</a>
436        </li>
437      
438    </ul>
439  
440
441  
442
443  
444    <div class="site-search">
445      
446  <div class="popup search-popup local-search-popup">
447  <div class="local-search-header clearfix">
448    <span class="search-icon">
449      <i class="fa fa-search"></i>
450    </span>
451    <span class="popup-btn-close">
452      <i class="fa fa-times-circle"></i>
453    </span>
454    <div class="local-search-input-wrapper">
455      <input autocomplete="off" placeholder="没有你搜不到的,只有你想不到的。。。。。。" spellcheck="false" type="text" id="local-search-input">
456    </div>
457  </div>
458  <div id="local-search-result"></div>
459</div>
460
461
462
463    </div>
464  
465</nav>
466
467
468
469  
470
471<button id="theme_change" class="theme_change" type="button" onclick="theme_change()">
472    暗黑系
473</button>
474
475</div>
476    </header>
477
478    
479
480
481    <main id="main" class="main">
482      <div class="main-inner">
483        <div class="content-wrap">
484          
485            
486
487          
488          <div id="content" class="content">
489            
490
491  <div id="posts" class="posts-expand">
492    
493
494  
495
496  
497  
498  
499
500  
501
502  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
503  
504  
505  
506  <div class="post-block">
507    <link itemprop="mainEntityOfPage" href="http://pygo2.top/articles/12268/">
508
509    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
510      <meta itemprop="name" content="mingliang.gao">
511      <meta itemprop="description" content="<font size=" 5" color="#FF4500">直男<br><font size="4.5" color="#FF8C00">双鱼座</font><br><font size="3" color="#000000">Python开发工程师</font>"/>
512      <meta itemprop="image" content="/images/timg.gif">
513    </span>
514
515    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
516      <meta itemprop="name" content="PyGo²">
517    </span>
518
519    
520      <header class="post-header">
521
522        
523        
524          <h2 class="post-title" itemprop="name headline">开发实例之信息管理系统
525
526              
527            
528          </h2>
529        
530
531        <div class="post-meta">
532
533          
534            <i class="fa fa-thumbs-up"></i>
535            <font color="red">置顶</font>
536            <span class="post-meta-divider">|</span>
537          
538
539          <span class="post-time">
540
541            
542            
543            
544
545            
546              <span class="post-meta-item-icon">
547                <i class="fa fa-calendar-o"></i>
548              </span>
549              
550                <span class="post-meta-item-text">创建时间:</span>
551              
552
553              
554                
555              
556
557              <time title="创建时间:2020-06-25 13:09:00" itemprop="dateCreated datePublished" datetime="2020-06-25T13:09:00+08:00">2020-06-25</time>
558            
559
560            
561          </span>
562
563          
564            <span class="post-category">
565            
566              <span class="post-meta-divider">|</span>
567            
568              <span class="post-meta-item-icon">
569                <i class="fa fa-folder-o"></i>
570              </span>
571              
572                <span class="post-meta-item-text">分类于</span>
573              
574              
575                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/Python/" itemprop="url" rel="index"><span itemprop="name">Python</span></a></span>
576
577                
578                
579              
580            </span>
581          
582
583          
584
585          
586          
587
588          
589            <span class="post-meta-divider">|</span>
590            <span class="post-meta-item-icon">
591            <i class="fa fa-eye"></i>
592             阅读量: 
593            <span class="busuanzi-value" id="busuanzi_value_page_pv"></span>
594            </span>
595          
596
597          
598            <div class="post-symbolscount">
599              
600
601              
602                <span class="post-meta-item-icon">
603                  <i class="fa fa-file-word-o"></i>
604                </span>
605                
606                  <span class="post-meta-item-text">本文字数:</span>
607                
608                <span title="本文字数">2.8k</span>
609              
610
611              
612                <span class="post-meta-divider">|</span>
613              
614
615              
616                <span class="post-meta-item-icon">
617                  <i class="fa fa-clock-o"></i>
618                </span>
619                
620                  <span class="post-meta-item-text">阅读时长 &asymp;</span>
621                
622                <span title="阅读时长">3 分钟</span>
623              
624            </div>
625          
626
627          
628
629        </div>
630      </header>
631    
632
633    
634    
635    
636    <div class="post-body" itemprop="articleBody">
637
638      
639      
640
641      
642        <span class="label default">Python实战</span> <span class="label primary">Demo系统</span> <span class="label success">Web</span> <span class="label danger">flask</span> <span class="label info">脚手架</span>
643<h3 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h3><div class="note primary">
644            <p>项目基于Python+mysql+gunicorn+supervisor进行搭建的一个web脚手架,python的web框架使用的是flask。架子已经基本搭建起来,备具Restful API、验证session、页面模板功能、一键式安装包、启动等功能。</p><p>通过这个脚手架开发的一个信息管理综合小系统,用来做Demo,<font color="red" size="4.5">完美使用</font>!!!。</p>
645          </div>
646<p><img src="/images/article_python_system.jpg" alt></p>
647<a id="more"></a>
648<hr>
649
650<h3 id="环境说明"><a href="#环境说明" class="headerlink" title="环境说明"></a>环境说明</h3><ol>
651<li><h4 id="开发环境"><a href="#开发环境" class="headerlink" title="开发环境"></a>开发环境</h4></li>
652</ol>
653<table>
654<thead>
655<tr>
656<th style="text-align:center">id</th>
657<th style="text-align:center">name</th>
658<th style="text-align:center">Version</th>
659</tr>
660</thead>
661<tbody>
662<tr>
663<td style="text-align:center">1</td>
664<td style="text-align:center">Os</td>
665<td style="text-align:center">MacOS10.15.6</td>
666</tr>
667<tr>
668<td style="text-align:center">2</td>
669<td style="text-align:center">IDE</td>
670<td style="text-align:center">PyCharm</td>
671</tr>
672</tbody>
673</table>
674<ol start="2">
675<li><h4 id="基础架构"><a href="#基础架构" class="headerlink" title="基础架构"></a>基础架构</h4></li>
676</ol>
677<table>
678<thead>
679<tr>
680<th style="text-align:center">id</th>
681<th style="text-align:center">name</th>
682<th style="text-align:center">Version</th>
683<th style="text-align:center">Function</th>
684</tr>
685</thead>
686<tbody>
687<tr>
688<td style="text-align:center">1</td>
689<td style="text-align:center">Python</td>
690<td style="text-align:center">2.7</td>
691<td style="text-align:center">开发语言,基于python2</td>
692</tr>
693<tr>
694<td style="text-align:center">2</td>
695<td style="text-align:center">flask</td>
696<td style="text-align:center">1.1.2</td>
697<td style="text-align:center">使用的web框架</td>
698</tr>
699<tr>
700<td style="text-align:center">3</td>
701<td style="text-align:center">MariaDB</td>
702<td style="text-align:center">5.5.65</td>
703<td style="text-align:center">数据库</td>
704</tr>
705<tr>
706<td style="text-align:center">4</td>
707<td style="text-align:center">gunicorn</td>
708<td style="text-align:center">20.0.4</td>
709<td style="text-align:center">web服务与进程</td>
710</tr>
711<tr>
712<td style="text-align:center">5</td>
713<td style="text-align:center">supervisor</td>
714<td style="text-align:center">3.4.0</td>
715<td style="text-align:center">项目启动、停止、重启等操作</td>
716</tr>
717</tbody>
718</table>
719<p>项目主要运行于Linux系统上,本人开发使用的是MacOS,线上服务使用的是腾讯云服务器(Centos7.0)。</p>
720<h3 id="项目说明"><a href="#项目说明" class="headerlink" title="项目说明"></a>项目说明</h3><ol>
721<li><h4 id="项目地址(gitub)"><a href="#项目地址(gitub)" class="headerlink" title="项目地址(gitub)"></a>项目地址(gitub)</h4><p> <a href="https://github.com/GIS90/base_webframe" target="_blank" rel="noopener">https://github.com/GIS90/base_webframe</a></p>
722</li>
723<li><h4 id="Demo地址"><a href="#Demo地址" class="headerlink" title="Demo地址"></a>Demo地址</h4></li>
724</ol>
725<ul>
726<li>地址:<a href="http://121.4.56.169:18888/" target="_blank" rel="noopener">http://121.4.56.169:18888/</a></li>
727<li>账号:admin</li>
728<li><p>密码:0</p>
729<p>  <img src="demo.png" alt></p>
730<p>  现有功能:</p>
731<ul>
732<li>订单管理</li>
733<li>任务管理</li>
734<li>人员管理</li>
735<li>下载功能</li>
736<li>定制功能</li>
737<li>问题检索</li>
738<li>系统设置</li>
739</ul>
740</li>
741</ul>
742<ol start="3">
743<li><h4 id="环境搭建与项目运行"><a href="#环境搭建与项目运行" class="headerlink" title="环境搭建与项目运行"></a>环境搭建与项目运行</h4></li>
744</ol>
745<ul>
746<li>Centos7.0系统服务器(建议Mac或者云服务器)</li>
747<li>mysql数据库安装与配置(略,建议baidu一下)</li>
748<li>安装git命令,如果有进行下一步(检测:which git)</li>
749<li>git clone <a href="https://github.com/GIS90/base_webframe.git" target="_blank" rel="noopener">https://github.com/GIS90/base_webframe.git</a></li>
750<li>更新web配置文件:etc/prod/config.py(线上)、etc/dev/config.py(测试),根据不同需求进行项目更改</li>
751<li>安装项目运行的环境:python install_env.py,建立项目独立的运行环境ï¼
751Œå®‰è£…了virtualenv、python、gunicorn、packages等操作,了解具体详情请参考代码</li>
752<li>cd 项目根目录</li>
753<li>项目根目录:source .venv/bin/activate:激活项目环境</li>
754<li>启动项目:gunicorn -c etc/prod/gunicorn.conf(线上)、gunicorn -c etc/dev/gunicorn.conf(测试)或者手动启动(下面有介绍),关于dev/prod配置请参考上面介绍</li>
755<li>【选做】:安装supervisor &amp;&amp; 项目加入supervisor进行管理,项目包含了supervisord配置文件&amp;&amp;项目supervisor配置文件</li>
756</ul>
757<ol start="4">
758<li><h4 id="配置说明"><a href="#配置说明" class="headerlink" title="配置说明"></a>配置说明</h4><p>项目配置主要有2套,位于项目的根目录etc下:</p>
759<ul>
760<li>dev 测试环境</li>
761<li>prod 线上环境</li>
762</ul>
763<p>每套配置文件夹下有3个配置文件,config与gunicorn进行绑定:</p>
764<ul>
765<li>config:项目的db、mail、log等配置,这里的log记录项目的log,关于项目相关的配置都可以在此文件进行配置</li>
766<li>gunicorn:项目启动时所需要的IP、port、log、进程数量等配置</li>
767<li>supervisor: 项目管理的配置信息</li>
768</ul>
769<p>.yaml格式的配置文件是有deploy/config.py进行解析的,如果在config.yaml配置文件中添加配置信息,需要在此文件进行解析添加,建议添加配置默认值。</p>
770</li>
771<li><h4 id="手动启动"><a href="#手动启动" class="headerlink" title="手动启动"></a>手动启动</h4></li>
772</ol>
773<ul>
774<li>项目根目录wsgi.py文件加入</li>
775<li>app.run(host=”0.0.0.0”, port=11111, debug=True)</li>
776<li><p>执行sudo python wsgi.py,代码目前已写入,处于注释状态</p>
777  <div class="note danger">
778            <p><font size="5.5" color="red">注意:</font></p><ul><li>通过手动启动的项目为dev开发环境配置,可在deploy/config.py中进行默认调整(mode = os.environ.get(‘mode’) or ‘dev’)</li><li>如果手动启动模式开启,在gunicorn进行启动,会error: [Errno 48] Address already in use.</li><li>启动项目一定要用virtualenv安装的python环境进行启动(source .venv/bin/activate)</li></ul>
779          </div>
780</li>
781</ul>
782<h3 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h3><ol>
783<li><h4 id="安装包"><a href="#安装包" class="headerlink" title="安装包"></a>安装包</h4><p> 手动进行包安装:</p>
784 <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install -r requirements.txt</span><br></pre></td></tr></table></figure>
785<p> 此程序运行于python2,其中requirements.txt项目所需要的包,已固定版本。</p>
786</li>
787<li><h4 id="supervisor"><a href="#supervisor" class="headerlink" title="supervisor"></a>supervisor</h4><p> 管理项目进程的启动、停止、重启等操作。<br> 安装:</p>
788 <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install supervisor</span><br></pre></td></tr></table></figure>
789<p> 配置:</p>
790<ul>
791<li>dev:etc/dev/supervisor_base_webframe.conf</li>
792<li>prod:etc/prod/supervisor_base_webframe.conf</li>
793</ul>
794<p>把指定环境的supervisor_base_webframe.conf cp到/etc/supervisord.d/include/*下。<br>项目root根目录下有supervisord.conf文件,用来配置supervisord。</p>
795</li>
796<li><h4 id="管理gunicorn"><a href="#管理gunicorn" class="headerlink" title="管理gunicorn"></a>管理gunicorn</h4><p> 负责web项目进程、服务。</p>
797<p> 安装:</p>
798 <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install gunicorn</span><br></pre></td></tr></table></figure>
799<p> 配置:</p>
800<ul>
801<li>dev:etc/dev/gunicorn.conf</li>
802<li>prod:etc/prod/gunicorn.conf</li>
803</ul>
804<p>如需特别项目启动信息,可以加入gunicorn.conf或者更改命令行gunicorn启动方式加入参数即可。</p>
805</li>
806<li><h4 id="sql"><a href="#sql" class="headerlink" title="sql"></a>
806sql</h4><p> 创建sql:<br> deploy&gt;sql&gt;table_create_sql.sql,直接执行即可。</p>
807<p> 插入sql:<br> deploy&gt;sql&gt;print_insert_sql.py,具体需要哪些insert的数据,看代码,根据需要插入。</p>
808</li>
809<li><h4 id="其他-1"><a href="#其他-1" class="headerlink" title="其他"></a>其他</h4><ul>
810<li>base_webframe_start.bash、base_webframe_end.bash为手动方式进行项目启动与项目结束(已废弃)。</li>
811<li>deploy&gt;utils&gt;utils.py 为工具方法,任何python2项目都适合使用。</li>
812</ul>
813</li>
814</ol>
815<h3 id="结束语"><a href="#结束语" class="headerlink" title="结束语"></a>结束语</h3><font size="6.5" color="red">如果觉得脚手架还可以,麻烦在github上点个小星星。。。。。。</font>
816
817      
818    </div>
819
820    <!-- 版权声明 -->
821    <div>
822     
823        <ul class="post-copyright">
824          <li class="post-copyright-author">
825              <strong>本文作者:</strong>mingliang.gao【一个爱<font size="5" color="#BF0060">老婆</font>的<font size="5" color="#FF4500">Python</font>程序猿。。。。。。】
826          </li>
827          <li class="post-copyright-link">
828            <strong>本文链接:</strong>
829            <a href="http://pygo2.top/articles/12268/" title="开发实例之信息管理系统">http://pygo2.top/articles/12268/</a>
830          </li>
831          <li class="post-copyright-license">
832            <strong>版权声明:</strong>
833            本博客所有文章欢迎转载,转载请注明出处!
834          </li>
835        </ul>
836      
837    </div>
838
839    
840
841    
842    
843    
844
845    
846
847    
848      
849    
850    
851      <div>
852        <div id="reward-container">
853  <div>觉得有帮助 <i class="fa fa-paw" style="color:red"></i> 请偶坐个公交车</div>
854  <button id="reward-button" disable="enable" onclick="var qr = document.getElementById(&quot;qr&quot;); qr.style.display = (qr.style.display === 'none') ? 'block' : 'none';">
855    打赏
856  </button>
857  <div id="qr" style="display: none;">
858
859    
860      
861      
862        
863      
864      <div style="display: inline-block">
865        <img src="/images/wechatpay.png" alt="mingliang.gao 微信支付">
866        <p>微信支付</p>
867      </div>
868    
869      
870      
871        
872      
873      <div style="display: inline-block">
874        <img src="/images/alipay.png" alt="mingliang.gao 支付宝">
875        <p>支付宝</p>
876      </div>
877    
878
879  </div>
880</div>
881
882      </div>
883    
884
885    
886
887    <footer class="post-footer">
888      
889        <div class="post-tags">
890          
891            <a href="/tags/Python/" rel="tag"><i class="fa fa-bomb"></i> Python</a>
892          
893            <a href="/tags/Python程序篇/" rel="tag"><i class="fa fa-bomb"></i> Python程序篇</a>
894          
895            <a href="/tags/Flask/" rel="tag"><i class="fa fa-bomb"></i> Flask</a>
896          
897        </div>
898      
899
900      
901      
902      
903
904      
905        <div class="post-nav">
906          <div class="post-nav-next post-nav-item">
907            
908              <a href="/articles/47364/" rel="next" title="Nginx源码安装">
909                <i class="fa fa-chevron-left"></i> Nginx源码安装
910              </a>
911            
912          </div>
913
914          <span class="post-nav-divider"></span>
915
916          <div class="post-nav-prev post-nav-item">
917            
918              <a href="/articles/16635/" rel="prev" title="抖音BMG">
919                抖音BMG <i class="fa fa-chevron-right"></i>
920              </a>
921            
922          </div>
923        </div>
924      
925
926      
927      
928    </footer>
929  </div>
930  
931  
932  
933  </article>
934
935
936  </div>
937
938
939          </div>
940          
941
942        </div>
943        
944          
945  
946  <div class="sidebar-toggle">
947    <div class="sidebar-toggle-line-wrap">
948      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
949      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
950      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
951    </div>
952  </div>
953
954  <aside id="sidebar" class="sidebar">
955    <div class="sidebar-inner">
956
957      
958
959      
960        <ul class="sidebar-nav motion-element">
961          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
962            文章目录
963          </li>
964          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
965            站点概览
966          </li>
967        </ul>
968      
969
970      <div class="site-overview-wrap sidebar-panel">
971        <div class="site-overview">
972          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
973            
974              <img class="site-author-image" itemprop="image" src="/images/timg.gif" alt="mingliang.gao">
975            
976              <p class="site-author-name" itemprop="name">mingliang.gao</p>
977              <div class="site-description motion-element" itemprop="description"><font size="5" color="#FF4500">直男</font><br><font size="4.5" color="#FF8C00">双鱼座</font><br><font size="3" color="#000000">Python开发工程师</font></div>
978          </div>
979
980          
981            <nav class="site-state motion-element">
982              
983                <div class="site-state-item site-state-posts">
984                
985                  <a href="/archives/">
986                
987                    <span class="site-state-item-count">203</span>
988                    <span class="site-state-item-name">日志</span>
989                  </a>
990                </div>
991              
992
993              
994                
995                
996                <div class="site-state-item site-state-categories">
997                  
998                    
999                      <a href="/categories/">
1000                    
1001                  
1002                    
1003                    
1004                      
1005                    
1006                      
1007                    
1008                      
1009                    
1010                      
1011                    
1012                      
1013                    
1014                      
1015                    
1016                      
1017                    
1018                      
1019                    
1020                      
1021                    
1022                      
1023                    
1024                      
1025                    
1026                      
1027                    
1028                      
1029                    
1030                      
1031                    
1032                      
1033                    
1034                      
1035                    
1036                      
1037                    
1038                      
1039                    
1040                      
1041                    
1042                      
1043                    
1044                      
1045                    
1046                      
1047                    
1048                      
1049                    
1050                      
1051                    
1052                      
1053                    
1054                      
1055                    
1056                      
1057                    
1058                      
1059                    
1060                      
1061                    
1062                      
1063                    
1064                      
1065                    
1066                      
1067                    
1068                    <span class="site-state-item-count">31</span>
1069                    <span class="site-state-item-name">分类</span>
1070                  </a>
1071                </div>
1072              
1073
1074              
1075                
1076                
1077                <div class="site-state-item site-state-tags">
1078                  
1079                    
1080                      <a href="/tags/">
1081                    
1082                  
1083                    
1084                    
1085                      
1086                    
1087                      
1088                    
1089                      
1090                    
1091                      
1092                    
1093                      
1094                    
1095                      
1096                    
1097                      
1098                    
1099                      
1100                    
1101                      
1102                    
1103                      
1104                    
1105                      
1106                    
1107                      
1108                    
1109                      
1110                    
1111                      
1112                    
1113                      
1114                    
1115                      
1116                    
1117                      
1118                    
1119                      
1120                    
1121                      
1122                    
1123                      
1124                    
1125                      
1126                    
1127                      
1128                    
1129                      
1130                    
1131                      
1132                    
1133                      
1134                    
1135                      
1136                    
1137                      
1138                    
1139                      
1140                    
1141                      
1142                    
1143                      
1144                    
1145                      
1146                    
1147                      
1148                    
1149                      
1150                    
1151                      
1152                    
1153                      
1154                    
1155                      
1156                    
1157                      
1158                    
1159                      
1160                    
1161                      
1162                    
1163                      
1164                    
1165                      
1166                    
1167                      
1168                    
1169                      
1170                    
1171                      
1172                    
1173                      
1174                    
1175                      
1176                    
1177                      
1178                    
1179                      
1180                    
1181                      
1182                    
1183                      
1184                    
1185                      
1186                    
1187                      
1188                    
1189                      
1190                    
1191                      
1192                    
1193                      
1194                    
1195                      
1196                    
1197                      
1198                    
1199                      
1200                    
1201                      
1202                    
1203                      
1204                    
1205                      
1206                    
1207                      
1208                    
1209                      
1210                    
1211                      
1212                    
1213                      
1214                    
1215                      
1216                    
1217                      
1218                    
1219                      
1220                    
1221                      
1222                    
1223                      
1224                    
1225                      
1226                    
1227                      
1228                    
1229                      
1230                    
1231                      
1232                    
1233                      
1234                    
1235                      
1236                    
1237                      
1238                    
1239                      
1240                    
1241                      
1242                    
1243                      
1244                    
1245                      
1246                    
1247                      
1248                    
1249                      
1250                    
1251                      
1252                    
1253                      
1254                    
1255                      
1256                    
1257                      
1258                    
1259                      
1260                    
1261                      
1262                    
1263                      
1264                    
1265                      
1266                    
1267                      
1268                    
1269                      
1270                    
1271                      
1272                    
1273                      
1274                    
1275                      
1276                    
1277                      
1278                    
1279                      
1280                    
1281                    <span class="site-state-item-count">96</span>
1282                    <span class="site-state-item-name">标签</span>
1283                  </a>
1284                </div>
1285              
1286
1287            </nav>
1288          
1289
1290          
1291
1292          
1293
1294          
1295            <div class="links-of-author motion-element">
1296              
1297                <span class="links-of-author-item">
1298                  
1299                  
1300                  
1301                    
1302                  
1303                  <a href="https://github.com/GIS90" title="GitHub &rarr; https://github.com/GIS90" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i></a>
1304                </span>
1305              
1306                <span class="links-of-author-item">
1307                  
1308                  
1309                  
1310                    
1311                  
1312                  <a href="https://weibo.com/u/1989571513" title="WeiBo &rarr; https://weibo.com/u/1989571513" rel="noopener" target="_blank"><i class="fa fa-fw fa-weibo"></i></a>
1313                </span>
1314              
1315                <span class="links-of-author-item">
1316                  
1317                  
1318                  
1319                    
1320                  
1321                  <a href="/[email protected]" title="E-Mail &rarr; [email protected]"><i class="fa fa-fw fa-at"></i></a>
1322                </span>
1323              
1324                <span class="links-of-author-item">
1325                  
1326                  
1327                  
1328                    
1329                  
1330                  <a href="https://my.oschina.net/u/2259452" title="OsChina &rarr; https://my.oschina.net/u/2259452" rel="noopener" target="_blank"><i class="fa fa-fw fa-fire"></i></a>
1331                </span>
1332              
1333            </div>
1334          
1335
1336          
1337
1338          
1339          
1340            <div class="links-of-blogroll motion-element links-of-blogroll-inline">
1341              <div class="links-of-blogroll-title">
1342                <i class="fa  fa-fw fa-link"></i>
1343                <font size="5.5" color="#0080FF">友情链接</font>
1344              </div>
1345              <ul class="links-of-blogroll-list">
1346                
1347                  <li class="links-of-blogroll-item">
1348                    <a href="https://www.json.cn/" title="https://www.json.cn/" rel="noopener" target="_blank">json格式化</a>
1349                  </li>
1350                
1351                  <li class="links-of-blogroll-item">
1352                    <a href="https://www.yasuotu.com/" title="https://www.yasuotu.com/" rel="noopener" target="_blank">picture压缩</a>
1353                  </li>
1354                
1355                  <li class="links-of-blogroll-item">
1356                    <a href="https://www.baidu.com/" title="https://www.baidu.com/" rel="noopener" target="_blank">baidu一下</a>
1357                  </li>
1358                
1359              </ul>
1360            </div>
1361          
1362
1363          
1364            
1365          
1366          
1367<script type="text/javascript" charset="utf-8" src="/js/tagcloud.js"></script>
vendor: 1 bytes, line 1367
1367
1368<script type="text/javascript" charset="utf-8" src="/js/tagcanvas.js"></script>
vendor: 1 bytes, line 1368
1368
1369<script type="text/javascript" charset="utf-8" src="/js/tagcanvas.js"></script>
1369
1370<div class="widget-wrap">
1371    <h4 class="widget-title" style="font-size:21px;text-align:center;color:#0080FF;margin:20px 0px 0px;">Tag Cloud</h4>
1372    <div id="myCanvasContainer" class="widget tagcloud" style="font-size:18px;">
1373        <canvas width="220" height="200" id="resCanvas" style="width=100%">
1374            <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/tags/ADB/">ADB</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/API/">API</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/ArcGIS/">ArcGIS</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Atom/">Atom</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Bootstrap/">Bootstrap</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/CSS/">CSS</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/CkEditor/">CkEditor</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Conda/">Conda</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Crontab/">Crontab</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/DB2/">DB2</a><span class="tag-list-count">11</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/DNS/">DNS</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/DingTalk/">DingTalk</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/ERROR集/">ERROR集</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Element-UI/">Element-UI</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Excel/">Excel</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Flask/">Flask</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/FreeFileSync/">FreeFileSync</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Github/">Github</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/HTML/">HTML</a><span class="tag-list-count">6</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Hadoop/">Hadoop</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Hashcat/">Hashcat</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Hexo/">Hexo</a><span class="tag-list-count">31</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Hexo插件/">Hexo插件</a><span class="tag-list-count">11</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Hexo美化/">Hexo美化</a><span class="tag-list-count">14</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/IDE/">
1374IDE</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/JSON/">JSON</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Java/">Java</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/JavaScript/">JavaScript</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Javascript/">Javascript</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/LDAP/">LDAP</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Libreoffice/">Libreoffice</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Linux/">Linux</a><span class="tag-list-count">25</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Linux其他篇/">Linux其他篇</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Linux基础篇/">Linux基础篇</a><span class="tag-list-count">5</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Linux增强篇/">Linux增强篇</a><span class="tag-list-count">5</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Linux番外篇/">Linux番外篇</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/MacOS/">MacOS</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Mysql/">Mysql</a><span class="tag-list-count">6</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Nginx/">Nginx</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Oracle/">Oracle</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/PIP/">PIP</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Postgresql/">Postgresql</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Python/">Python</a><span class="tag-list-count">33</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Python包/">Python包</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Python基础篇/">Python基础篇</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Python实战/">Python实战</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Python程序篇/">Python程序篇</a><span class="tag-list-count">11</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Rsync/">Rsync</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/SSH/">SSH</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Shell/">Shell</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Tomcat/">Tomcat</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Ubuntu/">Ubuntu</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/VIM/">VIM</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/VUE/">VUE</a><span class="tag-list-count">15</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/WIKI/">WIKI</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Windows/">Windows</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/brew/">brew</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/etherpad/">etherpad</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/ffmpeg/">ffmpeg</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/git/">git</a><span class="tag-list-count">6</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/gitea/">gitea</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/seo优化/">seo优化</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/svn/">svn</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/vant/">vant</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/中国节/">中国节</a><span class="tag-list-count">5</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/前端其他分类/">前端其他分类</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/前端组件/">前端组件</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/办公工具/">办公工具</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/动漫/">动漫</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/协议类/">协议类</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/历史/">历史</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/回忆录/">回忆录</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/国际节/">国际节</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/域名/">域名</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/存储过程/">存储过程</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/富文本编辑器/">富文本编辑器</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/抓娃娃/">
1374抓娃娃</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/文件传输/">文件传输</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/旅行记/">旅行记</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/烧脑剧/">烧脑剧</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/爬虫/">爬虫</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/爬虫系列/">爬虫系列</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/生活/">生活</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/电视剧/">电视剧</a><span class="tag-list-count">5</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/看图笑话/">看图笑话</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/纯文笑话/">纯文笑话</a><span class="tag-list-count">2</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/美国大片/">美国大片</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/美食/">美食</a><span class="tag-list-count">3</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/节日/">节日</a><span class="tag-list-count">8</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/英语学习/">英语学习</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/西方节/">西方节</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/证书/">证书</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/运维工具/">运维工具</a><span class="tag-list-count">4</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/部署教程系列/">部署教程系列</a><span class="tag-list-count">5</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/音乐/">音乐</a><span class="tag-list-count">1</span></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/项目/">项目</a><span class="tag-list-count">1</span></li></ul>
1375        </canvas>
1376    </div>
1377</div>
1378
1379
1380        </div>
1381      </div>
1382
1383      
1384      <!--noindex-->
1385        <div class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
1386          <div class="post-toc">
1387
1388            
1389            
1390            
1391            
1392
1393            
1394              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-3"><a class="nav-link" href="#背景"><span class="nav-number">1.</span> <span class="nav-text">背景</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#环境说明"><span class="nav-number">2.</span> <span class="nav-text">环境说明</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#开发环境"><span class="nav-number">2.1.</span> <span class="nav-text">开发环境</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#基础架构"><span class="nav-number">2.2.</span> <span class="nav-text">基础架构</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#项目说明"><span class="nav-number">3.</span> <span class="nav-text">项目说明</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#项目地址(gitub)"><span class="nav-number">3.1.</span> <span class="nav-text">项目地址(gitub)</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#Demo地址"><span class="nav-number">3.2.</span> <span class="nav-text">Demo地址</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#环境搭建与项目运行"><span class="nav-number">3.3.</span> <span class="nav-text">环境搭建与项目运行</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#配置说明"><span class="nav-number">
13943.4.</span> <span class="nav-text">配置说明</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#手动启动"><span class="nav-number">3.5.</span> <span class="nav-text">手动启动</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#其他"><span class="nav-number">4.</span> <span class="nav-text">其他</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#安装包"><span class="nav-number">4.1.</span> <span class="nav-text">安装包</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#supervisor"><span class="nav-number">4.2.</span> <span class="nav-text">supervisor</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#管理gunicorn"><span class="nav-number">4.3.</span> <span class="nav-text">管理gunicorn</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#sql"><span class="nav-number">4.4.</span> <span class="nav-text">sql</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#其他-1"><span class="nav-number">4.5.</span> <span class="nav-text">其他</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#结束语"><span class="nav-number">5.</span> <span class="nav-text">结束语</span></a></li></ol></div>
1395            
1396
1397          </div>
1398        </div>
1399      <!--/noindex-->
1400      
1401
1402      
1403
1404    </div>
1405  </aside>
1406  
1407
1408
1409        
1410      </div>
1411    </main>
1412
1413    <footer id="footer" class="footer">
1414      <div class="footer-inner">
1415        <div class="copyright">&copy; 2018 – <span itemprop="copyrightYear">2022</span>
1416  <span class="with-love" id="animate">
1417    <i class="fa fa-user-circle"></i>
1418  </span>
1419  <span class="author" itemprop="copyrightHolder">mingliang.gao</span>
1420
1421  
1422    <span class="post-meta-divider">|</span>
1423    <span class="post-meta-item-icon">
1424      <i class="fa fa-area-chart"></i>
1425    </span>
1426    
1427    <span title="站点总字数">570k</span>
1428  
1429
1430  
1431    <span class="post-meta-divider">|</span>
1432    <span class="post-meta-item-icon">
1433      <i class="fa fa-coffee"></i>
1434    </span>
1435    
1436    <span title="站点阅读时长">8:38</span>
1437  
1438</div>
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449<span id="sitetime" class="footer-sitetime"></span>
1450<script language="javascript">
1451	function siteTime(){
1452		window.setTimeout("siteTime()", 1000);
1453		var seconds = 1000;
1454		var minutes = seconds * 60;
1455		var hours = minutes * 60;
1456		var days = hours * 24;
1457		var years = days * 365;
1458		var today = new Date();
1459		var todayYear = today.getFullYear();
1460		var todayMonth = today.getMonth()+1;
1461		var todayDate = today.getDate();
1462		var todayHour = today.getHours();
1463		var todayMinute = today.getMinutes();
1464		var todaySecond = today.getSeconds();
1465		/* Date.UTC() -- 返回date对象距世界标准时间(UTC)1970年1月1日午夜之间的毫秒数(时间戳)
1466		year - 作为date对象的年份,为4位年份值
1467		month - 0-11之间的整数,做为date对象的月份
1468		day - 1-31之间的整数,做为date对象的天数
1469		hours - 0(午夜24点)-23之间的整数,做为date对象的小时数
1470		minutes - 0-59之间的整数,做为date对象的分钟数
1471		seconds - 0-59之间的整数,做为date对象的秒数
1472		microseconds - 0-999之间的整数,做为date对象的毫秒数 */
1473		var t1 = Date.UTC(2018,10,22,23,00,00);
1474		var t2 = Date.UTC(todayYear,todayMonth,todayDate,todayHour,todayMinute,todaySecond);
1475		var diff = t2-t1;
1476		var diffYears = Math.floor(diff/years);
1477		var diffDays = Math.floor((diff/days)-diffYears*365);
1478		var diffHours = Math.floor((diff-(diffYears*365+diffDays)*days)/hours);
1479		var diffMinutes = Math.floor((diff-(diffYears*365+diffDays)*days-diffHours*hours)/minutes);
1480		var diffSeconds = Math.floor((diff-(diffYears*365+diffDays)*days-diffHours*hours-diffMinutes*minutes)/seconds);
1481		document.getElementById("sitetime").innerHTML=" 已运行"+diffYears+" 年 "+diffDays+" 天 "+diffHours+" 小时 "+diffMinutes+" 分钟 "+diffSeconds+" 秒 | 备案编号:<a href='http://beian.miit.gov.cn/' target='_blank'><font size=4.5 color='red'>蒙ICP备2021000415号</font></a>";
1482	}
1483	siteTime();
1484</script>
1484
1485
1486        
1487<div class="busuanzi-count">
1488  
1488<script async src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
1488
1489
1490  
1491    <span class="post-meta-item-icon">
1492      <i class="fa fa-user"></i>
1493      本站访客总量:
1494    </span>
1495    <span class="site-uv" title="总访客量">
1496      <span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
1497    </span>
1498  
1499
1500  
1501    <span class="post-meta-divider">|</span>
1502  
1503
1504  
1505    <span class="post-meta-item-icon">
1506      <i class="fa fa-eye"></i>
1507      本站总访问量:
1508    </span>
1509    <span class="site-pv" title="总访问量">
1510      <span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
1511    </span>
1512  
1513</div>
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523        
1524      </div>
1525    </footer>
1526
1527    
1528      <div class="back-to-top">
1529        <i class="fa fa-arrow-up"></i>
1530        
1531          <span id="scrollpercent"><span>0</span>%</span>
1532        
1533      </div>
1534    
1535
1536    
1537      <div id="needsharebutton-float">
1538        <span class="btn">
1539          <i class="fa fa-share-alt" aria-hidden="true"></i>
1540        </span>
1541      </div>
1542    
1543
1544    
1545
1546    
1547  </div>
1548
1549  
1550
1551<script>
1552  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
1553    window.Promise = null;
1554  }
1555</script>
1555
1556
1557
1558
1559
1560
1561
1562
1563  
1564
1565
1566
1567
1568
1569
1570  
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586  
1587  
1587<script src="/lib/jquery/index.js?v=2.1.3"></script>
1587
1588
1589  
1590  
1590<script src="/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
1590
1591
1592  
1593  
1593<script src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
1593
1594
1595  
1596  
1596<script src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
1596
1597
1598  
1599  
1599<script src="/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
1599
1600
1601
1602  
1603
1604
1605  
1605<script src="/js/src/utils.js?v=7.0.1"></script>
1605
1606
1607  
1607<script src="/js/src/motion.js?v=7.0.1"></script>
1607
1608
1609
1610
1611  
1612  
1613
1614
1615  
1615<script src="/js/src/affix.js?v=7.0.1"></script>
1615
1616
1617  
1617<script src="/js/src/schemes/pisces.js?v=7.0.1"></script>
1617
1618
1619
1620
1621
1622  
1623  
1623<script src="/js/src/scrollspy.js?v=7.0.1"></script>
vendor: 1 bytes, line 1623
1623
1624<script src="/js/src/post-details.js?v=7.0.1"></script>
1624
1625
1626
1627
1628  
1629
1630
1631  
1631<script src="/js/src/next-boot.js?v=7.0.1"></script>
1631
1632
1633
1634  
1635  
1635<script src="/js/src/js.cookie.js?v=7.0.1"></script>
1635
1636  
1636<script src="/js/src/scroll-cookie.js?v=7.0.1"></script>
1636
1637
1638
1639  
1640
1641  
1642
1643  
1644  
1645
1646<script src="//cdn1.lncld.net/static/js/3.11.1/av-min.js"></script>
1646
1647
1648
1649
1650<script src="//unpkg.com/valine/dist/Valine.min.js"></script>
1650
1651
1652<script>
1653  var GUEST = ['nick', 'mail', 'link'];
1654  var guest = 'nick,mail';
1655  guest = guest.split(',').filter(function(item) {
1656    return GUEST.indexOf(item) > -1;
1657  });
1658  new Valine({
1659    el: '#comments',
1660    verify: false,
1661    notify: false,
1662    appId: 'nKAaXD2tmTHEFQRsCIhlVh5c-gzGzoHsz',
1663    appKey: 'rsNeXIqkLjqwrVmtKkf4nYl5',
1664    placeholder: '欢迎吐槽 !!!',
1665    avatar: 'monsterid',
1666    meta: guest,
1667    pageSize: '12' || 10,
1668    visitor: false,
1669    lang: '' || 'zh-cn'
1670  });
1671</script>
1671
1672
1673
1674
1675
1676
1677  
1678  
1678<script>
1679    // Popup Window;
1680    var isfetched = false;
1681    var isXml = true;
1682    // Search DB path;
1683    var search_path = "search.xml";
1684    if (search_path.length === 0) {
1685      search_path = "search.xml";
1686    } else if (/json$/i.test(search_path)) {
1687      isXml = false;
1688    }
1689    var path = "/" + search_path;
1690    // monitor main search box;
1691
1692    var onPopupClose = function (e) {
1693      $('.popup').hide();
1694      $('#local-search-input').val('');
1695      $('.search-result-list').remove();
1696      $('#no-result').remove();
1697      $(".local-search-pop-overlay").remove();
1698      $('body').css('overflow', '');
1699    }
1700
1701    function proceedsearch() {
1702      $("body")
1703        .append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
1704        .css('overflow', 'hidden');
1705      $('.search-popup-overlay').click(onPopupClose);
1706      $('.popup').toggle();
1707      var $localSearchInput = $('#local-search-input');
1708      $localSearchInput.attr("autocapitalize", "none");
1709      $localSearchInput.attr("autocorrect", "off");
1710      $localSearchInput.focus();
1711    }
1712
1713    // search function;
1714    var searchFunc = function(path, search_id, content_id) {
1715      'use strict';
1716
1717      // start loading animation
1718      $("body")
1719        .append('<div class="search-popup-overlay local-search-pop-overlay">' +
1720          '<div id="search-loading-icon">' +
1721          '<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
1722          '</div>' +
1723          '</div>')
1724        .css('overflow', 'hidden');
1725      $("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');
1726
1727      
1728
1729      $.ajax({
1730        url: path,
1731        dataType: isXml ? "xml" : "json",
1732        async: true,
1733        success: function(res) {
1734          // get the contents from search data
1735          isfetched = true;
1736          $('.popup').detach().appendTo('.header-inner');
1737          var datas = isXml ? $("entry", res).map(function() {
1738            return {
1739              title: $("title", this).text(),
1740              content: $("content",this).text(),
1741              url: $("url" , this).text()
1742            };
1743          }).get() : res;
1744          var input = document.getElementById(search_id);
1745          var resultContent = document.getElementById(content_id);
1746          var inputEventFunction = function() {
1747            var searchText = input.value.trim().toLowerCase();
1748            var keywords = searchText.split(/[\s\-]+/);
1749            if (keywords.length > 1) {
1750              keywords.push(searchText);
1751            }
1752            var resultItems = [];
1753            if (searchText.length > 0) {
1754              // perform local searching
1755              datas.forEach(function(data) {
1756                var isMatch = false;
1757                var hitCount = 0;
1758                var searchTextCount = 0;
1759                var title = data.title.trim();
1760                var titleInLowerCase = title.toLowerCase();
1761                var content = data.content.trim().replace(/<[^>]+>/g,"");
1762                
1763                var contentInLowerCase = content.toLowerCase();
1764                var articleUrl = decodeURIComponent(data.url).replace(/\/{2,}/g, '/');
1765                var indexOfTitle = [];
1766                var indexOfContent = [];
1767                // only match articles with not empty titles
1768                if(title != '') {
1769                  keywords.forEach(function(keyword) {
1770                    function getIndexByWord(word, text, caseSensitive) {
1771                      var wordLen = word.length;
1772                      if (wordLen === 0) {
1773                        return [];
1774                      }
1775                      var startPosition = 0, position = [], index = [];
1776                      if (!caseSensitive) {
1777                        text = text.toLowerCase();
1778                        word = word.toLowerCase();
1779                      }
1780                      while ((position = text.indexOf(word, startPosition)) > -1) {
1781                        index.push({position: position, word: word});
1782                        startPosition = position + wordLen;
1783                      }
1784                      return index;
1785                    }
1786
1787                    indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
1788                    indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
1789                  });
1790                  if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
1791                    isMatch = true;
1792                    hitCount = indexOfTitle.length + indexOfContent.length;
1793                  }
1794                }
1795
1796                // show search results
1797
1798                if (isMatch) {
1799                  // sort index by position of keyword
1800
1801                  [indexOfTitle, indexOfContent].forEach(function (index) {
1802                    index.sort(function (itemLeft, itemRight) {
1803                      if (itemRight.position !== itemLeft.position) {
1804                        return itemRight.position - itemLeft.position;
1805                      } else {
1806                        return itemLeft.word.length - itemRight.word.length;
1807                      }
1808                    });
1809                  });
1810
1811                  // merge hits into slices
1812
1813                  function mergeIntoSlice(text, start, end, index) {
1814                    var item = index[index.length - 1];
1815                    var position = item.position;
1816                    var word = item.word;
1817                    var hits = [];
1818                    var searchTextCountInSlice = 0;
1819                    while (position + word.length <= end && index.length != 0) {
1820                      if (word === searchText) {
1821                        searchTextCountInSlice++;
1822                      }
1823                      hits.push({position: position, length: word.length});
1824                      var wordEnd = position + word.length;
1825
1826                      // move to next position of hit
1827
1828                      index.pop();
1829                      while (index.length != 0) {
1830                        item = index[index.length - 1];
1831                        position = item.position;
1832                        word = item.word;
1833                        if (wordEnd > position) {
1834                          index.pop();
1835                        } else {
1836                          break;
1837                        }
1838                      }
1839                    }
1840                    searchTextCount += searchTextCountInSlice;
1841                    return {
1842                      hits: hits,
1843                      start: start,
1844                      end: end,
1845                      searchTextCount: searchTextCountInSlice
1846                    };
1847                  }
1848
1849                  var slicesOfTitle = [];
1850                  if (indexOfTitle.length != 0) {
1851                    slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
1852                  }
1853
1854                  var slicesOfContent = [];
1855                  while (indexOfContent.length != 0) {
1856                    var item = indexOfContent[indexOfContent.length - 1];
1857                    var position = item.position;
1858                    var word = item.word;
1859                    // cut out 100 characters
1860                    var start = position - 20;
1861                    var end = position + 80;
1862                    if(start < 0){
1863                      start = 0;
1864                    }
1865                    if (end < position + word.length) {
1866                      end = position + word.length;
1867                    }
1868                    if(end > content.length){
1869                      end = content.length;
1870                    }
1871                    slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
1872                  }
1873
1874                  // sort slices in content by search text's count and hits' count
1875
1876                  slicesOfContent.sort(function (sliceLeft, sliceRight) {
1877                    if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
1878                      return sliceRight.searchTextCount - sliceLeft.searchTextCount;
1879                    } else if (sliceLeft.hits.length !== sliceRight.hits.length) {
1880                      return sliceRight.hits.length - sliceLeft.hits.length;
1881                    } else {
1882                      return sliceLeft.start - sliceRight.start;
1883                    }
1884                  });
1885
1886                  // select top N slices in content
1887
1888                  var upperBound = parseInt('1');
1889                  if (upperBound >= 0) {
1890                    slicesOfContent = slicesOfContent.slice(0, upperBound);
1891                  }
1892
1893                  // highlight title and content
1894
1895                  function highlightKeyword(text, slice) {
1896                    var result = '';
1897                    var prevEnd = slice.start;
1898                    slice.hits.forEach(function (hit) {
1899                      result += text.substring(prevEnd, hit.position);
1900                      var end = hit.position + hit.length;
1901                      result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
1902                      prevEnd = end;
1903                    });
1904                    result += text.substring(prevEnd, slice.end);
1905                    return result;
1906                  }
1907
1908                  var resultItem = '';
1909
1910                  if (slicesOfTitle.length != 0) {
1911                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
1912                  } else {
1913                    resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
1914                  }
1915
1916                  slicesOfContent.forEach(function (slice) {
1917                    resultItem += "<a href='" + articleUrl + "'>" +
1918                      "<p class=\"search-result\">" + highlightKeyword(content, slice) +
1919                      "...</p>" + "</a>";
1920                  });
1921
1922                  resultItem += "</li>";
1923                  resultItems.push({
1924                    item: resultItem,
1925                    searchTextCount: searchTextCount,
1926                    hitCount: hitCount,
1927                    id: resultItems.length
1928                  });
1929                }
1930              })
1931            };
1932            if (keywords.length === 1 && keywords[0] === "") {
1933              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x"></i></div>'
1934            } else if (resultItems.length === 0) {
1935              resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x"></i></div>'
1936            } else {
1937              resultItems.sort(function (resultLeft, resultRight) {
1938                if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
1939                  return resultRight.searchTextCount - resultLeft.searchTextCount;
1940                } else if (resultLeft.hitCount !== resultRight.hitCount) {
1941                  return resultRight.hitCount - resultLeft.hitCount;
1942                } else {
1943                  return resultRight.id - resultLeft.id;
1944                }
1945              });
1946              var searchResultList = '<ul class=\"search-result-list\">';
1947              resultItems.forEach(function (result) {
1948                searchResultList += result.item;
1949              })
1950              searchResultList += "</ul>";
1951              resultContent.innerHTML = searchResultList;
1952            }
1953          }
1954
1955          if ('auto' === 'auto') {
1956            input.addEventListener('input', inputEventFunction);
1957          } else {
1958            $('.search-icon').click(inputEventFunction);
1959            input.addEventListener('keypress', function (event) {
1960              if (event.keyCode === 13) {
1961                inputEventFunction();
1962              }
1963            });
1964          }
1965
1966          // remove loading animation
1967          $(".local-search-pop-overlay").remove();
1968          $('body').css('overflow', '');
1969
1970          proceedsearch();
1971        }
1972      });
1973    }
1974
1975    // handle and trigger popup window;
1976    $('.popup-trigger').click(function(e) {
1977      e.stopPropagation();
1978      if (isfetched === false) {
1979        searchFunc(path, 'local-search-input', 'local-search-result');
1980      } else {
1981        proceedsearch();
1982      };
1983    });
1984
1985    $('.popup-btn-close').click(onPopupClose);
1986    $('.popup').click(function(e){
1987      e.stopPropagation();
1988    });
1989    $(document).on('keyup', function (event) {
1990      var shouldDismissSearchPopup = event.which === 27 &&
1991        $('.search-popup').is(':visible');
1992      if (shouldDismissSearchPopup) {
1993        onPopupClose();
1994      }
1995    });
1996  </script>
1996
1997
1998
1999
2000
2001
2002  
2003
2004  
2005
2006  
2007
2008  
2009<script>
2010if ($('body').find('div.pdf').length) {
2011  $.ajax({
2012    type: 'GET',
2013    url: '//cdn.jsdelivr.net/npm/pdfobject@2/pdfobject.min.js',
2014    dataType: 'script',
2015    cache: true,
2016    success: function() {
2017      $('body').find('div.pdf').each(function(i, o) {
2018        PDFObject.embed($(o).attr('target'), $(o), {
2019          pdfOpenParams: {
2020            navpanes: 0,
2021            toolbar: 0,
2022            statusbar: 0,
2023            pagemode: 'thumbs',
2024            view: 'FitH'
2025          },
2026          PDFJS_URL: '/lib/pdf/web/viewer.html',
2027          height: $(o).attr('height') || '500px'
2028        });
2029      });
2030    },
2031  });
2032}
2033</script>
2033
2034
2035
2036  
2037<script>
2038if ($('body').find('pre.mermaid').length) {
2039  $.ajax({
2040    type: 'GET',
2041    url: '//cdn.jsdelivr.net/npm/mermaid@8/dist/mermaid.min.js',
2042    dataType: 'script',
2043    cache: true,
2044    success: function() {
2045      mermaid.initialize({
2046        theme: 'forest',
2047        logLevel: 3,
2048        flowchart: { curve: 'linear' },
2049        gantt: { axisFormat: '%m/%d/%Y' },
2050        sequence: { actorMargin: 50 }
2051      });
2052    }
2053  });
2054}
2055</script>
2055
2056
2057
2058  
2059
2060  
2061
2062  
2063  
2064  
2065  
2065<script src="/lib/needsharebutton/needsharebutton.js"></script>
2065
2066  
2066<script>
2067    
2068    
2069      flOptions = {};
2070      
2071        flOptions.iconStyle = "box";
2072      
2073        flOptions.boxForm = "vertical";
2074      
2075        flOptions.position = "topCenter";
2076      
2077        flOptions.networks = "Weibo,Wechat,Douban,QQZone";
2078      
2079      new needShareButton('#needsharebutton-float', flOptions);
2080    
2081  </script>
2081
2082
2083
2084  
2085
2086  
2087
2088  
2089
2090  
2091<script>
2092  $('.highlight').each(function(i, e) {
2093    var $wrap = $('<div>').addClass('highlight-wrap');
2094    $(e).after($wrap);
2095    $wrap.append($('<button>').addClass('copy-btn').append('复制').on('click', function(e) {
2096      var code = $(this).parent().find('.code').find('.line').map(function(i, e) {
2097        return $(e).text();
2098      }).toArray().join('\n');
2099      var ta = document.createElement('textarea');
2100      var yPosition = window.pageYOffset || document.documentElement.scrollTop;
2101      ta.style.top = yPosition + 'px'; // Prevent page scroll
2102      ta.style.position = 'absolute';
2103      ta.style.opacity = '0';
2104      ta.readOnly = true;
2105      ta.value = code;
2106      document.body.appendChild(ta);
2107      ta.select();
2108      ta.setSelectionRange(0, code.length);
2109      ta.readOnly = false;
2110      var result = document.execCommand('copy');
2111      
2112        if (result) $(this).text('复制成功');
2113        else $(this).text('复制失败');
2114      
2115      ta.blur(); // For iOS
2116      $(this).blur();
2117    })).on('mouseleave', function(e) {
2118      var $b = $(this).find('.copy-btn');
2119      setTimeout(function() {
2120        $b.text('复制');
2121      }, 300);
2122    }).append(e);
2123  })
2124</script>
2124
2125
2126
2127  
2128
2129  
2130
2131
2132  
2132<script type="text/javascript" src="/js/src/click_magic.js"></script>
2132
2133  
2133<script type="text/javascript" src="/js/src/theme_change.js"></script>
2133
2134  
2134<script type="text/javascript" src="/js/src/float_box.js" language="javascript"></script>
2134
2135
2136<script src="/live2dw/lib/L2Dwidget.min.js?094cbace49a39548bed64abff5988b05"></script>
2136<script>L2Dwidget.init({"pluginRootPath":"live2dw/","pluginJsPath":"lib/","pNluginModelPath":"assets/","tagMode":false,"debug":false,"model":{"jsonPath":"/live2dw/assets/assets/haru02.model.json"},"display":{"position":"right","width":230,"height":480,"hOffset":10,"vOffset":-20},"mobile":{"show":false,"scale":0.2},"react":{"opacity":0.8},"log":false,"pluginModelPath":"assets/"});</script>
2136</body>
2137</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.