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

OSCHINA-MIRROR/Jeffrey2971-wechat

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

Веб-платформа WeChat Official Account

1. Описание проекта

1.1 Функциональные возможности и статус проекта

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

  • В настоящее время официальный аккаунт "Распознавание и перевод текста на изображениях" + "Распознавание и перевод текста на изображениях OCR" предоставляет услуги более чем 10 000 пользователям.

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

1.2 Причины создания проекта

  • Перед созданием проекта, используя систему Mac недавно, я обнаружил, что нет подходящего плагина или программы для перевода. Поскольку при использовании компьютера WeChat обычно запущен, можно использовать встроенные функции перевода в официальном аккаунте WeChat для перевода нужного контента. Однако большинство аккаунтов требуют оплаты или просмотра видео для получения возможности перевода после определенного количества использований. Поэтому было решено использовать WeChat Official Account или тестовый аккаунт WeChat API для создания аккаунта, который будет использовать собственные функции и интегрированные API для перевода.### 1.3 Решение поддерживать проект

  • В один из дней, просмотрев официальный аккаунт, я обнаружил, что аккаунт, созданный для личного использования, уже имеет десятки подписчиков, которые используют его некоторое время. Имея подписчиков, появляется мотивация, поэтому было решено поддерживать аккаунт и продолжать его развитие.### 1.4 Встреченные проблемы

  • Проблемы с реакцией на сообщения от подписчиков

    • После получения сообщения от пользователя, необходимо ответить на него в течение пяти секунд, иначе WeChat будет напрямую уведомлять пользователя о неисправности публичного аккаунта. Однако подписные аккаунты не имеют права на асинхронные ответы, и из-за того, что общая длина ответа, предоставляемая WeChat для разработчиков, составляет 2048 байт (1 китайский символ ≈ 2/3 латинских букв ≈ 2/3 байта), ответы часто оказываются недостаточными по длине для перевода или ответа. Поэтому был добавлен кнопка "Нажмите для просмотра дополнительной информации", которая активируется, когда длина ответа превышает критическое значение. В других случаях (длина байт оригинального текста изображения + длина байт переведенного текста + 60 (длина байт текста уведомления) < THRESHOLD (критическое значение 2048)), эта кнопка не активируется. Однако этот метод решает проблему только на поверхности, и при отправке пользователем большого изображения ответ часто не успевает быть отправлен в течение пяти секунд, поэтому в конечном итоге был открыт публичный аккаунт и использованы некоторые интерфейсы для решения этой проблемы.
    • Проблемы с онлайн-предварительным просмотром переведенных документов - Предоставление онлайн-предварительного просмотра оригинального формата документов на фронтенде не является простой задачей, поэтому проект использует HTTP-сервисную платформу kkFileView для отображения различных типов файлов в онлайн-предварительном просмотре.
    • Проблемы с хранением данных документов
      • Ранее использовался HashMap для хранения структуры данных и регулярное удаление устаревших данных из карты. Однако, поскольку время истечения срока действия данных определено в значении, каждое значение необходимо проверять в цикле, что приводит к проблемам производительности при большом количестве данных. Кроме того, использование этого метода в нескольких местах проекта приводит к проблемам связности кода. Поэтому было решено использовать Redis для хранения данных, где значение хранится в формате JSON, а время истечения срока действия определено. В конце концов, код для работы с Redis был упакован в утилиту.
    • Проблемы с безопасностью данных пользователей
      • Включая хранение и получение переведенных документов пользователей, а также хранение и получение данных изображений пользователей.
    • Частые сбои JVM
      • При выполнении регулярных задач необходимо получить все данные из Redis за один раз, что приводит к проблемам с памятью из-за малого объема памяти сервера.Изменение метода получения данных с использованием сегментации решило эту проблему.
    • Проблемы с отслеживанием состояния проекта в реальном времени
    • Ранее для проверки состояния проекта использовался вход в систему через SSH для просмотра логов проекта, что было неэлегантным и неэффективным способом. Поэтому были использованы фреймворки spring-boot-security-starter, spring-boot-admin-starter, spring-boot-admin-client, spring-boot-health-starter, spring-boot-starter-mail для регистрации сервисов на платформе admin для реального времени отслеживания состояния проекта и отправки уведомлений администратору через безопасную электронную почту. ### ⑤ Используемые технологии- Backend: kkFileView + SpringBoot + MyBatisPlus + Redis + MySQL
  • Frontend: html + jquery + bootstrap

2. История обновлений

2022-11-04 LTS

  • Добавлено
    • Использование третьей стороны визуализированной платформы для мониторинга состояния admin как фреймворка для мониторинга состояния проекта. Серверная часть использует модули spring-boot-actuator-starter, spring-boot-admin-starter, spring-boot-admin-starter-client, spring-boot-security-starter. Функции включают проверку пользователей в платформе admin, отправку уведомлений по электронной почте о состоянии проекта, просмотр подробной информации о проекте, регистрацию микросервисных проектов на платформе и т.д.
  • Изменено
    • При выполнении задачи планировщика требуется одновременное получение всех данных из Redis. Из-за малого объема оперативной памяти сервера и слишком грубого подхода к получению всех данных, это приводило к аварийному завершению работы из-за нехватки памяти JVM. Проблема была решена путем разделения получения данных из Redis на части.

2022-07-13

  • Изменено
    • Исправление исключения NullPointerException, вызванного вызовом компонента Bean до полной инициализации проекта.
    • Исправление проблемы с условием, которое не выполняется из-за добавления символа !, что приводило к нефункциональности функции перевода документов.### 2022-07-08
  • Переработка
    • В этом обновлении добавлены kkFileView + SpringBoot + MyBatisPlus + Redis для переработки. Множество мелких изменений в коде, изменения в иерархии и добавление новых функций можно увидеть в комментариях к коммитам.- Добавленные функции
    • Функция перевода документов: перевод документов, загруженных пользователем, в соответствии с настройками языка, с использованием асинхронного подхода и отправкой уведомлений через шаблоны сообщений WeChat.
    • Функция отправки уведомлений по электронной почте: отправка электронного письма на мой адрес при отправке обратной связи через форму. Письмо включает openid пользователя, время отправки обратной связи, заголовок обратной связи, детали обратной связи, контактные данные пользователя и детали контакта.
    • Функция отправки уведомлений по электронной почте при возникновении ошибок в публичном аккаунте: отправка уведомлений по электронной почте при возникновении ошибок в публичном аккаунте с использованием AOP. Письмо включает время возникновения ошибки, openid пользователя, тип ошибки, метод, где была выброшена ошибка, и стек вызовов.
    • Функция шаблонов сообщений: шаблоны сообщений используются WeChat для отправки важных уведомлений пользователям. Шаблоны сообщений используются для асинхронной отправки уведомлений при переводе документов.
  • Изменения
    • Изменения некоторых полей в таблицах базы данных
    • Изменения шаблонов ответов: проверка переведенного контента пользователем, добавление рекомендации использовать перевод документа в конце сообщения, если контент похож на документ. - Изменение количества бесплатных использований для каждого пользователя в день: возвращено к 5 бесплатным использованием в день

Изменений по тексту нет, так как он уже на русском языке и корректен с точки зрения грамматики и стиля.### 19 марта 2022 года

  • Проект переработан и прекращены обновления

  • Изменения

    • Несколько мелких изменений

22 ноября 2021 года

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

8 октября 2021 года

  • Изменения
    • Изменение кнопок в меню: удаление подменю, добавление кнопки для промо-акции, изменение ссылки на просмотр способа использования
    • Изменение количества бесплатных использований для каждого обычного пользователя в день на 7 раз
    • Добавление временного увеличения количиства бесплатных использований: после использования всех бесплатных использований в день, пользователь получает сообщение с предложением использовать 10 дополнительных использований. Пользователь может воспользоваться этим предложением только один раз
    • Оптимизация кода с использованием рефлексии, в основном для веб-слоя

28 сентября 2021 года- Добавлены

- Функция поддержки распространения: после подписки пользователя или после каждого ответа, будет отправлено сообщение с ссылкой для получения постоянного доступа. При переходе по ссылке пользователь получает промо-код, который содержит уникальный идентификатор пользователя. После подписки других пользователей по промо-коду, система получает идентификатор пользователя и выполняет дальнейшие действия. Если три или более пользователей успешно подписались по промо-коду, пользователь получает постоянный доступ к каналу.
  • Ограничения: если пользователь не является одним из первых 100 тестовых пользователей или не получил постоянный доступ через промо-код, он может использовать сервис только 5 раз в день.

  • Решения

    • Перенос всех методов, связанных с промо-акциями, в BetaUserService### 22.09.2021- Новые функции
    • После прохождения верификации публичного аккаунта он был обновлен до статуса сервисного аккаунта, что позволило использовать большинство недоступных ранее интерфейсов.
    • В соответствии с требованиями Министерства промышленности и информатизации, на всех связанных страницах добавлены номера регистрации.
    • Добавлены инструменты для управления пользователями: com.jeffrey.manager.user.
    • Добавлены кнопки нижнего меню публичного аккаунта: com.jeffrey.menu.
  • Проблемы

    • Проблема с несвоевременным ответом на сообщения с изображениями в течение пяти секунд.
  • Решение

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

08.09.2021

  • Проблемы

    • Из-за природы аккаунта подписки и добавления функции перевода изображений, ответы не были даны в течение пяти секунд после трех запросов, что привело к неудаче ответа.- Решение
      1. По умолчанию пользователь не отправляет запрос на перевод изображения сразу после отправки изображения, а только после нажатия на ссылку для просмотра перевода изображения.
      1. После получения запроса пользователем, ответ не отправляется сразу, а после завершения ответа отправляется запрос на перевод изображения.### 03.09.2021
  • Проблемы

    • Ранее для распознавания и перевода текста на изображениях требовалось использовать два API, теперь это можно сделать с помощью одного API
    • Изменены соответствующие коды в классе WeChatServiceImpl
  • Решение

    • Все функции распознавания и перевода были перемещены в пакет com.jeffrey.translate, добавлены классы GetTranslateMetaData и другие. Вызов метода getData() класса GetTranslateMetaData возвращает объект Translate, который содержит информацию ответа. Через этот объект можно легко получить данные ответа.
      • Translate: содержит все данные ответа.
        • SegmentedData: фрагменты данных ответа, такие как координаты, оригинальный текст, переведенный текст и т.д.
          • DataPoints: данные координат.

29.08.2021

  • Проблемы
    • Оптимизация бизнес-процессов электронной почты

24.08.2021

  • Проблемы
    • Некоторые пользователи, которые часто отправляют запросы, могут занять значительные ресурсы сервера, поэтому необходимо ограничить их.- Решение
    • Добавлен класс потока FrequencyQueue, который добавляет IP или openid в BLACK_MAP, если частота запросов достигает критического значения. В BLACK_MAP ключом является IP или openid, а значением — текущее время.
    • Добавлен класс потока BlackMapQueue, который отслеживает пользователей с частыми запросами. Если значение ключа в BLACK_MAP достигает времени, когда ограничение на доступ снимается, этот ключ удаляется из BLACK_MAP.
    • Добавлен слушатель ListenRequestFrequency, который используется для отслеживания частоты запросов с использованием openid, если он присутствует в запросе. Если openid отсутствует, используется IP-адрес запроса для отслеживания частоты запросов. - Добавлен фильтр RequestFilter, который используется для определения, пришел ли запрос из WeChat или из браузера. Если запрос пришел из WeChat и находится в списке часто посещаемых, вызывается слой service для парсинга xml и создания нового объекта сообщения. Если запрос пришел из браузера, сначала проверяется наличие openid. Если openid присутствует и находится в списке часто посещаемых, возвращается ответ. Если openid отсутствует, проверяется наличие IP-адреса в списке часто посещаемых. Если IP-адрес присутствует, возвращается ответ. В других случаях запрос проходит.

2021-8-25

  • Проблемы

    • При развертывании проекта на системе Windows, было обнаружено, что фактическое количество символов в ответе превышает значение THRESHOLD, что приводит к ошибке из-за превышения лимита 2048 байт.
    • При развертывании проекта на системе Windows, было обнаружено, что поля title и message таблицы feedback содержат некорректные символы.
  • Решение

    • В классе WeChatServiceImpl увеличено значение THRESHOLD на 50.

2021-8-24

  • Проблемы

    • Поле details таблицы feedback уникально, что не позволяет вставить два одинаковых значения. Из-за отсутствия валидации формы на странице feedback.jsp, было вставлено два пустых значения, что привело к ошибке.
  • Решение

    • Удалено уникальное ограничение для поля details.
      ALTER TABLE feedback DROP INDEX details;
    ```- Изменения
    
      - В параметрах choose.jsp, feedback.jsp и QuestionServlet заменено значение `data_id` на `openid`.
      - Удалены ненужные jar-файлы.
    

2021-08-23

  • Добавлено

    • В страницах с успешным и неудачным статусом добавлены центрирование и изменение размера шрифта.
    • Улучшена структура кода слоя Servlet, перемещены операции gc в слушатель запросов.
  • Проблемы

    • В методе saveFeedBackText() класса QuestionServiceDaoImpl не было предусмотрено возвращение соединения с базой данных при возникновении исключения, что приводило к исчерпанию соединений в пуле после gst 10 ошибок, что приводило к неудачному ответу сервера.
  • Решение

    • В блоке finally добавлено возвращение соединения с базой данных, а также добавлена проверка существования пользователя перед вставкой данных, чтобы избежать ошибок.
@Override
public boolean saveFeedBackText(FeedBack feedBack) {

        String sql = "insert into feedback (data_id, title, message, way, details, is_beta_user, ctime) VALUE(?,?,?,?,?,?,?)";
        Connection connection = null;
        try {
            String dateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(feedBack.getTimeStamp()));
            connection = JdbcUtils.getConnection();
            return update(connection, sql, feedBack.getData_id(), feedBack.getTitle(), feedBack.getMessage(), feedBack.getWay(),
                    feedBack.getDetails(), betaUserServiceDao.isExists(feedBack.getData_id(), feedBack.getTable()) ? 1 : 0, dateTime) >= 1;
        } finally {
            JdbcUtils.close(connection);
        }

    }

2021-08-18

Новые функции

  • Добавлены параметры перевода API

    OPTIONS.put("language_type", "CHN_ENG");
    OPTIONS.put("detect_direction", "true");
    OPTIONS.put("detect_language", "true");
    OPTIONS.put("probability", "true");
    ```- Переработана страница, когда документ не найден
    

Проблемы

  • Обнаружено, что при достижении документом указанного срока уничтожения, документ не уничтожается в полном смысле этого слова, а просто удаляется из DATA_MAP. Фактически, объект документа хранится в области ServletContext, что приводит к замедлению или даже отказу сервера при накоплении большого количества объектов документов.

План решения

  • При уничтожении документа по ключу времени создания в DATA_MAP также удалять соответствующий объект документа из ServletContext.

  • В классе DocumentQueue добавлен конструктор для передачи ServletContext.

    private ServletContext servletContext;
    
        public DocumentQueue(ServletContext servletContext){
            this.servletContext = servletContext;
        }
  • Отменить создание и запуск потока DocumentQueue в слушателе ListenServletContextStatus, так как это может вызвать исключение NullPointerException.

  • Создать и запустить поток DocumentQueue в методе init(ServletConfig servletConfig) класса WeChatAccessServlet.

2. Проверочные списки

① Проверка подписки/отписки

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

  • Отписка: после отписки следует проверить, удалена ли информация о пользователе из базы данных, включая таблицы beta_users, users и share. Информация в других таблицах не должна удаляться.### ② Проверка отправки текстового сообщения

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

③ Проверка отправки изображения

  • При отправке пользователем изображения следует проверить, работают ли все возвращаемые ссылки.

④ Проверка перевода документов через шаблон сообщений

⑤ Проверка мер безопасности

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

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

Введение

Переписать backend для WeChat公众号 с использованием Spring Boot Развернуть Свернуть
Отмена

Обновления

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

Участники

все

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

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