第四阶段01-酷鲨商城项目准备

news2024/11/16 11:59:20

1. 关于csmall-product项目

这是“酷鲨商城”大项目中的“商品管理”项目,是一个后台管理项目(给管理员,或运营人员使用的项目,并不是普通用户使用的),并且,只会涉及与发布商品可能相关的功能开发,整个系统中需要的其它功能将由其它项目来实现!另外,此项目只是一个后端项目,采取了前后端分离的开发模式。

在本阶段,还会开发csmall-passport项目,这是“管理员管理”的后端项目,还有csmall-web-client项目,这是“前端项目”。

2. 创建csmall-product项目

在IntelliJ IDEA的创建项目向导界面中,左侧选择Spring Initializr,右侧参数选择:

  • **Server URL:**使用 https://start.spring.iohttps://start.springboot.io ,在这2个中选择任何一个可用的,如果暂时出现这2个均不可用,可以反复尝试,或稍后尝试
  • **Name:**使用csmall-product即可
  • Group:cn.tedu
  • Artifact:csmall-product
  • Package Name:cn.tedu.csmall.product
  • Java:8

3. 调整pom.xml

关于当前项目的父级项目的版本,推荐使用2.5.x系列的版本号,其中,x可以是014之间的任何数字。

完成后,在src/test/java下找到默认已经存在的包,包下有测试类,测试类中有个空的测试方法:

@Test
void contextLoads() {
}

执行此测试方法,应该是可以通过测试的!如果无法通过测试,应该是项目的依赖项或某些配置的错误导致的,需要及时调整。

4. 创建数据库

创建名为mall_pms的数据库:

CREATE DATABASE mall_pms;

提示:SQL语句并不区分大小写。
请添加图片描述

5. 配置Database面板

在IntelliJ IDEA的窗口右侧,可以展开Database面板,可以辅助处理数据库、数据表的相关操作,通常,在开发一个项目之前,强烈推荐配置此面板!

提示:如果在窗口右侧没有Database面板,可以点击View菜单 > Tool Windows子菜单,找到Database菜单项,点击它,即可展开右侧的Database面板。
请添加图片描述

**注意:**如果出现[42000][-1] (conn=214) invalid fetch size错误,应该删除当前配置,重新添加配置,并且,在MariaDBMySQL之间切换选择。

详细配置教程:http://doc.canglaoshi.org/doc/idea_database/index.html

6. 导入数据表

将老师提供的SQL复制到Database面板的console中,全部执行,即可创建当前库中的所有表,并插入了一些测试用的数据。
请添加图片描述

7. 功能的开发顺序

首先,要明确当前项目中涉及哪些数据:

  • pms_album:相册
    • 与“图片”是类似“文件夹”与“文件”的关系
  • pms_attribute:属性
  • pms_attribute_template:属性模板
    • 与“属性”是类似“文件夹”与“文件”的关系
  • pms_brand:品牌
  • pms_brand_category:品牌与类别的关联
  • pms_category:类别
  • pms_category_attribute_template:类别与属性模板的关联
  • pms_picture:图片
  • pms_sku:SKU
  • pms_sku_specification:SKU属性
  • pms_spu:SPU
  • pms_spu_detail:SPU详情

通常,应该先开发偏基础的数据,例如,品牌、类别等都是SPU的基础,所以,应该先开发品牌、类别这类数据的管理功能,再开发SPU、SKU这类数据的管理员。

对于多种并不直接相关的数据,应该先开发逻辑简单的数据,相对来说,类别可能更多“麻烦”一些,因为“类别”是一种“多层级”的数据,例如“家用电器”是“电视”的父级,其下还有“冰箱”、“空调”,而这些子级类别还可以有更子级的类别,例如“空调”就可以有“挂机空调”、“柜机空调”、“中央空调”等子级,所以,类别比品牌、相册这些数据的逻辑规则会更复杂一些,应该先开发品牌、相册等数据的管理功能。

对于各数据的功能开发,大致上应该采取增 > 查 > 删 > 改的开发顺序

每一个功能的开发,大致上应该采取Mapper > Service > Controller > 页面的开发顺序。

8. 添加Mybatis相关依赖项

pom.xml中添加依赖项:

<!-- Mybatis整合Spring Boot的依赖项 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>
<!-- MySQL的依赖项 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

由于Spring Boot存在自动配置,当添加了数据库编程相关的依赖项后,无论是启动项目,还是执行任何Spring Boot测试,都会尝试读取连接数据库的配置信息,如果还没有添加相关配置,会导致启动失败/测试失败,例如:
请添加图片描述

为了解决此问题,需要在配置文件中,添加连接数据库的相关配置。

9. 关于Spring Boot的配置文件

9.1. 关于application.properties

在Spring Boot项目中,在src/main/resources文件夹下存在application.properties文件,此文件是Spring Boot会自动读取的配置文件。

Spring Boot定义了许多特定用途的配置,在application.properties中,需要按照特定的属性名进行配置,则Spring Boot读取到了这些特定的配置后,会自动应用起来!

例如,添加连接数据库的配置:

spring.datasource.url=jdbc:mysql://localhost:3306/mall_pms?characterEncoding=utf-8&useUnicode=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root

9.2. 关于Profile配置

以上在application.properties中添加的是连接数据库的配置信息,当前处于开发阶段,所以,各配置值都是开发时所使用的MySQL的相关配置,例如localhost3306、用户名、密码等,当开发完成后,可能会有专门的测试人员对此项目进行测试,测试时使用的MySQL肯定不会是当前开发使用的MySQL,则以上属性的值都需要修改,当测试通过后,项目正式上线,使用的MySQL又会不同,则各属性值需要再次修改……即使全部改完了,项目可能需要进入下一阶段的开发,以上各属性值又需要改回成开发时的配置值!在开发实践中,除了连接数据库的配置信息以外,其它配置也可能会根据项目的运行环境不同,而使用不同的配置值!

Spring框架提供了Profile配置的机制,允许同时存在好几套配置文件,这些配置文件默认是可以不激活的(默认是无效的),当需要使用哪套配置,就激活哪套配置文件即可,这样的配置文件称之为Profile配置。

Spring Boot框架很好的支持了Profile配置,其规则是:

  • application.properties是主配置文件,其中的所有配置都是默认加载的
  • application-自定义名称.properties作为文件名的全部是Profile配置,默认是不加载的,必须激活这些文件中的配置才会被加载
  • application.properties(主配置文件)中,使用spring.profiles.active属性,可以激活Profile配置,此属性的值就是Profile配置的文件名的自定义部分,如果有多个Profile配置需要激活,使用逗号分隔即可
  • 如果在application.properties(主配置文件)中,与在Profile配置中,存在完全相同的属性的配置,则以Profile配置为准
  • 例如:
    请添加图片描述

以上图为例,可以在application.properties中配置spring.profiles.active属性,当取值为dev时,application-dev.properties文件中的配置信息将被应用,当取值为test时,application-test.properties文件中的配置信息将被应用,以此类推。

在开发实践中,类似的配置文件可能较多,可以完全自行测试,例如,可以创建application-dev-jack.propertiesapplication-dev-tom.properties,就可以区分不同的开发人员,当然,激活时,取值仍是自定义名称的部分,例如:spring.profiles.active=dev-jack

9.3. 关于YAML配置

YAML是一种编写配置文件的语法,表现为以.yml作为扩展名的文件。

相比.properties文件,其语法的改变有:

  • 原属性名中有小数点的部分,改为使用冒号+换行后空2格
  • 原属性名与属性值使用等于号分隔,改为使用冒号+1个空格
  • 如果多个配置中,属性名有相同的部分,则不必配置相同的部分,保持对应的空格(缩进)即可

例如,原有的关于数据库连接的配置,使用YAML语法则改为:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mall_pms?characterEncoding=utf-8&useUnicode=true&serverTimezone=Asia/Shanghai
    username: root
    password: root

**注意:**YAML语法要求是严格的,必须按照以上语法规则,例如每次换行后需要添加2个空格,不可以使用TAB制表位取代,属性名与属性值之间,冒号的右侧必须有1个空格。

**注意:**不允许存在完全相同的多行配置(包括缩进),例如不可以同时存在2行spring:

**提示:**在使用IntelliJ IDEA编辑.yml文件时,会自动将按下的TAB转换为2个空格。

**提示:**对于纯数字的属性值,如果此属性的值应该是字符串时,需要使用引号框住整个数字。

**提示:**在Spring Boot项目中,即使没有将属性名中的小数点换成YAML语法应该有的样子,也不会出错!

在Spring框架中,并不直接识别YAML语法的配置,在Spring Boot项目中,基础依赖项(spring-boot-starter)中已经包含解析YAML配置的工具包(snakeyaml),可以直接识别并解析YAML语法的配置文件。

在Spring Boot项目中,对.yml文件的支持,与对.properties文件的是完全相同的,即:你可以将所有.properties文件改成.yml文件,再调整配置文件内部的语法即可。

10. 检测连接数据库的配置是否正确

在项目中原本已经存在的测试类CsmallProductApplicationTests类中,添加以下代码,并执行测试:

@Autowired
DataSource dataSource; // 注意:导java.sql包中的接口

@Test
void getConnection() throws Throwable {
    dataSource.getConnection(); // 调用getConnection()时会连接数据库,则可以判断配置的连接信息是否正确
}

当配置的spring.datasource.url的值的格式有误时,会出现错误:

Caused by: java.lang.IllegalArgumentException: URL must start with 'jdbc'

当配置的spring.datasource.url中的主机名部分有误时,会出现错误:

Caused by: java.net.UnknownHostException: localhast

当配置的spring.datasource.url中的端口号部分有误时,会出现错误:

Caused by: java.net.ConnectException: Connection refused: connect

当配置的spring.datasource.url中的serverTimezone参数值有误时,会出现错误:

Caused by: java.time.zone.ZoneRulesException: Unknown time-zone ID: Asia/ShangHai

当配置的spring.datasource.username的值有误时,会出现错误:

java.sql.SQLException: Access denied for user 'root123'@'localhost' (using password: YES)

当配置的spring.datasource.password的值有误时,会出现错误:

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)

**注意:**关于连接数据库的配置,各属性名是预定义的,如果属性名写错,相当于是没有配置此属性!

**注意:**配置的值,不要有多余的空格,这些空格也会被当作值的一部分!

11. 关于POJO类型的编写规范

在项目中,以定义属性为主,基本上不关心方法的类,都可以称之为POJO类,例如实体类、DTO类等。

所有的POJO类都应该:

  • 【必须】所有属性应该是私有的(访问权限为private
  • 【必须】存在无参数构造方法
  • 【必须】所有属性都有规范名称的Setter & Getter
  • 【必须】类中存在规范的equals()hashCode()
    • 如果2个对象,类型相同,所有属性值都相同,则equals()对比结果应该是true,且hashCode()返回值应该相同
    • 如果2个对象,类型不同,或类型相同但有任何属性值不同,则equals()对比结果应该是false,且hashCode()返回值应该不同
    • 通常,使用开发工具自动生成的equals()hashCode()都是规范的
  • 【必须】类实现了Serializable接口
  • 【建议】类中存在基于所有属性的toString()

许多框架都会默认你的POJO类型是遵循了以上规范的,这些框架在实现某些效果时,会自动调用相关的方法,或将你创建的类型的对象转换成Serializable接口类型,所以,如果你的POJO类型没有遵循这些规范,可能导致某些框架的某些功能不可用,甚至出错!

另外,MySQL中的字段类型与Java中的数据类型的对应关系应该如下:

MySQL中的字段类型Java中的属性类型
tinyint / smallint / intInteger
bigintLong
varchar / char / text系列String
decimalBigDecimal
datetimeLocalDateTime

12. 关于Lombok框架

Lombok框架可以通过特定的注解,在编译期生成Setter、Getter、equals()hashCode()toString()、无参数构造方法、全参数构造方法等。

此框架的依赖项为:

<!-- Lombok的依赖项,主要用于简化POJO类的编写 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
    <scope>provided</scope>
</dependency>

关于使用Lombok时的相关常用注解:

  • @Data:添加在类上,可以在编译期生成全部参数对应的Setter、Getter、equals()hashCode()toString()、无参数构造方法
    • 使用此注解时,要求当前类的父类必须存在无参数构造方法
  • @Setter:添加在类中的属性上,可以生成此属性对应的Setter方法,或添加在类上,可以生成此类中所有属性对应的Setter方法
  • @Getter:用法与作用可参考@Setter注解,此注解的作用是生成Getter方法
  • @EqualsAndHashCode:添加在类上,可以生成基于此类中所有属性的equals()hashCode()方法
  • @ToString:添加在类上,可以生成基于此类中所有属性的toString方法
  • @NoArgsConstructor:添加在类上,可以生成无参数的构造方法
  • @AllArgsConstructor:添加在类上,可以生成全参数的构造方法
  • @Slf4j:参见后文

更多注解,可以自行查阅资料,或在IntelliJ IDEA中查看Lombok插件的详情。

**注意:**需要在IntelliJ IDEA中安装Lombok插件,否则,在编写代码时,不会有相关的提示,并且,即使直接写出代码,也会报错,但是,并不影响运行!安装教程:http://doc.canglaoshi.org/doc/idea_lombok/IDEA-5-PLUGINS-LOMBOK.html

**提示:**Lombok是一个有“侵入性”的框架,当一个团队中有成员使用了此框架,就需要安装Lombok插件,甚至整个团队都需要安装此插件,否则,编码、阅读代码的体验就会较差,所以,某些开发团队中是禁止使用的。

**注意:**需要在IntelliJ IDEA中安装Lombok插件,否则,在编写代码时,不会有相关的提示,并且,即使直接写出代码,也会报错,但是,并不影响运行!安装教程:http://doc.canglaoshi.org/doc/idea_lombok/IDEA-5-PLUGINS-LOMBOK.html

13. 编写实体类

在Spring Boot项目中,推荐将所有的类都创建在项目的根包(创建项目时就已经生成好了的包)之下。

在项目的根包下创建pojo.entity.Album类,在此类中声明与pms_album表对应的属性:

package cn.tedu.csmall.product.pojo.entity;

import lombok.Data;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 相册数据的实体类
 *
 * @author java@tedu.cn
 * @version 0.0.1
 */
@Data
public class Album implements Serializable {

    /**
     * 数据id
     */
    private Long id;
    /**
     * 相册名称
     */
    private String name;
    /**
     * 相册简介
     */
    private String description;
    /**
     * 排序序号
     */
    private Integer sort;
    /**
     * 数据创建时间
     */
    private LocalDateTime gmtCreate;
    /**
     * 数据最后修改时间
     */
    private LocalDateTime gmtModified;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/376199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业工程项目管理系统平台(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…

React(二):jsx事件绑定、条件渲染、列表渲染、jsx的本质、购物车案例

React&#xff08;二&#xff09;一、jsx事件绑定1.this的绑定方式2.jsx中绑定this的三种方式3.事件对象和传参&#xff08;1&#xff09;事件对象怎么传&#xff08;2&#xff09;其他参数怎么传&#xff1f;二、条件渲染1.直接if-else2.三元表达式3.利用逻辑中断4.案例练习5.…

HTML#5表单标签

一. 表单标签介绍表单: 在网页中主要负责数据采集功能,使用<form>标签定义表单表单项: 不同类型的input元素, 下拉列表, 文本域<form> 定义表单<input> 定义表单项,通过typr属性控制输入形式<label> 为表单项定义标注<select> 定义下拉列表<o…

【GO】31.grpc 客户端负载均衡源码分析

这篇文章是记录自己查看客户端grpc负载均衡源码的过程&#xff0c;并没有太详细的讲解&#xff0c;参考价值不大&#xff0c;可以直接跳过&#xff0c;主要给自己看的。一.主要接口&#xff1a;Balancer Resolver1.Balancer定义Resolver定义具体位置为1.grpc源码对解析器(resol…

异步通知实验

目录 一、异步通知简介 阻塞、非阻塞、异步通知区别 信号与信号修改测试 测试 二、驱动编写 1、定义fasync_struct 结构体指针变量 2、操作集添加fasync 3、实现imx6uirq_fasync 函数 4、关闭驱动文件操作 ​编辑 5、定时器处理函数 三、编写APP 1、编写信号的处理…

ElasticSearch 学习笔记总结(二)

文章目录一、ES JavaAPI 环境准备二、ES JavaAPI 索引1. 索引 创建2. 索引 查找3. 索引 删除三、ES JavaAPI 文档1. 文档 创建2. 文档 修改3. 文档 查询4. 文档 删除4. 文档 批量新增 和 批量删除5. 高级查询 索引全量查询6. 高级查询四、ES 集群1. ES集群 概念2. window 集群搭…

阿里P8:做测试10年我的一些经验分享,希望你们少走弯路

我是在2015年毕业的&#xff0c;当时是读的普通本科&#xff0c;不上不下的专业水平&#xff0c;毕业的时候&#xff0c;恰好遇到了金融危机。校园招聘里阴差阳错的巧合&#xff0c;让我走上了软件测试工程师的道路。 入职第一天&#xff0c;来了个高大上的讲师&#xff0c;记…

如何使用码匠连接 PostgreSQL

目录 在码匠中集成 PostgreSQL 在码匠中使用 PostgreSQL 关于码匠 PostgreSQL 是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;它具有许多强大的功能&#xff0c;PostgreSQL 支持大部分的 SQL 标准并且提供了很多其他现…

一些无线通信系统模型的概念

一些无线通信系统模型的概念 扩频通信,指的是系统的带宽WWW远大于其信息传输速率R(bits/s)R(bits/s)R(bits/s), 定义展频带因子BeWRB_e \frac{W}{R}Be​RW​, 易知在扩频通信系统中,BeB_eBe​远大于1. 在频率上产生如此大的冗余度,主要是为了减轻无线通信或卫星通信中经常产生…

关于算法学习和刷题的建议

大家好&#xff0c;我是方圆。最近花时间学了学算法&#xff0c;应该算是我接触Java以来第一次真正的学习它&#xff0c;这篇帖子我会说一些我对算法学习的理解&#xff0c;当然这仅仅是浅浅的入算法的门&#xff0c;如果想深挖或者是有基础的人想提升自己&#xff0c;我觉得这…

【Linux】内核同步机制之等待队列和完成量

文章目录完成量和等待队列1. 等待队列1.1 基本元素1.2 等待队列的创建和初始化1.3 等待队列元素的创建和初始化1.4 添加和移除等待队列元素到等待队列2. 等待事件机制3. 等待队列唤醒4. 总结4.1 等待事件方式4.2 手动休眠方式4.3 借助内核封装函数&#xff0c;进行手动休眠5. 完…

前端开发_快应用开发

目录快应用官网真机调试组件组件嵌套问题tab组件list组件web组件css 样式问题[1]选择器[2]盒模型[3]样式布局-弹性布局[4-1]样式切换 - 类名的动态切换[4-2] 样式切换 - 行内样式动态切换[5]background[6]overflow[7]border-radius[8]盒子阴影[9] 单位系统接口[1] 检查某app是否…

机房运维6大隐患,你中了几个?

随着医院的看诊预约、缴费、打印报告等众多业务转至线上进行&#xff0c;对医院的网络及数据处理能力提出越来越高的要求&#xff0c;那么&#xff0c;机房的稳定、安全运行是医院网络信息系统的关键因素。 机房运维6大隐患 01.电源电力系统不稳定&#xff0c;网络设备运转遭到…

华为面试题就这?00后卷王直接拿下30k华为offer......

先说一下我的情况&#xff0c;某211本计算机&#xff0c;之前在深圳那边做了大约半年多少儿编程老师&#xff0c;之后内部平调回长沙这边&#xff0c;回来之后发现有点难&#xff0c;这边可能是业绩难做&#xff0c;虚假承诺很厉害&#xff0c;要给那些家长虚假承诺去骗人家&am…

红日(vulnstack)1 内网渗透ATTCK实战

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;sx22 攻击机系统&#xff1a;kali linux 2022.03 网络配置&#xff1a; win7配置&#xff1a; kali配置&#xff1a; kali 192.168.1.108 192.168.111.129 桥接一块&#xff0c;自定义网卡4 win7 1…

一文读懂云渲染“串流”全链路时延及优化策略

​这是一个让云游戏完美起步的时代。 云游戏作为产业内近年来炙手可热的话题&#xff0c;具有“云端运行、超高清、零延时、即点即玩”等众多特性。 随着 5G 时代的到来&#xff0c;以及中心云能力下沉至边缘云&#xff0c;高带宽、低延迟、高性能这些特性与云游戏紧密结合&a…

FastDDS-2.库概览

2. 库概览 Fast DDS&#xff08;前身为Fast RTPS&#xff09;是DDS规范的高效高性能实现&#xff0c;DDS规范是一种用于分布式应用软件的以数据为中心的通信中间件&#xff08;DCPS&#xff09;。本节回顾Fast DDS的体系结构、操作和关键特性。 2.1 架构 Fast DDS的架构如下图…

07_MySQL的单行函数

1. 函数的理解1.1 什么是函数函数在计算机语言的使用中贯穿始终&#xff0c;函数的作用是什么呢&#xff1f;它可以把我们经常使用的代码封装起来&#xff0c;需要的时候直接调用即可。这样既提高了代码效率 &#xff0c;又提高了可维护性 。在 SQL 中我们也可以使用函数对检索…

python之wheel 包命名规则、abi 兼容和安装

一、windows安装python包&#xff0c;遇见的问题 1、python3以后的版本&#xff0c;安装python包&#xff0c;可以直接使用pip安装&#xff0c;但是安装时偶尔报错 2、安装python源码包&#xff0c;如何确定自己该安装哪个版本&#xff0c;一看就晕倒~~~&#xff08;没人扶&…

PMP新考纲考试难不难,通过率怎样?

PMP考试难不难&#xff0c;还是因人而异的&#xff0c;对小白而言&#xff0c;肯定是难的&#xff0c;对项目管理老人而言&#xff0c;难度肯定是没那么高。 据考过的朋友讲&#xff0c;新考纲是有点难度的&#xff0c;尤其是最开始6月25日的考试&#xff0c;2023年就简单些了…