Красивая фоновая система управления контентом

Spring Boot
Красивая фоновая система управления контентом

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
представлен здесьhutoolsTool, так как он инкапсулирует множество классов инструментов, вы можете использовать его напрямую. проект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. Наконец

Проекты с открытым исходным кодом позволяют нам легко получать исходный код других людей и учиться на нем. Я оптимизирую себя自助快递функция запроса. Ни для чего другого, просто чтобы не терять время, каждый раз, когда я выполняю функцию, у меня есть определенное чувство достижения, которое делает меня счастливым!

Справочная статья

Беспокойная обезьяна
Усердно делитесь технологией!