1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/hmfdev-CloudOffice

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Это зеркальный репозиторий, синхронизируется ежедневно с исходного репозитория.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

CloudOffice

Введение

  Целью данного проекта является создание онлайн-системы для управления офисной работой для малых и средних предприятий. Система CloudOffice предназначена для упрощения и оптимизации процессов, связанных с повседневной офисной деятельностью, таких как управление различными рабочими процессами, новостями, уведомлениями, объявлениями, файловой информацией, финансами, кадрами, расходами, активами, административными задачами, проектами и мобильной работой.
  Система CloudOffice призвана повысить эффективность и стандартизацию управления, обеспечивая более удобное и простое решение для офисных задач.

Архитектура программного обеспечения

Описание архитектуры программного обеспечения.

Изображение интерфейса бэкенда

Введите здесь описание изображения

Инструкция по установке

  1. xxxx
  2. xxxx
  3. xxxx

Руководство по использованию

  1. При использовании функции кэширования при получении меню необходимо настроить Redis и запустить его.
  2. При добавлении сотрудника используется RabbitMQ для отправки уведомлений по электронной почте после завершения процесса добавления. Необходимо настроить IP-адрес службы и указать свой код авторизации в файле конфигурации. Затем запустите RabbitMQ.
  3. При обновлении аватара используется FastDFS — лёгкая распределённая система хранения файлов, которая позволяет загружать изображения. Необходимо настроить IP-адреса служб и запустить сервисы tracker (отслеживание), storage (хранилище) и Nginx.
  4. Доступ к интерфейсу API можно получить через http://localhost:8081/doc.html.

Детали журнала фиксации изменений

  1. Инициализация на локальном компьютере

    1. Создание нового проекта SpringBoot с использованием Spring Initializr в среде IDEA.
    2. Клонирование репозитория проекта из Gitee в локальную среду и интеграция содержимого в новый проект SpringBoot.
    3. Объединение созданного .gitignore и .gitignore из клонированного репозитория.
  2. Подготовка проекта

    1. Подготовка базы данных: создание новой базы данных yeb с кодировкой utf8mb4 и импорт файла сценария yeb.sql в папку database.
    2. Использование Lombok: установка плагина Lombok в IDEA.
  3. Создание проекта

    1. Новый проект SpringBoot будет использоваться в качестве родительского проекта для управления зависимостями Maven. Большинство файлов и папок могут быть удалены.
    2. Изменение файла pom.xml: удаление тегов зависимостей и сборки, добавление тега packaging со значением pom.
    3. Создание модуля проекта: использование Maven для создания нового модуля quickstart под названием yeb-server, который будет отвечать за бизнес-логику всего проекта.
    4. Модификация модуля yeb-server: удаление классов App и AppTest, создание пакета server.
    5. Связывание родительского проекта с модулем yeb-server в pom.xml.
    6. Удаление тегов сборки и зависимостей, так как зависимости будут добавлены напрямую.
    7. Завершение структуры модуля yeb-server путём добавления необходимых каталогов и ресурсов, а также файла конфигурации application.yml. Обратите внимание на возможные проблемы с копированием содержимого файла конфигурации.
    8. Добавление класса запуска YebApplication и настройка аннотации Mapper.
    9. Размещение файла конфигурации application.yml в папке config.
  4. Обратное проектирование (создание резервной копии всех таблиц базы данных перед обратным проектированием)

    1. Использование генератора кода MyBatisPlus для быстрого создания Entity, Mapper, Mapper XML, Service и Controller. Это значительно повышает эффективность разработки.
    2. Создание нового модуля генератора кода с помощью Maven quickstart для обратного проектирования.
    3. В файле pom.xml модуля генератора кода удалить ненужные элементы, указать родительский проект и скопировать зависимости. Также создать пакет generator.
    4. Код, сгенерированный для этого модуля, не требуется для тестирования, поэтому папка test удаляется.
  5. Обратное проектирование (генерация кода для всех таблиц базы данных)

    1. После генерации кода в модуле генератора скопировать его в модуль сервера.
    2. Удалить сгенерированные классы в модуле генератора, поскольку они будут конфликтовать с существующими классами.
    3. Добавить необходимые зависимости, чтобы устранить конфликты. Например, добавить зависимость Swagger2.
    4. Файл CodeGenerator в обратном проектировании содержит конфигурацию пакетов для соответствующих модулей.
  6. Разработка инструмента класса Jwt Token

    1. Реализация аутентификации с использованием SpringSecurity и JWT. Внести соответствующие зависимости.
    2. Настройка JWT в файле application.yml и создание папки config для хранения конфигураций проекта.
    3. Разработка класса утилиты JwtTokenUtil.
  7. Общий объект ответа

    1. Данные JSON, возвращаемые при вызове интерфейса, инкапсулируются в RespBean.
  8. Получение токена после успешной аутентификации

    1. Аутентификация с использованием Spring Security и JWT. Фронтенд отправляет имя пользователя и пароль, и если данные верны, генерируется токен JWT, который возвращается вместе с заголовком запроса.
  9. Информация о текущем пользователе и выход из системы

    1. Процесс выхода инициируется запросом от фронтенда. После успешного выполнения запроса фронтенд удаляет заголовок запроса.
  10. Настройка фильтра безопасности для авторизации

  11. Пользовательские результаты безопасности

    1. Базовая конфигурация Spring Security завершена.
  12. Конфигурация Swagger2

    1. Необходимо разрешить доступ к ресурсам Swagger2.
    2. Исправлены некоторые ошибки в коде.
  13. Добавление авторизации в Swagger2

    1. Исправление ошибок в коде.
  14. Генерация проверочных кодов

    1. Используется графический проверочный код Google, и создаётся класс конфигурации CaptchaConfig с аннотацией @Configuration.
    2. Создаётся интерфейс CaptchaController.
    3. Разрешается доступ к проверочному коду в SecurityConfig.
    4. Если токен истёк, отображается сообщение об ошибке: io.jsonwebtoken.ExpirdidExcetiom:JWT expired at 202-7-23723:18.2 Current time:2001-47-2412208.34, a difference of 82207652 milliseconds. Allowed clock skew:0 mill.
  15. Проверка проверочного кода

    1. Класс AdminLoginParam дополняется параметром проверочного кода, и соответствующий метод также получает параметр code.
    2. Метод login() в классе AdminServiceImpl проверяет, соответствует ли введённый пользователем проверочный код значению, сохранённому в сеансе.
  16. Запрос списка меню на основе идентификатора пользователя

    1. Мы используем SpringSecurity, и после аутентификации устанавливается глобальный объект пользователя. Мы можем получить его с помощью SecurityContextHolder.getContext().getAuthentication().getPrincipal().
  17. SQL-запросы для получения списка меню по идентификатору пользователя

    1. SQL-запрос довольно длинный и сложный.
    2. Поскольку ранее код был написан неправильно, он был исправлен.
  18. Интеграция Redis с функцией меню

    1. Добавляем зависимость Redis, настраиваем соединение и другие параметры в application.yml.
    2. Настраиваем сериализацию Redis, иначе в Redis появятся искажённые символы. Не забудьте использовать аннотацию @Configuration, иначе конфигурация не удастся.
    3. Если меню изменяется, необходимо очистить Redis и позволить ему повторно извлечь данные из базы данных и сохранить их в Redis для обеспечения актуальности данных.
  19. Определение роли на основе URL-запроса

    1. Определение роли для доступа к меню. Требуется реализовать в фильтре.
    2. Создать компонентный пакет и изменить расположение некоторых файлов .java.
  20. Идентификация роли пользователя

    1. Конфигурация динамических разрешений и функций меню завершена.
  21. Реализация функций управления должностями — добавление, изменение, удаление и запрос информации о должностях

    1. Префикс URL должен соответствовать префиксу системы управления t_menu в таблице. В противном случае возникнут проблемы с разрешениями.
    2. Используйте аннотацию @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai") для форматирования времени в сущности. Есть два параметра: формат и часовой пояс.
    3. Однотабличное добавление, удаление, изменение и запрос. MyBatisPlus работает очень быстро, и даже методы, определённые MyBatisPlus, могут использоваться для запроса данных.
    4. Можно использовать LocalDateTime.now() для получения текущего системного времени. 5)Преобразование данных в список методом Arrays.asList(ids):

Для преобразования массива в список используется метод Arrays.asList().

6)Использование методов MyBatisPlus для добавления, изменения и удаления данных:

Методы MyBatisPlus позволяют выполнять операции добавления, изменения и удаления данных без необходимости модификации service и mapper слоёв.

22. Глобальная обработка исключений:

Используется аннотация @RestControllerAdvice для создания класса-расширения контроллеров, который будет перехватывать исключения.

23. Реализация функции управления званиями:

  1. Для работы с датами используются аннотации @JsonFormat с параметрами pattern и timezone.

  2. Массив преобразуется в список с помощью метода Arrays.asList() и оператора asList().

  3. Поле titleLevel в таблице t_joblevel имеет фиксированное значение, что следует учитывать.

  4. Рекомендуется использовать тип перечисления Enum для полей с фиксированными значениями.

24. Реализация функций управления правами доступа:

  1. Изменён RequestMapping в MenuController на «system/config».

  2. Метод list() из MyBatisPlus используется для получения всех данных таблицы через roleService.list().

  3. Метод save() из MyBatisPlus применяется для добавления данных через roleService.save().

  4. Метод removeById() из MyBatisPlus удаляет данные по идентификатору через roleService.removeById().

25. Реализация функции поиска меню по правам доступа:

  1. Обратить внимание на написание resultMap в файле MenuMapper.xml.

  2. В методе (согласно роли id поиск меню id) используется код: menuRoleService.list(new QueryWrapper().eq("rid", rid)).stream().map(MenuRole::getMid).collect(Collectors.toList());.

26. Реализация функции обновления и удаления меню с учётом прав доступа:

  1. При обновлении и удалении данных добавляется аннотация @Transactional для обеспечения транзакционности.

  2. Параметр dao слоя использует аннотацию @Param из пакета org.apache.ibatis.annotations.Param.

27. Введение в хранимые процедуры:

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

28. Создание и вызов хранимых процедур:

Процесс создания и вызова хранимых процедур включает определение структуры процедуры, написание кода и выполнение процедуры.

29. Объяснение проекта с использованием хранимых процедур:

В данном контексте не предоставляется конкретная информация о проекте, использующем хранимые процедуры.

30. Получение всех отделов:

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

31. Добавление отдела:

При добавлении отдела используется хранимая процедура, поэтому в файле xxxMapper.xml вместо тега используется тег .

32. Удаление отдела:

Операция удаления отдела выполняется с использованием хранимой процедуры. Все интерфейсы для работы с отделами реализованы.

33. Получение всех операторов:

Создаётся класс AdminUtils для получения информации о текущем пользователе, включая его идентификатор. Параметры метода в слое dao/mapper используют аннотацию @Param. В SQL-запросах используется функция concat() для объединения строк.

34. Обновление и удаление операторов:

Обновление данных осуществляется с помощью метода updateById() из MyBatisPlus. Используется аннотация @Data с параметром AccessLevel.NONE для предотвращения генерации геттеров для определённого поля. Интерфейсы для обновления и удаления операторов не были протестированы.

35. Управление ролями операторов:

Реализуется массовое обновление данных операторов с использованием AdminRolMapper.xml и SQL-запросов с циклами. Интерфейсы также не были протестированы.

36. Подготовка к управлению сотрудниками:

Конфигурируется плагин разбиения на страницы, создаётся общий объект RespPageBean для возврата результатов. Создаётся инструмент DateConverter для глобального преобразования дат. В классе Employee используется аннотация @JsonFormat для форматирования дат при возврате данных.

37. Разбиение на страницы и получение всех сотрудников:

Устанавливается значение по умолчанию для параметра запроса с помощью аннотации @RequestParam(defaultValue = "1"). Методы слоя dao/mapper с несколькими параметрами используют аннотацию @Param. SQL-запрос использует функцию concat(). Используется плагин MyBatisPlus IPage для разбиения на страницы.

38. Тестирование разбиения на страницы для получения сотрудников:

После завершения каждого интерфейса проводится тестирование для выявления и устранения проблем.

39. Подготовка перед добавлением сотрудника:

В классе EmployeeServiceImpl используется String.format для предотвращения проблем с кодировкой.

40. Устранение ошибки 500 при получении номера сотрудника:

Ошибка была вызвана опечаткой в имени столбца. Вместо max(workID) было написано max(workId).

41. Реализация добавления сотрудника:

Включает расчёт срока контракта с использованием класса LocalDate.

42. Обновление и удаление сотрудников:

Применяются методы MyBatisPlus для обновления и удаления данных. Оба интерфейса были протестированы. Модуль управления сотрудниками практически завершён.

43. Использование аннотаций EasyPoi:

EasyPoi используется для импорта и экспорта данных Excel. Зависимость easy poi добавляется в файл pom.xml. Аннотации @Excel и @ExcelEntity используются для определения полей, которые будут экспортироваться.

44. Экспорт данных сотрудников:

Применяется аннотация @GetMapping(value = "/export", produces = "application/octet-stream") для экспорта данных. Данные возвращаются в виде потока. Используются ранее созданные SQL-запросы.

45. Импорт данных сотрудников:

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

46. Тестирование импорта и экспорта сотрудников:

Рекомендуется проверить результаты импорта после удаления строк в Excel. Если данные не отображаются после успешного импорта, необходимо проверить, все ли данные были импортированы или они находятся на следующей странице.

47. Создание проекта службы электронной почты:

Необходимо настроить SMTP-сервер для отправки электронных писем. Новый проект yeb-mail создаётся с использованием файла pom.xml для управления зависимостями и запуска класса. Шаблоны электронных писем создаются с использованием thymeleaf.

48. Реализация отправки электронной почты:

Зависимости rabbitmq добавляются в файл pom.xml проекта yeb-server. Конфигурация rabbitmq также требуется в файле application.yml. 7. В YEB-Mail мы ввели зависимость от YEB-Server, и для подключения к базе данных нам нужно настроить источник данных. Чтобы исключить конфигурацию DataSourceAutoConfiguration.class в классе запуска MailApplication, мы используем аннотацию @SpringBootApplication.

  1. Добавление комментариев для понимания процесса отправки электронных писем.

  2. Введение в надёжную систему доставки сообщений на производстве.

  3. Включение механизма обратного вызова сообщений.

— Основной целью является обеспечение успешной отправки электронных писем. — Требуется класс конфигурации RabbitMQConfig с использованием режима маршрутизации DirectExchange. — В application.yml настраиваются обратные вызовы подтверждения и сбоя сообщений. — Обратные вызовы подтверждения и сбоя обрабатываются соответствующим образом.

  1. Обеспечение надёжности доставки сообщений на производственной стороне.

— Создаётся задача по отправке электронных писем по расписанию. — Класс запуска @EnableScheduling используется для активации задачи по расписанию. — После этого сообщения будут сохранены в базе данных.

  1. Реализация механизма idempotence на стороне потребителя.

— RabbitMQ активирует механизм ручного подтверждения. — Конфигурация Redis добавляется в файл yeb-mail.application.yml. — Место отправки электронных писем требует значительных изменений. — Информация хранится в Redis. Здесь требуется глубокое понимание процесса.

  1. Модуль заработной платы сотрудников — реализация функций зарплатной ведомости.

— Поля классов POJO снабжены аннотациями @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Asia/Shanghai") для форматирования времени. — Поскольку адреса запросов определены в базе данных, каждый раз при написании контроллера необходимо указывать соответствующий путь @RequestMapping(). — Для получения текущего времени используется LocalDateTime.now(). — Здесь можно изучить процесс добавления, удаления и изменения данных, который полностью использует методы, предоставляемые MyBatisPlus.

  1. Получение всех зарплатных ведомостей сотрудников.

— Зарплатная ведомость фактически представляет собой шаблон заработной платы. — Разбиение на страницы возвращает RespPageBean, и здесь необходимо понять процесс разбиения на страницы. — Аннотация @RequestParam используется в методе параметров контроллера для указания значений по умолчанию.

  1. Реализация функций зарплатной ведомости сотрудников.

— Следует обратить внимание на оператор обновления employeeService.update(new UpdateWrapper().set("salaryId", sid).eq("id", eid)). — Классу контроллера требуются аннотации @RestController и @RequestMapping("/salary/sobcfg").

  1. Онлайн-чат — обычная конфигурация WebSocket.

— Добавляются необходимые зависимости для WebSocket. — Новый класс конфигурации WebSocketConfig снабжается аннотациями @Configuratioin и @EnableWebSocketMessageBroker, где @Configuration является обязательной аннотацией для класса конфигурации. — Классу конфигурации WebSocket также необходимо реализовать интерфейс WebSocketMessageBrokerConfigurer. — Обычно для соединения с WebSocket используется sockJs.

  1. Конфигурация JWT, связанная с WebSocket.

— Используется аутентификация JWT. Здесь также требуется дополнительная настройка, то есть настройка входного канала. — Используя аннотацию @Value("${jwt.tokenHead}"), можно получить значение, настроенное в файле application.yml, и связать его с переменной поля. — Создается новый класс сообщений ChatMsg для хранения отправляемых сообщений. — Обратите внимание на аннотацию @MessageMapping в методах контроллера. — Также необходимо настроить маршрутизацию для WebSocket.

  1. Объяснение процесса WebSocket.

— Добавлены комментарии для облегчения понимания процесса WebSocket. — Настроен конечная точка /ws/ep. — Установлен токен Auth-Token. — Доступ к глобальному объекту пользователя Security и accessor.setUser() необходим для успешного подключения. — Настройка прокси-домена registry.enableSimpleBroker("/queue") может быть адаптирована к различным потребностям бизнеса. — Наконец, не забудьте разрешить отправку сообщений в SecurityConfig, используя аннотацию @MessageMapping("/ws/chat") для пути запроса.

  1. Личный центр — реализация личных функций центра.

— Реализованные функции включают в себя обычные операции личного центра, обновление аватара (с использованием FastDFS). — Обычные операции для личного центра включают обновление информации о пользователе и обновление пароля. — После обновления пароля пользователь принудительно выходит из системы и должен снова войти в систему. Этот процесс обрабатывается на передней панели.

  1. Пользовательская десериализация.

— При обновлении информации о текущем пользователе возникает проблема с преобразованием JSON, особенно с полем GrantedAuthority, которое не может быть десериализовано по умолчанию. — Необходимо создать собственный класс десериализации CustomAuthorityDeserializer. — Используйте аннотацию @JsonDeserialize(using = CustomAuthorityDeserializer.class) в местах, где требуется десериализация. — Завершите тестирование интерфейса обновления информации о текущем пользователе и пароле.

  1. Написание инструментальных классов FastDFS.

— Основное внимание уделяется реализации функции обновления аватара, которая требует, чтобы служба FastDFS была запущена заранее. — FastDFS — это лёгкая распределённая файловая система с открытым исходным кодом. — Сначала настройте файл конфигурации fdfs_client.conf, обратите внимание на расширение .conf. — Файл конфигурации fdfs_client.conf в основном используется для настройки IP-адреса и номера порта вашего трекера. — Затем создайте инструментальный класс для FastDFS, содержащий различные операции, такие как загрузка и скачивание файлов.

  1. Обновление функций аватара.

— Функции обновления аватара завершены.

  1. Завершение основных функций серверной части.

— Проект E-Office на основе облачных вычислений достиг базового уровня функциональности серверной части. Дополнительные функции могут быть добавлены в соответствии с требованиями. — Добавьте инструкции по использованию, включая необходимость запуска серверов, таких как redis, rabbitmq, fastdfs, nginx и т.д. — Таким образом, проект завершается.

  1. Переключение интерфейса SwaggerUI.

— Нужно сравнить исходный интерфейс SwaggerUI и интерфейс третьей стороны SwaggerUI. Всего три шага, чтобы легко переключаться между ними. — Глобальный поиск «переключение интерфейса SwaggerUI», следуйте инструкциям на следующих шагах, чтобы раскомментировать их. — Если первые два шага успешно выполнены, третий шаг можно пропустить.

  1. Инструкции по запуску команд сервисов проекта redis, rabbitmq, fastdfs (tracker/storage), nginx.
  1. Перед запуском команд для запуска сервисов необходимо сначала настроить IP-адрес сервиса и код авторизации для отправки новым сотрудникам в файле конфигурации application.yml.
  2. Команда запуска redis: ./redis-server redis.conf.
  3. Проверьте статус запуска redis: ps -ef | grep redis.
  4. Команда запуска rabbitmq: systemctl start rabbitmq-server.service.
  5. Проверьте статус запуска rabbitmq: systemctl status rabbitmq-server.service.
  6. Команда запуска tracker fastDFS: /etc/init.d/fdfs_trackerd start (если tracker запущен автоматически, эту команду выполнять не нужно).
  7. Команда запуска storage fastDFS: /etc/init.d/fdfs_storaged start (рекомендуется не запускать автоматически из-за необходимости запуска после tracker).
  8. Проверьте статус запуска tracker и storage: ps aux | grep fdfs.
  9. Команда запуска nginx: /usr/local/nginx/sbin/nginx.
  10. Если redis не настроен и не запущен, при входе в систему будет невозможно войти, поскольку после входа необходимо получить данные меню, но без redis сервис не запустится, что приведёт к пустому экрану после успешного входа.
  11. Добавлены комментарии к местам, требующим изменения IP-адресов.
  1. Добавьте описание процесса входа в документацию Swagger.
  1. Получите проверочный код через интерфейс CaptchaController /captcha.
  2. Вызовите интерфейс /login в LoginController, передав только что полученный проверочный код и имя пользователя admin и пароль 123, получите возвращённый токен.
  3. Найдите Authorize, добавьте токен, возвращённый на предыдущем шаге, перед ним добавьте Bearer и разделите пробелом, затем сохраните.
  1. Дополнительные инструкции по запуску проекта.
  1. Клонируйте проект локально, откройте его в IDEA, создайте базу данных с именем yeb, выполните следующие команды.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Онлайн-система для малого и среднего бизнеса — облачное решение E (бэкенд). Расширить Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://gitlife.ru/oschina-mirror/hmfdev-CloudOffice.git
git@gitlife.ru:oschina-mirror/hmfdev-CloudOffice.git
oschina-mirror
hmfdev-CloudOffice
hmfdev-CloudOffice
master