【发布时间】:2020-05-11 05:40:14
【问题描述】:
我正在开发一个 Grails Web 应用程序,它的模块大部分都必须实现一个主从接口。作为一种方法,我想将以下代码供您考虑:
大师班:
import org.codehaus.groovy.grails.web.json.JSONArray
class MyForm {
String name
String address
String detail
BigDecimal total
static hasMany = [details: MyFormDetail]
static constraints = {
name()
address()
detail()
total()
}
static mapping = {
detail type: 'text'
}
def beforeInsert = {
def detailJSON = new JSONArray(detail)
detailJSON.each {
def quantity = it.getAt("quantity").toString().toBigDecimal()
def description = it.getAt("description").toString()
def unitaryPrice = it.getAt("unitaryPrice").toString().toBigDecimal()
def subtotal = it.getAt("subtotal").toString().toBigDecimal()
def myFormDetail = new MyFormDetail(
quantity: quantity,
description: description,
unitaryPrice: unitaryPrice,
subtotal: subtotal
)
this.addToDetails(myFormDetail)
}
}
}
详细分类:
class MyFormDetail {
Integer quantity
String description
BigDecimal unitaryPrice
BigDecimal subtotal
static belongsTo = [myForm: MyForm]
static constraints = {
quantity()
description()
unitaryPrice()
subtotal()
}
}
myFormUtilities.js 帮助文件:
$(document).ready(function() {
$("#detailTable").jqGrid({
datatype: "local",
height: 100,
colNames: ["QUANTITY","DESCRIPTION","UNIT. PRICE","SUBTOTAL"],
colModel:[
{name:'quantity',index:'quantity', width:100},
{name:'description',index:'description', width:400},
{name:'unitaryPrice',index:'unitaryPrice', width:100},
{name:'subtotal',index:'subtotal', width:100}],
caption: "DETAIL"
});
createTable();
$("#addRow").bind("click",addRow);
$("#removeRow").bind("click",removeRow);
$("#quantity, #unitaryPrice").bind("keyup",calculateTotal);
function calculateTotal(){
let quantity = parseFloat($("#quantity").val());
let unitaryPrice = parseFloat($("#unitaryPrice").val());
let subtotal = quantity*unitaryPrice;
$("#subtotal").val(subtotal);
}
function addRow(){
let row = new Object();
row.quantity = $("#quantity").val();
row.description = $("#description").val();
row.unitaryPrice = $("#unitaryPrice").val();
row.subtotal = $("#subtotal").val();
let detailJSON = ($("#detail").val()=="")?"[]":$("#detail").val();
let mydata = $.parseJSON(detailJSON);
mydata.push(row);
$("#detail").val(JSON.stringify(mydata));
createTable();
}
function removeRow(){
let filaId = parseInt($('#detailTable').jqGrid('getGridParam','selrow')) - 1;
let mydata = $.parseJSON($("#detail").val());
let nuevoMydata = new Array();
for(let i=0;i<mydata.length;i++){
if(filaId!=i)
nuevoMydata.push(mydata[i]);
}
$("#detail").val(JSON.stringify(nuevoMydata));
createTable();
}
function createTable(){
let total = 0;
let aRow = new Object();
let detailJSON = ($("#detail").val()=="")?"[]":$("#detail").val();
let mydata = $.parseJSON(detailJSON);
$("#detailTable").jqGrid("clearGridData", true);
for(let i=0;i<mydata.length;i++){
aRow = mydata[i];
total += parseFloat(aRow.subtotal);
$("#detailTable").jqGrid('addRowData',i+1,aRow);
}
$("#total").val(total);
}
});
这是显示的表单(我知道这是一个自动生成的视图,但请把它看作一个非常基本的 GUI 模型):
所以,这些是问题:
Subtotal和Total字段都是已设置的计算字段read-only防止用户修改他们的内容,但我发现 使用浏览器元素检查器它们的内容和属性 (如只读)可以修改。detail也是如此。如果其内容被更改,服务器端 保存实例时将产生错误,因为beforeInsert块需要有效 用于创建detail实例的 JSON 字符串。此字段还用于生成详细信息 JqGrid。该字段将是 隐藏。
本示例中的所有内容都按预期工作,但可能由好奇的用户引起。
- 有没有办法防止这些字段文本被更改,即使使用 检查员?
- 还有其他地方可以保护这些数据免受更改吗?
- 我正在使用这个
detail字段来保存一个JSON 字符串,这是我实现主从模式的解决方案。有没有别的 改进此实现的方法,避免定义一个 这个字符串的字段?
【问题讨论】:
-
因此,如果您不希望用户编辑值,则不要接受对该值服务器端的更改。因此,例如,价格...不要相信来自客户端的价格值。仅信任 Price 服务器端的值(来自您的数据库)。还是我误解了你的问题?
标签: javascript html grails jqgrid master-detail