2单表CRUD综合样例开发教程
东软集团股份有限公司 基础软件事业部 |
单表CRUD综合样例开发教程 |
东软机密 |
tui
更改履历
版本号 |
更改时间 |
更改的 图表和章节号 |
状态 |
更改简要描述 |
更改申 请编号 |
更改人 |
批准人 |
V1.0 |
2014-11-28 |
N |
刘玥 |
||||
注:状态可以为N-新建、A-增加、M-更改、D-删除
目录
2.2.6 demoUserEdit.view模型开发. 24
第1章 功能说明
本教程中包含以下功能点:
1. 使用autoQuery达到无编码查询;
2. XGrid中某列设置成超链接,点击进行页面穿透;
3. 根据日期进行查询;
4. 性别、国籍等代码表的使用;
5. XGrid表格的cell上使用代码表进行转义;
6. 在TitlePane上添加按钮;
7. 使用自适应容器进行上下布局;
8. 使用页面穿透进行数据的新增和修改;
9. 使用必填项校验,电话校验;
10. 使用textbox、dateTextBox、combobox、textarea、密码框。
第2章 功能详解
2.1 所需模型
2.1.1 ENTITY模型
在单表CRUD综合样例开发过程中只用到一个实体模型UpDemoUser,如下图所示:
2.1.2 BO、DAO模型
在单表CRUD综合样例开发过程中的BO模型为demoUserBO,DAO模型为demoUserDAO。下面代码为demoUserBO中的方法列表:
/** * 更新或保存用户对象 * @param user 用户对象 */ public UpDemoUser saveOrupdate(UpDemoUser user); /** * 删除用户 * @param user 用户对象 */ public void deleteUser(UpDemoUser user); |
2.1.3 VIEW模型
在单表CRUD综合样例开发过程中创建的VIEW模型为demoUserMgr.view和demoUserEdit.view。
2.2 单表CRUD样例制作步骤
2.2.1 新建SC
“framework”上右键 à “新” à “UniEAP软件组件” à “ID”和“名称”输入新建的SC名称à 点击“完成”。如下图所示:
2.2.2 新建DC
在所属SC(这里为“upsample”)上单击右键 à “新” à “UniEAP开发组件” à 在“ID”和“名称”输入新建的DC名称 à 点击“完成”。如下图所示:
2.2.3 新建Entity
“upsample”( SC )à”singletablecrud”(DC )à “metamodel” à “entity”上右键 à “新” à “Entity模型” à 配置数据库连接信息(如下图所示) à 选择“下一步”à 点击“刷新”显示数据库表或视图 à 选择“UP_DEMO_USER”表,“类名”设置为“UpDemoUser”à 点击“完成”。
2.2.4 新建VIEW模型
新建view模型“demoUserMgr.view”:“upsample”( SC ) à “singletablecrud”(DC ) à “metamodel” à “view”上右键 à “新” à “View模型” à 在“文件名”里输入“demoUserMgr”à点击“完成”。如图所示:
新建view模型“demoUserEdit.view”:如下图,方法同上。
2.2.5 demoUserMgr.view模型开发
1. 创建数据集:
打开view模型 à 右下角“数据集”标签页 à 点击“ ”按钮添加数据集 à 如下图完成数据集upDemoUserForm的创建:
à勾选上“支持自动查询”à 将 “生日从”的操作符选为“>=”,“到”的操作符选为“<=”, Form表单中其它选中项的“操作符”选为“like”à 点击“完成”。如下图所示:
类似地,再创建一个数据集 upDemoUserGrid,如下图:
至此demoUserMgr.view页面的数据集创建完毕。
2. 设计页面:
进入“设计”页面 à 选择左侧的“模式控件”à 将模式控件“AdaptiveLayout”拖放到右侧空白页 à 弹出“新建模式控件”页,创建过程如下图:
à 将左侧“模式控件”中的“Form”模式控件拖放到“查询条件”区域的TitlePane上 à 弹出的Form窗口设置如下图:
如图输入FormID à 点击“下一步”à 配置如下图:(可以通过“上移”和“下移”选中行来调整显示顺序;勾选上“是否生成form”)
à从“容器”里拖出一个”Div”放到Form的TitlePane上 à 在该Div的“特性”页中的”type”属性输入“buttons”à 将“基本控件”中的“Button”控件拖入上面的Div中 à 点击按钮上的箭头 à 修改按钮属性如图:( “控件ID” 修改为一个有意义的ID名称,“控件名称”修改成按钮的实际显示名称)
è 类似地,将“模式控件”里的“Grid”模式控件拖入下半区域的TitlePane上 à Grid模式控件的设置如下图:(注意:“Grid控件类型”要选择XGrid;“Grid选择类型”选择“single”单选行)
设置固定列,并选择需要显示的数据列,如下图所示:
è 添加一个Div和两个按钮“新增”和“删除”到下面XGrid的TitlePane上(方法同上)。至此页面制作完成,页面布局如下图所示:
3. 编辑脚本:
3.1“查询”功能脚本
定义一个过程调用getAllUser(),依赖AutoQueryBO如下图:
è 点击getAllUser方法的“成功回调”后的“编辑”à 输入如下代码:
//将查询得到的dataStore绑定到mgrGrid,标准格式:view.grid.setDataStore("id", store); //{string} id 对应xgrid的id ; //{object} store 用于初始化xgrid的dataStore view.grid.setDataStore("mgrGrid", dc.getSingleDataStore()); |
è 回到“设计”页面 à 点击“查询”按钮上面的小三角图标“ ” à 在弹出的快速设置页面点击“编辑onClick事件”如图:
è 输入代码如下:
//点击“查询”按钮时调用定义的过程调用方法getAllUser,并传入mgrForm的dataStore view.processor.getAllUser(view.form.getDataStore("mgrForm")); |
3.2 “新增”功能脚本:
点击“新增”按钮上的三角图标 à 点击“编辑onClick事件” à输入如下代码:
//页面导航的穿透发起,标准格式:view.navigator.forward("scid", "dcid", "viewPath", "title", dc); //{string} scid 目标页面所在SC的id ;{string} dcid 目标页面所在DC的id ;{string} viewPath 目标页面所属的路径 ;{string} title 导航主题,用于区分不同的穿透请求;{object || string} dc 穿透携带的数据,支持多种数据格式 view.navigator.forward("upsample", "singletablecrud", "demoUserEdit", "新增人员", null); |
3.3 “修改”功能脚本
点击XGrid中的“帐号”列标题 à 点击上面的小三角图标,如图:
à“编辑formatter事件” à 在编辑页面输入如下代码:
//设置该列字段为超链接格式,并定义onclick事件为clickUser方法 //demoUserMgr为当前view名,clickUser是定义的公共方法; return "<a href=\"#\" onclick=\"javascript:demoUserMgr.clickUser('" + inRowIndex + "')\">" + inValue + "</a>"; |
à新建一个公共方法clickUser,参数为index,方法中输入如下代码:
//页面导航的穿透发起,标准格式:view.navigator.forward("scid", "dcid", "viewPath", "title", dc); //{string} scid 目标页面所在SC的id ; //{string} dcid 目标页面所在DC的id ; //{string} viewPath 目标页面所属的路径 ; //{string} title 导航主题,用于区分不同的穿透请求;在所有的forward和receiveData中的主题应该唯一 //{object || string} dc 穿透携带的数据,支持多种数据格式; view.navigator.forward("upsample", "singletablecrud", "demoUserEdit", "修改人员",view.grid.getRows("mgrGrid", index)); |
3.4 “删除”功能脚本
创建一个BO方法“demoUserBO”:“metamodel”à “bo”右键 à “新”à “BO模型”à “文件名”输入“demoUserBO”à “完成”。
DemoUserBO.java中BO方法定义如下:
/** * 更新或保存用户对象 * @param user 用户对象 */ public UpDemoUser saveOrupdate(UpDemoUser user); /** * 删除用户 * @param user 用户对象 */ public void deleteUser(UpDemoUser user); |
在DemoUserBOImpl.java中输入如下代码:
private DemoUserDAO demoUserDAO; /** * 依赖注入,注入相应的自定义的DAO实例 * @param demoUserDAO */ public void setDemoUserDAO(DemoUserDAO demoUserDAO) { this.demoUserDAO = demoUserDAO; } /** * {@inheritDoc} */ public UpDemoUser saveOrupdate(UpDemoUser user) { UpDemoUser User = demoUserDAO.saveOrUpdateUser(user); return User; } /** * {@inheritDoc} */ public void deleteUser(UpDemoUser user) { demoUserDAO.deleteUser(user); } |
创建一个新的DAO方法”demoUserDAO”:“metamodel”à “dao”右键 à “新”à “DAO模型”à “文件名”输入“demoUserDAO”à “完成”。
DemoUserDAO.java中编码如下:
/** * 更新或保存用户对象 * @param user 用户对象 */ public UpDemoUser saveOrUpdateUser(UpDemoUser user); /** * 删除用户 * @param user 用户对象 */ public void deleteUser(UpDemoUser user); |
DemoUserDAOImpl.java中输入如下代码:
/** * {@inheritDoc} */ public void deleteUser(UpDemoUser user) { this.removeObject(user); } /** * {@inheritDoc} */ public UpDemoUser saveOrUpdateUser(UpDemoUser user) { getHibernateTemplate().saveOrUpdate(user); return user; } |
定义一个新的“过程调用”delUser如下图:
在上图页面中点击“成功回调”的“编辑”,输入如下代码:
//删除mgrGrid选中的第一行,标准格式:view.grid.deleteRow("id", index); //{string} id 对应xgrid的id ; //{number} index 待删除的行索引;不传入此值时,默认删除选中的第一行 view.grid.deleteRow("mgrGrid"); |
//MessageBox.confirm带有两个按钮的简单确认对话框 MessageBox.confirm({ //message:文本要显示的内容 message:'是否确认删除', //onComplete:对话框关闭时要执行的回调函数,这里调用定义的公共方法deleteOnComplete onComplete: deleteOnComplete, //点击右上角的图标关闭确认框的时候,会不会触发回调函数,默认会触发,并且回调函数的参数值为"false" iconCloseComplete: true }); |
新建一个公共方法deleteOnComplete,参数为value,方法代码如下:
//用于删除的MessageBox中的onComplete方法,调用定义的delUser方法 //view.grid.getRows("mgrGrid")获得grid中选中的行 if(value==true) view.processor.delUser(view.grid.getRows("mgrGrid")); |
2.2.6 demoUserEdit.view模型开发
1. 配置Entity校验:
点击workshop“Entity校验配置”图标“ ”à 找到对应SC(upsample)和DC(singletablecrud)下的对应实体(entity à “upDemoUser.entity”) à配置如图所示:
2. 创建数据集:为该view模型创建数据集upDemoUser如下图:
3. 设计页面:该页面只有一个Form区域,设计过程同demoUserMgr.view。设计页面如下图所示:
4. 编辑脚本:
4.1添加page load()方法:
进入“脚本”页面 à选择page load()方法 à 输入如下代码:
//页面导航的穿透成功,标准格式:view.navigator.receiveData("title", "method"); //{string} title 导航主题,用于区分不同的穿透请求,需要和穿透发起的主题相同;{function} method 穿透成功后调用的方法,可以接收穿透发起时传输的数据 view.navigator.receiveData("新增人员", receiveAddUserData); view.navigator.receiveData("修改人员", receiveUpdateUserData); |
添加公共变量addOrUpdate:进入“脚本”页面 à 选择“全局变量”à 输入如下代码:
//定义全局变量用于标识“新增”或“更新” var addOrUpdate = ''; |
添加公共方法receiveAddUserData和receiveUpdateUserData如下:
receiveUpdateUserData公共方法如下图:
4.2 “保存”功能脚本:
新建一个“过程调用”saveOrUpdateUser,如下图所示:
点击“成功回调”的“编辑”,输入如下代码:
//页面导航的返回发起,标准格式:view.navigator.prePage("title", dc); //{string} title 导航主题,用于区分不同的返回请求;{object || string} dc 返回携带的数据,可以支持多种数据格式 if(addOrUpdate =='add'){ view.navigator.prePage("保存成功", dc); }else{ view.navigator.prePage("修改成功", dc); } |
在“设计”页面点击“保存”按钮 à “编辑onClick事件”à 输入如下代码:
//判断数据是否发生修改 var form = unieap.byId('editForm'); //对form进行校验,form.validate(false)不显示默认的校验信息 if(!form.validate(false)){ //校验提示信息 var message = ""; if(!message && !unieap.byId("account").getValue()) message = "帐号不能为空!"; if(!message && !unieap.byId("name").getValue()) message = "姓名不能为空!"; if(!message && !unieap.byId("accountEnabled").getValue()) message = "请选择帐号是否启用!"; if(!message && !unieap.byId("accountLocked").getValue()) message = "请选择帐号是否锁定!"; if(unieap.byId("mobileTelephone") && !unieap.byId("mobileTelephone").validator.validate()) message = "请填写格式正确的手机号码!"; //提供简单反馈信息的警告提示框 //title为提示框的标题,message为提示框显示的提示信息, type为提示框的显示图标类型 MessageBox.alert({title:"提示信息", message: message, type: "warn"}); }else{ //点击“保存”按钮时,调用定义的saveOrUpdateUser过程保存或更新editForm中的数据 view.processor.saveOrUpdateUser(view.form.getDataStore("editForm")); } |
回到demoUserMgr.view,在其page load()方法中编写如下代码:
//页面导航的返回成功,标准格式:view.navigator.onComplete("title", "method"); //{string} title 导航主题,用于区分不同的返回请求,需要和prePage返回发起的主题相同 且主题应该唯一; //{function} method 返回成功后调用的方法,可以接收返回发起时传输的数据 view.navigator.onComplete("保存成功", addUserSuccess); view.navigator.onComplete("修改成功", updateUserSuccess); |
在其“公共方法”中定义两个新公共方法:addUserSuccess和updateUserSuccess。
addUserSuccess方法如下图所示:
updateUserSuccess方法如下图所示:
页面脚本开发完毕。
2.2.7 配置密码框
选中图中需要设置成密码框的cell:
在其“特性”的“属性”中,将“password”属性值设为“true”。
2.2.8 配置手机号码校验
单击需要配置校验的cell,如图:
进入其“特性”页 à “属性”à “validatorClass”属性值填写为“unieap.form.MobilePhoneValidator“。如图所示:
手机号码校验(前台校验)配置完成。
2.2.9 自定义Codelist
本样例中需要自定义三个Codelist:demoGenderType,demoNationality和demoValidation。
自定义Codelist的定义方法:进入”管理控制台”à “资源管理”菜单 à “代码表管理” à 点击添加按钮“ ”à 定义新的代码表如下:
demoGenderType:
demoNationality:
demoValidation:
代码表定义完成。
将自定义代码表应用到Form中:
打开demoUserMgr.view的Form,将性别和国籍的编辑类型由“textbox”改成“comboBox”,在对应的“常数代码”列填入上面对应的“代码表名称”,如图:
demoUserEdit.view的Form也做如下修改:
此外,针对上面的Form,通过“上移”和“下移”调整成想要的显示顺序;调整“描述信息”的“编辑类型”为“textarea”,“跨列数”改为5;同样地,“家庭住址”的“跨列数”改为3。
代码表应用到XGrid中:
打开demoUserMgr.view的XGrid,在“常数代码”列填入对应的“代码表名称”,如下图所示:
此外,上图中的“生日”的“显示格式”选择“yyyy-MM-dd”格式;根据需要调整“属性列宽”。
第3章 开发效果展示
1.用户管理页面:
2.用户修改页面:
3.新增用户页面:
2单表CRUD综合样例开发教程的更多相关文章
- SQLSERVER单表CRUD通用方法
一.适用场景 ①当你书写简单的增删改查心累了 ②当你的项目不考虑并发.高性能 ③当你追求更快速的开发效率 ④当你的业务只涉及单表 二.代码展示 ①单表Insert public bool Insert ...
- 最全SpringMVC具体演示样例实战教程
一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先.导入SpringMVC须要的jar包. 2.加入Web.xml配置文件里关于SpringMVC的配置 <!--conf ...
- linux命令单次或组合样例
###解压命令.tar.gz 格式解压为 tar -zxvf xx.tar.gz.tar.bz2 格式解压为 tar -jxvf xx.tar.bz2 ### ...
- 一步步学Mybatis-实现单表情况下的CRUD操作 (3)
今天这一章要紧接上一讲中的东西,本章中创建基于单表操作的CRUD与GetList操作,此示例中以Visitor表为范例,为了创建一点测试数据我们先弄个Add方法吧 继续在上次的IVisitorOper ...
- Sakila——MySQL样例数据库解析(已经迁移)
一.Introduction Sakila可以作为数据库设计的参考,也可作为实验数据.我是用作数据仓库和ODI学习的实验数据. The Sakila sample database was devel ...
- ActiveRecord-连接多张表之单表继承
ActiveRecord-连接多张表之单表继承 1. 基本概念 Rails提供了两种机制,可以将复杂的面向对象模型映射为关系模型,即所谓的单表继承(single-table inheritance)和 ...
- SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)
做了这么多项目,经常会使用到级联.联动的情况. 如:省.市.县.区.一级分类.二级分类.三级分类.仓库.货位. 方式:有表单需要做级联的,还是表格行上需要做级联操作的. 实现:实现方法也有很多种方式. ...
- SNF开发平台WinForm-审核流使用方法样例
一.效果如下: 二.如何实现 1.程序的数据表设计规范,参考<09.SNF-C#编程规范V1.5.docx>文件. 2.程序操作程序 2.1.在程序页面拖拽控件 2.2.程序的Load事件 ...
- 移动端报表JS开发演示样例
近期对移动端的报表开发颇有研究,细磨精算了好久,尽管到如今还是"囊中羞涩",但决定还是先抛砖引玉,拿点小干货出来和大家分享. 研究的工具是比較有代表性的FineReport. 1. ...
随机推荐
- 【杭电多校第七场】A + B = C
原题: Given a,b,c, find an arbitrary set of x,y,z such that a*10^x+b*10^y=c*10^z and 0≤x,y,z≤10^6. 给你三 ...
- git撤销pull命令
1.运行git reflog命令查看你的历史变更记录 2.然后用git reset --hard HEAD@{n},(n是你要回退到的引用位置)回退. 比如上图可运行 git reset --hard ...
- css 命名规范 BEM
在项目的开发过程当中, 我们往往因为日益复杂的css代码而感到力不从心. 如何合理的组织css代码成为了我们前端开发过程中必须考虑到的环节. 在读element源代码的时候, 了解到了BEM的命名风格 ...
- li元素之间产生间隔
是因为li标签换行导致的 简单的解决办法是将所有的li标签写到一行(不过实际上一般不会这样做) 或者把ul设置font-size为0,但这样ul中的文字就会消失,所以要记得单独给子元素设置font-s ...
- Python3-json3csv
import json import csv json_str = '[{"a":1,"b":"2","c":" ...
- 5 解析器、url路由控制、分页、渲染器和版本
1 数据解析器 1 什么是解析器 相当于request 中content-type 对方传什么类型的数据,我接受什么样的数据:怎样解析 无论前面传的是什么数据,都可以解开 例如:django不能解析j ...
- HDU 6033 - Add More Zero | 2017 Multi-University Training Contest 1
/* HDU 6033 - Add More Zero [ 简单公式 ] | 2017 Multi-University Training Contest 1 题意: 问 2^n-1 有几位 分析: ...
- Sogou for Linux
造冰箱的大熊猫,本文适用于Ubuntu 18.04@cnblogs 2019/5/8 在Ubuntu(安装时选择英文语言环境)下安装搜狗输入法 1)从搜狗官网下载sogou拼音输入法的deb安装包. ...
- android启动模拟器命令
参考资料:http://blog.csdn.net/sanjinxiong/article/details/6758222 启动模拟器 首先通过android list avd 查看建好的虚拟设备: ...
- MessagePack Java Jackson 在不关闭输入流(input stream)的情况下反序列化多变量
com.fasterxml.jackson.databind.ObjectMapper 在读取输入流变量的时候默认的将会关闭输入流. 如果你不希望关闭输入流,你可以设置 JsonParser.Feat ...