-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
484 lines (259 loc) · 146 KB
/
atom.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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>小马哥</title>
<subtitle>因为到过地狱才知道天堂的美好</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://mayu123mayu.github.io/"/>
<updated>2020-01-05T13:18:02.038Z</updated>
<id>http://mayu123mayu.github.io/</id>
<author>
<name>2m雨天</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>99session跨站请求伪造以及多种编码方式</title>
<link href="http://mayu123mayu.github.io/2020/01/05/99session%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0%E4%BB%A5%E5%8F%8A%E5%A4%9A%E7%A7%8D%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F/"/>
<id>http://mayu123mayu.github.io/2020/01/05/99session%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0%E4%BB%A5%E5%8F%8A%E5%A4%9A%E7%A7%8D%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F/</id>
<published>2020-01-05T13:18:01.949Z</published>
<updated>2020-01-05T13:18:02.038Z</updated>
<content type="html"><![CDATA[<h4 id="一-session对象"><a href="#一-session对象" class="headerlink" title="一.session对象"></a>一.session对象</h4><p>1.在Django框架中提供了一个在服务端保存用户相关信息的session对象。</p><hr><p>Session:在计算机网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。有关使用 Session 对象的详细信息,请参阅“ASP 应用程序”部分的“管理会话”。注意 会话状态仅在支持 cookie 的浏览器中保留。</p><hr><p>2.session与cookie的区别<br>session的底层是基于cookie技术来实现的,在早器保存会话状态一直用的cookie,cookie是保存在客户端的明文键值对,但这样直接保存重要信息是不安全的,后来衍生了session,session是加密后的cookie键值,加密后的值即使被人截取,也无法获取到密码等敏感信息,避免了重要资源信息泄露。当用户打开浏览器,去访问服务器的时候,服务器会为每个用户的浏览器创建一个会话对象(session对象),并且为每个session对象创建一个Jsessionid号。当session对象创建成功后,会以cookie的方式将这个Jsessionid号回写给浏览器,当用户再次进行访问服务器时,及带了具有Jsessionid号的cookie数据来一起访问服务器,服务器通过不同session的 Jsessionid号来找出与其相关联的session对象,通过不同的session对象来为不同的用户服务。</p><p><img src="https://upload-images.jianshu.io/upload_images/4956968-0175cadcbfda62d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image"></p><hr><h4 id="二-服务器记住用户的三种方式"><a href="#二-服务器记住用户的三种方式" class="headerlink" title="二.服务器记住用户的三种方式"></a>二.服务器记住用户的三种方式</h4><p>1.希望服务器记住用户的方式有以下三种:<br>1.URL重写 <a href="http://www.baidu.com/?uid=xxxxxx" target="_blank" rel="noopener">http://www.baidu.com/?uid=xxxxxx</a></p><hr><p>2.隐藏域(隐式表单域)</p><form><input type="hidden" name="uid" value="xxxxxx"></form>*************3.浏览器本地存储(1)cookie:是浏览器中的临时的文件可以保存键值对中其中的数据,在发起HTTP请求是会自动加载在请求头中。其实就是用户的跟踪。<p><img src="https://upload-images.jianshu.io/upload_images/4956968-2c27a91a14935f7b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="cookie.jpg"></p><p>(2window.LocalStorage/wingow.sessionStorage</p><hr><p>cookie和session两者的关系:</p><p>request.session—>服务器内存中的一个对象<br>cookie—>用户浏览器临时文件-—->cookie中保存了session的ID</p><hr><h4 id="三-跨站请求的伪造。"><a href="#三-跨站请求的伪造。" class="headerlink" title="三.跨站请求的伪造。"></a>三.跨站请求的伪造。</h4><hr><p><img src="https://upload-images.jianshu.io/upload_images/4956968-d8d9f622c1ff3e84.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="跨站请求伪造和post令牌.jpg"></p><hr><h4 id="四-Base64编码"><a href="#四-Base64编码" class="headerlink" title="四.Base64编码"></a>四.Base64编码</h4><hr><p>se64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作<a href="https://baike.baidu.com/item/%E9%80%9A%E9%85%8D%E7%AC%A6" target="_blank" rel="noopener">通配符</a>。</p><p>为解决此问题,可采用一种用于URL的改进Base64编码,它在末尾填充’=’号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象[标识符]格式。</p><p>另有一种用于[正则表达式]它将“+”和“/”改成了“!”和“-”,因为“+”,“*”以及前面在IRCu中用到的“[”和“]”在正则表达式中都可能具有特殊含义。</p><p>此外还有一些变种,它们将“+/”改为“<em>-”或“._”(用作编程语言中的标识符名称)或“.-”(用于XML中的Nmtoken)甚至“</em>:”(用于XML中的Name)。</p><p>Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3<em>8 = 4</em>6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。</p><h3 id="规则"><a href="#规则" class="headerlink" title="规则"></a>规则</h3><p>关于这个编码的规则:</p><p>①.把3个字节变成4个字节。</p><p>②每76个字符加一个换行符。</p><p>③.最后的结束符也要处理。</p><hr><h4 id="五-python中Base64编码。"><a href="#五-python中Base64编码。" class="headerlink" title="五.python中Base64编码。"></a>五.python中Base64编码。</h4><hr><p>(1)python中有一个模块base64<br>导入模块:<br>from base64 import b64encode,b64decode。</p><p>(2)base64encode(二进制的数据)—-可以把二进制的数据转为base64的形式。</p><hr><h4 id="六-js中编码base64-的方式"><a href="#六-js中编码base64-的方式" class="headerlink" title="六.js中编码base64 的方式"></a>六.js中编码base64 的方式</h4><hr><p>(1)window.btoa(二进制的数据) —–编码成base64为<br>(2)window.atob()—–解码</p><hr><h4 id="七-百分号编码"><a href="#七-百分号编码" class="headerlink" title="七.百分号编码"></a>七.百分号编码</h4><hr><p>(1)urllib 库<br>—-支持这种编码方式。<br>from urllib.parse import quote ,unquote<br>(2)编码——quote(中文字符或空格)<br>(3)解码——-unquote(“二进制”)还原成中文字符。</p><hr><h4 id="八-加密解密-编码解码-摘要签名指纹。"><a href="#八-加密解密-编码解码-摘要签名指纹。" class="headerlink" title="八.加密解密,编码解码,摘要签名指纹。"></a>八.加密解密,编码解码,摘要签名指纹。</h4><hr><p>加密解密 rsa/aes<br>编码解码 base64/百分号编码<br>摘要签名指纹 md5 shal sha256 sha512</p><hr>]]></content>
<summary type="html">
<h4 id="一-session对象"><a href="#一-session对象" class="headerlink" title="一.session对象"></a>一.session对象</h4><p>1.在Django框架中提供了一个在服务端保存用户相关信息的sess
</summary>
</entry>
<entry>
<title>26前端-入门及表格</title>
<link href="http://mayu123mayu.github.io/2020/01/05/26%E5%89%8D%E7%AB%AF-%E5%85%A5%E9%97%A8%E5%8F%8A%E8%A1%A8%E6%A0%BC/"/>
<id>http://mayu123mayu.github.io/2020/01/05/26%E5%89%8D%E7%AB%AF-%E5%85%A5%E9%97%A8%E5%8F%8A%E8%A1%A8%E6%A0%BC/</id>
<published>2020-01-05T04:31:52.414Z</published>
<updated>2020-01-05T04:16:42.000Z</updated>
<content type="html"><![CDATA[<p>#一。head<br>1.我们看一下前端的整体的结构。</p><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></pre></td><td class="code"><pre><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 class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">title</span>></span><span class="tag"></<span class="name">title</span>></span></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 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><p>2.head的作用<br> head标签主要负责网页图标和标题的显示以及网页的基本设置</p><pre><code>2.head标签中的标签head可以写的标签有: meta、title、link、style、script、basemeta - 设置网页元数据(例如:网页的编码方式、网页的搜索关键字、网页介绍等)title - 设置网页标题link - 导入文件(设置网页图标、导入外部样式表)</code></pre><p>2.设置编码方式标题。</p><head> <!--设置文本编码方式--> <meta charset="UTF-8"><pre><code><!--设置网页标题--><title>head标签</title></code></pre><p>3.设置网页图标<br><设置网页图标<br> rel属性 - 设置被导入的文件的作用;<br> stylesheet - 样式表<br> icon - 网页图标<br> type属性 - 设置文件类型: 文件类型/文件后缀<br> text/css - 导入的文件是:后缀是.css的文本文件<br> image/png - 导入的文件是图片,图片后缀是.png<br> href属性 - 被导入的文件路径。</p><figure class="highlight html"><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><br><span class="line"><span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"icon"</span> <span class="attr">type</span>=<span class="string">"image/ico"</span> <span class="attr">href</span>=<span class="string">"img/aaa.ico"</span>/></span></span><br></pre></td></tr></table></figure><p>#二。文本标签<br>1.1.标题标签: h1 ~ h6<br>2.段落标签: p<br>一个段落就是一个p标签(多个p标签的内容之间会自动换行)<br>3.普通文字标签: font<br>多个font标签的文字可以在一行显示。<br>4.空格和换行<br>网页内容中手动输入的空格和换行都没有用。<br>5.换行标签: br<br>6.在网页中的任何位置需要换行的时候直接加<br>或者<br><br>7.空格: 空格符号<br>(“&nbsp”; - 一个空格(单位是像素)<br> (“&emsp”; - 一个空格(单位是空格键)<br>8.文字效果: 倾斜、加粗<br> 1)加粗:<b></b>、 <strong></strong> - strong有强调的意思<br> 2)倾斜: <i></i>、 <em></em> - em有强调的意思。<br>9.水平线: hr<br>#三。列表标签<br>1.无序列表: ul-li<br> ul标签 - 表示整个列表容器<br> li标签 - 表示列表中的元素</p><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></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">ul</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>Python<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"><<span class="name">p</span>></span>Python是最有前途的学科<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>Java<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>H5<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>测试<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>Go语言<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>物联网<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"></<span class="name">ul</span>></span></span><br></pre></td></tr></table></figure><p>2.有序列表: ol-li (前面会自动加1,2,3,的序号)<br>ol标签 - 表示整个列表容器<br> li标签 - 表示列表中的元素.</p><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></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">ol</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>将肉洗干净,然加水到8分熟<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>捞起来切片<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>油锅里面放油,然后再放干海椒、花椒、生姜。炸香<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>再将肉放进去炸<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>起锅前放盐和白糖<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"></<span class="name">ol</span>></span></span><br></pre></td></tr></table></figure><p>3.自定义列表: dl-dt-dd<br>dl - 表示整个列表容器<br> dt - 表示一个分组<br> dd - 每个分组中的内容</p><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></pre></td><td class="code"><pre><span class="line">dl></span><br><span class="line"><span class="tag"><<span class="name">dt</span>></span>文科<span class="tag"></<span class="name">dt</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dd</span>></span>历史<span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dd</span>></span>地理<span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dd</span>></span>政治<span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">dt</span>></span>理科<span class="tag"></<span class="name">dt</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dd</span>></span>物理<span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dd</span>></span>化学<span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dd</span>></span>生物<span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dl</span>></span></span><br></pre></td></tr></table></figure><p>#四。图片和超文本链接<br>1.图片标签: img<br>1)src属性: 图片路径 本地文件路径(绝对路径/相对路径。网络图片路径<br>2)title属性: 图片标题(鼠标悬停在图片上等一会儿才会出现)<br>3)alt属性: 图片加载失败的提示信息(图片加载失败的时候才会显示)</p><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></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--显示本地图片--></span></span><br><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">"img/luffy.jpg"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">br</span> /></span></span><br><span class="line"><span class="comment"><!--显示网络图片--></span></span><br><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">"https://www.baidu.com/img/bd_logo1.png"</span>/></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">"img/hat3.png"</span> <span class="attr">title</span>=<span class="string">"帽子"</span> <span class="attr">alt</span>=<span class="string">"帽子加载失败"</span>/></span></span><br></pre></td></tr></table></figure><p>2.超链接:a<br><a href="跳转目的地">可见可点击的部分</a> == <a href></a></p><p>1)href属性 - 跳转的目的地<br> a.网页地址 - 跳转到指定网页<br> b.本地html文件地址 - 在浏览器中直接打开指定html文件对应的网页<br> c.选择器 - 将当前页面滚动到选择器所在的位置<br> d.# - 刷新页面</p><pre><code>2)target属性 - 页面打开方式 a._self - 默认值,在当前页面中渲染出新的页面 b._blank - 不动原页面,在新的窗口中渲染新的页面</code></pre><p>3.文字超链接<br><a href="https://www.baidu.com" target="_blank">百度</a><br>4.图片超链接<br><a href="https://www.baidu.com" target="_blank" rel="noopener"><img src="/.io//aaa.ico"></a><br>5.也可以是自己本地写的网页<br><a href="本地写的网页名字.html">列表</a><br>6.点击跳转。</p><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><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">hr</span> <span class="attr">id</span>=<span class="string">"top"</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"#page1"</span>></span>第一章<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"#page2"</span>></span>第二章<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"#page3"</span>></span>第三章<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"#"</span>></span>刷新<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">h1</span> <span class="attr">id</span>=<span class="string">"page1"</span>></span>第一章<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">"img/img1.jpg"</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">h1</span> <span class="attr">id</span>=<span class="string">"page2"</span>></span>第二章<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">"img/img2.jpeg"</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">h1</span> <span class="attr">id</span>=<span class="string">"page3"</span>></span>第三章<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">"img/img3.jpg"</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"#top"</span>></span>回到顶部<span class="tag"></<span class="name">a</span>></span></span><br></pre></td></tr></table></figure><p>#五。表格标签<br>1.表格标签: table-tr-td<br>1)table标签 - 代表整个表格<br> border属性 - 设置表框线的宽度<br> bordercolor属性 - 边框线的颜色; 颜色单词或者#16进制颜色值<br> cellspacing属性 - 设置单元格与单元格以及单元格和表格之间的间隙, 默认1<br> bgcolor属性 - 设置整个表格的背景颜色<br> width属性 - 设置整个表格的宽度<br> height属性 - 设置整个表格的高度<br> align属性 - 设置整个表格在网页中的对齐方式: center, left(默认), right<br> cellpadding属性 - 设置整个表格中所有单元格中的内容到边框的距离</p><p>2)tr标签 - 一个tr代表一行<br> bgcolor属性 - 设置一行的背景颜色<br> height属性 - 设置指定行的高度<br> align属性 - 设置指定行中所有的单元格中的内容在单元格中的对齐方式<br> cellpadding属性 - 设置整行中所有单元格中的内容到边框的距离</p><p>3)td标签 - 一个td代表一个单元格<br> bgcolor属性 - 设置指定单元格的背景颜色<br> width属性 - 设置指定单元格所在的列的宽度<br> align属性 - 设置指定单元格中的内容在单元格中的对齐方式<br> cellpadding属性 - 设置指定单元格中的内容到边框的距离</p><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><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="tag"><<span class="name">table</span> <span class="attr">cellpadding</span>=<span class="string">"20"</span> <span class="attr">align</span>=<span class="string">"center"</span> <span class="attr">width</span>=<span class="string">"600"</span> <span class="attr">height</span>=<span class="string">"400"</span> <span class="attr">border</span>=<span class="string">"1"</span> <span class="attr">cellspacing</span>=<span class="string">"0"</span> <span class="attr">bordercolor</span>=<span class="string">"#fdb335"</span> <span class="attr">bgcolor</span>=<span class="string">"yellowgreen"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">tr</span> <span class="attr">bgcolor</span>=<span class="string">"purple"</span> <span class="attr">height</span>=<span class="string">"60"</span> <span class="attr">align</span>=<span class="string">"center"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span>Python表达式<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span>结果<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span>描述<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"><<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span> <span class="attr">width</span>=<span class="string">"150"</span> <span class="attr">align</span>=<span class="string">"right"</span>></span>2行1列<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span>2行2列<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span>2行3列<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"><<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span>4<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span>5<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span>6<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"><<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span>7<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span>8<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span> <span class="attr">bgcolor</span>=<span class="string">"aquamarine"</span>></span>9<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"></<span class="name">table</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--练习: 写一个3*3的细线表格--></span></span><br><span class="line"><span class="tag"><<span class="name">br</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">table</span> <span class="attr">width</span>=<span class="string">"600"</span> <span class="attr">height</span>=<span class="string">"400"</span> <span class="attr">bgcolor</span>=<span class="string">"black"</span> <span class="attr">cellspacing</span>=<span class="string">"1"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">tr</span> <span class="attr">bgcolor</span>=<span class="string">"white"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span><span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span><span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span><span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"><<span class="name">tr</span> <span class="attr">bgcolor</span>=<span class="string">"white"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span><span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span><span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span><span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"><<span class="name">tr</span> <span class="attr">bgcolor</span>=<span class="string">"white"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span><span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span><span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"><<span class="name">td</span>></span><span class="tag"></<span class="name">td</span>></span></span><br><span class="line"><span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"></<span class="name">table</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><p>#六。前端入门<br>1.web标准<br> web标准是万维网指定的网页开发标准,主要包含三类:<br> 结构标准 - html(决定网页中的内容)<br> 表现标准 - CSS(决定网页中内容的布局和样式)<br> 行为标准 - javascript(决定网页内容动态变化)</p><p>2.认识html<br>html又叫超文本标记语言(和markdown一样)<br>一个网页本质就是一个html文件</p><p>3.html文件基本结构<br>一个html标签中有一个head标签和一个body标签</p><p>4.html基本语法<br> 1)语法<br> 双标签: <标签名 属性1=值1 属性2=值2 …>标签内容</标签名><br> 单标签: <标签名 属性1=值1 属性2=值2 …> 或者 <标签名 属性1=值1 属性2=值2 …/></p><p>2)说明<br> <>和/ - 都是固定写法<br> 标签名 - 只能写html相应版本提供的标签的标签名;什么标签是什么类型是确定的!<br> 注意:标签名前不能出现空格<br> 属性 - 属性是以’属性名=值’的形式出现,多个属性之间用空格隔开;<br> 属性的顺序不影响结果; 不管是什么属性的值,值必须用双引号引起来</p><p>标签内容 - 任何内容都可以作为标签内容;例如: 文字、标签、文字和标签的组合</p><p>注意: html中大小写不敏感</p><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><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><br><span class="line"></span><br><span class="line"><span class="comment"><!--DOCTYPE说明html版本</span></span><br><span class="line"><span class="comment">html - html5</span></span><br><span class="line"><span class="comment">--></span></span><br><span class="line"><span class="meta"><!DOCTYPE <span class="meta-keyword">HTML</span>></span></span><br><span class="line"><span class="comment"><!--<!docttype html>--></span></span><br><span class="line"><span class="comment"><!--<!docttype HtMl>--></span></span><br><span class="line"><span class="comment"><!--<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"</span></span><br><span class="line"><span class="comment">"http://www.w3.org/TR/html4/strict.dtd">--></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--网页基本结构</span></span><br><span class="line"><span class="comment">一个html代表整个网页; html标签中有一个head标签和一个body标签</span></span><br><span class="line"><span class="comment">--></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 class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">title</span>></span><span class="tag"></<span class="name">title</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">body</span>></span></span><br><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">""</span>/></span></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></head>]]></content>
<summary type="html">
<p>#一。head<br>1.我们看一下前端的整体的结构。</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span cl
</summary>
</entry>
<entry>
<title>98-Django加载资源异步请求局部刷新</title>
<link href="http://mayu123mayu.github.io/2020/01/05/98-Django%E5%8A%A0%E8%BD%BD%E8%B5%84%E6%BA%90%E5%BC%82%E6%AD%A5%E8%AF%B7%E6%B1%82%E5%B1%80%E9%83%A8%E5%88%B7%E6%96%B0/"/>
<id>http://mayu123mayu.github.io/2020/01/05/98-Django%E5%8A%A0%E8%BD%BD%E8%B5%84%E6%BA%90%E5%BC%82%E6%AD%A5%E8%AF%B7%E6%B1%82%E5%B1%80%E9%83%A8%E5%88%B7%E6%96%B0/</id>
<published>2020-01-05T04:31:52.409Z</published>
<updated>2020-01-05T10:43:55.292Z</updated>
<content type="html"><![CDATA[<h4 id="一-request请求"><a href="#一-request请求" class="headerlink" title="一.request请求"></a>一.request请求</h4><hr><p>拿请求的方法:request.method()<br>拿请求的路径:request.path()</p><hr><p>Django封装的request方法可以通过上面的方法拿到它相关的所有的信息。<br>补充知识:startswith —检查字符串以什么开头。<br>endswith———-检查字符串以什么结尾。</p><hr><h4 id="二-上传文件"><a href="#二-上传文件" class="headerlink" title="二.上传文件"></a>二.上传文件</h4><p>1.model中的方法<br>(1).声明文件的数据用:models.FilField()<br>(2).声明图片的数据用:models.ImageField(upload_to=”上传文件的路径”)</p><hr><p>2.在项目中新建media文件夹</p><hr><p>3.在setting中配置资源上传的路径<br><img src="https://upload-images.jianshu.io/upload_images/4956968-e06e835a4dec948b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="setting文件路径的设置.png"></p><hr><p><strong>注意</strong>:<br>(1)<br>MEDIA_ROOT:配置的是上传资源的路径。</p><hr><p>models.ImageField(upload_to=”上传文件的路径”)—这个的路径就会放在上面的文件夹下面。</p><hr><p>(2)<br>MEDIA_URL:配置静态资源的路径。</p><hr><p>4.在url中的urlpatters中配置静态资源的路径。<br>在列表的后面加上:</p><ul><li>static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)</li></ul><hr><p>意义:处理静态资源,<br>setting是导入的方法:可以用它去读取我的资源的路径。<br>document_root=settings.MEDIA_ROOT—-这句话就是告诉程序我资源的根路径在settings.MEDIA_ROOT。</p><p>document_root:表示资源的根路径。</p><hr><p>作用:<br>你可以请求MEDIA_URL下的所有的静态的资源。</p><hr><h4 id="三-更换admin的样式(第三方库的实现)"><a href="#三-更换admin的样式(第三方库的实现)" class="headerlink" title="三.更换admin的样式(第三方库的实现)"></a>三.更换admin的样式(第三方库的实现)</h4><hr><p>意义:可以实现响应式的布局,一句话就是可以适配屏幕的宽度。</p><hr><p>(1)pip install django-jet (装上这个三方的库)</p><hr><p>(2)在setting 的INSTALLED_APPS列表里的admin上面加”jet”<br>(3)在url中加: path(‘jet/‘, include(‘jet.urls’, ‘jet’))</p><hr><h4 id="四-生成文件的唯一标示符"><a href="#四-生成文件的唯一标示符" class="headerlink" title="四.生成文件的唯一标示符"></a>四.生成文件的唯一标示符</h4><p>1.用 from uuid import uuid1 这模块中这个方法<br>(1)生成随机唯一的,可以用来当做文件的名字。<br>2.用哈希摘要给文件取名字。<br>详解—前面文章hashilb文章。</p><hr><h4 id="五-异步请求、局部刷新(Ajax,Json)"><a href="#五-异步请求、局部刷新(Ajax,Json)" class="headerlink" title="五.异步请求、局部刷新(Ajax,Json)"></a>五.异步请求、局部刷新(Ajax,Json)</h4><hr><p>1.Asynchronous—–JavaScript—and—XML</p><p>两个异构系统之间可以通过XML来传输数据。<br>XML:纯文本数据。</p><hr><p><strong>异步请求</strong>:不中断用户的体验,偷偷的给服务器发请求拿数据。<br><strong>局部刷新</strong>:不刷新整个页面,只是属性一小部分。<br>2.Json写的更加简洁。</p><p>本质就是:通过jQuery对象的getjSon方法发起Ajax请求:</p><p>$。getJSON(点击的URL,(json)=>{<br> 点击url需要执行的函数体<br>})</p><hr><h5 id="六-截流"><a href="#六-截流" class="headerlink" title="六.截流"></a>六.截流</h5><p>不让用户过于频繁的操作页面,给他一个限制的时间的操作,如果过于频繁的点击,那么页面什么都不做,并告诉用户过于频繁。</p><hr><h5 id="七-登陆页面和验证码。"><a href="#七-登陆页面和验证码。" class="headerlink" title="七.登陆页面和验证码。"></a>七.登陆页面和验证码。</h5><p>1.登陆页面判断request.method的类型<br>if request.method==”GET”:<br>这个是请求数据的就渲染登陆页面<br>if request.method==”POST”:<br>这个是提交数据的操作,可以用于写注册的view模型和页面。</p><hr><h5 id="八-用户注册的模型"><a href="#八-用户注册的模型" class="headerlink" title="八.用户注册的模型"></a>八.用户注册的模型</h5><p>(1)model中写相关的类<br>(2)写出相关的注册的属性<br>(3)生成迁移<br>(4)执行迁移<br>(5)在admin中写处要在后台里显示的类,便于在后台中进行管理。<br>(6)注册模型:<br>admin.site.register(写模型的类,admin中写的显示管理此类的类)</p>]]></content>
<summary type="html">
<h4 id="一-request请求"><a href="#一-request请求" class="headerlink" title="一.request请求"></a>一.request请求</h4><hr>
<p>拿请求的方法:request.method()<br>拿请
</summary>
</entry>
<entry>
<title>97-Django-model和后台的管理</title>
<link href="http://mayu123mayu.github.io/2020/01/05/97-Django-model%E5%92%8C%E5%90%8E%E5%8F%B0%E7%9A%84%E7%AE%A1%E7%90%86/"/>
<id>http://mayu123mayu.github.io/2020/01/05/97-Django-model%E5%92%8C%E5%90%8E%E5%8F%B0%E7%9A%84%E7%AE%A1%E7%90%86/</id>
<published>2020-01-05T04:31:52.406Z</published>
<updated>2020-01-05T04:53:00.432Z</updated>
<content type="html"><![CDATA[<figure class="highlight plain"><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><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">#### 一. ORM框架</span><br><span class="line">ORM---可以完成对象到关系模型的双向的转换。可以简化操作,并且自动创建数据库。</span><br><span class="line">#### 二. 在model中创建数据库的类(数据)</span><br><span class="line">1.定义模型类</span><br><span class="line">2.继承父类---models.Model(继承了该父类可以对数据库完成自动的创建)</span><br><span class="line">3.并在这里面再声明一个类</span><br><span class="line">4.声明文件的数据用:models.FilField()</span><br><span class="line">5.声明图片的数据用:models.ImageField(upload_to="上传文件的路径")</span><br><span class="line">*************</span><br><span class="line">class Meta:</span><br><span class="line"> db_table="tb_subject"</span><br><span class="line">(这个类就是告诉程序与我定义的这个模型相关的表格是是哪一张)</span><br><span class="line">*************</span><br><span class="line">4.把模型自动生成表到数据库:</span><br><span class="line"></span><br><span class="line">**注意**:必须先把你的应用的名字加到INSTALLED_APPS=[......"应用名字",]</span><br><span class="line">************</span><br><span class="line">(1).python manage.py makemigrations polls (生成迁移)</span><br><span class="line">(2).python manage.py migrate (执行迁移)</span><br><span class="line"></span><br><span class="line">**注意**:字段最好不要给null,这样会很麻烦,最好的做法是给默认值,默认值是空的字符串 default=" "</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">***********</span><br><span class="line">#### 三.view将数据放入视图函数中。</span><br><span class="line">1.拿到模型对象的数据:</span><br><span class="line">(1)可以通过连接数据库通过游标对象select取到数据。</span><br><span class="line">(2)面向对象拿数据:</span><br><span class="line">objects----模型管理器</span><br><span class="line">模型对象.objects.all()-----通过模型管理器的all方法----可以拿到模型中的所有的数据。</span><br><span class="line">**返回值命名为queryset 这是一个查询集的集合**</span><br><span class="line">*********</span><br><span class="line">模型对象.objects.get("字段")----拿出特定的字段的值</span><br><span class="line">*********</span><br><span class="line">queryset=模型对象.objects.all()</span><br><span class="line">***********</span><br><span class="line">模型对象.objects.filter(字段=要拿的字段).first()</span><br><span class="line">**注意**:</span><br><span class="line">上面的这个filter就相当于判断的条件,如果相等就拿出数据库中的数据,并且返回</span><br><span class="line">一个查询的集合,一个元素是这样写的(字段1,)---然后.first()就取到了这个元素。</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">(3)在通过Django的模板语法for 循环就可以将数据渲染到页面上。(view具体的渲染的方法参考96(上一章))</span><br><span class="line">*************</span><br><span class="line">#### 四.Django系统管理平台</span><br><span class="line">*******************</span><br><span class="line">1.创建超级管理员:</span><br><span class="line">python manage.py createsuperuser</span><br><span class="line">**********</span><br><span class="line">2.要在里面显示自己的模型需要注册自己的模型:</span><br><span class="line">注册的方法:</span><br><span class="line">找到应用下的admin.py进去:</span><br><span class="line">admin.site.register( **模型类**,**对模型后台修改管理的类**)进行模型的注册。</span><br><span class="line">**注意**:如果需要修改模型类在后台显示时的名字需要在模型的相关的类中Meta中写:</span><br><span class="line">verbose_字段名="中文名字"---这个是单数的时候</span><br><span class="line">verbose_字段名_plural="中文名字"---这个是复数的时候</span><br><span class="line">************</span><br><span class="line">3.对后台模型管理的类创建:</span><br><span class="line">class 名字(admin,**ModelAdmin**)</span><br><span class="line">这个类必须继承ModelAdmin的这个类。</span><br><span class="line">在ModelAdmin中有许多的方法,那么继承了它我们创建的这个类就是可以用的。</span><br><span class="line">*************</span><br><span class="line">(1)list_disply=(属性1,属性2)---这个的意思就是在显示这个学科的时候需要显示那些与学科相关的属性。</span><br><span class="line">***************</span><br><span class="line">(2)list_per_page=number--页面显示的最多的数据。</span><br><span class="line">**************</span><br><span class="line">(3)search_fields=("字段",)</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">(4)ordering=("字段名",)---按照什么进行排序。默认是升序的,字段名前面加减号就是降序。</span><br><span class="line"> **注意**:这个后面赋值的必须是元组。只有一个字段的时候后面加逗号。</span><br><span class="line">****************</span><br><span class="line">(5)list_display_links=(字段,)-----这个就是点击字段出现学科的所有的信息</span><br><span class="line"> **注意**:这个后面赋值的必须是元组。只有一个字段的时候后面加逗号。</span><br><span class="line"></span><br><span class="line"> *************</span><br><span class="line">####五.静态的资源</span><br><span class="line"></span><br><span class="line">在项目下新建文件夹-在这下面分类建文件夹。</span><br><span class="line">图片等在项目中创建文件夹然后到</span><br><span class="line">setting里的----------</span><br><span class="line">**设置:**</span><br><span class="line">STATIC_URL="/STATIC/"</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">在Django中加在静态资源需要在前面写:</span><br><span class="line">{% load staticfiles %}</span><br><span class="line">*************</span><br><span class="line">####六.url参数</span><br><span class="line">![url参数.png](https://upload-images.jianshu.io/upload_images/4956968-eed83ff3290d0fbf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)</span><br><span class="line">************ </span><br><span class="line">***********</span><br><span class="line">这个的意思就是请求teachers这个资源的时候 程序回去找 后面对应的这个值的数据。在通过view进行数据的渲染。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">####六.requset请求</span><br><span class="line">1.get请求拿到数据</span><br><span class="line">2.post给服务器发送数据</span><br><span class="line">***************</span><br><span class="line">3.从request.GET("键")从这里面就可以拿到对应的键的值。</span><br><span class="line"></span><br><span class="line">####七.捕获异常</span><br><span class="line">针对url的参数不存在或者错误的时候返回特定的页面,或者自定义其他的样式。</span><br><span class="line"></span><br><span class="line">***********</span><br><span class="line">```python</span><br><span class="line"> try:</span><br><span class="line"> sno = requset.GET["sno"]</span><br><span class="line"> subject = Subject.objects.get(no=sno)</span><br><span class="line"> # Subject.objects.filte(no=sno).first()</span><br><span class="line"> queryset = Twacher.objects.filter(subject__no=sno)</span><br><span class="line"> context = {</span><br><span class="line"> "subject": subject,</span><br><span class="line"> "teachers": queryset,</span><br><span class="line"> }</span><br><span class="line"> return render(requset, "teachers.html", context)</span><br><span class="line"> except (KeyError, ValueError, Subject.DoesNotExist):</span><br><span class="line"> return redirect("/")</span><br></pre></td></tr></table></figure><figure class="highlight plain"><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><br><span class="line">**redirect ---重定向函数。**</span><br><span class="line">return redirect("/") 这句话就是出错就返回网站的根目录。</span><br><span class="line">**************</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class
</summary>
</entry>
<entry>
<title>96-Django数据模版和控制器</title>
<link href="http://mayu123mayu.github.io/2020/01/05/96-Django%E6%95%B0%E6%8D%AE%E6%A8%A1%E7%89%88%E5%92%8C%E6%8E%A7%E5%88%B6%E5%99%A8/"/>
<id>http://mayu123mayu.github.io/2020/01/05/96-Django%E6%95%B0%E6%8D%AE%E6%A8%A1%E7%89%88%E5%92%8C%E6%8E%A7%E5%88%B6%E5%99%A8/</id>
<published>2020-01-05T04:31:52.403Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>###一.项目架构的模式<br>写程序的终极目标:高内聚 低耦合(high cohesion low coupling)</p><p>项目架构模式:MVC架构模式。</p><p>Model View Controller</p><p>—模型 —–视图 —控制器</p><p>数据——数据显示 </p><p><strong>在DjangoMTV架构:</strong><br>Model – Template(模板–就是页面)—-view<br>模型—–模板————视图(扮演了一部分控制器的角色) </p><hr><p>Model还是模型,Template是模板,就相当于视图。view其实不是视图扮演的是控制器的角色。<br>Django本身扮演了一部分控制器的角色。</p><hr><p>核心理念:把模型和视图进行拆分。数据和数据的显示要分离。</p><p>统一组数据可先渲染成不同的形式(数据和显示解耦合)也就是模型和视图要解耦合。</p><p>统一模型可以渲染成不同的视图,同一个视图可以加在不同的模型。</p><p>控制器:负责把数据和视图连接在一起。(Django中的MTV架构)</p><p>###二。创建自己的应用。</p><hr><p>1.一个django下面可以创建一个或多应用,相当于模块。<br>2.创建应用—–python mange.py startapp 应用的名字(英文)<br>3.打开建的这个包下面有许多文件。<br>4.这个包下面有多个文件:<em>init</em>,admin.py,apps.py,models.py,tests.py,view.py等<br>**所有的框架都是由 模板 模型 视图组成的。</p><hr><p>models —模型<br>views——视图(控制器)<br>在建一个文件夹u来放模板也就是页面:<br>(1)在项目上点击右键建设一个文件夹templates 这个文件夹就是模板,把页面就放在这个里面。<br>(2)文件夹建好后:需要在项目中配置建的这个文件夹的路径,否则是找不到这个文件夹的。<br>如何配置:<br>(1)找到配置文件settings.py这个文件<br>(2)再找到TEMPLATES这一项<br>(3)在该字典的”DIRS”后面的[]写上模板文件夹的绝对路径即可。也可以用os模块写 os.path.join(BASE_DIR,”templates”)</p><hr><p><strong>静态资源</strong>:图片等在项目中创建文件夹然后到<br>setting里的———-<br><strong>设置:</strong><br>STATIC_URL=”/STATIC/“</p><p>注意你这个地方是什么名字以后写路径的时候开头就是什么名字和你的文件夹叫什么名字是没有任何关系的。</p><hr><p>5.综上 M,T,V架构就完成了。<br>####三.view.py视图控制器<br>1.Django本身扮演了部分控制器的角色,剩下的控制器的功能要依靠view.py来完成。<br>2.控制器做什么?<br>(1)接受用户的起请求,验证用户的请求。<br>(2)操作模型<br>(3)给用户产生响应(渲染页面)<br>3.在view中写函数—-视图函数。<br><strong>注意</strong>:写的这个函数必须带一个HttpRequest参数—这个参数表示的是用户的请求,所以这个函数必须有一个返回值:<br>返回—-return HttpResponse()这就是给用户一个响应。</p><p>这就创建好了一个视图函数,但是我们的配置当请求哪个资源的时候就会调用这个视图函数。<br><strong>这个时候我们就要配置url</strong>:<br>(1)在项目里—-urls.py的这个模块中。<br>(2)找到urlpatterns这个列表<br>(3)添加path(“资源路径 “,视图函数名字)—-作用把资源路径和视图函数映射起来,这个的作用就是当你请求这个资源路径的时候,我就会调用这个视图函数,并将这个视图函数渲染到页面上给用户一个响应。</p><p>####四.TEMPLATES模板<br>1.模板中写要展示给用户看的东西<br>2.导入from django.shortcuts import render<br>3.在view中写视图函数用render来渲染模板中写好的页面。</p><figure class="highlight python"><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="function"><span class="keyword">def</span> <span class="title">index</span><span class="params">(request: HttpRequest)</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"><span class="keyword">return</span> render(request, <span class="string">"index.html"</span>,context)</span><br></pre></td></tr></table></figure><p>4.render(请求对象,渲染哪个页面,字典)</p><p>####四.通过Django的模板页来生成动态的内容。<br>(1)使用Django的模板语法和模板指令来生成动态的内容。</p><p>这个就是模板语法和模板指令<br>。</p><hr><p><strong>index:</strong></p><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></pre></td><td class="code"><pre><span class="line">{% for fruit in fruits %}</span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span>{{ fruit}}<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> {% endfor %}</span><br></pre></td></tr></table></figure><hr><p><strong>view.py</strong></p><figure class="highlight python"><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="function"><span class="keyword">def</span> <span class="title">index</span><span class="params">(request: HttpRequest)</span>:</span></span><br><span class="line"> fruits=[<span class="string">"苹果"</span>,<span class="string">"香蕉"</span>,<span class="string">"草莓"</span>,<span class="string">"西瓜"</span>,<span class="string">"火龙果"</span>,<span class="string">"橘子"</span>,<span class="string">"山楂"</span>,<span class="string">"榴莲"</span>]</span><br><span class="line"> context={</span><br><span class="line"> <span class="string">"fruits"</span>:sample(fruits,<span class="number">3</span>),</span><br><span class="line"> <span class="string">"greeting"</span>:<span class="string">"你好,相信自己改变世界"</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> render(request, <span class="string">"index.html"</span>,context)</span><br></pre></td></tr></table></figure><hr>]]></content>
<summary type="html">
<p>###一.项目架构的模式<br>写程序的终极目标:高内聚 低耦合(high cohesion low coupling)</p>
<p>项目架构模式:MVC架构模式。</p>
<p>Model View Controller</p>
<p>—模型 —–视图 —控
</summary>
</entry>
<entry>
<title>95-Django的创建和启动</title>
<link href="http://mayu123mayu.github.io/2020/01/05/95-Django%E7%9A%84%E5%88%9B%E5%BB%BA%E5%92%8C%E5%90%AF%E5%8A%A8/"/>
<id>http://mayu123mayu.github.io/2020/01/05/95-Django%E7%9A%84%E5%88%9B%E5%BB%BA%E5%92%8C%E5%90%AF%E5%8A%A8/</id>
<published>2020-01-05T04:31:52.401Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>####一.Django的创建<br>pip install django==2.1.14 -i <a href="https://pypi.doubanio.com/simple/" target="_blank" rel="noopener">https://pypi.doubanio.com/simple/</a></p><p>用pip install -i 加镜像URL。</p><p>创建并运行Django项目~ 第一种方式:</p><ol><li>django-admin startproject django1906</li><li>使用PyCharm打开项目并创建虚拟环境</li><li>安装项目所需依赖项</li><li>运行项目~ python manage.py runserver~ Add Configuration –> + –> Python –> Script Path –> Parameters (runserver)</li></ol><p>~ 第二种方式:</p><ol><li>用PyCharm创建一个普通的Python项目</li><li>安装Django所需的依赖项~ pip install django==2.1.14</li><li>把Python项目变成Django项目~ django-admin startproject django1906 .(这个点就是告诉这个创建在当前的文件下 ,项目后面的有个空格再点)</li><li>运行项目</li></ol><p>~ 第三种方式:</p><ol><li>克隆项目到本地~ 使用PyCharm的”get from version control”~ git clone <a href="mailto:[email protected]">[email protected]</a>:jackfrued/django1906.g</li></ol><h4 id="二django项目的创建。"><a href="#二django项目的创建。" class="headerlink" title="二django项目的创建。"></a>二django项目的创建。</h4><p>创建并运行django</p><p>第一种:</p><p>1.django-admin startproject django1906 .</p><p>2.使用pycharm 打开项目并创建虚拟环境</p><p>3.安装项目所需的依赖项</p><p>4.python manger.py runserver</p><p>第二种:</p><p>pycharm 中 addconfigurations—-> + python—–>在侧边点击你要运行的软件——>运行的命令是:runserver————>点击apply——>ok就行了。</p><h4 id="三-直接在pycharm中创建djiango项目"><a href="#三-直接在pycharm中创建djiango项目" class="headerlink" title="三.直接在pycharm中创建djiango项目"></a>三.直接在pycharm中创建djiango项目</h4><p>1.用pychar创建普通的python项目。</p><p>2.安装Django所需的依赖项。</p><p>3.把python变成Django项目。</p><p>4.Django-admin –version</p><p>5.django-admin startproject django1906 .(这个点一定不要忘了)</p><p>6.运行项目</p><p>####四.直接从服务器克隆项目。</p><p>1.git init———> 将普通的变成仓库</p><p>2.git add——–>将文件提交到本地的暂存区</p><p>3.git commit -m —->将本地提交到仓库</p><p>4.git status/看版本的状态</p><p>5.git log 查看提交的日志</p><p>6.get remote add origin<url> —–>绑定远端仓库</url></p><p>7.git push -u origin master ——–>将本地的推到服务器。</p><p>8.git clone url 从服务器克隆项目到本地。</p><p><strong>在pycharm</strong>中clone项目:</p><p>1.使用pycharm的”get from version contol”—-在欢迎页面创建项目的那里,进去直接输入地址就行了。</p><p>2.pip install -r requirements.txt 安装所需的依赖环境。</p><hr><p>补充知识:</p><p>安装mariaDB:</p><p>alias 给命令起别名 对于长的命令 可以这样。</p><p>unalias 别名 ————取消别名</p>]]></content>
<summary type="html">
<p>####一.Django的创建<br>pip install django==2.1.14 -i <a href="https://pypi.doubanio.com/simple/" target="_blank" rel="noopener">https://py
</summary>
</entry>
<entry>
<title>94-后端入门基础知识</title>
<link href="http://mayu123mayu.github.io/2020/01/05/94-%E5%90%8E%E7%AB%AF%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"/>
<id>http://mayu123mayu.github.io/2020/01/05/94-%E5%90%8E%E7%AB%AF%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/</id>
<published>2020-01-05T04:31:52.398Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>###一.后端入门的知识。</p><ol><li>网络应用的模式:~ C/S - 客户端/服务器模式~ B/S - 浏览器/服务器模式~ P2P - 对等模式</li><li>URL/URI - 统一资源定位符/统一资源标识符</li><li>DNS - 域名服务器(将服务器的域名转换成对应的IP地址)</li><li>反向代理 - 代理用户浏览器向服务器发起请求~ 保护真正的服务器免于直接被攻击~ 配置负载均衡,将流量分摊到多台服务器上</li><li>Web服务器 - 处理静态资源 - Nginx / Apache</li><li>应用服务器 - uWSGI / Gunicorn</li><li>其他服务器~ 缓存服务器 - Redis~ 数据库服务器 - MySQL~ 邮件服务器 - Sendmail~ 文件服务器 - NFS / FastDFS~ 消息队列服务器 - RabbitMQ / Kafka</li><li>HTTP - 超文本传输协议~ HTTP请求报文 请求行 - GET /path/resource HTTP/1.1 请求头 - 键值对 \r\n 消息体 - 发给服务器的数据~ HTTP响应报文 响应行 - HTTP/1.1 200 OK 响应头 - 键值对 \r\n 消息体 - 服务器返回的数据</li></ol><p>CPython - C语言实现的Python解释器Jython - Java实现的Python解释器IronPython - C#实现的Python解释器PyPy - Python实现的Python解释器 - JITAnaconda - 不仅有Python解释器还有诸多三方库</p><p>配置PATH环境变量保证在命令行模式下Python解释器和相关工具在任何路径都能运行</p><p>Web应用 - 基于浏览器来使用的应用程序手机App - 应用中呈现的数据和内容是通过服务端的程序动态生成的用程序动态生成页面内容</p><p>用Python编写服务器端的程序,为Web和手机应用生成动态内容开发效率高 + 生态圈非常繁荣</p><p>Django / Flask / Tornado / Sanic / FastAPI</p>]]></content>
<summary type="html">
<p>###一.后端入门的知识。</p>
<ol>
<li>网络应用的模式:~ C/S - 客户端/服务器模式~ B/S - 浏览器/服务器模式~ P2P - 对等模式</li>
<li>URL/URI - 统一资源定位符/统一资源标识符</li>
<li>DNS - 域名服务器
</summary>
</entry>
<entry>
<title>93-MariaDB安装</title>
<link href="http://mayu123mayu.github.io/2020/01/05/93-MariaDB%E5%AE%89%E8%A3%85/"/>
<id>http://mayu123mayu.github.io/2020/01/05/93-MariaDB%E5%AE%89%E8%A3%85/</id>
<published>2020-01-05T04:31:52.395Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>安装MariaDB:<br>yum install -y mariadb mariadb-server<br>systemctl start mariadb<br>mysql -u root</p>]]></content>
<summary type="html">
<p>安装MariaDB:<br>yum install -y mariadb mariadb-server<br>systemctl start mariadb<br>mysql -u root</p>
</summary>
</entry>
<entry>
<title>92-Nginx的安装</title>
<link href="http://mayu123mayu.github.io/2020/01/05/92-Nginx%E7%9A%84%E5%AE%89%E8%A3%85/"/>
<id>http://mayu123mayu.github.io/2020/01/05/92-Nginx%E7%9A%84%E5%AE%89%E8%A3%85/</id>
<published>2020-01-05T04:31:52.392Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>安装Nginx:<br>yum install -y nginx<br>systemctl start nginx<br>systemctl stop nginx</p>]]></content>
<summary type="html">
<p>安装Nginx:<br>yum install -y nginx<br>systemctl start nginx<br>systemctl stop nginx</p>
</summary>
</entry>
<entry>
<title>91-mysql的安装</title>
<link href="http://mayu123mayu.github.io/2020/01/05/91-mysql%E7%9A%84%E5%AE%89%E8%A3%85/"/>
<id>http://mayu123mayu.github.io/2020/01/05/91-mysql%E7%9A%84%E5%AE%89%E8%A3%85/</id>
<published>2020-01-05T04:31:52.390Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p><strong>安装MySQL</strong>:</p><ol><li>清除掉所有跟mariadb相关的东西<br>yum list installed | grep mariadb | awk ‘{print $1}’ | xargs yum erase -y</li><li>清理之前的数据和日志文件(如果存在)<br>rm -rf /var/lib/mysql<br>rm -f /var/log/mysqld.log</li><li>下载MySQL官方提供的RPM包并解归档<br>wget <a href="https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar" target="_blank" rel="noopener">https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar</a><br>tar -xf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar</li><li>使用rpm包管理工具安装MySQL<br>rpm -ivh mysql-community-common-…rpm<br>rpm -ivh mysql-community-libs-…rpm<br>rpm -ivh mysql-community-client-…rpm<br>rpm -ivh mysql-community-server-…rpm</li><li>启动服务查看随机密码<br>systemctl start mysqld<br>cat /var/log/mysqld.log | grep password</li><li>用客户端工具连接MySQL<br>mysql -u root -p</li><li>修改root用户口令<br>set global validate_password_policy=0;<br>set global validate_password_length=6;<br>alter user ‘root’@’localhost’ identified by ‘123456’;<br>安装Python3</li><li>安装依赖项<br>yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel</li><li>下载Python3源代码<br>wget <a href="https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tar.xz" target="_blank" rel="noopener">https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tar.xz</a></li><li>解压缩和解归档<br>xz -d Python-3.7.6.tar.xz<br>tar -xvf Python-3.7.6.tar</li><li>执行安装前的配置<br>cd Python-3.7.6<br>./configure –prefix=/usr/local/python37 –enable-optimizations</li><li>构建和安装<br>make && make install</li><li>注册环境变量<br>vim ~/.bash_profile</li></ol><p>PATH=$PATH:/usr/local/python37/bin<br>export PATH</p>]]></content>
<summary type="html">
<p><strong>安装MySQL</strong>:</p>
<ol>
<li>清除掉所有跟mariadb相关的东西<br>yum list installed | grep mariadb | awk ‘{print $1}’ | xargs yum erase -y</l
</summary>
</entry>
<entry>
<title>90-pip-安装第三方的软件</title>
<link href="http://mayu123mayu.github.io/2020/01/05/90-pip-%E5%AE%89%E8%A3%85%E7%AC%AC%E4%B8%89%E6%96%B9%E7%9A%84%E8%BD%AF%E4%BB%B6/"/>
<id>http://mayu123mayu.github.io/2020/01/05/90-pip-%E5%AE%89%E8%A3%85%E7%AC%AC%E4%B8%89%E6%96%B9%E7%9A%84%E8%BD%AF%E4%BB%B6/</id>
<published>2020-01-05T04:31:52.387Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>pip install -i <a href="https://pypi.douban.com/simple/" target="_blank" rel="noopener">https://pypi.douban.com/simple/</a></p><ul><li>i 后面可以更换镜像的地址</li></ul>]]></content>
<summary type="html">
<p>pip install -i <a href="https://pypi.douban.com/simple/" target="_blank" rel="noopener">https://pypi.douban.com/simple/</a></p>
<ul>
<l
</summary>
</entry>
<entry>
<title>89-mysql与redis的连接</title>
<link href="http://mayu123mayu.github.io/2020/01/05/89-mysql%E4%B8%8Eredis%E7%9A%84%E8%BF%9E%E6%8E%A5/"/>
<id>http://mayu123mayu.github.io/2020/01/05/89-mysql%E4%B8%8Eredis%E7%9A%84%E8%BF%9E%E6%8E%A5/</id>
<published>2020-01-05T04:31:52.385Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>import pickle<br>import time<br>import pymysql<br>import redis<br>def log_ingin():<br> conn=pymysql.connect(<br> host=”127.0.0.1”,<br> port=3306,<br> password=”361394621”,<br> database=”hrs”,<br> user=”root”,<br> charset=”utf8”<br> )<br> depts=()<br> try:<br> with conn.cursor() as cursor:<br> cursor.execute(“select dno,dname,dloc from tb_dept”)<br> depts=cursor.fetchall()<br> except pymysql.MySQLError as err:<br> print(err)<br> finally:<br> conn.close()<br> return depts</p><p>def main():<br> client=redis.Redis(host=”118.31.5.162”,port=6379, password=”361394621tmy”)<br> start=time.time()<br> data=client.get(“depts”)<br> if data:<br> depts=pickle.loads(data)<br> else:<br> depts=log_ingin()<br> client.set(“depts”,pickle.dumps(depts))<br> end=time.time()<br> print(depts)<br> print(f”执行时间:{end-start}秒”)</p><p>if <strong>name</strong> == ‘<strong>main</strong>‘:<br> main()</p>]]></content>
<summary type="html">
<p>import pickle<br>import time<br>import pymysql<br>import redis<br>def log_ingin():<br> conn=pymysql.connect(<br> host=”127.0.0.
</summary>
</entry>
<entry>
<title>88-redis数据和mysql数据缓存机制。</title>
<link href="http://mayu123mayu.github.io/2020/01/05/88-redis%E6%95%B0%E6%8D%AE%E5%92%8Cmysql%E6%95%B0%E6%8D%AE%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6%E3%80%82/"/>
<id>http://mayu123mayu.github.io/2020/01/05/88-redis%E6%95%B0%E6%8D%AE%E5%92%8Cmysql%E6%95%B0%E6%8D%AE%E7%BC%93%E5%AD%98%E6%9C%BA%E5%88%B6%E3%80%82/</id>
<published>2020-01-05T04:31:52.382Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p><strong>一.redis数据的特点和优势。</strong><br>Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。</p><p>Redis 与其他 key - value 缓存产品有以下三个特点:</p><p>Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。<br>Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。<br>Redis支持数据的备份,即master-slave模式的数据备份。<br><strong>二redis 优势</strong><br>性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。<br>丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。<br>原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。<br>丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。<br><strong>三</strong>.与其他key-value存储的不同<br>Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。</p><p>Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。<br>(以上文字取自菜鸟教程,只供自己观看。)<br><strong>一.mysql</strong>数据的基础</p><p><strong>(一)DML数据操作语言</strong></p><p><strong>1</strong>.创建数据库。</p><p>create database if not exists 数据库名字 default charset utf8</p><p><strong>2</strong>.切换使用数据库</p><p>use 数据库 切换到指定的数据库。</p><p><strong>3</strong>.新建表</p><p>create table if not exists 表名(字段1 类型1 约束1,字段2 类型2 约束2…….)</p><p>其中注意的是每个表都是要有主键的 primary key 。auto_increment自动增加只针对主键有效,并且主键的类型是整型。</p><p><strong>4.</strong>删除表</p><p>drop table if exists 表名</p><p>清空表中的数据:truncate table 表名</p><p><strong>5.</strong>修改表(增加新字段)</p><p> alter table 表名 add column 字段名 字段类型 约束</p><p><strong>6.</strong>删除字段</p><p> alter table 表名 drop column 字段名</p><p><strong>7.</strong>修改字段</p><p>alter table 表名 modify 字段名 字段类型 约束 (不重命名)</p><p>alter table 表名 change 原字段名 新字段名 字段类型 约束(重命名)</p><p><strong>(二)DML数据操作语言</strong></p><p><strong>1</strong>.增</p><p> insert into 表名 values(值1, 值2, 值3,….) - 依次给指定表中的字段赋值</p><p>insert into 表名(字段名1,字段名2,…) values(值1, 值2,…) -以指定的顺序给指定的字段赋值</p><p><strong>2</strong>.删</p><p>delete from t_student 删除表中所有的记录</p><p>delete from 表名 where 条件语句 - 删除满足条件的记录</p><p><strong>3.</strong>改</p><p>update 表名 set 字段1=新值1, 字段2=新值2,… where 条件语句 -将表中满足条件的行中指定字段的值赋值为新值</p><p>$\color{red}{通配符%可以匹配任意个数的字符包括0个}$</p><p>UPDATE t_student set birth=’2000-01-01’ WHERE stuname LIKE ‘小%’; – 修改stuname是以’小’开头的行对应的birth的值</p><hr><p><strong>4.</strong>查(重点)<br>$\color{yellow}{查在我们平时的应用中用的十分的广泛}$</p><p>select from 表名 —->获取表中的所有的数据。</p><p>selcet 字段名1,字段名2 from 表名</p><p>selcet 字段1, 字段2 from 表名 where 条件</p><p><strong>5.</strong>对字段重命名</p><p>select 字段1 as 新字段1, 字段2 as 新字段2,… from 表名</p><p><strong>6.</strong>对查询结果重新赋值</p><p>select if(字段名,值1,值2) from 表名; -查询指定字段,并且判断字段对应的值是0还是1,如果是1结果为值1,否则为值2。</p><hr><p><strong>7.</strong>对列进行合并</p><p>select concat(字段1,字段2,…) from 表名</p><p>$\color{red}{注意:数字和字符窜数据可以合并,bit类型的数据是不可以合并的}$</p><p><strong>8.</strong>模糊查询</p><p>SELECT * FROM t_student WHERE stuname like ‘%飞%’ or not stuid < 110</p><p>查询的时候时候通过like条件来指定查询对象</p><hr><p><strong>9.</strong>排序</p><p>select * from 表名 order by 字段 asc; - 对查询结果按照指定字段的值进行升序排序</p><p>select * from 表名 order by 字段 desc; - 对查询结果按照指定字段的值进行降序排序</p><p><strong>10.</strong>去重</p><p>select distinct 字段名 FROM 表名</p><p><strong>11.</strong>限制和分页</p><p>限制: SELECT * FROM 表名 limit N; - 查询的时候只获取前N条数据</p><p>偏移: SELECT * FROM 表名 limit M offset N; - 跳过前N条数据获取M条数据(从第N+1条数据开始,获取M条数据)</p><p>SELECT * FROM 表名 limit M,N - 跳过前M条数据取N条数据</p><p><strong>12.</strong>聚合<br>$\color{red}{max(),min(),sum(),avg(),count()}$</p><p>select max(score) as max_score FROM tb_record; – 获取tb_record中最高分</p><p><strong>13.</strong>分组</p><p>select 聚合操作 from 表名 group by (字段); - 按指定字段的值对表进行分组,然后对每个分组进行聚合操作。<br>注意: 分组后,除了分组字段以外,其他字段只能聚合操作</p><p>$\color{red}{在分组后如果加条件需要用having代替where}$</p><p><strong>14.</strong>子查询</p><p>$\color{red}{将一个的结果作为另一个查询条件或者查询对象。}$</p><p><em>第一种子查询:</em></p><p><em>将查询结果作为另一个查询的条件</em></p><p>获取成绩是最高分的所有的学生的id<br>select max(score) as max_s from tb_record;<br>select sid from tb_record where score=(select max(score) as max_s from tb_record)</p><p>第二种查询:</p><p>$\color{red}{将一个的结果作为另一个查询的对象。}$</p><p>注意: 如果要将查询结果作为查询对象,那么查询结果对应的查询必须重命名</p><p>select * from tb_student limit 4,5;<br>select stuname from (select * from tb_student limit 4,5) as t1;</p><p>– select stuname as sname, stuaddr as saddr from tb_student WHERE stusex=0;<br>select sname,saddr from (select stuname as sname, stuaddr as saddr from tb_student WHERE stusex=0) as t1 where saddr like ‘%成都’ 。</p><p><strong>15.</strong>连表查询(内连接)</p><p>(1) select * from 表名1,表名2,表名3 连接条件 查询条件</p><p> 注意: 如果既有连接条件又有查询条件,查询条件必须放在连接条件的后面</p><p>(2)SELECT * FROM 表1 inner join 表2 on 表2的连接条件 inner join 表3 on 表3的连接条件</p><p><strong>16.</strong>外连接</p><p>外连接分为左外连接、右外连接和全连接, 但是在MySQL中支持左外连接和右外连接<br>表1(左表) left/right/inner join 表2(右表)<br>左外连接:将左表中对应字段的所有数据取出,然后再对应的右表中字段的值,如果右表对应的值不存在结果就为null<br>右外连接:将右表中对应字段的所有数据取出,然后再对应的左表中字段的值,如果左表对应的值不存在结果就为null</p><hr><p><strong>(三)</strong>DCL</p><p><strong>1.</strong>创建用户<br>create user 用户名@登录地址<br>登录地址: (限制用户能够登录MySQL的主机地址), ip地址(指定地址), localhost(数据库本机), %(任何位置)<br>CREATE USER ‘zhangshan’@’%’ IDENTIFIED BY ‘yuting123456</p><p>删除用户: drop user 用户名<br>DROP USER ‘zhangshan</p><hr><p><strong>2.</strong>授权</p><p>grant 权限类型 on 数据库.对象 to 用户名;<br>GRANT SELECT on school.tb_student TO ‘zhangshan’;<br>GRANT UPDATE on school.tb_student TO ‘zhangshan’;<br>GRANT all PRIVILEGES ON school.* TO ‘zhangshan’; – 添加所有权限<br>GRANT all PRIVILEGES ON school.* TO ‘zhangshan’ WITH GRANT OPTION; – 添加所有权限,并且能够将自己的权限再授权给其他用户</p><hr><p><strong>3.</strong>召回授权<br>REVOKE 权限类型 on 数据库.对象 from 用户名<br>REVOKE DELETE on school.* FROM ‘zhangshan<br>REVOKE all PRIVILEGES on school.* FROM ‘zhangshan<br>REVOKE all PRIVILEGES on school.* FROM ‘zhangshan<br>REVOKE SELECT on school.tb_student FROM ‘zhangshan<br>REVOKE UPDATE on school.tb_student FROM ‘zhangshan</p><hr><p><strong>4.</strong>事务<br>完成一个任务需要执行多条sql,但是要求这多个操作中只要有一个操作失败,这个任务就失败,数据全部还原;所有的操作都成功,整个任务才成功的时候就使用事务</p><p>开启事务环境<br>BEGIN;<br>UPDATE tb_student set stuname=’444’ WHERE stuname=’222<br>UPDATE tb_student set birth2=’1990-1-1’ WHERE stuname=’222’<br>提交事务(只有begin到commit之间的所有的sql都执行成功,才会执行commit; 否则执行rollback)<br>COMMIT<br>事务回滚(放弃beigin到commit之间执行成功的所有sql语句的结果)<br>ROLLBACK</p><hr><p><strong>(四)</strong>mysql连接的操作</p><p><strong>1.</strong>连接数据库</p><p>连接对象 = pymysql.connect(host,port,user,password) - 和指定mysql建立连接并且返回一个连接对象</p><p>说明:<br>host - mysql主机地址(localhost表示当前设备上的mysql, 服务器公网ip)<br>port - mysql服务端口, 3306<br>user - mysql用户<br>password - 用户对应的密码(如果创建用户的时候没有设置密码,这个参数可以不用赋值)<br>database - 建立连接后默认操作的数据库<br>charset - 设置连接的数据库文件的编码方式<br>autocommit - 是否自动提交<br>“””<br>con = pymysql.connect(<br>host=’localhost’,<br>port=3306,<br>user=’root’,<br>password=’yuting123456’,<br>database=’school’,<br>charset=’utf8’,<br>autocommit=True<br>)</p><hr><p><strong>2.通过连接获取游标对象</strong></p><p>with 连接对象.cursor(查询返回值类型=None) as 游标对象:<br>数据库操作上下文</p><p>说明:<br>查询返回值类型 - None: 查询结果以元组的形式返回;<br>pymysql.cursors.DictCursor: 查询结果以字典的形式返回<br>数据库操作上下文 - 游标对象(数据库操作)只有在数据库操作上下文才有效<br>with con.cursor() as cursor:<br>数据库操作上下文<br>执行sql语句: 游标对象.execute(sql语句)<br>cursor.execute(‘create database if not exists pyschool;’)</p><hr><p><strong>3.关闭连接</strong></p><p>con.close()<br><strong>(五)</strong>.mysql与redis做缓存的代码</p><pre><code class="python"><span class="keyword">import</span> pickle<span class="keyword">import</span> time<span class="keyword">import</span> pymysql<span class="keyword">import</span> redis<span class="function"><span class="keyword">def</span> <span class="title">load_depts_from_db</span><span class="params">()</span>:</span> conn = pymysql.connect(host=<span class="string">'120.77.222.217'</span>, port=<span class="number">3306</span>, user=<span class="string">'root'</span>, password=<span class="string">'123456'</span>, database=<span class="string">'hrs'</span>, charset=<span class="string">'utf8'</span>) depts = () <span class="keyword">try</span>: <span class="keyword">with</span> conn.cursor() <span class="keyword">as</span> cursor: cursor.execute(<span class="string">'select dno, dname, dloc from tb_dept'</span>) depts = cursor.fetchall() <span class="keyword">except</span> pymysql.MySQLError <span class="keyword">as</span> err: print(err) <span class="keyword">finally</span>: conn.close() <span class="keyword">return</span> depts<span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">()</span>:</span> client = redis.Redis(host=<span class="string">'120.77.222.217'</span>, port=<span class="number">6379</span>, password=<span class="string">'1qaz2wsx'</span>) start = time.time() data = client.get(<span class="string">'depts'</span>) <span class="keyword">if</span> data: depts = pickle.loads(data) <span class="keyword">else</span>: depts = load_depts_from_db() client.set(<span class="string">'depts'</span>, pickle.dumps(depts)) end = time.time() print(depts) print(<span class="string">f'执行时间: <span class="subst">{end - start}</span>秒'</span>)<span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>: main()</code></pre>]]></content>
<summary type="html">
<p><strong>一.redis数据的特点和优势。</strong><br>Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。</p>
<p>Redis 与其他 key - value 缓存产品有以下三个特点:</p>
<p>Redis支持
</summary>
</entry>
<entry>
<title>87-redis基础整理</title>
<link href="http://mayu123mayu.github.io/2020/01/05/87-redis%E5%9F%BA%E7%A1%80%E6%95%B4%E7%90%86/"/>
<id>http://mayu123mayu.github.io/2020/01/05/87-redis%E5%9F%BA%E7%A1%80%E6%95%B4%E7%90%86/</id>
<published>2020-01-05T04:31:52.380Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p><strong>一Redis数据类型和方法。</strong></p><p><strong>1.字符串</strong><br>set key value —>添加键值对<br>get key —-> 通过key拿到值<br>strlen key —->获取字符串的长度</p><p>append key value2 —->给字符串追加内容<br>mset key1 value1 key2 value2 —>添加多键值对。<br>incr key —>value对应的值是数字让它的值加1</p><p>incrby key value —->value对应的值是数字让他的值加上任意的数字</p><p>decr key —->value是数字,值减1</p><p>decrby key value —->value是数字。值加上任意的数量</p><p>getrange key start end —->获取字符串指定范围的子串<br>setrange key offset value —->修改字符串指定位置的内容。其中 offset 是要修改的位置下标,从这个下标开始, value是你要修改的新的值</p><a id="more"></a><p><strong>2.哈希表</strong></p><p>哈希对象:就是一个key里面存多个key和value的键值对。<br>hset key field value —->添加hash类型的键值对<br><img src="https://upload-images.jianshu.io/upload_images/4956968-ef38549a1b24ffbe.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="hmset.png"></p><p><img src="https://upload-images.jianshu.io/upload_images/4956968-f9fcd23f89a7d68f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="hget2.png"></p><p>hget key field—-> 获取指定的key的键值对中的键的值。<br>hgetall 一次 获取多个。<br><img src="https://upload-images.jianshu.io/upload_images/4956968-1e9e5eecfd258d61.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="hgetall.png"></p><p>hkeys —–>获取所有的键<br>hvals —–>获取所有的值.<br>hexists —–>判断一个键的某个字段是否存在。<br>exists——–>判断指定的键知否存在。<br><strong>3.列表</strong><br>lpush ————->放在左边<br>rpush————–>放在后边<br>lpop—————->从左边取出<br>rpop————–>从右边取出<br>llen—————–>查看一共有多少个元素。<br>lrange————->查看指定范围的下标的元素,但是这个和python中的列表的区在于,python中是取头不取尾,而这个是取的到尾部的。<br>lindex key n ———–>查看指定的下标对应的元素的值。<br>lrem key count value ———–删除列表中指定个数的指定的值。<br>lrem list1 1 20 —————–>从列表1中删除1个20<br><strong>4.集合</strong><br>sadd key value1 value2 value3 ———–>添加多个值<br>srem key value ———————————->删除指定的值<br>smembers key ———————————–>查看所有的元素<br>sinter key1 key2 ———————————->交集<br>suntion key1 key2———————————> 并集<br>sdiff key1 key2 ————————————–>差集<br>scard —————————————————->查看集合中元素的个数<br>spop——————————————————->随机获取集合中的数<br>sismember key valu———————————>查看集合中是否存在指定的元素。<br><strong>5.有序集合(zset)</strong><br>zadd key1 value1,value2—————>建有序的集合<br>zadd zset 1 xiaowang 2 xiaoming 3 xiaoli<br>(上面这种可以指定某一个集合中某个key的值,然后进行排序。)<br>zrem key member—————————-> 删除<br>zrange key start stop ———————–>升序排列<br>zreverange————————————–>降序排列<br>zcard———————————————->查看元素的个数<br>zscore key value —————————–>查看指定的value的值、<br>zincrby key value menber —————->修改元素的score值<br><strong>6.LBS—Location Based Service -基于位置的服务。</strong></p><p>这个知识点属于额外的内容,如果想要了解,请访问网站<a href="http://redisdoc.com/geo/geopos.html" target="_blank" rel="noopener">redis</a>了解更多的知识点。<br><strong>用python连接redis.</strong><br><strong>1.导入redis</strong><br><strong>2.连接</strong></p><figure class="highlight python"><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">client = redis.Redis(host=<span class="string">'120.77.222.217'</span>, port=<span class="number">6379</span>,</span><br><span class="line"> password=<span class="string">'1qaz2wsx'</span>)</span><br></pre></td></tr></table></figure><p><strong>3.用redis的相关方法进行操作。</strong></p><figure class="highlight plain"><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><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><strong>一Redis数据类型和方法。</strong></p>
<p><strong>1.字符串</strong><br>set key value —&gt;添加键值对<br>get key —-&gt; 通过key拿到值<br>strlen key —-&gt;获取字符串的长度</p>
<p>append key value2 —-&gt;给字符串追加内容<br>mset key1 value1 key2 value2 —&gt;添加多键值对。<br>incr key —&gt;value对应的值是数字让它的值加1</p>
<p>incrby key value —-&gt;value对应的值是数字让他的值加上任意的数字</p>
<p>decr key —-&gt;value是数字,值减1</p>
<p>decrby key value —-&gt;value是数字。值加上任意的数量</p>
<p>getrange key start end —-&gt;获取字符串指定范围的子串<br>setrange key offset value —-&gt;修改字符串指定位置的内容。其中 offset 是要修改的位置下标,从这个下标开始, value是你要修改的新的值</p>
</summary>
</entry>
<entry>
<title>86-数据库redis基础。</title>
<link href="http://mayu123mayu.github.io/2020/01/05/86-%E6%95%B0%E6%8D%AE%E5%BA%93redis%E5%9F%BA%E7%A1%80%E3%80%82/"/>
<id>http://mayu123mayu.github.io/2020/01/05/86-%E6%95%B0%E6%8D%AE%E5%BA%93redis%E5%9F%BA%E7%A1%80%E3%80%82/</id>
<published>2020-01-05T04:31:52.377Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>1.程序员的最大的答疑网站。stackoverflow.<br>2.youtube全国最大的视频学习网站。<br>3.入门的视频加crash course,(高级视频best practices)<br>4.安装git:<br>wget 网站地址<br>xz -d 文件<br>tar -xf 解归档<br>redis-cli –version 看redis 的版本。<br>缓存:<br>redis 架设缓存系统,缓解数据库的访问的压力。<br>1.命令后加&表示将命令放后天运行。<br>2.jobs 可以查看后台运行的命令。<br>3.fg %编号 可以把后台命令拿到前台来运行。<br>4.ctrl +z 将前台命令暂停<br>5.bg %编号 将暂停的命令在后台运行。<br>6.redis-server>> /home/redis.log & 输出日志定向 并且放在后台。<br>7.netstat -ntlp 查看网络端口。<br>8.redis-cli -p改端口 -a 密码 -h 端口号(连别人)。<br>9.3306,6379,不能向公网开放这个两个端口。<br>auth 密码<br>-1 永不过期<br>keys <em>看所有的键。<br>set 创建键<br>netstat-ntlp->查看网络端口命令&->将命令放到后台运行<br>jobs->查看后台运行的程序<br>fg%编号->将后台运行的程序调到前台运行Ctrl+Z->将前台命令暂停放到后台bg%编号->将暂停的命令在后台运行<br>redis-server–requirepass密码->为redis服务器设置密码<br>redis-cli->连接redis服务器(默认6379端口),设置过密码则输入密码<br>auth 密码-〉输入密码<br>redis-cli-p端口->指定端口连接redis-cli-h IP->连接其他主机33066379不能随便开放<br>一。redis 支持五种数据类型。<br>string,hash(哈希),list(列表),set(集合),(zset有序集合)<br>1.在同一台服务器上可以起多个redis,把端口改了就可以了。<br>2.redis-server –requirepass 361394621tmy –port 6379 >>redis.log &<br>3.redis-cli<br>4.ping 有pong就行<br>5.auth 密码<br>6.在ping 有pong 就连上了。<br>7.shutdown 默认是no save –想要保存就shutdown save<br>8.要保存直接save.<br>9.bgsave –后台保存。<br>10.select 数字 切换到指定的数据库。<br>11.flushdb 回车 再敲keys</em><br>12.flushall 删除所有数据库的数据。<br>二。redis的五种核心的数据的类型。<br>(1).字符串:<br>set key value<br>get key<br>strlen –查看长度<br>append key value2 在后面增加新的字符。<br>mset 一次放多组键值对。<br>mget 一次取到多组值。<br>incr 如果对应的值是数字<br>就会加1<br>incrby 加指定的数字<br>decrby key value 减少指定的数字。<br>getrange key 范围 取字符串的一部分,可以取到尾部。<br>setrange key – N 更改字符串N开始的后面部分。<br>(2)哈希<br>hset key field value<br>hget key field</p><p>hmset 一次设置多个<br>hgetalkl 一次获取多个。<br>hkey 获取所有的键<br>hvalues 获取所有的值<br>hexists 判断一个键的某个字段是否存在、<br>exists –判断指定的键是否存在。<br>哈希对象就是,一个key里面存多个key和value.<br>(3)列表<br>lpush ,rpush—-放在左边和右边<br>lpop,rpop–从左边取出,右边取出</p><p>llen–有一共多个元素。<br>lrange —查看<br>lindex key n 查看指定下标对应的元素。<br>lrem key count value<br>lrem list1 1 20 从列表1中删除1个20</p><p>(4)集合<br>sadd key value1 value2 value3 添加值<br>srem key value 删除<br>smembers key 查看所有的元素<br>sinter key1 key2 交集<br>sunion key1 key2 并集<br>sdiff key1 key2 差集<br>scard 查看集合中元素的个数。<br>spop —获取随机元素的方法。<br>sismember key values 查看集合中是否有指定的元素。<br>(5)有序集合。zset<br>zadd key1 value1,valu2… 建集合。<br>zadd zset1 0 name1 2 name2 3 name<br>zrem key mem 删除<br> zrange 升序<br>zrevrage 降序<br>zcard 查看元素个数<br>zscore key values –查看指定的 values 的值。<br>zincrby key value mem —修改元素的score 值。<br>(6)LBS –Location Based Service -基于位置的服务。<br> geoadd 地点1 经度1 纬度1 地点2 经度2 纬度2<br>geodist key values1 values2 单位 —–计算两点之间的距离。<br>georadius<br>补充:开启关闭服务都是用systemctl start/stop 程序<br>Linux系统启停服务<br>~启动:systemctl start nginx<br>~停止:systemctl stop nginx<br>~重启:systemct1 restart nginx<br>~查看状态:systemctl status nginx<br>~开机自启:systemctl enable nginx<br>~禁用自启:systemctl disable nginx.<br>版本6和ubantu service nginx start /stop。<br>pkill 强制杀进程。</p><p>==============================老师笔记需要自己整理====================<br>Redis的核心数据类型:</p><ol><li>字符串<br> set key value —> 添加键值对<br> get key —> 通过键查看值<br> strlen key —> 获取字符串长度<br> append key value2 —> 给字符串追加内容<br> mset key1 value1 key2 value2 —> 添加多组键值对<br> mget key1 key2 —> 查看多个键对应的值<br> incr key —> 值加1<br> incrby key value —> 值加上value<br> decr key —> 值减1<br> decrby key value —> 值减去value<br> getrange key start end —> 获取字符串指定范围的子串<br> setrange key offset value —> 修改字符串指定位置的内容</li><li>哈希(表) - hash<br> hset key field value —> 添加hash类型键值对<br> hmset key field1 value1 field2 value2 —> 添加多组hash类型键值对<br> hget key field —> 获取hash类型字段对应的值<br> hmget key field1 field2 —> 获取hash类型多个字段对应的值<br> hgetall key —> 获取hash类型所有的字段和对应的值<br> hkeys key —> 获取hash类型所有的字段<br> hvals key —> 获取hash类型所有字段的值<br> hexists key field —> 判断hash类型某个字段是否存在</li><li>列表 - list<br> lpush key value1 value2 value3 —> 在左边添加元素<br> rpush key value1 value2 value3 —> 在右边添加元素<br> lpop key —> 从左边移除一个元素<br> rpop key —> 从右边移除一个元素<br> lrange key start end —> 查看列表指定范围的元素<br> llen key —> 查看列表元素个数<br> lindex key index —> 查看列表指定位置元素<br> lrem key count value —> 删除列表中指定元素</li><li>集合 - set<br> sadd key value1 value2 value3 —> 添加元素<br> srem key value —> 删除元素<br> spop —> 获取随机元素<br> scard key —> 查看元素个数<br> smembers key —> 查看所有元素<br> sismember key value —> 查看集合中有没有指定元素<br> sinter key1 key2 —> 交集<br> sunion key1 key2 —> 并集<br> sdiff key1 key2 —> 差集</li><li>有序集合 - zset<br> zadd key score1 mem1 score2 mem2 —> 添加元素<br> zrem key mem —> 删除元素<br> zrange key start end —> 按score的升序查看元素<br> zrevrange key start end —> 按score的降序查看元素<br> zscore key mem —> 查看元素对应的score<br> zincrby key value mem —> 修改元素的score值</li></ol><p>LBS应用 - Location-Based Service - 基于位置的服务</p><p>Linux系统启停服务<br> ~ 启动:systemctl start nginx<br> service nginx start<br> ~ 停止:systemctl stop nginx<br> service nginx stop<br> ~ 重启:systemctl restart nginx<br> ~ 查看状态:systemctl status nginx<br> ~ 开机自启:systemctl enable nginx<br> ~ 禁用自启:systemctl disable nginx<br>补充:<br>venv 环境变量就用这个命名。<br>找三方库pypi.org网站。</p><p><img src="https://upload-images.jianshu.io/upload_images/4956968-c6d1b158cf6eb36a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="控制台命令安装虚拟环境.png"></p><p>其中第一个venv 是模块 ,第二个是虚拟环境的名字。<br> pip freeze > requirements.txt<br>这个是将我的项目所有装的包输出成文件,供他人重建依赖项。<br><img src="https://upload-images.jianshu.io/upload_images/4956968-b60ee9189bf32f99.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="装依赖项.png"></p><p>隐藏文件 :名字 .gitignore</p>]]></content>
<summary type="html">
<p>1.程序员的最大的答疑网站。stackoverflow.<br>2.youtube全国最大的视频学习网站。<br>3.入门的视频加crash course,(高级视频best practices)<br>4.安装git:<br>wget 网站地址<br>xz -d 文件<b
</summary>
</entry>
<entry>
<title>85-mysql数据库的使用例子</title>
<link href="http://mayu123mayu.github.io/2020/01/05/85-mysql%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A8%E4%BE%8B%E5%AD%90/"/>
<id>http://mayu123mayu.github.io/2020/01/05/85-mysql%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A8%E4%BE%8B%E5%AD%90/</id>
<published>2020-01-05T04:31:52.375Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>import pymysql</p><p>def query_table(connect):<br> # 注意: 执行查询的sql语句,查询结果保存在游标对象中的<br> # 游标对象.fetchall()<br> sql_str = ‘select * from tb_student;’<br> with connect.cursor(pymysql.cursors.DictCursor) as cursor:<br> result = cursor.execute(sql_str)<br> print(result, cursor)</p><pre><code># 注意: cursor中的查询结果,取一个就少一个# 1. 游标对象.fetchall() - 获取当前查询的所有的结果# all_result = cursor.fetchall()# print('查询结果的个数:', len(all_result))# for dic in all_result:# print(dic['stuname'])## all_result2 = cursor.fetchall()# print(all_result2)# 2. 游标对象.fetchone() - 获取当前查询中一条数据print(cursor.fetchone())print(cursor.fetchone())# 3. 游标对象.fetchmany(size) -- 获取当前查询中指定条数的数据print(cursor.fetchmany(2))</code></pre><p>def operate_table(connect):<br> “””增删改”””<br> # 1.增<br> # sql_str = ‘’’<br> # insert into tb_student<br> # (stuname, stusex, stuage, setutel)<br> # values<br> # (‘张三’, 1, 30, ‘17823736452’),<br> # (‘stu1’, 0, 28, ‘16728729739’);<br> # ‘’’<br> print(‘=========插入学生==========’)<br> sql_str = ‘insert into tb_student (stuname, stusex, stuage, setutel) values %s;’<br> str2 = ‘’<br> while True:<br> name = input(‘请输入名字:’)<br> sex = int(input(‘请输入性别(0/1):’))<br> age = int(input(‘请输入年龄:’))<br> tel = input(‘请输入电话号码:’)<br> value = input(‘是否继续添加(y/n):’)<br> str2 += “(‘%s’, %d, %d, ‘%s’),” % (name, sex, age, tel)</p><pre><code> if value == 'n': print(str2[:-1]) sql_str = sql_str % str2[:-1] print(sql_str) breakwith connect.cursor() as cursor: cursor.execute(sql_str)</code></pre><p>def create_table(connect):<br> “””创建表”””<br> with connect.cursor() as cursor:<br> # 1.=========创建学生表=========<br> try:<br> sql_str = ‘’’<br> create table tb_student<br> (<br> stuid int auto_increment,<br> stuname varchar(10) not null,<br> stuage int,<br> stusex bit default 1,<br> setutel varchar(11),<br> primary key (stuid)<br> );<br> ‘’’<br> cursor.execute(sql_str)<br> except:<br> pass</p><pre><code># 自定制表# table_name = input('表名:')# pre = table_name[:3]# cnames = []# while True:# cname = input('请输入字段名(q-退出):')# if cname == 'q':# break# cnames.append(pre+cname+' text,')## str1 = '''# create table if not exists tb_%s# (# %sid int auto_increment,# %s# primary key (%sid)# );# '''## sql_str = str1 % (# table_name,# table_name[:3],# ' '.join(cnames),# table_name[: 3]# )# print(sql_str)# cursor.execute(sql_str)</code></pre><p>def main():<br> # 1.建立连接<br> con = pymysql.connect(<br> host=’localhost’,<br> user=’root’,<br> password=’yuting123456’,<br> port=3306,<br> charset=’utf8’,<br> autocommit=True<br> )</p><pre><code># 2.切换数据库with con.cursor() as cursor: cursor.execute('use pyschool;')# 3.创建表create_table(con)# 4.操作表# operate_table(con)# 5.查询数据query_table(con)</code></pre><p>if <strong>name</strong> == ‘<strong>main</strong>‘:<br> main()</p>]]></content>
<summary type="html">
<p>import pymysql</p>
<p>def query_table(connect):<br> # 注意: 执行查询的sql语句,查询结果保存在游标对象中的<br> # 游标对象.fetchall()<br> sql_str = ‘select *
</summary>
</entry>
<entry>
<title>84-mysql数据库的基本使用</title>
<link href="http://mayu123mayu.github.io/2020/01/05/84-mysql%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/"/>
<id>http://mayu123mayu.github.io/2020/01/05/84-mysql%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8/</id>
<published>2020-01-05T04:31:52.372Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>import pymysql</p><h1 id="1-和mysql建立连接"><a href="#1-和mysql建立连接" class="headerlink" title="1.和mysql建立连接"></a>1.和mysql建立连接</h1><p>“””<br>连接对象 = pymysql.connect(host,port,user,password) - 和指定mysql建立连接并且返回一个连接对象</p><p>说明:<br> host - mysql主机地址(localhost表示当前设备上的mysql, 服务器公网ip)<br> port - mysql服务端口, 3306<br> user - mysql用户<br> password - 用户对应的密码(如果创建用户的时候没有设置密码,这个参数可以不用赋值)<br> database - 建立连接后默认操作的数据库<br> charset - 设置连接的数据库文件的编码方式<br> autocommit - 是否自动提交<br>“””<br>con = pymysql.connect(<br> host=’localhost’,<br> port=3306,<br> user=’root’,<br> password=’yuting123456’,<br> database=’school’,<br> charset=’utf8’,<br> autocommit=True<br>)</p><h1 id="2-通过连接获取游标对象"><a href="#2-通过连接获取游标对象" class="headerlink" title="2.通过连接获取游标对象"></a>2.通过连接获取游标对象</h1><p>“””<br>with 连接对象.cursor(查询返回值类型=None) as 游标对象:<br> 数据库操作上下文</p><p>说明:<br> 查询返回值类型 - None: 查询结果以元组的形式返回;<br> pymysql.cursors.DictCursor: 查询结果以字典的形式返回<br> 数据库操作上下文 - 游标对象(数据库操作)只有在数据库操作上下文才有效<br>“””<br>with con.cursor() as cursor:<br> # 数据库操作上下文<br> # 3.执行sql语句: 游标对象.execute(sql语句)<br> cursor.execute(‘create database if not exists pyschool;’)</p><h1 id="关闭连接"><a href="#关闭连接" class="headerlink" title="关闭连接"></a>关闭连接</h1><p>con.close()<br>补充:<br>在云服务器上启动mysql的命令。<br>systemctl start mysqld 启动程序<br>mysql -u root -p 启动mysql的登陆的程序</p>]]></content>
<summary type="html">
<p>import pymysql</p>
<h1 id="1-和mysql建立连接"><a href="#1-和mysql建立连接" class="headerlink" title="1.和mysql建立连接"></a>1.和mysql建立连接</h1><p>“””<br>连
</summary>
</entry>
<entry>
<title>83-数据库的使用3</title>
<link href="http://mayu123mayu.github.io/2020/01/05/83-%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A83/"/>
<id>http://mayu123mayu.github.io/2020/01/05/83-%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A83/</id>
<published>2020-01-05T04:31:52.370Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>– =================================连接查询=======================================<br>– 1.接连查询: 同时查询多个表中的数据<br>– SELECT * FROM 表名1,表名2… WHERE 连接条件;<br>– 连接查询如果不加连接条件,结果是一个笛卡尔积:(a,b,c)(1,2,3) –> (a1,a2,a3,b1,b2,b3,c1,c2,c3)<br>– (余婷, 骆昊, 王海飞) (设计学院,信通学院) –> 笛卡尔积</p><p>– 查询每个老师对应的学院<br>SELECT teaname, collname FROM tb_college, tb_teacher WHERE tb_teacher.collid=tb_college.collid;<br>– 查询学生姓名对应的学科名的分数<br>SELECT stuname, couname, mark FROM tb_student, tb_course, tb_score<br>WHERE tb_score.stuid=tb_student.stuid and tb_score.couid=tb_course.couid;</p><p>– 查询学生名对应的学生的平均成绩<br>– SELECT stuid, AVG(mark) as avg_mark FROM tb_score GROUP BY(stuid);<br>SELECT stuname, avg_mark FROM<br>tb_student,<br>(SELECT stuid, AVG(mark) as avg_mark FROM tb_score GROUP BY(stuid)) as temp_t<br>WHERE tb_student.stuid = temp_t.stuid; </p><p>– 查询平均分高于80分的学生名字和对应的平均分分数<br>SELECT stuname, avg_mark FROM<br>tb_student,<br>(SELECT stuid, AVG(mark) as avg_mark FROM tb_score GROUP BY(stuid) HAVING AVG(mark)>80) as temp_t<br>WHERE tb_student.stuid = temp_t.stuid; </p><p>– 查询平均分高于80分的学生名字和对应的平均分分数<br>– 注意:如果连接查询的时候既有连接条件又有筛选条件,我们要把筛选条件写在连接条件后边<br>SELECT stuname, avg_mark FROM<br>tb_student,<br>(SELECT stuid, AVG(mark) as avg_mark FROM tb_score GROUP BY(stuid)) as temp_t<br>WHERE tb_student.stuid = temp_t.stuid and avg_mark>80; </p><p>– 2.内连接<br>– SELECT * FROM 表1 inner join 表2 on 表2的连接条件 inner join 表3 on 表3的连接条件 …;<br>– 注意: 中间表写在最前面(存在关联其他表外键的表)<br>– 查询学生姓名对应的学科名的分数<br>SELECT stuname, couname, mark FROM tb_score<br>INNER JOIN tb_student ON tb_student.stuid=tb_score.stuid<br>INNER JOIN tb_course ON tb_course.couid=tb_score.couid<br>WHERE mark < 60; </p><p>– 3.外连接<br>– 外连接分为左外连接、右外连接和全连接, 但是在MySQL中支持左外连接和右外连接<br>– 表1(左表) left/right/inner join 表2(右表)<br>– 左外连接:将左表中对应字段的所有数据取出,然后再对应的右表中字段的值,如果右表对应的值不存在结果就为null<br>– 右外连接:将右表中对应字段的所有数据取出,然后再对应的左表中字段的值,如果左表对应的值不存在结果就为null </p><p>– 查所有学生名对应的成绩<br>– SELECT stuname, mark FROM tb_score INNER JOIN tb_student ON tb_student.stuid=tb_score.stuid;<br>SELECT stuname, mark FROM tb_score RIGHT JOIN tb_student ON tb_student.stuid=tb_score.stuid; </p><p>– =================================字段索引=======================================<br>– 字段的索引就相当于于目录,作用是为了能够快速的对这个字段进行查找<br>– 添加索引的好处是可以大大的提高查询效率; 缺点是:1.会消耗额外的存储空间, 2.会让添加和删除的效率降低<br>– 建议: 1.索引不能滥用 2.如果项目中针对某个字段的查询很频繁,建议加个对应的索引<br>– EXPLAIN: 获取执行计划</p><p>EXPLAIN(解释:explain看执行过程的) SELECT * FROM tb_student WHERE stuid=110;</p><p>EXPLAIN SELECT * FROM tb_student WHERE stuname=’张三’;</p><p>– 添加索引: create index 索引名称 on 表名 (字段名); - 给指定表中的指定字段添加索引<br>CREATE INDEX index_stuname on tb_student (stuname); – 给名字加索引<br>CREATE INDEX index_stuname1 on tb_student (stuname(1)); – 按姓加索引</p><p>– 删除索引<br>ALTER TABLE tb_student DROP INDEX index_stuname1; </p><p>– ==================================DCL============================================<br>– 1.创建用户<br>– create user 用户名@登录地址<br>– 登录地址: (限制用户能够登录MySQL的主机地址), ip地址(指定地址), localhost(数据库本机), %(任何位置)<br>CREATE USER ‘zhangshan’@’%’ IDENTIFIED BY ‘yuting123456’; </p><p>– 删除用户: drop user 用户名;<br>DROP USER ‘zhangshan’;</p><p>– 2.授权<br>– grant 权限类型 on 数据库.对象 to 用户名;<br>GRANT SELECT on school.tb_student TO ‘zhangshan’;<br>GRANT UPDATE on school.tb_student TO ‘zhangshan’;<br>GRANT all PRIVILEGES ON school.* TO ‘zhangshan’; – 添加所有权限<br>GRANT all PRIVILEGES ON school.* TO ‘zhangshan’ WITH GRANT OPTION; – 添加所有权限,并且能够将自己的权限再授权给其他用户 </p><p>– 3.召回授权<br>– REVOKE 权限类型 on 数据库.对象 from 用户名;<br>REVOKE DELETE on school.* FROM ‘zhangshan’;<br>REVOKE all PRIVILEGES on school.* FROM ‘zhangshan’;<br>REVOKE all PRIVILEGES on school.* FROM ‘zhangshan’;<br>REVOKE SELECT on school.tb_student FROM ‘zhangshan’;<br>REVOKE UPDATE on school.tb_student FROM ‘zhangshan’;</p><p>– 4.事务<br>– 完成一个任务需要执行多条sql,但是要求这多个操作中只要有一个操作失败,这个任务就失败,数据全部还原;所有的操作都成功,整个任务才成功的时候就使用事务 </p><p>– 开启事务环境<br>BEGIN;<br>UPDATE tb_student set stuname=’444’ WHERE stuname=’222’;<br>UPDATE tb_student set birth2=’1990-1-1’ WHERE stuname=’222’;<br>– 提交事务(只有begin到commit之间的所有的sql都执行成功,才会执行commit; 否则执行rollback)<br>COMMIT;<br>– 事务回滚(放弃beigin到commit之间执行成功的所有sql语句的结果)<br>ROLLBACK;</p>]]></content>
<summary type="html">
<p>– =================================连接查询=======================================<br>– 1.接连查询: 同时查询多个表中的数据<br>– SELECT * FROM 表名1,表名2… WHERE
</summary>
</entry>
<entry>
<title>82-数据的使用2</title>
<link href="http://mayu123mayu.github.io/2020/01/05/82-%E6%95%B0%E6%8D%AE%E7%9A%84%E4%BD%BF%E7%94%A82/"/>
<id>http://mayu123mayu.github.io/2020/01/05/82-%E6%95%B0%E6%8D%AE%E7%9A%84%E4%BD%BF%E7%94%A82/</id>
<published>2020-01-05T04:31:52.367Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>– 1. E.R实体关系图<br>– E.R实体关系图是通过图表的形式来表示数据库中表和字段以及表和表之间的关键。<br>– 表和表之间的关系主要有四种: 1对1,1对多,多对1,多对多 </p><p>– 2. 外键约束<br>– 外键约束: 让字段的值取值范围在另外一张表的主键中<br>– 怎么添加外键约束: 1) 保证当前表中有一个字段能够保持另外一张表的主键 2)添加外键约束<br>– 不同对应关系外键的添加的要求不同:<br>– 一对一: 可以添加到任意一张表中<br>– 一对多和多对一: 添加到多的那张表中<br>– 多对多: 两张表没有办法建立多对多的对应关系,需要第三张表才行<br>use school;<br>ALTER TABLE tb_student add COLUMN colid int COMMENT ‘所在学院’; – 在学生表中添加新的字段保存学院表的主键</p><p>– 3.怎么添加约束<br>– 3.1 创建表或者添加字段的时候直接在字段后面添加约束<br>– 3.2 通过修改表的表示添加和删除约束<br>– alter table 表名 add constraint 约束索引名 约束名(字段); -给指定字段添加指定约束(只能添加唯一约束和主键约束)<br>– alter table 表名 drop index 约束索引名; – 删除指定约束<br>ALTER TABLE tb_student add constraint unique_collid unique (collid);<br>ALTER TABLE tb_student drop INDEX unique_collid;</p><p>– 3.3 外键约束的添加<br>– alter table 表1 add CONSTRAINT 约束索引名 foreign key (字段1) references 表2 (字段2);<br>– 给表1中的字段1添加外键约束,并且字段1的值依赖表2中的字段2;注意: 外键索引名最好唯一<br>alter table tb_student add CONSTRAINT fk_collid_coll foreign key (colid) references tb_college (collid);</p><p>– 给老师添加学院的外键和外键约束<br>alter table tb_teacher add COLUMN cid int; – 添加学院外键<br>alter table tb_teacher add constraint fk_couid_tea<br>FOREIGN KEY (cid)<br>REFERENCES tb_college (collid);</p><p>– 给课程添加老师的外键和外键约束<br>ALTER TABLE tb_course add COLUMN tid int; – 添加老师外键<br>ALTER TABLE tb_course add constraint fk_teaid_cou<br>FOREIGN KEY (tid)<br>REFERENCES tb_teacher (teaid);</p><p>– 创建表的时候添加外键约束<br>create table if not EXISTS tb_test<br>(<br>tid int auto_increment,<br>tname varchar(10),<br>sid int,<br>PRIMARY key (tid), – 设置主键<br>FOREIGN KEY (sid) REFERENCES tb_teacher (teaid) – 设置外键<br>);</p><p>drop TABLE if EXISTS tb_test;</p><p>– 3.4 删除外键约束<br>– alter table 表名 drop FOREIGN KEY 外键索引;<br>alter table tb_student drop FOREIGN KEY fk_collid_coll;</p><p>– 3.4.5 多对多关系的外键约束<br>create table if not EXISTS tb_record<br>(<br>reid int auto_increment COMMENT ‘选课记录编号’,<br>sid int COMMENT ‘学生的外键’,<br>cid int COMMENT ‘课程外键’,<br>redate date COMMENT ‘选课日期’,<br>score FLOAT comment ‘分数’,<br>PRIMARY KEY (reid),<br>FOREIGN KEY (sid) REFERENCES tb_student (stuid),<br>FOREIGN KEY (cid) REFERENCES tb_course (couid)<br>);</p><p>– ============================4.高级查询===============================<br>– 1.去重: select distinct 字段名 FROM 表名;<br>SELECT distinct redate FROM tb_record ORDER BY redate;<br>SELECT distinct sid FROM tb_record; – 查询所有选课的学生的id</p><p>– 2.限制和分页<br>– 限制: SELECT * FROM 表名 limit N; - 查询的时候只获取前N条数据<br>– 偏移: SELECT * FROM 表名 limit M offset N; - 跳过前N条数据获取M条数据(从第N+1条数据开始,获取M条数据)<br>– SELECT * FROM 表名 limit M,N - 跳过前M条数据取N条数据<br>SELECT * FROM tb_record LIMIT 5; – 获取tb_record表中前5条数据<br>SELECT * FROM tb_record LIMIT 7 OFFSET 3; – 跳过前3条获取7条数据<br>SELECT * FROM tb_record limit 3,7; – 跳过前3条获取7条数据</p><p>SELECT * FROM tb_record ORDER BY score desc LIMIT 3; – 获取成绩前3的选课记录</p><p>SELECT DISTINCT score from tb_record ORDER BY score DESC LIMIT 3;</p><p>– 3.聚合: max(),min(),sum(),avg(),count() - mysql<br>use school;</p><p>select max(score) as max_score FROM tb_record; – 获取tb_record中最高分<br>select min(score) as min_score from tb_record; – 获取tb_record中最底分<br>SELECT sum(score) as sum_score from tb_record; – 求和所有分数的和,如果某一个记录的分数是空,那么这条记录不存与运算<br>SELECT avg(score) as avg_score from tb_record; – 求平均分(空不参与运算)<br>select count(score) as c_score from tb_record; – 统计分数的个数(空不参与计算)</p><p>– 4.分组:<br>– select 聚合操作 from 表名 group by (字段); - 按指定字段的值对表进行分组,然后对每个分组进行聚合操作。<br>– 注意: 分组后,除了分组字段以外,其他字段只能聚合操作<br>– 在分组后如果加条件,需要用having代替where</p><p>– 获取每个学生的平均分<br>select sid, avg(score) from tb_record group by(sid);</p><p>– 获取每个学科的平均分<br>select cid, avg(score) from tb_record group by (cid);</p><p>– 获取每个学生选课数量<br>select sid,count(cid) from tb_record group by (sid);</p><p>– 5.子查询: 将一个查询的结果作为另外一个查询的条件或者查询对象<br>– 第一种子查询: 将查询结果作为另外一个查询的条件</p><p>– 获取成绩是最高分的所有的学生的id<br>select max(score) as max_s from tb_record;<br>select sid from tb_record where score=(select max(score) as max_s from tb_record);</p><p>– 获取分数前3的所有的学生id (版本不支持limit的子查询)<br>– select distinct(score) from tb_record ORDER BY score desc limit 3;<br>– select sid from tb_record where score in (select distinct(score) from tb_record ORDER BY score desc limit 3);</p><p>– 获取选了2门课程以上的学生的id(分组+聚合)<br>select sid,count(cid) from tb_record group by (sid) having count(cid)>2;<br>select sid,count(cid) as c_course from tb_record group by (sid) having c_course>2;<br>select sid from tb_record group by (sid) having count(cid)>2;</p><p>– 获取选了2门课程以上的学生的姓名(子查询)<br>select stuname from tb_student where stuid in (select sid from tb_record group by (sid) having count(cid)>2);</p><p>– 第二种子查询: 将一个查询的结果作为另一个查询的查询对象<br>– 注意: 如果要将查询结果作为查询对象,那么查询结果对应的查询必须重命名<br>select * from tb_student limit 4,5;<br>select stuname from (select * from tb_student limit 4,5) as t1;</p><p>– select stuname as sname, stuaddr as saddr from tb_student WHERE stusex=0;<br>select sname,saddr from (select stuname as sname, stuaddr as saddr from tb_student WHERE stusex=0) as t1 where saddr like ‘%成都’ ;</p><p>– 6. 连接查询: 同时查询多张表<br>内外接:<br>(第一种写法)<br>–select<em>from t1,t2,t3 where 连接条件;<br>(第二种写法)<br>–select</em>from t1 inner join t2 on 连接条件1innerjoint3 on连接条件2;(注意:如果有中间表,中间表放在最前面)<br>– select * from 表名1,表名2,表名3 连接条件 查询条件;<br>– (1, 2, 3), (a, b, c) –> (1a,1b,1c, 2a,2b,2c,3a,3b,3c)<br>– 注意: 如果既有连接条件又有查询条件,查询条件必须放在连接条件的后面</p><p>– 查询所有学生的名字和学院名字<br>select stuname, collname from tb_student, tb_college where tb_student.colid=tb_college.collid;</p><p>– 查询学生每个学科的成绩: xxx(学生名字) xx(学科名) xx(分数)<br>select stuname, couname, score from<br>tb_student,<br>tb_course,<br>tb_record<br>where tb_student.stuid=tb_record.sid and tb_course.couid=tb_record.cid;</p><p>– 查询所有大于70分的学生的学科成绩: xxx(学生名字) xx(学科名) xx(分数)<br>select stuname, couname, score from<br>tb_student,<br>tb_course,<br>tb_record<br>where tb_student.stuid=tb_record.sid and tb_course.couid=tb_record.cid and score>70;</p><p>– 查询所有学生信息<br>SELECT * from tb_student;<br>– 查询所有课程名称及学分(映射)<br>SELECT couname, coucredit FROM tb_course;</p><p>– 查询所有学生的姓名和性别(映射)<br>SELECT stuname, if(stusex,’男’, ‘女’) as gender FROM tb_student;</p><p>– 查询所有女学生的姓名和出生日期<br>SELECT stuname, stubirth FROM tb_student where stusex=0;</p><p>– 查询所有80后学生的姓名、性别和出生日期<br>SELECT stuname, if(stusex, ‘男’, ‘女’) as gender, stubirth FROM tb_student<br>WHERE stubirth >= ‘1980-1-1’ and stubirth <= ‘1989-12-31’;</p><p>– 查询姓”杨”的学生姓名和性别(模糊)<br>SELECT stuname, if(stusex, ‘男’, ‘女’) as gender FROM tb_student where stuname like ‘杨%’;</p><p>– 查询姓”杨”名字两个字的学生姓名和性别<br>SELECT stuname, if(stusex, ‘男’, ‘女’) as gender FROM tb_student where stuname like ‘杨_’;</p><p>– 查询姓”杨”名字三个字的学生姓名和性别<br>SELECT stuname, if(stusex, ‘男’, ‘女’) as gender FROM tb_student where stuname like ‘杨__’;</p><p>– 查询名字中有”不”字或”嫣”字的学生的姓名<br>SELECT stuname FROM tb_student where stuname like ‘%不%’ or stuname like ‘%嫣%’;</p><p>– 查询没有录入家庭住址的学生姓名<br>SELECT stuname FROM tb_student WHERE stuaddr is NULL;</p><p>– 查询录入了家庭住址的学生姓名<br>SELECT stuname FROM tb_student WHERE stuaddr is not NULL;</p><p>– 查询学生选课的所有日期(去重)<br>SELECT distinct redate FROM tb_record;</p><p>– 查询学生的家庭住址(去重)<br>select distinct stuaddr FROM tb_student;</p><p>– 查询男学生的姓名和生日按年龄从大到小排列(排序)<br>SELECT stuname, stubirth FROM tb_student where stusex=1 ORDER BY stubirth;</p><p>– 查询年龄最大的学生的出生日期(聚合)<br>SELECT min(stubirth) FROM tb_student;</p><p>– 查询年龄最小的学生的出生日期(聚合)<br>SELECT max(stubirth) FROM tb_student;</p><p>– 查询男女学生的人数(分组和聚合)<br>SELECT if(stusex, ‘男生’, ‘女生’) as gender, count(stuid) as c_stu FROM tb_student GROUP BY (stusex);</p><p>– 查询课程编号为1111的课程的平均成绩<br>– select avg(score) FROM tb_record GROUP BY (cid) having cid=1111;<br>SELECT avg(score) FROM tb_record WHERE cid=1111;</p><p>– 查询学号为1001的学生所有课程的平均分<br>SELECT avg(score) FROM tb_record WHERE sid=1001;</p><p>– 查询每个学生的学号和平均成绩(分组和聚合)<br>SELECT sid, avg(score) FROM tb_record GROUP BY (sid);</p><p>– 查询平均成绩大于等于90分的学生的学号和平均成绩(分组和聚合)<br>SELECT sid, avg(score) as avg_score FROM tb_record GROUP BY (sid) having avg_score>=90;</p><p>– 查询年龄最大的学生的姓名(子查询)<br>– select min(stubirth) from tb_student;<br>SELECT stuname FROM tb_student where stubirth=(select min(stubirth) from tb_student);</p><p>– 查询年龄最大的学生姓名和年龄<br>SELECT stuname, DATEDIFF(CURDATE(),stubirth) div 365 as age FROM tb_student where stubirth=(select min(stubirth) from tb_student);</p><p>– 查询选了两门以上的课程的学生姓名(子查询,分组,聚合)<br>– select sid FROM tb_record GROUP BY (sid) HAVING count(cid)>2;<br>select stuname FROM tb_student where stuid in (select sid FROM tb_record GROUP BY (sid) HAVING count(cid)>2);</p><p>– 查询学生姓名、课程名称以及成绩(连接查询)<br>select stuname, couname, score FROM<br>tb_student,<br>tb_course,<br>tb_record<br>where tb_student.stuid=tb_record.sid and tb_course.couid=tb_record.cid;</p><p>– 查询学生姓名、课程名称以及成绩按成绩从高到低查询第11-15条记录<br>select stuname, couname, score FROM<br>tb_student,<br>tb_course,<br>tb_record<br>where tb_student.stuid=tb_record.sid and tb_course.couid=tb_record.cid<br>ORDER BY score DESC<br>LIMIT 10, 5;</p><p>– 查询选课学生的姓名和平均成绩(连接查询,子查询)<br>select stuname, avg(score) FROM<br>tb_student as t1,<br>tb_record as t2<br>where t1.stuid=t2.sid GROUP BY(sid);</p><p>– 方法2:<br>– select sid, avg(score) as avg_s FROM tb_record GROUP BY (sid);<br>select stuname, avg_s FROM<br>tb_student as t1,<br>(select sid, avg(score) as avg_s FROM tb_record GROUP BY (sid)) as t2<br>where t1.stuid=t2.sid;</p><p>– 查询每个学生的姓名和选课数量<br>select stuname, count(cid) FROM<br>tb_student as t1,<br>tb_record as t2<br>WHERE t1.stuid=t2.sid<br>GROUP BY (sid);</p><p>– select sid, COUNT(cid) as count_c FROM tb_record GROUP BY (sid);<br>SELECT stuname, count_c FROM<br>tb_student as t1,<br>(select sid, COUNT(cid) as count_c FROM tb_record GROUP BY (sid)) as t2<br>WHERE t1.stuid=t2.sid;</p><p>外连接:</p><p>左连接:<br> 表1 left join 表2 on 连接条件<br>右连接:<br>表1 right join 表2 on 连接条件。<br>左连接 右连接 就是在 左边还是右边<br>什么连接就是把对应的表拿出来,对应另一个。</p>]]></content>
<summary type="html">
<p>– 1. E.R实体关系图<br>– E.R实体关系图是通过图表的形式来表示数据库中表和字段以及表和表之间的关键。<br>– 表和表之间的关系主要有四种: 1对1,1对多,多对1,多对多 </p>
<p>– 2. 外键约束<br>– 外键约束: 让字段的值取值范围在另外一张
</summary>
</entry>
<entry>
<title>81-数据库的使用1。</title>
<link href="http://mayu123mayu.github.io/2020/01/05/81-%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A81%E3%80%82/"/>
<id>http://mayu123mayu.github.io/2020/01/05/81-%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A81%E3%80%82/</id>
<published>2020-01-05T04:31:52.365Z</published>
<updated>2020-01-05T04:16:43.000Z</updated>
<content type="html"><![CDATA[<p>– SQL语法<br>– DDL(数据定义语言)<br>– DML(数据操作语言)<br>– DCL(数据控制语言)<br>– 注意: SQL中大小写不敏感(大写和小写是一样的); 每条SQL语句必须以分号结束</p><p>PRIMARY</p><p>– 一.DDL - 主要提供数据库和表的创建、删除和修改<br>– 0. 删除数据库: drop database 数据库名;<br>DROP DATABASE school; – 直接删除指定数据库<br>DROP DATABASE if EXISTS school; – 如果指定的数据库存在就删除数据库</p><p>– 1.创建数据库: create database 数据库名;<br>create database school; – 直接创建指定数据库<br>CREATE database if not EXISTS school; – 当指定数据库不存在的时候才创建数据库<br>create database if not EXISTS school default charset utf8; – 创建数据库的时候设置字符集编码方式为utf8,让数据库支持中文数据的存储</p><p>– 2.使用/切换数据库: use 数据库名;<br>use school;</p><p>– 3.新建表: create table if not exists 表名(字段名1 类型1, 字段2 类型2,…);<br>– 注意: a. 表名一般需要加前缀’t’或者’tb’ b.字段用来确定表中要存储哪些数据,字段名随便命名但是不能是关键字 c.数据类型必须是MySQL支持的数据类型<br>– 常用数据类型: int-整数, char(size)-定长字符串, varchar(size)-不定长字符串, text-字符串, bit-布尔, date-日期<br>CREATE TABLE if not EXISTS t_student(stuid int, stuname varchar(20), gender bit, birth date); </p><p>– 新建表并且添加约束: create table if not exists 表名(字段名1 类型1 约束1, 字段2 类型2 约束2,…);<br>– 常见约束: not null - 不为空, default - 设置默认值, unique - 值唯一, primary key - 主键约束<br>– 主键约束: 主键的值可以确定列表中唯一一条记录(通过一个主键值可以找到表中的唯一一条记录)<br>– 注意: auto_increment只针对主键有效,并且主键的类型是整型;<br>CREATE TABLE if not EXISTS t_student<br>(<br>stuid int not null auto_increment,<br>stuname varchar(20) not null,<br>gender bit DEFAULT 1,<br>birth date,<br>PRIMARY KEY(stuid) – 将字段stuid作为当前表的主键(设置主键可以间接约束这个字段的值是唯一的)<br>);</p><p>– 4.删除表: DROP TABLE if EXISTS 表名;<br>DROP TABLE if EXISTS t_student;<br>– 清空表中的数据: TRUNCATE TABLE 表名;<br>TRUNCATE TABLE t_student;</p><p>– 5.修改表<br>– 5.1 添加列: alter TABLE 表名 add COLUMN 字段名 字段类型 约束;<br>alter TABLE t_student add COLUMN score FLOAT(8,2) DEFAULT 0;<br>alter TABLE t_student add COLUMN addr VARCHAR(100);</p><p>– 5.2 删除列: alter TABLE 表名 drop COLUMN 字段名;<br>alter TABLE t_student drop COLUMN gender;</p><p>– 5.3 修改列: alter TABLE 表名 modify 字段名 字段类型 约束; (不重命名)<br>– 修改列: alter TABLE 表名 change 原字段名 新字段名 字段类型 约束; (重命名)<br>–6. des 表名 —-查看表的机构</p><p>– 二、DML(数据操作语言) - 主要针对数据库中数据的增、删、改、查<br>– 1.增(添加数据/记录)<br>– 1.1插入数据/记录: insert into 表名 values(值1, 值2, 值3,….) - 依次给指定表中的字段赋值<br>INSERT into t_student VALUES(100, ‘张三’, 0, ‘2019-9-23’);</p><p>– 1.2插入数据/记录: insert into 表名(字段名1,字段名2,…) values(值1, 值2,…) -以指定的顺序给指定的字段赋值<br>INSERT into t_student(stuname, birth) VALUES(“小花”, date(now())); – 一次插入一条记录</p><p>– 一次插入多条记录<br>INSERT into t_student(stuname, birth) VALUES<br>(“小花”, date(now())),<br>(‘小明’, ‘2018-9-8’),<br>(‘路飞’, ‘1999-12-16’),<br>(‘佐助’, ‘2000-10-12’);</p><p>– 值的问题: sql中是数字对应的值直接写,字符串需要使用引号引起来,bit类型的值只有0或者1, 时间可以用内容是满足时间格式字符串也可以是通过时间函数获取的值<br>– 时间函数: now() - 当前时间 date(now()) - 当前日期 year(now()) - 当前年 month(now()) - 当前月 …. </p><p>– 2.删(删除数据/记录)<br>– delete from 表名; - 删除指定表中所有记录<br>DELETE FROM t_student;</p><p>– delete from 表名 where 条件语句; - 删除满足条件的记录<br>– SQL中的条件语句: =(判断是否相等), <>(不等于,和python中的!=功能一样), >, <, >=, <=<br>DELETE FROM t_student WHERE stuid=100; – 删除t_student表中stuid的值等于100的记录<br>DELETE FROM t_student WHERE stuname=’小花’; – 删除t_student表中stuname的值等于’小花’的记录<br>DELETE FROM t_student WHERE stuid<108; – 删除t_student表中stuid的值小于’小花’的记录 </p><p>– 3.改(修改数据/记录)<br>– update 表名 set 字段1=新值1, 字段2=新值2,…; - 将指定表中所有行的指定列/字段的值赋值为新值<br>UPDATE t_student set birth=’1999-10-1’, gender=1;</p><p>– update 表名 set 字段1=新值1, 字段2=新值2,… where 条件语句; -将表中满足条件的行中指定字段的值赋值为新值<br>UPDATE t_student set gender=0 WHERE stuname=’小花’;</p><p>– 通配符%: 表示任意个数的任意字符(包括0个)<br>UPDATE t_student set birth=’2000-01-01’ WHERE stuname LIKE ‘小%’; – 修改stuname是以’小’开头的行对应的birth的值<br>UPDATE t_student set birth=’2111-01-01’ WHERE stuname LIKE ‘%小%’;<br>– 统配符<em>: 表示一个任意字符<br>UPDATE t_student set birth=’2444-01-01’ WHERE stuname LIKE ‘小</em>‘; – 修改stuname只有两个字符,并且第一个字符是‘小’对应的行的birth的值<br>– 注意: 通配符只针对字符串有效! </p><p>– 4.查(获取数据)<br>– 4.1直接查询<br>– select * from 表名; - 获取指定表中所有行和所有的列(所有数据)<br>SELECT * FROM t_student;</p><p>– select 字段名1,字段名2,… from 表名; - 获取指定表中所有行指定的列<br>SELECT stuname,stuid FROM t_student; </p><p>– select * from 表名 where 条件; - 获取指定表中所有满足条件的行所有列的数据<br>SELECT * FROM t_student WHERE stuid>115; </p><p>– 4.2列重命名<br>– select 字段1 as 新字段1, 字段2 as 新字段2,… from 表名;<br>– 注意: 这儿的as可以省略<br>SELECT stuid as ‘学号’, stuname, gender as ‘性别’ FROM t_student; – 对查询结果中的stuid和gender字段进行重命名</p><p>– 4.3对查询结果重新赋值(一般针对布尔数据)<br>– select if(字段名,值1,值2) from 表名; -查询指定字段,并且判断字段对应的值是0还是1,如果是1结果为值1,否则为值2<br>– 注意: 这儿的if的用法是MySQL专有的<br>– MySQL写法: if(字段, 新值1, 新值2)<br>SELECT stuname,if(gender,’男’,’女’) as ‘性别’ FROM t_student;<br>– 通用写法: case 字段 when 值 then 新值1 else 新值2 end<br>SELECT case gender WHEN 1 THEN ‘男’ ELSE ‘女’ END as ‘性别’ FROM t_student;</p><p>– 4.4对列进行合并<br>– select concat(字段1,字段2,…) from 表名;<br>SELECT CONCAT(stuname,stuid) as ‘name_id’ FROM t_student;<br>SELECT CONCAT(stuname,’:’,stuid) as ‘name_id’ FROM t_student;<br>– 注意: 数字和字符串数据可以合并,bit类型的数据不可以合并<br>– SELECT CONCAT(stuname,’:’,gender) as ‘name_id’ FROM t_student; </p><p>– 4.5模糊查询 - 查询的时候时候通过like条件来指定查询对象<br>– sql中支持逻辑运算符and(逻辑与运算)和or(逻辑或运算),not(逻辑非)<br>SELECT * FROM t_student WHERE stuname like ‘%飞%’ or not stuid < 110; </p><p>– 4.6排序(先按之前的任何语法进行查询在排序)<br>– select * from 表名 order by 字段; - 对查询结果按照指定字段的值进行升序排序<br>– select * from 表名 order by 字段 asc; - 对查询结果按照指定字段的值进行升序排序<br>– select * from 表名 order by 字段 desc; - 对查询结果按照指定字段的值进行降序排序<br>SELECT * FROM t_student ORDER BY gender; – 按性别升序排序<br>SELECT * FROM t_student ORDER BY stuid ASC; – 按学号升序排序<br>SELECT * FROM t_student ORDER BY stuid DESC; – 按学号降序排序</p><p>– 查看当前所有数据库<br>show databases;</p><p>– 查看当前数据库所有的数据表<br>show tables;</p><p>– 显示当前时间<br>select now();</p><p>– 显示当前版本<br>select version();</p><p>– 显示数据库的创建<br>– show create database 数据库名;</p><p>– 显示数据表的创建<br>– show create table 数据表名;</p><p>– 查看当前使用的数据库<br>select database();</p><p>– 查看表的结构<br>DESC TABLE t_student;</p>]]></content>
<summary type="html">
<p>– SQL语法<br>– DDL(数据定义语言)<br>– DML(数据操作语言)<br>– DCL(数据控制语言)<br>– 注意: SQL中大小写不敏感(大写和小写是一样的); 每条SQL语句必须以分号结束</p>
<p>PRIMARY</p>
<p>– 一.DDL -
</summary>
</entry>
</feed>