youzan что это за приложение
Русские Блоги
Эволюция клиентской сетевой архитектуры Android Youzan
В настоящее время основные сетевые запросы Android основаны на OkHttp, разработанном Square. Фреймворк также официально признан Google. OkHttp провел много инкапсуляции и оптимизации сетевых запросов, что значительно снижает затраты разработчика на использование и стабильно в то же время. И масштабируемость. В настоящее время Android-клиент Youzan также использует OkHttp для сетевых запросов. Многие инкапсуляция и оптимизация выполняются на основе инфраструктуры OkHttp, что снижает взаимосвязь между бизнес-логикой и платформой, а также значительно снижает стоимость использования бизнеса. сторона.
1. Текущий сетевой запрос
В качестве примера возьмем запрос Get, код выглядит следующим образом:
Для приведенного выше запроса Get необходимо несколько пояснений:
Бизнес-стороне нужно только обрабатывать разные предприятия с помощью разных методов обратного вызова, например, в onBefore Показать индикатор выполнения в onAfter Скрыть индикатор выполнения в onResponse Получить возвращаемое значение и значение статуса в onRequestError Получите тип ошибки в, и отобразите сообщение об ошибке и так далее.
В ответ на вышеупомянутый процесс запроса может быть обнаружено, что все еще есть некоторые необоснованные моменты.
2. Улучшенная структура сетевых запросов.
В ответ на вышеупомянутые проблемы мы представили Retrofit, разработанный Square, и RxJava, созданный ReactiveX. Ниже показано использование сетевых запросов после объединения с бизнесом похвалы.
Сначала определите метод сетевого запроса. Модернизация завершает определение метода запроса через интерфейс. Код выглядит следующим образом:
2.1 Обработка ошибок запроса
Следует отметить несколько моментов, связанных с приведенным выше кодом:
2.2 Переключение потоков
Как упоминалось выше, предыдущий метод запроса не может легко переключать потоки в методе обратного вызова запроса. Вы должны использовать собственный Android Handler Таким образом, код будет более разбросанным, а читабельность будет относительно плохой.RxJava предоставляет очень удобный метод обработки для переключения потоков, и его нужно только явно указать для завершения переключения разных потоков.
Приведенный выше код в основном выполняет две части работы: subscribeOn Объявить производителя Observable Поток, в котором он расположен, из-за трудоемкого сетевого запроса обычно помещается в поток ввода-вывода или отдельный подпоток; и observeOn Заявлено, что поток, в котором обрабатывается возвращаемое значение запроса, является основным потоком системы Android, то есть потоком пользовательского интерфейса, так что пользовательский интерфейс может обновляться при обработке возвращаемого значения.
2.3 Журнал запросов
Во-первых, вам нужно ввести перехватчик логов в файл build.gradle.
Добавьте созданный в OkHttpClient место создания Interceptor То есть полный пример кода выглядит следующим образом:
HttpLoggingInterceptor Предоставляет 4 уровня для управления типом информации для печати: NONE, BASIC, HEADERS, BODY.Далее поговорим о соответствующих типах информации для печати.
Нет информации журнала
Тип запроса на печать, URL-адрес, размер тела запроса, статус возвращаемого значения и размер возвращаемого значения
Распечатайте информацию заголовка возвращенного запроса и возвращаемого значения, тип запроса, URL-адрес и код состояния возвращаемого значения.
Запрос на печать и заголовок возвращаемого значения и body Информация
2.3 Единое добавление токена и User-Agent
Теперь практически все заявки пройдут token Чтобы проверить разрешения пользователя, User-Agent Параметры удобны для сервера для получения дополнительной локальной информации о мобильном телефоне. Параметры, необходимые для каждого такого запроса, также могут быть переданы через Interceptor Способ достижения.
2.4 Инкапсулируйте тело запроса через объект
иногда post Будет много запрошенных параметров. Если вы напишете их один за другим, то параметры метода будут казаться многочисленными, беспорядочными и сложными в обслуживании, конечно, вы можете использовать Map Централизованное управление, но Map Одна проблема в том, что однажды key Значение неверно, и его нельзя обнаружить вовремя на ранней стадии, и его необходимо обнаружить при выполнении реального сетевого запроса. Retrofit Предоставляет хорошее решение для инкапсуляции этих параметров запроса через объекты.
Следует отметить, что имя атрибута в классе должно соответствовать ключу параметра запроса, в противном случае сервер не сможет нормально распознать параметр запроса.
Подробнее об использовании Retrofit читайте в статьеОбъяснение модернизации
3. Как пользоваться
Мы получили Category В качестве примера, чтобы проиллюстрировать, как использовать Retrofit с RxAndroid Переписать существующие модули.
3.1 Определение CategoryResponse
среди них Category Это конкретный тип сущности.
3.2 Определение метода обслуживания
будь осторожен
3.3 Использование ServiceFactory для создания экземпляра TradeService
В нужное время ( Activity#onCreate 、 Fragment#onViewCreated И т.д.) Пройдите по типу шлюза ServiceFactory Создавать TradeService Пример.
3.4 TradeService получает данные
Примечание: DefaultTransformer СодержитРаспределение потоковсОбработка ошибокФункция состоит из двух частей, поэтому вызывающей стороне нужно заботиться только о правильных данных.
4. Напишите в конце
Сетевые запросы имеют большое влияние на улучшение восприятия и производительности приложений Android. В сочетании с Retrofit они улучшают читаемость кода и гибкость кодирования. RxJava предоставляет метод цепного вызова, который объединяет преимущества переключения потоков, фильтрации данных, преобразования данных и т. Д. Youzan выполнил небольшую упаковку на этой основе, которая может адаптироваться к самым сложным бизнес-сценариям.
Русские Блоги
Практика оплаты микросервисов Youzan
История развития технологий Youzan
2015 С 2016 по 2016 год, когда бизнес-трафик увеличился, существующая архитектурная модель столкнулась с трудностями, и компания начала двигаться в направлении разделения бизнеса и обслуживания. Начать принимать java В качестве языка разработки в сервис-ориентированной среде используются усовершенствованные dubbo x, платформа nova (v2.0), которая поддерживает вызовы между языками обслуживания.
В 2017 году на основе сервиса мы приблизились к архитектуре микросервиса. Используйте богатые компоненты, предоставляемые сообществом (v3.0).
Проблемы, с которыми мы столкнулись
С развитием бизнеса, размер команды также растет, в это время v1.0 монолитная архитектура столкнулась с проблемами
Программные системы или архитектура, в отличие от зданий из-за время Ход времени будет естественным образом повреждать и гнить, он будет гнить только из-за изменений. Четкая и аккуратная архитектура и реализация в начале спрос Меняется и становится мутным и хаотичным. Информатика любит заимствовать физический термин «энтропия», который выражает степень хаоса в системе, и «энтропия» системы программного обеспечения может легко стать выше по мере изменения потребностей.
«Энтропия» системы программного обеспечения имеет критическое значение. Когда критическое значение достигнуто и превышено, система программного обеспечения жизнь Это в основном закончилось. В настоящее время мы должны предпринять это убедительное действие. Легенда показывает жизненный цикл «энтропийного» значения программного обеспечения системы.
Будучи разделенным по направлениям бизнеса, он смог хорошо соответствовать развитию бизнеса. Однако v2.0 слишком тяжел для разработчиков и должен проделать определенную работу, чтобы облегчить реализацию архитектуры.
Почему вы выбираете spring boot
Решать проблему
youzan pom and youzan-boot-parent
Кроме того, для нашей существующей среды O & M были стандартизированы четыре набора сред: разработка, тестирование, предварительная версия и онлайн.
Мы развернем, чтобы опубликовать api jar в maven На складе существуют строгие ограничения: файл jar должен содержать только некоторые DTO и некоторые интерфейсы, но поскольку устройства для открывания дверей часто копируют и вставляют, они также добавляют различные ненужные зависимости (такие как пружина, различные каркасы журналов и т. Д.) В API приложение, использующее jar, имеет конфликт зависимостей, и потребуется некоторое время, чтобы найти конфликт и разрешить конфликт. надежда Используйте технические средства, чтобы быть последней линией защиты, и разрешите конфликт зависимостей, вызванный использованием других системных API из источника.
youzan appli cat ion
Мы надеемся обратиться к некоторым Открытый исходный код Компоненты и компоненты, разработанные компанией, проще в использовании и снижают стоимость доступа. Для этого мы расширили автоконфигурацию весенней загрузки и добавили различные стартеры.
Например, если мы хотим использовать фреймворк nova, просто аннотация @EnableNova
Применяйте стандартизированные проверки здоровья
Дизайн для отказа (CircuitBreaker)
Распределенная система В дизайне есть очень важный принцип: дизайн на провал, и ошибки обязательно будут. Чтобы предотвратить каскадные сбои системы, нам необходимо ограничить ресурсы, которые зависимые службы могут использовать для защиты самого приложения. Обычно необходимо учитывать следующие цели:
Ниже приведено краткое введение в принцип реализации Hystrix. Подробнее см. В официальной документации.
Параметры Hystrix можно динамически контролировать через центр конфигурации
Об обновлении API документации
Как пользователь api, разработчики часто обнаруживают, что документы устарели или даже неверны. программист Не люблю писать документы, потому что им нравится писать код, поэтому лучше всего использовать код для Автоматически генерируется Документы. Использование Spring Restdocs может автоматически генерировать документацию с помощью тестового кода, также есть преимущество, если поле увеличивается или уменьшается в интерфейсе, если нет синхронный Если вы обновите тест, тест не пройдет, поэтому вы можете быть уверены, что документ всегда актуален.
Сгенерированный документ API
Проблема с провайдером API
В компании или организация Внутренне, наибольшее беспокойство для провайдеров API заключается в том, чтобы не найти точно, кто такие потребители и как потребители используют свои API. Не говоря уже о ситуации после кадровых перестановок в компании. В реальном случае разработчик исправил орфографическую ошибку слова в поле. После публикации результата проверяющая сторона использовала это поле, что делало службу проверяющей стороны недоступной. На самом деле, после того, как такие сцены и события происходят много раз, разработчики будут напуганы, и они не исправят некоторые необоснованные замыслы и ошибки и позволят этому уйти.
На самом деле, коренной причиной этой проблемы является проблема модели сотрудничества между поставщиками услуг и потребителями. Мы надеемся, что существует какой-то механизм для решения этой проблемы. Если потребитель службы может уведомить поставщика услуг о сценарии использования API и реализовать его в тестовом коде, то поставщик услуг может быть осведомлен о сценариях использования каждого API проверяющей стороны. На самом деле, это дух контракта: поставщик услуг и проверяющая сторона должны все больше и больше обмениваться информацией и внедрять результаты обмена информацией в тестовый код. Конечно, есть несколько мощных инструментов и платформ, которые поддерживают наше видение. Контрактное тестирование предназначено для достижения этих целей. Для конкретных документов использования, пожалуйста, обратитесь к Spring Cloud Contract
Непрерывная интеграция
Нет необходимости говорить о преимуществах непрерывной интеграции, ключ к реализации.
Больше дохода
ссылка
Eric Evans — Tackling Complexity in the Heart of Software
microXchg 2017 – Juven Xu: AliExpress’ Way to Microservices
Русские Блоги
Практика обслуживания баз данных Youzan
Ян Цилонг
(Экранное имя: Север на Юге)
Работал в Hangzhou Youzan Technology DBA.
В основном отвечает за проектирование архитектуры базы данных
И работы по развитию платформы эксплуатации и обслуживания
Хорош в настройке производительности базы данных и диагностике неисправностей.
Увидимся в четверг | Серия открытых классов Чжишутан Из
Замечательные интерактивные вопросы и ответы
1. Как реализован запрос к подтаблице? К
Промежуточное программное обеспечение направляется в конкретную таблицу в соответствии с конкретным sharding_id. Вы можете обратиться к более популярному промежуточному программному обеспечению. Фактически, их общая логика одинакова, а sharding_id модулируется в соответствии с определенным алгоритмом.
2. Г-жа Ян, какая информация в основном собирается, когда моментальный снимок быстро обнаруживает проблему? Как собрать? К
Индикаторы основных данных thread_running, загрузка процессора хоста, размер памяти, использование io (вы можете использовать модуль Python psutil для получения информации о процессоре, памяти и размере диска).
3. Я чувствую, что г-н Ян много чего там делает, в том числе 2 платформы управления, один прокси и разные вещи, например, агент. Я хотел бы спросить господина Яна, как насчет нынешних членов команды? К
Два администратора баз данных отвечают за эксплуатацию и обслуживание базы данных и разработку zandb, а два разработчика промежуточного программного обеспечения отвечают за разработку rds.
4. Как рассчитывается размер отверстий в столе? Обеспечивается ли высокая доступность двух компьютерных залов по выделенной линии или через Интернет? Спасибо! К
5. Какой режим LVS использует в кластерах с высокой доступностью и как обеспечить высокую доступность LVS? К
Режим full nat, используемый на уровне LVS, и режим keepalived, используемый в режиме ha, будут позже изменены на режим ECMP.
6. https://pan.baidu.com/s/1qs1uzdvhoU4FGhXi9sjyMg#, как показано на рисунке, как показано на рисунке. Я хотел бы спросить г-на Яна, сколько всего таких таблиц существует, где вы находитесь? Вы считаете прямо из базы данных?
Это результат поиска? Большинство из них рассчитываются из базы данных, а некоторые получаются из результатов запроса в es.
7. Есть две проблемы:
1) Как учителя защищают конфиденциальные данные? К
2) Что за процесс представляет собой стресс-тест полного соединения? Сделайте краткое введение
1) Это не решалось на уровне отображения страницы, мы контролируем это на основе разрешений разработанной линейки продуктов.
2) Полный стресс-тест ссылки, см. Https://tech.youzan.com/stress_testing/
8. Требуется ли для разработки rds технология полного стека? Мне вообще нужно самому делать интерфейс? К
В настоящее время мы выполняем как интерфейс, так и серверную часть, и интерфейсная страница также создается нами, поэтому все еще существует порог технических требований. К
Для zandb я описал стек технологий, который мы использовали на ppt, вы можете обратиться к нему.
9. Как обеспечить своевременную синхронизацию структуры таблиц разработки и тестирования продукции? К
Обзор прямой трансляции Увидимся в четверг | Открытый класс
Я впервые увидела фото учителя Яна
Он выглядит как студент колледжа, но уже является элитой отрасли.
Открытый классный обмен понятен, хорошо организован и полон галантерейных товаров.
Кругом много поклонников, Все пятизвездочные похвалы
Видео-повторы и раздаточные материалы PPT онлайн, приходите и смотрите
Напоминание: содержание PPT ограничено. Для лучших результатов рекомендуется смотреть видео в сочетании с PPT!
Конспекты лекций этого публичного класса и записанныеВидеоПерейдите в Tencent Classroom, чтобы загрузить и просмотреть, ссылка:
https://ke.qq.com/course/329196 ( Открыть страницу-просмотр задачи-видео / лекции PPT можно посмотреть)
Отсканируйте QR-код ниже, чтобы идентифицировать
Или нажмите в конце статьи “Прочтите оригинал”Прямой доступ в класс Tencent
Присоединяйтесь к группе технического обмена QQ
(Номер группы QQ:650149401)
Русские Блоги
Решение Youzan WeChat Store для Android
I. Обзор
В настоящее время основной рабочий контент мобильного терминала Youzan находится в двух основных бизнес-направлениях: Youzan WeChat Mall и Youzan Retail. С ростом бизнеса Youzan Saas клиент также подвергается повторным итерациям и поддерживает все больше и больше Функция.
В контексте быстрого роста бизнеса общая архитектура мобильных технологий также постоянно корректировалась, чтобы обеспечить эффективность разработки и быстрое повторение бизнес-процессов.
Эта статья в основном знакомит с некоторыми идеями и реализациями компонентов Android Youzanwei Mall.
1.1 Статус
Архитектура клиента, начиная с начального режима «Все В ОДНОМ» (то есть весь код находится в Приложении), постепенно превратилась в текущую многомодульную структуру Единого Проекта:
1.2 Болевые точки
Новая структура проекта также порождает новые проблемы:
1.3 Проблемы, которые необходимо решить
2. Корректировка структуры
Хотя мы и раньше занимались разработкой всей модульности проекта, текущую модульную структуру можно назвать неполной:
Для решения вышеуказанных проблем нам необходимо скорректировать существующую структуру.
2.1 Абстракция модуля
Функция модуля абстрагируется от некоторых базовых классов для формирования модульного вспомогательного компонента. Он обеспечивает следующие функции:
2.2 Децентрализация государственных услуг
Я разговаривал со многими одноклассниками на стороне клиента, после того, как многие приложения разовьются до определенной стадии, неизбежно родится так называемый общий модуль. Это как большой шкафчик, каждый кладет в него то, что могут использовать другие люди.
У такого метода есть две проблемы:
2.2.1 Что общего?
2.2.2 Решения
2.3 Обслуживание бизнес-модулей
Термин «сервис-ориентированный» часто упоминается при разработке сервера. Короче говоря, он делится на несколько модулей в соответствии с бизнесом, и взаимодействие между модулями завершается предоставлением услуг друг другу.
С увеличением количества бизнес-модулей на стороне клиента неизбежно будут существовать бизнес-зависимости между бизнес-модулями, и традиционный способ зависимости модулей на стороне Android:
2.3.1 Реализация сервисной зависимости бизнес-модуля
2.3.2 Реализация уровня API
Есть много способов предоставить услуги внешнему миру:
2.3.3 Способ реализации API
Проблема протокола: если место, где предоставляется услуга, изменено, вам нужно вручную запросить все места, которые вызываются для внесения изменений, и нет управления версиями, и анализ данных необходимо преобразовать вручную.Стоимость изменения относительно высока, и есть определенные Риск стабильности.
Проблема метода интерфейса: требуется дополнительная зависимость (уровень API упакован отдельно в пакет aar), и пользователю необходимо добавить зависимость Mave, поэтому стоимость внедрения зависимости и публикации относительно высока.
Наконец, мы выбрали метод интерфейса. Этот метод обеспечивает лучшую стабильность и контроль версий. Для изменений процесс компиляции автоматически поможет вам проверить влияние изменений, а также внести зависимости и высокие затраты на выпуск. Это можно решить с помощью инструмента сборки (Gradle Plugin).
2.3.4 Уровень бизнес-реализации
На уровне бизнес-реализации необходимо реализовать бизнес-логику своего собственного модуля и реализовать интерфейс API, который он предоставляет для предоставления внешних сервисов.
2.4 Базовая абстракция компонентов
2.4.1 Реализация существующих базовых компонентов
Многие базовые компоненты проекта теперь инкапсулированы в Common, например: библиотека учетных записей, сетевая библиотека, загрузка изображений, библиотека веб-контейнеров и т. Д. Это также создает некоторые проблемы:
2.4.2 Идеи реализации
2.4.3 Структура зависимости
2.5 Одномодульная / многомодульная упаковка
С ростом объема и сложности бизнеса, а также с появлением множества сторонних компонентов количество инженерного кода на стороне клиента становится все больше и больше.Прямая проблема: медленная упаковка! Простой сценарий: после разработки функции внутри модуля продукта вам необходимо упаковать все приложение для его тестирования, а время упаковки пакета может составлять 5–10 минут. Если вы упаковываете его 10 раз в день, это более кислотно. Круто. Наши компоненты также должны поддерживать отдельный модуль или отдельные пакеты для упаковки. Идея состоит в том, чтобы настроить подключаемый модуль Gradle для динамического изменения подключаемого модуля Android Gradle, от которого модуль фактически зависит на этапе компиляции.
2.6 Схема архитектуры
Некоторые из вышеперечисленных улучшений сведены в картинку, которая выглядит так:
Три, план реализации
В настоящее время наше решение предоставляет 3 зависимости основных компонентов и 1 подключаемый модуль Gradle:
3.1 Modular-core
3.1.1 Реализация класса модуля
Класс бизнес-модуля должен унаследовать BaseModule:
Русские Блоги
Youzan MySQL классический анализ ситуации
Нажмите Follow для более захватывающего содержания
Ван Хангвей
Работает в Ханчжоу Youzan Technology DBA
Отвечает за эксплуатацию и обслуживание базы данных MySQL. И написание автоматизированной платформы эксплуатации и обслуживания
Более глубокое понимание показателей
Увидимся в четверг | Серия открытого класса Чжишутан это
«Youzan MySQL классический случай эксплуатации и обслуживания 》
Этот общедоступный класс посвящен рассмотрению различных проблем, возникающих при поддержке бизнеса баз данных Youzan, таких как влияние отключения сети на незавершенные транзакции? Как найти SQL, который является основной причиной проблем с производительностью, и использовать strace для устранения проблем с производительностью.
Анализируя различные проблемы, я представлю ямы, в которые мы попали в процессе эксплуатации и технического обслуживания, и предоставлю идеи для решения проблем.
Замечательные интерактивные вопросы и ответы
1. Есть ли способ узнать, отключена ли эта вещь из-за дрожания сети?
Host of show processlist перечисляет IP-адрес клиента и информацию о порте. Вы можете войти на клиентский компьютер и проверить состояние порта через netstat, чтобы определить.
2. Не заблокирован ли сервер MySQL? Недостаточно ли системных ресурсов? Активные сессии сервера высоки, и сервер умирает. Клиент не может подключиться, это можно решить только с помощью kill SQL?
Определенные системные ресурсы могут поддерживать определенные TPS и QPS, и это может быть аппроксимировано давлением. Если уровень использования ресурсов сервера высок, а TPS и QPS низки, необходимо оптимизировать SQL. Если MySQL реагирует медленно, вы можете использовать kill SQL, чтобы смягчить явление, или вы можете связаться с бизнес-стороной, чтобы помочь в устранении неполадок и остановке проблемного процесса приложения.
3. Есть ли хороший метод мониторинга потери сетевых пакетов?
4. Как рассчитывается количество медленных строк проверки?
В журнале медленного поиска MySQL есть два значения в Rows_sent и Rows_examined, которые можно вычислить и вычислить с помощью pt-query-digest.
5. Поддерживает ли удивительный прокси Query Cache? 1-секундный кэш только что упоминался, используя этот кеш?
Прокси не поддерживает QC. Кэш длительностью 1 секунда относится к кешу, реализованному с использованием инструмента кеша, такого как redis.
6. Объясните, что при использовании сортировки файлов создается временная таблица дисков, или она создает временную таблицу дисков только тогда, когда недостаточно буфера сортировки? #using временное относится к временной таблице на диске?
Использование файловой сортировки только что сказало, что индекс не может быть использован для завершения сортировки. Если пространство, требуемое для сортировки, больше, чем sort_buffer_size, необходимо создать временную таблицу на диске. Использование временного указывает на то, что для хранения результирующего набора необходима временная таблица, а также могут существовать память и диск.Это управляется параметрами tmp-table-size и max-heap-table-size, такими как объединение, вставка в xx, выбор xx и т. Д.
7. Как работает снимок innodb_trx?
Мониторинг в реальном времени состояния памяти, дискового ввода-вывода, ЦП, thread_running и т. Д. Как только превышен установленный порог, информация, такая как innodb_trx, состояние innodb движка, сохраняется для последующего анализа проблемы.
8.rr Будут ли какие-либо проблемы с изменением rc (независимо от условий бизнеса), и это повлияет на репликацию master-slave?
Binlog_format в нашей строке использует режим ROW, и пока он работает стабильно без каких-либо исключений из библиотеки.
9. На чем фокусируется innodb_trx?
Основными проблемами являются:
10. Сколько сетей использует MySQL Cluster? Например, является ли сеть, в которой репликация главный-подчиненный, отделена от сети, предоставляющей внешние службы?
11. Что касается запросов, связанных с большими таблицами MySQL, какие предложения по оптимизации?
Если его можно разобрать, он будет разбит на один запрос к таблице, а если его невозможно разобрать, он будет оптимизирован с точки зрения таблицы управления и индекса, с использованием таких средств, как покрытие индекса и исключение того, что поле сортировки не принадлежит таблице управления.
12. Какое промежуточное программное обеспечение базы данных используется вашей компанией? Это разработано вами или с открытым исходным кодом?
Наше промежуточное ПО для прокси разработано на основе cobar и atlas.
Прямая трансляция обзора Увидимся в четверг | Открытый класс
Учитель Ван Хангвей, кусок свежего мяса
“ Внешность студента колледжа Один из 2 администраторов во рту Учителя Ян Цилун
(Обзор обмена Учитель Ян)
Два учителя тщательно подготовили эти два праздника галантереи
Даже для того, чтобы поделиться прогрессом в соответствии с графиком, время формирования группы отдела было специально изменено
Спасибо двум учителям за вашу поддержку
1 час, чтобы поделиться сухими товарами
«Как выпрыгнуть из ямы и улучшить навыки
Какие документы я могу узнать
Самое главное, как мы можем это сделать, не принимая его? «
Здесь Учитель Е. и Ву тщательно обещают
Zhishutang продолжит делиться галантереей
Оставайтесь с нами«Увидимся в четверг | Открытый класс»
Воспроизведение видео и раздаточные материалы PPT онлайн. Заходите и смотрите
Советы: содержание PPT ограничено, рекомендуется смотреть видео вместе с PPT, эффект лучше!
Лекции этого публичного класса, а также записанныевидеоклипыМожно скачать и просмотреть с Tencent Classes, ссылка:
https://ke.qq.com/course/331538 ( Откройте страницу-Просмотр задач-Видео / PPT лекционные заметки можно посмотреть)
Отсканируйте QR-код ниже, чтобы определить,
Или нажмите в конце текста “Читать оригинал”Прямо в класс Tencent
Присоединяйтесь к QQ Technical Exchange Group
Отсканируйте код, чтобы присоединиться к 4 группам каньона Чжишутан-Кингс
(Номер группы QQ:650149401)