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. ...
随机推荐
- vue.js 简介
Vue.js是什么 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层 ...
- 使用gpg来加密数据
一.数据的加密方式 数据加密有三种方式: 1.对称加密(算法有:DES.AES.3DES.)加密和解密使用同一个密钥 2.非对称加密(RSA.DSA.ELGamal等等)一共四把钥匙,用公钥加密数据, ...
- UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd0 in position 0: invalid continuation byte
用pandas打开csv文件可能会出现这种情况,原因可能是excel自己新建一个*.csv文件时候容易出错.进入文件另存为,然后选择csv文件即可.
- mysql random 字母大小写和数字
delimiter $$drop function if exists rand_string;create function rand_string(n int) returns varchar(2 ...
- 06-char,varchar和nvarchar三者的区别
总结: 1.首先先知道一下SQLServer中数据存储的基本单位是页.每页的大小是8KB: 2.char(n),里面的n用于定义字符串长度,以字节为单位: 3.三者的区别 * char: 是定长的,比 ...
- 重新学习ESP32(零)之环境搭建——转载——windows平台
原文来自:https://www.makingfun.xyz/2018/09/18/esp32-hello-world/ 前言 前几天看到乐鑫的公众号推送了一篇文章,说是ESP8266最新的SDK风格 ...
- Python之asyncio模块的使用
asyncio模块作用:构建协程并发应用的工具 python并发的三大内置模块,简单认识: .multiprocessing:多进程并发处理 .threading模块:多线程并发处理 .asyncio ...
- java.lang.UnsupportedOperationException at java.util.AbstractList
常常使用Arrays.asLisvt()后调用add,remove这些method时出现 Java.lang.UnsupportedOperationException异常.这是由于: Arrays. ...
- js中window.event对象
event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生的过程中才有效. event的某些属性只对特定的事件有意义.比如,fromEleme ...
- javaScript第二篇
事件处理函数 javaScript响应用户操作等都是通过事件处理来触发;其基本形式为 event = "javaScript statement(s);" 事件 = "事 ...