智能销售系统(四)问题解决
2019-09-30 本文已影响0人
磨陀货_
1.修改时密码显示问题
2.修改数据丢失问题
3.n-to-n持久问题
解决密码问题
添加的时候需要密码/修改的时候不需要密码
1.方式一:使用两个面板(一个有密码,一个没有密码) ---- 两个面板区别很大时,建议用这个
2.方式二:还是一个面板(添加的时候显示密码,修改的时候不显示密码) --- 当两个区别不大时 建议这个
这个需求 我们会在employee.jsp中修改 <tr>中加上id【<tr data-hidden="true">】
<tr data-hidden="true">
<td>密码:</td>
<td><input id="password" class="easyui-validatebox" type="password" name="password" data-options="required:true"></input></td>
</tr>
在employee.js中修改edit
- 在修改的时候隐藏密码
edit(){
$("*[data-hidden]").hide();
////把data-hidden 的所有隐藏起来
$("*[data-hidden] input").validatebox("disable");
// $("#password").textbox("disable");
}
添加的时候启用密码,修改的时候就禁用(禁用是不会传数据)
启用和禁用
- 再添加的时候在显示出来
add(){
//启用和禁用 除了修改的效果外(禁用是不会传数据的)
//readonly只读,不管怎么样都会传数据
//disable(禁用,不能修改也不能传参)
$("*[data-hidden]").show();
//把data-hidden 的所有显示出来
$("*[data-hidden] input").validatebox("enable");
// $("#password").textbox("enable");
},
目前有一个小BUG
当你点击修改,什么都不改的情况下,点击保存。之后你会发现头像没有了;---形成了数据丢失 下面解决
解决数据丢失问题
数据丢失(在修改的时候---在传参的时候有些值没有传过去。对应的值就为空。但是执行SQL还在执行它)

解决方案:--- 动态修改
解决方式一:隐藏域
- 比较简单,但是不常用。后面的时候代码量比较多
解决方式二:生成的时候 不修改 --- SQL
-
不修改 --- (用这个很危险,因为以后想改改不了。扩展性不强了)
//@Column(updatable = false) --- 一加上这个注解 就是一经保存就不可修改属性;身份证号码;创建时间
@Column(updatable = false)
private String password;
解决方式三:先获取,在修改

数据丢失解决:SpringMVC之@ModelAttribute 【数据丢失也可解决】

举例:
- 修改会传id过来,添加不会


- editEmployee就等于= employee
还有一个问题就是 性能上不是很完美 --- 因为这个解决丢失 删除什么都会有影响 所以我们在修改一下
-
在js中save修改一下
-
在Controller填上一句
解决n-to-n问题
问题二:当上面都做完之后,修改姓名,邮箱,年龄都可以;但是修改部门就会报错【n-to-n】 --- 持久化状态修改对象

1.部门什么时候变成持久对象的
2.我们又什么时候去改过他的id呢?
首先Employee是从数据库中来,他现在就是一个持久化对象
关键在于editEmployee---employee 现在是同一个对象
所以现在当传一些参数过来会设置一些参数

解决办法 ---- 【关连对象都设置成为null】

我们只要加一句 部门为空 到时候部门就不会是持久化对象,会是new出来的。
完整代码
//在任何方法前执行
@ModelAttribute("editEmployee")
public Employee beforeEdit(Long id,String cmd){
//cmd就是让他可以准确的找到update 不要所有都找影响性能
if (id != null && "update".equals(cmd)){
Employee editEmployee = employeeService.getOne(id);
//关连对象都设置为null,避免修改部门时出现n-to-n
editEmployee.setDepartment(null);
return editEmployee;
}
return null;
}
@RequestMapping("/update")
@ResponseBody
//这里@ModelAttribute("editEmployee") 要和上面能对应上
public JsonResult update(@ModelAttribute("editEmployee") Employee employee){
return saveOrUpdate(employee);
}
注解篇:
- @ModelAttribute --- 只要你通过路径访问当前的Controller,在访问之前,都会先执行他 【Controller方法上面加】
- @Column(updatable = false) --- 一加上这个注解 就是一经保存就不可修改属性;身份证号码;创建时间【domain中变量上加】
注意点
1.from表单都使用post请求 ---- 不管是安全性还是放的数量上 都是post优