1.商品分类表设计
1.需求分析
2.数据库表设计
1.数据库sunliving_commodity,商品分类表commodity_category
create database sunliving_commodity;
use sunliving_commodity; CREATE TABLE ` commodity_category`
( ` id` BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id' , ` name` CHAR ( 50 ) NOT NULL COMMENT '名称' , ` parent_id` BIGINT NOT NULL COMMENT '父分类 id' , ` cat_level` INT NOT NULL COMMENT '层级' , ` is_show` TINYINT NOT NULL COMMENT '0 不显示,1 显示]' , ` sort` INT NOT NULL COMMENT '排序' , ` icon` CHAR ( 255 ) NOT NULL COMMENT '图标' , ` pro_unit` CHAR ( 50 ) NOT NULL COMMENT '统计单位' , ` pro_count` INT NOT NULL COMMENT '商品数量' , PRIMARY KEY ( ` id` )
) CHARSET = utf8mb4 COMMENT = '商品分类表' ; SELECT *
FROM commodity_category;
2.测试数据
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 1 , '家用电器' , 0 , 1 , 1 , 0 , '' , '' , 0 ) ;
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 21 , '大 家 电' , 1 , 2 , 1 , 0 , '' , '' , 0 ) ;
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 22 , '厨卫大电' , 1 , 2 , 1 , 0 , '' , '' , 0 ) ;
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 201 , '燃气灶' , 22 , 3 , 1 , 0 , '' , '' , 0 ) , ( 202 , '油烟机' , 22 , 3 , 1 , 0 , '' , '' , 0 ) ;
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 301 , '平板电视' , 21 , 3 , 1 , 0 , '' , '' , 0 ) ;
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 2 , '家居家装' , 0 , 1 , 1 , 0 , '' , '' , 0 ) ;
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 41 , '家纺' , 2 , 2 , 1 , 0 , '' , '' , 0 ) ;
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 601 , '桌布/罩件' , 41 , 3 , 1 , 0 , '' , '' , 0 ) ;
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 602 , '地毯地垫' , 41 , 3 , 1 , 0 , '' , '' , 0 ) ;
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 42 , '灯具' , 2 , 2 , 1 , 0 , '' , '' , 0 ) ;
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 651 , '台灯' , 42 , 3 , 1 , 0 , '' , '' , 0 ) ;
INSERT INTO ` commodity_category` ( ` id` , ` name` , ` parent_id` , ` cat_level` , ` is_show` , ` sort` , ` icon` , ` pro_unit` , ` pro_count` )
VALUES ( 652 , '节能灯' , 42 , 3 , 1 , 0 , '' , '' , 0 ) ; select * from commodity_category;
2.代码生成器生成crud
1.解压到sunliving下并聚合管理
1.解压
2.修改sunliving的pom.xml进行聚合管理
3.刷新maven报错 parent.relativePath
这个问题的原因是将这个模块交给了sunliving进行聚合管理,但是并没有设置parent为它
4.将这个代码生成器模块的pom.xml的parent替换为跟sunliving-commodity一致的
< parent> < groupId> org.springframework.boot</ groupId> < artifactId> spring-boot-starter-parent</ artifactId> < version> 2.1.8.RELEASE</ version> < relativePath/> </ parent>
5.再次刷新,没有报错
2.对代码生成器进行配置
1.修改application.yml的mysql配置信息
这里连接sunliving_commodity数据库,也就是家居分类表所在的数据库
driverClassName : com.mysql.cj.jdbc.Driverurl : username : rootpassword : root
2.修改generator.properties的配置信息
#主路径
mainPath=com.sun
#代码生成的包
package=com.sun.sunliving
#模块名字
moduleName=commodity
#作者
author=sun
#邮箱
email=sunxiansehng@gmail.com
#表的前缀
tablePrefix=commodity_
3.启动代码生成器的服务
1.由于端口冲突所以application.yml修改端口为81
2.启动成功之后访问 http://localhost:81/ 可以看到刚才配置的表
4.配置services
1.点击加号
2.选择springboot
3.出现仪表盘管理微服务
3.生成crud代码
1.选中表,点击生成代码
2.会生成一个压缩包
3.解压到桌面,里面有一个main文件夹
4.将这个main替换sunliving-commodity模块的main目录
5.查看生成的代码,此时有报错是正常的
4.梳理MyBatisPlus的结构
1.entity层
1.位置
2.解析
@Data:生成 getter setter toString 方法,也包含默认的无参构造 @TableName(“commodity_category”):实体类的名字跟表名不一样,所以需要映射 @TableId:指定主键,这里其实不指定也可以,因为MyBatisPlus会默认按照id或者Id来寻找主键 注意:MyBatisPlus是默认开启驼峰命名法的,所以如果数据表是带下划线的就可以在entity中按照驼峰来映射 MyBatis与MyBatisPlus有一个区别就是,MyBatisPlus生成的CRUD代码都需要依赖于实体类与表字段的映射,而MyBatis只有查询才需要映射,因为增删改都是直接指定的数据库字段
2.dao层
1.位置
2.Mapper接口解析
@Mapper:注入容器 extends BaseMapper:继承BaseMapper并指定实体类型,则继承的接口方法全是对实体类型进行操作的 方法使用方式:依赖注入针对CategoryDao接口的代理对象 ,则在调用方法 时会自动调用MyBatisPlus中实现CategoryDao接口的方法 如果有需要自定义的方法,就在这里增加然后去Mapper.xml里实现即可,使用方式不变
3.Mapper.xml解析
需要在application.yml中配置扫描这个xml文件 namespace:指定要实现的Mapper接口 resultMap:指定查询后的结果映射到实体类 如果在Mapper接口中有自定义的方法,可以在这里实现,然后通过依赖注入针对Mapper接口的代理对象,调用自定义的方法,就会自动找到这里实现的方法并且执行
3.service层
1.位置
2.service接口解析
extends IService:继承IService并制指定实体类型,则继承的接口方法全是对实体类型进行操作的 方法使用方式:依赖注入针对CategoryService接口的实现类的对象 ,则在调用方法 时会自动调用MyBatisPlus中实现CategoryService接口的方法 如果有需要自定义的方法,就在这里增加然后去实现类里实现即可,使用方式不变
3.service实现类解析
@Service(“categoryService”):注入容器bean的名字是categoryService,其实不指定名字也不影响,因为在使用的时候是根据接口类型找到这个实现类的bean对象的 implements CategoryService:实现service接口的方法,但是目前这个实现类是空的 extends ServiceImpl<CategoryDao, CategoryEntity>:继承ServiceImpl的方法,并指定dao层Mapper接口的类型和实体类型,表示这个实现类要实现对实体类型操作的方法,并且还需要依赖注入Mapper接口的代理对象来调用dao层的方法,只是进行了扩展而已 如果在service接口中有自定义的方法,可以在这里实现,可以依赖注入Mapper接口的代理对象,调用dao层的方法,然后通过依赖注入针对service接口的实现类对象,调用自定义的方法,就会自动找到这里实现的方法并且执行
4.controller层
1.位置
2.解析
controller层的核心就是 url,参数,返回值 @RestController:注入容器 ,使返回类型为json类型 @RequestMapping(“commodity/category”):url的前缀 @Autowired:依赖注入service接口的实现类对象,可以调用service层的方法 @RequestMapping(“/list”):指定url @RequestParam Map<String, Object> params:可以使用表单或者url的形式传递参数 需要注意的是在微服务中@RequestParam或者@RequestBody至少添加一个,一般: @GetMapping添加@RequestParam,接受请求方式为url或表单 @PostMapping添加@RequestBody,接受请求方式为json类型 当然,@GetMapping还可以添加@PathVariable路径参数 返回的R就对应之前写过的Result,封装了返回的对象
5.创建公共模块
1.创建新模块 sunliving-common
2.检查父子pom.xml
3.删除不必要的两个文件夹
4.创建基本结构
5.从renren-fast提取以下几个文件放到 sunliving-common 对应位置
1.src/main/java/io/renren/common
2.放到src/main/java/com/sun/common
3.注意:每次粘贴完成之后都要检查一下是不是指向的当前包,比如
6.pom.xml 引入公共模块需要的依赖
< dependencies> < dependency> < groupId> com.baomidou</ groupId> < artifactId> mybatis-plus-boot-starter</ artifactId> < version> 3.2.0</ version> </ dependency> < dependency> < groupId> org.projectlombok</ groupId> < artifactId> lombok</ artifactId> < version> 1.18.8</ version> </ dependency> < dependency> < groupId> org.apache.httpcomponents</ groupId> < artifactId> httpcore</ artifactId> < version> 4.4.12</ version> </ dependency> < dependency> < groupId> commons-lang</ groupId> < artifactId> commons-lang</ artifactId> < version> 2.6</ version> </ dependency> </ dependencies>
7.检查公共模块报错,依次处理
1.Query.java报错,是包引的不对,删除,自动引入
2.SQLFilter.java也是
3.Query.java报错,语言级别的问题
4.修改java的编译版本为1.8
5.修改modules的语言级别,但是需要注意,只要重新编译还是要设置,只是临时解决方案
6.R.java报错,缺少@Override注解,加上即可
7.最后重新检查这个公共模块确保没有报错
6.sunliving-commodity 引入公共模块 sunliving-common
1.pom.xml引入公共模块,然后刷新maven
< dependency> < groupId> com.sun.sunliving</ groupId> < artifactId> sunliving-common</ artifactId> < version> 1.0-SNAPSHOT</ version> </ dependency>
2.此时sunliving-commodity模块的CategoryController.java报错
1.Cannot resolve symbol ‘RequiresPermissions’
2.这个是shiro的注解,我们不使用,全部注销
3.刷新maven,此时没有任何错误(其实sunliving-common的那个语言级别还有问题,暂时不管)
3.整合sunliving-commodity和MyBatisPlus
1.在sunliving-common 模块引入mysql驱动(因为多个模块都要用)
< dependency> < groupId> mysql</ groupId> < artifactId> mysql-connector-java</ artifactId> < version> 8.0.17</ version> </ dependency>
2.刷新maven,renren-fast报错,还是因为父项目不是sunliving,添加一个属性即可
3.配置application.yml
spring : datasource : driver-class-name : com.mysql.jdbc.Driverurl : username : rootpassword : root
mybatis-plus : mapper-locations : classpath: /mapper/**/*.xml global-config : db-config : id-type : auto configuration : log-impl : org.apache.ibatis.logging.stdout.StdOutImpl
server : port : 9090
4.创建主启动类 com/sun/sunliving/commodity/SunlivingCommodityApplication.java
package com. sun. sunliving. commodity ; import org. springframework. boot. SpringApplication ;
import org. springframework. boot. autoconfigure. SpringBootApplication ;
@SpringBootApplication
public class SunlivingCommodityApplication { public static void main ( String [ ] args) { SpringApplication . run ( SunlivingCommodityApplication . class , args) ; } }
5.启动测试
1.报错 java: -source 1.5 中不支持 diamond 运算符
这个报错一看就是刚才没处理完全的语言级别的问题 如果使用之前的方式处理,只要maven刷新就失效了
2.在sunliving-common模块修改pom.xml来彻底解决编译版本问题,顺便把sunliving-commodity的也改了
< properties> < java.version> 1.8</ java.version> < maven.compiler.source> 1.8</ maven.compiler.source> < maven.compiler.target> 1.8</ maven.compiler.target> </ properties>
然后再检查一下
3.再次启动,报错,9090端口被占用
4.修改application.yml的端口为9091
5.再次启动,成功
6.使用postman测试
1.测试 http://localhost:9091/commodity/category/list
2.测试 http://localhost:9091/commodity/category/info/1
3.测试 http://localhost:9091/commodity/category/save
{ "name" : "Sample Category" , "parentId" : 4 , "catLevel" : 1 , "isShow" : 1 , "sort" : 1 , "icon" : "sample-icon.png" , "proUnit" : "pcs" , "proCount" : 100
}
4.测试 http://localhost:9091/commodity/category/update
{ "name" : "Sample Category" , "parentId" : 4 , "catLevel" : 1 , "isShow" : 1 , "sort" : 1 , "icon" : "sample-icon.png" , "proUnit" : "pcs====================" , "proCount" : 100
}
5.测试 http://localhost:9091/commodity/category/delete
6.提交代码:家居分类表设计以及代码生成器的使用!