1. Введение в проект
предыдущий постКурьерская система запросов, разработанная вручную, прочитала более 1,8 Вт.Я поделилась проектом своего самодельного экспресс-заказа самообслуживания. На этой неделе я хочу оптимизировать этот экспресс-запрос. Разработайте фоновую систему управления контентом для унифицированного управления экспресс-информацией в фоновом режиме. Искал 2 часа, чтобы найти более подходящий проект системы управления контентом водопадаpb-cms
. Этот проект подходит для создания блогов и корпоративных сайтов, а фоном является управление контентом. Ключевым моментом является то, что автор говорит, что проект все время обновляется. Затем начните строить локально.
2. Создание среды разработки
2.1 Стек технологий
- SpringBoot: среда микросервисов, упрощающая первоначальную настройку и разработку приложений Spring.
- Apache Shiro: мощная и простая в использовании среда безопасности Java для аутентификации, авторизации, шифрования и управления сеансами.
- Mybatis Plus: Инструмент улучшения для MyBatis, основанный на MyBatis, вносятся только улучшения без изменений.Он создан для упрощения разработки и повышения эффективности.
- Thymeleaf: механизм шаблонов XML/XHTML/HTML5, который можно использовать для преобразования файлов шаблонов для отображения данных и текста, созданных вашим приложением.
2.2 Развертывание
Скачать проект
git clone https://gitee.com/LinZhaoguan/pb-cms.git
Изменить файл конфигурации
Файл конфигурации находится в корневом каталоге проекта.resources
Основные файлы конфигурации следующие:
application-dev.yml #dev(开发版)配置文件
application-prd.yml #prd(生产版)配置文件
application.yml #主配置文件
logback-spring.xml #日志配置文件
Измените его здесьapplication-dev.yml
, содержание следующее:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/pb-cms-base?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username: root
password: 123456
redis:
host: 127.0.0.1
port: 6379
password: 123456
timeout: 5000
jedis:
pool:
max-idle: 8
min-idle: 0
max-active: 8
max-wait: -1
server:
servlet:
context-path:/cms
Обратите внимание, чтобы изменитьmysql
база данныхurl
(Ссылка на сайт),username
(имя пользователя),password
(и пароль). немного отредактироватьredis
изhost
(адрес сервера),port
(порт),password
(пароль), если он один и тот же, его не нужно менять.
скрипт импорта базы данных
Используйте инструменты визуализации базы данныхNavicat
инструмент, сначала создайте базу данныхpb-cms-base
,Как показано ниже:
Затем импортируйте сценарий базы данных, файл сценария базы данных находится вdocs\db\pb_cms_base.sql
, данные импортируются, как показано ниже:
запустить проект
Открытымcom.puboot.SpringbootApplication
,бегатьmain
Метод может быть:
Debug
режим активирован. Конечно, если ваш проект был разработан и вы хотите развернуть его для использования другими, вы можете упаковать проект какjar
пакет для независимой работы.
java -jar pb-cms.jar #本地jar包运行
nohup java -jar pb-cms.jar > pb-cms.log & #linux服务器运行
Эффект запуска внешнего интерфейса проекта:
Эффект запуска бэкэнда проекта:Примечание: мойidea
темаMaterial Theme UI
.
3. Импортировать функцию Excel
конфигурация pom.xml
представлен здесьhutools
Tool, так как он инкапсулирует множество классов инструментов, вы можете использовать его напрямую. проектpom.xml
Добавьте следующие зависимости:
<!-- hutools-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.12.0</version>
</dependency>
Инструменты ExcelUtils
Создайте класс инструмента, код выглядит следующим образом
/**
* @author wangzg
* @date 2020/4/13
*/
public class ExcelUtils {
/**
* 获取第一个sheet页的内容
* @param inputStream
* @return
*/
public static List<KuaiDi> getKuaiDiList(InputStream inputStream) {
List<KuaiDi> kuaiDiList = new ArrayList<>();
if(Objects.nonNull(inputStream)){
ExcelReader excelReader = ExcelUtil.getReader(inputStream);
//表头添加别名,主要是将中文名转为数据库对应的字段
excelReader.addHeaderAlias("快递单号","kuaidiNo");
excelReader.addHeaderAlias("用户名","userName");
excelReader.addHeaderAlias("电话","phone");
excelReader.addHeaderAlias("快递公司","company");
List<Map<String, Object>> rowList = excelReader.readAll();
if(CollectionUtil.isNotEmpty(rowList)){
rowList.stream().forEach(r->{
KuaiDi kuaiDi = new KuaiDi();
try {
populate(kuaiDi,r);
kuaiDi.setCreateTime(new Date());
kuaiDiList.add(kuaiDi);
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
return kuaiDiList;
}
public static void main(String[] args) {
List<KuaiDi> kuaiDiList = getKuaiDiList(ResourceUtil.getStream("D:\\快递.xls"));
kuaiDiList.stream().forEach(System.out::println);
}
}
сервисный звонок
service
Слой относительно прост, загрузите загруженныйmultipartFile
файловый объект, который передает входные данные вExcelUtils.getKuaiDiList
, вы можете вернуть коллекцию объектовkuaiDiList
, код показан ниже:
@Override
public void importData(MultipartFile multipartFile) throws Exception {
List<KuaiDi> kuaiDiList = ExcelUtils.getKuaiDiList(multipartFile.getInputStream());
if(CollectionUtil.isNotEmpty(kuaiDiList)){
//批量插入
this.saveBatch(kuaiDiList);
}
}
4. Часто задаваемые вопросы
3.1 Интеграция проектаMybatis
Можно ли не указыватьtype-aliases-package
Атрибуты?
Ответ положительный. Почему ты говоришь об этом один? Потому что я обнаружил, что в файле конфигурации файла конфигурации отчета проекта настроено следующее содержимое:
mybatis-plus:
global-config:
db-config:
id-type: auto
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.puboot.model
com.puboot.model
Нет элемента пути к пакету, не так ли?type-aliases-package
Поддерживает нечеткое сопоставление? Никогда не думал об авторской опечатке. Наконец протестировано локально и провереноMybitas Plus
, окончательное объяснение таково:
typeAliasesPackage: Путь сканирования пакета псевдонимов MyBaits, через который вы можете зарегистрировать псевдонимы для классов в пакете.После регистрации вы можете использовать имя класса непосредственно в файле XML, соответствующем Mapper, вместо использования полного имени класса (то есть, когда вызов в XML Не включайте имя пакета. Прочитав часть исходного кода, я также нашел небольшую точку знаний:
type-aliases-package
определяется для поддержки псевдонимов для нескольких пакетов.
/**
* Packages to search type aliases. (Package delimiters are ",; \t\n")
*/
private String typeAliasesPackage;
3.2 В чем разница между @RestController и @Controller?
Поскольку этот проект объединяетspring-boot-starter-thymeleaf
, в состоянии пройтиthymeleaf
Разработайте нашу главную страницу. научилсяStruts2
Синхронизация должна знать, как развиватьсяWeb
Проект. Внешний запрос входит в метод бизнес-обработки внутреннего контроллера, метод обработки привязывает данные к контексту, а затем заставляет метод возвращать строку, которая будет соответствовать сгенерированной странице, возвращаемой во внешний интерфейс. Но иногда метод должен возвращать данные ответа напрямую.json
данные. Так что разница между ними очевидна.
@RestController: эта аннотация эквивалентна @Controller + @ResponseBody.
3.3 Как вводится контроллерservice
?
Наш обычный способ может быть таким, используя@Autowired
вводить то, что мы получаемservice
, код показан ниже:
@RequestMapping("kuaidi")
@Controller
public class KuaiDiController {
@Autowired
private KuaiDiService kuaiDiService;
}
В этом проекте я нашел способ записи, код выглядит следующим образом:
@Controller
@RequestMapping("article")
@AllArgsConstructor
public class ArticleController {
private final BizArticleService articleService;
private final BizArticleTagsService articleTagsService;
private final BizCategoryService categoryService;
private final BizTagsService tagsService;
private final SysConfigService configService;
}
Этот метод на самом деле является внедрением конструктора.@AllArgsConstructor
даlombok
Аннотация плагина, плагин автоматически сгенерирует конструктор с полными параметрами.
5. Наконец
Проекты с открытым исходным кодом позволяют нам легко получать исходный код других людей и учиться на нем. Я оптимизирую себя自助快递
функция запроса. Ни для чего другого, просто чтобы не терять время, каждый раз, когда я выполняю функцию, у меня есть определенное чувство достижения, которое делает меня счастливым!
Справочная статья
- Mybatis3.2 не поддерживает подстановочные знаки Ant:nuggets.capable/post/684490…