-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
423 lines (202 loc) · 347 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Hello World</title>
<link href="/e84764d217a6/"/>
<url>/e84764d217a6/</url>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
</entry>
<entry>
<title>【vue-element-admin】食用手册1 - 初始化</title>
<link href="/c13a640ce906/"/>
<url>/c13a640ce906/</url>
<content type="html"><![CDATA[<h1 id="element-admin-介绍"><a href="#element-admin-介绍" class="headerlink" title="element-admin 介绍"></a>element-admin 介绍</h1><p><a href="https://panjiachen.gitee.io/vue-element-admin-site/zh/">vue-element-admin</a> 是一个后台前端解决方案,它基于 vue 和 element-ui 实现。它使用了最新的前端技术栈,内置了 i18 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。</p><h1 id="克隆代码"><a href="#克隆代码" class="headerlink" title="克隆代码"></a>克隆代码</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># clone the project</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/PanJiaChen/vue-admin-template.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># enter the project directory</span></span><br><span class="line"><span class="built_in">cd</span> vue-admin-template</span><br><span class="line"></span><br><span class="line"><span class="comment"># install dependency</span></span><br><span class="line">npm install --registry=https://registry.npm.taobao.org</span><br><span class="line"></span><br><span class="line"><span class="comment"># develop</span></span><br><span class="line">npm run dev</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> vue-element-admin </category>
</categories>
<tags>
<tag> vue </tag>
<tag> element </tag>
</tags>
</entry>
<entry>
<title>【vue-element-admin】食用手册4 - 列表和表单页面</title>
<link href="/ecbe650fe801/"/>
<url>/ecbe650fe801/</url>
<content type="html"><![CDATA[<h1 id="MokeJs"><a href="#MokeJs" class="headerlink" title="MokeJs"></a>MokeJs</h1><p>新建 <code>mock\myUser.js</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title class_">Mock</span> = <span class="built_in">require</span>(<span class="string">"mockjs"</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> data = <span class="title class_">Mock</span>.<span class="title function_">mock</span>({</span><br><span class="line"> <span class="string">"items|120"</span>: [</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">id</span>: <span class="string">"@id"</span>,</span><br><span class="line"> <span class="string">"row|+1"</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="attr">username</span>: <span class="string">"@cname()"</span>,</span><br><span class="line"> <span class="attr">date</span>: <span class="string">'@date("yyyy-MM-dd")'</span>,</span><br><span class="line"> <span class="attr">author</span>: <span class="string">'@img("900x200","red","#000","你好啊")'</span>,</span><br><span class="line"> <span class="attr">email</span>: <span class="string">"@email()"</span>,</span><br><span class="line"> <span class="attr">desc</span>: <span class="string">"@paragraph()"</span>,</span><br><span class="line"> <span class="attr">ip</span>: <span class="string">"@ip()"</span>,</span><br><span class="line"> <span class="string">"status|1"</span>: [<span class="string">"未审核"</span>, <span class="string">"审核中"</span>, <span class="string">"已审核"</span>],</span><br><span class="line"> },</span><br><span class="line"> ],</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span> = [</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">url</span>: <span class="string">"/vue-admin-template/list/myUser"</span>,</span><br><span class="line"> <span class="attr">type</span>: <span class="string">"get"</span>,</span><br><span class="line"> <span class="attr">response</span>: <span class="function">(<span class="params">config</span>) =></span> {</span><br><span class="line"> <span class="keyword">const</span> { page, limit, search, orderBy, orderByColumn } = config.<span class="property">query</span>;</span><br><span class="line"> <span class="keyword">let</span> items = [...data.<span class="property">items</span>];</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (search !== <span class="literal">undefined</span>) {</span><br><span class="line"> items = items.<span class="title function_">filter</span>(<span class="function">(<span class="params">item, index</span>) =></span> {</span><br><span class="line"> <span class="keyword">return</span> item.<span class="property">username</span>.<span class="title function_">includes</span>(search) || item.<span class="property">email</span>.<span class="title function_">includes</span>(search);</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (orderBy !== <span class="literal">undefined</span>) {</span><br><span class="line"> items =</span><br><span class="line"> orderBy === <span class="string">"ascending"</span></span><br><span class="line"> ? items.<span class="title function_">sort</span>(<span class="function">(<span class="params">a, b</span>) =></span></span><br><span class="line"> a[orderByColumn] > b[orderByColumn] ? <span class="number">0</span> : -<span class="number">1</span></span><br><span class="line"> )</span><br><span class="line"> : items.<span class="title function_">sort</span>(<span class="function">(<span class="params">a, b</span>) =></span></span><br><span class="line"> b[orderByColumn] > a[orderByColumn] ? <span class="number">0</span> : -<span class="number">1</span></span><br><span class="line"> );</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> {</span><br><span class="line"> <span class="attr">code</span>: <span class="number">20000</span>,</span><br><span class="line"> <span class="attr">data</span>: {</span><br><span class="line"> <span class="attr">total</span>: items.<span class="property">length</span>,</span><br><span class="line"> <span class="attr">items</span>: items.<span class="title function_">slice</span>((page - <span class="number">1</span>) * limit, page * limit),</span><br><span class="line"> },</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">];</span><br></pre></td></tr></table></figure><p>编辑 <code>mock\index.js</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> myUser = <span class="built_in">require</span>(<span class="string">"./myUser"</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> mocks = [...user, ...table, ...myUser];</span><br></pre></td></tr></table></figure><p>新增 <code>src\api\myUser.js</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> request <span class="keyword">from</span> <span class="string">"@/utils/request"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">function</span> <span class="title function_">getUserList</span>(<span class="params">params</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="title function_">request</span>({</span><br><span class="line"> <span class="attr">url</span>: <span class="string">"/vue-admin-template/list/myUser"</span>,</span><br><span class="line"> <span class="attr">method</span>: <span class="string">"get"</span>,</span><br><span class="line"> params,</span><br><span class="line"> });</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="列表和表单页面"><a href="#列表和表单页面" class="headerlink" title="列表和表单页面"></a>列表和表单页面</h1><p>新建 <code>src\views\list-and-form\list.vue</code></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><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><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">template</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"app-container"</span>></span></span><br><span class="line"> <span class="comment"><!-- 搜索区域 --></span></span><br><span class="line"> <span class="tag"><<span class="name">el-form</span> <span class="attr">:inline</span>=<span class="string">"true"</span> <span class="attr">size</span>=<span class="string">"mini"</span> <span class="attr">class</span>=<span class="string">"filter-container"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">el-form-item</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">el-input</span></span></span><br><span class="line"><span class="tag"> <span class="attr">v-model</span>=<span class="string">"pageData.search"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">placeholder</span>=<span class="string">"请输入搜索内容..."</span></span></span><br><span class="line"><span class="tag"> <span class="attr">size</span>=<span class="string">"mini"</span></span></span><br><span class="line"><span class="tag"> ></span></span><br><span class="line"> <span class="tag"><<span class="name">el-button</span> <span class="attr">slot</span>=<span class="string">"append"</span> <span class="attr">icon</span>=<span class="string">"el-icon-search"</span> @<span class="attr">click</span>=<span class="string">"onSearch"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">el-input</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">el-form-item</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">el-form</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 列表 --></span></span><br><span class="line"> <span class="tag"><<span class="name">el-table</span></span></span><br><span class="line"><span class="tag"> <span class="attr">ref</span>=<span class="string">"singleTable"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">v-loading</span>=<span class="string">"isloading"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:data</span>=<span class="string">"pageData.data"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:border</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:highlight-current-row</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:size</span>=<span class="string">"'mini'"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">row-key</span>=<span class="string">"id"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:header-cell-style</span>=<span class="string">"{background:'#f5f7fa'}"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:height</span>=<span class="string">"`calc(100vh - ` + bottomOffset + `px)`"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:default-sort</span>=<span class="string">"{prop: 'id', order: 'descending'}"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">element-loading-background</span>=<span class="string">"rgba(255, 255, 255, .85)"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">element-loading-text</span>=<span class="string">"拼命加载中..."</span></span></span><br><span class="line"><span class="tag"> <span class="attr">element-loading-spinner</span>=<span class="string">"el-icon-loading"</span></span></span><br><span class="line"><span class="tag"> @<span class="attr">sort-change</span>=<span class="string">"sortChange"</span></span></span><br><span class="line"><span class="tag"> ></span></span><br><span class="line"> <span class="tag"><<span class="name">template</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">el-table-column</span></span></span><br><span class="line"><span class="tag"> <span class="attr">type</span>=<span class="string">"index"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">label</span>=<span class="string">"序号"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">align</span>=<span class="string">"center"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">width</span>=<span class="string">"50"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:resizable</span>=<span class="string">"false"</span></span></span><br><span class="line"><span class="tag"> /></span></span><br><span class="line"> <span class="tag"><<span class="name">el-table-column</span></span></span><br><span class="line"><span class="tag"> <span class="attr">prop</span>=<span class="string">"row"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">label</span>=<span class="string">"流水号"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">width</span>=<span class="string">"80"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> /></span></span><br><span class="line"> <span class="tag"><<span class="name">el-table-column</span></span></span><br><span class="line"><span class="tag"> <span class="attr">prop</span>=<span class="string">"id"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">label</span>=<span class="string">"用户编号"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">width</span>=<span class="string">"180"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:sortable</span>=<span class="string">"'true'"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> /></span></span><br><span class="line"> <span class="tag"><<span class="name">el-table-column</span></span></span><br><span class="line"><span class="tag"> <span class="attr">prop</span>=<span class="string">"username"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">label</span>=<span class="string">"姓名"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">width</span>=<span class="string">"80"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> /></span></span><br><span class="line"> <span class="tag"><<span class="name">el-table-column</span></span></span><br><span class="line"><span class="tag"> <span class="attr">prop</span>=<span class="string">"date"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">label</span>=<span class="string">"日期"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">align</span>=<span class="string">"center"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:sortable</span>=<span class="string">"'true'"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">width</span>=<span class="string">"120"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> /></span></span><br><span class="line"> <span class="tag"><<span class="name">el-table-column</span></span></span><br><span class="line"><span class="tag"> <span class="attr">prop</span>=<span class="string">"email"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">label</span>=<span class="string">"邮箱"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">width</span>=<span class="string">"200"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> /></span></span><br><span class="line"> <span class="tag"><<span class="name">el-table-column</span></span></span><br><span class="line"><span class="tag"> <span class="attr">prop</span>=<span class="string">"ip"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">label</span>=<span class="string">"ip"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">width</span>=<span class="string">"140"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> /></span></span><br><span class="line"> <span class="tag"><<span class="name">el-table-column</span></span></span><br><span class="line"><span class="tag"> <span class="attr">prop</span>=<span class="string">"status"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">label</span>=<span class="string">"状态"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">width</span>=<span class="string">"80"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> /></span></span><br><span class="line"> <span class="tag"><<span class="name">el-table-column</span></span></span><br><span class="line"><span class="tag"> <span class="attr">prop</span>=<span class="string">"desc"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">label</span>=<span class="string">"描述"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">min-width</span>=<span class="string">"300"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> /></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">el-table-column</span></span></span><br><span class="line"><span class="tag"> <span class="attr">label</span>=<span class="string">"操作"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">width</span>=<span class="string">"100"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">class-name</span>=<span class="string">"small-padding fixed-width"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">fixed</span>=<span class="string">"right"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:resizable</span>=<span class="string">"false"</span></span></span><br><span class="line"><span class="tag"> ></span></span><br><span class="line"> <span class="tag"><<span class="name">template</span> <span class="attr">slot-scope</span>=<span class="string">"{row,$index}"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">router-link</span></span></span><br><span class="line"><span class="tag"> <span class="attr">type</span>=<span class="string">"primary"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">to</span>=<span class="string">"/list-and-form/form"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">target</span>=<span class="string">"_blank"</span></span></span><br><span class="line"><span class="tag"> ></span></span><br><span class="line"> <span class="tag"><<span class="name">el-link</span> <span class="attr">type</span>=<span class="string">"primary"</span> <span class="attr">:underline</span>=<span class="string">"false"</span> <span class="attr">style</span>=<span class="string">"font-size:12px"</span></span></span><br><span class="line"><span class="tag"> ></span>编辑</el-link</span><br><span class="line"> ></span><br><span class="line"> <span class="tag"></<span class="name">router-link</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">span</span> <span class="attr">v-html</span>=<span class="string">"'<span class="symbol">&nbsp;</span>'"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">el-link</span></span></span><br><span class="line"><span class="tag"> <span class="attr">type</span>=<span class="string">"primary"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:underline</span>=<span class="string">"false"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">style</span>=<span class="string">"font-size:12px"</span></span></span><br><span class="line"><span class="tag"> @<span class="attr">click</span>=<span class="string">"del(row,$index)"</span></span></span><br><span class="line"><span class="tag"> ></span>删除</el-link</span><br><span class="line"> ></span><br><span class="line"> <span class="tag"><<span class="name">span</span> <span class="attr">v-html</span>=<span class="string">"'<span class="symbol">&nbsp;</span>'"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">router-link</span></span></span><br><span class="line"><span class="tag"> <span class="attr">type</span>=<span class="string">"primary"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">to</span>=<span class="string">"/list-and-form/form"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">target</span>=<span class="string">"_blank"</span></span></span><br><span class="line"><span class="tag"> ></span></span><br><span class="line"> <span class="tag"><<span class="name">el-link</span> <span class="attr">type</span>=<span class="string">"primary"</span> <span class="attr">:underline</span>=<span class="string">"false"</span> <span class="attr">style</span>=<span class="string">"font-size:12px"</span></span></span><br><span class="line"><span class="tag"> ></span>详情</el-link</span><br><span class="line"> ></span><br><span class="line"> <span class="tag"></<span class="name">router-link</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">template</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">el-table-column</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">template</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">el-table</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 分页 --></span></span><br><span class="line"> <span class="tag"><<span class="name">el-pagination</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:pager-count</span>=<span class="string">"7"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:layout</span>=<span class="string">"paginationInfo.layout"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:page-sizes</span>=<span class="string">"paginationInfo.pageSizes"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:background</span>=<span class="string">"paginationInfo.background"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:hidden</span>=<span class="string">"paginationInfo.hidden"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:disabled</span>=<span class="string">"paginationInfo.disabled"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:page-size</span>=<span class="string">"pageData.limit"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:current-page</span>=<span class="string">"pageData.page"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:total</span>=<span class="string">"pageData.total"</span></span></span><br><span class="line"><span class="tag"> @<span class="attr">size-change</span>=<span class="string">"handleSizeChange"</span></span></span><br><span class="line"><span class="tag"> @<span class="attr">current-change</span>=<span class="string">"handleCurrentChange"</span></span></span><br><span class="line"><span class="tag"> /></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"></<span class="name">template</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">import</span> { getUserList } <span class="keyword">from</span> <span class="string">"@/api/myUser"</span>;</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">export</span> <span class="keyword">default</span> {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">name</span>: <span class="string">"List"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">data</span>(<span class="params"></span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">pageData</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">search</span>: <span class="string">""</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">orderByColumn</span>: <span class="string">"id"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">orderBy</span>: <span class="string">"descending"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: [],</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">page</span>: <span class="number">1</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">limit</span>: <span class="number">20</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">total</span>: <span class="number">0</span>,</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">paginationInfo</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">background</span>: <span class="literal">true</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">layout</span>: <span class="string">"total, ->, sizes, prev, pager, next, jumper, slot"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">pageSizes</span>: [<span class="number">10</span>, <span class="number">20</span>, <span class="number">50</span>, <span class="number">100</span>, <span class="number">200</span>],</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">hidden</span>: <span class="literal">false</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">disabled</span>: <span class="literal">false</span>,</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">bottomOffset</span>: <span class="number">185</span>, <span class="comment">// 列表铺满全屏时其他容器高度</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">isloading</span>: <span class="literal">false</span>, <span class="comment">// 是否显示加载动画</span></span></span><br><span class="line"><span class="language-javascript"> };</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">updated</span>(<span class="params"></span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="title function_">initRefreshBtn</span>();</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">created</span>(<span class="params"></span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="title function_">getList</span>();</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">methods</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">initRefreshBtn</span>(<span class="params"></span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> rightFixedPatch = <span class="variable language_">this</span>.<span class="property">$refs</span>.<span class="property">singleTable</span>.<span class="property">$refs</span>.<span class="property">rightFixedPatch</span>;</span></span><br><span class="line"><span class="language-javascript"> rightFixedPatch.<span class="property">style</span>.<span class="property">lineHeight</span> = <span class="string">"47px"</span>;</span></span><br><span class="line"><span class="language-javascript"> rightFixedPatch.<span class="property">style</span>.<span class="property">textAlign</span> = <span class="string">"center"</span>;</span></span><br><span class="line"><span class="language-javascript"> rightFixedPatch.<span class="property">style</span>.<span class="property">cursor</span> = <span class="string">"pointer"</span>;</span></span><br><span class="line"><span class="language-javascript"> rightFixedPatch.<span class="property">innerHTML</span> =</span></span><br><span class="line"><span class="language-javascript"> <span class="string">'<i class="el-icon-refresh" title="刷新"></i>'</span>;</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.$nextTick(<span class="function">() =></span> {</span></span><br><span class="line"><span class="language-javascript"> rightFixedPatch.<span class="title function_">addEventListener</span>(<span class="string">"click"</span>, <span class="variable language_">this</span>.<span class="property">getList</span>);</span></span><br><span class="line"><span class="language-javascript"> });</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">sortChange</span>(<span class="params">column</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">orderByColumn</span> = column.<span class="property">prop</span>;</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">orderBy</span> = column.<span class="property">order</span>;</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">page</span> = <span class="number">1</span>;</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="title function_">getList</span>();</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">onSearch</span>(<span class="params"></span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">page</span> = <span class="number">1</span>;</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="title function_">getList</span>();</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">getList</span>(<span class="params"></span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> me = <span class="variable language_">this</span>;</span></span><br><span class="line"><span class="language-javascript"> me.<span class="property">isloading</span> = <span class="literal">true</span>;</span></span><br><span class="line"><span class="language-javascript"> me.<span class="property">paginationInfo</span>.<span class="property">disabled</span> = <span class="literal">true</span>;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">getUserList</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">page</span>: me.<span class="property">pageData</span>.<span class="property">page</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">limit</span>: me.<span class="property">pageData</span>.<span class="property">limit</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">search</span>: me.<span class="property">pageData</span>.<span class="property">search</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">orderBy</span>: me.<span class="property">pageData</span>.<span class="property">orderBy</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">orderByColumn</span>: me.<span class="property">pageData</span>.<span class="property">orderByColumn</span>,</span></span><br><span class="line"><span class="language-javascript"> }).<span class="title function_">then</span>(<span class="keyword">function</span> (<span class="params">response</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> data = response.<span class="property">data</span>;</span></span><br><span class="line"><span class="language-javascript"> <span class="built_in">setTimeout</span>(<span class="function">() =></span> {</span></span><br><span class="line"><span class="language-javascript"> me.<span class="property">pageData</span>.<span class="property">total</span> = data.<span class="property">total</span>;</span></span><br><span class="line"><span class="language-javascript"> me.<span class="property">pageData</span>.<span class="property">data</span> = data.<span class="property">items</span>;</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> me.<span class="property">isloading</span> = !<span class="literal">true</span>;</span></span><br><span class="line"><span class="language-javascript"> me.<span class="property">paginationInfo</span>.<span class="property">disabled</span> = !<span class="literal">true</span>;</span></span><br><span class="line"><span class="language-javascript"> }, <span class="number">500</span>);</span></span><br><span class="line"><span class="language-javascript"> });</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">handleSizeChange</span>(<span class="params">val</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">limit</span> = val;</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="title function_">getList</span>();</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">handleCurrentChange</span>(<span class="params">val</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">page</span> = val;</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="title function_">getList</span>();</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> };</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">style</span>></span><span class="language-css"></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.filter-container</span> {</span></span><br><span class="line"><span class="language-css"> <span class="attribute">height</span>: <span class="number">40px</span>;</span></span><br><span class="line"><span class="language-css"> }</span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.filter-container</span> <span class="selector-class">.el-input</span> {</span></span><br><span class="line"><span class="language-css"> <span class="attribute">width</span>: <span class="number">280px</span> <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css"> }</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.el-pagination</span> {</span></span><br><span class="line"><span class="language-css"> <span class="attribute">padding</span>: <span class="number">15px</span> <span class="number">15px</span> <span class="number">0px</span> <span class="number">15px</span>;</span></span><br><span class="line"><span class="language-css"> }</span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.el-pagination</span><span class="selector-class">.hidden</span> {</span></span><br><span class="line"><span class="language-css"> <span class="attribute">display</span>: none;</span></span><br><span class="line"><span class="language-css"> }</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css"> <span class="selector-class">.el-table__body</span> {</span></span><br><span class="line"><span class="language-css"> <span class="attribute">width</span>: <span class="number">100%</span> <span class="meta">!important</span>;</span></span><br><span class="line"><span class="language-css"> }</span></span><br><span class="line"><span class="language-css"></span><span class="tag"></<span class="name">style</span>></span></span><br></pre></td></tr></table></figure><p>新建 <code>src\components\AppGrid\index.vue</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><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><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br></pre></td><td class="code"><pre><span class="line"><template></span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">div</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="comment"><!-- 搜索区域 --></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"filter-container"</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-input</span> <span class="attr">v-model</span>=<span class="string">"pageData.search"</span> <span class="attr">placeholder</span>=<span class="string">"请输入搜索内容..."</span> <span class="attr">size</span>=<span class="string">"mini"</span> <span class="attr">style</span>=<span class="string">"width:360px"</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-button</span> <span class="attr">slot</span>=<span class="string">"append"</span> <span class="attr">icon</span>=<span class="string">"el-icon-search"</span> @<span class="attr">click</span>=<span class="string">"onSearch"</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">el-input</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"><span class="language-xml"></span></span><br><span class="line"><span class="language-xml"> <span class="comment"><!-- 列表 --></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-table</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">ref</span>=<span class="string">"singleTable"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">v-loading</span>=<span class="string">"pageData.loading"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">row-key</span>=<span class="string">"id"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:data</span>=<span class="string">"pageData.data"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:border</span>=<span class="string">"true"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:size</span>=<span class="string">"'mini'"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:highlight-current-row</span>=<span class="string">"true"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:header-cell-style</span>=<span class="string">"{background:'#f5f7fa'}"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:height</span>=<span class="string">"`calc(100vh - ` + bottomOffset + `px)`"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">element-loading-text</span>=<span class="string">"拼命加载中"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> @<span class="attr">sort-change</span>=<span class="string">"sortChange"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> @<span class="attr">header-dragend</span>=<span class="string">"headerDragend"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> ></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">slot</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">el-table</span>></span></span></span><br><span class="line"><span class="language-xml"></span></span><br><span class="line"><span class="language-xml"> <span class="comment"><!-- 分页 --></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-pagination</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">ref</span>=<span class="string">"singlePagination"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:pager-count</span>=<span class="string">"7"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:background</span>=<span class="string">"true"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:layout</span>=<span class="string">"'total, ->, sizes, prev, pager, next, jumper, slot'"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:page-sizes</span>=<span class="string">"[10, 20, 50, 100, 200]"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:page-size</span>=<span class="string">"pageData.limit"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:current-page</span>=<span class="string">"pageData.page"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:total</span>=<span class="string">"pageData.total"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> <span class="attr">:disabled</span>=<span class="string">"pageData.loading"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> @<span class="attr">size-change</span>=<span class="string">"handleSizeChange"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> @<span class="attr">current-change</span>=<span class="string">"handleCurrentChange"</span></span></span></span><br><span class="line"><span class="tag"><span class="language-xml"> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="keyword">export</span> <span class="keyword">default</span> {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">name</span>: <span class="string">'AppGrid'</span>,</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">props</span>: {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">bottomOffset</span>: {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">type</span>: <span class="title class_">Number</span>,</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">default</span>: <span class="number">185</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">getData</span>: {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">type</span>: <span class="title class_">Function</span>,</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">default</span>: <span class="keyword">function</span>(<span class="params"></span>) {},</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">require</span>: <span class="literal">true</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">limit</span>: {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">type</span>: <span class="title class_">Number</span>,</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">default</span>: <span class="number">20</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">searchBy</span>: {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">type</span>: <span class="title class_">Array</span>,</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">default</span>: <span class="keyword">new</span> <span class="title class_">Array</span>(<span class="number">0</span>),</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">require</span>: <span class="literal">true</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">data</span>(<span class="params"></span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="keyword">return</span> {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">pageData</span>: {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">loading</span>: <span class="literal">false</span>,</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">search</span>: <span class="string">''</span>,</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">data</span>: [],</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">page</span>: <span class="number">1</span>,</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">limit</span>: <span class="variable language_">this</span>.<span class="property">limit</span>,</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">total</span>: <span class="number">0</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">updated</span>(<span class="params"></span>) { <span class="variable language_">this</span>.<span class="title function_">initRefreshBtn</span>() },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">created</span>(<span class="params"></span>) { <span class="variable language_">this</span>.<span class="title function_">_getData</span>() },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">methods</span>: {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">onSearch</span>(<span class="params"></span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.<span class="title function_">_getData</span>()</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">sortChange</span>(<span class="params"></span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">handleSizeChange</span>(<span class="params">val</span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">limit</span> = val</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.<span class="title function_">_getData</span>()</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">handleCurrentChange</span>(<span class="params">val</span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">page</span> = val</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.<span class="title function_">_getData</span>()</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">_getData</span>(<span class="params"></span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">loading</span> = <span class="literal">true</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="keyword">const</span> param = (<span class="function">(<span class="params">{ search, page, limit }</span>) =></span> ({ search, page, limit }))(<span class="variable language_">this</span>.<span class="property">pageData</span>)</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.<span class="title function_">getData</span>(param).<span class="title function_">then</span>(<span class="function">(<span class="params">res</span>) =></span> {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">data</span> = res.<span class="property">data</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">total</span> = res.<span class="property">total</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.<span class="property">pageData</span>.<span class="property">loading</span> = !<span class="literal">true</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> })</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">initRefreshBtn</span>(<span class="params"></span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="keyword">return</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="comment">// const rightFixedPatch = this.$refs.singleTable.$refs.rightFixedPatch</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="comment">// rightFixedPatch.style.lineHeight = '47px'</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="comment">// rightFixedPatch.style.textAlign = 'center'</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="comment">// rightFixedPatch.style.cursor = 'pointer'</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="comment">// rightFixedPatch.innerHTML = '<i class="el-icon-refresh" style="font-weight:900" title="刷新"></i>'</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="comment">// this.$nextTick(() => { rightFixedPatch.addEventListener('click', this._getData) })</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">headerDragend</span>(<span class="params"></span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.$nextTick(<span class="function">() =></span> {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="comment">// 对 Table 进行重新布局。当 Table 或其祖先元素由隐藏切换为显示时,可能需要调用此方法</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.<span class="property">$refs</span>.<span class="property">singleTable</span>.<span class="title function_">doLayout</span>()</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> })</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">}</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"></span><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">style</span> <span class="attr">scoped</span>></span><span class="language-css"></span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"><span class="selector-class">.filter-container</span>{</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"> <span class="attribute">height</span>: <span class="number">40px</span>;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">}</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"><span class="selector-class">.filter-container</span> <span class="selector-class">.el-input</span> {</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"> <span class="attribute">width</span>: <span class="number">280px</span> <span class="meta">!important</span>;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"> }</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"></span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"><span class="selector-class">.el-pagination</span> {</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"> <span class="attribute">padding</span>: <span class="number">15px</span> <span class="number">15px</span> <span class="number">0px</span> <span class="number">15px</span>;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">}</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"><span class="selector-class">.el-pagination</span><span class="selector-class">.hidden</span> {</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"> <span class="attribute">display</span>: none;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">}</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"></span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"><span class="selector-class">.el-table__body</span> {</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"> <span class="attribute">width</span>: <span class="number">100%</span> <span class="meta">!important</span>;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">}</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml"></span><span class="tag"></<span class="name">style</span>></span></span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>新建 <code>src\views\list-and-form\list1.vue</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><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></pre></td><td class="code"><pre><span class="line"><template></span><br><span class="line"> <span class="language-xml"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"app-container"</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">appGrid</span> <span class="attr">ref</span>=<span class="string">"appGrid1"</span> <span class="attr">:search-by</span>=<span class="string">"[]"</span> <span class="attr">:get-data</span>=<span class="string">"getData"</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">template</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-table-column</span> <span class="attr">type</span>=<span class="string">"index"</span> <span class="attr">label</span>=<span class="string">"序号"</span> <span class="attr">align</span>=<span class="string">"center"</span> <span class="attr">width</span>=<span class="string">"50"</span> <span class="attr">:resizable</span>=<span class="string">"false"</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-table-column</span> <span class="attr">prop</span>=<span class="string">"row"</span> <span class="attr">label</span>=<span class="string">"流水号"</span> <span class="attr">width</span>=<span class="string">"80"</span> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-table-column</span> <span class="attr">prop</span>=<span class="string">"id"</span> <span class="attr">label</span>=<span class="string">"用户编号"</span> <span class="attr">width</span>=<span class="string">"180"</span> <span class="attr">:sortable</span>=<span class="string">"'true'"</span> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-table-column</span> <span class="attr">prop</span>=<span class="string">"username"</span> <span class="attr">label</span>=<span class="string">"姓名"</span> <span class="attr">width</span>=<span class="string">"80"</span> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-table-column</span> <span class="attr">prop</span>=<span class="string">"date"</span> <span class="attr">label</span>=<span class="string">"日期"</span> <span class="attr">align</span>=<span class="string">"center"</span> <span class="attr">:sortable</span>=<span class="string">"'true'"</span> <span class="attr">width</span>=<span class="string">"120"</span> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-table-column</span> <span class="attr">prop</span>=<span class="string">"email"</span> <span class="attr">label</span>=<span class="string">"邮箱"</span> <span class="attr">width</span>=<span class="string">"200"</span> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-table-column</span> <span class="attr">prop</span>=<span class="string">"ip"</span> <span class="attr">label</span>=<span class="string">"ip"</span> <span class="attr">width</span>=<span class="string">"140"</span> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-table-column</span> <span class="attr">prop</span>=<span class="string">"status"</span> <span class="attr">label</span>=<span class="string">"状态"</span> <span class="attr">width</span>=<span class="string">"80"</span> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-table-column</span> <span class="attr">prop</span>=<span class="string">"desc"</span> <span class="attr">label</span>=<span class="string">"描述"</span> <span class="attr">min-width</span>=<span class="string">"600"</span> <span class="attr">:show-overflow-tooltip</span>=<span class="string">"true"</span> /></span></span></span><br><span class="line"><span class="language-xml"></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-table-column</span> <span class="attr">label</span>=<span class="string">"操作"</span> <span class="attr">width</span>=<span class="string">"100"</span> <span class="attr">class-name</span>=<span class="string">"small-padding fixed-width"</span> <span class="attr">fixed</span>=<span class="string">"right"</span> <span class="attr">:resizable</span>=<span class="string">"false"</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">template</span> <span class="attr">slot-scope</span>=<span class="string">"{row,$index}"</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">router-link</span> <span class="attr">type</span>=<span class="string">"primary"</span> <span class="attr">to</span>=<span class="string">"/list-and-form/form"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-link</span> <span class="attr">type</span>=<span class="string">"primary"</span> <span class="attr">:underline</span>=<span class="string">"false"</span> <span class="attr">style</span>=<span class="string">"font-size:12px"</span>></span>编辑<span class="tag"></<span class="name">el-link</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">router-link</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">span</span> <span class="attr">v-html</span>=<span class="string">"'<span class="symbol">&nbsp;</span>'"</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-link</span> <span class="attr">type</span>=<span class="string">"primary"</span> <span class="attr">:underline</span>=<span class="string">"false"</span> <span class="attr">style</span>=<span class="string">"font-size:12px"</span> @<span class="attr">click</span>=<span class="string">"del(row,$index)"</span>></span>删除<span class="tag"></<span class="name">el-link</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">span</span> <span class="attr">v-html</span>=<span class="string">"'<span class="symbol">&nbsp;</span>'"</span> /></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">router-link</span> <span class="attr">type</span>=<span class="string">"primary"</span> <span class="attr">to</span>=<span class="string">"/list-and-form/form"</span> <span class="attr">target</span>=<span class="string">"_blank"</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"><<span class="name">el-link</span> <span class="attr">type</span>=<span class="string">"primary"</span> <span class="attr">:underline</span>=<span class="string">"false"</span> <span class="attr">style</span>=<span class="string">"font-size:12px"</span>></span>详情<span class="tag"></<span class="name">el-link</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">router-link</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">template</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">el-table-column</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">template</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">appGrid</span>></span></span></span><br><span class="line"><span class="language-xml"> <span class="tag"></<span class="name">div</span>></span></span></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="keyword">import</span> appGrid <span class="keyword">from</span> <span class="string">'@/components/AppGrid'</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="keyword">import</span> { getUserList } <span class="keyword">from</span> <span class="string">'@/api/myUser'</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"><span class="keyword">export</span> <span class="keyword">default</span> {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">name</span>: <span class="string">'List1'</span>,</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">components</span>: { appGrid },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">data</span>(<span class="params"></span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="keyword">return</span> {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">mounted</span>(<span class="params"></span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="variable language_">this</span>.$nextTick(<span class="keyword">function</span>(<span class="params"></span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="comment">// 仅在整个视图都被渲染之后才会运行的代码</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> })</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="attr">methods</span>: {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">getData1</span>(<span class="params">search, page, limit</span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Promise</span>(<span class="keyword">function</span>(<span class="params">resolve, reject</span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">getUserList</span>({ page, limit, search }).<span class="title function_">then</span>(<span class="keyword">function</span>(<span class="params">response</span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="keyword">const</span> data = response.<span class="property">data</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="built_in">setTimeout</span>(<span class="function">() =></span> {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">resolve</span>(data)</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> }, <span class="number">500</span>)</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> })</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> })</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> },</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="keyword">async</span> <span class="title function_">getData</span>(<span class="params">param</span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="keyword">const</span> data = (<span class="keyword">await</span> <span class="title function_">getUserList</span>(param)).<span class="property">data</span></span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Promise</span>(<span class="keyword">function</span>(<span class="params">resolve, reject</span>) {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="built_in">setTimeout</span>(<span class="function">() =></span> {</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> <span class="title function_">resolve</span>(data)</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> }, <span class="number">500</span>)</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> })</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"> }</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml">}</span></span></span><br><span class="line"><span class="language-javascript"><span class="language-xml"></span><span class="tag"></<span class="name">script</span>></span></span></span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag"><<span class="name">style</span>></span></span></span><br><span class="line"><span class="language-xml"><span class="tag"></<span class="name">style</span>></span></span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>新建 <code>src\views\list-and-form\form.vue</code></p>]]></content>
<categories>
<category> vue-element-admin </category>
</categories>
<tags>
<tag> vue </tag>
<tag> element </tag>
</tags>
</entry>
<entry>
<title>【vue-element-admin】食用手册3 - 配置路由</title>
<link href="/f29439d322a1/"/>
<url>/f29439d322a1/</url>
<content type="html"><![CDATA[<h1 id="element-admin"><a href="#element-admin" class="headerlink" title="element-admin"></a>element-admin</h1><h2 id="表单-Layout"><a href="#表单-Layout" class="headerlink" title="表单 Layout"></a>表单 Layout</h2><p>新建 <code>src\views\list-and-form\form.vue</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><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></pre></td><td class="code"><pre><span class="line"><template></span><br><span class="line"> <div class="app-wrapper-form"></span><br><span class="line"> <section class="app-main"></span><br><span class="line"> <transition name="fade-transform" mode="out-in"></span><br><span class="line"> <router-view :key="key" /></span><br><span class="line"> </transition></span><br><span class="line"> </section></span><br><span class="line"> </div></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">export default {</span><br><span class="line"> name: "FormLayout",</span><br><span class="line"> computed: {</span><br><span class="line"> key() {</span><br><span class="line"> return this.$route.path;</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"><style scoped></span><br><span class="line">.app-main {</span><br><span class="line"> /*50 = navbar */</span><br><span class="line"> min-height: 100vh; /* calc(100vh - 50px); */</span><br><span class="line"> width: 100%;</span><br><span class="line"> position: relative;</span><br><span class="line"> overflow: hidden;</span><br><span class="line"> background-color: #e7e8eb;</span><br><span class="line">}</span><br><span class="line">.fixed-header + .app-main {</span><br><span class="line"> padding-top: 50px;</span><br><span class="line">}</span><br><span class="line"></style></span><br><span class="line"></span><br><span class="line"><style lang="scss"></span><br><span class="line">// fix css style bug in open el-dialog</span><br><span class="line">.el-popup-parent--hidden {</span><br><span class="line"> .fixed-header {</span><br><span class="line"> padding-right: 15px;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></style></span><br></pre></td></tr></table></figure><h2 id="配置路由"><a href="#配置路由" class="headerlink" title="配置路由"></a>配置路由</h2><p>修改 <code>src\router\index.js</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">// 列表和表单</span></span><br><span class="line">{</span><br><span class="line"> <span class="attr">path</span>: <span class="string">'/list-and-form'</span>,</span><br><span class="line"> <span class="attr">component</span>: <span class="title class_">Layout</span>,</span><br><span class="line"> <span class="attr">redirect</span>: <span class="string">'/list-and-form/list'</span>,</span><br><span class="line"> <span class="attr">name</span>: <span class="string">'ListAndForm'</span>,</span><br><span class="line"> <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'列表和表单'</span>, <span class="attr">icon</span>: <span class="string">'table'</span> },</span><br><span class="line"> <span class="attr">children</span>: [</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">path</span>: <span class="string">'list'</span>,</span><br><span class="line"> <span class="attr">name</span>: <span class="string">'ListAndForm_List'</span>,</span><br><span class="line"> <span class="attr">component</span>: <span class="function">() =></span> <span class="keyword">import</span>(<span class="string">'@/views/list-and-form/list'</span>),</span><br><span class="line"> <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'列表'</span>, <span class="attr">icon</span>: <span class="string">'table'</span> }</span><br><span class="line"> },</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">path</span>: <span class="string">'list1'</span>,</span><br><span class="line"> <span class="attr">name</span>: <span class="string">'ListAndForm_List1'</span>,</span><br><span class="line"> <span class="attr">component</span>: <span class="function">() =></span> <span class="keyword">import</span>(<span class="string">'@/views/list-and-form/list1'</span>),</span><br><span class="line"> <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'列表1'</span>, <span class="attr">icon</span>: <span class="string">'table'</span> }</span><br><span class="line"> }</span><br><span class="line"> ]</span><br><span class="line">},</span><br><span class="line"></span><br><span class="line">{</span><br><span class="line"> <span class="attr">hidden</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">path</span>: <span class="string">'/hidden/form'</span>,</span><br><span class="line"> <span class="attr">component</span>: <span class="title class_">FormLayout</span>,</span><br><span class="line"> <span class="attr">name</span>: <span class="string">'HiddenForm'</span>,</span><br><span class="line"> <span class="attr">children</span>: [</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">path</span>: <span class="string">'/list-and-form/form'</span>,</span><br><span class="line"> <span class="attr">name</span>: <span class="string">'ListAndForm_Form'</span>,</span><br><span class="line"> <span class="attr">component</span>: <span class="function">() =></span> <span class="keyword">import</span>(<span class="string">'@/views/list-and-form/form'</span>),</span><br><span class="line"> <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'表单'</span>, <span class="attr">icon</span>: <span class="string">'form'</span> }</span><br><span class="line"> }</span><br><span class="line"> ]</span><br><span class="line">},</span><br></pre></td></tr></table></figure><p><strong>提示:</strong></p><blockquote><p>1、父级路由下只有一个子级路由时,菜单只显示父级,不显示子级<br>2、顶级路由设置 Layout 后,所有的子级都会嵌套进去</p></blockquote>]]></content>
<categories>
<category> vue-element-admin </category>
</categories>
<tags>
<tag> vue </tag>
<tag> element </tag>
</tags>
</entry>
<entry>
<title>【vue-element-admin】食用手册2 - 页面框架个性化</title>
<link href="/65e053c1594d/"/>
<url>/65e053c1594d/</url>
<content type="html"><![CDATA[<h1 id="element-admin-个性化配置"><a href="#element-admin-个性化配置" class="headerlink" title="element-admin 个性化配置"></a>element-admin 个性化配置</h1><h2 id="配置页面布局"><a href="#配置页面布局" class="headerlink" title="配置页面布局"></a>配置页面布局</h2><p>修改 <code>src\settings.js</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line"> <span class="attr">title</span>: <span class="string">'Vue Admin Template'</span>, <span class="comment">//网站标题</span></span><br><span class="line"> <span class="attr">fixedHeader</span>: <span class="literal">true</span>, <span class="comment">//是否固定标题</span></span><br><span class="line"> <span class="attr">sidebarLogo</span>: <span class="literal">true</span> <span class="comment">//是否在侧边栏中显示 Logo</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="配置-Logo"><a href="#配置-Logo" class="headerlink" title="配置 Logo"></a>配置 Logo</h2><p>修改 <code>src\layout\components\Sidebar\Logo.vue</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line"> <span class="attr">title</span>: <span class="string">'Vue Admin Template'</span>,</span><br><span class="line"> <span class="attr">logo</span>: <span class="string">'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png'</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="配置默认语言为中文"><a href="#配置默认语言为中文" class="headerlink" title="配置默认语言为中文"></a>配置默认语言为中文</h2><p>修改 <code>src\main.js</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> locale <span class="keyword">from</span> <span class="string">"element-ui/lib/locale/lang/en"</span>; <span class="comment">// lang i18n</span></span><br><span class="line"><span class="comment">// 改为</span></span><br><span class="line"><span class="keyword">import</span> locale <span class="keyword">from</span> <span class="string">"element-ui/lib/locale/lang/zh-CN"</span>; <span class="comment">// lang i18n</span></span><br></pre></td></tr></table></figure><h2 id="导航头像样式调整"><a href="#导航头像样式调整" class="headerlink" title="导航头像样式调整"></a>导航头像样式调整</h2><p>修改 <code>src\layout\components\Navbar.vue</code></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></pre></td><td class="code"><pre><span class="line">// 1. 头像触发下拉方式改为hover // 去掉 trigger="click" // 2.</span><br><span class="line">去掉下拉按钮的箭头,并替换头像</span><br><span class="line"><span class="comment"><!-- <img :src="avatar+'?imageView2/1/w/80/h/80'" class="user-avatar"> --></span></span><br><span class="line"><span class="comment"><!-- <i class="el-icon-caret-bottom" /> --></span></span><br><span class="line"><span class="tag"><<span class="name">el-avatar</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:size</span>=<span class="string">"35"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">src</span>=<span class="string">"https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png"</span></span></span><br><span class="line"><span class="tag"> ></span>系统管理员</el-avatar</span><br><span class="line">></span><br><span class="line"></span><br><span class="line">// 3. 下拉选项</span><br><span class="line"><span class="tag"><<span class="name">el-dropdown-item</span> <span class="attr">icon</span>=<span class="string">"el-icon-user-solid"</span>></span> 系统管理员 <span class="tag"></<span class="name">el-dropdown-item</span>></span></span><br><span class="line"><span class="tag"><<span class="name">router-link</span> <span class="attr">to</span>=<span class="string">"/"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">el-dropdown-item</span> <span class="attr">icon</span>=<span class="string">"el-icon-house"</span>></span> Home <span class="tag"></<span class="name">el-dropdown-item</span>></span></span><br><span class="line"><span class="tag"></<span class="name">router-link</span>></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">target</span>=<span class="string">"_blank"</span> <span class="attr">href</span>=<span class="string">"https://github.com/PanJiaChen/vue-admin-template/"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">el-dropdown-item</span> <span class="attr">icon</span>=<span class="string">"el-icon-eleme"</span>></span>Github<span class="tag"></<span class="name">el-dropdown-item</span>></span></span><br><span class="line"><span class="tag"></<span class="name">a</span>></span></span><br><span class="line"><span class="tag"><<span class="name">a</span></span></span><br><span class="line"><span class="tag"> <span class="attr">target</span>=<span class="string">"_blank"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">href</span>=<span class="string">"https://panjiachen.github.io/vue-element-admin-site/#/"</span></span></span><br><span class="line"><span class="tag">></span></span><br><span class="line"> <span class="tag"><<span class="name">el-dropdown-item</span> <span class="attr">icon</span>=<span class="string">"el-icon-eleme"</span>></span>Docs<span class="tag"></<span class="name">el-dropdown-item</span>></span></span><br><span class="line"><span class="tag"></<span class="name">a</span>></span></span><br><span class="line"><span class="tag"><<span class="name">el-dropdown-item</span> <span class="attr">icon</span>=<span class="string">"el-icon-switch-button"</span> <span class="attr">divided</span> @<span class="attr">click.native</span>=<span class="string">"logout"</span>></span></span><br><span class="line"> 退出</span><br><span class="line"><span class="tag"></<span class="name">el-dropdown-item</span>></span></span><br></pre></td></tr></table></figure><p><code>src\styles\element-ui.scss</code></p><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// dropdown</span></span><br><span class="line"><span class="selector-class">.el-dropdown-menu</span> {</span><br><span class="line"> <span class="attribute">top</span>: <span class="number">45px</span> <span class="meta">!important</span>;</span><br><span class="line"> <span class="selector-tag">a</span> {</span><br><span class="line"> <span class="attribute">display</span>: block;</span><br><span class="line"> }</span><br><span class="line"> <span class="selector-tag">li</span> {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">150px</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="配置侧边栏"><a href="#配置侧边栏" class="headerlink" title="配置侧边栏"></a>配置侧边栏</h2><p>修改 <code>src\layout\components\Sidebar\index.vue</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">// 手风琴样式,永远只展开一个</span><br><span class="line">:unique-opened="true"</span><br></pre></td></tr></table></figure><h2 id="中间区域样式调整"><a href="#中间区域样式调整" class="headerlink" title="中间区域样式调整"></a>中间区域样式调整</h2><p>修改 <code>src\layout\components\AppMain.vue</code></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.app-main</span> {</span><br><span class="line"> <span class="comment">/*50 = navbar */</span></span><br><span class="line"> <span class="attribute">min-height</span>: <span class="built_in">calc</span>(<span class="number">100vh</span> - <span class="number">50px</span>);</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line"> <span class="attribute">position</span>: relative;</span><br><span class="line"> <span class="attribute">overflow</span>: hidden;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/* 改为 */</span></span><br><span class="line"><span class="selector-class">.app-main</span> {</span><br><span class="line"> <span class="comment">/*50 = navbar */</span></span><br><span class="line"> <span class="attribute">min-height</span>: <span class="number">100vh</span>; <span class="comment">/* calc(100vh - 50px); */</span></span><br><span class="line"> <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line"> <span class="attribute">position</span>: relative;</span><br><span class="line"> <span class="attribute">overflow</span>: hidden;</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#e7e8eb</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><code>src\styles\index.scss</code></p><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// main-container global css</span></span><br><span class="line"><span class="selector-class">.app-container</span> {</span><br><span class="line"> <span class="attribute">margin</span>: <span class="number">10px</span>;</span><br><span class="line"> <span class="attribute">padding</span>: <span class="number">15px</span>;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#ddd</span>;</span><br><span class="line"> <span class="attribute">background-color</span>: white;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.app-wrapper-form</span> <span class="selector-class">.app-container</span> {</span><br><span class="line"> <span class="attribute">width</span>: <span class="number">1200px</span>;</span><br><span class="line"> <span class="attribute">margin</span>: <span class="number">15px</span> auto;</span><br><span class="line"> <span class="attribute">padding</span>: <span class="number">15px</span>;</span><br><span class="line"> <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#ddd</span>;</span><br><span class="line"> <span class="attribute">background-color</span>: white;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> vue-element-admin </category>
</categories>
<tags>
<tag> vue </tag>
<tag> element </tag>
</tags>
</entry>
<entry>
<title>依赖关系注入</title>
<link href="/361e7de551a7/"/>
<url>/361e7de551a7/</url>
<content type="html"><![CDATA[<h1 id="什么是依赖关系注入?"><a href="#什么是依赖关系注入?" class="headerlink" title="什么是依赖关系注入?"></a>什么是依赖关系注入?</h1><p>依赖关系注入是控制反转 (<code>IoC</code>) 模式的专用版本,其中要反转的问题是获取所需依赖项的过程。 使用依赖关系注入时,另一个类负责在运行时将依赖项注入对象。</p><h1 id="案例"><a href="#案例" class="headerlink" title="案例"></a>案例</h1><p>记录日志功能,先记录到控制台,再记录到物理文件,对比改造过程;</p><h2 id="面向对象的实现"><a href="#面向对象的实现" class="headerlink" title="面向对象的实现"></a>面向对象的实现</h2><figure class="highlight cs"><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="keyword">public</span> <span class="keyword">class</span> <span class="title">ConsoleLogger</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Write</span>(<span class="params"><span class="built_in">string</span> msg</span>)</span></span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(msg);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Account</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Login</span>()</span></span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//登录逻辑的实现</span></span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line"> ConsoleLogger logger = <span class="keyword">new</span> ConsoleLogger();</span><br><span class="line"> logger.Write(<span class="string">"登录中的日志...."</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Logout</span>()</span></span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//登出逻辑的实现</span></span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line"> ConsoleLogger logger = <span class="keyword">new</span> ConsoleLogger();</span><br><span class="line"> logger.Write(<span class="string">"登出中的日志...."</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>改造方案:需要把所有的 <code>ConsoleLogger logger = new ConsoleLogger();</code> 替换掉<br>缺点:</p><ol><li>工作量大</li><li>重复性动作</li><li>代码改动位置多,都需要重新测试</li></ol><h2 id="面向接口-工厂模式的实现"><a href="#面向接口-工厂模式的实现" class="headerlink" title="面向接口+工厂模式的实现"></a>面向接口+工厂模式的实现</h2><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title">ILogger</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">Write</span>(<span class="params"><span class="built_in">string</span> msg</span>)</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight cs"><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="keyword">public</span> <span class="keyword">class</span> <span class="title">ConsoleLogger</span> : <span class="title">ILogger</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Write</span>(<span class="params"><span class="built_in">string</span> msg</span>)</span></span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(msg);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight cs"><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="keyword">public</span> <span class="keyword">class</span> <span class="title">LoggerFactory</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> ILogger <span class="title">CreateLogger</span>()</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> ConsoleLogger();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Account</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Login</span>()</span></span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//登录逻辑</span></span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line"> ILogger logger = LoggerFactory.CreateLogger();</span><br><span class="line"> logger.Write(<span class="string">"登录中的日志...."</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Logout</span>()</span></span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//登出逻辑</span></span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line"> ILogger logger = LoggerFactory.CreateLogger();</span><br><span class="line"> logger.Write(<span class="string">"登出中的日志...."</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>改造方案:需要把 <code>LoggerFactory.CreateLogger</code> 中的 <code>new ConsoleLogger();</code> 替换掉<br>缺点:</p><ol><li>每个类都需要实现自己的工厂模式,不利于维护</li></ol><h2 id="依赖注入实现"><a href="#依赖注入实现" class="headerlink" title="依赖注入实现"></a>依赖注入实现</h2><blockquote><p>Microsoft.Extensions.DependencyInjection</p></blockquote><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title">ILogger</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">Write</span>(<span class="params"><span class="built_in">string</span> msg</span>)</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight cs"><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="keyword">public</span> <span class="keyword">class</span> <span class="title">ConsoleLogger</span> : <span class="title">ILogger</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Write</span>(<span class="params"><span class="built_in">string</span> msg</span>)</span></span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(msg);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight cs"><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">IServiceCollection serviceCollection = <span class="keyword">new</span> ServiceCollection();</span><br><span class="line">serviceCollection.AddScoped<ILogger, ConsoleLogger>();</span><br><span class="line"><span class="keyword">using</span> (ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider())</span><br><span class="line">{</span><br><span class="line"> ILogger logger = serviceProvider.GetService<ILogger>();</span><br><span class="line"> logger.Write(<span class="string">"我是日志内容..."</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>【.Net Core 组件】log4Net 日志组件</title>
<link href="/29dc62a49406/"/>
<url>/29dc62a49406/</url>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><a href="https://logging.apache.org/log4net/release/manual/configuration.html">Log4net</a> 库是 Apache log4j 框架在 Microsoft .NET 平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。</p><p>log4net 是 Apache 软件基金会 Apache Logging Services 工程的一部分。Apache 日志服务工程致力于为程序调试和审计提供跨语言的日志服务。</p><p>官方配置文件样例:<a href="https://logging.apache.org/log4net/release/config-examples.html">https://logging.apache.org/log4net/release/config-examples.html</a></p><h1 id="日志组件-Log4net"><a href="#日志组件-Log4net" class="headerlink" title="日志组件 Log4net"></a>日志组件 Log4net</h1><h2 id="NuGet-引入程序包"><a href="#NuGet-引入程序包" class="headerlink" title="NuGet 引入程序包"></a>NuGet 引入程序包</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">log4net</span><br></pre></td></tr></table></figure><h2 id="log4net-xml-配置文件"><a href="#log4net-xml-配置文件" class="headerlink" title="log4net.xml 配置文件"></a>log4net.xml 配置文件</h2><p>ConfigFile/log4net.xml</p><p><em>提示:配置文件需要设置为 始终复制</em></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"utf-8"</span> ?></span></span><br><span class="line"><span class="tag"><<span class="name">log4net</span>></span></span><br><span class="line"><span class="tag"><<span class="name">appender</span> <span class="attr">name</span>=<span class="string">"RollingLogFileAppender"</span> <span class="attr">type</span>=<span class="string">"log4net.Appender.RollingFileAppender"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">file</span> <span class="attr">value</span>=<span class="string">"log4/"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--追加日志--></span></span><br><span class="line"><span class="tag"><<span class="name">appendToFile</span> <span class="attr">value</span>=<span class="string">"true"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--防止多线程时不能写Log,官方说线程非安全--></span></span><br><span class="line"><span class="tag"><<span class="name">lockingModel</span> <span class="attr">type</span>=<span class="string">"log4net.Appender.FileAppend+MinimalLock"</span>/></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--可为:Once|Size|Date|Composite--></span></span><br><span class="line"><span class="comment"><!--Composite为Size和Date的组合--></span></span><br><span class="line"><span class="tag"><<span class="name">rollingStyle</span> <span class="attr">value</span>=<span class="string">"Composite"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--置为true,当前最新日志文件永远为file节中的名字--></span></span><br><span class="line"><span class="tag"><<span class="name">staticLogFileName</span> <span class="attr">value</span>=<span class="string">"false"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--当备份文件时,为文件名加的后缀--></span></span><br><span class="line"><span class="tag"><<span class="name">datePattern</span> <span class="attr">value</span>=<span class="string">"yyyyMMdd'.log'"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--日志最大个数,都是最新的--></span></span><br><span class="line"><span class="comment"><!--rollingStyle节点为Size时,只能有value个日志--></span></span><br><span class="line"><span class="comment"><!--rollingStyle节点为Composite时,每天有value个日志--></span></span><br><span class="line"><span class="tag"><<span class="name">maxSizeRollBackups</span> <span class="attr">value</span>=<span class="string">"20"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--可用的单位:KB|MB|GB--></span></span><br><span class="line"><span class="tag"><<span class="name">maximumFileSize</span> <span class="attr">value</span>=<span class="string">"3MB"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">layout</span> <span class="attr">type</span>=<span class="string">"log4net.Layout.PatternLayout"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">conversionPattern</span> <span class="attr">value</span>=<span class="string">"%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"</span> /></span></span><br><span class="line"><span class="tag"></<span class="name">layout</span>></span></span><br><span class="line"><span class="tag"></<span class="name">appender</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- Setup the root category, add the appenders and set the default level --></span></span><br><span class="line"><span class="tag"><<span class="name">root</span>></span></span><br><span class="line"><span class="tag"><<span class="name">priority</span> <span class="attr">value</span>=<span class="string">"ALL"</span>/></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--></span></span><br><span class="line"><span class="comment"><!--OFF:0--></span></span><br><span class="line"><span class="comment"><!--FATAL:FATAL--></span></span><br><span class="line"><span class="comment"><!--ERROR:ERROR,FATAL--></span></span><br><span class="line"><span class="comment"><!--WARN:WARN,ERROR,FATAL--></span></span><br><span class="line"><span class="comment"><!--INFO:INFO,WARN,ERROR,FATAL--></span></span><br><span class="line"><span class="comment"><!--DE<span class="doctag">BUG:</span>DEBUG,INFO,WARN,ERROR,FATAL--></span></span><br><span class="line"><span class="comment"><!--ALL:DEBUG,INFO,WARN,ERROR,FATAL--></span></span><br><span class="line"><span class="tag"><<span class="name">level</span> <span class="attr">value</span>=<span class="string">"ALL"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"RollingLogFileAppender"</span> /></span></span><br><span class="line"><span class="tag"></<span class="name">root</span>></span></span><br><span class="line"><span class="tag"></<span class="name">log4net</span>></span></span><br></pre></td></tr></table></figure><h2 id="使配置文件生效"><a href="#使配置文件生效" class="headerlink" title="使配置文件生效"></a>使配置文件生效</h2><p><em>NuGet 中需要引用<code>Microsoft.Extensions.Logging.Log4Net.AspNetCore</code></em></p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Microsoft.Extensions.Logging.Log4Net.AspNetCore;</span><br><span class="line">builder.Logging.AddLog4Net(<span class="string">"ConfigFile/log4net.xml"</span>);</span><br></pre></td></tr></table></figure><h2 id="开始使用"><a href="#开始使用" class="headerlink" title="开始使用"></a>开始使用</h2><figure class="highlight cs"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">HomeController</span> : <span class="title">Controller</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> ILogger<HomeController> _logger;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">HomeController</span>(<span class="params">ILogger<HomeController> logger</span>)</span></span><br><span class="line"> {</span><br><span class="line"> _logger = logger;</span><br><span class="line"> _logger.LogInformation(<span class="string">$"<span class="subst">{<span class="keyword">this</span>.GetType().Name}</span> 被构造了!"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> IActionResult <span class="title">Index</span>()</span></span><br><span class="line"> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span></span><br><span class="line"> {</span><br><span class="line"> List<<span class="built_in">string</span>> list = <span class="literal">null</span>;</span><br><span class="line"> list.Add(<span class="string">"a"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Exception ex)</span><br><span class="line"> {</span><br><span class="line"> _logger.LogError(ex, <span class="string">"Index 执行报错了!"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> _logger.LogInformation(<span class="string">$"Index 被执行了!"</span>);</span><br><span class="line"> <span class="keyword">return</span> View();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="日志组件-Log4net-写入-SqlServer"><a href="#日志组件-Log4net-写入-SqlServer" class="headerlink" title="日志组件 Log4net 写入 SqlServer"></a>日志组件 Log4net 写入 SqlServer</h1><h2 id="NuGet-引入程序包-1"><a href="#NuGet-引入程序包-1" class="headerlink" title="NuGet 引入程序包"></a>NuGet 引入程序包</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">System.Data.SqlClient</span><br></pre></td></tr></table></figure><h2 id="创建日志表"><a href="#创建日志表" class="headerlink" title="创建日志表"></a>创建日志表</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> [dbo].[Log] (</span><br><span class="line"> [Id] [<span class="type">int</span>] <span class="keyword">IDENTITY</span> (<span class="number">1</span>, <span class="number">1</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line"> [<span class="type">Date</span>] [datetime] <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line"> [Thread] [<span class="type">varchar</span>] (<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line"> [Level] [<span class="type">varchar</span>] (<span class="number">50</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line"> [Logger] [<span class="type">varchar</span>] (<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line"> [Message] [<span class="type">varchar</span>] (<span class="number">4000</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line"> [Exception] [<span class="type">varchar</span>] (<span class="number">2000</span>) <span class="keyword">NULL</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><h2 id="编辑配置文件"><a href="#编辑配置文件" class="headerlink" title="编辑配置文件"></a>编辑配置文件</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">appender</span> <span class="attr">name</span>=<span class="string">"AdoNetAppender"</span> <span class="attr">type</span>=<span class="string">"log4net.Appender.AdoNetAppender"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">bufferSize</span> <span class="attr">value</span>=<span class="string">"100"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">connectionType</span> <span class="attr">value</span>=<span class="string">"System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">connectionString</span> <span class="attr">value</span>=<span class="string">"data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">commandText</span> <span class="attr">value</span>=<span class="string">"INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parameterName</span> <span class="attr">value</span>=<span class="string">"@log_date"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">dbType</span> <span class="attr">value</span>=<span class="string">"DateTime"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">layout</span> <span class="attr">type</span>=<span class="string">"log4net.Layout.RawTimeStampLayout"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">parameter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parameterName</span> <span class="attr">value</span>=<span class="string">"@thread"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">dbType</span> <span class="attr">value</span>=<span class="string">"String"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">size</span> <span class="attr">value</span>=<span class="string">"255"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">layout</span> <span class="attr">type</span>=<span class="string">"log4net.Layout.PatternLayout"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">conversionPattern</span> <span class="attr">value</span>=<span class="string">"%thread"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">layout</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">parameter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parameterName</span> <span class="attr">value</span>=<span class="string">"@log_level"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">dbType</span> <span class="attr">value</span>=<span class="string">"String"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">size</span> <span class="attr">value</span>=<span class="string">"50"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">layout</span> <span class="attr">type</span>=<span class="string">"log4net.Layout.PatternLayout"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">conversionPattern</span> <span class="attr">value</span>=<span class="string">"%level"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">layout</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">parameter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parameterName</span> <span class="attr">value</span>=<span class="string">"@logger"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">dbType</span> <span class="attr">value</span>=<span class="string">"String"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">size</span> <span class="attr">value</span>=<span class="string">"255"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">layout</span> <span class="attr">type</span>=<span class="string">"log4net.Layout.PatternLayout"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">conversionPattern</span> <span class="attr">value</span>=<span class="string">"%logger"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">layout</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">parameter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parameterName</span> <span class="attr">value</span>=<span class="string">"@message"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">dbType</span> <span class="attr">value</span>=<span class="string">"String"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">size</span> <span class="attr">value</span>=<span class="string">"4000"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">layout</span> <span class="attr">type</span>=<span class="string">"log4net.Layout.PatternLayout"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">conversionPattern</span> <span class="attr">value</span>=<span class="string">"%message"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">layout</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">parameter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parameterName</span> <span class="attr">value</span>=<span class="string">"@exception"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">dbType</span> <span class="attr">value</span>=<span class="string">"String"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">size</span> <span class="attr">value</span>=<span class="string">"2000"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">layout</span> <span class="attr">type</span>=<span class="string">"log4net.Layout.ExceptionLayout"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">parameter</span>></span></span><br><span class="line"><span class="tag"></<span class="name">appender</span>></span></span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"AdoNetAppender"</span> /></span></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> .Net Core </category>
<category> .Net Core 组件 </category>
<category> .Net Core 日志组件 </category>
</categories>
<tags>
<tag> .Net Core </tag>
</tags>
</entry>
<entry>
<title>【.Net Core 组件】Nlog 日志组件</title>
<link href="/5f884335745a/"/>
<url>/5f884335745a/</url>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><a href="https://nlog-project.org/config/">NLog</a> 是一个基于 .NET 平台编写的类库,我们可以使用 NLog 在应用程序中添加极为完善的跟踪调试代码。</p><p>NLog 是一个简单灵活的 .NET 日志记录类库。通过使用 NLog,我们可以在任何一种.NET 语言中输出带有上下文的(contextual information)调试诊断信息,根据喜好配置其表现样式之后发送到一个或多个输出目标(target)中。</p><p>NLog 的 API 非常类似于 <a href="/29dc62a49406/" title="log4net">log4net</a>,且配置方式非常简单。NLog 使用路由表(routing table)进行配置,但 log4net 却使用层次性的 appender 配置,这样就让 NLog 的配置文件非常容易阅读,并便于今后维护。</p><p>NLog 遵从 BSD license,即允许商业应用且完全开放源代码。任何人都可以免费使用并对其进行测试,然后通过邮件列表反馈问题以及建议。</p><p>NLog 支持 .NET、C/C++ 以及 COM interop API,因此我们的程序、组件、包括用 C++/COM 编写的遗留模块都可以通过同一个路由引擎将信息发送至 NLog 中。</p><p>官方配置文件样例:<a href="https://github.com/NLog/NLog/wiki">https://github.com/NLog/NLog/wiki</a></p><h1 id="日志组件-Log4net"><a href="#日志组件-Log4net" class="headerlink" title="日志组件 Log4net"></a>日志组件 Log4net</h1><h2 id="NuGet-引入程序包"><a href="#NuGet-引入程序包" class="headerlink" title="NuGet 引入程序包"></a>NuGet 引入程序包</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">NLog.Web.AspNetCore</span><br></pre></td></tr></table></figure><h2 id="Nlog-config-配置文件"><a href="#Nlog-config-配置文件" class="headerlink" title="Nlog.config 配置文件"></a>Nlog.config 配置文件</h2><p>ConfigFile/Nlog.config</p><p><em>提示:配置文件需要设置为 始终复制</em></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"utf-8"</span> ?></span></span><br><span class="line"><span class="tag"><<span class="name">nlog</span> <span class="attr">xmlns</span>=<span class="string">"http://www.nlog-project.org/schemas/NLog.xsd"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">autoReload</span>=<span class="string">"true"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">internalLogLevel</span>=<span class="string">"Info"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">internalLogFile</span>=<span class="string">"c:\temp\internal-nlog-AspNetCore.txt"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- enable asp.net core layout renderers --></span></span><br><span class="line"><span class="tag"><<span class="name">extensions</span>></span></span><br><span class="line"><span class="tag"><<span class="name">add</span> <span class="attr">assembly</span>=<span class="string">"NLog.Web.AspNetCore"</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">extensions</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- the targets to write to --></span></span><br><span class="line"><span class="tag"><<span class="name">targets</span>></span></span><br><span class="line"><span class="comment"><!-- File Target for all log messages with basic details --></span></span><br><span class="line"><span class="tag"><<span class="name">target</span> <span class="attr">xsi:type</span>=<span class="string">"File"</span> <span class="attr">name</span>=<span class="string">"allfile"</span> <span class="attr">fileName</span>=<span class="string">"Nlog\nlog-AspNetCore-all-${shortdate}.log"</span></span></span><br><span class="line"><span class="tag"><span class="attr">layout</span>=<span class="string">"${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- File Target for own log messages with extra web details using some ASP.NET core renderers --></span></span><br><span class="line"><span class="tag"><<span class="name">target</span> <span class="attr">xsi:type</span>=<span class="string">"File"</span> <span class="attr">name</span>=<span class="string">"ownFile-web"</span> <span class="attr">fileName</span>=<span class="string">"Nlog\nlog-AspNetCore-own-${shortdate}.log"</span></span></span><br><span class="line"><span class="tag"><span class="attr">layout</span>=<span class="string">"${longdate}|${event-properties:item=EventId_Id:whenEmpty=0}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}|${callsite}| body: ${aspnet-request-posted-body}"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--Console Target for hosting lifetime messages to improve Docker / Visual Studio startup detection --></span></span><br><span class="line"><span class="tag"><<span class="name">target</span> <span class="attr">xsi:type</span>=<span class="string">"Console"</span> <span class="attr">name</span>=<span class="string">"lifetimeConsole"</span> <span class="attr">layout</span>=<span class="string">"${MicrosoftConsoleLayout}"</span> /></span></span><br><span class="line"><span class="tag"></<span class="name">targets</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- rules to map from logger name to target --></span></span><br><span class="line"><span class="tag"><<span class="name">rules</span>></span></span><br><span class="line"><span class="comment"><!--All logs, including from Microsoft--></span></span><br><span class="line"><span class="tag"><<span class="name">logger</span> <span class="attr">name</span>=<span class="string">"*"</span> <span class="attr">minlevel</span>=<span class="string">"Trace"</span> <span class="attr">writeTo</span>=<span class="string">"allfile"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--Output hosting lifetime messages to console target for faster startup detection --></span></span><br><span class="line"><span class="tag"><<span class="name">logger</span> <span class="attr">name</span>=<span class="string">"Microsoft.Hosting.Lifetime"</span> <span class="attr">minlevel</span>=<span class="string">"Info"</span> <span class="attr">writeTo</span>=<span class="string">"lifetimeConsole, ownFile-web"</span> <span class="attr">final</span>=<span class="string">"true"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--Skip non-critical Microsoft logs and so log only own logs (BlackHole) --></span></span><br><span class="line"><span class="tag"><<span class="name">logger</span> <span class="attr">name</span>=<span class="string">"Microsoft.*"</span> <span class="attr">maxlevel</span>=<span class="string">"Info"</span> <span class="attr">final</span>=<span class="string">"true"</span> /></span></span><br><span class="line"><span class="tag"><<span class="name">logger</span> <span class="attr">name</span>=<span class="string">"System.Net.Http.*"</span> <span class="attr">maxlevel</span>=<span class="string">"Info"</span> <span class="attr">final</span>=<span class="string">"true"</span> /></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">logger</span> <span class="attr">name</span>=<span class="string">"*"</span> <span class="attr">minlevel</span>=<span class="string">"Trace"</span> <span class="attr">writeTo</span>=<span class="string">"ownFile-web"</span> /></span></span><br><span class="line"><span class="tag"></<span class="name">rules</span>></span></span><br><span class="line"><span class="tag"></<span class="name">nlog</span>></span></span><br></pre></td></tr></table></figure><h2 id="使配置文件生效"><a href="#使配置文件生效" class="headerlink" title="使配置文件生效"></a>使配置文件生效</h2><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">builder.Logging.AddNLog(<span class="string">"ConfigFile/Nlog.config"</span>);</span><br></pre></td></tr></table></figure><h2 id="开始使用"><a href="#开始使用" class="headerlink" title="开始使用"></a>开始使用</h2><figure class="highlight cs"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">HomeController</span> : <span class="title">Controller</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> ILogger<HomeController> _logger;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">HomeController</span>(<span class="params">ILogger<HomeController> logger</span>)</span></span><br><span class="line"> {</span><br><span class="line"> _logger = logger;</span><br><span class="line"> _logger.LogInformation(<span class="string">$"<span class="subst">{<span class="keyword">this</span>.GetType().Name}</span> 被构造了!"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> IActionResult <span class="title">Index</span>()</span></span><br><span class="line"> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span></span><br><span class="line"> {</span><br><span class="line"> List<<span class="built_in">string</span>> list = <span class="literal">null</span>;</span><br><span class="line"> list.Add(<span class="string">"a"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Exception ex)</span><br><span class="line"> {</span><br><span class="line"> _logger.LogError(ex, <span class="string">"Index 执行报错了!"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> _logger.LogInformation(<span class="string">$"Index 被执行了!"</span>);</span><br><span class="line"> <span class="keyword">return</span> View();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="日志组件-Nlog-写入-SqlServer"><a href="#日志组件-Nlog-写入-SqlServer" class="headerlink" title="日志组件 Nlog 写入 SqlServer"></a>日志组件 Nlog 写入 SqlServer</h1><h2 id="NuGet-引入程序包-1"><a href="#NuGet-引入程序包-1" class="headerlink" title="NuGet 引入程序包"></a>NuGet 引入程序包</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">System.Data.SqlClient</span><br></pre></td></tr></table></figure><h2 id="创建日志表和写入日志表的存储过程"><a href="#创建日志表和写入日志表的存储过程" class="headerlink" title="创建日志表和写入日志表的存储过程"></a>创建日志表和写入日志表的存储过程</h2><figure class="highlight sql"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> [dbo].[NLog] (</span><br><span class="line"> [ID] [<span class="type">int</span>] <span class="keyword">IDENTITY</span>(<span class="number">1</span>,<span class="number">1</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line"> [MachineName] [nvarchar](<span class="number">200</span>) <span class="keyword">NULL</span>,</span><br><span class="line"> [Logged] [datetime] <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line"> [Level] [<span class="type">varchar</span>](<span class="number">5</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line"> [Message] [nvarchar](max) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,</span><br><span class="line"> [Logger] [nvarchar](<span class="number">300</span>) <span class="keyword">NULL</span>,</span><br><span class="line"> [Properties] [nvarchar](max) <span class="keyword">NULL</span>,</span><br><span class="line"> [Callsite] [nvarchar](<span class="number">300</span>) <span class="keyword">NULL</span>,</span><br><span class="line"> [Exception] [nvarchar](max) <span class="keyword">NULL</span>,</span><br><span class="line"> <span class="keyword">CONSTRAINT</span> [PK_dbo.Log] <span class="keyword">PRIMARY</span> KEY CLUSTERED ([ID] <span class="keyword">ASC</span>)</span><br><span class="line"> <span class="keyword">WITH</span> (PAD_INDEX <span class="operator">=</span> OFF, STATISTICS_NORECOMPUTE <span class="operator">=</span> OFF, IGNORE_DUP_KEY <span class="operator">=</span> OFF, ALLOW_ROW_LOCKS <span class="operator">=</span> <span class="keyword">ON</span>, ALLOW_PAGE_LOCKS <span class="operator">=</span> <span class="keyword">ON</span>) <span class="keyword">ON</span> [<span class="keyword">PRIMARY</span>]</span><br><span class="line">) <span class="keyword">ON</span> [<span class="keyword">PRIMARY</span>] TEXTIMAGE_ON [<span class="keyword">PRIMARY</span>];</span><br><span class="line"></span><br><span class="line">GO</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> [dbo].[NLog_AddEntry_p] (</span><br><span class="line"> <span class="variable">@machineName</span> nvarchar(<span class="number">200</span>),</span><br><span class="line"> <span class="variable">@logged</span> datetime,</span><br><span class="line"> <span class="variable">@level</span> <span class="type">varchar</span>(<span class="number">5</span>),</span><br><span class="line"> <span class="variable">@message</span> nvarchar(max),</span><br><span class="line"> <span class="variable">@logger</span> nvarchar(<span class="number">300</span>),</span><br><span class="line"> <span class="variable">@properties</span> nvarchar(max),</span><br><span class="line"> <span class="variable">@callsite</span> nvarchar(<span class="number">300</span>),</span><br><span class="line"> <span class="variable">@exception</span> nvarchar(max)</span><br><span class="line">) <span class="keyword">AS</span></span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">INSERT</span> <span class="keyword">INTO</span> [dbo].[NLog] (</span><br><span class="line"> [MachineName],</span><br><span class="line"> [Logged],</span><br><span class="line"> [Level],</span><br><span class="line"> [Message],</span><br><span class="line"> [Logger],</span><br><span class="line"> [Properties],</span><br><span class="line"> [Callsite],</span><br><span class="line"> [Exception]</span><br><span class="line"> ) <span class="keyword">VALUES</span> (</span><br><span class="line"> <span class="variable">@machineName</span>,</span><br><span class="line"> <span class="variable">@logged</span>,</span><br><span class="line"> <span class="variable">@level</span>,</span><br><span class="line"> <span class="variable">@message</span>,</span><br><span class="line"> <span class="variable">@logger</span>,</span><br><span class="line"> <span class="variable">@properties</span>,</span><br><span class="line"> <span class="variable">@callsite</span>,</span><br><span class="line"> <span class="variable">@exception</span></span><br><span class="line"> );</span><br><span class="line"><span class="keyword">END</span></span><br></pre></td></tr></table></figure><h2 id="编辑配置文件"><a href="#编辑配置文件" class="headerlink" title="编辑配置文件"></a>编辑配置文件</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">target</span> <span class="attr">name</span>=<span class="string">"db"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:type</span>=<span class="string">"Database"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">connectionString</span>=<span class="string">"server=localhost;Database=*****;user id=****;password=*****"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">commandType</span>=<span class="string">"StoredProcedure"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">commandText</span>=<span class="string">"[dbo].[NLog_AddEntry_p]"</span></span></span><br><span class="line"><span class="tag"> ></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span> <span class="attr">name</span>=<span class="string">"@machineName"</span> <span class="attr">layout</span>=<span class="string">"${machinename}"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span> <span class="attr">name</span>=<span class="string">"@logged"</span> <span class="attr">layout</span>=<span class="string">"${date}"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span> <span class="attr">name</span>=<span class="string">"@level"</span> <span class="attr">layout</span>=<span class="string">"${level}"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span> <span class="attr">name</span>=<span class="string">"@message"</span> <span class="attr">layout</span>=<span class="string">"${message}"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span> <span class="attr">name</span>=<span class="string">"@logger"</span> <span class="attr">layout</span>=<span class="string">"${logger}"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span> <span class="attr">name</span>=<span class="string">"@properties"</span> <span class="attr">layout</span>=<span class="string">"${all-event-properties:separator=|}"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span> <span class="attr">name</span>=<span class="string">"@callsite"</span> <span class="attr">layout</span>=<span class="string">"${callsite}"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">parameter</span> <span class="attr">name</span>=<span class="string">"@exception"</span> <span class="attr">layout</span>=<span class="string">"${exception:tostring}"</span> /></span></span><br><span class="line"><span class="tag"></<span class="name">target</span>></span></span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"><span class="tag"><<span class="name">logger</span> <span class="attr">name</span>=<span class="string">"*"</span> <span class="attr">minlevel</span>=<span class="string">"Trace"</span> <span class="attr">writeTo</span>=<span class="string">"db"</span> /></span></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> .Net Core </category>
<category> .Net Core 组件 </category>
<category> .Net Core 日志组件 </category>
</categories>
<tags>
<tag> .Net Core </tag>
</tags>
</entry>
<entry>
<title>【.Net Core】Attribute 特性</title>
<link href="/443e1bdc4d41/"/>
<url>/443e1bdc4d41/</url>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>Attribute 在 C# 中是一个非常强大的特性,它能够给你的程序集添加元数据信息。</p><p>Attribute 实际上是一个对象,它可以与以下元素中的任何一个相关联: 程序集、类、方法、委托、枚举、事件、字段、接口、属性和结构,它会在这些对象上做信息声明,当程序运行之后,你可以通过反射来获取关联到这些对象上的 Attribute 信息,换句话说:你可以通过 Atrribute 向程序集注入一些额外信息,然后在运行时通过反射来获取,attribute 一般由 名字 + 一些可选参数 构成, attribute 名字对应着 atrribute 类。</p><h1 id="Filter-的多种注册"><a href="#Filter-的多种注册" class="headerlink" title="Filter 的多种注册"></a>Filter 的多种注册</h1><ol><li>在 Action 方法上加特性,只对当前 Action 生效</li><li>在 Controller 控制器上加特性,当前控制器下所有 Action 都生效</li><li>在程序中全局注册,整个项目都生效<figure class="highlight cs"><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">builder.Services.AddControllersWithViews(mvcOptions => {</span><br><span class="line"> mvcOptions.Filters.Add(AsyncMyLogActionFilterAttribute);</span><br><span class="line">});</span><br></pre></td></tr></table></figure></li></ol><h1 id="匿名支持"><a href="#匿名支持" class="headerlink" title="匿名支持"></a>匿名支持</h1><p>单个 Action 注册是对某一个 Action 生效</p><p>但是控制器、全局注册都是批量注册,存在“误伤”</p><p>系统提供 <code>AllowAnonymousAttribute</code>,有部分可以使用,有部分不能直接使用</p><ul><li>扩展 IResourceFilter 不能直接使用,需要扩展支持</li><li>扩展 IActionFilter 不能直接使用,需要扩展支持</li><li>扩展 IResultFilter 不能直接使用,需要扩展支持</li></ul><p>创建 <code>MyAllowAnonymousAttribute</code> 方法,继承 <code>Attribute</code></p><p>扩展方法中加入如下代码即可</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//context.ActionDescriptor.EndpointMetadata中包含当前访问的Action上或Actuion所在控制器上所有的特性</span></span><br><span class="line"><span class="keyword">if</span> (context.ActionDescriptor.EndpointMetadata.Any(x=>x.GetType().Equals(typeo(MyAllowAnonymousAttribute))))</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="Net-Core-6-框架中支持的特性"><a href="#Net-Core-6-框架中支持的特性" class="headerlink" title=".Net Core 6 框架中支持的特性"></a>.Net Core 6 框架中支持的特性</h1><a href="#">Post not found: DotNetCore/03.对于AOP多种支持</a>]]></content>
<categories>
<category> .Net Core </category>
</categories>
<tags>
<tag> .Net Core </tag>
</tags>
</entry>
<entry>
<title>【.Net Core 组件】Serilog 日志组件</title>
<link href="/4817fe5eba45/"/>
<url>/4817fe5eba45/</url>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>与许多其他 .NET 库一样,<a href="https://serilog.net/">Serilog</a> 为文件、控制台和其他位置提供诊断日志记录。它易于设置,具有干净的 API,并且可以在最近的.NET 平台之间移植。</p><p>与其他日志记录库不同,Serilog 在构建时考虑了强大的结构化事件数据。</p><p>官方配置文件样例:<a href="https://github.com/serilog/serilog-aspnetcore">https://github.com/serilog/serilog-aspnetcore</a></p><h1 id="日志组件-Serilog"><a href="#日志组件-Serilog" class="headerlink" title="日志组件 Serilog"></a>日志组件 Serilog</h1><h2 id="NuGet-引入程序包"><a href="#NuGet-引入程序包" class="headerlink" title="NuGet 引入程序包"></a>NuGet 引入程序包</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Serilog.AspNetCore</span><br></pre></td></tr></table></figure><h2 id="配置-Serilog"><a href="#配置-Serilog" class="headerlink" title="配置 Serilog"></a>配置 Serilog</h2><figure class="highlight cs"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Serilog;</span><br><span class="line"><span class="keyword">using</span> Serilog.Events;</span><br><span class="line"></span><br><span class="line">Log.Logger = <span class="keyword">new</span> LoggerConfiguration()</span><br><span class="line"> .MinimumLevel.Debug()</span><br><span class="line"> .MinimumLevel.Override(<span class="string">"Microsoft"</span>, LogEventLevel.Information)</span><br><span class="line"> .Enrich.FromLogContext()</span><br><span class="line"> .WriteTo.Console()</span><br><span class="line"> <span class="comment">// Add this line:</span></span><br><span class="line"> .WriteTo.File(</span><br><span class="line"> <span class="string">@"myapp.txt"</span>,</span><br><span class="line"> fileSizeLimitBytes: <span class="number">1</span>_000_000,</span><br><span class="line"> rollOnFileSizeLimit: <span class="literal">true</span>,</span><br><span class="line"> shared: <span class="literal">true</span>,</span><br><span class="line"> flushToDiskInterval: TimeSpan.FromSeconds(<span class="number">1</span>))</span><br><span class="line"> .CreateLogger();</span><br><span class="line"></span><br><span class="line"><span class="keyword">try</span></span><br><span class="line">{</span><br><span class="line"> Log.Information(<span class="string">"Starting web host"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> builder = WebApplication.CreateBuilder(args);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Add services to the container.</span></span><br><span class="line"> builder.Services.AddRazorPages();</span><br><span class="line"></span><br><span class="line"> builder.Services.AddLogging();</span><br><span class="line"></span><br><span class="line"> builder.Host.UseSerilog(dispose: <span class="literal">true</span>); <span class="comment">// <-- 不要漏了</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> app = builder.Build();</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Configure the HTTP request pipeline.</span></span><br><span class="line"> <span class="keyword">if</span> (!app.Environment.IsDevelopment())</span><br><span class="line"> {</span><br><span class="line"> app.UseExceptionHandler(<span class="string">"/Error"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> app.UseSerilogRequestLogging(options =></span><br><span class="line"> {</span><br><span class="line"> options.MessageTemplate = <span class="string">""</span>;</span><br><span class="line"> });</span><br><span class="line"></span><br><span class="line"> app.UseStaticFiles();</span><br><span class="line"></span><br><span class="line"> app.UseRouting();</span><br><span class="line"></span><br><span class="line"> app.UseAuthorization();</span><br><span class="line"></span><br><span class="line"> app.MapRazorPages();</span><br><span class="line"></span><br><span class="line"> app.Run();</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"><span class="keyword">catch</span> (Exception ex)</span><br><span class="line">{</span><br><span class="line"> Log.Fatal(ex, <span class="string">"Host terminated unexpectedly"</span>);</span><br><span class="line"> <span class="comment">//throw;</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">finally</span></span><br><span class="line">{</span><br><span class="line"> Log.CloseAndFlush();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="开始使用"><a href="#开始使用" class="headerlink" title="开始使用"></a>开始使用</h2><figure class="highlight cs"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">HomeController</span> : <span class="title">Controller</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> ILogger<HomeController> _logger;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">HomeController</span>(<span class="params">ILogger<HomeController> logger</span>)</span></span><br><span class="line"> {</span><br><span class="line"> _logger = logger;</span><br><span class="line"> _logger.LogInformation(<span class="string">$"<span class="subst">{<span class="keyword">this</span>.GetType().Name}</span> 被构造了!"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> IActionResult <span class="title">Index</span>()</span></span><br><span class="line"> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span></span><br><span class="line"> {</span><br><span class="line"> List<<span class="built_in">string</span>> list = <span class="literal">null</span>;</span><br><span class="line"> list.Add(<span class="string">"a"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Exception ex)</span><br><span class="line"> {</span><br><span class="line"> _logger.LogError(ex, <span class="string">"Index 执行报错了!"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> _logger.LogInformation(<span class="string">$"Index 被执行了!"</span>);</span><br><span class="line"> <span class="keyword">return</span> View();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> .Net Core </category>
<category> .Net Core 组件 </category>
<category> .Net Core 日志组件 </category>
</categories>
<tags>
<tag> .Net Core </tag>
</tags>
</entry>
<entry>
<title>【.Net Core】权限验证</title>
<link href="/ef81a220156d/"/>
<url>/ef81a220156d/</url>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><h1 id="Cookie-Session-模式下的登录验证"><a href="#Cookie-Session-模式下的登录验证" class="headerlink" title="Cookie/Session 模式下的登录验证"></a>Cookie/Session 模式下的登录验证</h1><p><code>Action</code>/<code>控制器</code>上加上特性</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[<span class="meta">Authorize</span>]</span><br><span class="line">[<span class="meta">Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)</span>]<span class="comment">//指定渠道</span></span><br></pre></td></tr></table></figure><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//使用Session</span></span><br><span class="line">builder.Services.AddSession();</span><br><span class="line"></span><br><span class="line"><span class="comment">//选择使用哪种方式来鉴权</span></span><br><span class="line">builder.Services.AddAuthentication(option =></span><br><span class="line">{</span><br><span class="line"> option.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;</span><br><span class="line"> option.DefaultChallengeScheme= CookieAuthenticationDefaults.AuthenticationScheme;</span><br><span class="line"> option.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;</span><br><span class="line"> option.DefaultForbidScheme = CookieAuthenticationDefaults.AuthenticationScheme;</span><br><span class="line"> option.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;</span><br><span class="line">})</span><br><span class="line"> .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, option =></span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//如果没有找到用户信息,鉴权失败/授权失败,则跳转到指定的Action</span></span><br><span class="line"> <span class="comment">//option.LoginPath = "/Account/Login";</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//能找到用户信息,但是Roles不匹配,则跳转到指定的Action</span></span><br><span class="line"> <span class="comment">//option.AccessDeniedPath = "/Account/AccessDenied";</span></span><br><span class="line"> });</span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">app.UseAuthentication();<span class="comment">//鉴权</span></span><br><span class="line">app.UseAuthorization();<span class="comment">//授权</span></span><br></pre></td></tr></table></figure><p>登录页面</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><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></pre></td><td class="code"><pre><span class="line"><h1>Login</h1></span><br><span class="line"></span><br><span class="line"><div class="col-md-8"></span><br><span class="line"> <section id="loginForm"></span><br><span class="line"> @using (Html.BeginForm("Login", "Account", new { ReturnUrl = Context.Request.Query["ReturnUrl"] }, FormMethod.Post, true, new { @class = "form-horizeontal", role = "form" }))</span><br><span class="line"> {</span><br><span class="line"> @Html.AntiForgeryToken()</span><br><span class="line"> <hr /></span><br><span class="line"> @Html.ValidationSummary(true)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <div class="mb-3 row"></span><br><span class="line"> @Html.Label("Name","用户名:",new {@class="col-sm-3 col-form-label"})</span><br><span class="line"> <div class="col-md-6"></span><br><span class="line"> @Html.TextBox("Name",null,new {@class="form-control", @placeholder="请输入用户名..."})</span><br><span class="line"> </div></span><br><span class="line"> </div></span><br><span class="line"></span><br><span class="line"> <div class="mb-3 row"></span><br><span class="line"> @Html.Label("Password","密码:",new {@class="col-sm-3 col-form-label"})</span><br><span class="line"> <div class="col-md-6"></span><br><span class="line"> @Html.Password("Password",null,new {@class="form-control", @placeholder="请输入密码..."})</span><br><span class="line"> </div></span><br><span class="line"> </div></span><br><span class="line"></span><br><span class="line"> <div class="mb-3 row"></span><br><span class="line"> <div class="col-md-offset-2 col-md-6"></span><br><span class="line"> <button type="submit" class="btn btn-primary mb-3">登录</button></span><br><span class="line"> @base.ViewBag.Msg</span><br><span class="line"> </div></span><br><span class="line"> </div></span><br><span class="line"> }</span><br><span class="line"> </section></span><br><span class="line"></div></span><br></pre></td></tr></table></figure><p>登录逻辑</p><figure class="highlight cs"><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></pre></td><td class="code"><pre><span class="line">[<span class="meta">HttpPost</span>]</span><br><span class="line">[<span class="meta">ValidateAntiForgeryToken</span>]</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">async</span> Task<IActionResult> <span class="title">Login</span>(<span class="params"><span class="built_in">string</span> ReturnUrl, <span class="built_in">string</span> name, <span class="built_in">string</span> password</span>)</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">if</span> (name == <span class="string">"admin"</span> && password == <span class="string">"123"</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> claims = <span class="keyword">new</span> List<Claim>() {</span><br><span class="line"> <span class="keyword">new</span> Claim(<span class="string">"UserId"</span>,<span class="string">"1"</span>),</span><br><span class="line"> <span class="keyword">new</span> Claim(ClaimTypes.Role,<span class="string">"Admin"</span>),</span><br><span class="line"> <span class="keyword">new</span> Claim(ClaimTypes.Role,<span class="string">"User"</span>),</span><br><span class="line"> <span class="keyword">new</span> Claim(ClaimTypes.Name,<span class="string">$"<span class="subst">{name}</span>---来自Cookie"</span>)</span><br><span class="line"> };</span><br><span class="line"></span><br><span class="line"> ClaimsPrincipal userPrincipal = <span class="keyword">new</span> ClaimsPrincipal(<span class="keyword">new</span> ClaimsIdentity(claims, <span class="string">"Customer"</span>));</span><br><span class="line"> <span class="comment">//过期时间:30分钟</span></span><br><span class="line"> HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal, <span class="keyword">new</span> AuthenticationProperties { ExpiresUtc = DateTime.UtcNow.AddMinutes(<span class="number">30</span>) }).Wait();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> user = HttpContext.User;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">string</span>.IsNullOrEmpty(ReturnUrl) ? <span class="keyword">base</span>.RedirectToAction(<span class="string">"Index"</span>) : <span class="keyword">base</span>.Redirect(ReturnUrl);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">base</span>.ViewBag.Msg = <span class="string">"用户名或密码错误"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> View();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="角色验证"><a href="#角色验证" class="headerlink" title="角色验证"></a>角色验证</h1><p>Roles 严格区分大小写</p><p>当前角色必须拥有<code>Admin</code> 并且 <code>User</code>,才允许访问</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[<span class="meta">Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme, Roles = <span class="string">"Admin"</span>)</span>]</span><br><span class="line">[<span class="meta">Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme, Roles = <span class="string">"User"</span>)</span>]</span><br><span class="line"><span class="function"><span class="keyword">public</span> IActionResult <span class="title">Index</span>()</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">return</span> View();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>当前角色拥有 <code>Admin</code> 或者 <code>User</code> 则允许访问</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[<span class="meta">Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme, Roles = <span class="string">"Admin,User"</span>)</span>]</span><br><span class="line"><span class="function"><span class="keyword">public</span> IActionResult <span class="title">Index</span>()</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">return</span> View();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="策略授权"><a href="#策略授权" class="headerlink" title="策略授权"></a>策略授权</h2><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[<span class="meta">Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme, Policy = <span class="string">"rolePolcy"</span>)</span>]</span><br></pre></td></tr></table></figure><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//策略授权</span></span><br><span class="line">builder.Services.AddAuthorization(options => {</span><br><span class="line"> options.AddPolicy(<span class="string">"rolePolcy"</span>, policyBuilder => {</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 1.Role</span></span><br><span class="line"> <span class="comment">//policyBuilder.RequireRole("Admin");</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//2.必须包含某个Claim</span></span><br><span class="line"> <span class="comment">//policyBuilder.RequireClaim("UserId");</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//3. 自定义</span></span><br><span class="line"> policyBuilder.RequireAssertion(handler => {</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> handler.User.HasClaim(x => x.Type == ClaimTypes.Role)</span><br><span class="line"> && handler.User.Claims.Any(x => ClaimTypes.Role.Equals(x.Type) && <span class="string">"Admin"</span>.Equals(x.Value));</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line">});</span><br></pre></td></tr></table></figure><h2 id="自定义授权"><a href="#自定义授权" class="headerlink" title="自定义授权"></a>自定义授权</h2><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//3. 自定义</span></span><br><span class="line">policyBuilder.RequireAssertion(handler => {</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> handler.User.HasClaim(x => x.Type == ClaimTypes.Role);</span><br><span class="line"> <span class="comment">//&& handler.User.Claims.Any(x => ClaimTypes.Role.Equals(x.Type) && "Vip".Equals(x.Value));</span></span><br><span class="line">});</span><br><span class="line"><span class="comment">//先验证自定义策略,再执行当前自定义的</span></span><br><span class="line">policyBuilder.AddRequirements(<span class="keyword">new</span> MyUserAuthorizationRequirement());</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line"><span class="comment">//注入</span></span><br><span class="line">builder.Services.AddTransient<IUserService, UserService>();</span><br><span class="line">builder.Services.AddTransient<IAuthorizationHandler, UserHander>();</span><br></pre></td></tr></table></figure><p>MyUserAuthorizationRequirement.cs</p><figure class="highlight cs"><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="keyword">public</span> <span class="keyword">class</span> <span class="title">MyUserAuthorizationRequirement</span>: <span class="title">IAuthorizationRequirement</span></span><br><span class="line">{</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>UserHander.cs</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">UserHander</span> : <span class="title">AuthorizationHandler</span><<span class="title">MyUserAuthorizationRequirement</span>></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> IUserService _userService;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">UserHander</span>(<span class="params">IUserService userService</span>)</span> {</span><br><span class="line"> _userService = userService;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">override</span> Task <span class="title">HandleRequirementAsync</span>(<span class="params">AuthorizationHandlerContext context, MyUserAuthorizationRequirement requirement</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> user = context.User;</span><br><span class="line"> <span class="keyword">if</span> (_userService.ValidateUser())</span><br><span class="line"> {</span><br><span class="line"> context.Succeed(requirement);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> Task.CompletedTask;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>IUserService.cs</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title">IUserService</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="built_in">bool</span> <span class="title">ValidateUser</span>()</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>UserService.cs</p><figure class="highlight cs"><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="keyword">public</span> <span class="keyword">class</span> <span class="title">UserService</span> : <span class="title">IUserService</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="built_in">bool</span> <span class="title">ValidateUser</span>()</span></span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//验证逻辑</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> .Net Core </category>
</categories>
<tags>
<tag> .Net Core </tag>
</tags>
</entry>
<entry>
<title>【.Net Core】对于 AOP 多种支持</title>
<link href="/c714b4165140/"/>
<url>/c714b4165140/</url>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程;</p><p>利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。</p><p>主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。</p><h1 id="Net-Core-对于-AOP-多种支持"><a href="#Net-Core-对于-AOP-多种支持" class="headerlink" title=".Net Core 对于 AOP 多种支持"></a>.Net Core 对于 AOP 多种支持</h1><h2 id="AuthorizeAttribute(权限验证)"><a href="#AuthorizeAttribute(权限验证)" class="headerlink" title="AuthorizeAttribute(权限验证)"></a>AuthorizeAttribute(权限验证)</h2><a href="#">Post not found: DotNetCore/05.权限验证 AuthorizeAttribute 权限验证</a><h2 id="IResourceFilter(资源缓存)"><a href="#IResourceFilter(资源缓存)" class="headerlink" title="IResourceFilter(资源缓存)"></a>IResourceFilter(资源缓存)</h2><p>Asp.Net Core 6 中提供的是 <code>IResourceFilter</code> / <code>IAsyncResourceFilter</code></p><p>用途:缓存</p><p>执行顺序:</p><ol><li>MyResourceFilterAttribute.OnResourceExecuting</li><li>执行控制器构造函数</li><li>执行 Action 方法</li><li>MyResourceFilterAttribute.OnResourceExecuted</li></ol><p>MyResourceFilterAttribute.cs</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">MyResourceFilterAttribute</span> : <span class="title">Attribute</span>, <span class="title">IResourceFilter</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Dictionary<<span class="built_in">string</span>, <span class="built_in">object</span>> cacheDictionary = <span class="keyword">new</span> Dictionary<<span class="built_in">string</span>, <span class="built_in">object</span>>();</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 在XX资源前</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="context"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><exception cref="NotImplementedException"></span><span class="doctag"></exception></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnResourceExecuting</span>(<span class="params">ResourceExecutingContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> cacheKey = context.HttpContext.Request.Path;</span><br><span class="line"> <span class="keyword">if</span> (cacheDictionary.ContainsKey(cacheKey))</span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//只要给context.Result赋值了,就会中断往后执行,直接返回结果</span></span><br><span class="line"> context.Result = cacheDictionary[cacheKey] <span class="keyword">as</span> Microsoft.AspNetCore.Mvc.IActionResult;</span><br><span class="line"> }</span><br><span class="line"> Console.WriteLine(<span class="string">"MyResourceFilterAttribute.OnResourceExecuting"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 在XX资源后</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="context"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><exception cref="NotImplementedException"></span><span class="doctag"></exception></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnResourceExecuted</span>(<span class="params">ResourceExecutedContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> cacheKey = context.HttpContext.Request.Path;</span><br><span class="line"> cacheDictionary[cacheKey] = context.Result;</span><br><span class="line"> Console.WriteLine(<span class="string">"MyResourceFilterAttribute.OnResourceExecuted"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>AsyncMyResourceFilterAttribute.cs</p><figure class="highlight cs"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">AsyncMyResourceFilterAttribute</span> : <span class="title">Attribute</span>, <span class="title">IAsyncResourceFilter</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Dictionary<<span class="built_in">string</span>, <span class="built_in">object</span>> cacheDictionary = <span class="keyword">new</span> Dictionary<<span class="built_in">string</span>, <span class="built_in">object</span>>();</span><br><span class="line"></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 在XX资源执行的时候</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="context"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="next"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><returns></span><span class="doctag"></returns></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">async</span> Task <span class="title">OnResourceExecutionAsync</span>(<span class="params">ResourceExecutingContext context, ResourceExecutionDelegate next</span>)</span></span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(<span class="string">"AsyncMyResourceFilterAttribute.OnResourceExecutionAsync.Before"</span>);</span><br><span class="line"> <span class="built_in">string</span> cacheKey = <span class="string">$"<span class="subst">{context.HttpContext.Request.Path}</span><span class="subst">{context.HttpContext.Request.QueryString}</span>"</span>;</span><br><span class="line"> <span class="keyword">if</span> (cacheDictionary.ContainsKey(cacheKey))</span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//只要给context.Result赋值了,就会中断往后执行,直接返回结果</span></span><br><span class="line"> context.Result = cacheDictionary[cacheKey] <span class="keyword">as</span> IActionResult;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> ResourceExecutedContext resource = <span class="keyword">await</span> next.Invoke();</span><br><span class="line"> cacheDictionary[cacheKey] = resource.Result;</span><br><span class="line"></span><br><span class="line"> Console.WriteLine(<span class="string">"AsyncMyResourceFilterAttribute.OnResourceExecutionAsync.After"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="IActionFilter(方法前后的记录)"><a href="#IActionFilter(方法前后的记录)" class="headerlink" title="IActionFilter(方法前后的记录)"></a>IActionFilter(方法前后的记录)</h2><p>Asp.Net Core 6 中提供的是 <code>IActionFilter</code> / <code>IAsyncActionFilter</code> / <code>ActionFilterAttribute</code></p><p>用途:记录日志</p><p>更接近 Action</p><p>执行顺序:</p><ol><li>执行控制器构造函数</li><li>执行 MyActionFilterAttribute.OnActionExecuting</li><li>执行 Action 方法</li><li>执行 MyActionFilterAttribute.OnActionExecuted</li></ol><p>MyActionFilterAttribute.cs</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">MyActionFilterAttribute</span> : <span class="title">Attribute</span>, <span class="title">IActionFilter</span></span><br><span class="line">{</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 在XXAction执行前</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="context"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnActionExecuting</span>(<span class="params">ActionExecutingContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(<span class="string">"MyActionFilterAttribute.OnActionExecuting"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 在XXAction执行后</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="context"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnActionExecuted</span>(<span class="params">ActionExecutedContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(<span class="string">"MyActionFilterAttribute.OnActionExecuted"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>记录日志</p><p>MyLogActionFilterAttribute.cs</p><figure class="highlight cs"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">MyLogActionFilterAttribute</span> : <span class="title">Attribute</span>, <span class="title">IActionFilter</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> ILogger<MyLogActionFilterAttribute> _logger;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">MyLogActionFilterAttribute</span>(<span class="params">ILogger<MyLogActionFilterAttribute> logger</span>)</span> {</span><br><span class="line"> _logger = logger;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 在XXAction执行前</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="context"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnActionExecuting</span>(<span class="params">ActionExecutingContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> param = context.HttpContext.Request.QueryString.Value;</span><br><span class="line"> <span class="keyword">var</span> controllerName = context.HttpContext.GetRouteValue(<span class="string">"controller"</span>);</span><br><span class="line"> <span class="keyword">var</span> actionName = context.HttpContext.GetRouteValue(<span class="string">"action"</span>);</span><br><span class="line"> _logger.LogInformation(<span class="string">$"<span class="subst">{controllerName}</span>/<span class="subst">{actionName}</span> 请求参数:<span class="subst">{param}</span>"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 在XXAction执行后</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="context"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnActionExecuted</span>(<span class="params">ActionExecutedContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> returnValue = System.Text.Json.JsonSerializer.Serialize(context.Result);</span><br><span class="line"> <span class="keyword">var</span> controllerName = context.HttpContext.GetRouteValue(<span class="string">"controller"</span>);</span><br><span class="line"> <span class="keyword">var</span> actionName = context.HttpContext.GetRouteValue(<span class="string">"action"</span>);</span><br><span class="line"> _logger.LogInformation(<span class="string">$"<span class="subst">{controllerName}</span>/<span class="subst">{actionName}</span> 响应参数:<span class="subst">{returnValue}</span>"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>使用方法:</p><figure class="highlight cs"><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="meta">TypeFilter(typeof(Filters.MyLogActionFilterAttribute))</span>]</span><br><span class="line"><span class="comment">//或者</span></span><br><span class="line">[<span class="meta">ServiceFilter(typeof(Filters.MyLogActionFilterAttribute))</span>]</span><br></pre></td></tr></table></figure><p>AsyncMyLogActionFilterAttribute.cs</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">AsyncMyLogActionFilterAttribute</span> : <span class="title">Attribute</span>, <span class="title">IAsyncActionFilter</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> ILogger<MyLogActionFilterAttribute> _logger;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">AsyncMyLogActionFilterAttribute</span>(<span class="params">ILogger<MyLogActionFilterAttribute> logger</span>)</span></span><br><span class="line"> {</span><br><span class="line"> _logger = logger;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">async</span> Task <span class="title">OnActionExecutionAsync</span>(<span class="params">ActionExecutingContext context, ActionExecutionDelegate next</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> controllerName = context.HttpContext.GetRouteValue(<span class="string">"controller"</span>);</span><br><span class="line"> <span class="keyword">var</span> actionName = context.HttpContext.GetRouteValue(<span class="string">"action"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> param = context.HttpContext.Request.QueryString.Value;</span><br><span class="line"> _logger.LogInformation(<span class="string">$"<span class="subst">{controllerName}</span>/<span class="subst">{actionName}</span> 请求参数:<span class="subst">{param}</span>"</span>);</span><br><span class="line"> ActionExecutedContext actionExecutedContext = <span class="keyword">await</span> next.Invoke();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> returnValue = System.Text.Json.JsonSerializer.Serialize(actionExecutedContext.Result);</span><br><span class="line"> _logger.LogInformation(<span class="string">$"<span class="subst">{controllerName}</span>/<span class="subst">{actionName}</span> 响应参数:<span class="subst">{returnValue}</span>"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="IResultFilter(结果生成前后扩展)"><a href="#IResultFilter(结果生成前后扩展)" class="headerlink" title="IResultFilter(结果生成前后扩展)"></a>IResultFilter(结果生成前后扩展)</h2><p>Asp.Net Core 6 中提供的是 <code>IActionFilter</code> / <code>IAsyncActionFilter</code>/ <code>ActionFilterAttribute</code></p><p>用途:统一返回结果</p><p>执行顺序:</p><ol><li>执行 MyResultFilterAttribute.OnResultExecuting</li><li>开始生成渲染视图内容</li><li>MyResultFilterAttribute.OnResultExecuted</li></ol><p>MyResultFilterAttribute.cs</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">MyResultFilterAttribute</span> : <span class="title">Attribute</span>, <span class="title">IResultFilter</span></span><br><span class="line">{</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 在XX结果前</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="context"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><exception cref="NotImplementedException"></span><span class="doctag"></exception></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnResultExecuting</span>(<span class="params">ResultExecutingContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(<span class="string">"MyResultFilterAttribute.OnResultExecuting"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 在XX结果后</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="context"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><exception cref="NotImplementedException"></span><span class="doctag"></exception></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnResultExecuted</span>(<span class="params">ResultExecutedContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(<span class="string">"MyResultFilterAttribute.OnResultExecuted"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>响应统一的 Json 格式</p><p>MyJsonResultFilterAttribute.cs</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">MyJsonResultFilterAttribute</span> : <span class="title">Attribute</span>, <span class="title">IResultFilter</span></span><br><span class="line">{</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 在XX结果前</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="context"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><exception cref="NotImplementedException"></span><span class="doctag"></exception></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnResultExecuting</span>(<span class="params">ResultExecutingContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (context.Result <span class="keyword">is</span> JsonResult)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> result = context.Result <span class="keyword">as</span> JsonResult;</span><br><span class="line"> context.Result = <span class="keyword">new</span> JsonResult(<span class="keyword">new</span></span><br><span class="line"> {</span><br><span class="line"> Success = <span class="literal">true</span>,</span><br><span class="line"> Message = <span class="string">"Ok"</span>,</span><br><span class="line"> Data = result.Value</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"> Console.WriteLine(<span class="string">"MyResultFilterAttribute.OnResultExecuting"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> 在XX结果后</span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"></summary></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><param name="context"></span><span class="doctag"></param></span></span></span><br><span class="line"> <span class="comment"><span class="doctag">///</span> <span class="doctag"><exception cref="NotImplementedException"></span><span class="doctag"></exception></span></span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnResultExecuted</span>(<span class="params">ResultExecutedContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>AsyncMyJsonResultFilterAttribute.cs</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">AsyncMyJsonResultFilterAttribute</span> : <span class="title">Attribute</span>, <span class="title">IAsyncResultFilter</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">async</span> Task <span class="title">OnResultExecutionAsync</span>(<span class="params">ResultExecutingContext context, ResultExecutionDelegate next</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (context.Result <span class="keyword">is</span> JsonResult)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> result = context.Result <span class="keyword">as</span> JsonResult;</span><br><span class="line"> context.Result = <span class="keyword">new</span> JsonResult(<span class="keyword">new</span></span><br><span class="line"> {</span><br><span class="line"> Success = <span class="literal">true</span>,</span><br><span class="line"> Message = <span class="string">"Ok"</span>,</span><br><span class="line"> Data = result.Value</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> ResultExecutedContext resultExecutedContext = <span class="keyword">await</span> next.Invoke();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="ActionResultFilter-(IActionFilter-IResultFilter)"><a href="#ActionResultFilter-(IActionFilter-IResultFilter)" class="headerlink" title="ActionResultFilter (IActionFilter+IResultFilter)"></a>ActionResultFilter (IActionFilter+IResultFilter)</h2><p>如果重写了异步版本,同步版本则不执行</p><p>MyActionResultFilterAttribute.cs</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">MyActionResultFilterAttribute</span> : <span class="title">ActionFilterAttribute</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">OnActionExecuting</span>(<span class="params">ActionExecutingContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">base</span>.OnActionExecuting(context);</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">OnActionExecuted</span>(<span class="params">ActionExecutedContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">base</span>.OnActionExecuted(context);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> Task <span class="title">OnActionExecutionAsync</span>(<span class="params">ActionExecutingContext context, ActionExecutionDelegate next</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">base</span>.OnActionExecutionAsync(context, next);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">OnResultExecuting</span>(<span class="params">ResultExecutingContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">base</span>.OnResultExecuting(context);</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="keyword">void</span> <span class="title">OnResultExecuted</span>(<span class="params">ResultExecutedContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">base</span>.OnResultExecuted(context);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> Task <span class="title">OnResultExecutionAsync</span>(<span class="params">ResultExecutingContext context, ResultExecutionDelegate next</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">base</span>.OnResultExecutionAsync(context, next);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="IAlwaysRun(响应结果的补充)"><a href="#IAlwaysRun(响应结果的补充)" class="headerlink" title="IAlwaysRun(响应结果的补充)"></a>IAlwaysRun(响应结果的补充)</h2><p>只要给 context.Result 赋值了,就会中断往后执行,但是依然会执行 IAlwaysRun</p><p>MyAlwaysRunAttribute.cs</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">MyAlwaysRunAttribute</span> : <span class="title">Attribute</span>, <span class="title">IAlwaysRunResultFilter</span></span><br><span class="line">{</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnResultExecuting</span>(<span class="params">ResultExecutingContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(<span class="string">"MyAlwaysRunAttribute.OnResultExecuting"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnResultExecuted</span>(<span class="params">ResultExecutedContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> Console.WriteLine(<span class="string">"MyAlwaysRunAttribute.OnResultExecuted"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="IExceptionFilter(异常处理)"><a href="#IExceptionFilter(异常处理)" class="headerlink" title="IExceptionFilter(异常处理)"></a>IExceptionFilter(异常处理)</h2><p>Asp.Net Core 6 中提供的是 <code>IExceptionFilter</code> / <code>IAsyncExceptionFilter</code></p><p>用途:处理异常</p><p>MyExceptionFilterAttribute.cs</p><figure class="highlight cs"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">MyExceptionFilterAttribute</span> : <span class="title">Attribute</span>, <span class="title">IExceptionFilter</span>, <span class="title">IAsyncExceptionFilter</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">readonly</span> IModelMetadataProvider _modelMetadataProvider;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">MyExceptionFilterAttribute</span>(<span class="params">IModelMetadataProvider modelMetadataProvider</span>)</span></span><br><span class="line"> {</span><br><span class="line"> _modelMetadataProvider = modelMetadataProvider;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">OnException</span>(<span class="params">ExceptionContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> NotImplementedException();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">async</span> Task <span class="title">OnExceptionAsync</span>(<span class="params">ExceptionContext context</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="comment">//判断异常是否被处理</span></span><br><span class="line"> <span class="keyword">if</span> (context.ExceptionHandled == <span class="literal">false</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (IsAjaxRequest(context.HttpContext.Request))</span><br><span class="line"> {</span><br><span class="line"> context.Result = <span class="keyword">new</span> JsonResult(<span class="keyword">new</span></span><br><span class="line"> {</span><br><span class="line"> Success = <span class="literal">false</span>,</span><br><span class="line"> Message = context.Exception.Message</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> ViewResult result = <span class="keyword">new</span>()</span><br><span class="line"> {</span><br><span class="line"> ViewName = <span class="string">"~/Views/Shared/Error.cshtml"</span>,</span><br><span class="line"> ViewData = <span class="keyword">new</span> ViewDataDictionary(_modelMetadataProvider, context.ModelState)</span><br><span class="line"> };</span><br><span class="line"> result.ViewData.Add(<span class="keyword">nameof</span>(context.Exception), context.Exception);</span><br><span class="line"> context.Result = result;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//判断异常为已被处理</span></span><br><span class="line"> context.ExceptionHandled = <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">await</span> Task.CompletedTask;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="built_in">bool</span> <span class="title">IsAjaxRequest</span>(<span class="params">HttpRequest request</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="built_in">string</span> header = request.Headers[<span class="string">"X-Requested-With"</span>];</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"XMLHttpRequest"</span>.Equals(header);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="异常处理的场景分析"><a href="#异常处理的场景分析" class="headerlink" title="异常处理的场景分析"></a>异常处理的场景分析</h3><ol><li>Action 出现没有处理的异常【√】</li><li>Action 出现已经处理的异常【×】</li><li>Service 层出现的异常【√】</li><li>View 绑定时出现的异常【×】</li><li>不存在的 Url 地址【×】</li><li>其他 Filter 中出现的异常<ol><li>ActionResultFilter 【√】</li><li>ResourceFilter 【×】</li><li>ResultFilter 【×】</li></ol></li><li>控制器构造函数中的异常【√】</li></ol><h3 id="使用中间件捕捉异常"><a href="#使用中间件捕捉异常" class="headerlink" title="使用中间件捕捉异常"></a>使用中间件捕捉异常</h3><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//如果Http请求中的Response中的状态不是200,就会进入/Home/Error/{0}中</span></span><br><span class="line">app.UseStatusCodePagesWithReExecute(<span class="string">"/Home/Error/{0}"</span>);</span><br><span class="line"><span class="comment">//自己拼一个Response 输出</span></span><br><span class="line">app.UseExceptionHandler(errorApp => {</span><br><span class="line"> errorApp.Run(<span class="keyword">async</span> context => {</span><br><span class="line"> context.Response.StatusCode = <span class="number">200</span>;</span><br><span class="line"> context.Response.ContentType = <span class="string">"text/html"</span>;</span><br><span class="line"> <span class="keyword">await</span> context.Response.WriteAsync(<span class="string">"<html lang=\"zh\"><body>\r\n"</span>);</span><br><span class="line"> <span class="keyword">await</span> context.Response.WriteAsync(<span class="string">"ERROR!<br><br>\r\n"</span>);</span><br><span class="line"> <span class="keyword">var</span> exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">global</span>::System.Console.WriteLine(<span class="string">"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"</span>);</span><br><span class="line"> <span class="keyword">global</span>::System.Console.WriteLine(<span class="string">$"<span class="subst">{exceptionHandlerPathFeature?.Error.Message}</span>"</span>);</span><br><span class="line"> <span class="keyword">global</span>::System.Console.WriteLine(<span class="string">"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (exceptionHandlerPathFeature?.Error <span class="keyword">is</span> FileNotFoundException)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">await</span> context.Response.WriteAsync(<span class="string">"File error thrown!<br><br>\r\n"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">await</span> context.Response.WriteAsync(<span class="string">"<a href=\"/\">Home</a><br>\r\n"</span>);</span><br><span class="line"> <span class="keyword">await</span> context.Response.WriteAsync(<span class="string">"</html></body>\r\n"</span>);</span><br><span class="line"> <span class="keyword">await</span> context.Response.WriteAsync(<span class="keyword">new</span> <span class="built_in">string</span>(<span class="string">' '</span>,<span class="number">512</span>));<span class="comment">//IE padding</span></span><br><span class="line"> });</span><br><span class="line">});</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> .Net Core </category>
<category> .Net Core AOP </category>
</categories>
<tags>
<tag> .Net Core </tag>
</tags>
</entry>
<entry>
<title>.NET Core优秀开源项目集</title>
<link href="/c63d869f3f21/"/>
<url>/c63d869f3f21/</url>
<content type="html"><![CDATA[<h1 id="微软出品的微服务应用"><a href="#微软出品的微服务应用" class="headerlink" title="微软出品的微服务应用"></a>微软出品的微服务应用</h1><p><a href="https://github.com/dotnet-architecture/eShopOnContainers">https://github.com/dotnet-architecture/eShopOnContainers</a></p><h1 id="大名鼎鼎的-ABP-应用开发框架"><a href="#大名鼎鼎的-ABP-应用开发框架" class="headerlink" title="大名鼎鼎的 ABP 应用开发框架"></a>大名鼎鼎的 ABP 应用开发框架</h1><p><a href="https://aspnetboilerplate.com/">https://aspnetboilerplate.com/</a><br><a href="https://github.com/abpframework/abp">https://github.com/abpframework/abp</a></p><h1 id="成熟稳定灵活可靠的-NOP-商城"><a href="#成熟稳定灵活可靠的-NOP-商城" class="headerlink" title="成熟稳定灵活可靠的 NOP 商城"></a>成熟稳定灵活可靠的 NOP 商城</h1><p><a href="https://github.com/nopSolutions/nopCommerce">https://github.com/nopSolutions/nopCommerce</a></p><h1 id="经典的-AOP-库-Castle-DynamicProxy"><a href="#经典的-AOP-库-Castle-DynamicProxy" class="headerlink" title="经典的 AOP 库 Castle.DynamicProxy"></a>经典的 AOP 库 Castle.DynamicProxy</h1><p><a href="https://github.com/castleproject/Core">https://github.com/castleproject/Core</a></p><h1 id="灵魂可爱的-DI-框架-Autofac"><a href="#灵魂可爱的-DI-框架-Autofac" class="headerlink" title="灵魂可爱的 DI 框架 Autofac"></a>灵魂可爱的 DI 框架 Autofac</h1><p><a href="https://github.com/autofac/Autofac">https://github.com/autofac/Autofac</a></p><h1 id="Autofac(Autofac-Extras-DynamicProxy)-爱上了-Castle-DynamicProxy"><a href="#Autofac(Autofac-Extras-DynamicProxy)-爱上了-Castle-DynamicProxy" class="headerlink" title="Autofac(Autofac.Extras.DynamicProxy) 爱上了 Castle DynamicProxy"></a>Autofac(Autofac.Extras.DynamicProxy) 爱上了 Castle DynamicProxy</h1><p><a href="https://github.com/autofac/Autofac.Extras.DynamicProxy">https://github.com/autofac/Autofac.Extras.DynamicProxy</a></p><h1 id="身份验证服务-IdentityServer4"><a href="#身份验证服务-IdentityServer4" class="headerlink" title="身份验证服务 IdentityServer4"></a>身份验证服务 IdentityServer4</h1><p><a href="https://github.com/IdentityServer/IdentityServer4">https://github.com/IdentityServer/IdentityServer4</a></p>]]></content>
</entry>
<entry>
<title>使用 WinSW 让任何 Windows 程序都能运行为服务</title>
<link href="/b995ac787057/"/>
<url>/b995ac787057/</url>
<content type="html"><![CDATA[<h1 id="WinSW-介绍"><a href="#WinSW-介绍" class="headerlink" title="WinSW 介绍"></a>WinSW 介绍</h1><p>有时候我们需要在 Windows 下开机运行某些程序,这对于有图形界面的程序来说一般不是什么事,在选项中选中开机启动,然后它们就可以自动运行了。但是如果我们想运行一些命令行程序的话就没这么方便了。</p><p>其实 Windows 自带了一个后台程序管理的功能,就是我们经常用到的服务。但是 Windows 的服务只有程序的开发者在写程序的时候引用到这个功能,我们才能利用服务来控制程序的启动和关闭。对于一般的命令行程序来说,没办法利用服务。所以今天我们就来使用一下标题的这个 <a href="https://github.com/winsw/winsw">WinSW</a>。它可以将 Windows 上的任何一个程序注册为服务,如果不需要,也可以方便的卸载服务。</p><h1 id="使用-WinSW"><a href="#使用-WinSW" class="headerlink" title="使用 WinSW"></a>使用 WinSW</h1><h2 id="下载"><a href="#下载" class="headerlink" title="下载"></a>下载</h2><p>首先要下载 WinSW。它是一个单个的可执行文件,我们到 <a href="https://github.com/dotnetcore/FastGithub/releases">Github release</a> 这里就可以下载 WinSW 了。一般来说当然是下载最新的。WinSW 可以运行在 .NET2 和 .NET4 两个版本上,当然如果使用 Win10 等比较新的系统,最好下载更新版本的 .NET。</p><p>下载地址:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://github.com/dotnetcore/FastGithub/releases</span><br></pre></td></tr></table></figure><h2 id="编写配置文件"><a href="#编写配置文件" class="headerlink" title="编写配置文件"></a>编写配置文件</h2><p>创建 WinSW.xml,内容是:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">service</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>frp<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>frp这里是服务的名称<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">description</span>></span>这里是服务的介绍,随便写<span class="tag"></<span class="name">description</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">executable</span>></span>frpc<span class="tag"></<span class="name">executable</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">arguments</span>></span>-c frpc.ini<span class="tag"></<span class="name">arguments</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">onfailure</span> <span class="attr">action</span>=<span class="string">"restart"</span> <span class="attr">delay</span>=<span class="string">"60 sec"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">onfailure</span> <span class="attr">action</span>=<span class="string">"restart"</span> <span class="attr">delay</span>=<span class="string">"120 sec"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">logmode</span>></span>reset<span class="tag"></<span class="name">logmode</span>></span></span><br><span class="line"><span class="tag"></<span class="name">service</span>></span></span><br></pre></td></tr></table></figure><p><em>注意:xml 配置文件名称要和下载的 WinSW 程序文件名称相同!</em></p><h2 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">#注册服务</span><br><span class="line">.\winsw install</span><br><span class="line"></span><br><span class="line">#卸载服务</span><br><span class="line">.\winsw uninstall</span><br><span class="line"></span><br><span class="line">#运行服务</span><br><span class="line">.\winsw start</span><br><span class="line"></span><br><span class="line">#停止服务</span><br><span class="line">.\winsw stop</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>Windows 下基于 frp 的内网穿透部署</title>
<link href="/19ea014a3b27/"/>
<url>/19ea014a3b27/</url>
<content type="html"><![CDATA[<h1 id="frp-是什么"><a href="#frp-是什么" class="headerlink" title="frp 是什么"></a>frp 是什么</h1><p>frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。</p><h1 id="为什么使用-frp-?"><a href="#为什么使用-frp-?" class="headerlink" title="为什么使用 frp ?"></a>为什么使用 frp ?</h1><p>通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:</p><ul><li>客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。</li><li>采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。</li><li>代理组间的负载均衡。</li><li>端口复用,多个服务通过同一个服务端端口暴露。</li><li>多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。</li><li>高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。</li><li>服务端和客户端 UI 页面。</li></ul><h1 id="部署步骤"><a href="#部署步骤" class="headerlink" title="部署步骤"></a>部署步骤</h1><p>从 frp 的架构可以看出 frp 的工作流程,在服务端部署 frps,在要访问的机器上部署 frpc,实现服务端对该机器的反向代理。通过访问服务端来实现对该机器的远程访问。<br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://raw.githubusercontent.com/fatedier/frp/master/doc/pic/architecture.png" alt="architecture.png"></p><h1 id="部署环境"><a href="#部署环境" class="headerlink" title="部署环境"></a>部署环境</h1><p>在 github frp 的 <a href="https://github.com/fatedier/frp/releases">releases</a> 下载最新的代码</p><p>releases 地址:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://github.com/fatedier/frp/releases</span><br></pre></td></tr></table></figure><h1 id="服务端"><a href="#服务端" class="headerlink" title="服务端"></a>服务端</h1><p>修改服务端的部署文件 <code>frps.ini</code></p><figure class="highlight ini"><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="section">[common]</span></span><br><span class="line"><span class="attr">bind_addr</span> = <span class="number">0.0</span>.<span class="number">0.0</span></span><br><span class="line"><span class="attr">bind_port</span> = <span class="number">7000</span></span><br><span class="line"></span><br><span class="line"><span class="attr">dashboard_user</span> = xxxxx <span class="comment">#监控的用户名</span></span><br><span class="line"><span class="attr">dashboard_pwd</span> = xxxxxx <span class="comment">#监控的密码</span></span><br><span class="line"><span class="attr">dashboard_port</span> = <span class="number">7500</span></span><br></pre></td></tr></table></figure><p>将 frps.ini 及 frps.exe 上传到公网机器上,以管理员的身份 cmd 到其目录下,运行如下的命令</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">frps -c frps.ini</span><br></pre></td></tr></table></figure><p><em>ps:记得开发服务器的 7000 和 7500 端口!</em></p><h1 id="客户端"><a href="#客户端" class="headerlink" title="客户端"></a>客户端</h1><p>修改客户端的部署文件 <code>frpc.ini</code></p><figure class="highlight ini"><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="section">[common]</span></span><br><span class="line"><span class="attr">server_addr</span> = xx.xx.xx.xx <span class="comment">#你的公网机器的ip地址</span></span><br><span class="line"><span class="attr">server_port</span> = <span class="number">7000</span></span><br><span class="line"></span><br><span class="line"><span class="section">[ssh]</span></span><br><span class="line"><span class="attr">type</span> = tcp</span><br><span class="line"><span class="attr">local_ip</span> = <span class="number">127.0</span>.<span class="number">0.1</span></span><br><span class="line"><span class="attr">local_port</span> = <span class="number">3389</span></span><br><span class="line"><span class="attr">remote_port</span> = <span class="number">6000</span></span><br></pre></td></tr></table></figure><p>将 frpc.ini 及 frpc.exe 放到本地机器上,以管理员的身份 cmd 到其目录下,运行如下的命令</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">frpc -c frpc.ini</span><br></pre></td></tr></table></figure><p><em>ps:服务器端对应的端口也要打开,然后这个 cmd 窗口不能关,不然服务就终止了,这个是下面开机自启动要解决的问题。为了支持远程访问,windows 下的允许远程访问要打开。</em></p><h1 id="下载"><a href="#下载" class="headerlink" title="下载"></a>下载</h1><p><a href="/DownLoad/Tools/frps.zip">下载服务端</a>丨<a href="/DownLoad/Tools/frpc.zip">下载客户端</a></p><h1 id="开机自启动"><a href="#开机自启动" class="headerlink" title="开机自启动"></a>开机自启动</h1><a href="/b995ac787057/" title="使用 WinSW 让任何 Windows 程序都能运行为服务">使用 WinSW 让任何 Windows 程序都能运行为服务</a>]]></content>
</entry>
<entry>
<title>vue-cli安装教程</title>
<link href="/ac7780bbf330/"/>
<url>/ac7780bbf330/</url>
<content type="html"><![CDATA[<h1 id="vue-cli-安装教程"><a href="#vue-cli-安装教程" class="headerlink" title="vue-cli 安装教程"></a>vue-cli 安装教程</h1><ol><li>安装 cnpm</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g cnpm --registry=https://registry.npm.taobao.org</span><br></pre></td></tr></table></figure><ol start="2"><li>安装 vue-cli</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cnpm install vue-cli -g</span><br></pre></td></tr></table></figure><ol start="3"><li>初始化项目</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vue init webpack 项目名称</span><br></pre></td></tr></table></figure><ol start="4"><li>进入到项目目录,安装模块包</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cnpm install</span><br></pre></td></tr></table></figure><ol start="5"><li>启动项目</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cnpm run dev</span><br></pre></td></tr></table></figure><ol start="6"><li>发布项目</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cnpm run build</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> vue </category>
</categories>
<tags>
<tag> vue </tag>
</tags>
</entry>
<entry>
<title>新浪图床-上传图片脚本</title>
<link href="/53c96edf2a9c/"/>
<url>/53c96edf2a9c/</url>
<content type="html"><![CDATA[<h1 id="说在前面"><a href="#说在前面" class="headerlink" title="说在前面"></a>说在前面</h1><p>新浪图床是利用微博的接口上传到 sina 的服务器,自带全球 cdn 且没有流量限制,永久使用,已经稳定运行 5 年以上,成为站长的可靠选择。</p><h1 id="防盗链检测"><a href="#防盗链检测" class="headerlink" title="防盗链检测"></a>防盗链检测</h1><p><a href="https://tva1.sinaimg.cn/large/005Q9Qt9gy1gt8l8fb88aj613z0p079b02.jpg">https://tva1.sinaimg.cn/large/005Q9Qt9gy1gt8l8fb88aj613z0p079b02.jpg</a><br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://tva1.sinaimg.cn/large/005Q9Qt9gy1gt8l8fb88aj613z0p079b02.jpg" alt="https://tva1.sinaimg.cn/large/005Q9Qt9gy1gt8l8fb88aj613z0p079b02.jpg"></p><p><a href="https://tva2.sinaimg.cn/large/005Q9Qt9gy1gt8l8fb88aj613z0p079b02.jpg">https://tva2.sinaimg.cn/large/005Q9Qt9gy1gt8l8fb88aj613z0p079b02.jpg</a><br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://tva2.sinaimg.cn/large/005Q9Qt9gy1gt8l8fb88aj613z0p079b02.jpg" alt="https://tva2.sinaimg.cn/large/005Q9Qt9gy1gt8l8fb88aj613z0p079b02.jpg"></p><p><a href="https://i0.hdslb.com/bfs/album/ef3c9a498dca6ec16eef5cc84ab441905657376f.jpg">https://i0.hdslb.com/bfs/album/ef3c9a498dca6ec16eef5cc84ab441905657376f.jpg</a><br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://i0.hdslb.com/bfs/album/ef3c9a498dca6ec16eef5cc84ab441905657376f.jpg" alt="https://i0.hdslb.com/bfs/album/ef3c9a498dca6ec16eef5cc84ab441905657376f.jpg"></p><h1 id="图片尺寸"><a href="#图片尺寸" class="headerlink" title="图片尺寸"></a>图片尺寸</h1><p>图片尺寸可供选择:square、thumb150、orj360、orj480、mw690、mw1024、mw2048、small、bmiddle、large</p><h1 id="Cookie"><a href="#Cookie" class="headerlink" title="Cookie"></a>Cookie</h1><p>请求携带的 Cookie,是需要 <code>SUB</code> 即可</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SUB=_2A25MCvP_DeRhGeNN7lMS-C7OzDWIHXVv9J23rDV6PUJbktB-LW79kW1NSZalCW3YlWBr9ppYz3o26-OycVDHbTcP</span><br></pre></td></tr></table></figure><h1 id="校验-Cookie"><a href="#校验-Cookie" class="headerlink" title="校验 Cookie"></a>校验 Cookie</h1><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> url = <span class="string">"https://rm.api.weibo.com/2/remind/push_count.json?with_push_settings=1&trim_null=1&with_dm_group=0&with_settings=1&exclude_attitude=1&with_common_cmt=1&with_comment_attitude=1&with_common_attitude=1&with_moments=1&with_dm_unread=1&msgbox=true&with_page_group=1&with_chat_group=1&with_chat_group_notice=1&_pid=1&count=4&source=351354573&status_type=0&callback=STK_162834008316744"</span>;</span><br><span class="line">HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);</span><br><span class="line"></span><br><span class="line">request.Method = <span class="string">"GET"</span>;</span><br><span class="line">request.Headers.Add(<span class="string">"Cookie"</span>, <span class="string">"SUB=_2A25MCvP_DeRhGeNN7lMS-C7OzDWIHXVv9J23rDV6PUJbktB-LW79kW1NSZalCW3YlWBr9ppYz3o26-OycVDHbTcP"</span>);</span><br><span class="line">HttpWebResponse response = (HttpWebResponse)request.GetResponse();</span><br><span class="line"><span class="keyword">using</span> (StreamReader reader = <span class="keyword">new</span> StreamReader(response.GetResponseStream(), Encoding.UTF8))</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">var</span> str = reader.ReadToEnd();</span><br><span class="line"> Console.WriteLine(str);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> str;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>校验成功样例</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span> {</span><br><span class="line"> <span class="title function_">STK_162834008316744</span>({</span><br><span class="line"> <span class="attr">code</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="attr">data</span>: {</span><br><span class="line"> <span class="attr">dm_unread</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="attr">dm</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="attr">message_flow_unaggregate</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="attr">pc_viedo</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="attr">status_24unread</span>: <span class="number">100</span>,</span><br><span class="line"> <span class="attr">message_flow_unaggr_wild_card</span>: <span class="number">21</span>,</span><br><span class="line"> <span class="attr">message_flow_follow</span>: <span class="number">22</span>,</span><br><span class="line"> <span class="attr">double_flow</span>: <span class="number">30</span>,</span><br><span class="line"> <span class="attr">dm_pc</span>: <span class="number">24</span>,</span><br><span class="line"> <span class="attr">dm_total</span>: <span class="number">24</span>,</span><br><span class="line"> <span class="attr">msgbox_schemeitem</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="attr">remind_settings</span>: {},</span><br><span class="line"> <span class="attr">status</span>: <span class="number">2</span>,</span><br><span class="line"> <span class="attr">app_message</span>: [],</span><br><span class="line"> <span class="attr">total_unread</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="attr">messages</span>: <span class="number">24</span>,</span><br><span class="line"> <span class="attr">push_settings</span>: { <span class="attr">groupchatNotifyReceive</span>: <span class="number">2</span>, <span class="attr">groupchatNotifyPush</span>: <span class="number">2</span> },</span><br><span class="line"> },</span><br><span class="line"> });</span><br><span class="line">} <span class="keyword">catch</span> (e) {}</span><br></pre></td></tr></table></figure><h1 id="图片上传-Base64"><a href="#图片上传-Base64" class="headerlink" title="图片上传-Base64"></a>图片上传-Base64</h1><figure class="highlight csharp"><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></pre></td><td class="code"><pre><span class="line"> <span class="keyword">var</span> url = <span class="string">"https://picupload.weibo.com/interface/pic_upload.php?data=base64&p=1"</span>;</span><br><span class="line"> HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);</span><br><span class="line"></span><br><span class="line"> request.Method = <span class="string">"POST"</span>;</span><br><span class="line"> request.ContentType = <span class="string">"multipart/form-data; boundary=----WebKitFormBoundaryamXBwD6LQvBO5bnb"</span>;</span><br><span class="line"> request.Headers.Add(<span class="string">"Cookie"</span>, <span class="string">"SUB=_2A25MCvP-DeRhGeNN7lMS-C7OzDWIHXVv9J22rDV_PUNbm9B-LXbHkW1NSZalCYNoeEZs8JG77NgUsmQin2r2c5EZ"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">using</span> (Stream stream = request.GetRequestStream())</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> data = <span class="string">@"------WebKitFormBoundaryamXBwD6LQvBO5bnb</span></span><br><span class="line"><span class="string">Content-Disposition: form-data; name=""b64_data""</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAABAAEDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9ZKKKK/TD8fP/2Q==</span></span><br><span class="line"><span class="string">------WebKitFormBoundaryamXBwD6LQvBO5bnb--</span></span><br><span class="line"><span class="string">"</span>;</span><br><span class="line"> <span class="built_in">byte</span>[] trailer = Encoding.ASCII.GetBytes(data);</span><br><span class="line"> stream.Write(trailer, <span class="number">0</span>, trailer.Length);</span><br><span class="line"></span><br><span class="line"> stream.Close();</span><br><span class="line"> }</span><br><span class="line"> HttpWebResponse response = (HttpWebResponse)request.GetResponse();</span><br><span class="line"> <span class="keyword">using</span> (StreamReader reader = <span class="keyword">new</span> StreamReader(response.GetResponseStream(), Encoding.UTF8))</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> str = reader.ReadToEnd();</span><br><span class="line"> Console.WriteLine(str);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> str;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><p>输出样例</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"code"</span><span class="punctuation">:</span> <span class="string">"A00006"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"data"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"count"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"data"</span><span class="punctuation">:</span> <span class="string">"eyJ1aWQiOjUzNTEzODAyNzksImFwcCI6Im1pbmlibG9nIiwiY291bnQiOjEsInRpbWUiOjE2MjgzNDU4MDYuMjU0LCJwaWNzIjp7InBpY18xIjp7IndpZHRoIjoxLCJzaXplIjoyODgsInJldCI6MSwiaGVpZ2h0IjoxLCJuYW1lIjoicGljXzEiLCJwaWQiOiIwMDVROVF0OWd5MWd0OGwzaWZxYzRqMzAwMTAwMTA4MCJ9fX0="</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"pics"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"pic_1"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"width"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"size"</span><span class="punctuation">:</span> <span class="number">288</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"ret"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"height"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"pic_1"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"pid"</span><span class="punctuation">:</span> <span class="string">"005Q9Qt9gy1gt8l3ifqc4j3001001080"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure><h1 id="图片上传-二进制流"><a href="#图片上传-二进制流" class="headerlink" title="图片上传-二进制流"></a>图片上传-二进制流</h1><figure class="highlight csharp"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> url = <span class="string">"https://picupload.weibo.com/interface/pic_upload.php?data=1&p=1"</span>;</span><br><span class="line">HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);</span><br><span class="line"></span><br><span class="line">request.Method = <span class="string">"POST"</span>;</span><br><span class="line">request.ContentType = <span class="string">"multipart/form-data"</span>;</span><br><span class="line">request.Headers.Add(<span class="string">"Cookie"</span>, <span class="string">"SUB=_2A25MCvP-DeRhGeNN7lMS-C7OzDWIHXVv9J22rDV_PUNbm9B-LXbHkW1NSZalCYNoeEZs8JG77NgUsmQin2r2c5EZ"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> (Stream stream = request.GetRequestStream())</span><br><span class="line">{</span><br><span class="line"> <span class="comment">//文件流</span></span><br><span class="line"> FileStream fsRead = <span class="keyword">new</span> FileStream(<span class="string">@"test.jpg"</span>, FileMode.Open);</span><br><span class="line"> <span class="built_in">int</span> fsLen = (<span class="built_in">int</span>)fsRead.Length;</span><br><span class="line"> <span class="built_in">byte</span>[] heByte = <span class="keyword">new</span> <span class="built_in">byte</span>[fsLen];</span><br><span class="line"> fsRead.Read(heByte, <span class="number">0</span>, heByte.Length);</span><br><span class="line"> fsRead.Close();</span><br><span class="line"> fsRead.Dispose();</span><br><span class="line"> stream.Write(heByte, <span class="number">0</span>, heByte.Length);</span><br><span class="line"></span><br><span class="line"> stream.Close();</span><br><span class="line">}</span><br><span class="line">HttpWebResponse response = (HttpWebResponse)request.GetResponse();</span><br><span class="line"><span class="keyword">using</span> (StreamReader reader = <span class="keyword">new</span> StreamReader(response.GetResponseStream(), Encoding.UTF8))</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">var</span> str = reader.ReadToEnd();</span><br><span class="line"> Console.WriteLine(str);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> str;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>输出样例</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"code"</span><span class="punctuation">:</span> <span class="string">"A00006"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"data"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"count"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"data"</span><span class="punctuation">:</span> <span class="string">"eyJ1aWQiOjUzNTEzODAyNzksImFwcCI6Im1pbmlibG9nIiwiY291bnQiOjEsInRpbWUiOjE2MjgzNDU4OTAuMjU5LCJwaWNzIjp7InBpY18xIjp7IndpZHRoIjoyLCJzaXplIjoyOTIsInJldCI6MSwiaGVpZ2h0IjoxLCJuYW1lIjoicGljXzEiLCJwaWQiOiIwMDVROVF0OWd5MWd0OGw0eXZ1NGFqMzAwMjAwMTA4NCJ9fX0="</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"pics"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"pic_1"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"width"</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"size"</span><span class="punctuation">:</span> <span class="number">292</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"ret"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"height"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"pic_1"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"pid"</span><span class="punctuation">:</span> <span class="string">"005Q9Qt9gy1gt8l4yvu4aj3002001084"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> 新浪图床 </category>
</categories>
<tags>
<tag> 新浪图床 </tag>
</tags>
</entry>
<entry>
<title>asp.net权限认证:Forms认证</title>
<link href="/c4f30bfc211c/"/>
<url>/c4f30bfc211c/</url>
<content type="html"><![CDATA[<h2 id="写在前面"><a href="#写在前面" class="headerlink" title="写在前面"></a>写在前面</h2><h2 id="Forms-认证示意图"><a href="#Forms-认证示意图" class="headerlink" title="Forms 认证示意图"></a>Forms 认证示意图</h2><p>Forms 认证即是表单认证,需提供身份 id 和密码 password 的进行认证和授权管理。</p><p>下面看看他的工作方式:</p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://raw.githubusercontent.com/l-ff/cdn.img/master/Images/202107/01.png" alt="Forms认证示意图"></p><h2 id="新建项目"><a href="#新建项目" class="headerlink" title="新建项目"></a>新建项目</h2><p>创建一个 ASP.NET WEB 项目,勾选 MVC 和 WEB API</p><p><em>本案例使用的 MVC4 框架演示</em></p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://raw.githubusercontent.com/l-ff/cdn.img/master/Images/202107/02.png" alt="创建 ASP.NET WEB 项目"></p><p>打开 <a href="http://localhost:54125/">http://localhost:54125/</a>,效果图:</p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://raw.githubusercontent.com/l-ff/cdn.img/master/Images/202107/04.png" alt="效果图"></p><p>Look,页面没有做任何权限控制,显示正常。</p><p>接下来给 <code>HomeController/Index</code> 加上 <code>[Authorize]</code> 特性</p><figure class="highlight csharp"><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="keyword">public</span> <span class="keyword">class</span> <span class="title">HomeController</span> : <span class="title">Controller</span></span><br><span class="line">{</span><br><span class="line"> [<span class="meta">Authorize</span>]</span><br><span class="line"> <span class="function"><span class="keyword">public</span> ActionResult <span class="title">Index</span>()</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> View();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ul><li><code>[Authorize]</code>:指定对控制器或操作方法的访问只限于满足授权要求的用户。</li><li><code>[AllowAnonymous]</code>:表示一个特性,该特性用于标记在授权期间要跳过 System.Web.Mvc.AuthorizeAttribute 的控制器和操作。</li></ul><p>访问 <a href="http://localhost:54125/">http://localhost:54125/</a></p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://raw.githubusercontent.com/l-ff/cdn.img/master/Images/202107/03.png" alt="抛出异常 HTTP Error 401.0 - Unauthorized"></p><p>站点抛出异常 <code>HTTP Error 401.0 - Unauthorized</code></p><p>提示我们没有查看权限,因为我们在上面给 <code>Index</code> 设置了权限认证</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[<span class="meta">Authorize</span>]</span><br><span class="line"><span class="function"><span class="keyword">public</span> ActionResult <span class="title">Index</span>()</span></span><br></pre></td></tr></table></figure><h2 id="配置登录页"><a href="#配置登录页" class="headerlink" title="配置登录页"></a>配置登录页</h2><p>正常情况下,我们是不会抛出 <code>401.01</code> 黄页的</p><p>如果用户没有查看权限,我们会要求用户返回登录页完成认证操作</p><p>在 <code>Web.Config</code> 中启用 Forms 身份验证,并设置登录地址为 <code>~/Home/Login</code></p><p>在 <code>system.web</code> 节点中添加</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!-- 配置 Forms 身份认证 不允许匿名用户访问,否则跳转到 /Home/Login 页面 --></span></span><br><span class="line"><span class="tag"><<span class="name">authentication</span> <span class="attr">mode</span>=<span class="string">"Forms"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">forms</span> <span class="attr">loginUrl</span>=<span class="string">"~/Home/Login"</span> <span class="attr">timeout</span>=<span class="string">"2880"</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">authentication</span>></span></span><br></pre></td></tr></table></figure><p>记得在 <code>Home</code> 控制器中添加 <code>Login</code> 登录页面</p><figure class="highlight csharp"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> ActionResult <span class="title">Login</span>()</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">return</span> View();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">[<span class="meta">HttpPost</span>]</span><br><span class="line"><span class="function"><span class="keyword">public</span> ActionResult <span class="title">Login</span>(<span class="params"><span class="built_in">string</span> returnUrl</span>)</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">if</span> (Request.HttpMethod == <span class="string">"POST"</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> userName = Request[<span class="string">"userName"</span>];</span><br><span class="line"> <span class="keyword">var</span> passWord = Request[<span class="string">"passWord"</span>];</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (userName == <span class="string">"admin"</span> && passWord == <span class="string">"123"</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> ticket = <span class="keyword">new</span> FormsAuthenticationTicket(</span><br><span class="line"> <span class="number">1</span>,</span><br><span class="line"> userName,</span><br><span class="line"> DateTime.Now,</span><br><span class="line"> DateTime.Now.AddMinutes(<span class="number">20</span>),</span><br><span class="line"> <span class="literal">true</span>,</span><br><span class="line"> <span class="string">"role1,role2,role3"</span>,</span><br><span class="line"> <span class="string">"/"</span></span><br><span class="line"> );</span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> cookie = <span class="keyword">new</span> HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket))</span><br><span class="line"> {</span><br><span class="line"> HttpOnly = <span class="literal">true</span></span><br><span class="line"> };</span><br><span class="line"></span><br><span class="line"> HttpContext.Response.Cookies.Add(cookie);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">string</span>.IsNullOrEmpty(returnUrl))</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> RedirectToAction(<span class="string">"Index"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> Redirect(returnUrl);</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"> ViewBag.ReturnUrl = returnUrl;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> View();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><code>Index.cshtml</code> 视图</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></pre></td><td class="code"><pre><span class="line">@{ Layout = null; }</span><br><span class="line"></span><br><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"></span><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">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Login<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">h1</span>></span>Login<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">form</span> <span class="attr">method</span>=<span class="string">"post"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">table</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>userName<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">input</span> <span class="attr">name</span>=<span class="string">"userName"</span> <span class="attr">value</span>=<span class="string">"admin"</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>passWord<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">input</span> <span class="attr">type</span>=<span class="string">"password"</span> <span class="attr">name</span>=<span class="string">"passWord"</span> <span class="attr">value</span>=<span class="string">"123"</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 class="tag"><<span class="name">button</span> <span class="attr">type</span>=<span class="string">"submit"</span>></span>登录<span class="tag"></<span class="name">button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">form</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>好的,我们在访问一下 <a href="http://localhost:54125/">http://localhost:54125/</a></p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://raw.githubusercontent.com/l-ff/cdn.img/master/Images/202107/05.png" alt="跳转登录页"></p><p>如期跳转至认证页面!点击登录按钮,认证成功的话会跳回首页</p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://raw.githubusercontent.com/l-ff/cdn.img/master/Images/202107/04.png" alt="认证成功回到首页"></p><p>好了,如愿显示!至此,简单权限认证完成了。</p><h2 id="添加角色功能"><a href="#添加角色功能" class="headerlink" title="添加角色功能"></a>添加角色功能</h2><p>前边只是做了简单的登录认证,如果项目要求权限的认证粒度比较细的话,就不能满足了。</p><p><code>IndexNeedRole4</code> 只对某 <code>role4</code> 开放</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[<span class="meta">MyAuthorize(Roles = <span class="string">"role4"</span>)</span>]</span><br><span class="line"><span class="function"><span class="keyword">public</span> ActionResult <span class="title">IndexNeedRole4</span>()</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">return</span> View();</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>我们需要新建用于验证角色和用户名的 <code>Authorize</code> 特性:<code>MyAuthorize</code></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">MyAuthorizeAttribute</span> : <span class="title">AuthorizeAttribute</span></span><br><span class="line">{</span><br><span class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">override</span> <span class="built_in">bool</span> <span class="title">AuthorizeCore</span>(<span class="params">System.Web.HttpContextBase httpContext</span>)</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">var</span> cookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];</span><br><span class="line"> <span class="keyword">var</span> ticket = FormsAuthentication.Decrypt(cookie.Value);</span><br><span class="line"> <span class="keyword">var</span> roles = ticket.UserData;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">var</span> inRoles = <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">foreach</span> (<span class="keyword">var</span> role <span class="keyword">in</span> roles.Split(<span class="string">','</span>))</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (Roles.Contains(role))</span><br><span class="line"> {</span><br><span class="line"> inRoles = <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> inRoles;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>代码加好了,我们再试试:<a href="http://localhost:54125/Home/IndexNeedRole4">http://localhost:54125/Home/IndexNeedRole4</a></p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://raw.githubusercontent.com/l-ff/cdn.img/master/Images/202107/06.png" alt="访问 /Home/IndexNeedRole4"></p><p>返回正常,回到了权限认证界面。</p><p>点击登录,发现这个页面只是刷新了,所有 <code>input</code> 都清空了</p><p>这是正常的,因为在 <code>Home/Login</code> 里边登录逻辑的 <code>ticket</code> 角色只赋值了 <code>role1,role2,role3</code></p><p>加上 <code>role4</code></p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">···</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (userName == <span class="string">"admin"</span> && passWord == <span class="string">"123"</span>)</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">var</span> ticket = <span class="keyword">new</span> FormsAuthenticationTicket(</span><br><span class="line"> <span class="number">1</span>,</span><br><span class="line"> userName,</span><br><span class="line"> DateTime.Now,</span><br><span class="line"> DateTime.Now.AddMinutes(<span class="number">20</span>),</span><br><span class="line"> <span class="literal">true</span>,</span><br><span class="line"> <span class="string">"role1,role2,role3,role4"</span>, <span class="comment">//加上 role4</span></span><br><span class="line"> <span class="string">"/"</span></span><br><span class="line"> );</span><br><span class="line"></span><br><span class="line">···</span><br></pre></td></tr></table></figure><p>再次点击登录</p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-lazy-src="https://raw.githubusercontent.com/l-ff/cdn.img/master/Images/202107/07.png" alt="再次访问 /Home/IndexNeedRole4"></p><p>OK, 如期显示正常</p><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><ol><li><a href="http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html">理解 OAuth 2.0 - 阮一峰的网络日志</a></li><li><a href="https://www.cnblogs.com/lanxiaoke/category/941651.html">权限认证 - 随笔分类 - 漂亮的猫 - 博客园</a></li><li><a href="https://www.cnblogs.com/qtiger/p/14436649.html">权限认证机制 - 搬砖滴 - 博客园</a></li></ol>]]></content>
<categories>
<category> asp.net权限认证 </category>
</categories>
<tags>
<tag> asp.net </tag>
<tag> oauth2.0 </tag>
<tag> 权限认证 </tag>
</tags>
</entry>
</search>