Все еще создаете проект с нуля? Строительные леса ручной работы для быстрого развития!

Spring Boot Java
Все еще создаете проект с нуля? Строительные леса ручной работы для быстрого развития!

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

Резюме

Скелет проекта с открытым исходным кодом доmall-tiny, полностью унаследованоmallВесь стек технологий проекта. всегда чувствоватьmall-tinyСлишком много промежуточного ПО интегрировано, и оно слишком сложное. На этот раз его упростили и модернизировали, превратив в платформу для быстрой разработки с полными функциями управления правами.Надеюсь, это будет полезно всем!

Введение

mall-tinyЭто платформа для быстрой разработки, основанная на SpringBoot+MyBatis-Plus, с полными функциями управления разрешениями, которые можно подключить к внешнему интерфейсу Vue прямо из коробки.

Демонстрация проекта

mall-tinyПроекты могут быть легко связаныmall-admin-webИнтерфейсные проекты, меняйте систему управления правами за считанные секунды. Адрес фронтенд проекта:GitHub.com/macro-positive/…

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

Технологии Версия инструкция
SpringBoot 2.3.0 Контейнер + MVC-фреймворк
SpringSecurity 5.3.2 Платформа аутентификации и авторизации
MyBatis 3.5.4 структура ORM
MyBatis-Plus 3.3.2 Инструмент улучшения MyBatis
MyBatis-Plus Generator 3.3.2 Генератор кода уровня данных
Swagger-UI 2.9.2 инструмент для производства документов
Redis 5.0 Распределенный кеш
Docker 18.09.0 Механизм контейнера приложений
Druid 1.1.10 пул соединений с базой данных
JWT 0.9.0 Поддержка входа в JWT
Lombok 1.18.12 Упрощенный инструмент инкапсуляции объектов

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

  • Упростите сложность и сохраните только 9 таблиц, связанных с функцией управления полномочиями, что удобно для бесплатной настройки;

  • Адрес исходного файла базы данных:GitHub.com/macro-positive/…

руководство

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

Упростите зависимые службы, просто установите наиболее часто используемые службы MySql и Redis, обратитесь к установке конкретной службы."Развертывание торгового центра в среде Windows", базу данных необходимо импортироватьmall_tiny.sqlсценарий.

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

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

src
├── common -- 用于存放通用代码
|   ├── api -- 通用结果集封装类
|   ├── config -- 通用配置类
|   ├── domain -- 通用封装对象
|   ├── exception -- 全局异常处理相关类
|   └── service -- 通用业务类
├── config -- SpringBoot中的Java配置
├── domain -- 共用封装对象
├── generator -- MyBatis-Plus代码生成器
├── modules -- 存放业务代码的基础包
|   └── ums -- 权限管理模块业务代码
|       ├── controller -- 该模块相关接口
|       ├── dto -- 该模块数据传输封装对象
|       ├── mapper -- 该模块相关Mapper接口
|       ├── model -- 该模块相关实体类
|       └── service -- 该模块相关业务处理类
└── security -- SpringSecurity认证授权相关代码
    ├── annotation -- 相关注解
    ├── aspect -- 相关切面
    ├── component -- 认证授权相关组件
    ├── config -- 相关配置
    └── util -- 相关工具类

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

resources
├── mapper -- MyBatis中mapper.xml存放位置
├── application.yml -- SpringBoot通用配置文件
├── application-dev.yml -- SpringBoot开发环境配置文件
├── application-prod.yml -- SpringBoot生产环境配置文件
└── generator.properties -- MyBatis-Plus代码生成器配置

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

  • Создать запись в таблице: POST /{имя маршрута контроллера}/create

  • Изменить запись таблицы: POST /{имя маршрута контроллера}/update/{id}

  • Удалить указанную запись таблицы: POST /{имя маршрута контроллера}/delete/{id}

  • Записи таблицы запросов пейджинга: GET /{имя маршрута контроллера}/list

  • Получить указанные данные записи: GET /{имя маршрута контроллера}/{id}

  • Для определения конкретных параметров и возврата результатов вы можете запустить код для просмотра документации API Swagger-UI:http://localhost:8080/swagger-ui.html

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

Запустите класс запуска напрямуюMallTinyApplicationизmainфункция.

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

Создать бизнес-таблицу

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

Использовать генератор кода

бегатьMyBatisPlusGeneratorОсновной метод класса используется для генерации кода, а код контроллера, сервиса, маппера, модели, маппер.xml может быть сгенерирован напрямую без ручного создания.

  • Генератор кода поддерживает два режима: один генерирует код для одной таблицы, например только генерироватьpms_brandКод таблицы может быть введен первымpms, затем введитеpms_brand;

  • Сгенерировать список структуры кода;

  • Другой код, непосредственно генерирующий весь модуль, например, генерирующийpmsКод модуля можно ввести первымpms, затем введитеpms_*.

Напишите бизнес-код

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

Поскольку расширенные функции, предоставляемые MyBatis-Plus, достаточно мощные, запрос к одной таблице почти не требует рукописного SQL, а методы, предоставляемые в ServiceImpl и BaseMapper, можно использовать напрямую.

Например, наш класс бизнес-реализации по управлению менюUmsMenuServiceImplМетоды во всех используют эти методы напрямую.

/**
 * 后台菜单管理Service实现类
 * Created by macro on 2020/2/2.
 */
@Service
public class UmsMenuServiceImpl extends ServiceImpl<UmsMenuMapper,UmsMenu>implements UmsMenuService {

    @Override
    public boolean create(UmsMenu umsMenu) {
        umsMenu.setCreateTime(new Date());
        updateLevel(umsMenu);
        return save(umsMenu);
    }

    @Override
    public boolean update(Long id, UmsMenu umsMenu) {
        umsMenu.setId(id);
        updateLevel(umsMenu);
        return updateById(umsMenu);
    }

    @Override
    public Page<UmsMenu> list(Long parentId, Integer pageSize, Integer pageNum) {
        Page<UmsMenu> page = new Page<>(pageNum,pageSize);
        QueryWrapper<UmsMenu> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(UmsMenu::getParentId,parentId)
                .orderByDesc(UmsMenu::getSort);
        return page(page,wrapper);
    }

    @Override
    public List<UmsMenuNode> treeList() {
        List<UmsMenu> menuList = list();
        List<UmsMenuNode> result = menuList.stream()
                .filter(menu -> menu.getParentId().equals(0L))
                .map(menu -> covertMenuNode(menu, menuList)).collect(Collectors.toList());
        return result;
    }

    @Override
    public boolean updateHidden(Long id, Integer hidden) {
        UmsMenu umsMenu = new UmsMenu();
        umsMenu.setId(id);
        umsMenu.setHidden(hidden);
        return updateById(umsMenu);
    }
}
Пейджинговый запрос

Для встроенной поддержки запросов на подкачку MyBatis-Plus вам не нужно интегрировать другие подключаемые модули, напрямую создавать объект Page, а затем вызывать метод страницы в ServiceImpl.

/**
 * 后台菜单管理Service实现类
 * Created by macro on 2020/2/2.
 */
@Service
public class UmsMenuServiceImpl extends ServiceImpl<UmsMenuMapper,UmsMenu>implements UmsMenuService {
    @Override
    public Page<UmsMenu> list(Long parentId, Integer pageSize, Integer pageNum) {
        Page<UmsMenu> page = new Page<>(pageNum,pageSize);
        QueryWrapper<UmsMenu> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(UmsMenu::getParentId,parentId)
                .orderByDesc(UmsMenu::getSort);
        return page(page,wrapper);
    }
}
Многотабличный запрос

Для запроса с несколькими таблицами нам нужно написать реализацию SQL в mapper.xml, Поскольку мы создали файл mapper.xml ранее, мы можем напрямую определить метод в интерфейсе Mapper, а затем записать реализацию SQL в mapper.xml. .

  • Например, нам нужно написать метод для получения назначенного меню на основе идентификатора пользователя.UmsMenuMapperдобавлено в интерфейсgetMenuListметод;
/**
 * <p>
 * 后台菜单表 Mapper 接口
 * </p>
 *
 * @author macro
 * @since 2020-08-21
 */
public interface UmsMenuMapper extends BaseMapper<UmsMenu> {

    /**
     * 根据后台用户ID获取菜单
     */
    List<UmsMenu> getMenuList(@Param("adminId") Long adminId);

}
  • затем вUmsMenuMapper.xmlПросто добавьте соответствующую SQL-реализацию метода.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.macro.mall.tiny.modules.ums.mapper.UmsMenuMapper">

    <select id="getMenuList" resultType="com.macro.mall.tiny.modules.ums.model.UmsMenu">
        SELECT
            m.id id,
            m.parent_id parentId,
            m.create_time createTime,
            m.title title,
            m.level level,
            m.sort sort,
            m.name name,
            m.icon icon,
            m.hidden hidden
        FROM
            ums_admin_role_relation arr
                LEFT JOIN ums_role r ON arr.role_id = r.id
                LEFT JOIN ums_role_menu_relation rmr ON r.id = rmr.role_id
                LEFT JOIN ums_menu m ON rmr.menu_id = m.id
        WHERE
            arr.admin_id = #{adminId}
          AND m.id IS NOT NULL
        GROUP BY
            m.id
    </select>
    
</mapper>

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

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

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

Связанные с SpringSecurity

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

  • Получите доступ к документации по интерфейсу Swagger-UI:http://localhost:8080/swagger-ui.html

  • Вызовите интерфейс входа, чтобы получить токен;

  • Нажмите кнопку «Авторизовать» в правом верхнем углу, чтобы ввести токен, а затем получить доступ к соответствующему интерфейсу.

Запросить проверку параметра

интегрировано по умолчаниюJakarta Bean ValidationСтруктура проверки параметров, просто добавьте в свойство объекта параметраjavax.validation.constraintsАннотации в пакете могут реализовать функцию проверки, здесь в качестве примера используется проверка параметров входа.

  • Сначала добавьте в параметры запроса на вход@NotEmptyаннотация;
/**
 * 用户登录参数
 * Created by macro on 2018/4/26.
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class UmsAdminLoginParam {
    @NotEmpty
    @ApiModelProperty(value = "用户名",required = true)
    private String username;
    @NotEmpty
    @ApiModelProperty(value = "密码",required = true)
    private String password;
}
  • Затем добавьте в интерфейс входа@ValidatedОбратите внимание, что функцию проверки параметров можно включить.
/**
 * 后台用户管理
 * Created by macro on 2018/4/26.
 */
@Controller
@Api(tags = "UmsAdminController", description = "后台用户管理")
@RequestMapping("/admin")
public class UmsAdminController {

    @ApiOperation(value = "登录以后返回token")
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ResponseBody
    public CommonResult login(@Validated @RequestBody UmsAdminLoginParam umsAdminLoginParam) {
        String token = adminService.login(umsAdminLoginParam.getUsername(), umsAdminLoginParam.getPassword());
        if (token == null) {
            return CommonResult.validateFailed("用户名或密码错误");
        }
        Map<String, String> tokenMap = new HashMap<>();
        tokenMap.put("token", token);
        tokenMap.put("tokenHead", tokenHead);
        return CommonResult.success(tokenMap);
    }
}

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

Открытый исходный код — это непросто, нажмите, если считаете, что проект полезенStarПоддержите это!

GitHub.com/macro-positive/…