通过实例学习Fireasy开发(下篇)

      本文目录

通过实例学习Fireasy开发(上篇)

通过实例学习Fireasy开发(中篇)

      通过实例学习Fireasy开发(下篇)

通过实例学习Fireasy开发(补充)

      一、员工列表页面

EmployeeList.aspx页面的需求是这样的,左边是部门树,右边是员工列表,点击部门节点后右边显示该部门下面的员工,同时提供岗位、生日期间查询。

对table:#dg处进行改造,加下一个treegrid列表:

                <div data-options="region:‘center‘,border:false">
                    <div id="layout" class="easyui-layout" data-options="fit:true,border:false">
                        <div data-options="region:‘west‘,border:false,split:true" style="width:220px">
                            <table id="dgDept">
                            </table>
                        </div>
                        <div data-options="region:‘center‘,border:false">
                            <table id="dg">
                            </table>
                        </div>
                    </div>
                </div>

然后在js里加入一个loadDepts函数,并且一开始就加载部门树:

        $(function () {
            loadDepts();
            loadData();
        })

        function loadDepts() {
            $(‘#dgDept‘).treegrid({
                url: ‘DeptList.ajx/GetDepts‘,
                fit: true,//自动填充
                idField: ‘id‘,
                treeField: ‘text‘,
                columns: [[
                    { field: ‘text‘, title: ‘部门‘, width: 180 }
                ]],
                onClickRow: function (row) {
                    $(‘#dg‘).datagrid({
                        queryParams: { deptNo: row.attributes.no }
                    });
                }
            })
        }

修改loadData函数,把不需要的列移除掉,然后,浏览EmployeeList.aspx页面,显示如下:

loadDepts函数里,treegrid的onClickRow事件里,datagrid将使用no作为条件筛选员工数据。修改EmployeeList.aspx.cs类中的GetEmployees方法,增加一个参数deptNo,如下:

        /// <summary>
        /// 根据查询条件获取员工。
        /// </summary>
        /// <param name="deptNo">部门编码。</param>
        /// <param name="keyword">关键字</param>
        /// <returns></returns>
        [ExceptionBehavior(true)]
        public object GetEmployees(string deptNo, string keyword)
        {
            var pager = EasyUIHelper.GetDataPager();
            var sorting = EasyUIHelper.GetSorting();
            using (var context = new DbContext())
            {
                var list = context.Employees
                    .Segment(pager)
                    //.OrderBy(sorting)
                    .AssertWhere(!string.IsNullOrEmpty(deptNo), s => s.Dept.No.StartsWith(deptNo))
                    //.AssertWhere(!string.IsNullOrEmpty(keyword), s => s.Name.Contains(keyword))
                    .ToList();
                return EasyUIHelper.Transfer(pager, list);
            }
        }

AssertWhere是一个扩展方法,来自Fireasy.Common.Extensions,如果deptNo不为空的时候,使用Dept这个关联属性的No进行like查询,也就是说TB_EMPLOYEE join 上 TB_DEPT查询。

EasyUIHelper的GetDataPager用于构造easyui-datagrid传递过来的两个分页参数,构造出一个分页对象pager,Linq再使用Segment扩展方法将pager传进去分页。最后,使用Transfer方法把结果转换为 { total: 10, rows: [] } 这样的json结构。

增加额外的查询条件。

我们在EmployeeList.aspx的query区加入日期和岗位查询条件。

                    <div class="query">
                        <table>
                            <tr>
                                <td>出生日期</td>
                                <td><input id="txtStartTime" class="easyui-datebox" style="width:110px" /></td>
                                <td>至</td>
                                <td><input id="txtEndTime" class="easyui-datebox" style="width:110px" /></td>
                                <td>岗位</td>
                                <td><input id="txtPost" class="easyui-combobox" data-options="url:‘EmployeeList.ajx/GetPosts‘,valueField:‘Value‘,textField:‘Name‘,panelHeight:‘auto‘" style="width:110px" /></td>
                                <td>快速查询</td>
                                <td>
                                    <input id="txtKeyword" type="text" class="easyui-textbox enterQuery" data-options="prompt:‘名称或拼音首字母‘" style="width: 160px" /></td>
                                <td><a class="easyui-linkbutton" onclick="query()" data-options="iconCls:‘icon-search‘">查询</a>
                                </td>
                            </tr>
                        </table>
                    </div>

在EmployeeList.aspx.cs里增加方法GetPosts,该方法用于获取岗位代码,岗位代码我们先用枚举来表示。

枚举定义在WebApplicaiton1.Data的Enums.cs里。对了,还需要一个性别的枚举,这个时候一起定义好了。

    public enum PostKinds
    {
        [EnumDescription("首席执行官")]
        CEO,
        [EnumDescription("首席财务官")]
        CFO,
        [EnumDescription("首席技术官")]
        CTO,
        [EnumDescription("首席运营官")]
        COO,
        [EnumDescription("首席信息官")]
        CIO,
    }

    public enum Sex
    {
        [EnumDescription("男")]
        Male,
        [EnumDescription("女")]
        Female
    }

EnumDescriptionAttribute是用于标记中文描述的特性。

GetPosts方法就是将该中文描述和枚举值返回给前台。

        public object GetPosts()
        {
            var list = typeof(PostKinds).GetEnumList()
                .Select(s => new { Value = s.Key.ToString(), Name = s.Value })
                .ToList();
            list.Insert(0, new { Value = "", Name = "--全部--" });
            return list;
        }

修改EmployeeList.aspx中的query函数,加入查询条件:

        //查询
        function query() {
            $(‘#dg‘).datagrid(‘unselectAll‘);
            $(‘#dg‘).datagrid({
                queryParams: {
                    startTime: $(‘#txtStartTime‘).datebox(‘getValue‘),
                    endTime: $(‘#txtEndTime‘).datebox(‘getValue‘),
                    post: $(‘#txtPost‘).combobox(‘getValue‘),
                    keyword: $(‘#txtKeyword‘).val()
                }
            });
        }

相应的在EmployeeList.aspx.cs中,修改GetEmployees方法,加入这三个参数。

        /// <summary>
        /// 根据查询条件获取员工。
        /// </summary>
        /// <param name="deptNo">部门编码。</param>
        /// <param name="startTime">开始日期。</param>
        /// <param name="endTime">结束时间。</param>
        /// <param name="post">岗位类别。</param>
        /// <param name="keyword">关键字</param>
        /// <returns></returns>
        [ExceptionBehavior(true)]
        public object GetEmployees(string deptNo, DateTime? startTime, DateTime? endTime, PostKinds? post, string keyword)
        {
            var pager = EasyUIHelper.GetDataPager();
            var sorting = EasyUIHelper.GetSorting();
            using (var context = new DbContext())
            {
                var list = context.Employees
                    .Segment(pager)
                    //.OrderBy(sorting)
                    .AssertWhere(!string.IsNullOrEmpty(deptNo), s => s.Dept.No.StartsWith(deptNo))
                    .AssertWhere(startTime != null, s => s.Birthday >= startTime.Value.StartOfDay())
                    .AssertWhere(endTime != null, s => s.Birthday <= endTime.Value.EndOfDay())
                    .AssertWhere(post != null, s => s.Post == post)
                    .AssertWhere(!string.IsNullOrEmpty(keyword), s => s.Name.Contains(keyword))
                    .ToList();
                return EasyUIHelper.Transfer(pager, list);
            }
        }

注意,由于日期可以置空,所以参数中应使用可空类型,然后使用AssertWhere扩展方法来拼接LINQ。

参数post使用了PostKinds枚举类型,我们需要修改一个Employee实体类型的Post属性类型由原来的int?改成PostKinds:

        /// <summary>
        /// 获取或设置职务。
        /// </summary>
        public PostKinds Post
        {
            get { return (PostKinds)GetValue(EpPost); }
            set { SetValue(EpPost, value); }
        }

好了,员工列表页面至此就做完了。

      二、员工编辑页面

打开EmployeeEdit.aspx,调整表单区域如下:

    <% var Html = new HtmlHelper<WebApplication.Data.Model.Employee>(); %>
    <div data-options="region:‘center‘,border:false">
        <table class="form-body">
            <tr>
                <td class="addon">部门</td>
                <td><%= Html.ComboBox(s => s.DeptId).MarkDelayedSet().MarkNoClear()%></td>
            </tr>
            <tr>
                <td class="addon">编号</td>
                <td><%= Html.TextBox(s => s.No) %></td>
            </tr>
            <tr>
                <td class="addon">性别</td>
                <td><%= Html.ComboBox(s => s.Sex, typeof(WebApplication.Data.Model.Sex), new ComboBoxSettings { PanelHeight = 0 }).MarkNoClear() %></td>
            </tr>
            <tr>
                <td class="addon">姓名</td>
                <td><%= Html.TextBox(s => s.Name) %></td>
            </tr>
            <tr>
                <td class="addon">出生日期</td>
                <td><%= Html.DateBox(s => s.Birthday) %></td>
            </tr>
            <tr>
                <td class="addon">职务</td>
                <td><%= Html.ComboBox(s => s.Post, typeof(WebApplication.Data.Model.PostKinds), new ComboBoxSettings { PanelHeight = 0 }).MarkNoClear() %></td>
            </tr>
            <tr>
                <td class="addon">手机号码</td>
                <td><%= Html.TextBox(s => s.Mobile) %></td>
            </tr>
            <tr>
                <td class="addon">家庭住址</td>
                <td><%= Html.TextBox(s => s.Address) %></td>
            </tr>
            <tr>
                <td class="addon">个人说明</td>
                <td><%= Html.TextMultiBox(s => s.Description) %></td>
            </tr>
            <tr>
                <td class="addon">可用</td>
                <td><%= Html.CheckBox(s => s.State, true) %></td>
            </tr>
        </table>
    </div>

ComboBox扩展方法可以直接绑定枚举类型。

注意到扩展后面的两个方法了没,MarkDelayedSet标记该combobox加载完后再设置值,不然一开始可能会看到一个GUID值,这样不太友好;MarkNoClear标记该combobox的值不被清空,当点击“保存并新建”的时候,该列表框的值还保持所选择的项。

浏览EmployeeList.aspx页面,点击添加按钮,查看一下现在的编辑页面。

接下来,我们把部门的数据给绑定上去。

在EmployeeEdit.aspx文件中添加一个loadDepts函数,该函数直接使用DeptList中的方法了,指定targetId,会把它所在的每一层都展开。然后在loadInfo里加入loadDepts函数:

        var deptId = ‘<%= Request.QueryString["deptId"] %>‘;
        //加载模块
        function loadDepts() {
            $(‘#cboDeptId‘).combotree({
                url: "DeptList.ajx/GetDepts?targetId=" + deptId,
                panelWidth: 260,
                onLoadSuccess: function () {
                    $(‘#cboDeptId‘).combotree(‘setValue‘, deptId);
                }
            })
        }

        //加载信息
        function loadInfo() {
            if (id != ‘‘) {
                $.getJSON(‘EmployeeEdit.ajx/GetEmployee?id=‘ + id, function (data) {
                    common.processResult(data, function () {
                        $(‘#form1‘).form(‘load‘, data);
                        deptId = data.DeptId;
                        loadDepts();
                    });
                });

                $(‘#btnSaveAndNew‘).remove();
            }
            else {
                loadDepts();
            }
        }

新增员工时,deptId是从EmployeeList.aspx页面传过来的,看它的addInfo函数:

        //添加信息
        function addInfo() {
            var row = $(‘#dgDept‘).treegrid(‘getSelected‘);
            var deptId = row == null ? ‘‘ : row.id;
            common.showDialog(‘EmployeeEdit.aspx?deptId=‘ + deptId, ‘员工‘, 700, 450, function () {
                $(‘#dg‘).datagrid(‘reload‘);
            });
        }

最后,只剩下保存的处理了,修改saveInfo函数:

        //保存信息
        function saveInfo(isNew) {
            if (!$(‘#form1‘).form(‘validate‘)) {
                return;
            }

            var postData = new Object();

            //将表单填充的内容序列化为json
            var data = $(‘#form1‘).form(‘save‘);
            data.DeptId = $(‘#cboDeptId‘).combotree(‘getValue‘);
            postData["info"] = JSON.stringify(data);

            common.showProcess();
            $.post(‘EmployeeEdit.ajx/SaveEmployee?id=‘ + id, postData, function (result) {
                common.processResult(result, function () {
                    if (isNew) {
                        $(‘#form1‘).form(‘clear‘);
                    }

                    id = isNew ? ‘‘ : result.data;
                    common.setReturnValue(true);
                });
            });
        }

好,添加一个员工试试,OK,保存成功!

点击部门树进行查询,使用日期、岗位、关键字查询,都OK!

等等,哪里不太对劲?哦,列表中的性别和岗位还是显示数字,我们要把它变成中文!

修改一下EmployeeList.aspx.cs中的GetEmployees方法,对返回的对象转换一下:

        /// <summary>
        /// 根据查询条件获取员工。
        /// </summary>
        /// <param name="deptNo">部门编码。</param>
        /// <param name="startTime">开始日期。</param>
        /// <param name="endTime">结束时间。</param>
        /// <param name="post">岗位类别。</param>
        /// <param name="keyword">关键字</param>
        /// <returns></returns>
        [ExceptionBehavior(true)]
        public object GetEmployees(string deptNo, DateTime? startTime, DateTime? endTime, PostKinds? post, string keyword)
        {
            var pager = EasyUIHelper.GetDataPager();
            var sorting = EasyUIHelper.GetSorting();
            using (var context = new DbContext())
            {
                var list = context.Employees
                    .Segment(pager)
                    //.OrderBy(sorting)
                    .AssertWhere(!string.IsNullOrEmpty(deptNo), s => s.Dept.No.StartsWith(deptNo))
                    .AssertWhere(startTime != null, s => s.Birthday >= startTime.Value.StartOfDay())
                    .AssertWhere(endTime != null, s => s.Birthday <= endTime.Value.EndOfDay())
                    .AssertWhere(post != null, s => s.Post == post)
                    .AssertWhere(!string.IsNullOrEmpty(keyword), s => s.Name.Contains(keyword))
                    .Select(s => new
                        {
                            s.Id,
                            s.No,
                            s.Name,
                            Sex = ((Sex)s.Sex).GetDescription(),
                            Post = s.Post.GetDescription(),
                            s.Birthday,
                            s.Mobile,
                            s.Address,
                            s.Description
                        })
                    .ToList();
                return EasyUIHelper.Transfer(pager, list);
            }
        }

当然,也可以使用Extend方法来扩展属性,只是前台页面要改一下datagrid的field,并且注意不能用这两个属性进行排序。

        /// <summary>
        /// 根据查询条件获取员工。
        /// </summary>
        /// <param name="deptNo">部门编码。</param>
        /// <param name="startTime">开始日期。</param>
        /// <param name="endTime">结束时间。</param>
        /// <param name="post">岗位类别。</param>
        /// <param name="keyword">关键字</param>
        /// <returns></returns>
        [ExceptionBehavior(true)]
        public object GetEmployees(string deptNo, DateTime? startTime, DateTime? endTime, PostKinds? post, string keyword)
        {
            var pager = EasyUIHelper.GetDataPager();
            var sorting = EasyUIHelper.GetSorting();
            using (var context = new DbContext())
            {
                var list = context.Employees
                    .Segment(pager)
                    //.OrderBy(sorting)
                    .AssertWhere(!string.IsNullOrEmpty(deptNo), s => s.Dept.No.StartsWith(deptNo))
                    .AssertWhere(startTime != null, s => s.Birthday >= startTime.Value.StartOfDay())
                    .AssertWhere(endTime != null, s => s.Birthday <= endTime.Value.EndOfDay())
                    .AssertWhere(post != null, s => s.Post == post)
                    .AssertWhere(!string.IsNullOrEmpty(keyword), s => s.Name.Contains(keyword))
                    .Select(s => s.Extend(new
                        {
                            SexText = ((Sex)s.Sex).GetDescription(),
                            PostText = s.Post.GetDescription()
                        }))
                    .ToList();
                return EasyUIHelper.Transfer(pager, list);
            }
        }

现在,我们再浏览一个EmployeeList.aspx,性别和岗位都用中文显示出来了吧:

好了,员工管理就这样做完了。通过部门管理和员工管理这两个典型功能的讲解,不知道你对整个过程有没有一个大概的了解了。

本实例的源代码将在一下篇完成后附上下载链接。

时间: 2024-08-13 13:21:26

通过实例学习Fireasy开发(下篇)的相关文章

通过实例学习Fireasy开发(补充)

      本文目录 通过实例学习Fireasy开发(上篇) 通过实例学习Fireasy开发(中篇) 通过实例学习Fireasy开发(下篇)       通过实例学习Fireasy开发(补充) 前面的功能已经开发完成了,但是这里专门用一章来进行补充.       一.EasyUI验证 不知道你有没有发现,我们虽然在EmployeeMetada里加了验证特性RequiredAttribute.StringLengthAttribute,但是页面并没有在data-options里生成validTyp

通过实例学习Fireasy开发(中篇)

      本文目录 通过实例学习Fireasy开发(上篇) 通过实例学习Fireasy开发(下篇) 通过实例学习Fireasy开发(补充) 上篇我们介绍了进行Fireasy开发的前期准备,接下来,我们将通过两个小功能来演示怎么进行业务开发.       一.部门列表页面 部门是树型结构,Fireasy采用了00010001这样的编码来支持树结构实体的快速开发. 1. 修改Dept类(使用Dept_Ex分部类文件),在类名称上添加EntityTreeMappingAttribute特性,Inne

通过实例学习Fireasy开发(上篇)

Fireasy一直在发布新版本,但是怎么用,到底好不好用,估计大家都有这样的疑惑.所以,今天花点时间通过一个简单的示例一步一步来介绍fireasy的用法. 首先有必要介绍一下Fireasy的组件构成: Fireasy.Common 公共组件库,主要包含缓存管理.日志管理.序列化.动态编译.扩展方法等. Fireasy.Data 数据库组件库,提供数据库的操作,语法.批量插入.数据库构架等. Fireasy.Data.Entity 实体组件库,ORMapper.LINQ解析.数据上下文.树实体持久

彩票历史记录分析工具 -- 通过实例学习wpf开发

前言 虽然本人对彩票不感兴趣,仍然有不少人对此情有独钟.他们花大量时间精力去分析彩票的历史记录,企图发现规律,为下一次投注做指导,希望“赢的“”概率增大.不管研究历史记录是否有意义,我用软件实现了对彩票的分析,手工分析彩票几天工作量,现在一秒可以实现. 执行程序,点我下载! 程序界面 处理原理分析: 程序实际上是对六合彩分析(彩票种类很多,本文只处理一种).数据格式如下: 2010001 11 13 22 16 21 182010002 22 28 16 5 14 262010003 5 14

不使用Visual Studio开发ASP.NET MVC应用(下篇)

书接上回! 前文“纯手工”.彻底抛弃Visual Studio,制作了一个ASP.NET MVC应用,运行起来还不错,项目目录.源代码.web.config等所有东西都已经做到“最简”,除去了Visual Studio生成的一大堆无关东西,当然这只是一个“起点”,随着后面项目内容和功能的扩展还需要一步步添加很多东西,但如此干净一个项目,看着就让人舒服,一砖一瓦的盖自己的房子,何尝不是一种享受!(其实很多人不认同这样,在stackoverflow原文中,问题解答者用"severe brain da

开发小结-流程管理类-下篇

改Bug和优化要不要同时进行 个人觉的,改Bug和优化,当优点的点和改Bug的点紧密相关联时时,改Bug和优化可以一同进行.而对于那些不怎么紧密的代码,优化可有可无时,那坚决不要优化.比方说,最开始进行释放内存,使用delete p; p = NULL;后来发现项目中已经有封装好宏,只需要一句话就可搞定.不过在使用该宏时,需要引入头文件.那么,这种情况下,就可以不进行优化,原来怎么写,现在就这么写.保持在同一个模块(.cpp)中,相关操作的一致性即可. 从冗余的实现到既可以满足业务功能,又保证每

利用HTML5开发Android笔记(下篇)

资源来自于www.mhtml5.com 杨丰盛老师成都场的PPT分享 一个很简明的demo 可以作为入门基础 学习的过程中做了点笔记 整理如下 虽然内容比较简单 但是数量还是比较多的 所以分了3篇 (上)包括Android设备多分辨率的问题,Android中构建HTML5应用程序基础 (中)包括Android与JS之间的互动,Android处理JS的警告对话框等,Android中的调试 (下)包括本地储存在Android中的应用,地理位置的应用,离线应用的构建 —————————————————

Hive UDF开发实例学习

1. 本地环境配置 必须包含的一些包. http://blog.csdn.net/azhao_dn/article/details/6981115 2. 去重UDF实例 http://blog.csdn.net/lifuxiangcaohui/article/details/41548667 http://www.cnblogs.com/end/archive/2012/10/12/2721543.html

下篇: php 微商城 基于Thinkphp3.2框架开发

(12)微信商城 ① 前台模板引入 a.引入微信商城模板的css+js+Images+img+bootstrap b.引入微商城的首页index.html及详情页detail.html页面模板 注意:修改js/css/image等的引入路径 c.控制器添加显示页面的方法 D:\phpStudy\WWW\wechat\tp3\Application\Shop\Controller\IndexController.class.php d.访问控制器中的方法查看显示效果 http://zouke122