移动商城第二篇(品牌管理模块)【文件上传、数据校验、CRUD】

产业园区如何高效对接企业技术需求与高校科研成果?.docx 科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载

添加品牌

在原型界面上,我们都是一些“死”数据,我们需要将数据库的记录代替这些“死”数据!

640?wx_fmt=png
这里写图片描述

上传图片

服务端console对图片进行上传到我们的图片服务器上,而portal则访问的时候从图片服务器拿到图片…

640?wx_fmt=png
这里写图片描述

在前面,我们已经搭建了图片服务器了,那我们怎么将console要上传的图片“丢给”图片服务器呢???

640?wx_fmt=png
这里写图片描述

上传图片时使用Jersey 客户端 API 调用 REST 风格的 Web 服务,  Jersey 1 是一个开源的、可以用于生产环境的 JAX-RS(RESTful Web Services 的 Java API 规范,JSR-311)实现。通过 Jersey 可以很方便的使用 Java 来创建一个 RESTful Web Services。

配置文件上传解析器:

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        <property name="maxUploadSize" value="1024000"></property>    </bean>
       <property name="maxUploadSize" value="1024000"></property>
   </bean>

我们是上传到图片服务器上的,因此需要我们自己配置对应的路径….而这个配置文件应该是写在core的,因为它很有可能是会被重用的。

640?wx_fmt=png
这里写图片描述

值得注意的是:文件服务器要设置成可写的【默认是只读的】

参考如下博文:
http://blog.youkuaiyun.com/hon_3y/article/details/77840532

编写工具类来获取对应的数据

public class ResourcesUtils {    public static String readProp(String key) {        InputStream in = ResourcesUtils.class.getClassLoader().getResourceAsStream("system.properties");        Properties prop = new Properties();        try {            prop.load(in);        } catch (IOException e) {            e.printStackTrace();        }        return prop.getProperty(key);    }}class ResourcesUtils {
   public static String readProp(String key) {
       InputStream in = ResourcesUtils.class.getClassLoader().getResourceAsStream("system.properties");
       Properties prop = new Properties();
       try {
           prop.load(in);
       } catch (IOException e) {
           e.printStackTrace();
       }

       return prop.getProperty(key);
   }

}

编写处理文件上传的Controller

如果有多个文件的话或者我们不知道上传的input的name,我们可以使用request对象来获取Map,再来获取对应的文件

        //把request转换成复杂request        MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;        //获得文件        Map<String, MultipartFile> map = mr.getFileMap();        Set<String> set = map.keySet();        Iterator<String> it = set.iterator();        String fileInputName = it.next();        MultipartFile mf = map.get(fileInputName);
       MultipartHttpServletRequest mr = (MultipartHttpServletRequest) request;
       //获得文件
       Map<String, MultipartFile> map = mr.getFileMap();
       Set<String> set = map.keySet();
       Iterator<String> it = set.iterator();
       String fileInputName = it.next();
       MultipartFile mf = map.get(fileInputName);

而我们现在是知道input的name的,因此,这里我就直接使用MultipartFile对象来获取了。

@Controller@RequestMapping("/upload")public class UploadEbBrandPicController {    @RequestMapping("/uploadPic.do")    public void uploadPic(@RequestParam MultipartFile imgsFile, Writer writer) throws IOException {        //上传文件的名字是不能相同的,因此我们设置一下文件的名称        String fileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());        Random random = new Random();        for(int i = 0; i < 3; i++){            fileName = fileName + random.nextInt(10);        }        //拿到该文件的原始名称        String originalFilename = imgsFile.getOriginalFilename();        //获取该文件的后缀        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));        /***         * 绝对路径是留给页面src属性做显示的         * 相对路径是保存在数据库中,通过input来进行提交的。         */        //获得上传文件的绝对路径        String realPath = ResourcesUtils.readProp("file_path")+"/upload/"+fileName+suffix;        //获得相对路径        String relativePath = "/upload/"+fileName+suffix;        //创建jersy的客户端        Client client = Client.create();        //创建web资源对象        WebResource wr = client.resource(realPath);        //拿到文件的二进制数据,使用web资源对象上传        byte[] bytes = imgsFile.getBytes();        wr.put(bytes);        //使用JSON格式把我们的绝对路径和相对路径返回出去。        JSONObject jo = new JSONObject();        jo.accumulate("realPath", realPath);        jo.accumulate("relativePath", relativePath);        String result = jo.toString();        writer.write(result);    }}
@RequestMapping("/upload")
public class UploadEbBrandPicController {
   @RequestMapping("/uploadPic.do")
   public void uploadPic(@RequestParam MultipartFile imgsFile, Writer writer) throws IOException {

       //上传文件的名字是不能相同的,因此我们设置一下文件的名称
       String fileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
       Random random = new Random();
       for(int i = 0; i < 3; i++){
           fileName = fileName + random.nextInt(10);
       }
       //拿到该文件的原始名称
       String originalFilename = imgsFile.getOriginalFilename();

       //获取该文件的后缀
       String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

       /***
        * 绝对路径是留给页面src属性做显示的
        * 相对路径是保存在数据库中,通过input来进行提交的。
        */

       //获得上传文件的绝对路径
       String realPath = ResourcesUtils.readProp("file_path")+"/upload/"+fileName+suffix;
       //获得相对路径
       String relativePath = "/upload/"+fileName+suffix;

       //创建jersy的客户端
       Client client = Client.create();
       //创建web资源对象
       WebResource wr = client.resource(realPath);

       //拿到文件的二进制数据,使用web资源对象上传
       byte[] bytes = imgsFile.getBytes();
       wr.put(bytes);

       //使用JSON格式把我们的绝对路径和相对路径返回出去。
       JSONObject jo = new JSONObject();
       jo.accumulate("realPath", realPath);
       jo.accumulate("relativePath", relativePath);
       String result = jo.toString();
       writer.write(result);
   }
}

在前端我们是使用ajax进行异步上传文件的,当图片选项修改时,我们就触发事件把图片上传到我们的图片服务器上了,。

function submitUpload(){            var opt = {                //重新指定form的action的值                url:"${path}/upload/uploadPic.do",                type:"post",                dateType:"json",                success:function(responseText){                    //解决多余的字符串数据导致无法解析JSON的问题【另外的博文有写】                    var jsonObj = $.parseJSON(responseText.replace(/<.*?>/ig,""));                    $("#imgsImgSrc").attr("src",jsonObj.realPath);                    $("#imgs").val(jsonObj.relativePath);                },                error:function(){                    alert("系统错误");                }            };            $("#form111").ajaxSubmit(opt);        }
           var opt = {
               //重新指定form的action的值
               url:"${path}/upload/uploadPic.do",
               type:"post",
               dateType:"json",
               success:function(responseText){
                   //解决多余的字符串数据导致无法解析JSON的问题【另外的博文有写】
                   var jsonObj = $.parseJSON(responseText.replace(/<.*?>/ig,""));
                   $("#imgsImgSrc").attr("src",jsonObj.realPath);
                   $("#imgs").val(jsonObj.relativePath);
               },
               error:function(){
                   alert("系统错误");
               }
           };
           $("#form111").ajaxSubmit(opt);
       }

成功把图片上传到图片服务器中了

640?wx_fmt=png
这里写图片描述

数据校验

添加商品的界面是这样子的,需要我们进行校验

640?wx_fmt=png
这里写图片描述

而校验我们有两种方式:

我们是这样做的:在输入框中自定义了几个属性:reg2表示一定要校验的,reg1表示可校验可不校验。如果reg1有数据的话,那么也要校验

        <div class="edit set">            <p><label><samp>*</samp>品牌名称:</label><input type="text" id="brandName" name="brandName" class="text state" reg2="^[a-zA-Z0-9\u4e00-\u9fa5]{1,20}$" tip="必须是中英文或数字字符,长度1-20"/>                <span></span>            </p>            <p><label class="alg_t"><samp>*</samp>品牌LOGO:</label><img id='imgsImgSrc' src="" height="100" width="100" />            </p>             <p><label></label><input type='file' size='27' id='imgsFile' name='imgsFile' class="file" onchange='submitUpload()' /><span id="submitImgTip" class="pos">请上传图片宽为120px,高为50px,大小不超过100K。</span>                <input type='hidden' id='imgs' name='imgs' value='' reg2="^.+$" tip="亲!您忘记上传图片了。" />            </p>             <p><label>品牌网址:</label><input type="text" name="website" class="text state" maxlength="100"  tip="请以http://开头" reg1="http:///*"/>                <span class="pos">&nbsp;</span>            </p>            <p><label class="alg_t">品牌描述:</label><textarea rows="4" cols="45" name="brandDesc" class="are" reg1="^(.|\n){0,300}$" tip="任意字符,长度0-300"></textarea>                <span class="pos">&nbsp;</span>            </p>            <p><label>排序:</label><input type="text" id="brandSort" reg1="^[1-9][0-9]{0,2}$" tip="排序只能输入1-3位数的正整数" name="brandSort" class="text small"/>                <span class="pos">&nbsp;</span>            </p>            <p><label>&nbsp;</label><input type="submit" name="button1" d class="hand btn83x23" value="完成" /><input type="button" class="hand btn83x23b" id="reset1" value='取消' onclick="backList('${backurl}')"/>            </p>        </div>
           <p><label><samp>*</samp>品牌名称:</label><input type="text" id="brandName" name="brandName" class="text state" reg2="^[a-zA-Z0-9\u4e00-\u9fa5]{1,20}$" tip="必须是中英文或数字字符,长度1-20"/>
               <span></span>
           </p>
           <p><label class="alg_t"><samp>*</samp>品牌LOGO:</label><img id='imgsImgSrc' src="" height="100" width="100" />
           </p>
            <p><label></label><input type='file' size='27' id='imgsFile' name='imgsFile' class="file" onchange='submitUpload()' /><span id="submitImgTip" class="pos">请上传图片宽为120px,高为50px,大小不超过100K。</span>
               <input type='hidden' id='imgs' name='imgs' value='' reg2="^.+$" tip="亲!您忘记上传图片了。" />
           </p>

           <p><label>品牌网址:</label><input type="text" name="website" class="text state" maxlength="100"  tip="请以http://开头" reg1="http:///*"/>
               <span class="pos">&nbsp;</span>
           </p>
           <p><label class="alg_t">品牌描述:</label><textarea rows="4" cols="45" name="brandDesc" class="are" reg1="^(.|\n){0,300}$" tip="任意字符,长度0-300"></textarea>
               <span class="pos">&nbsp;</span>
           </p>
           <p><label>排序:</label><input type="text" id="brandSort" reg1="^[1-9][0-9]{0,2}$" tip="排序只能输入1-3位数的正整数" name="brandSort" class="text small"/>
               <span class="pos">&nbsp;</span>
           </p>
           <p><label>&nbsp;</label><input type="submit" name="button1" d class="hand btn83x23" value="完成" /><input type="button" class="hand btn83x23b" id="reset1" value='取消' onclick="backList('${backurl}')"/>
           </p>
       </div>

首先,我们先来写前台的校验…

当该表单提交的时候,我们就对表单的数据进行校验

检测每个必填的input输入框数据,如果每个必填的输入框数据都符合内容,那么检测品牌的名字是否重复!

        $(function () {            $("#form111").submit(function () {                /*设置标识量为true,如果不校验不通过设置为false*/                var isSubmit = true;                /*得到每个必填的input输入框数据*/                $("[reg2]").each(function () {                    var tip = $(this).attr("tip");                    var regStr = $(this).attr("reg2");                    /*拿到js校验的对象*/                    var reg = new RegExp(regStr);                    var value = $.trim($(this).val());                    /*校验输入的值与校验规则是否匹配*/                    if (!reg.test(value)) {                        /*把错误的信息填充到span中*/                        $(this).next("span").html("<font color='red'>" + tip + "</font>");                        isSubmit = false;                        //中断each使用return false,不能使用return;和break;                        return false;                    } else {                        //必填的数据规则都通过了,那么判断品牌名字是否有重复的【后台校验】                        var inputName = $(this).attr("name");                        if (inputName == "brandName") {                            $.ajax({                                url: "${path}/brand/validateBrandName.do",                                type:"post",                                async:false,                                data:{                                    brandName:value                                },                                dataType:"text",                                success: function (responseTest) {                                    if (responseTest == "no") {                                        $("#brandNameSpan").html("品牌的名称不能相同!!");                                        isSubmit = false;                                        return false;                                    }else{                                        $(this).next("span").html("");                                    }                                },                                error: function () {                                    alert("系统错误");                                }                            });                        }                    }                });                return isSubmit;            });        });
           $("#form111").submit(function () {
               /*设置标识量为true,如果不校验不通过设置为false*/
               var isSubmit = true;
               /*得到每个必填的input输入框数据*/
               $("[reg2]").each(function () {
                   var tip = $(this).attr("tip");
                   var regStr = $(this).attr("reg2");
                   /*拿到js校验的对象*/
                   var reg = new RegExp(regStr);
                   var value = $.trim($(this).val());

                   /*校验输入的值与校验规则是否匹配*/
                   if (!reg.test(value)) {
                       /*把错误的信息填充到span中*/
                       $(this).next("span").html("<font color='red'>" + tip + "</font>");
                       isSubmit = false;
                       //中断each使用return false,不能使用return;和break;
                       return false;
                   } else {
                       //必填的数据规则都通过了,那么判断品牌名字是否有重复的【后台校验】
                       var inputName = $(this).attr("name");
                       if (inputName == "brandName") {
                           $.ajax({
                               url: "${path}/brand/validateBrandName.do",
                               type:"post",
                               async:false,
                               data:{
                                   brandName:value
                               },
                               dataType:"text",
                               success: function (responseTest) {
                                   if (responseTest == "no") {
                                       $("#brandNameSpan").html("品牌的名称不能相同!!");
                                       isSubmit = false;
                                       return false;
                                   }else{
                                       $(this).next("span").html("");
                                   }
                               },
                               error: function () {
                                   alert("系统错误");
                               }
                           });
                       }
                   }
               });

               return isSubmit;
           });
       });

检测名字是否相同的controller方法

    @RequestMapping("/validateBrandName.do")    public void validateBrandName(String brandName, Writer out) throws IOException {        //表示成功        String responseTest = "yes";        //根据名字去查找数据库        List<EbBrand> brands = ebBrandService.selectBrandByName(brandName);        //如果返回的集合有Brand了,那么就证明数据库有相同的品牌了        if (brands != null && brands.size() > 0) {            responseTest = "no";        }        out.write(responseTest);    }"/validateBrandName.do")
   public void validateBrandName(String brandName, Writer out) throws IOException {

       //表示成功
       String responseTest = "yes";

       //根据名字去查找数据库
       List<EbBrand> brands = ebBrandService.selectBrandByName(brandName);
       //如果返回的集合有Brand了,那么就证明数据库有相同的品牌了
       if (brands != null && brands.size() > 0) {
           responseTest = "no";
       }

       out.write(responseTest);

   }

如果品牌名称相同,那么不允许提交!

640?wx_fmt=png
这里写图片描述

对于非必填的数据项,如果用户填了数据的话,那么就必须按照我们的规则来写

                /*非必填的数据,如果填了就必须按照规则*/                $("[reg1]").each(function () {                    var tip = $(this).attr("tip");                    var regStr = $(this).attr("reg1");                    /*拿到js校验的对象*/                    var reg = new RegExp(regStr);                    var value = $.trim($(this).val());                   /*如果用户填了数据,那么就需要按照规则*/                   if(value!=null && value!="") {                       if (!reg.test(value)) {                           /*把错误的信息填充到span中*/                           $(this).next("span").html("<font color='red'>" + tip + "</font>");                           isSubmit = false;                           //中断each使用return false,不能使用return;和break;                           return false;                       }else{                           //如果改正了,那么就把对应的错误提示清空了。                           $(this).next("span").html("");                       }                   }                });
               $("[reg1]").each(function () {
                   var tip = $(this).attr("tip");
                   var regStr = $(this).attr("reg1");
                   /*拿到js校验的对象*/
                   var reg = new RegExp(regStr);
                   var value = $.trim($(this).val());

                  /*如果用户填了数据,那么就需要按照规则*/
                  if(value!=null && value!="") {
                      if (!reg.test(value)) {
                          /*把错误的信息填充到span中*/
                          $(this).next("span").html("<font color='red'>" + tip + "</font>");
                          isSubmit = false;
                          //中断each使用return false,不能使用return;和break;
                          return false;
                      }else{
                          //如果改正了,那么就把对应的错误提示清空了。
                          $(this).next("span").html("");
                      }
                  }
               });
640?wx_fmt=png
这里写图片描述

为了达到更好的用户体验,我们应该在光标焦点离开的时候就进行一次校验!

逻辑和上边是一样的,只不过我们使用的是blur方法,而在表单验证的时候使用的是each遍历每一个输入框罢了。

            //光标失去焦点的校验            $("#form111").find("[reg2]").blur(function () {                var tip = $(this).attr("tip");                var regStr = $(this).attr("reg2");                /*拿到js校验的对象*/                var reg = new RegExp(regStr);                var value = $.trim($(this).val());                /*校验输入的值与校验规则是否匹配*/                if (!reg.test(value)) {                    /*把错误的信息填充到span中*/                    $(this).next("span").html("<font color='red'>" + tip + "</font>");                } else {                    //必填的数据规则都通过了,那么判断品牌名字是否有重复的【后台校验】                    var inputName = $(this).attr("name");                    if (inputName == "brandName") {                        $.ajax({                            url: "${path}/brand/validateBrandName.do",                            type: "post",                            async: false,                            data: {                                brandName: value                            },                            dataType: "text",                            success: function (responseTest) {                                if (responseTest == "no") {                                    $("#brandNameSpan").html("品牌的名称不能相同!!");                                } else {                                    //如果改正了,那么就把对应的错误提示清空了。                                    $(this).next("span").html("");                                }                            },                            error: function () {                                alert("系统错误");                            }                        });                    }                }            });            //失去焦点校验            $("#form111").find("[reg1]").blur(function () {                var tip = $(this).attr("tip");                var regStr = $(this).attr("reg1");                /*拿到js校验的对象*/                var reg = new RegExp(regStr);                var value = $.trim($(this).val());                /*如果用户填了数据,那么就需要按照规则*/                if (value != null && value != "") {                    if (!reg.test(value)) {                        /*把错误的信息填充到span中*/                        $(this).next("span").html("<font color='red'>" + tip + "</font>");                    } else {                        //如果改正了,那么就把对应的错误提示清空了。                        $(this).next("span").html("");                    }                }            });
           $("#form111").find("[reg2]").blur(function () {
               var tip = $(this).attr("tip");
               var regStr = $(this).attr("reg2");
               /*拿到js校验的对象*/
               var reg = new RegExp(regStr);
               var value = $.trim($(this).val());

               /*校验输入的值与校验规则是否匹配*/
               if (!reg.test(value)) {
                   /*把错误的信息填充到span中*/
                   $(this).next("span").html("<font color='red'>" + tip + "</font>");
               } else {
                   //必填的数据规则都通过了,那么判断品牌名字是否有重复的【后台校验】
                   var inputName = $(this).attr("name");
                   if (inputName == "brandName") {
                       $.ajax({
                           url: "${path}/brand/validateBrandName.do",
                           type: "post",
                           async: false,
                           data: {
                               brandName: value
                           },
                           dataType: "text",
                           success: function (responseTest) {
                               if (responseTest == "no") {
                                   $("#brandNameSpan").html("品牌的名称不能相同!!");
                               } else {
                                   //如果改正了,那么就把对应的错误提示清空了。
                                   $(this).next("span").html("");
                               }
                           },
                           error: function () {
                               alert("系统错误");
                           }
                       });
                   }
               }
           });

           //失去焦点校验
           $("#form111").find("[reg1]").blur(function () {
               var tip = $(this).attr("tip");
               var regStr = $(this).attr("reg1");
               /*拿到js校验的对象*/
               var reg = new RegExp(regStr);
               var value = $.trim($(this).val());
               /*如果用户填了数据,那么就需要按照规则*/
               if (value != null && value != "") {
                   if (!reg.test(value)) {
                       /*把错误的信息填充到span中*/
                       $(this).next("span").html("<font color='red'>" + tip + "</font>");
                   } else {
                       //如果改正了,那么就把对应的错误提示清空了。
                       $(this).next("span").html("");
                   }
               }
           });

查看品牌

上一篇中我们已经可以顺利添加商品了,一般地,我们添加完商品之后会跳转到我们的查看商品的页面上…

Contoller拿到数据库中的数据

    @RequestMapping("/listBrand.do")    public String  listBrand(Model model) throws IOException {        List<EbBrand> brandList = ebBrandService.selectBrand();        model.addAttribute("brandList", brandList);        return "item/listbrand";    }"/listBrand.do")
   public String  listBrand(Model model) throws IOException {
       List<EbBrand> brandList = ebBrandService.selectBrand();
       model.addAttribute("brandList", brandList);
       return "item/listbrand";
   }

把文件服务器的路径添加到总配置文件中

<c:set var="file_path" value="http://localhost:8081/file"/>
640?wx_fmt=png
这里写图片描述
        <c:forEach items="${brandList}" var="brand">            <tr>                <td>${brand.brandId}</td>                <td>                    <%--这里需要图片的全路径,最好我们把前部分的路径在配置文件中写起来--%>                    <img id='imgsImgSrc' src="${file_path}${brand.imgs}" height="50" width="50"/></td>                <td>${brand.brandName}</td>                <td class="nwp">${brand.website}</td>                <td class="nwp">${brand.brandDesc}</td>                <td>${brand.brandSort}</td>                <td>                    <a href="${path }/shop/item/editbrand.jsp?brandId="${brand.brandId}>编辑</a>                    <a href="#" onclick="singleDel(${brand.brandId})">删除</a>                </td>            </tr>        </c:forEach>
           <tr>
               <td>${brand.brandId}</td>
               <td>
                   <%--这里需要图片的全路径,最好我们把前部分的路径在配置文件中写起来--%>
                   <img id='imgsImgSrc' src="${file_path}${brand.imgs}" height="50" width="50"/></td>
               <td>${brand.brandName}</td>
               <td class="nwp">${brand.website}</td>
               <td class="nwp">${brand.brandDesc}</td>
               <td>${brand.brandSort}</td>
               <td>
                   <a href="${path }/shop/item/editbrand.jsp?brandId="${brand.brandId}>编辑</a>
                   <a href="#" onclick="singleDel(${brand.brandId})">删除</a>
               </td>
           </tr>
       </c:forEach>
640?wx_fmt=png
这里写图片描述

编辑品牌

一般地,我们的品牌名称是不会轻易变更的,因此我们在编辑的时候默认不让它变更。

我们有两种方式让用户修改不了

一般地,我们都是使用readonly,因为使用disable的话,后台是获取不到值的

640?wx_fmt=png
这里写图片描述

在更新的时候,注意要把id和我们的图片值传递过去,好让它修改

      <input type='hidden' id='imgs' name='imgs' value="${brand.imgs }" reg2="^.+$" tip="亲!您忘记上传图片了。"/>      <input type="hidden" name="brandId" value="${brand.brandId }">
     <input type="hidden" name="brandId" value="${brand.brandId }">

删除品牌

在删除品牌之前,询问是否要删除

    function singleDel(brandId){        if(confirm("你确认要删除该品牌吗?")){            window.location.href = "${path}/brand/deleteBrand.do?brandId="+brandId;        }    }
       if(confirm("你确认要删除该品牌吗?")){
           window.location.href = "${path}/brand/deleteBrand.do?brandId="+brandId;
       }
   }

添加品牌优化

有的时候,可能因为我们的网络原因,用户填写完表单的时候,可能会多次发送添加品牌的请求,因此我们可以使用模态窗口来阻止这种情况的发生:

<%--操作请求中--%><div id="refundLoadDiv" class="alt" style="display:none">    <div class="t"></div>    <div class="c set">        <ul class="uls">            <li style="text-align:center;">                <img src="<c:url value='/ecps/console/res/imgs/loading.gif'/>" />操作请求中... ...            </li>        </ul>    </div>    <div class="f"></div></div>
<div id="refundLoadDiv" class="alt" style="display:none">
   <div class="t"></div>
   <div class="c set">
       <ul class="uls">
           <li style="text-align:center;">
               <img src="<c:url value='/ecps/console/res/imgs/loading.gif'/>" />操作请求中... ...
           </li>
       </ul>
   </div>
   <div class="f"></div>
</div>
function tipShow(idName){    var idObj = $(idName);    var idBgObj = $("#bgWindow");    if(idBgObj.length == 0){        var iframe,div;        div = $("<div></div>");        div.attr({id:"bgWindow",style:"display:none"});        iframe = $("<iframe></iframe>");        iframe.attr({id:"bgWindowIframe",src:"about:blank",marginwidth:"0",marginheight:"0",frameBorder:"no",framespacing:"0",allowtransparency:"true"});        div.append(iframe);        $(document.body).append(div);        idBgObj = $("#bgWindow");      }    var winH = $(window).height();    var docH = $(document.body).height();    if(winH > docH){docH = winH;}    var winW = $(window).width();    var docW = $(document.body).width();    if(winW > docW){docW = winW;}    var scrollH = $(document).scrollTop();    if(scrollH == undefined){scrollH = 0}    //alert(idObj.height());    var t = parseInt((winH - idObj.height())/2);    if(idObj.css("position") == "absolute"){t = t + scrollH;}    if(t != parseInt(idObj.css("top"))){idObj.css("top",t);}    var l = parseInt((winW - idObj.width())/2);    if(l < 0){l = 0;}    if(l != parseInt(idObj.css("left"))){idObj.css("left",l);}    if(docW != parseInt(idBgObj.css("width"))){idBgObj.css("width",docW);}    if(docH != parseInt(idBgObj.css("height"))){idBgObj.css("height",docH);idBgObj.find("iframe").css("height",docH);}    idBgObj.show();    idObj.show();    window.onresize = function(){        if(idObj.css("display") == "block"){tipShow(idName);}    };    window.onscroll = function(){        if(idObj.css("display") == "block"){tipShow(idName);}    };    var close = idName + "Close";    var reset = idName + "Reset";    var ok = idName + "Ok";    if($(close).length == 1){$(close).click(function(){tipHide(idName);});}    if($(reset).length == 1){$(reset).click(function(){tipHide(idName);});}    if($(ok).length == 1){$(ok).click(function(){tipHide(idName);});}}

   var idObj = $(idName);
   var idBgObj = $("#bgWindow");

   if(idBgObj.length == 0){
       var iframe,div;
       div = $("<div></div>");
       div.attr({id:"bgWindow",style:"display:none"});
       iframe = $("<iframe></iframe>");
       iframe.attr({id:"bgWindowIframe",src:"about:blank",marginwidth:"0",marginheight:"0",frameBorder:"no",framespacing:"0",allowtransparency:"true"});
       div.append(iframe);
       $(document.body).append(div);
       idBgObj = $("#bgWindow");  
   }

   var winH = $(window).height();
   var docH = $(document.body).height();
   if(winH > docH){docH = winH;}

   var winW = $(window).width();
   var docW = $(document.body).width();
   if(winW > docW){docW = winW;}

   var scrollH = $(document).scrollTop();
   if(scrollH == undefined){scrollH = 0}
   //alert(idObj.height());
   var t = parseInt((winH - idObj.height())/2);
   if(idObj.css("position") == "absolute"){t = t + scrollH;}
   if(t != parseInt(idObj.css("top"))){idObj.css("top",t);}

   var l = parseInt((winW - idObj.width())/2);
   if(l < 0){l = 0;}
   if(l != parseInt(idObj.css("left"))){idObj.css("left",l);}

   if(docW != parseInt(idBgObj.css("width"))){idBgObj.css("width",docW);}
   if(docH != parseInt(idBgObj.css("height"))){idBgObj.css("height",docH);idBgObj.find("iframe").css("height",docH);}

   idBgObj.show();
   idObj.show();

   window.onresize = function(){
       if(idObj.css("display") == "block"){tipShow(idName);}
   };
   window.onscroll = function(){
       if(idObj.css("display") == "block"){tipShow(idName);}
   };

   var close = idName + "Close";
   var reset = idName + "Reset";
   var ok = idName + "Ok";
   if($(close).length == 1){$(close).click(function(){tipHide(idName);});}
   if($(reset).length == 1){$(reset).click(function(){tipHide(idName);});}
   if($(ok).length == 1){$(ok).click(function(){tipHide(idName);});}
}

如果校验没有问题,那么就弹出模态窗口

if(isSubmit) {    showTip("#refundLoadDiv");}
   showTip("#refundLoadDiv");
}

总结

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:Java3y


国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx 科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载

相关推荐

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

品优购做完品牌crud前端分层开发后,访问网址突然不显示数据?

启动服务层出现,控制台无报错: 然后登陆zookeeper的管理中心,查看有无提供服务和消费服务的地址      然后看文档得知:     第二个问题出现了,版本冲突 org.springframework.core.io.ResourceEditor.&lt;init&gt;(Lorg/springframework/core/io/ResourceLoader;) ...

weixin_43522743的博客 316

高通camera open代码流程(hal到kernel)

内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下...

oxoo123的专栏 4276

【Activiti工作流】7.流程定义的CRUD(上)

工作流的23张表是如何存取的?每一步操作逻辑是什么样子的?我们来学习一下。 一、管理流程定义 1设计流程定义文档 1.1流程图 我们之前已经看过,常见流程图如下如所示: 包含了开始节点/结束节点/任务/流向线 1.2bpmn文件 BPMN 2.0根节点是definitions节点。 这个元素中,可以定义多个流程定义(不过我们建议每个文件只包含一个流程定义, 可以简化开发过

程序猿之洞 6418

嵌入式开发中Tab与空格混用的危害与统一规范实践

在软件工程中,代码格式一致性是保障可读性与团队协作效率的基础。从原理上看,制表符(Tab)与空格(Space)在存储与显示机制上存在本质差异:Tab是控制字符,其显示宽度取决于编辑器设置;空格则是固定宽度的字符。这种差异导致混用时会引发代码对齐错乱、版本控制冲突及跨平台兼容性问题,严重影响工程的可维护性。尤其在嵌入式开发领域,资源受限环境与高可靠性要求使得统一的编码规范更为关键。通过配置编辑器、集成clang-format等自动化工具,可以强制实现缩进风格的一致性,从而提升代码质量与团队协作效率。本文聚焦于

weixin_42545636的博客 276

IC芯片验证 - 手把手教你搭建UVM验证环境

这是一个UVM的demo项目

howard789的博客 3万+

CMS系统项目常规开发流程和简单CRUD实现

步骤 1.设计实体,数据库表和基本实现类 1.1 数据库表 DDL CREATE TABLE `t_images` ( `imgid` int(11) NOT NULL AUTO_INCREMENT, `storepath` varchar(255) DEFAULT NULL, `storename` varchar(255) DEFAULT NULL, `intro` ...

qq_43423383的博客 1581

Ansys Zemax实战:5步搞定衍射光学元件(DOE)设计,附赠超透镜(metalens)避坑指南

本文详细介绍了使用Ansys Zemax进行衍射光学元件(DOE)和超透镜(metalens)设计的5步实战流程。从基础光学系统搭建到相位面设计验证,再到制造准备与实测对比,全面解析了OpticStudio中的关键技巧和常见避坑指南,帮助工程师高效完成复杂光学元件设计。

orange的博客 622

Web版CRUD开发流程实例(一)

部署:    ①:搭建JavaWeb项目:    1.创建一个Java项目:product;    2.在product中创建一个文件夹webapp,表示Web项目的根;    3.在webapp中创建WEB-INF文件夹,    4.在WEB-INF中创建文件夹:lib,

lamcyberp的博客 1817

Silvaco二极管、三极管、CMOS的制备

Silvaco二极管和三极管的制备

yytu231的博客 5749

Debezium系列之:深入理解 Debezium Topic的设置要求

Debezium系列之:配置 Debezium Topic

zhengzaifeidelushang的博客 1009

基本业务CRUD的过程思路

一般是要进入系统,请求后台数据存入List集合,会在jsp页面进行列表展示。 增加的过程是展开一个表单,输入数据后提交到后台进行封装,然后后台调用Dao中的add的方法(此时传过去的一般是获取的数据库连接con,和封装的数据)进行插入。 修改的过程是jsp页面点击修改后会传过去一个相应的要修改的数据的Id(此Id一般是EL表达式获取的ID值),后台会根据此Id查询获取相应的实体,转发到修改页面(此...

qq_34721292的博客 1038

PCIe协议之 Equalization篇 之 谈谈几种模式

对于两端有能力最高支持 32 GT/s 及以上速率的设备,如果把目标速度设置为 8 GT/s 或 16 GT/s 速率,是不建议采用 Bypass-Equalization-to-Highest-Rate 模式的,即便采用了,也不会针对 8 GT/s 或 16 GT/s 的目标速率进行 EQ。对于支持 32 GT/s 及以上速率的设备,其可能根本无需工作在 8 GT/s 或 16 GT/s 速率,这时再针对 8 GT/s 或 16 GT/s 速率进行 EQ,多少有点浪费。

那么菜的博客 564

移动商城项目【总结】

移动商城项目总结 移动商城项目是我第二个做得比较大的项目,该项目系统来源于传智Java168期,十天的视频课程(想要视频的同学关注我的公众号就可以直接获取了) 通过这次的项目又再次开阔了我的视野,自己练习完我将项目的代码放到了GitHub中:https://github.com/ZhongFuCheng3y/Mobile-commerce-,同时在练习的过程中也用博文记录下来了,一共7篇。 ...

3y 1992

Python 爬虫实战:微博自动化运营工具(点赞 / 转发 / 评论 + 反封号策略)

微博作为中国最大的社交媒体平台之一,拥有庞大的用户群体和丰富的数据资源。通过 Python 爬虫技术,我们可以实现微博的自动化运营,包括点赞、转发、评论等功能,同时采取有效的反封号策略,确保账号的安全和稳定运行。

u014481728的博客 1178

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

GOT2000数据记录配置与容量计算:从86KB/天说起

在工业自动化现场,数据记录是设备运行分析的基础,而采样间隔、数据类型与存储格式的匹配直接决定记录文件的质量与体积。以每秒采样一次、单字节数据项为例,日数据量约为86.4KB,但实际项目中数据项个数、位宽(16位/32位)、CSV或二进制格式都会让容量成倍变化。理解触发方式(采样、定时、位触发)、地址与数据类型对应关系、文件切换与覆盖策略等配对逻辑,是避免空文件、体积异常和时间戳错位的核心。通过合理估算日数据量,结合SD卡容量规划与定期导出,可确保长期运行数据的完整性与可追溯性。本文面向PLC与触摸屏数据采集

weixin_33910460的博客 389

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Litemall商城系统架构解析与开发指南

Litemall是一个轻量级的全栈商城系统,采用现代化的技术栈构建,包含小程序客户端、移动客户端和网页管理端。该系统采用模块化设计,支持前后端分离开发模式,适合作为学习项目或中小型电商平台的基础框架。 ## 系统架构设计 ### 四大核心子系统 1. **基础系统子系统(platform)** - 数据库层:MySQL关系型数据库 - 核心模块:litemall-core(通用功...

gitblog_00378的博客 563

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

最新Java商城项目源码免费下载,含完整前后端功能模块

这套免费的Java全栈商城项目源码,不仅是一份可运行的代码,更是一个宝贵的学习宝库。先跑起来: 成功在本地部署,这是第一步。阅读代码: 从一个小功能点(如用户登录)入手,跟踪API从Controller到Service再到Mapper的完整调用链。模仿改造: 尝试修改页面样式、增加一个简单的字段或功能。深入原理: 思考为什么这里要用缓存?事务是如何管理的?JWT令牌是如何刷新的?通过这样一个高质量项目的实践,你的Java全栈开发能力必将得到质的飞跃。立即动手,开始你的商城项目实战之旅吧!免责声明。

2501_93753784的博客 317

分布式电商项目七:配置商品服务基本的CRUD功能

配置商品服务基本的CRUD功能 生成完数据库文件之后,要对product模块进行配置才能使用。 整合Mybatis-Plus 导入依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1<

LastYHM的博客 445

品牌管理案例——添加新品牌 删除品牌 根据条件筛选品牌

添加新品牌 // 分析: // 1. 获取到 id 和 name ,直接从 data 上面获取 // 2. 组织出一个对象 // 3. 把这个对象,调用 数组的 相关方法,添加到 当前 data 上的 list 中 // 4. 注意:在Vue中,已经实现了数据的双向绑定,每当我们修改了 data 中的数据,Vu...

qq_39368007的博客 370

数据库CRUD操作

数据库CRUD操作: C:Create 增加对应CREATE TBL ...; ADD TBL IN (...) VALUES (...) R:Retrieve查询SELECT * from TBL U:Update修改UPDATE TBL ..SET ... D:Delete删除 DELETE FROM TBL WHERE ....

yazhouren的专栏 449

品优购项目 单表过程 乒乓过程 入口 MyBatis逆向工程 dubbo框架搭建 品牌表CRUD bug集锦...

转载于:https://www.cnblogs.com/mozq/p/11105961.html

diaopitian0181的博客 178

品牌管理项目-简单(没有连接数据库)

<template> <div> <div> <div> <h3>添加品牌</h3> </div> <div width="100%"> ...

weixin_45122202的博客 158
上一篇: 移动商城项目总结
下一篇: 移动商城第六篇【单品查询、静态化页面】
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值