mall-tiny: скелет проекта с одним приложением на основе SpringBoot+MyBatis.

Spring Boot

Адрес фактического проекта электронной коммерции SpringBoot (18k+star):GitHub.com/macro-positive/…

Резюме

mall-tiny — это скелет проекта, извлеченный из проекта торгового центра, который сохраняет весь технологический стек проекта торгового центра и упрощает бизнес-логику, сохраняются только разрешения и таблица основных продуктов, что удобно для разработки и использования. бизнес-логика может быть свободно настроена.

Технический отбор

Технология Версия иллюстрировать
SpringBoot 2.1.3 Контейнер + MVC-фреймворк
SpringSecurity 5.1.4 Платформа аутентификации и авторизации
MyBatis 3.4.6 структура ORM
MyBatisGenerator 1.3.3 Генерация кода уровня данных
PageHelper 5.1.8 Плагин физического пейджинга MyBatis
Swagger-UI 2.7.0 инструмент для производства документов
Elasticsearch 6.2.2 поисковый движок
RabbitMq 3.7.14 очередь сообщений
Redis 3.2 Распределенный кеш
MongoDb 3.2 База данных NoSql
Docker 18.09.0 Механизм контейнера приложений
Druid 1.1.10 пул соединений с базой данных
OSS 2.5.0 хранилище объектов
JWT 0.9.0 Поддержка входа в JWT
Lombok 1.18.6 Упрощенный инструмент инкапсуляции объектов

структура таблицы базы данных

展示图片

  • Зарезервированы только основные таблицы, связанные с товарами и разрешениями, всего 12 таблиц, а бизнес-логика проста;
  • Адрес исходного файла базы данных:GitHub.com/macro-positive/…

руководство

Строительство окружающей среды

Запуск этого проекта должен полагаться на такие службы, как MySql, Elasticsearch, Redis, MongoDb, RabbitMq и т. д. Для установки зависимых служб см.Развертывание торгового центра в среде Windows, сценарий mall_tiny.sql необходимо импортировать в базу данных.

протокол разработки

структура пакета проекта

src
├── common -- 用于存储通用代码及工具类
|   ├── api -- 通用结果集封装类
|   └── utils -- 工具类
├── component -- 项目中定义的各类组件
├── config -- SpringBoot中的Java配置
├── controller -- 控制器层代码
├── dao -- 数据访问层代码,存放我们自定义查询的dao接口,以xxxDao命名
├── dto -- 数据传输对象封装
├── mbg -- MyBatisGenerator生成器相关代码
|   ├── mapper -- MyBatisGenerator自动生成的mapper接口(请勿改动)
|   └── model -- MyBatisGenerator自动生成的实体类及Example对象(请勿改动)
├── nosql -- nosql数据库操作相关类
|   ├── elasticsearch -- elasticsearch数据操作相关类
|   |   ├── document -- elasticsearch中存储文档对象封装
|   |   └── repository -- elasticsearch数据操作类
|   └── mongodb -- mongodb数据操作相关类
|       ├── document -- mongodb中存储文档对象封装
|       └── repository -- mongodb数据操作类
└── service -- 业务层接口代码
    └── impl -- 业务层接口实现类代码

Описание файла ресурсов

res
├── com.macro.mall.tiny.mbg.mapper -- mbg自动生成的mapper.xml文件(请勿改动)
├── mapper -- 自定义的mapper.xml文件,对应dao包中的查询接口,以xxxDao.xml命名
├── application.yml -- SpringBoot的配置文件
├── generator.properties -- 用于配置MyBatisGenerator生成代码时的数据源信息
├── generatorConfig.xml -- MyBatisGenerator生成代码规则配置
└── logback-spring.xml -- 整合ELK实现日志收集时使用的配置

Правила определения интерфейса

  • Создать запись в таблице: POST /{имя маршрута контроллера}/create
  • Изменить запись таблицы: POST /{имя маршрута контроллера}/update/{id}
  • Удалить указанную запись таблицы: POST /{имя маршрута контроллера}/delete/{id}
  • Записи таблицы запросов пейджинга: GET /{имя маршрута контроллера}/list
  • Получить указанные данные записи: GET /{имя маршрута контроллера}/{id}

Для определения конкретных параметров и возврата результатов вы можете запустить код для просмотра документации API Swagger-UI:

展示图片

Запуск проекта

После установки соответствующих зависимостей вы можете напрямую запустить основную функцию класса com.macro.mall.tiny.MallTinyApplication.

Процесс разработки бизнес-кода

Здесь мы возьмем функцию управления брендом в качестве примера, чтобы проиллюстрировать процесс разработки бизнес-кода.

создать таблицу

Для создания таблицы pms_brand следует учесть, что комментарии к полям таблицы должны быть прописаны, чтобы при генерации кода в классе сущностей были комментарии, а также были комментарии в документах, сгенерированных Swagger-UI , так что нет необходимости их повторять Пишите заметки.

CREATE TABLE `pms_brand` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) DEFAULT NULL,
  `first_letter` varchar(8) DEFAULT NULL COMMENT '首字母',
  `sort` int(11) DEFAULT NULL,
  `factory_status` int(1) DEFAULT NULL COMMENT '是否为品牌制造商:0->不是;1->是',
  `show_status` int(1) DEFAULT NULL,
  `product_count` int(11) DEFAULT NULL COMMENT '产品数量',
  `product_comment_count` int(11) DEFAULT NULL COMMENT '产品评论数量',
  `logo` varchar(255) DEFAULT NULL COMMENT '品牌logo',
  `big_pic` varchar(255) DEFAULT NULL COMMENT '专区大图',
  `brand_story` text COMMENT '品牌故事',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8 COMMENT='品牌表';

Сгенерируйте код с помощью MyBatisGenerator

Запустите метод main класса com.macro.mall.tiny.mbg.Generator для генерации кода.После генерации будут следующие файлы.

Интерфейс PmsBrandMapper

Содержит общие интерфейсы для однотабличных запросов.

public interface PmsBrandMapper {
    long countByExample(PmsBrandExample example);

    int deleteByExample(PmsBrandExample example);

    int deleteByPrimaryKey(Long id);

    int insert(PmsBrand record);

    int insertSelective(PmsBrand record);

    List<PmsBrand> selectByExampleWithBLOBs(PmsBrandExample example);

    List<PmsBrand> selectByExample(PmsBrandExample example);

    PmsBrand selectByPrimaryKey(Long id);

    int updateByExampleSelective(@Param("record") PmsBrand record, @Param("example") PmsBrandExample example);

    int updateByExampleWithBLOBs(@Param("record") PmsBrand record, @Param("example") PmsBrandExample example);

    int updateByExample(@Param("record") PmsBrand record, @Param("example") PmsBrandExample example);

    int updateByPrimaryKeySelective(PmsBrand record);

    int updateByPrimaryKeyWithBLOBs(PmsBrand record);

    int updateByPrimaryKey(PmsBrand record);
}
Класс сущности PmsBrand

Аннотации Swagger-UI были добавлены в класс сущностей, сгенерированный из таблицы базы данных.

package com.macro.mall.tiny.mbg.model;

import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;

public class PmsBrand implements Serializable {
    private Long id;

    private String name;

    @ApiModelProperty(value = "首字母")
    private String firstLetter;

    private Integer sort;

    @ApiModelProperty(value = "是否为品牌制造商:0->不是;1->是")
    private Integer factoryStatus;

    private Integer showStatus;

    @ApiModelProperty(value = "产品数量")
    private Integer productCount;

    @ApiModelProperty(value = "产品评论数量")
    private Integer productCommentCount;

    @ApiModelProperty(value = "品牌logo")
    private String logo;

    @ApiModelProperty(value = "专区大图")
    private String bigPic;

    @ApiModelProperty(value = "品牌故事")
    private String brandStory;

    private static final long serialVersionUID = 1L;
    //省略getter、setter、toString方法
}
Построитель запросов PmsBrandExample

Используется для построения условий запроса в сложных запросах.

Файл PmsBrandMapper.xml

В соответствии с реализацией mapper.xml в интерфейсе PmsBrandMapper, конкретная реализация запроса методов в интерфейсе PmsBrandMapper находится здесь.

Напишите код уровня доступа к данным

Запрос одной таблицы

Для запросов к одной таблице рекомендуется использовать построитель запросов для выполнения запросов без написания операторов SQL вручную, например следующий нечеткий запрос по названию торговой марки.

@Override
public List<PmsBrand> list(int pageNum, int pageSize, String name) {
    PageHelper.startPage(pageNum, pageSize);
    PmsBrandExample example = new PmsBrandExample();
    if(StrUtil.isNotEmpty(name)){
        example.createCriteria().andNameLike("%"+name+"%");
    }
    return brandMapper.selectByExample(example);
}
Пейджинговый запрос

Запрос на подкачку реализуется с помощью подключаемого модуля подкачки PageHelper, просто добавьте следующий код перед оператором запроса.

 PageHelper.startPage(pageNum, pageSize);
Многотабличный запрос

Для многотабличного запроса вам необходимо написать интерфейс картографа и реализацию mapper.xml самостоятельно, что соответствует использованию в MyBatis.Вот пример запроса продуктов, содержащих атрибуты.

  • Прежде всего, вам нужно настроить интерфейс Dao.Чтобы отличить его от интерфейса картографа, созданного mbg, пользовательский интерфейс картографа в mall-tiny называется xxxDao.
public interface EsProductDao {
    List<EsProduct> getAllEsProductList(@Param("id") Long id);
}
  • Затем напишите реализацию XML-запроса интерфейса с именем xxxDao.xml в mall-tiny.
<select id="getAllEsProductList" resultMap="esProductListMap">
    select
        p.id id,
        p.product_sn productSn,
        p.brand_id brandId,
        p.brand_name brandName,
        p.product_category_id productCategoryId,
        p.product_category_name productCategoryName,
        p.pic pic,
        p.name name,
        p.sub_title subTitle,
        p.price price,
        p.sale sale,
        p.new_status newStatus,
        p.recommand_status recommandStatus,
        p.stock stock,
        p.promotion_type promotionType,
        p.keywords keywords,
        p.sort sort,
        pav.id attr_id,
        pav.value attr_value,
        pav.product_attribute_id attr_product_attribute_id,
        pa.type attr_type,
        pa.name attr_name
    from pms_product p
    left join pms_product_attribute_value pav on p.id = pav.product_id
    left join pms_product_attribute pa on pav.product_attribute_id= pa.id
    where delete_status = 0 and publish_status = 1
    <if test="id!=null">
        and p.id=#{id}
    </if>
</select>

Написать код бизнес-уровня

  • Сначала добавьте интерфейс PmsBrandService в пакет com.macro.mall.tiny.service;
  • Затем добавьте его класс реализации в com.macro.mall.tiny.serviceImpl.

Написать код слоя контроллера

Добавьте класс PmsBrandController в пакет com.macro.mall.tiny.controller.

Развертывание проекта

В mall-tiny интегрирован подключаемый модуль Docker, который можно упаковать в образ Docker и развернуть с помощью Docker.Создавайте образы Docker для приложений SpringBoot с помощью подключаемого модуля Maven.

другие инструкции

Связанные с SpringSecurity

Поскольку Spring Security используется для реализации аутентификации и авторизации, для доступа к некоторым интерфейсам необходимо войти в систему.Процесс доступа к интерфейсу входа в систему выглядит следующим образом.

  • Получите доступ к документации по интерфейсу Swagger-UI:http://localhost:8080/swagger-ui.html
  • Вызовите интерфейс входа, чтобы получить токен:
    展示图片
    展示图片
    展示图片
  • Нажмите кнопку Authorize в правом верхнем углу, чтобы ввести настоящий токен:
    展示图片

О сборе журналов

Этот проект использует АОП для записи всех журналов доступа к интерфейсу и интегрирует ELK для реализации сбора журналов. Для построения среды сбора журналов ELK см.:Приложение SpringBoot интегрирует ELK для сбора журналов.

oss файл, связанный с загрузкой

При использовании загрузки файла oss вам необходимо изменить его в соответствии с вашей собственной конфигурацией. Вам необходимо изменить конфигурацию следующим образом:

# OSS相关配置信息
aliyun:
  oss:
    endpoint: oss-cn-shenzhen.aliyuncs.com # oss对外服务的访问域名
    accessKeyId: test # 访问身份验证中用到用户标识
    accessKeySecret: test # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
    bucketName: macro-oss # oss的存储空间
    policy:
      expire: 300 # 签名有效期(S)
    maxSize: 10 # 上传文件大小(M)
    callback: http://localhost:8080/aliyun/oss/callback # 文件上传成功后的回调地址(必须公网可以访问)
    dir:
      prefix: mall/images/ # 上传文件夹路径前缀

О междоменных проблемах

Глобальный фильтр был настроен для обеспечения трансграничного доступа, а Spring Security также разрешает междоменные предварительные запросы OPTIONS.

/**
 * 全局跨域配置
 * Created by macro on 2019/7/27.
 */
@Configuration
public class GlobalCorsConfig {

    /**
     * 允许跨域调用的过滤器
     */
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        //允许所有域名进行跨域调用
        config.addAllowedOrigin("*");
        //允许跨越发送cookie
        config.setAllowCredentials(true);
        //放行全部原始头信息
        config.addAllowedHeader("*");
        //允许所有请求方法跨域调用
        config.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}
//SecurityConfig的configure方法中已经添加
.antMatchers(HttpMethod.OPTIONS)//跨域请求会先进行一次options请求
.permitAll()

Адрес исходного кода проекта

GitHub.com/macro-positive/…

Нет публики

проект торгового центраПолный набор учебных пособий сериализуется,Обратите внимание на публичный аккаунтПолучите это прямо сейчас.

公众号图片