MVC如何使用开源分页插件shenniu.pager.js

  最近比较忙,前期忙公司手机端接口项目,各种开发+调试+发布现在几乎上线无问题了;虽然公司项目忙不过在期间抽空做了两件个人觉得有意义的事情,一者使用aspnetcore开发了个人线上项目(要说线上其实只能ip访问,没有域名哈哈),其架构组成由:aspnetcore1.0.0+redis+ postgressql+TaskMainForm服务,这个项目在后期会开源出来供大家分享学习,站点地址点这里心声网;一者是目前正在做的后台管理框架一叶子,现目前刚好吧js分页插件shenniu.pager.js写完,个人觉得还是可以的,这也是本章将要和大家分享的内容;那么开始今天的分享内容,希望各位多多扫码支持:

 

  . 为什么采用js分页及效果图

  . 在view中如何使用及分享个后台方法

  . 开发者视角阅读shenniu.pager.js代码

 

下面一步一个脚印的来分享:

. 为什么采用js分页及效果图

首先,咋们来了解下市面上mvc两种常用的分页方式:跳转分页和ajax分页;跳转分页意思就是页面重定向到指定的页面并通过传递分页需要的参数,从而获取数据后通过Modal来绑定数据,这个每次都会刷下页面体验上不是很好;ajax分页通过异步js请求某个接口,然后从接口获取到数据后,再赋值到展示的界面上,这种方式是不会刷新页面,从而保证了用户体验;

下面来看下这次分享的js分页插件效果图:

图一:

图二:

图三:

看效果图好像看不出来什么东西,我只能说没办法,以后争取弄个gif动态图片吧,后面代码才是关键

 

. 在view中如何使用及分享个后台方法

首先,为了页面样式好看我使用了bootstrap+ace样式框架,样式效果就是如上面几张图所示(这里是样式和js文件);由于该插件是采用jquery格式书写的所以需要引用jquery.js,如上面图所示使用到了日期选择框,因为我采用的样式都是基于h5的设计所以这里引用的日期选择插件bootstrap-datepicker.min.js和她的样式bootstrap-datepicker3.min.css;该实例需要的引用文件都好了,下面看下截图:

再来,咋们就开始使用shenniu.pager.js,我们需要在点击“查询”按钮的时候去调用这个插件,然后通过插件去获取后台接口返回的数据,并绑定到页面展示出来,所以有了如下代码:

 1  var snTool = new shenniuTool();
 2 
 3         $("button[id='btnSearch']").on("click", function () {
 4 
 5             var data = {
 6                 txtName: $("input[name='txtName']").val(),
 7                 nStatus: $("select option:selected").val(),
 8                 dOperateTime: $("input[name='dOperateTime']").val()
 9             };
10 
11             snTool.listFun({
12                 showId: "divShowResult",  //内容显示的div的Id
13                 url: "/Menu/Search",
14                 data: data,
15                 pageSize: 2,  //每页N条
16                 headText: [
17                     { nickName: "全选", name: "Id", colType: "checkbox" },
18                     { nickName: "名称", name: "Name", colType: "label", isModalHeadText: true },
19                     { nickName: "链接", name: "Link" },
20                     { nickName: "状态", name: "EnableDes" },
21                     { nickName: "操作人", name: "OperatorDes" },
22                     { nickName: "操作时间", name: "OperateTime", format: "yyyy-MM-dd" },
23                     { nickName: "操作", name: "Id", colType: "operate" }
24                 ],
25                 editeOption: {
26                     url: "/Menu/Edit",
27                     title: "编辑",
28                     height: 500
29                 },
30                 viewOption: {
31                     url: "/Menu/Details",
32                     title: "查看",
33                     height: 500
34                 },
35                 delOption: {
36                     url: "/Menu/Delete",
37                     title: "删除",
38                     height: 500
39                 },
40                 modalExt: modalExt
41             });
42         });

注意参数url: "/Menu/Search",这个指向的就是后台接口,那么咋们来看下我后台咋们写的:

 1 [HttpGet]
 2         public JsonResult Search()
 3         {
 4             var moPageResult = new StageModel.MoPageResult<dynamic>();
 5 
 6             try
 7             {
 8 
 9                 var txtName = Request.Params["txtName"];
10                 var nStatus = string.IsNullOrWhiteSpace(Request.Params["nStatus"]) ? -1 : Convert.ToInt32(Request.Params["nStatus"]);
11                 var dOperateTime = string.IsNullOrWhiteSpace(Request.Params["dOperateTime"]) ? Convert.ToDateTime("1991-01-01") : Convert.ToDateTime(Request.Params["dOperateTime"]);
12                 var data = db.MoMenus.AsQueryable();
13                 if (!string.IsNullOrWhiteSpace(txtName))
14                 {
15                     data = data.Where(b => b.Name.Contains(txtName));
16                 }
17                 if (nStatus >= 0)
18                 {
19                     data = data.Where(b => b.IsEnable == (nStatus == (int)StageEnumHelper.ComStatus.启用));
20                 }
21                 if (dOperateTime > Convert.ToDateTime("1991-01-01"))
22                 {
23                     data = data.Where(b => b.OperateTime >= dOperateTime && b.OperateTime < dOperateTime.AddDays(1));
24                 }
25 
26                 moPageResult.MoPageContent(
27                     data,
28                     b => b.OperateTime,
29                     b => new
30                     {
31                         Id = b.Id,
32                         Name = b.Name,
33                         Link = b.Link,
34                         Des = b.Des,
35                         IsEnable = b.IsEnable,
36                         Operator = b.Operator,
37 
38                         OperatorDes = b.MoUserInfo.NickName,
39                         EnableDes = b.IsEnable ? "启用" : "禁用",
40                         OperateTime = b.OperateTime
41                     });
42 
43             }
44             catch (Exception ex)
45             {
46             }
47             return Json(moPageResult, JsonRequestBehavior.AllowGet);
48         }

后台接口Request.Params获取的几个参数就是从前端

       var data = {txtName: $("input[name='txtName']").val(),nStatus: $("select option:selected").val(),dOperateTime: $("input[name='dOperateTime']").val()};

  传递过来的,分别代码了视图中的名称,状态,操作时间等查询条件;下面来看下,后台这儿没有看到获取类似分页的当前页数和分页记录数的操作,是封装到了MoPageResult类中的MoPageContent()中,来看下MoPageResult类代码如:

 1 #region  分页数据返回
 2 
 3         public class MoPageResult<TResult> where TResult : class, new()
 4         {
 5 
 6             public MoPageResult()
 7             {
 8              
 9             }
10 
11             public IQueryable<TResult> MoResult;
12 
13             /// <summary>
14             /// 总页数
15             /// </summary>
16             public int PageTotal { get; set; }
17 
18 
19             /// <summary>
20             /// 当前页数
21             /// </summary>
22             public int CurrentPage { get; set; }
23 
24             /// <summary>
25             /// 分页记录数
26             /// </summary>
27             public int PageSize { get; set; }
28 
29             /// <summary>
30             /// 分页方法
31             /// </summary>
32             /// <typeparam name="TKey"></typeparam>
33             /// <param name="query"></param>
34             /// <param name="order_desc"></param>
35             public void MoPageContent<T, TKey>(IQueryable<T> query, Expression<Func<T, TKey>> desc, Expression<Func<T, TResult>> selector = null, bool isDesc = true) where T : class,new()
36             {
37 
38                 if (HttpContext.Current == null) { return; }
39                 var Request = HttpContext.Current.Request;
40 
41                 this.PageSize = string.IsNullOrWhiteSpace(Request.Params["pageSize"]) ? 15 : Convert.ToInt32(Request.Params["pageSize"]);
42                 this.CurrentPage = string.IsNullOrWhiteSpace(Request.Params["currentPage"]) ? 1 : Convert.ToInt32(Request.Params["currentPage"]);
43 
44                 var nTotal = query.Count();
45                 this.PageTotal = nTotal / this.PageSize + (nTotal % this.PageSize > 0 ? 1 : 0);
46 
47                 if (selector != null)
48                 {
49                     if (isDesc)
50                     {
51                         query = query.OrderByDescending(desc);
52                     }
53                     else
54                     {
55                         query = query.OrderBy(desc);
56                     }
57                     this.MoResult = query.
58                              Skip((this.CurrentPage - 1) * this.PageSize).
59                              Take(this.PageSize).
60                              Select(selector);
61                 }
62             }
63 
64         }
65 
66         #endregion

MoPageContent()中默认是获取了pagesize,currentpage参数,这样减少了用户操作性,并且此方法承担了计算总页数和执行分页语句的角色,注意最后查询语句Select(selector),selector是Expression<Func<T, TResult>>类型,这个T有条件约束where T : class,new();我在调用该分页类的使用传递的T是dynamic,因为赖人如我觉得匿名类更方便;唯一遗憾的是select输出暂时无法直接对某个属性直接使用方法;

最后,插件使用还需要注意一个地方,就是时间,如果后台不处理时间直接DateTime的json格式化,那么在插件获取出来的时间格式如:

这个时候就需要在使用shenniu.pager.js插件时候在属性headText中,指定时间列的格式如:

 { nickName: "操作时间", name: "OperateTime", format: "yyyy-MM-dd" }

  使用format格式化时间格式,这个插件兼容的给有:yyyy,MM,dd,HH,mm,ss,相信满足大家需要了;

 

. 开发者视角阅读shenniu.pager.js代码

首先,我们从上而下,映入眼帘的是插件属性:

var defOption = {showId: "divShowResult",  //内容显示的divurl: "",   //ajax数据来源地址
        headText: [{ nickName: "A", colType: "checkbox", name: "Id" },{ nickName: "B", colType: "label", name: "Name", isModalHeadText: true }   //isModalHeadText:是否是模式窗体头部显示的信息
        ],data: {},  //查询条件
        editeOption: {url: "",title: "编辑",width: 500,height: 500}, //编辑地址,不包括id
        viewOption: {url: "",title: "查看",width: 500,height: 500}, //查看地址
        delOption: {url: "",title: "删除",width: 500,height: 500}, //删除地址
currentPage: 1,  //当前页数pageSize: 15,  //分页记录数showPageTab: 6, //展示6个页数modalExt: null, //模式窗体对象//可忽略callback: function () { }, //回调函数tabId: "tab001",loading: "努力加载中,等会吧...", //可以直接写出<img src=''/>
        sucFun: function (data) { },befFun: function () { },errFun: function () { },comFun: function () { },timeout: 60000 //超时60S
    };$.extend(defOption, option);
View Code

里面已经包括了注释说明,看起来应该不是问题; $.extend(defOption, option); 这段代码意思是吧用户传递进来的参数和插件里面默认的参数合并,用户大于插件直接可以覆盖相同属性的值;

再来,看请求后台的方法:

 1 //请求后台
 2     function ajaxFun(option) {
 3 
 4         if (option) {
 5             $.extend(defOption, option);
 6         }
 7 
 8         //获取分页参数
 9         var hidPageSize = defOption.pageSize;
10         var hidCurrentPage = defOption.currentPage;
11 
12         if ($("form input[name='pageSize']").val()) {
13             hidPageSize = $("form input[name='pageSize']").val();
14         }
15         if ($("form input[name='currentPage']").val()) {
16             hidCurrentPage = $("form input[name='currentPage']").val();
17         }
18 
19         //合并用户查询条件和分页参数条件
20         var searchData = {
21             pageSize: hidPageSize,
22             currentPage: hidCurrentPage
23         };
24         $.extend(searchData, defOption.data);
25         //请求后台数据
26         $.ajax({
27 
28             url: defOption.url,
29             type: "get",
30             data: searchData,
31             dataType: "json",
32             timeout: defOption.timeout,
33 
34             async: true,
35             beforeSend: defOption.befFun,
36             success: defOption.sucFun,
37         });
38     }

这个方法就是请求接口获取数据的方法,里面默认获取了页面中的pageSize,currentPage两个分页所需要的参数,这里采用的是get方式来请求,当然可以写成post,不过需要后台支持post就行了;

我们再看查询列表方法

  1 //查询列表
  2         listFun: function (option) {
  3 
  4             if (option) {
  5                 $.extend(defOption, option);
  6             }
  7 
  8             //默认格式
  9             var tab = [];
 10             tab.push('<table id="' + defOption.tabId + '" class="table  table-bordered table-hover">');
 11             tab.push('<thead><tr role="row">');
 12 
 13             for (var i in defOption.headText) {
 14 
 15                 var head = defOption.headText[i];
 16 
 17                 if (head.colType == "label") {
 18                     tab.push('<th class="center" tabindex="0" rowspan="1" colspan="1">' + head.nickName + '</th>');
 19                 } else if (head.colType == "checkbox") {
 20                     tab.push('<th class="center " rowspan="1" colspan="1" aria-label="">');
 21                     tab.push('    <label class="pos-rel">');
 22                     tab.push('        <input type="checkbox" name="cbAll" class="ace">');
 23                     tab.push('        <span class="lbl">' + head.nickName + '</span>');
 24                     tab.push('     </label>');
 25                     tab.push('</th>');
 26                 } else {
 27                     tab.push('<th class="center" tabindex="0" rowspan="1" colspan="1">' + head.nickName + '</th>');
 28                 }
 29             }
 30             tab.push('</tr></thead>');
 31             tab.push('<tbody><tr><td class="text-center" colspan="' + defOption.headText.length + '">' + defOption.loading + '</td></tr></tbody>');
 32             tab.push('</table>');
 33             tab.push('<div id="divPager" class="text-center"></div>');
 34             $("#" + defOption.showId).html(tab.join(''));
 35             //全选事件
 36             $("input[type='checkbox'][name='cbAll']").on("click", function () {
 37 
 38                 var cbStatus = $(this).is(":checked");
 39                 if (cbStatus) {
 40                     $("input[name='cb']:checkbox").prop("checked", true);
 41                 } else {
 42                     $("input[name='cb']:checkbox").prop("checked", false);
 43                 }
 44             });
 45 
 46             //数据返回成功处理
 47             defOption.sucFun = function (data) {
 48 
 49                 var head = $("table[id='" + defOption.tabId + "'] tbody");
 50                 if (data) {
 51                     if (data.MoResult) {
 52                         //遍历table展示的数据
 53                         var rows = [];
 54                         $.each(data.MoResult, function (i, item) {
 55                             rows.push('<tr>');
 56 
 57                             var modalHeadText = "";
 58                             for (var h_i in defOption.headText) {
 59                                 var head = defOption.headText[h_i];
 60                                 var item_val = item[head.name];
 61                                 if (item_val && typeof (item_val) != "undefined") { } else { item_val = ""; }
 62 
 63                                 //时间格式化
 64                                 if (head.format && item_val.length > 0) {
 65                                     console.log(item_val);
 66                                     var date = new Date(parseInt(item_val.replace("/Date(", "").replace(")/", ""), 10));
 67                                     item_val = head.format.
 68                                                 replace("yyyy", date.getFullYear()).
 69                                                 replace("MM", date.getMonth() + 1).
 70                                                 replace("dd", date.getDate()).
 71                                                 replace("HH", date.getHours()).
 72                                                 replace("mm", date.getMinutes()).
 73                                                 replace("ss", date.getMilliseconds());
 74                                 }
 75 
 76                                 //获取模式窗体头部信息
 77                                 if (modalHeadText.length <= 0) { modalHeadText = head.isModalHeadText ? item_val : "" };
 78                                 if (head.colType == "label") {
 79 
 80 
 81                                     rows.push('<td class="center">' + item_val + '</td>');
 82                                 } else if (head.colType == "checkbox") {
 83                                     rows.push('<td class="center">');
 84                                     rows.push('    <label class="pos-rel">');
 85                                     rows.push('         <input type="checkbox" name="cb" value="' + item_val + '" class="ace">');
 86                                     rows.push('         <span class="lbl"></span>');
 87                                     rows.push('    </label>');
 88                                     rows.push('</td>');
 89                                 } else if (head.colType == "operate") {
 90 
 91                                     rows.push('<td class="center"><div class="hidden-sm hidden-xs action-buttons">');
 92                                     if (defOption.editeOption.url.length > 0) {
 93                                         var editOption = $.extend({}, defOption.editeOption);
 94                                         editOption.url += "/" + item_val;
 95                                         editOption.title += modalHeadText.length > 0 ? "-" + modalHeadText : "";
 96 
 97                                         var op = JSON.stringify(editOption);
 98                                         rows.push('<a class="blue" data-item=\'' + op + '\' href="javascript:;"><i class="ace-icon fa fa-pencil bigger-130"></i></a>');
 99                                     }
100                                     if (defOption.viewOption.url.length > 0) {
101 
102                                         var viewOption = $.extend({}, defOption.viewOption);
103                                         viewOption.url += "/" + item_val;
104                                         viewOption.title += modalHeadText.length > 0 ? "-" + modalHeadText : "";
105 
106                                         var op = JSON.stringify(viewOption);
107                                         rows.push('<a class="blue" data-item=\'' + op + '\' href="javascript:;"><i class="ace-icon fa fa-search-plus bigger-130"></i></a>');
108                                     }
109                                     if (defOption.delOption.url.length > 0) {
110 
111                                         var delOption = $.extend({}, defOption.delOption);
112                                         delOption.url += "/" + item_val;
113                                         delOption.title += modalHeadText.length > 0 ? "-" + modalHeadText : "";
114 
115                                         var op = JSON.stringify(delOption);
116                                         rows.push('<a class="blue" data-item=\'' + op + '\' href="javascript:;"><i class="ace-icon fa fa-trash-o bigger-130"></i></a>');
117                                     }
118                                     rows.push('</div></td>');
119                                 }
120                                 else {
121 
122                                     rows.push('<td class="center">' + item_val + '</td>');
123                                 }
124                             }
125                             rows.push('</tr>');
126                         });
127 
128                         //页数展示
129                         if (data.MoResult.length > 0) {
130                             var pager = [];
131                             pager.push('<div class="text-center">');
132                             pager.push('    <ul class="pagination" style="margin-top:0px">');
133                             var nPager = defOption.showPageTab;//每次展示6个分页
134                             //上一页
135                             var nprev = (data.CurrentPage - 1 >= 1 ? data.CurrentPage - 1 : 1);
136                             pager.push('        <li class="paginate_button previous" aria-controls="dynamic-table" tabindex="0" id="dynamic-table_previous">');
137                             pager.push('           <a href="javascript:;" name="npager" data-page="' + nprev + '">上一页</a>');
138                             pager.push('        </li>');
139 
140                             //当前页之前页码
141                             var preTotal = data.CurrentPage - nPager >= 1 ? data.CurrentPage - nPager : 1;
142                             for (var i = preTotal; i < data.CurrentPage ; i++) {
143 
144                                 pager.push('       <li class="paginate_button ' + (i == data.CurrentPage ? "active disabled" : "") + '" aria-controls="dynamic-table">');
145                                 pager.push('          <a href="javascript:;" name="npager" data-page="' + i + '">' + i + '</a>');
146                                 pager.push('       </li>');
147                             }
148 
149                             //当前页
150                             pager.push('       <li class="paginate_button active disabled" aria-controls="dynamic-table">');
151                             pager.push('          <a href="javascript:;" name="npager" data-page="' + data.CurrentPage + '">' + data.CurrentPage + '</a>');
152                             pager.push('       </li>');
153 
154                             //当前页以后页码
155                             var nextTotal = data.CurrentPage + nPager > data.PageTotal ? data.PageTotal : data.CurrentPage + nPager;
156                             for (var i = data.CurrentPage + 1; i <= nextTotal; i++) {
157 
158                                 pager.push('       <li class="paginate_button ' + (i == data.CurrentPage ? "active disabled" : "") + '" aria-controls="dynamic-table">');
159                                 pager.push('          <a href="javascript:;" name="npager" data-page="' + i + '">' + i + '</a>');
160                                 pager.push('       </li>');
161                             }
162                             //下一页
163                             var nnext = (data.PageTotal < data.CurrentPage + 1 ? data.PageTotal : data.CurrentPage + 1);
164                             pager.push('          <li class="paginate_button next" aria-controls="dynamic-table" tabindex="0" id="dynamic-table_next">');
165                             pager.push('              <a href="javascript:;" name="npager" data-page="' + nnext + '">下一页</a>');
166                             pager.push('          </li>');
167 
168                             pager.push('    </ul>');
169                             //分页查询条件
170                             pager.push('<div style="display:none">');
171                             pager.push('    <form>');
172                             pager.push('        <input type="hidden" name="pageSize" value="' + defOption.pageSize + '"/>');
173                             pager.push('        <input type="hidden" name="currentPage" value="' + defOption.currentPage + '"/>');
174                             pager.push('    </form>');
175                             pager.push('</div>');
176 
177                             pager.push('</div>');
178 
179                             //移除加载中
180                             //head.html("");
181                             //添加结果
182                             head.html(rows.join(''));
183                             $("div[id='divPager']").html(pager.join(''));
184                             //操作按钮事件
185                             $("a[data-item]").on("click", function () {
186 
187                                 var data_Item = $(this).attr("data-item");
188                                 if (data_Item) {
189                                     var data_Item_Obj = JSON.parse(data_Item);
190 
191                                     defOption.modalExt.modalFun({
192                                         width: data_Item_Obj.width,
193                                         height: data_Item_Obj.height,
194                                         url: data_Item_Obj.url,
195                                         title: data_Item_Obj.title,
196                                         callback: defOption.callback
197                                     });
198                                 }
199                             });
200                             //绑定分页按钮事件
201                             $("a[name='npager']").on("click", function () {
202 
203                                 var nPager = $(this).attr("data-page");
204                                 if (nPager.length <= 0) { return; }
205 
206                                 $("form input[name='currentPage']").val(nPager);
207 
208                                 //执行请求后台
209                                 ajaxFun(defOption);
210                             });
211                         } else {
212                             head.html("<tr><td class=\"text-center\" colspan=\"" + defOption.headText.length + "\">未能查询到数据!</td></tr>");
213                             $("div[id='divPager']").html("");
214                         }
215                     } else {
216                         head.html("<tr><td class=\"text-center\" colspan=\"" + defOption.headText.length + "\">未能查询到数据。</td></tr>");
217                         $("div[id='divPager']").html("");
218                     }
219                 } else {
220                     head.html("<tr><td class=\"text-center\" colspan=\"" + defOption.headText.length + "\">未能查询到数据</td></tr>");
221                     $("div[id='divPager']").html("");
222                 }
223             };
224             if (option) {
225                 $.extend(defOption, option);
226             }
227 
228             //执行请求后台
229             ajaxFun(defOption);
230         }
View Code

这个方法体挺长的,主要操作是:

默认格式展示列表头部并呈现出加载中的提示=》绑定复选框全选事件=》创建数据返回成功函数sucFun()=》调用请求后台方法ajaxFun();

再来看函数sucFun()等到数据返回后执行的操作是:

遍历json返回数据展示到table中(其中包括了时间格式化的处理,复选框,label及操作按钮类型operate的初始化)=》页数展示及事件绑定(目前只有上一页,当前页之前页码,当前页,当前页以后页码,下一页的效果展示,分页查询条件(生成pagesize和currentPage隐藏控件),绑定分页按钮事件)

以上就是shenniu.pager.js整个插件内容,不多且清晰,感觉分享给大家挺高兴,下面贴出示例中用到的js文件和css文件可以在这里下载

 

转载于:https://www.cnblogs.com/wangrudong003/p/6137288.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

四. 基于环视Camera的BEV感知算法-PETR

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比5. PETRv2总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基…

Java泛型面试问题

Java面试中的通用面试问题在相当长的时间内在Java 5周围越来越普遍&#xff0c;许多应用程序都转移到Java 5上&#xff0c;并且几乎所有新的Java开发都发生在Tiger&#xff08;Java 5的代号&#xff09;上。 泛型和Java 5功能&#xff08;例如Enum&#xff09;的重要性&#xf…

隐层元素闪一下_太阳一直依靠什么元素在燃烧,地球上的重元素又是怎么来的?...

本文基于回答网友一个这样的问题&#xff1a;太阳目前氢核聚变是氦碳氧稳定燃烧地球上的铁镍重元素哪里来的&#xff1f;可以说&#xff0c;这是一个毫无逻辑乱七八糟的问题&#xff0c;但既然邀请回答&#xff0c;就从中挑出几个稍显合理的问题说明一下。太阳核心每时每刻都在…

基于Token的WEB后台认证机制

基于Token的WEB后台认证机制 几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password&#xff0c;简言之&#xff0c;Basic Auth是配合RESTful API 使用的最简单的认证方式&#xff0c;只需提供用户名密码即可&#xf…

saltstack

第一&#xff1a;安装前准备&#xff1a; 声明我用的是ubuntu 16.04的系统 1.修改主机名&#xff0c;并保证两台机器可以互相ping同主机名 ip1 master_hostname ip2 slave_hostname 第二&#xff1a;安装 服务器安装 yum install salt-master -y客户端安装 yum install salt…

ios 百度地图指定区域_获取百度地图可视区域范围的数据

有个业务场景&#xff0c;需要根据获取到的地图区域显示&#xff0c;根据相应的经纬度反查 左侧区域的会议室。思路&#xff1a;1.得到百度地图可视区域--可视区域的中心点2.可视区域的四个角的其中两个(东北角西南角)http://lbsyun.baidu.com/cms/jsapi/reference/jsapi_refer…

使用WS-Trust / STS采样器扩展JMeter

JMeter没有对WS-Security或WS-Trust的任何内置支持&#xff0c;这使我为JMeter开发了此STS Sampler –可以在负载测试STS时使任何人的生活变得更好。 首先&#xff0c;您需要拥有Apache JMeter发行版。 我正在使用v2.7。 然后&#xff0c;您可以从此处下载sts.sampler.zip –解…

vue怎么改logo_vue全家桶项目构建教程

前言vue是现阶段很流行的前端框架&#xff0c;很多人通过vue官方文档的学习&#xff0c;对vue的使用都有了一定的了解&#xff0c;但再在项目工程化处理的时候&#xff0c;却发现不知道改怎么更好的管理自己的项目&#xff0c;如何去引入一些框架以及vue全家桶其他框架的使用&a…

stm32 内部sram大小_在SRAM、FLASH中调试代码的配置方法(附详细步骤)

聊天界面发送嵌入式大杂烩获取1TB大杂烩资料包STM32的FLASH擦写次数有限(大概为1万次)&#xff0c;所以为了延长FLASH的使用时间&#xff0c;我们平时调试时可以选择在SRAM中进行硬件调试。除此之外&#xff0c;SRAM 存储器的写入速度比在内部 FLASH 中要快得多&#xff0c;所以…

自定义控件_VIewPager显示多个Item

一直以来想搞明白这个不完全的VIewPager是怎么做到的&#xff0c;有幸看到这片篇文章 有二种实现方法 1.设置的属性 1.clipChildren属性 2.setPageMargin 3.更新Item外界面 2.重写getPageWidth public class MultiplePagerAdapter extends PagerAdapter { private List<I…

华为怎么改输入法皮肤_微信和QQ个性键盘皮肤

hello大家好&#xff0c;今天是2019年1月1号&#xff0c;祝大家新年快乐今天是新年的第一天&#xff0c;所以说给大家介绍一个好玩的&#xff0c;微信和QQ都能设置的个性的键盘皮肤&#xff0c;看下图&#xff0c;这样的个性的键盘主题怎么设置呢&#xff1f;其实很简单&#x…

用金万维怎么设置路由器_家用路由器怎么设置 家庭路由器设置方法【图文】...

这里以TP-link的无线路由器为例&#xff0c;教一下怎么调试路由器上网。准备工具:网线两条&#xff0c;电脑或者手机&#xff0c;用手机的话就不需要用网线了1、用网线连接光纤猫与路由器&#xff0c;光猫的LAN1口与路由器的WAN相连。路由器的LAN任意一个口用网线连接电脑。2、…

Liferay –简单主题开发

实际上&#xff0c;Liferay的6.1版本已经走了很长一段路&#xff0c;该版本完全支持JSF和IceFaces。 我的目标是使它成为我们团队中的标准协作工具&#xff0c;因此我仍在尝试学习它的精髓。 好的软件应用程序可以解决问题&#xff0c;但是好的软件应用程序不仅可以解决问题&am…

springmvc初步配置

导包/添加依赖&#xff1a;<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>4.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.springfram…

行号 设置vim_在VSCode里面配置Vim正确姿势(细节解析)

一、导论对于不用vim的人来说&#xff0c;vim简直是个噩梦&#xff0c;复杂的指令、丑陋的界面、令人头痛的配置文件&#xff0c;任何一项都足以劝退一大波人&#xff0c;但是对于已经习惯了使用vim的人来说&#xff0c;vim简直就是马良神笔&#xff0c;似乎vim除了生孩子什么都…

巡回沙龙_美浮特全国巡回沙龙第一期结束撒花!

科技美肤&#xff0c;无龄焕变。美浮特2019全国美肤巡回沙龙第一期活动圆满结束&#xff01;优秀的小伙伴&#xff0c;雅致的茶歇环境&#xff0c;精美的甜点小食&#xff0c;理论与体验并行的肤感测试课堂……不知道是哪一个环节给大家留下了深刻的印象呢&#xff1f;首先让我…

UIAutomation识别UI元素

MS UI Automation&#xff08;Microsoft User Interface Automation&#xff1a;UIA&#xff09;是随.net framework3.0一起发布的&#xff0c;虽然在如今这个几乎每天都有各种新名词、新技术出来的所谓的21世纪&#xff0c;它显得已经有些过时了。前些日子&#xff0c;正好一个…

【C++第一个Demo】---控制台RPG游戏3【登陆菜单树】

【登陆系统--树结构】 1 首先我这里设计&#xff0c;由一个基类MainMenu构建树结构&#xff0c;并实现控制台上菜单之间的切换和返回操作 1 #ifndef _UI_BASE_H_2 #define _UI_BASE_H_3 4 #include <string>5 #include <vector>6 #include"..//Marco.h"7…

不存在_施文忠 | ”存在“与“不存在”——巴蜀文明概论

海德格尔有句名言&#xff1a;“存在者存在&#xff0c;不存在者不存在&#xff01;”四川&#xff0c;一个伟大的存在&#xff0c;偏偏存在于四川的口头禅却是“不存在”。在不存在中追求存在&#xff0c;在存在中摆脱存在。六月白鹿镇&#xff0c;书院学习了《李白与海德格尔…

Altium 原理图出现元件“Extra Pin…in Normal of part ”警告的解决方法

转载于&#xff1a; http://blog.csdn.net/idoming/article/details/45575627 使用Altium Designer的时候编译完后&#xff0c;只关注过错误没有关注过警告&#xff0c;现在认真排查一下有哪些警告。 正在进行的项目原理图编译完成后提示标题中的警告信息。经过在网上搜索&…