智能商贸系统3

1 删除功能实现
思路:

  1. 先确认是否选中一行(row)提示 $.messager.alert()

  2. 再次确认是否删除,true,执行操作 $.messager.confirm

del:function () {
   //第一步,提示选中【如果没有选中】
    var row = employeeGrid.datagrid("getSelected");
    if(!row){
        $.messager.alert('温馨提示:','亲,你要选择一行数据进行删除','info');
        return;
    }
    $.messager.confirm("提示","你确定要删除吗",function (r) {
        if(r){
            //这里如果确定要删除,就发送ajax请求到后台【id传到后台】执行删除操作
            $.get("/employee/delete",{id:row.id},function (result) {
                console.log(result.success);
                console.log(result);
                if(result.success){
                    $.messager.alert('提示信息','删除成功',"info");
                    $('#employeeGrid').datagrid('reload');
                }else{
                    $.messager.alert('提示信息','删除失败!,原因:'+result.msg,"error");
                }
            })

        }
    }
  1. 添加功能与修改功能
    添加功能思路:

  2. 清空上次对话框的信息

  3. 开启对话框验证

  4. 开启密码输入框【开启密码验证】

  5. 弹出对话框

add:function () {
            //第一步,清空上次的数据
            $('#employeeForm').form('clear');
            //添加第二步,弹出添加的信息框
            $("#employeeDialog").window("open");
            //启动信息框验证
            $("tr[data-save=true] input").validatebox('enableValidation');
            //开启密码数据 display:none
            $("tr[data-save]").show();
            //开启密码验证
            $("*[data-save] input").validatebox("enableValidation");
        },
保存数据操作
save:function () {
            //保存默认请求路径【添加的路径】
            var url = "/employee/save";
            //获取隐藏域里面id值【修改的路径】
            var id = $("#employeeId").val();
            if(id){
                url = "/employee/update?cmd=update";
            }
            $('#employeeForm').form({
                url:url,
                onSubmit: function(){
                    //做验证【每个输入框必须符合条件】返回true
                    return $("#employeeForm").form("validate");
                },
                success:function(data){
                    var result = JSON.parse(data);//将返回的信息转成相应的json数据
                    if(result.success) {
                        //保存成功,重新加载表单
                        $('#employeeGrid').datagrid('reload');
                        $.messager.alert('提示信息','操作成功!',"info`");
                    }else{
                        //保存失败,弹出提示信息
                        $.messager.alert('提示信息','操作失败!,原因:'+result.msg,"error");
                    }
                    //操作完成,关闭对话框
                    $("#employeeDialog").window('close');

                }

            })
            $('#employeeForm').submit();
        }

}
  1. 重复输入密码验证
//自定义验证密码
$.extend($.fn.validatebox.defaults.rules, {
    equals: {
        validator: function(value,param){
            return value == $(param[0]).val();
        },
        message: '密码不一致'
    }
});

4 用户名验证
思路分析:添加操作 给用户名输入框绑定事件,输入完成触发事件,将value发送到后台与数据
库中的用户名作比较【按username】查询是否有数据 返回Boolean值
修改操作 通过被修改的id查询,可以允许用户名等于此id的旧用户名,但是不能与数据库中其他的用户名重复

//定义验证用户名的方法
$.extend($.fn.validatebox.defaults.rules, {
    checkUsername: {
        validator: function(value,param){
            //当然输入框value 和数据库的username进行比较
            //发送ajax请求 --异步(ajax同步)
            var id = $("#employeeId").val();
            var result =  $.ajax({
                type: "POST",
                url: "/employee/checkname",
                data: "username="+value+"&id="+id,
                async: false //同步
            }).responseText;
            //返回true 验证通过 不显示信息
            return result == 'true';
        },
        message: '用户名不能重复.'
}});

5 数据丢失的三种解决方案
方案一:隐藏要传递的值(只隐藏,但是数据还是需要传递,这和第一个项目是同相同的方案)
这个方案的优点是简单易理解,缺点是如果字段过多,代码量会比较大,另外这种方案的安全性确实是有一些低!
方案二:在JPA的相应字段上加标签:
@Column(updatable = false)
private String password;
这个方案也比较简单,但是如果你需要修改这个字段的时候就比较麻烦!

方案三:先查询数据库,获取持久状态的对象,然后把页面的数据set到对象里面

(这种方案也是用得比较多的一种方案)
Employee tempEmployee = employeeService.get(employee.getId());
//需要修改的值就从页面里面的employee放入tempEmployee
tempEmployee.setUsername(employee.getUsername());
employeeService.save(tempEmployee);

ModelAttribute的作用
运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中;
具体解决方法

//删除方法作下面的查询处理,前台设置 cmd
    @ModelAttribute("editEmployee")
    public Employee beforeEdit(Long id,String cmd){
        Employee employee = null;
        if("update".equals(cmd) && id != null && !"".equals(id) ){
            employee = employeeService.findOne(id);
            //在修改的时候的时候,关联对象设置null,保永生
            //将持久化状态的设置为临时状态 就不会报 n  to  n问题
            employee.setDepartment(null);
        }
        return employee;
    }



    @RequestMapping("/update")
    @ResponseBody
    public Map update(@ModelAttribute("editEmployee") Employee employee){
        Map mp = new HashMap();
        try {
            employeeService.save(employee);
            mp.put("success", true);
        } catch (Exception e) {
            e.printStackTrace();
            mp.put("success", false);
            mp.put("msg", e.getMessage());
        }
        return mp;

6.n-to-n问题的解决

持久化状态下
如果修改非主键值,就会报n-to-n
解决 在修改的时候的时候,关联对象设置null

//删除方法作下面的查询处理,前台设置 cmd
    @ModelAttribute("editEmployee")
    public Employee beforeEdit(Long id,String cmd){
        Employee employee = null;
        if("update".equals(cmd) && id != null && !"".equals(id) ){
            employee = employeeService.findOne(id);
            //在修改的时候的时候,关联对象设置null,保永生
            //将持久化状态的设置为临时状态 就不会报 n  to  n问题
            employee.setDepartment(null);
        }
        return employee;
    }

7 veloclty 模板技术
velocity-1.6.3.jar 默认模板的后缀vm
freemarker-2.2.19.jar 默认模板的后缀ftl
7.1 模板技术输出数据
数据+模板(html文件,vm文件,ftl文件)=输出文本
7.2Hello Velocity

VelocityTest 
package cn.itsource.pss;

import java.io.StringWriter;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.junit.Test;
/**
 * 测试Velocity功能
 */
public class VelocityTest {
    @Test
    public void testVelocity01() throws Exception {
        //创建模板应用上下文
        VelocityContext context = new VelocityContext();
        context.put("msg", "小张是个好同志");
        //拿到相应的模板(需要设置好编码)
        Template template = Velocity.getTemplate("temptest/hello.html","UTF-8");
        //准备输出流
        StringWriter writer = new StringWriter();
        template.merge(context, writer);
        System.out.println(writer);
    }


    @Test
    public void testVelocity02() throws Exception {
        //创建模板应用上下文
        VelocityContext context = new VelocityContext();
        context.put("msg", "小张是个好同志");
        //拿到相应的模板(需要设置好编码)
        Template template = Velocity.getTemplate("temptest/hello.html","UTF-8");
        //准备输出流
        File file = new File("temptest/helloNew.html");
        FileWriter writer = new FileWriter(file);
        template.merge(context, writer);
        writer.close();
    }

}

temptest /hello.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
大伙都说:${msg}
</body>
</html>

8 代码生成器

  1. 准备模板(把每个模块需要改的地方确定好)
  2. 确定所有模板的生成顺序
  3. 确定所有模板的生成位置
  4. 确定要生成的基本功能的domain(Dept)
  5. 根据Domain名称与模板结合,在相应位置生成文件
  6. 解决如果父文件夹不存在的问题
  7. 解决如果文件已经存在的问题
  8. 排错(有错先改模板)
    9 EasyCode
    EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml)。只要是与数据库相关的代码都可以通过自定义模板来生成。支持数据库类型与java类型映射关系配置。支持同时生成生成多张表的代码。每张表有独立的配置信息。完全的个性化定义,规则由你设置。
    前提:你要会Velocity!!
    9.1功能说明:
    • 支持多表同时操作
    • 支持同时生成多个模板
    • 支持自定义模板
    • 支持自定义类型映射(支持正则)
    • 支持自定义附加列
    • 支持列附加属性
    • 所有配置项目支持分组模式,在不同项目(或选择不同数据库时),只需要切换对应的分组,所有配置统一变化。
     安装
    在线安装,直接打开

离线安装(先下载相应的zip包)

 添加数据源(已经学过,不做详细讲解)

最主要的就是控制它的位置与内容
 生成一个基本代码
使用dept为例:这个是最简单的测试!!

我们这里只是生成一个最简单的实体类(当然,这个是使用它的自己原来的一个代码生成器模板,和我们最后想要的效果还有很大的差别!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值