layui+vue
<html> <head> <meta name="viewport" content="width=device-width"> <title>Edit</title> <link href="/Content/layui-v2.4.5/layui/css/layui.css" rel="stylesheet"> <script src="/Scripts/jquery-3.3.1.min.js"></script> <script src="/Content/layui-v2.4.5/layui/layui.js"></script> <script src="/Scripts/vue.min.js"></script> <script src="/Scripts/axios.min.js"></script> <link id="layuicss-layer" rel="stylesheet" href="http://localhost:53731/Content/layui-v2.4.5/layui/css/modules/layer/default/layer.css?v=3.1.1" media="all"></head> <body> <div style="padding:20px 50px 0px 0px;"> <div class="layui-form" id="appcontainer"> <div class="layui-form-item"> <label class="layui-form-label">名称</label> <div class="layui-input-inline" style="width:300px;"> <input type="text" name="rcname" v-model="rc.rcname" lay-verify="required" placeholder="请输入规则集名称" autocomplete="off" class="layui-input"> </div> <label class="layui-form-label">状态</label> <div class="layui-input-inline"> <input type="checkbox" name="rcstate" id="cbRcstate" lay-text="启用|禁用" :checked="rc.rcstate==1?'checked':''" lay-skin="switch"> </div> <div class="layui-input-inline" style="text-align:right; float:right;"> <button class="layui-btn" lay-submit lay-filter="btnSave">保存</button> </div> <div style="clear:both;"></div> </div> <div class="layui-form-item"> <label class="layui-form-label">描述</label> <div class="layui-input-block"> <textarea class="layui-textarea" name="rcdescription" v-model="rc.rcdescription" placeholder="规则集描述"></textarea> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">类型</label> <div class="layui-input-inline" style="width:300px;"> <select name="rtid" id="cbRuleType" lay-filter="ruleType"> <option value="" selected="selected">请选择</option> <option v-for="rt in ruleType" :value="rt.rtid">{{rt.rname}}</option> </select> </div> <label class="layui-form-label">规则</label> <div class="layui-input-inline" style="width:300px;"> <select name="rtid" id="cbRule" lay-filter="rule"> <option value="" selected="selected">请选择</option> <option v-for="r in rules" :value="r.rid">{{r.rname}}</option> </select> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">组成</label> <div class="layui-input-block"> <table id="tblData" class="layui-table"> <thead> <tr> <th>名称</th> <th>类型</th> <th>描述</th> <th style="width:230px;">操作</th> </tr> </thead> <tbody> <tr v-for="r in rc.detail"> <td>{{r.rname}}</td> <td>{{r.rtname}}</td> <td>{{r.rdescription}}</td> <td><operation v-on:delrow="delRow" v-model="r" v-bind:rcdid="r.rcdid" v-on:refresh="getDetail"></operation></td> </tr> </tbody> </table> </div> </div> </div> </div> <script type="x-template" id="operation"> <div> <!-- vue组件模板需要一个根元素 --> <a class="layui-btn layui-btn-xs" lay-event="up" @@click="fnMove(rcdid,1);">上移</a> <a class="layui-btn layui-btn-xs" lay-event="down" @@click="fnMove(rcdid,2);">下移</a> <a class="layui-btn layui-btn-xs" lay-event="top" @@click="fnMove(rcdid,3);">置顶</a> <a class="layui-btn layui-btn-xs" lay-event="bottom" @@click="fnMove(rcdid,4);">置底</a> <a class="layui-btn layui-btn-xs" lay-event="del" @@click="$emit('delrow',value);">删除</a> </div> </script> <script type="text/javascript"> var app = new Vue({ el: "#appcontainer", data: { key: '@ViewBag.Key', isAdd: '@ViewBag.IsAdd', ruleType: [], rules:[], rc: { rcid: "", rcname: "", rcstate:"0", rcdescription:"", detail: [] } }, components: { // 操作组件 "operation": { template: "#operation", props: ["value","rcdid"], methods: { fnMove: function (rcdid, op) { var vm = this; $.ajax({ type: "POST", url: "/RuleCollection/Move?key=" + rcdid + "&op=" + op, dataType: "json", async: false, success: function (res) { // 调用父实例中的方法 刷新数据 vm.$emit("refresh"); layer.msg("操作成功!"); } }); } } } }, mounted: function () { this.getRuleType(); if (this.isAdd != "1") { // 编辑时 需要初始化数据 this.getDetail(); } }, updated: function () { var vm = this; layui.use(['form', 'layer', 'element'], function () { var form = layui.form, layer = layui.layer; // 规则集状态 form.on("switch", function (data) { vm.rc.rcstate = vm.rc.rcstate == 0 ? 1 : 0; }); // 规则类型下拉框事件 form.on("select(ruleType)", function (data) { vm.getRule(data.value); }); // 规则下拉框事件 form.on("select(rule)", function (data) { vm.getRuleInfo(data.value); }); // 提交保存 form.on("submit(btnSave)", function () { $.ajax({ type: "POST", url: "/RuleCollection/Save?key=" + vm.key + "&isadd=" + vm.isAdd, dataType: "json", data: vm.rc, async: false, success: function (res) { layer.msg(res.msg); } }); return false; }); form.render("select"); }); }, methods: { delRow: function (r) { var vm = this; layer.confirm('确认执行此操作吗?', { btn: ['确定', '取消'], title: "提示" }, function () { if (r.rcdid != undefined && r.rcdid != "") { // 从数据库删除 然后更新数据 $.ajax({ type: "POST", url: "/RuleCollection/DelDetail?key=" + r.rcdid, dataType: "json", async: false, success: function (res) { // 更新数据 vm.getDetail(); layer.msg("删除成功!"); } }); return; } // 删除行 仅从本地删除 $(vm.rc.detail).each(function (index, element) { if (this.rid == r.rid) { vm.rc.detail.splice(index, 1); layer.msg("删除成功!"); } }); }); }, getDetail: function () { // 获取规则集和详情 var vm = this; $.ajax({ type: "POST", url: "/RuleCollection/GetDetail?key=" + vm.key, dataType: "json", async: false, success: function (res) { vm.rc = res.data; } }); }, getRuleType: function () { // 获取规则类型 var vm = this; $.ajax({ type: "POST", url: "/RuleType/GetList?page=1&limit=100&rstate=1", dataType: "json", async: false, success: function (res) { vm.ruleType = res.data; } }); }, getRule: function (rtid) { // 获取可用规则 var vm = this; $.ajax({ type: "POST", url: "/Common/GetRuleddl", dataType: "json", data: { rstate: true, rtid: rtid }, async: false, success: function (res) { vm.rules = res.data; //layui.form.render("select"); } }); }, getRuleInfo: function (rid) { // 根据规则id 获取信息 添加行 var vm = this; // 检查是否已添加 var isexists = false; $(this.rc.detail).each(function (index, element) { if (this.rid == rid) { isexists = true; layer.msg("不允许重复添加!"); return; } }); if (isexists) { return; } $.ajax({ type: "POST", url: "/RuleCollection/AddDetail", dataType: "json", data: { rcid: vm.key, rid: rid }, async: false, success: function (res) { vm.getDetail(); } }); } } }); </script> </body> </html>