基于Bootstrap的Metronic框架实现页面链接收藏夹功能


Posted in Javascript onAugust 29, 2016

在一个系统里面,往往有很多菜单项目,每个菜单项对应一个页面,一般用户只需要用到一些常用的功能,如果每次都需要去各个层次的菜单里面去找对应的功能,那确实有点繁琐。特别是在菜单繁多,而客户又对系统整体不熟悉的情况下,如果有一个类似浏览器的收藏夹模块,把一些常用的菜单连接保存起来,每次从这个收藏夹主页去找对应的页面,那样确实是省事省力,非常方便。本篇随笔就是介绍在基于Metronic的Bootstrap开发框架里面实现这个收藏夹的思路。

1、系统的收藏夹界面处理效果

为了实现这个收藏夹功能,我们也需要在系统页面的明显位置处放置一个收藏夹模块的入口,以及可以为每个页面添加到对应收藏夹的功能。

经过对比,我们把这些入口功能放在页面标题的附近,这样方便进行快速进行收藏夹,如下效果所示。

基于Bootstrap的Metronic框架实现页面链接收藏夹功能

当我们在页面上单击【添加到收藏夹】按钮,我们就把对应的页面标题和连接加入到收藏夹记录里面了。

基于Bootstrap的Metronic框架实现页面链接收藏夹功能

在【查看收藏夹】功能里面,我们可以展示我们加入的页面链接,单击其中某个记录,可以快速进入对应的页面,这样就实现了我们快速进入功能模块的需求了。

基于Bootstrap的Metronic框架实现页面链接收藏夹功能

这里面最为关键的就是对收藏夹记录的排序处理,向上或者向下移动记录,使之能够符合界面的处理。

基于Bootstrap的Metronic框架实现页面链接收藏夹功能

2、系统收藏夹的实现过程

了解了上面关于系统页面的收藏夹功能界面效果后,我们需要了解它的具体实现过程,首先我们需要设计一个表用来存储收藏夹对应的信息,页面标题、页面地址、排序等信息。

数据库设计界面如下所示。

基于Bootstrap的Metronic框架实现页面链接收藏夹功能

我们注意到排序记录用Decimal格式进行存储,我们通过一个有经度的数值进行排序,这样我们可以调整的时候,修改它们之间的大小就可以了。

使用代码生成工具Database2Sharp快速生成底层的相关代码和Web的控制器和视图代码,然后整合到框架里面,这样我们就可以具有整个模块的界面和处理代码了。

基于Bootstrap的Metronic框架实现页面链接收藏夹功能

由于一般情况下,我们对数据的显示编辑界面是相对标准的,对于收藏夹的入口展示的需求不太一样,我们需要参考列表界面增加一个视图,用来展示简单的入口界面,如图介绍所示。

基于Bootstrap的Metronic框架实现页面链接收藏夹功能

这个界面里面包含了对记录的移动处理,包括向上或者向下。

前面介绍了,我们对记录的排序主要通过decimal类型的Seq字段实现的。

我们在实体类初始化的时候,给排序的赋值为当前时间的Unix时间戳。

基于Bootstrap的Metronic框架实现页面链接收藏夹功能

其中上面的DateTimeToInt函数代码如下所示,也是我们常用的处理方式。

/// <summary>
    /// 扩展时间接口,可以返回整形数值
    /// </summary>
    /// <param name="time"></param>
    /// <returns></returns>
    public static int DateTimeToInt(this DateTime time)
    {
      System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
      return (int)(time - startTime).TotalSeconds;
    }

为了实现记录的移动,我们需要在业务BLL层实现一个移动的逻辑处理,方便在控制器里面调用。

/// <summary>
    /// 更新向上或者向下的顺序
    /// </summary>
    /// <param name="id">记录的ID</param>
    /// <param name="moveUp">往上,还是往下移动,往上则为true</param>
    /// <returns></returns>
    public bool UpDown(string id, bool moveUp)

实现的函数代码如下所示

/// <summary>
/// 更新向上或者向下的顺序
/// </summary>
/// <param name="id">记录的ID</param>
/// <param name="moveUp">往上,还是往下移动,往上则为true</param>
/// <returns></returns>
public bool UpDown(string id, bool moveUp)
{
  //设置排序的规则
  bool IsDescending = true;
  bool result = false;
  WebFavoriteInfo info = FindByID(id);
  if (info != null)
  {
    //构建查询的条件
    string condition = "";
    if (IsDescending)
    {
      condition = string.Format("Seq {0} {1}", moveUp ? ">" : "<", info.Seq);
    }
    else
    {
      condition = string.Format("Seq {0} {1}", moveUp ? "<" : ">", info.Seq);
    }
    var list = baseDal.Find(condition);
    decimal newSeq = 0M;
    switch (list.Count)
    {
      case 0:
        newSeq = info.Seq;//已在顶部或者底部,顺序默认不变
        break;
      case 1:
        //上面或者下面有一个记录
        if (IsDescending)
        {
          newSeq = moveUp ? (list[0].Seq + 1M) : (list[0].Seq - 1M);
        }
        else
        {
          newSeq = !moveUp ? (list[0].Seq + 1M) : (list[0].Seq - 1M);
        }
        break;
      case 2:
        //中间区域,取平均值
        newSeq = (list[0].Seq + list[1].Seq) / 2M;
        break;
      default:
        //多于两个的情况
        if (moveUp)
        {
          newSeq = (list[list.Count - 2].Seq + list[list.Count - 1].Seq) / 2M;
        }
        else
        {
          newSeq = (list[0].Seq + list[1].Seq) / 2M;
        }
        break;
    }
    //统一修改顺序
    info.Seq = newSeq;
    result = Update(info, info.ID);
  }
  return result;
}

这样我们在MVC的控制器里面,对这个BLL层接口进行进一步封装,方便页面前端进行Ajax调用处理即可,封装代码如下所示。

/// <summary>
/// 移动记录
/// </summary>
/// <param name="id">记录ID</param>
/// <param name="up">向上为true,否则为false</param>
/// <returns></returns>
[HttpPost]
public ActionResult UpDown(string id, bool up)
{
  CommonResult result = new CommonResult();
  if(!string.IsNullOrEmpty(id))
  {
    try
    {
      result.Success = BLLFactory<WebFavorite>.Instance.UpDown(id, up);
    }
    catch(Exception ex)
    {
      result.ErrorMessage = ex.Message;
    }
  }
  return ToJsonContent(result);
}

这样我们在页面前端的界面视图里面,就可以对这个方法进行调用了。

首先在通过JS绑定生成前端HTML代码,如下所示。

$("#grid_body").html("");
$.each(data.rows, function (i, item) {
  var tr = "<tr>";
  tr += "<td><a class='btn btn-sm blue' href='" + item.Url + "'>" + item.Title + "</a></td>";
  tr += "<td>";
  tr += "<a href='javascript:;' class='btn btn-sm green' onclick=\"Up('" + item.ID + "')\" title='向上移动'><span class='glyphicon glyphicon-arrow-up icon-state-danger'></span></a>";
  tr += "<a href='javascript:;' class='btn btn-sm blue' onclick=\"Down('" + item.ID + "')\" title='向下移动'><span class='glyphicon glyphicon-arrow-down'></span></a>";
  tr += "</td>";
  tr += "</tr>";
  $("#grid_body").append(tr);
});

然后通过Up或者Down函数进行处理,向上或者向下移动位置。

var UpDownUrl = "/WebFavorite/UpDown"
function Up(id) {
  var postData = { id: id, up: true };
  $.post(UpDownUrl, postData, function (json) {
    var data = $.parseJSON(json);
    if (data.Success) {
      showTips("向上移动成功");
      Refresh();//刷新页面数据
    }
    else {
      showTips(data.ErrorMessage);
    }
  });
}
function Down(id) {
  var postData = { id: id, up: false };
  $.post(UpDownUrl, postData, function (json) {
    var data = $.parseJSON(json);
    if (data.Success) {
      showTips("向下移动成功");
      Refresh();//刷新页面数据
    }
    else {
      showTips(data.ErrorMessage);
    }
  });
}

这样就实现了我们所需要的移动顺序的操作了,另外添加的时候,我们判断对应用户是否有添加URL了,如果存在则不需要重复添加即可,前端只需要通过Ajax调用,然后响应处理即可。

通过这些代码的实现,我们可以实现收藏夹的快速管理和快速入口,为用户的使用提供了更加友好的体验。

以上所述是小编给大家介绍的基于Bootstrap的Metronic框架实现页面链接收藏夹功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
javascript设计模式 封装和信息隐藏(上)
Jul 24 Javascript
原生的html元素选择器类似jquery选择器
Oct 15 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
Mar 13 Javascript
Google 地图类型详解及示例代码
Aug 06 Javascript
浅析JavaScript函数的调用模式
Aug 10 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
Aug 26 Javascript
jquery插件bootstrapValidator数据验证详解
Nov 09 Javascript
JavaScript实现定时页面跳转功能示例
Feb 14 Javascript
使用javaScript实现鼠标拖拽事件
Apr 03 Javascript
原生JavaScript实现Ajax异步请求
Nov 19 Javascript
vue登录注册实例详解
Sep 14 Javascript
针对Vue路由history模式下Nginx后台配置操作
Oct 22 Javascript
ionic隐藏tabs的方法
Aug 29 #Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
Aug 29 #Javascript
深入理解React中es6创建组件this的方法
Aug 29 #Javascript
Ionic默认的Tabs模板使用实例
Aug 29 #Javascript
关于Javascript回调函数的一个妙用
Aug 29 #Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
Aug 28 #Javascript
利用jQuery的动画函数animate实现豌豆发射效果
Aug 28 #Javascript
You might like
Php中使用Select 查询语句的实例
2014/02/19 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
Javascript 篱式条件判断
2008/08/22 Javascript
Jquery iframe内部出滚动条
2010/02/11 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
js实现的切换面板实例代码
2013/06/17 Javascript
Javascript合并表格中具有相同内容单元格示例
2013/08/11 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
JQuery实现鼠标滚轮滑动到页面节点
2015/07/28 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
JS实现加载时锁定HTML页面元素的方法
2017/06/24 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
2017/08/08 Javascript
js中document.write和document.writeln的区别
2018/03/11 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
2020/11/19 Vue.js
Python yield使用方法示例
2013/12/04 Python
Python编写一个优美的下载器
2018/04/15 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
2019/03/23 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
详解Python绘图Turtle库
2019/10/12 Python
Python如何访问字符串中的值
2020/02/09 Python
用什么库写 Python 命令行程序(示例代码详解)
2020/02/20 Python
pytorch __init__、forward与__call__的用法小结
2021/02/27 Python
优秀毕业生自我鉴定
2014/01/19 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
年终总结会议主持词
2014/03/17 职场文书
工程材料采购方案
2014/05/18 职场文书
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python
vue实现拖拽交换位置
2022/04/07 Vue.js