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

QQ登录

只需一步,快速开始

查看: 4041|回复: 9

[分享] 在baas中生成复杂的保存动作

  [复制链接]

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
发表于 2016-6-8 23:01:15 | 显示全部楼层 |阅读模式
本帖最后由 Masion 于 2016-6-8 23:03 编辑

X5提供了很方便的前台图形化操作方法,尤其是5.3发布,加上bind功能后,前台做起来真是得心应手呀
但是,也很容易把前台做的很重,运行速度慢不说,还容易产生安全和保密方面的问题。

我做了个比较复杂的订单发布java方法,在本方法中包括传进来的参数只有订单数据,需要完成检查当前账户余额是否足够,保存订单,保存交易明细三个动作。

特此分享
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-6-8 23:02:11 | 显示全部楼层
前台代码如下:
  1.         //密码成功后的动作
  2.         Model.prototype.windowDialog5Received = function(event){
  3.                 //生成订单
  4.                 var self=this;
  5.                 justep.Baas.sendRequest({
  6.                         "url" : "/WSD/WSD1",
  7.                         "action" : "releaseOrder",
  8.                         "async" : false,
  9.                         "params" : {table:this.comp("orderData").toJson(true)},
  10.                         "success" : function(data) {
  11.                                 if(data.result=='发布成功'){
  12.                                
  13.                                         self.comp("messageDialog1").show({type:"OK",
  14.                                                 title:"提示",
  15.                                                 message:"订单发送成功!",
  16.                                                 callback:function(param){
  17.                                                         if(param.button=="ok")
  18.                                                                 self.close();
  19.                                                 }
  20.                                         });
  21.                                 }else{
  22.                                         justep.Util.hint(data.result);
  23.                                 }
  24.                         }
  25.                 });
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-6-8 23:02:47 | 显示全部楼层
后台代码如下:
  1.         //发布订单(包括检查该用户账户余额是否足够,保存订单,保存相应的交易明细)
  2.         public static JSONObject releaseOrder(JSONObject params, ActionContext context) throws SQLException, NamingException, ParseException {
  3.                
  4.                 Connection conn = context.getConnection("WSD");
  5.                 JSONObject ret = new JSONObject();
  6.                 JSONObject jsonTable = params.getJSONObject("table");
  7.                 String userID=null,userName=null,orderID=null;
  8.                 BigDecimal money=null;
  9.                 Table table=Transform.jsonToTable(jsonTable);
  10.                
  11.                 //拿到生成交易记录的必要信息
  12.                 for ( Row row :table.getRows(RowState.NEW)){
  13.                          userID=row.getString("sendID");
  14.                          userName=row.getString("sendNiceName");
  15.                          money=row.getDecimal("costSummary");
  16.                          orderID=row.getString("fID");
  17.                 }
  18.                                
  19.                 try {
  20.                
  21.                 System.out.println(userID);
  22.                         //本账户金额=本账户的转入金额-本账户的转出金额
  23.                         //本账户转入金额条件:turningInID=本人账户ID并且交易状态等于“已转入”
  24.                         //本账户转出金额条件turningInID=本人账户ID并且交易状态不等于“已撤消”
  25.                         String sql = "select  (select ifnull(sum(amt),0) as moneyIn from fb_accounttransfer where turningInID='"+userID+"'  and turningStatus ='已转入'"+
  26.                                                         ") -(select ifnull(sum(amt),0) as moneyOut from fb_accounttransfer where turningOutID='"+userID+"'  and turningStatus !='已撤销') as accountMoney ";       
  27.                         BigDecimal accountMoney = (BigDecimal) DataUtils.getValueBySQL(conn, sql, null);
  28.                         if(accountMoney.compareTo(money)<0){                //如果账户余额不足
  29.                                 ret.put("result", "余额不足");
  30.                         }else{
  31.                                 //保存订单数据
  32.                                 DataUtils.saveData(conn, table);
  33.                        
  34.                                
  35.                                 //生成交易明细
  36.                                 String transSql="insert into fb_accounttransfer(fID,transferDescriptor,turningOutAccount,turningOutID,truningOutTime,orderID,turningStatus,amt)"+
  37.                                                         "values(uuid(),'发布订单','"+userName+"','"+userID+"',now(),'"+orderID+"','已转出','"+money+"')";
  38.                                 java.sql.PreparedStatement pstmt = conn.prepareStatement(transSql);
  39.                                
  40.                                 if (pstmt.executeUpdate() == 1)
  41.                                         ret.put("result", "发布成功"); // 更新成功,返回1
  42.                                 else
  43.                                         ret.put("result", "发布失败"); // 更新失败,返回0

  44.                                 return ret;
  45.                         }
  46.                
  47.                
  48.                 }catch(Exception e){
  49.                         ret.put("result", "保存错误!");
  50.                         return ret;
  51.                 }
  52.                 finally {
  53.                         conn.close();
  54.                 }
  55.                 return ret;
  56.         }
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

64

主题

471

帖子

1127

积分

金牌会员

Rank: 6Rank: 6

积分
1127
发表于 2016-6-9 01:34:18 | 显示全部楼层
给你几点建议:
1、缺少身份验证
2、无法通用化,可以参考CRUD的服务
3、prepareStatement下未使用参数化,容易被SQL注入,例如userName的地方
4、getDecimal方法一定概率会异常,这是底层框架决定的,用了强制类型转换,而忘记做了类型判断,建议改用getValue后,自行进行类型转换。
5、单笔记录操作时,要记录for循环的次数,大于1次要返回错误提示。
6、出于性能考虑,主键和状态列用数字较好,字符串在检索时性能会差很多。因为字符串的比较是按字节走的,字符串越长,循环比较字节的次数就越多,而int或long的比较,只需要一次CPU寄存器的数据加载就完成的了,是原子操作(long只有在64位系统上才是原子的)。另外对于hash索引的处理,Number也有先天性的优势。还有一点非常重要,大多数的数据库会对主键进行聚合排序,因为主键默认用的是B+树索引,任何二叉树都是带排序的,那么如果是guid作为主键,每次插入都会导致数据的重排,但是自增长数字主键就不会,新增的数据肯定在最后,特别是SQLSERVER下面使用分页也会容易的多,那个数据库要写分页sql必须带上ORDER BY 关键字,那么默认就是ORDER BY 主键,同时也不会产生数据重排的可能。
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2016-6-9 07:16:10 | 显示全部楼层
qldsrx 发表于 2016-6-9 01:34
给你几点建议:
1、缺少身份验证
2、无法通用化,可以参考CRUD的服务

说的非常好

大牛在楼上
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

56

主题

370

帖子

963

积分

高级会员

Rank: 4

积分
963
QQ
发表于 2016-6-9 07:34:21 | 显示全部楼层
你简直是亲哥,这贴绝对牛逼,收藏了。
回复 支持 反对

使用道具 举报

718

主题

2841

帖子

5657

积分

论坛元老

Rank: 8Rank: 8

积分
5657
QQ
发表于 2016-6-9 08:59:39 | 显示全部楼层
目前表示还看不懂
WEX5初学者,欢迎初学者交流
QQ:597558229
tel:15857336322
回复 支持 反对

使用道具 举报

191

主题

688

帖子

3323

积分

论坛元老

Rank: 8Rank: 8

积分
3323
QQ
发表于 2016-6-9 14:07:01 | 显示全部楼层
我觉得尽量用前端处理比较好,毕竟Baas的本意就是后端即服务的意思。后端最单纯的用法就是作为数据存储,前端无非是请求数据的增删查改,对象化以后就是data组件的处理。数据判断,多表同时提交和保存尽量封装在Baas里面,而安全性、防止sql注入都应该是Baas中的一个内容。反复的前后台数据交换必然会造成性能的损失,但是简单啊,可移植性好啊,将来换个Baas的话可以0代码移植
轻量化ERP--企业邦  网址:meiprocess.cn
qq:8269301
手机:13801998595
回复 支持 反对

使用道具 举报

851

主题

2560

帖子

5714

积分

论坛元老

Rank: 8Rank: 8

积分
5714
QQ
发表于 2016-6-9 14:34:36 | 显示全部楼层
都是大牛帖子啊!学习啦!
企业应用定制开发。X5开发者。
手机:15065117236
QQ:87356667
回复 支持 反对

使用道具 举报

2

主题

9

帖子

37

积分

新手上路

Rank: 1

积分
37
QQ
发表于 2016-9-2 13:16:20 | 显示全部楼层
能把引用的类粘帖进来吗?

                Table table=Transform.jsonToTable(jsonTable);

这个调用不成功啊.
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 18:02 , Processed in 0.068648 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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