zoukankan      html  css  js  c++  java
  • 基于FineUIMVC的代码生成器(传统三层)v1.0-2


    第一篇博客只是粗略说明了一下,其实这个工具真正用话可能大家还要细看下,我今天(连夜)写个例子,截几个图,做一下自定义模板的实例教程,因为代码生成本身是个工具,动画效果都是次要的,主要是工具本身,其中自带的模板并不适合所有开发环境,所以还是侧重模板编写和接口。

    前面说到我要写个MVC前台的模板按表生成 Index.cshtml 和 Controller.cs,所以就那这两个做个例子。说到模板就是一个制式的文件,我要先做错一个标准文件作为模板,然后根据不同表生成自己的文件, 其实大家都是程序员说这都是废话,博客比较长,说明的比较细,截图多,最下面有源码
    环境准备,我先搭了一个FineUI的空项目 CodeFDemo
    用生成工具生成了 asset_a2 表的后台三层
     
    添加到项目,生成,该表是一个资产分类表
     

    第一步 做一个模板的真实页面

    准备工作做完,再做一个前台展示页面,以此为标准制作模板文件
    Index.cshtml
     
    @{
        ViewBag.Title = "Index";
        var F = Html.F();
    }
    @section head {
    
    }
    @section body {
        @(
             F.Panel()
             .IsViewPort(true)
             .ShowBorder(false)
             .ShowHeader(false)
             .Layout(LayoutType.Region)
             .Items(
                 //中间Panel 查询和列表
                 F.Panel()
                 //.IsViewPort(true)
                 .BoxFlex(4)
                 .Layout(LayoutType.VBox)
                 .BodyPadding(0)//5
                 .BoxConfigChildMargin("0 0 0 0")//0 0 5 0
                 .ShowBorder(false)
                 .ShowHeader(false)
                 .Items(
                     //查询表单
                     F.Form()
                     .ID("searchForm").Title("查询条件")
                     .BodyPadding(5).BoxConfigChildMargin("0 5 0 5").BoxFlex(1)
                     .Layout(LayoutType.VBox)
                     .BoxConfigAlign(BoxLayoutAlign.Stretch).BoxConfigPosition(BoxLayoutPosition.Center)
                     .EnableCollapse(true)
                     .LabelWidth(100)
                     .RowsEx(4,
                         F.TextBox()
                             .ID("txtstr20")
                             .Attribute("data", "SYS_ASSET_A1_160")
                             .Label("分类名称")
                             .EmptyText("分类名称"),
                         F.TextBox()
                             .ID("txtstr20")
                             .Attribute("data", "SYS_ASSET_A1_160")
                             .Label("分类编号")
                             .EmptyText("分类编号")
                     )
                     ,
                     //列表
                     F.Grid()
                     .Title("列表")
                     .ID("Grid1")
                     .BoxFlex(6)
                     .EnableCheckBoxSelect(true)
                     .DataIDField("ASSET_A2_AUTOID")
                     .AllowPaging(true)
                     .EnableHeaderMenu(false)
                     .PageSize(15)
                     .Toolbars(
                         F.Toolbar().Items(
                                 F.DefaultGridBtn("Grid1")
                             )
                         )
                     .Columns(
                             F.RowNumberField(),
                             F.RenderField()
                                 .HeaderText("ID")
                                 .Hidden(true)
                                 .DataField("ASSET_A2_AUTOID"),
                             F.RenderField()
                                 .HeaderText("分类名称")
                                 .ExpandUnusedSpace(true)
                                 .DataField("ASSET_A2_10"),
                             F.RenderField()
                                 .HeaderText("分类编号")
                                 .ExpandUnusedSpace(true)
                                 .DataField("ASSET_A2_20"),
                             F.RenderField()
                                 .HeaderText("新增时间")
                                 .ExpandUnusedSpace(true)
                                 .DataField("ASSET_A2_MAKETIME")
    
                             )
                     .DataSource(ViewBag.griddata)
                     //.Listener("rowclick", "OnGrid1RowClick")
                     )
                 )
        )
    }
    @section script {
    <script>
            F.ready(function () {
            })
    
            //列表行点击事件
            function OnGrid1RowClick(e, rowid) {
                F.doPostBack('@Url.Action("Grid1_RowClick")', {
                    rowid: rowid,
                    fields: F.ui.Grid1.fields
                });
            }
    
            //列表新增
            function Grid1new_Click() {
                F.ui.Grid1.showEdit();//新增
            }
            //列表修改 得到列表选中项 getSelectedRows 注意DataIDField属性
            function Grid1edit_Click(g,rowid) {
                F.ui.Grid1.showEdit(true);//修改
            }
            //删除 删除此方法自动回发Grid1Del_Click 方法 参数为 id fields
            function Grid1delete_Click(g,ids) {
    
            }
            //刷新列表
            function lodeGrid() {
                F.doPostBack('@Url.Action("lodeGrid")', {
                    fields: F.ui.Grid1.fields
                });
            }
    
    </script>
    
    }
    

    asset_a2Controller.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using CodeFDemo.BP;
    
    namespace CodeFDemo.Controllers.sysApp
    {
        public class asset_a2Controller : Controller
        {
            // GET: sysA1
            public ActionResult Index()
            {
                BLLasset_a2 bll = new BLLasset_a2();
                ViewBag.griddata = bll.Getasset_a2MsByQuery(new Message.MsQuery()).ToArray();
                return View();
            }
        }
    }
    

     OK,浏览下(本实例只做列表展示)

    第二步 将标准文件改写为模板文件

    再看下代码,其中Grid的Columns是列的循环,查询条件也是列的循环,数据库表格的列一循环就可以了
    所以就有了两个模板
    @{
        ViewBag.Title = "Index";
        var F = Html.F();
    }
    @section head {
    
    }
    @section body {
        @(
             F.Panel()
             .IsViewPort(true)
             .ShowBorder(false)
             .ShowHeader(false)
             .Layout(LayoutType.Region)
             .Items(
                 //中间Panel 查询和列表
                 F.Panel()
                 //.IsViewPort(true)
                 .BoxFlex(4)
                 .Layout(LayoutType.VBox)
                 .BodyPadding(0)//5
                 .BoxConfigChildMargin("0 0 0 0")//0 0 5 0
                 .ShowBorder(false)
                 .ShowHeader(false)
                 .Items(
                     //查询表单
                     F.Form()
                     .ID("searchForm").Title("查询条件")
                     .BodyPadding(5).BoxConfigChildMargin("0 5 0 5").BoxFlex(1)
                     .Layout(LayoutType.VBox)
                     .BoxConfigAlign(BoxLayoutAlign.Stretch).BoxConfigPosition(BoxLayoutPosition.Center)
                     .EnableCollapse(true)
                     .LabelWidth(100)
                     .RowsEx(4
                         $$TextBoxForSearch$$
                     )
                     ,
                     //列表
                     F.Grid()
                     .Title("列表")
                     .ID("Grid1")
                     .BoxFlex(6)
                     .EnableCheckBoxSelect(true)
                     .DataIDField("$$KEY$$")
                     .AllowPaging(true)
                     .EnableHeaderMenu(false)
                     .PageSize(15)
                     .Toolbars(
                         F.Toolbar().Items(
                                 F.DefaultGridBtn("Grid1")
                             )
                         )
                     .Columns(
                             F.RowNumberField(),
                             F.RenderField()
                                 .HeaderText("ID")
                                 .Hidden(true)
                                 .DataField("$$KEY$$")
                             $$GridColumns$$
    
                             )
                     .DataSource(ViewBag.griddata)
                     //.Listener("rowclick", "OnGrid1RowClick")
                     )
                 )
        )
    }
    @section script {
    <script>
            F.ready(function () {
            })
    
            //列表行点击事件
            function OnGrid1RowClick(e, rowid) {
                F.doPostBack('@Url.Action("Grid1_RowClick")', {
                    rowid: rowid,
                    fields: F.ui.Grid1.fields
                });
            }
    
            //列表新增
            function Grid1new_Click() {
                F.ui.Grid1.showEdit();//新增
            }
            //列表修改 得到列表选中项 getSelectedRows 注意DataIDField属性
            function Grid1edit_Click(g,rowid) {
                F.ui.Grid1.showEdit(true);//修改
            }
            //删除 删除此方法自动回发Grid1Del_Click 方法 参数为 id fields
            function Grid1delete_Click(g,ids) {
    
            }
            //刷新列表
            function lodeGrid() {
                F.doPostBack('@Url.Action("lodeGrid")', {
                    fields: F.ui.Grid1.fields
                });
            }
    
    </script>
    
    }
    
                        ,F.TextBox()
                             .ID("txt$$ColunName$$")
                             .Attribute("data", "$$ColunName$$")
                             .Label("$$ColunNotes$$")
                             .EmptyText("$$ColunNotes$$")
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using $$namespace$$.BP;
    
    namespace $$namespace$$.Controllers.sysApp
    {
        public class $$tablename$$Controller : Controller
        {
            // GET: sysA1
            public ActionResult Index()
            {
                BLL$$tablename$$ bll = new BLL$$tablename$$();
                ViewBag.griddata = bll.Get$$tablename$$MsByQuery(new Message.MsQuery()).ToArray();
                return View();
            }
        }
    }
    
    其中$$namespace$$ $$tablename$$ $$KEY$$ $$ColunName$$ $$ColunNotes$$ 都是系统默认字典。
     
    多了两个自定义字典$$TextBoxForSearch$$和$$GridColumns$$,其中$$TextBoxForSearch$$单独建了一个模板,为了让大家看看接口实现的另一种写法。
    将保存好的模板放到模板目录里
     

    第三步 编写模板翻译类

    新建模板扩展类,引用CodeFactoryMVC.Main.dll,列实现接口ICodeFactory

    注意第43行:

    生成CodeFEx.dll,考到bin文件夹下,在web上新增接口

     OK完成,刷新页面选择其余表,填写项目名称,点击生成,拷贝到原项目,随便找个表预览下

     

    一个list页面就做好了。CodeFDemo的项目源码会放在 知识星球 提供下载,

    没有加入星球的赶紧加入(越来越贵!)

     

     
     
     
     
     
     
  • 相关阅读:
    SuperMap-iServer-单点登录功能验证(CAS)
    Oracle数据库的链接数目超标
    转载---javascript 定时器总结
    JMeter使用文档
    转载--改变ubuntu默认编码为GBK
    遥感数据下载
    Supermap iCloudManager -负载均衡
    XCode: 如何添加自定义代码片段
    imageNamed和dataWithContentsOfFile的区别(1)
    imageNamed 与 imageWithContentsOfFile的区别
  • 原文地址:https://www.cnblogs.com/shiworkyue/p/8353602.html
Copyright © 2011-2022 走看看