老师救...

老师救...

http://img1.sycdn.imooc.com//climg/5e51f1ef0942c42d13310553.jpg

http://img1.sycdn.imooc.com//climg/5e51f20d09d5227208480305.jpg

http://img1.sycdn.imooc.com//climg/5e51f27609dd922f05800531.jpg

http://img1.sycdn.imooc.com//climg/5e51f2920939614505310128.jpg

http://img1.sycdn.imooc.com//climg/5e51f2a00969a40d04720393.jpg

http://img1.sycdn.imooc.com//climg/5e51f2ca091c73be03400255.jpghttp://img1.sycdn.imooc.com//climg/5e51f2dc0984da2508660221.jpg

救命,加了验证码没有显示。。

还有想问一下,最下面图片的js路径,为啥只需要退一级目录就能获取到了?参照我这里的目录结构,shop_operation.html退一级目录不是到与html文件夹同级目录下么?求解,谢谢

正在回答

登陆购买课程后可参与讨论,去登陆

14回答

同学你好!

老师使用你的代码是可以的。你可以直接在浏览器输入地址测试一下

比如:http://localhost:8080/o2o/kaptcha?66

你第一次加载页面时,图片可以出来吗?你是点击的时候出现的问题吗?如果是:你刷新一下页面重新测试一下。可能访问加载比较慢导致的

注意:是否有大小写不一致问题

祝学习愉快~



  • qq_粽翎_0 提问者 #1
    找到原因了,是lib文件夹下没有引入验证码的jar包。又有新问题了555,看回答区哦
    2020-02-23 20:45:02
好帮手慕柯南 2020-02-25 15:43:57

同学你好!

老师这里测试没有复现你所说的现象。

建议你对最新的代码做以下检查:

  1. 验证码错误之后是否直接返回了

    http://img1.sycdn.imooc.com//climg/5e54cf85097eb84c05720138.jpg

  2. 在浏览器的控制台看一下发送了几次请求。如果是两次可以是误操作

  3. 在后台打断点,跟踪一下数据,可能是调用了两次添加数据的代码

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 qq_粽翎_0 #1
    我学傻了老师,逻辑其实是正常的。麻烦老师了,谢谢
    2020-02-25 21:57:48
好帮手慕柯南 2020-02-25 10:54:56

同学你好!

formData不是一个字符串,而是一个变量,所以建议你将上面的引号去掉

http://img1.sycdn.imooc.com//climg/5e548c7d09e852fd04200169.jpg

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 qq_粽翎_0 #1
    世纪难题!终于解决了,谢谢老师! 不过有一点bug,不知道是不是代码逻辑引起的:第一次输入错误验证码,点击提交,会提示错误,数据不会写入数据库。然后页面不变,其他填写好的内容不动,只把错误的验证码改为正确的验证码,然后提交。成功,但是数据库写了两遍一模一样的数据,这又是啥世纪问题555
    2020-02-25 11:46:15
提问者 qq_粽翎_0 2020-02-24 23:40:28

增加一些:

http://img1.sycdn.imooc.com//climg/5e53ee3909317c0806610540.jpg

ajax这里URL,type,data这些都是未定义...

提问者 qq_粽翎_0 2020-02-24 21:22:18

http://img1.sycdn.imooc.com//climg/5e53cd3709771ca612480563.jpg

前端传递的值是可以正常接收到的,那些分类和区域的下拉选项都能正常读出来,IDE的控制台没有打印如何错误信息

http://img1.sycdn.imooc.com//climg/5e53cdb80921782a12920551.jpg

我打印了这个,获取不到值。程序跑到处理验证码那里判断为空,就直接在前端页面返回验证码不能为空的错误信息了

好帮手慕柯南 2020-02-24 18:44:09

同学你好!

  1. 你前端传递的数据是否正确

    http://img1.sycdn.imooc.com//climg/5e53a8f609fd60e918370660.jpg

  2. 你在测试是区域和分类的数据是否有加载出来,如果没有可能会导致问题

    http://img1.sycdn.imooc.com//climg/5e53a8a30921670409720205.jpg

  3. idea以及浏览器的控制台是否报错了

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 qq_粽翎_0 #1
    老师看回答区哦
    2020-02-24 21:18:14
好帮手慕柯南 2020-02-24 14:31:56

同学你好!

你的代码少写了@ResponseBody注解,建议你添加测试一下

http://img1.sycdn.imooc.com//climg/5e536db809921db307230210.jpg

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 qq_粽翎_0 #1
    添加了@ResponseBody前端返回提示了,现在的问题是前端数据提交后台接收不到,shopStr从request域获取是null,救..
    2020-02-24 17:13:12
提问者 qq_粽翎_0 2020-02-24 11:32:00
@Controller("shopManagementController")
@RequestMapping("/shop_admin")
public class ShopManagementController {

    @Autowired
    private ShopService shopService;
    @Autowired
    private ShopCategoryService shopCategoryService;
    @Autowired
    private AreaService areaService;


    @RequestMapping("/shop_init")
    @ResponseBody
    private Map<String, Object> initShop() {
        Map<String, Object> modelMap = null;
        List<Area> areaList = null;
        List<ShopCategory> shopCategoryList = null;
        try {
            modelMap = new HashMap<>();
            areaList = areaService.getAllArea();
            shopCategoryList = shopCategoryService.getShopCategory(new ShopCategory());
            modelMap.put("areaList",areaList);
            modelMap.put("shopCategoryList",shopCategoryList);
            modelMap.put("success",true);
        } catch (Exception e) {
            modelMap.put("success",false);
            modelMap.put("msg", e.getMessage());
        }
        return modelMap;
    }

    @RequestMapping("/shop_register")
    private Map<String, Object> registerShop(HttpServletRequest request) {
        Map<String, Object> modelMap = new HashMap<>();
        //先处理验证码
        if (!VerifyCodeUtil.checkVerifyCode(request)) {
            modelMap.put("success", false);
            modelMap.put("msg", "验证码错误!");
            return modelMap;
        }
        //1.接收并转换相应参数,包括店铺信息和图片信息
        String shopStr = HttpServletRequestUtil.getString(request, "shopStr");
        ObjectMapper mapper = new ObjectMapper();
        Shop shop = null;
        try {
            shop = mapper.readValue(shopStr, Shop.class);   //将页面读取到的参数转换为shop实体类
        } catch (Exception e) {
            modelMap.put("success", false);
            modelMap.put("msg", e.getMessage());
            return modelMap;
        }
        CommonsMultipartFile shopImg = null;
        //定义文件上传解析器,去解析request里面的文件信息
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        //判断是否有上传的文件流
        if (commonsMultipartResolver.isMultipart(request)) {
            MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
            //通过指定参数获取文件流,并进行转换成spring能够处理的CommonsMultipartFile类型
            shopImg = (CommonsMultipartFile) multipartHttpServletRequest.getFile("shopImg");
        } else {
            modelMap.put("msg", "上传图片不能为空");
            return modelMap;
        }
        //2.注册店铺
        if (shopImg != null && shop != null) {
            User user = (User)request.getSession().getAttribute("user");
            shop.setUser(user);
            ShopExecution shopExecution = null;
            try {
                shopExecution = shopService.addShop(shopImg.getInputStream(), shopImg.getOriginalFilename(), shop);
                if (shopExecution.getStatus() == ShopStatusEnum.CHECK.getStatus()) {
                    modelMap.put("success", true);
                } else {
                    modelMap.put("success", false);
                    modelMap.put("msg", shopExecution.getStatusInfo());
                }
            } catch (IOException e) {
                modelMap.put("success", false);
                modelMap.put("msg", e.getMessage());
                return modelMap;
            }
            return modelMap;
        } else {
            modelMap.put("success", false);
            modelMap.put("msg", "请输入店铺信息");
            return modelMap;
        }
    }
}


提问者 qq_粽翎_0 2020-02-24 10:10:43
$(function () {
    var initUrl = '/o2o/shop_admin/shop_init';
    var registerShopUrl = '/o2o/shop_admin/shop_register';
    getShopInit();
    function getShopInit() {
        $.getJSON(initUrl,function (data) {
            if (data.success) {
                var tempHtml = '';
                var tempAreaHtml = '';
                data.shopCategoryList.map(function (item,index){
                    tempHtml += '<option data-id="'+ item.shopCategoryId + '">'
                    + item.shopCategoryName + '</option>';
                });
                data.areaList.map(function (item,index){
                    tempAreaHtml += '<option data-id="'+ item.areaId + '">'
                    + item.areaName + '</option>';
                });
                $('#shop-category').html(tempHtml);
                $('#shop-area').html(tempAreaHtml);
            }
        })
    }

    $('#submit').click(function () {
        var shop = {};
        shop.shopName = $('#shop-name').val();
        shop.shopAddr = $('#shop-addr').val();
        shop.phone = $('#shop-phone').val();
        shop.shopDesc = $('#shop-desc').val();
        shop.shopCategory = {
            shopCategoryId : $('#shop-category').find('option').not(function () {
                return !this.selected;
            }).data('id')
        };
        shop.area = {
            areaId : $('#shop-area').find('option').not(function () {
                return !this.selected;
            }).data('id')
        };
        var shopImg = $('#shop-img')[0].files[0];
        var formData = new FormData();
        formData.append('shopImg', shopImg);
        formData.append('shopStr', JSON.stringify(shop));
        var verifyCodeActual = $('#shop-kaptcha').val();
        if (!verifyCodeActual) {
            $.toast('请输入验证码!');
            return;
        }
        formData.append('verifyCodeActual', verifyCodeActual);
        $.ajax({
            url : registerShopUrl,
            type : 'POST',
            data : 'formData',
            contentType : false,
            processData : false,
            cache : false,
            success : function(data){
                if (data.success) {
                    $.toast('提交成功!');
                } else {
                    $.toast('提交失败!'+data.msg);
                }
                $('#kaptcha_img').click();
            }
        });
    });
});


好帮手慕柯南 2020-02-24 09:55:24

同学你好!

  1. 你这里时点击注册之后404吗?

    这里是ajax请求,并且注册成功之后会跳转至商铺列表页面

    http://img1.sycdn.imooc.com//climg/5e532c8609a52eaa04570083.jpg

  2. 你的为什么时到注册页面呢?另外根据你之前的目录结构,是找不到跳转的地址的?你是否做了一些修改呢?

    http://img1.sycdn.imooc.com//climg/5e532c5409c8ee4202900109.jpg

    http://img1.sycdn.imooc.com//climg/5e532c7809d2e8b105020099.jpg

关于无法贴代码的问题,我们会向相关的工作人员进行反馈~

同学现在可以贴代码吗?

祝学习愉快~

  • 提问者 qq_粽翎_0 #1
    骚等,java代码还发不出来
    2020-02-24 10:14:20
  • 提问者 qq_粽翎_0 #2
    好啦,控制器和js的代码发出来了哦
    2020-02-24 11:32:35
  • 提问者 qq_粽翎_0 #3
    那些目录结构没有做修改,都没有动,老师还可以参照我之前的截图
    2020-02-24 11:33:32
提问者 qq_粽翎_0 2020-02-23 21:00:53

http://img1.sycdn.imooc.com//climg/5e5277500962b45811960564.jpg

点击右下角的错误连接:

http://img1.sycdn.imooc.com//climg/5e52776a09a02a3705480029.jpg

而下面的提示是这样:

http://img1.sycdn.imooc.com//climg/5e527780093fd9b508290195.jpg

  • 提问者 qq_粽翎_0 #1
    emmm... 我觉得慕课网真有bug,好几次晚上提问,图片文字的就可以正常发出来,用了代码编辑器那些贴代码就提交不了
    2020-02-23 21:09:12
  • 提问者 qq_粽翎_0 #2
    代码发不出去...
    2020-02-24 09:29:03
提问者 qq_粽翎_0 2020-02-23 17:35:20

http://img1.sycdn.imooc.com//climg/5e5246e2092e796311770589.jpg

好了,新问题出来了,图片加载不出来,求救~

<!--验证码相关配置-->
<servlet>
    <servlet-name>kaptcha</servlet-name>
    <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
    <!--是否有边框-->
    <init-param>
        <param-name>kaptcha.border</param-name>
        <param-value>no</param-value>
    </init-param>
    <!--图片宽度-->
    <init-param>
        <param-name>kaptcha.image.width</param-name>
        <param-value>135</param-value>
    </init-param>
    <!--图片高度-->
    <init-param>
        <param-name>kaptcha.image.height</param-name>
        <param-value>50</param-value>
    </init-param>
    <!--字体-->
    <init-param>
        <param-name>kaptcha.textproducer.font.names</param-name>
        <param-value>Arial</param-value>
    </init-param>
    <!--字体颜色-->
    <init-param>
        <param-name>kaptcha.textproducer.font.color</param-name>
        <param-value>red</param-value>
    </init-param>
    <!--字体大小-->
    <init-param>
        <param-name>kaptcha.textproducer.font.size</param-name>
        <param-value>43</param-value>
    </init-param>
    <!--干扰线颜色-->
    <init-param>
        <param-name>kaptcha.noise.color</param-name>
        <param-value>black</param-value>
    </init-param>
    <!--使用哪些字符生成验证码-->
    <init-param>
        <param-name>kaptcha.textproducer.char.string</param-name>
        <param-value>ACDGHLINRTXM23579</param-value>
    </init-param>
    <!--验证码字符个数-->
    <init-param>
        <param-name>kaptcha.textproducer.char.length</param-name>
        <param-value>4</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>kaptcha</servlet-name>
    <url-pattern>/kaptcha</url-pattern>
</servlet-mapping>


好帮手慕柯南 2020-02-23 15:05:30

同学你好!

  1. 验证码在xml中是否配置完整了

    http://img1.sycdn.imooc.com/climg/5e52236709a8aed606830142.jpg

  2. 这里的路径是相对与浏览器中的路径写的。所以退一级就可以访问到,你的理解正确。

  3. 如果验证码在xml中的配置正确,建议在浏览器上中看一下验证码具体访问的路径是什么。可能浏览器最终加载的路径是错误的

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 qq_粽翎_0 #1
    看回答区哦老师
    2020-02-23 17:33:16
提问者 qq_粽翎_0 2020-02-23 11:43:27

哦对于这个路径问题,是不是根据页面的访问路径来说的啊?因为页面访问路径只有两级,所以我们退一级就回到了webapp根目录下了,再去访问js资源文件是这样吧

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师