如何提高码农产量,基于ASP.NET MVC的敏捷开发框架之自定义表单开发随笔四“

5 篇文章 0 订阅
4 篇文章 0 订阅

“厂长,上一次我们讲过了工作流的整体规划,今天我要动手做啦!我想先把工作流的自定义表单做出来。”

“好的,以前我做这方面的东西,我给你设计了一份表结构,你先拿去看看。”


“厂长,是不是没发完,怎么就一个表?”

“我就知道你会这么问,我现在给你解释一下重点字段的含义。”

数据表:将表单上的内容保存到哪个表。

关联表的主键:要保存表单数据那张表的主键。

是否需要建表:是否需要把表单中的数据存入到表中,这里的意思是,是将表单上面的栏位与数据表的字段一一对应还是直接将整个表单的内容打包存一块。这里呢就看用户的需要啦,如果需要作统计汇总之类的数据分析,就按字段保存好了,如果不是就可以不用为表单上面每一个栏位都对应到数据字段,这样操作起来也简单。

表单内容:注意啦!就是这里,其实我是想把表单上所有的内容以json形式全部保存到一个字段里。这样后台不用再单独去建一张表来保存这些东西。前台统一去解析就好了。

“明白了,这样做确实好,可以少用好多表。”

“好的,闲话少说,我给你看第一个界面,我们在做界面布局的时候要考虑用户操作便捷性,所以可以做成向导式的。”


“演示地址就是下面这个,你可以去看看”

http://www.learun.cn:8090 、 用户名:System,密码:0000


“厂长,这里点下一步就是跳到一个新的页面吗?”

“当然不是,其实是多个DIV之间的切换。来我给你看看代码。”

“别个这个页面看起来很复杂的样子,其实就是几个div+js实现的。先看html”

<div class="widget-body">
    <div id="wizard" class="wizard" data-target="#wizard-steps" >
        <ul class="steps">
            <li data-target="#step-1" class="active"><span class="step">1</span>基本配置<span class="chevron"></span></li>
            <li data-target="#step-2"><span class="step">2</span>表单设计<span class="chevron"></span></li>
            <li data-target="#step-4"><span class="step">3</span>创建完成<span class="chevron"></span></li>
        </ul>
    </div>
    <div class="step-content wizard-step-content" id="wizard-steps">
        <div class="step-pane wizard-step-pane active" id="step-1">
        </div>
        <div class="step-pane flowapp" id="step-2">
            <div id="frmdesign"></div>
        </div>
        <div class="step-pane" id="step-4">
            <div class="drag-tip">
                <i class="fa fa-check-circle"></i>
                <p >设计完成,请点击保存</p>
            </div>
        </div>
    </div>
    <div class="form-button" id="wizard-actions">
        <a id="btn_last" disabled class="btn btn-default btn-prev">上一步</a>
        <a id="btn_next" class="btn btn-default btn-next">下一步</a>
        <a id="btn_caogao" class="btn btn-info">保存草稿</a>
        <a id="btn_finish" disabled class="btn btn-success" οnclick="finishbtn();">保存</a>
    </div>
</div>
再来看一下JS

        //加载导向
        $('#wizard').wizard().on('change', function (e, data) {
            var $finish = $("#btn_finish");
            var $next = $("#btn_next");
            if (data.direction == "next") {
                switch (data.step) {
                    case 1:
                        return bindingBase();
                        break;
                    case 2://绑定表单
                        if (!bindingFrm()) {
                            return false;
                        }
                        $finish.removeAttr('disabled');
                        $next.attr('disabled', 'disabled');
                        $('#btn_caogao').attr('disabled', 'disabled');
                        break;
                    default:
                        break;
                }
            } else {
                $finish.attr('disabled', 'disabled');
                $next.removeAttr('disabled');
                $('#btn_caogao').removeAttr('disabled');
            }
        });

“哇,真的呢,这种效果好,果然是可以跳来跳去的。那你现在讲一下这个拖拽的表单是怎么实现的吧。”

“恩,你看看,这个东西的原理其实就是拼接html,左边放工具栏,工具栏上选择不同的工具其实就是不同类型的控件,右侧设置控件的属性。中间显示效果。”

 function setFrmInfo(data)
    {
        var _height = $(window).height() - 87 < 410 ? 410 : $(window).height() - 87;
        postData.FrmContent = data.FrmContent;
        if (data.isSystemTable == "0") {
            frmapp = $('#frmdesign').frmDesign({
                Height: _height,
                frmContent: postData.FrmContent
            });
        }
        else {
            var _frmdatabase = [];
            for (var i in frmdatabase)
            {
                if (frmdatabase[i].column != postData.FrmTableId)
                {
                    _frmdatabase.push(frmdatabase[i]);
                }
            }
            frmapp = $('#frmdesign').frmDesign({
                Height: _height,
                tablefiledJsonData: _frmdatabase,
                isSystemTable: postData.isSystemTable,
                frmContent: postData.FrmContent
            });
        }
    }
    function bindingFrm() {
        var frmcotentls = frmapp.getData();
        if (!frmcotentls) {
            return false;
        }
        postData.FrmContent = JSON.stringify(frmcotentls);
        return true;
    }
    /*=========表单选择(end)====================================================================*/

    /*=========创建完成(begin)==================================================================*/
    function finishbtn() {
        postData["EnabledMark"] = 1;
        $.SaveForm({
            url: "../../FlowManage/FormDesign/SaveForm?keyValue=" + keyValue,
            param: postData,
            loading: "正在保存数据...",
            success: function () {
                $.currentIframe().$("#gridTable").trigger("reloadGrid");
            }
        })
    }

后台代码:


        /// <summary>
        /// 保存用户表单(新增、修改)
        /// </summary>
        /// <param name="keyValue">主键值</param>
        /// <param name="userEntity">用户实体</param>
        /// <returns></returns>
        [HttpPost]
        [ValidateAntiForgeryToken]
        [AjaxOnly]
        public ActionResult SaveForm(string keyValue, WFFrmMainEntity userEntity)
        {
            wfFrmMainBLL.SaveForm(keyValue, userEntity);
            return Success("操作成功。");
        }

        /// <summary>
        /// 保存表单
        /// </summary>
        /// <param name="entity">表单模板实体类</param>
        /// <param name="keyValue">主键</param>
        /// <returns></returns>
        public int SaveForm(string keyValue,WFFrmMainEntity entity)
        {
            try
            {
                if (string.IsNullOrEmpty(keyValue))
                {
                    entity.Create();
                    this.BaseRepository().Insert(entity);
                }
                else
                {
                    entity.Modify(keyValue);
                    this.BaseRepository().Update(entity);
                }
                return 1;
            }
            catch(Exception)
            {
                throw;
            }
        }
就这么简单,一个功能就完了。


系统支持无限级分类、采集、生成静态HTML、ajax 自定义表单 系统标签说明: 的标签结构形如(ror标签): #{…/} 或 #{…}***{/} 内嵌标签: 标签: ##.../# 如同#{…/} 在#{…/}中使用 字段值:[$$$/] 其中 … 是标签参数 ***是循环调用的模块 $$$是字段名 具体标签及说明如下: 1、#{host fieldname=hostname/} 说明: 系统参数: 网站名称: fieldname=hostname 关键字: fieldname=hostkey 虚拟目录: fieldname=hosturl 2、#{param=classname/} 说明: 访问页面的各种通用参数: 栏目名称: param=classname 文档名称: param=title URL参数: param=*** 特别说明: 当栏目类型为单页面时,调用单页面内容使用param=content 3、#{ position /} 说明:当前位置 4、#{ menu /} Top: 显示数量,默认为10 Menutype: 菜单属性,默认顶级栏目菜单 Top:顶级栏目菜单 Self:同级栏目菜单 Sun:下级栏目菜单 Typelink: 相应栏目的链接地址 5、#{clalist …/} 或 #{clalist …}***{/} 说明:部分栏目文档列表(没有分页) Top: 读取的文档数目,默认10 Titlelen: 标题显示长度,默认30 Showtitle: 鼠标悬停时是否显示完整标题,默认不显示 Orderby: 排序字段,默认id(当order为rnd时可以不设置) Order: 顺序,默认降序(升序:asc 降序:desc 随机:rnd ) Classid: 所属栏目(0和all都表示所有栏目) all:按栏目显示相应数目的文档 0: 不按栏目显示相应数目的文档 clacol: 循环块列数 artcol: 文档列表列数 clastyle: 每个循环块的样式 artstyle: 每个循环块中文档列表区域的样式 Maxlen: 各个字段的最大显示长度,默认100 Textlink: 形如:*** Typelink: 相应文档的链接地址(…) Imglink: 形如: Imgheight:图片高度 Imgwidth:图片宽度 Arttype: 文档属性 Image: 图片 Slide: 幻灯 Roll: 滚动 Common: 普通 Good: 推荐 #{clalist …/}:不用设置***,系统默认为textlink 嵌套标签:{class}…[classtext/] [classlink/]…{/class} 说明:classtext 栏目名 classlink 栏目链接 6、#{artlist …/} 或 #{artlist …}***{/} 说明:全部栏目文档列表(有分页)属性类似于clalist 没有Showclass及设置其属性的各种标签 Pagelist:分页列表 Search:搜索页使用标签,关键字自定义字段值,默认为key 7、#{art_view}***{/} 说明:文档显示页标签 可以显示文档的各个字段值,如:title,hits,content,ctime等 #{Prenext/}:显示上一篇、下一篇 8、#{pl }***{/} 9、#{book }***{/} 更多、更详细的标签自己在使用中来发现哦!~~~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值