Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)六(商品分类功能实现)

| handleClick | 点击某节点时触发 | 被点击节点的node对象,包含全部消息 |

(3)代码实现
a、引入依赖

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

ly-item

com.leyou.service

1.0.0-SNAPSHOT

4.0.0

ly-item-interface

tk.mybatis

mapper-core

1.0.4

b、创建实体类(并添加注解)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

package com.leyou.item.pojo;

import lombok.Data;

import tk.mybatis.mapper.annotation.KeySql;

import javax.persistence.Id;

import javax.persistence.Table;

@Table(name=“tb_category”)

@Data

public class Category {

@Id

@KeySql(useGeneratedKeys = true)

private Long id;

private String name;

private Long parentId;

private Boolean isParent;

private Integer sort;

}

//useGeneratedKeys:

// 对于支持自动生成记录主键的数据库,

// 如:MySQL,SQL Server,

// 此时设置useGeneratedKeys参数值为true,

// 在执行添加记录之后可以获取到数据库自动生成的主键ID。

c、Mapper

在这里插入图片描述

package com.leyou.item.mapper;

import com.leyou.item.pojo.Category;

import tk.mybatis.mapper.common.Mapper;

public interface CategoryMapper extends Mapper {

}

d、service

在这里插入图片描述

在这里插入图片描述

package com.leyou.item.service;

import com.leyou.item.mapper.CategoryMapper;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

@Service

public class CategoryService {

@Autowired

private CategoryMapper categoryMapper;

}

e、controller

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

package com.leyou.item.web;

import com.leyou.item.pojo.Category;

import com.leyou.item.service.CategoryService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.http.HttpStatus;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController //将当前注册控制层

@RequestMapping(“category”) //设置当前的请求的请求路径的名称

public class CategoryController {

@Autowired

private CategoryService categoryService; //注入业务层

/*

根据父结点id查询商品分类

*/

@GetMapping(“list”) //设置请求路径对应方法名称的别名(映射)

public ResponseEntity<List> queryCategoryListByPid(@RequestParam(“pid”) Long pid){//设置请求参数,对应是返回值

return ResponseEntity.ok(categoryService.queryCategoryListByPid(pid));;

}

}

f、完善service层

在这里插入图片描述

package com.leyou.item.service;

import com.leyou.item.mapper.CategoryMapper;

import com.leyou.item.pojo.Category;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.util.CollectionUtils;

import java.util.List;

@Service

public class CategoryService {

@Autowired

private CategoryMapper categoryMapper;

public List queryCategoryListByPid(Long pid) {

//查询条件,mapper会把对象当中的非空属性作为查询的条件

Category t = new Category();

t.setParentId(pid);

//selectByPrimaryKey(pid);根据主键查询

List list = categoryMapper.select(t);//select方法将传入对象的非空字段作为查询的条件

/* if(list == null || list.isEmpty()){

}*/

//上述判断集合是否为空可简化为以下情况

if(CollectionUtils.isEmpty(list)){

//查询失败返回自定义的通用异常

return null;

}

return list;

}

}

g、编写返回空的时候的404枚举

在这里插入图片描述

package com.leyou.common.enums;

import lombok.AllArgsConstructor;

import lombok.Getter;

import lombok.NoArgsConstructor;

@Getter //get方法

@NoArgsConstructor //无参构造

@AllArgsConstructor //有参构造

public enum ExceptionEnum {//枚举是只具有固定实例个数的类

PRICE_CANNOT_BE_NULL(400,“价格不能为空!”),

CATEGORY_NOT_FOND(404,“商品分类没有查到”),

;

private int code;

private String msg;

}

h、继续完善CategoryService

在这里插入图片描述

package com.leyou.item.service;

import com.leyou.common.enums.ExceptionEnum;

import com.leyou.common.exception.LyException;

import com.leyou.item.mapper.CategoryMapper;

import com.leyou.item.pojo.Category;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.util.CollectionUtils;

import java.util.List;

@Service

public class CategoryService {

@Autowired

private CategoryMapper categoryMapper;

public List queryCategoryListByPid(Long pid) {

//查询条件,mapper会把对象当中的非空属性作为查询的条件

Category t = new Category();

t.setParentId(pid);

//selectByPrimaryKey(pid);根据主键查询

List list = categoryMapper.select(t);//select方法将传入对象的非空字段作为查询的条件

/* if(list == null || list.isEmpty()){

}*/

//上述判断集合是否为空可简化为以下情况

if(CollectionUtils.isEmpty(list)){

//查询失败抛出自定义的通用异常

throw new LyException(ExceptionEnum.CATEGORY_NOT_FOND);

}

return list;

}

}

I、完善启动类LyItemServiceApplication

添加Mapper的扫描

在这里插入图片描述

package com.leyou;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication

@EnableDiscoveryClient

@MapperScan(“com.leyou.item.mapper”)

public class LyItemServiceApplication {

public static void main(String[] args) {

SpringApplication.run(LyItemServiceApplication.class);

}

}

J、修改数据库相关配置文件,修改数据库名称

在这里插入图片描述

server:

port: 8083

spring:

application:

name: item-service

datasource:

url: jdbc:mysql://localhost:3306/yun6

username: root

password: root

eureka:

client:

service-url:

defaultZone: http://127.0.0.1:10086/eureka

instance:

prefer-ip-address: true

ip-address: 127.0.0.1

(4)启动运行并测试

在这里插入图片描述

在这里插入图片描述

http://localhost:8083/category/list?pid=0

在这里插入图片描述

然后刷新页面看看

报错

在这里插入图片描述

2、跨域问题

(1)什么是跨域问题

跨域问题是指跨域的访问,一下情况属于跨域问题

| 跨域原因说明 | 示例 |

| — | — |

| 域名不同 | www.jd.com与www.taobao.com |

| 域名相同,端口不同 | www.jd.com:8080与www.jd.com:8081 |

| 二级域名不同 | item.jd.com与miaosha.jd.com |

如果域名和端口都相同,但是请求路径不同,不属于跨域,

如;

www.jd.com/item

www.jd.com/goods

而我们刚才是从manage.leyou.com去访问api.leyou.com,这属于二级域名不同,跨域了。

(2)为什么有跨域问题?

跨域不一定会有跨域问题。

因为跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是于当前页同域名的路径,这能有效的阻止跨站攻击。

因此:跨域问题是针对ajax的一种限制。

但是这却给我们的开发带来了不变,而且在实际生成环境中,肯定会有很多台服务器之间交互,地址和端口都可能不同,怎么办?

(3)解决跨域问题的方案

目前比较常用的跨域解决方案有3种

  • jsonp

最早的解决方案,利用script标签可以跨域的原理实现。

限制:

  • 需要服务的支持

  • 只能发起GET请求

  • nginx反向代理

思路是:利用nginx反向代理把跨域为不跨域,支持各种请求方式缺点:需要在nginx进行额外配置,语义不清晰

  • CORS

规范化的跨域请求解决方案,安全可靠。

优势:

  • 在服务端进行控制是否允许跨域,跨域自定义规则

  • 支持各种请求方式

​ 缺点

​ 会产生额外的请求方式

我们这里会采用cors的跨域方案。

(4)cors解决跨域

浏览器会将Ajax请求分为两类,其处理方案稍有差异:简单的请求,特殊请求

a、简单请求

只需要同时满足以下两大条件,就属于简单请求

(1)请求方法是以下三种方法之一

  • HEAD

  • GET

  • POST

(2)HTTP的头信息不可以超过以下几种字段

  • Accept

  • Accept-Language

  • Content-Lanuage

  • Last-Even-ID

  • Content-Type:只限与三个值:application/x-www-form-urlencodedmultipart/ form-datatext/plain

当浏览器发现发现的ajax请求是简单请求时,会在请求头中携带一个字段:Origin

在这里插入图片描述

Origin中会指出当前请求属于哪个域(协议+域名+端口)。服务会根据这个值决定是否允许其跨域。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzU3MDM0,size_16,color_FFFFFF,t_70)

Origin中会指出当前请求属于哪个域(协议+域名+端口)。服务会根据这个值决定是否允许其跨域。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-OmMiKWCZ-1715532526835)]

[外链图片转存中…(img-PPAveEcv-1715532526836)]

[外链图片转存中…(img-07WR5fY3-1715532526836)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值