起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9845|回复: 22

wex5和nutz集成,前端wex5,后端nutz(已放置源码包)(免费)

[复制链接]

998

主题

4330

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10720
QQ
发表于 2016-11-13 23:05:35 | 显示全部楼层 |阅读模式
本帖最后由 ecoolper 于 2017-8-6 11:43 编辑

今天用wex5解决数据维护的需求,需求比较简单,订单数据的查询、新增、删除、更新。
1. 功能界面见下图

![]( "")
![]( "")
2. wex5的代码片段,主要是data组件的两个事件orderDataCustomRefresh、orderDataCustomSave
- orderDataCustomRefresh
```
        Model.prototype.orderDataCustomRefresh = function(event){
                var searchVal = this.getElementByXid("searchInput").value;
                var dfd =$.Deferred();
                var doRefresh =function(event,dfd){
                        justep.Baas.sendRequest({
                                "url" : "/ecoolper/order",
                                "action" : "queryAction",
                                "async" : true,
                                "params" : {
                                        "searchVal" : searchVal,
                                        "limit" : event.limit,
                                        "offset" : event.offset
                                },
                                "success" : function(table) {
                                        event.source.loadData(table,event.options.append);
                                        dfd.resolve();
                                }
                        });
                        return dfd.promise();
                }(event,dfd);
                event.promise =$.when(doRefresh);
        };
```
- orderDataCustomSave
```
        Model.prototype.orderDataCustomSave = function(event){
                var dfd =$.Deferred();
                var doSave =function(event,dfd){
                        justep.Baas.sendRequest({
                                "url" : "/ecoolper/order",
                                "action" : "saveAction",
                                "async" : true,
                                "params" : {
                                        table : event.source.toJson(true)
                                },
                                "success" : function(data) {
                                        dfd.resolve();
                                }
                        });
                        return dfd.promise();
                }(event,dfd);
                event.promise =$.when(doSave);
        };
```
这里用到了jquery的Deferred特性,5.2版本是没有这个特性的。
- x5 studio的设计界面

![]()
3. nutz后端
后端用的baaServer做的改造,BaasServer工程在runtime目录下,先把BaasServer工程导入到studio中,再做改造。

![]( "")

后端主要用到OrderAction的两个方法query、saveAction
- query
```
        @At("/queryAction")
        @Ok("json")
        @AdaptBy(type = JsonAdaptor.class)
        public JSONObject query(@Param("..") JSONObject params) {
                Integer limit = params.getInteger("limit");
                Integer offset = params.getInteger("offset");
                String searchVal =params.getString("searchVal");
                Cnd cnd = Cnd.NEW();
                if(Strings.isNotBlank(searchVal)){
                        searchVal ="%"+searchVal+"%";
                        cnd.or("userName","like", searchVal);
                        cnd.or("phoneNumber", "like",  searchVal);
                        cnd.or("address", "like", searchVal);
                        cnd.or("content", "like", searchVal);
                }

                int pageNumber = (int) Math.ceil(offset / limit) + 1;
                Pager pager = new Pager();
                pager.setPageNumber(pageNumber);
                pager.setPageSize(limit);
                List<Order> rows = dao.query(Order.class, cnd, pager);
                // 设置总个数
                pager.setRecordCount(dao.count(Order.class, cnd));

                JSONObject table = new JSONObject();
                table.put("@type", "table");// 设置type
                table.put("rows", rows);// rows
                JSONObject userdata = new JSONObject();
                userdata.put("sys.count", pager.getRecordCount());
                table.put("userdata", userdata);// 设置userdata
                return table;
        }
```
- saveAction
```
        @At("/saveAction")
        @AdaptBy(type = JsonAdaptor.class)
        @Aop(TransAop.READ_COMMITTED)
        public void saveAction(@Param("..") JSONObject params) throws ParseException {
                Table table = Transform.jsonToTable(params.getJSONObject("table"));
                // 更新
                List<Order> list = Transform2.tableToPojo(table, RowState.EDIT, Order.class);
                dao.update(list, DataUtils2.arrayJoin4Regex(table.getColumnNames().toArray(), "%s", "|"));
                // 添加
                list = Transform2.tableToPojo(table, RowState.NEW, Order.class);
                dao.insert(list);
                // 删除
                list = Transform2.tableToPojo(table, RowState.DELETE, Order.class);
                dao.delete(list);
        }
```
- DataUtils2类

```
public class DataUtils2 {

        public static String arrayJoin4Regex(Object[] objects, String format, String separator) {
                StringBuffer buf = new StringBuffer();
                buf.append("^(");
                for (Object o : objects) {
                        if (buf.length() > 0) {
                                buf.append(separator);
                        }
                        buf.append(String.format(format, o.toString()));
                }
                buf.append(")$");
                return buf.toString();
        }
        
}
```
- Transform2

```
public class Transform2 {
        public static <T> List<T> tableToPojo(Table table, RowState state, Class<T> type) {
                List<T> list = new ArrayList<>(); // 存放转换结果
                // 先得到所有字段名称
                Collection<String> names = table.getColumnNames();
                // 开始遍历row
                for (Row row : table.getRows(state)) {
                        Map<String, Object> map = new HashMap<String, Object>();
                        for (String name : names) {
                                map.put(name, row.getValue(name));
                        }
                        T t = Lang.map2Object(map, type);
                        list.add(t);
                }
                return list;
        }
}
```BaasServer工程包,用的nutz后端,链接: https://pan.baidu.com/s/1kVLOdCF 密码: afrt

已过三个月,已免费
孤舟蓑笠翁,独钓寒江雪。
X5牛刀交流民间第一群:30057529
提供有偿服务,联系WX:18332024
bex5疑难问题解决方案

34

主题

148

帖子

492

积分

中级会员

Rank: 3Rank: 3

积分
492
QQ
发表于 2017-3-17 13:06:21 | 显示全部楼层
一直在关注nutz,也在学习nutz,想问一下nutz做后台和现在wex5提供的后台比,优点在哪里呢?
我看了 https://github.com/crskyp/nutz_baas 的代码,和这里的代码(售价50金币这个)有什么区别呢?
回复 支持 反对

使用道具 举报

998

主题

4330

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10720
QQ
 楼主| 发表于 2017-3-17 15:45:42 | 显示全部楼层
atfa 发表于 2017-3-17 13:06
一直在关注nutz,也在学习nutz,想问一下nutz做后台和现在wex5提供的后台比,优点在哪里呢?
我看了 https://gi ...

购买了对比下
孤舟蓑笠翁,独钓寒江雪。
X5牛刀交流民间第一群:30057529
提供有偿服务,联系WX:18332024
bex5疑难问题解决方案
回复 支持 反对

使用道具 举报

34

主题

148

帖子

492

积分

中级会员

Rank: 3Rank: 3

积分
492
QQ
发表于 2017-3-17 20:23:33 | 显示全部楼层

哈哈哈,总得介绍一下嘛,学习是有成本的。应该介绍一下nutz做的后台比wex5提供的后台有哪些优势,比如效率啊,并发啊,等等嘛,快介绍一下
回复 支持 反对

使用道具 举报

998

主题

4330

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10720
QQ
 楼主| 发表于 2017-3-18 08:55:26 | 显示全部楼层
1、nutz很好用,mvc层一个jar包搞定
2、nutz的社区很活跃,作者帮大家搞定技术难点
3、nutz有很多现成的插件,可以拿来即用
4、不要考虑并发问题,现在入门的小白才上来就问并发
孤舟蓑笠翁,独钓寒江雪。
X5牛刀交流民间第一群:30057529
提供有偿服务,联系WX:18332024
bex5疑难问题解决方案
回复 支持 反对

使用道具 举报

34

主题

148

帖子

492

积分

中级会员

Rank: 3Rank: 3

积分
492
QQ
发表于 2017-3-18 15:31:01 | 显示全部楼层
可是一些插件,比如session管理、比如短信验证码我都在wex5后台的基础上自己写了,也已经部署在生产环境了。一想到如果投入nutz的怀抱就需要改动好多,心有不甘啊
回复 支持 反对

使用道具 举报

998

主题

4330

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10720
QQ
 楼主| 发表于 2017-3-18 15:50:56 | 显示全部楼层
atfa 发表于 2017-3-18 15:31
可是一些插件,比如session管理、比如短信验证码我都在wex5后台的基础上自己写了,也已经部署在生产环境了 ...

这个自己考虑吧,有变动就有工作量
孤舟蓑笠翁,独钓寒江雪。
X5牛刀交流民间第一群:30057529
提供有偿服务,联系WX:18332024
bex5疑难问题解决方案
回复 支持 反对

使用道具 举报

998

主题

4330

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10720
QQ
 楼主| 发表于 2017-3-18 16:19:11 | 显示全部楼层
atfa 发表于 2017-3-18 15:31
可是一些插件,比如session管理、比如短信验证码我都在wex5后台的基础上自己写了,也已经部署在生产环境了 ...

迁移过来吧,很有好处
孤舟蓑笠翁,独钓寒江雪。
X5牛刀交流民间第一群:30057529
提供有偿服务,联系WX:18332024
bex5疑难问题解决方案
回复 支持 反对

使用道具 举报

34

主题

148

帖子

492

积分

中级会员

Rank: 3Rank: 3

积分
492
QQ
发表于 2017-3-18 22:37:05 | 显示全部楼层
本帖最后由 atfa 于 2017-3-18 23:17 编辑
ecoolper 发表于 2017-3-18 16:19
迁移过来吧,很有好处

买了,还没部署测试,先看看代码。

想请教一下:
saveSAction和queryAction应该是通用的,但是,没有看到实现复杂查询的代码。很多查询是比较复杂的,并非单表中读取数据那么简单,查询条件也比较复杂,尤其是涉及到join两三个表的查询,没有看到案例代码,有点迷茫。
在现在,我都是自己获取conn,通过stmt直接做的,但是nutz这么高大上的产品后应该有比我的土办法更好的办法把?
可否给点帮助啊?
回复 支持 反对

使用道具 举报

998

主题

4330

帖子

1万

积分

论坛元老

Rank: 8Rank: 8

积分
10720
QQ
 楼主| 发表于 2017-3-19 09:11:16 | 显示全部楼层
看这个帖子,自定义sql:https://www.nutzam.com/core/dao/customized_sql.html
摘取一段代码:
  1. List<String> demoSql(Dao dao) {
  2.     Sql sql = Sqls.create("SELECT name FROM t_abc WHERE name LIKE @name");
  3.     sql.params().set("name", "A%");
  4.     sql.setCallback(new SqlCallback() {
  5.         public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException {
  6.             List<String> list = new LinkedList<String>();
  7.             while (rs.next())
  8.                 list.add(rs.getString("name"));
  9.             return list;
  10.         }
  11.     });
  12.     dao.execute(sql);
  13.     return sql.getList(String.class);
  14.     // Nutz内置了大量回调, 请查看Sqls.callback的属性
  15. }
复制代码
孤舟蓑笠翁,独钓寒江雪。
X5牛刀交流民间第一群:30057529
提供有偿服务,联系WX:18332024
bex5疑难问题解决方案
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-4-19 11:16 , Processed in 0.062745 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表