全自動數據表格JQuery版


由於最近工作上有些變動,已經快一個月沒有寫博客了。上一篇博客 [React]全自動數據表格組件——BodeGrid介紹了全自動數據表格的設計思路以及分享了一個react.js的實現。但是現實情況中為了節約開發成本,很多中小型企業是很難做到前后端完全分離的,加上目前國內使用react.js的公司可能是太少了吧,於是又折騰着寫了一個JQuery版本的,結合mvc的模板頁也達到了相同的效果(代碼量方面),有興趣的小伙伴也可以嘗試寫一寫angular或者vue版本的,用起來真的能少寫很多代碼的。
 
使用到的js庫:
layer彈出層: http://layer.layui.com/
 

 
效果圖-列表頁:
 
效果圖-彈出框:
 
 
視圖頁全部代碼:
@{
    ViewBag.Title = "Table";
    Layout = "~/Areas/Admin/Views/Shared/_GridLayout.cshtml";
}

@section customScript{
    <script type="text/javascript">
        var enums = @Html.Raw(Json.Encode(@ViewBag.Enums));
        url = {
            read: "/api/services/product/products/GetProductPagedList",
            add: "/api/services/product/products/CreateProduct",
            edit: "/api/services/product/products/UpdateProduct",
            delete: "/api/services/product/products/DeleteProduct"
        };
        columns = [
                { data: "id", title: "編號" },
                { data: "name", title: "商品名稱", type: "text", query: true, editor: {} },
                { data: "brief", title: "商品簡介", type: "textarea", query: true, editor: {} },
                //{ data: "detail", title: "商品詳情", type: "richtext", query: true, editor: {} },
                { data: "price", title: "價格", type: "number", query: true, editor: {} },
                { data: "cover2", title: "封面", type: "img", editor: {} },
                { data: "isOnShelf", title: "是否上架", type: "switch", editor: {} },
                { data: "enumTest", title: "枚舉測試", type: "dropdown", editor: {},source:{data:enums} },
                { data: "onShelfTime", title: "上架時間", type: "timepicker", editor: {} },
                {
                    title: "操作選項",
                    type: "command",
                    actions: [
                        {
                            name: "操作",
                            icon: "fa-trash-o",
                            onClick: function (d) {
                                alert(d["id"]);
                            }
                        }
                    ]
                }
        ];
    </script>
}
View Code
 
服務端代碼:
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks;
using Abp.Application.Services;
using Abp.Application.Services.Dto;
using Abp.Application.Services.Query;
using Abp.AutoMapper;
using Abp.Domain.Repositories;
using BodeAbp.Product.Products.Dtos;

namespace BodeAbp.Product.Products
{
    /// <summary>
    /// 商品  應用服務
    /// </summary>
    public class ProductsAppService : ApplicationService, IProductsAppService
    {
        private readonly IRepository<Domain.Product,long> _productRepository;

        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="productRepository"></param>
        public ProductsAppService(IRepository<Domain.Product, long> productRepository)
        {
            _productRepository = productRepository;
        }

        /// <inheritdoc/>
        public async Task<PagedResultOutput<GetProductListOutput>> GetProductPagedList(QueryListPagedRequestInput input)
        {
            int total;
            var list = await _productRepository.GetAll().Where(input, out total).ToListAsync();
            return new PagedResultOutput<GetProductListOutput>(total, list.MapTo<List<GetProductListOutput>>());
        }

        /// <inheritdoc/>
        public async Task CreateProduct(CreateProductInput input)
        {
            var product = input.MapTo<Domain.Product>();
            await _productRepository.InsertAsync(product);
        }

        /// <inheritdoc/>
        public async Task UpdateProduct(UpdateProductInput input)
        {
            var product = await _productRepository.GetAsync(input.Id);
            input.MapTo(product);
            await _productRepository.UpdateAsync(product);
        }

        /// <inheritdoc/>
        public async Task DeleteProduct(IdInput input)
        {
            await _productRepository.DeleteAsync(input.Id);
        }
    }
}
View Code

 

表格請求Json格式:
{
    "pageIndex":1,
    "pageSize":15,
    "sortConditions":[
        {
            "sortField":"name",
            "listSortDirection":1
        }
    ],
    "filterGroup":{
        "rules":[
            {
                "field":"displayName",
                "operate":"contains",
                "value":"a"
            }
        ]
    }
}

 

服務端響應Json格式:

{
  "success": true,
  "result": {
    "totalCount": 4,
    "items": [
      {
        "name": "名稱222",
        "brief": "簡介222",
        "detail": "<p>描述222</p>",
        "price": 3.33,
        "cover2": "xx",
        "isOnShelf": true,
        "onShelfTime": "1899-12-03T03:00:00+08:00",
        "enumTest": 1,
        "id": 3
      }
    ]
  },
  "error": null,
  "unAuthorizedRequest": false
}

items中的字段應與視圖頁中列配置一一對應,這樣很少的代碼就能完全實現數據的展示、分頁、新增、編輯、刪除、查詢、排序等功能,並且還統一了編碼方式,方便質量把控和后期維護。數據表格核心文件:bode.grid.js。在BodeAbp項目中可以看到源碼以及一個比較完善的demo。整個demo依然遵循前后端分離的模式,只用到了MVC的視圖頁作為前端展示。BodeAbp項目地址:https://github.com/liuxx001/BodeAbp

 


 
bode.grid.js源碼這里就不過多介紹了,思路和上一篇博客所說一致,只是換了一種實現方式而已。JQuery版表格與React.js版的api還是有一些出入,不過總體來說功能是增強了,具體介紹如下:
 
初始化方式:
var table=new $.bode.grid("#dataTable", {...});
 
表格api:
參數 類型 說明 默認值
url object

遠程接口配置,示例:{read:"",add:"",edit:"",delete:""}

其中add、edit、delete屬於功能項,不配置url相關功能不會顯示

 
columns array[object] 列配置,下文會詳細介紹  
actions array[object]

右上角操作按鈕,默認添加"搜索";

如果url配置了add,則添加"新增"選項

 
imgSaveUrl string img類型圖片上傳地址 "/api/File/UploadPic"
formId string 彈出框id "bode-grid-autoform"
formWidth string 彈出框寬度,支持px與百分數

無富文本編輯器時:40%;

有富文本編輯器時:60%

pageIndex number 頁序號 1
pageSize number 每頁數量 15
beforeInit function 初始化前執行  
initComplete function 初始化后執行  
loadDataComplete function 每次數據重新加載后執行  
 
column屬性詳細介紹:
title string 表頭顯示標題  
data string 從數據源獲取對應的字段名  
type string

該列的類型,現支持的類型有:

text、textarea、richtext、number、switch、dropdown、

img、datepicker、timepicker、hide、command

 
query boolean 是否允許查詢 false
editor object 編輯相關配置,還可以繼續完善  
source object

dropdown類型下拉數據源,格式:

{data:[{value:"xx",text:"vv"}],textField:"xx",valueField:"xx" }

textField默認"text";

valueField默認"value"

sortDisable boolean 是否禁止排序 false
render function(v,d) 自定義列渲染事件,v表示當前單元格的數據,d表示當前行的數據  
editor object

{ap:"hide",ep:"disabled"};ap:新增模式,ep:編輯模式;'hide'表示

隱藏該列,'disabled'表示該列不可編輯

 

 



目前整個bode.grid.js還有很多需要完善地方,我會在以后的使用過程中繼續完善修改,本次分享僅供交流,如要使用,要做好填坑的准備。其實整個源碼還是比較簡單的,只有600行代碼,有興趣的小伙伴可以看看,歡迎交流。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM