Адрес фактического центра электронной коммерции 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
Поддержите это!