diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java
index e5ca834..3875703 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java
@@ -1,8 +1,14 @@
 package com.supwisdom.dlpay.framework.dao;
 
 import com.supwisdom.dlpay.framework.domain.TApiClient;
-import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
 
-public interface ApiClientDao extends CrudRepository<TApiClient, String> {
+@Repository
+public interface ApiClientDao extends JpaRepository<TApiClient, String> {
   TApiClient findByAppid(String appid);
+
+  Page<TApiClient> findByAppidContaining(String appid, Pageable pageable);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java b/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
index 1224c6e..7308802 100644
--- a/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/ParamController.java
@@ -1,10 +1,12 @@
 package com.supwisdom.dlpay.system.controller;
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TApiClient;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.domain.TSyspara;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
 import com.supwisdom.dlpay.framework.util.WebConstant;
 import com.supwisdom.dlpay.system.service.ParamService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -71,14 +73,14 @@
       }
     } catch (Exception e) {
       e.printStackTrace();
-      return JsonResult.error("系统处理异常");
+      return JsonResult.error("系统处理异常").put("exception", e);
     }
   }
 
 
   /**
    * ====================================================
-   *              业务参数配置
+   * 业务参数配置
    * ====================================================
    */
   @GetMapping("/param/businesspara")
@@ -86,10 +88,10 @@
     return "system/param/businesspara";
   }
 
-  @PostMapping("/param/businessparalist")
+  @GetMapping("/param/businessparalist")
   @PreAuthorize("hasPermission('/param/businesspara','')")
   @ResponseBody
-  public PageResult<TBusinesspara> getDataList(@RequestParam("page") Integer pageNo,
+  public PageResult<TBusinesspara> getBusinessDataList(@RequestParam("page") Integer pageNo,
                                                @RequestParam("limit") Integer pageSize,
                                                @RequestParam(value = "paraname", required = false) String paraname) {
     try {
@@ -102,5 +104,122 @@
     }
   }
 
+  @PostMapping("/param/deletebusinesspara")
+  @PreAuthorize("hasPermission('/param/deletebusinesspara','')")
+  @ResponseBody
+  public JsonResult deleteBusinesspara(@RequestParam("parakey") String parakey) {
+    try {
+      if (StringUtil.isEmpty(parakey)) {
+        return JsonResult.error("参数名为空");
+      }
+      TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
+      if (null == businesspara) {
+        return JsonResult.error("业务参数[" + parakey + "]不存在！");
+      }
+      if (paramService.deleteBusinesspara(businesspara)) {
+        return JsonResult.ok("删除成功！");
+      } else {
+        return JsonResult.error("删除失败！");
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统处理异常").put("exception", e);
+    }
+  }
+
+  @PostMapping("/param/businessparaupdate")
+  @PreAuthorize("hasPermission('/param/businessparaupdate','')")
+  @ResponseBody
+  public JsonResult updateBusinesspara(@RequestParam("parakey") String parakey, @RequestParam("paraval") String paraval) {
+    try {
+      if (StringUtil.isEmpty(parakey) || null == paraval) {
+        return JsonResult.error("参数传递错误");
+      }
+      TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
+      if (null == businesspara) {
+        return JsonResult.error("业务参数[" + parakey + "]不存在！");
+      }
+      businesspara.setParaval(paraval);
+      if (paramService.saveOrUpdateBusinesspara(businesspara)) {
+        return JsonResult.ok("修改成功！");
+      } else {
+        return JsonResult.error("修改失败！");
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统处理异常").put("exception", e);
+    }
+  }
+
+  @GetMapping("/param/load4addbuspara")
+  @PreAuthorize("hasPermission('/param/load4addbuspara','')")
+  public String loadadd() {
+    return "system/param/busparaform";
+  }
+
+  @GetMapping("/param/checkbusname")
+  @ResponseBody
+  public JsonResult checkname(@RequestParam("parakey") String parakey) {
+    TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
+    if (businesspara == null) {
+      return JsonResult.ok();
+    } else {
+      return JsonResult.error("参数名重复");
+    }
+  }
+
+  @PostMapping("/param/addbusinesspara")
+  @PreAuthorize("hasPermission('/param/addbusinesspara','')")
+  @ResponseBody
+  public JsonResult addBusinesspara(@RequestParam("parakey") String parakey, @RequestParam("paraval") String paraval) {
+    if (StringUtil.isEmpty(parakey) || null == paraval) {
+      return JsonResult.error("参数传递错误");
+    }
+    try {
+      TBusinesspara businesspara = paramService.getBusinessparaByParakey(parakey);
+      if (null != businesspara) {
+        return JsonResult.error("参数名重复");
+      }
+      businesspara = new TBusinesspara();
+      businesspara.setParakey(parakey.trim());
+      businesspara.setParaval(paraval.trim());
+      if (paramService.saveOrUpdateBusinesspara(businesspara)) {
+        return JsonResult.ok("新增成功！");
+      } else {
+        return JsonResult.error("新增失败！");
+      }
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统处理异常").put("exception", e);
+    }
+  }
+
+
+  /**
+   * ====================================================
+   *            APPID应用权限参数管理
+   * ====================================================
+   */
+  @GetMapping("/param/apiclientpara")
+  public String appidParaView() {
+    return "system/param/apiclientpara";
+  }
+
+  @GetMapping("/param/apiclientparalist")
+  @PreAuthorize("hasPermission('/param/apiclientparalist','')")
+  @ResponseBody
+  public PageResult<TApiClient> getApiclientDataList(@RequestParam("page") Integer pageNo,
+                                                     @RequestParam("limit") Integer pageSize,
+                                                     @RequestParam(value = "appid", required = false) String appid) {
+    try {
+      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+      return paramService.getApiClientparaPage(appid, pageNo, pageSize);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
+    }
+  }
+
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java b/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
index a255c4c..a28ebf8 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/ParamService.java
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.system.service;
 
+import com.supwisdom.dlpay.framework.domain.TApiClient;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.domain.TSyspara;
 import com.supwisdom.dlpay.framework.util.PageResult;
@@ -19,4 +20,16 @@
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
   PageResult<TBusinesspara> getBusinessparaPage(String paraname, int pageNo, int pageSize);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  TBusinesspara getBusinessparaByParakey(String parakey);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  boolean deleteBusinesspara(TBusinesspara businesspara);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  boolean saveOrUpdateBusinesspara(TBusinesspara businesspara);
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  PageResult<TApiClient> getApiClientparaPage(String appid, int pageNo, int pageSize);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java
index 199682b..89438bc 100644
--- a/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/ParamServiceImpl.java
@@ -1,7 +1,9 @@
 package com.supwisdom.dlpay.system.service.impl;
 
+import com.supwisdom.dlpay.framework.dao.ApiClientDao;
 import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
 import com.supwisdom.dlpay.framework.dao.SysparaDao;
+import com.supwisdom.dlpay.framework.domain.TApiClient;
 import com.supwisdom.dlpay.framework.domain.TBusinesspara;
 import com.supwisdom.dlpay.framework.domain.TSyspara;
 import com.supwisdom.dlpay.framework.util.PageResult;
@@ -30,6 +32,8 @@
   private SysparaDao sysparaDao;
   @Autowired
   private BusinessparaDao businessparaDao;
+  @Autowired
+  private ApiClientDao apiClientDao;
 
   @Override
   public PageResult<TSyspara> getSysparaPage(Integer paraid, String paraname, int pageNo, int pageSize) {
@@ -74,4 +78,39 @@
     return new PageResult<>(businessparaDao.findAll(pageable));
   }
 
+  @Override
+  public TBusinesspara getBusinessparaByParakey(String parakey) {
+    if (!StringUtil.isEmpty(parakey)) {
+      return businessparaDao.findByParakey(parakey.trim());
+    }
+    return null;
+  }
+
+  @Override
+  public boolean deleteBusinesspara(TBusinesspara businesspara) {
+    if (null != businesspara) {
+      businessparaDao.delete(businesspara);
+      return true;
+    }
+    return false;
+  }
+
+  @Override
+  public boolean saveOrUpdateBusinesspara(TBusinesspara businesspara) {
+    if (null != businesspara) {
+      businessparaDao.save(businesspara);
+      return true;
+    }
+    return false;
+  }
+
+  @Override
+  public PageResult<TApiClient> getApiClientparaPage(String appid, int pageNo, int pageSize) {
+    Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by("appid"));
+    if (!StringUtil.isEmpty(appid)) {
+      return new PageResult<>(apiClientDao.findByAppidContaining(appid.trim(), pageable));
+    }
+    return new PageResult<>(apiClientDao.findAll(pageable));
+  }
+
 }
diff --git a/src/main/resources/templates/system/param/apiclientpara.html b/src/main/resources/templates/system/param/apiclientpara.html
new file mode 100644
index 0000000..f82e9c0
--- /dev/null
+++ b/src/main/resources/templates/system/param/apiclientpara.html
@@ -0,0 +1,143 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">应用权限参数管理</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">参数管理</a>
+          <a><cite>应用权限参数管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            搜索：
+            <input id="search-appid" class="layui-input search-input" type="text" maxlength="40" style="width: 300px;"
+                   placeholder="输入APPID查询"/>
+            <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增</button>
+            <button id="btn-reset" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空</button>
+        </div>
+        <table class="layui-table" id="apiClientTable" lay-filter="apiClientTable-filter"></table>
+    </div>
+</div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="apiclient-table-bar">
+    <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+</script>
+
+<!-- 表格状态列 -->
+<script type="text/html" id="api-tpl-state">
+    <input type="checkbox" lay-filter="api-tpl-state" value="{{d.appid}}" lay-skin="switch" lay-text="启用|关闭"
+           {{d.status=='normal'?'checked':''}} />
+</script>
+
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+        // 渲染表格
+        table.render({
+            elem: '#apiClientTable',
+            url: '/param/apiclientparalist',
+            toolbar:'',
+            page: true,
+            cols: [
+                [
+                    {field: 'appid', title: 'APPID', width: 366, align: 'right', fixed: 'left', sort: true},
+                    {field: 'secret', title: '密钥', align: 'left', style:'cursor: pointer;', event: 'modifyValue'},
+                    {field: 'status', title: '状态', width: 100, templet: '#api-tpl-state',sort: true},
+                    {
+                        field: 'roles', title: '角色', templet: function (item) {
+                            return 'test';
+                        }
+                    },
+                    {align: 'center', title: '操作', width: 80, toolbar: '#apiclient-table-bar',  fixed: 'right'}
+                ]
+            ]
+        });
+        // 搜索按钮点击事件
+        $('#btn-search').click(function () {
+            var paraname = $("#search-appid").val();
+            table.reload('apiClientTable', {where: {appid: paraname}, page: {curr: 1}});
+        });
+
+        $('#btn-add').click(function () {
+            admin.popupCenter({
+                title: "新增应用权限",
+                area:["600px","300px"],
+                path: '/param/',
+                finish: function () {
+                    table.reload('businessparaTable');
+                }
+            });
+        });
+
+        $('#btn-reset').click(function () {
+            $("#search-appid").val("");
+        });
+
+        //监听单元格
+        table.on('tool(apiClientTable-filter)', function (obj) {
+            var data = obj.data;
+            if('del' == obj.event){
+                if(confirm("确定要删除业务参数["+data.parakey+"]吗？")){
+                    layer.load(2);
+                    admin.go('/param/deletebusinesspara', {
+                        parakey: data.parakey,
+                        _csrf: $("meta[name='_csrf_token']").attr("value")
+                    }, function (data) {
+                        console.log(data.code);
+                        layer.closeAll('loading');
+                        if (data.code == 200) {
+                            layer.msg(data.msg, {icon: 1});
+                        } else if (data.code == 401) {
+                            layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                                location.replace('/login');
+                            }, 1000);
+                            return;
+                        } else {
+                            layer.msg(data.msg, {icon: 2});
+                        }
+                        table.reload('businessparaTable');
+                    }, function (ret) {
+                        console.log(ret);
+                        layer.closeAll('loading');
+                        layer.msg('请求失败了，请稍后再试', {icon: 2});
+                    });
+                }
+            }else if('modifyValue' == obj.event){
+                layer.prompt({
+                    formType: 2,
+                    title: '修改参数名为 ['+ data.parakey +'] 的值：',
+                    area: ['500px', '200px'],
+                    maxlength: 1000,
+                    value: data.paraval
+                }, function(value, index){
+                    layer.close(index);
+                    admin.go('/param/businessparaupdate', {
+                        parakey: data.parakey,
+                        paraval: value,
+                        _csrf: $("meta[name='_csrf_token']").attr("value"),
+                    }, function (data) {
+                        if (data.code == 200) {
+                            layer.msg("修改成功", {icon: 1});
+                            obj.update({ paraval: value });
+                        } else if (data.code == 401) {
+                            layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                                location.replace('/login');
+                            }, 1000);
+                            return;
+                        } else {
+                            layer.msg(data.msg, {icon: 2});
+                        }
+                    },function () {
+                        layer.msg('修改失败了，请稍后再试', {icon: 2});
+                    });
+                });
+            }
+        });
+
+    });
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/param/businesspara.html b/src/main/resources/templates/system/param/businesspara.html
index 80bcf38..d7a4783 100644
--- a/src/main/resources/templates/system/param/businesspara.html
+++ b/src/main/resources/templates/system/param/businesspara.html
@@ -9,14 +9,22 @@
     <div class="layui-card-body">
         <div class="layui-form toolbar">
             搜索：
-            <input id="search-paraname" class="layui-input search-input" type="text" maxlength="40" placeholder="输入参数名查询"/>&emsp;
+            <input id="search-paraname" class="layui-input search-input" type="text" maxlength="40" style="width: 300px;"
+                   placeholder="输入参数名查询"/>&emsp;
             <button id="btn-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
             </button>
-            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon"></i>新增</button>
+            <button id="btn-add" class="layui-btn icon-btn" data-type="add"><i class="layui-icon">&#xe654;</i>新 增</button>
+            <button id="btn-reset" class="layui-btn layui-btn-primary" data-type="reset"><i class="layui-icon"></i>清 空</button>
         </div>
         <table class="layui-table" id="businessparaTable" lay-filter="businessparaTable-filter"></table>
     </div>
 </div>
+
+<!-- 表格操作列 -->
+<script type="text/html" id="busipara-table-bar">
+    <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
+</script>
+
 <script>
     layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
         var form = layui.form;
@@ -26,23 +34,96 @@
         table.render({
             elem: '#businessparaTable',
             url: '/param/businessparalist',
+            toolbar:'',
             page: true,
             cols: [
                 [
-                    {field: 'parakey', title: '参数名', width: 150, align: 'center', fixed: 'left', sort: true},
-                    {field: 'paraval', title: '参数值', width: 250, align: 'center'}
+                    {field: 'parakey', title: '参数名', width: 366, align: 'right', fixed: 'left', sort: true},
+                    {field: 'paraval', title: '参数值', align: 'left', style:'cursor: pointer;', event: 'modifyValue'},
+                    {align: 'center', title: '操作', width: 80, toolbar: '#busipara-table-bar',  fixed: 'right'}
                 ]
             ]
         });
         // 搜索按钮点击事件
         $('#btn-search').click(function () {
             var paraname = $("#search-paraname").val();
-            table.reload('sysparaTable', {where: {paraid: paraid, paraname: paraname}, page: {curr: 1}});
+            table.reload('businessparaTable', {where: {paraname: paraname}, page: {curr: 1}});
         });
 
-        //监听单元格编辑
-        table.on('edit(sysparaTable-filter)', function (obj) {
+        $('#btn-add').click(function () {
+            admin.popupCenter({
+                title: "新增业务参数",
+                area:["600px","300px"],
+                path: '/param/load4addbuspara',
+                finish: function () {
+                    table.reload('businessparaTable');
+                }
+            });
+        });
 
+        $('#btn-reset').click(function () {
+            $("#search-paraname").val("");
+        });
+
+        //监听单元格
+        table.on('tool(businessparaTable-filter)', function (obj) {
+            var data = obj.data;
+            if('del' == obj.event){
+                if(confirm("确定要删除业务参数["+data.parakey+"]吗？")){
+                    layer.load(2);
+                    admin.go('/param/deletebusinesspara', {
+                        parakey: data.parakey,
+                        _csrf: $("meta[name='_csrf_token']").attr("value")
+                    }, function (data) {
+                        console.log(data.code);
+                        layer.closeAll('loading');
+                        if (data.code == 200) {
+                            layer.msg(data.msg, {icon: 1});
+                        } else if (data.code == 401) {
+                            layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                                location.replace('/login');
+                            }, 1000);
+                            return;
+                        } else {
+                            layer.msg(data.msg, {icon: 2});
+                        }
+                        table.reload('businessparaTable');
+                    }, function (ret) {
+                        console.log(ret);
+                        layer.closeAll('loading');
+                        layer.msg('请求失败了，请稍后再试', {icon: 2});
+                    });
+                }
+            }else if('modifyValue' == obj.event){
+                layer.prompt({
+                    formType: 2,
+                    title: '修改参数名为 ['+ data.parakey +'] 的值：',
+                    area: ['500px', '200px'],
+                    maxlength: 1000,
+                    value: data.paraval
+                }, function(value, index){
+                    layer.close(index);
+                    admin.go('/param/businessparaupdate', {
+                        parakey: data.parakey,
+                        paraval: value,
+                        _csrf: $("meta[name='_csrf_token']").attr("value"),
+                    }, function (data) {
+                        if (data.code == 200) {
+                            layer.msg("修改成功", {icon: 1});
+                            obj.update({ paraval: value });
+                        } else if (data.code == 401) {
+                            layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                                location.replace('/login');
+                            }, 1000);
+                            return;
+                        } else {
+                            layer.msg(data.msg, {icon: 2});
+                        }
+                    },function () {
+                        layer.msg('修改失败了，请稍后再试', {icon: 2});
+                    });
+                });
+            }
         });
 
     });
diff --git a/src/main/resources/templates/system/param/busparaform.html b/src/main/resources/templates/system/param/busparaform.html
new file mode 100644
index 0000000..2c4aebf
--- /dev/null
+++ b/src/main/resources/templates/system/param/busparaform.html
@@ -0,0 +1,89 @@
+<form id="form" lay-filter="form" class="layui-form model-form">
+    <div class="layui-form-item">
+        <label class="layui-form-label">参数名</label>
+        <div class="layui-input-block">
+            <input name="parakey" placeholder="请输入参数名" type="text" class="layui-input" maxlength="30"
+                   lay-verify="required|businame" required/>
+        </div>
+    </div>
+    <div class="layui-form-item">
+        <label class="layui-form-label">参数值</label>
+        <div class="layui-input-block">
+            <textarea name="paraval" placeholder="请输入内容" class="layui-textarea" required></textarea>
+        </div>
+    </div>
+
+    <div class="layui-form-item model-form-footer">
+        <button class="layui-btn layui-btn-primary" type="button" ew-event="closeDialog">取消</button>
+        <button class="layui-btn" lay-filter="form-submit" lay-submit  id="submitbtn">保存</button>
+    </div>
+</form>
+
+
+<script>
+    layui.use(['layer', 'admin', 'form'], function () {
+        var layer = layui.layer;
+        var admin = layui.admin;
+        var form = layui.form;
+        form.render('radio');
+        form.verify({
+            "businame": function (e) {
+                var msg = "";
+                $.ajax({
+                    type: "GET",
+                    url: '/param/checkbusname',
+                    async: false,
+                    data: {
+                        parakey: e
+                    },
+                    success: function (result) {
+                        if (result.code != 200) {
+                            msg = result.msg;
+                        }
+                    },
+                    error: function (error) {
+                        msg = "请求服务器校验参数名失败";
+                    }
+                });
+                if (msg != "") {
+                    return msg;
+                }
+            }
+        });
+
+        var url = '/param/addbusinesspara';
+        // 表单提交事件
+        form.on('submit(form-submit)', function (data) {
+            layer.load(2);
+            var vdata = data.field;
+            vdata["_csrf"] = $("meta[name='_csrf_token']").attr("value");
+            console.log("postdata=",data)
+            $.ajax({
+                type : "POST",
+                dataType : "json",
+                url : url,
+                data : vdata,
+                success : function(result) {
+                    layer.closeAll('loading');
+                    if (result.code == 200) {
+                        layer.msg(result.msg, {icon: 1});
+                        admin.finishPopupCenter();
+                    } else if (result.code == 401) {
+                        layer.msg(result.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else {
+                        console.log('err:' + result.code);
+                        layer.msg(result.msg, {icon: 2});
+                    }
+                },
+                error : function() {
+                    layer.closeAll('loading');
+                    layer.msg("请求服务器失败！", {icon: 2});
+                }
+            });
+            return false;
+        });
+    });
+</script>
\ No newline at end of file
