Эта статья в основном представляет, как сохранить данные сущности. Конкретный контент заключается в следующем;
1. Образец XML
<? xml version = "1.0" Encoding = "gbk"?> <!-1..1-> <cisreports batno = "Query Parath Number" UnitName = "Query Unit name" suborgan = "Имя потока" QueryUserid = "Query name" QueryCount = "Query number Querymem HH24: MM: SS "> <!-Ниже приведены результаты запроса для каждого приложения для запроса 1..n-> <cisreport ReportId =" Номер отчета "buildendTime =" Время окончания отчетов, форматирование yyyy-mm-dd hh24: mm: ss "QueryReasonId =" Query Ideper, см. Data Depare Subreportpes = Query Preportpore. Идентификаторы разделены с запятыми "CreateResult =" Компактное время платы подрепорта, соответствующее субрепортационным типам, является набором значений, превышающих или равен 0, разделенные запятыми "subReportTypessHortCaption =" Запрос. False: нет ошибки "isfrozen =" Будь то клиент заморожен, True: Frozen, false: не заморожен "> <!-1 КОНФОРМА <!-2 идентификация аутентификации1..1-> <policecheckinfo subreporttype = "10602" subreporttypecost = "96040" teealresult = "Статус запроса subReport, 1: Найти, 2: не найдено, 3: не найдены по другим причинам" "Ошибка кода". Это свойство не существует "errormessage =" Описание ошибки Информация о том, что treatresult = 3, когда treatresult! = 3, значение этого свойства пусто несовместимый </result> </item> </policeCheckinfo> <!-3 лица. Проверка номера мобильного телефона 1..1-> <mobilecheckinfo subreporttype = "13612" subreporttypecost = "96040" teaterresult = "subreport Query, 1: Найти 2: не найдено, 3: не найдено для" Посмотрано Словарь данных для деталей. errormessage = "Описание ошибки Информация о том, как treatresult = 3, когда Treatresult! verification results, including: consistent, inconsistent, and inconsistent</documentNoCheckResult> <phoneCheckResult>Mobile number verification results: consistent, uncheckable</phoneCheckResult> <areaInfo>Number Attribution</areaInfo> <operator>Operator 1: China Telecom 2: China Mobile 3: China Unicom</operator> </item> </mobileCheckInfo> <!-Сводка 4 личных рисков против мошенничества 1..1-> <personAntispoofingDescinfo subReportType = "14225" subRepttyPecost = "96040" teaterresult = "Статус запроса subReport, 1: Найден, 2: не найдено, 3: не найдено по другим причинам" код ошибки, когда TreaterRodCode = "TREATRES, 3: 3: 3: не найдено по другим причинам" код ошибки, когда TreaterRodCode = "Treatres, 3: 3: 3: 3: 3: 3: 3: 3: 3: 3: 3: 3: 3. Treatsult! = 3, атрибут не существует. Как и в следующем примере, он может быть пустым, и может быть 0 или N из них, которые могут быть возвращены в соответствии с конкретным результатом. 1. Оценка риска против мошенничества составляет 100 баллов, уровень риска высок, и рекомендуется отказаться. 2. Telecom Mobile Thefice Number 131 **** 1542 использовался менее 1 месяца. 3. Нажмите на список шерстяных вечеринок. 4. Список рисков мошенничества. 5. Список персонала высокого риска. 6. Есть 7 просроченных кредитных записей. 7. Есть 40 сводных информации о личном риске. 8. За последние два года моя личная информация была запрошена 23 раза. -> <PersonAntIspoofingDesc> Личная информация об обзоре против мошенничества </personAntispoofingDesc> </personAntispoofingDesc> <!-5 Личная информация о оценке риска против мошенничества. Проверено по другим причинам «Код ошибки, когда TreaterRorCode =» Treatresult = 3, см. Словарь данных для получения подробной информации. errorrormessage = "Описание ошибки Информация о том, что Treatresult = 3, когда Treatresult! = 3, значение этого свойства пустое"> <! ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 6 Информация о состоянии мобильного телефона. errorrormessage = "Описание ошибки Информация о том, что Treatresult = 3, когда Treatresult! = 3, значение этого атрибута пусто"> <!-Когда Treatreatresult составляет 2 или 3, не существует следующих узлов-> <пункт> <оператор> Оператор 1: Китайский телеком 2: Китай Мобил 3: Китай Unicom </operator> <leafee> Mobile Numberesteestes> Mobile. 1: Нормальное использование 2: выключение 3: не включено 4: число отменено 5-то другое 6: предварительная канцелярия </phonestatus> <mitelgenget> мобильный номер в Интернете, такой как: время в Интернете, менее 1 месяца, 1-2 месяца, 3-6 месяцев, 7-12 месяцев </timel> <Canceltime>, если отмене числа </canceltime> </item> </mobilest>-7-12 месяцев </mobilest> <cenceltime>. Список шерстяных партий 1..1-> <econnoisserurinfo subreporttype = "14228" subreporttypecost = "96040" teaterresult = "Статус запроса субрепорта, 1: Найти, 2: не найдено, 3: не найдено по другим причинам" "Код ошибки =" Код ошибки, когда лечится = "TRETRESULT = 3, см. ДАНКИ ДАНКИ ДАНКИ ДАННЫХ ДАНА. Когда Treatresult! = 3, атрибут не существует "errorrormessage =" Описание ошибки информация, когда Treatresult = 3, когда Treatresult! = 3, значение этого атрибута пустое "> <!------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- subReportType="14229" SubReportTyPecost = "96040" teaterresult = "Статус запроса субрепорта, 1: Найти, 2: не найдено, 3: не найдено по другим причинам" "TreaterRorCode =" treatresult = 3 Код ошибки, см. Словарь данных, когда Treatresult! Это свойство пустое «> <!-Когда TreatreAtreSult составляет 2 или 3, нет следующих узлов-> <Tather>, следует ли попасть в список рисков мошенничества, значение: 0/1, 0 означает, что список рисков мошенничества 1 означает, что нанесите список рисков мошенничества </state> </froodriskinfo> <!-9, чтобы попасть в список высокого риска 1…> <Personriskess. SubReportTyPecost = "96040" teaterresult = "Статус субрепортации, 1: Найти, 2: не проверено, 3: не найдено по другим причинам" "TreaterRorCode =" treatresult = 3, см. Словарь данных, когда Treatresult! Этот атрибут пуст "> <!-Когда TreatreAtreSult составляет 2 или 3, нет следующих узлов-> <CheckResult>, следует ли попасть в список высокого риска 1: Да, 2: нет </checkresult> </personriskassess> <!-10 онлайн-кредита 1..1-> <micronearlyThreeyeArsErdeverdueNfoinfo subReportTyp =" 13204 "13204" 13204 "13204" subRepttyPecost = "96040" teaterresult = "Статус запроса подрепорта, 1: Найти, 2: не найдено, 3: не найдено по другим причинам" Код ошибки, когда TreaterRorCode = "treatresult = 3, см. Данные данные для подробностей. Когда Treatresult! = 3, атрибут не существует. "Errormessage =" Описание ошибки Информация о том, что Treatresult = 3, когда Treatresult! = 3, значение этого атрибута пусто "> <! Основная информация о займе </OverdueAMount> <purdedudays> просмотр дневных интервалов, диапазон значений: просроченный один день (включительно) или более </overdudayays> <Overduecount> Общее количество транзакций в количестве просмотра дни </uperduecount> </stat> <!-0..1-> <пункт> <! <overdueAmount>Overdue principal, unit: based on the currency of the basic information of the loan</overdueAmount> <overdueDays>Overdue days interval, value range: 1-6 days overdue, 7-29 days overdue, 30-59 days overdue, 60-89 days overdue, more than 90 days overdue (inclusive)</overdueDays> <overdueCount>Number of transactions in the Провал в дни просроченных дней </Overduecount> </item> </item> </micronearlythreeyearsoverdueinfo> <!-11 Информация о риске 1..1-> <PersonRiskinfo subreportType = "14227" subReportTypecost = "96040" Когда TreaterRorCode = "treatresult = 3, для получения подробной информации см. Словарь данных. Когда Treatresult! = 3, атрибут не существует. <! --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------. <cqggcount> Количество информации о объявлении о найме </cqggcount> <wdyqcount> Количество информации о просроченном онлайн-кредите </wdyqcount> </stat> <!-Конец суммарной информации-> <!-Суммарная информация 0..1-> <!-Сводная информация 0..1-> <! <Tem> <sististId> номер записи </recordId> <bt> title </bt> <Ajlx> тип случая </ajlx> <sjnf> Год обзора, формат: yyyy </sjnf> <dsrlx> Тип партии </dsrlx> </item> </als> <!-Summary information 0..s-> </item> </als> <!-Summary. информации о судебном исполнении 1..N-> <Tem> <peristId> Номер записи </recordid> <bt> title </bt> <zxbd> Объект выполнения: валюта должна преобладать </zxbd> <larq> Дата регистрации, формата yyy-mm-dd </larq> </item> </zxs> <! <!-Сводная информация о судебном нарушении информации о доверии 1..N-> <Tem> <previntId> Номер записи </recordd> <bt> title </bt> <larq> Дата подачи заявки, форматирование yyyy-mm-dd </larq> <fbrq> Дата выпуска, формат yyyy-mm-dd </fbrq> </itember> </sxs> <!-Информация о налоге. -> <SWS> <!-Налоговая административная информация о информационной информации Содержание информации 1..N-> <Item> <peristId> № записи </recordd> <bt> title </bt> <ggrq> Дата объявления, форматирование информационная информация о плате. Сводная информация Содержание 1..N-> <Item> <sistird> Номер записи </recordid> <bt> title </bt> <fbrq> Дата выпуска, формат yyyy-mm-dd </fbrq> </item> </cqs> <!-Заверженная информация Сводная информация о онлайн-займах 0..1-> <wdyqs> <!-Overdudue Information). <formid> Номер записи </recordid> <bt> title </bt> <fbrq> дата выпуска, форматирование yyyy-mm-dd </fbrq> </item> </wdyqs> </summary> </personriskinfo> <!-Исторические записи Query Query. SubRepttyPecost = "96040" CreateResult = "Статус субрепортации, 1: проверка, 2: не найдено, 3: не найдено по другим причинам" "Код ошибки =" treatresult = 3, см. Словарь данных для подробностей, когда Treatresult! Пусто "> <! --- Когда TreatreAtreSult составляет 2 и 3, нет следующих узлов-> <!-0..1-> <пункты> <!-1..n-> <пункт> <Unitmember> Название типа блока </intemember> <last1month> Номер записи запроса в прошлый месяц </last1month> <last3month> номер Query в последние три месяца </last1month> <last3month> Query Records в последних трех месяцах <//lest 3-month> <ship> <ship 3month> Query № Записи Query за последние 6 месяцев </last6month> <aster12month> количество записей запросов за последние 12 месяцев </last12month> <last18month> количество записей запросов за последние 18 месяцев </last18month> <aster24month> Номер записей запросов за последние 24 месяца </last24pry> </item> </itpentth> <! Записи запроса за последние 1 месяц </last1month> <last3month> общее количество записей запросов за последние 3 месяца </last3month> <last6month> Общее количество записей запросов за последние 6 месяцев </last6month> <aster12month> Месяцы </last18month> <aster24month> Общее количество записей запросов каждого типа блока за последние 24 месяца </last24month> </count> </astorysimplequeryinfo> </cisreport> </cisreports>
2. Конструкция структуры таблицы
1. Партийный номер: каждая таблица связана с самым внешним номером партии.
2. Основная таблица: то есть все поля каждого слоя хранятся в одной таблице.
Три, физический дизайн
Он разделен на три слоя: Cisreportroot, CisreportChild, ReportElement
открытый класс cisreportroot Extens BasePojo реализует Serializable {Private String DocID; частная строка Batno; // Query Parath Number @jsonfield (serialize = false) частная строка xmlid; Частный cisreportchild cisreportchild;/*** 2017/7/21. *Сообщите о свойствах узлов и детских узлах*/public Class CisreportChild расширяет базовый {/***Время окончания генерации отчета **/частная строка Buildendtime; / ***Есть ли системная ошибка, правда, что существует ложь, которая означает, что нет **/ частной строки hassystemerror; / ***Заморожен ли клиент **/ Private String isfrozen; Private ReportElement ReportElement; открытый класс ReportElement Extens BasePojo {Private String Phone; private PoliceCheckInfo policeCheckInfo;//Identity authentication private MobileCheckInfo mobileCheckInfo;//Person mobile phone number verification private PersonAntiSpoofingDescInfo personAntiSpoofingDescInfo;//Personal Anti-fraud risk review information private PersonAntiSpoofingInfo personAntiSpoofingInfo;//Personal Anti-fraud risk score information private MobileStatusInfo MobileStatusInfo; // Статус мобильных телефонов Информация о статусе. MicronearlythreeyearsOverdueInfo; // онлайн -займа просроченныйЧетыре, код
<1> Единственная транзакция, первичный ключ не требуется в партиях
Данные могут храниться в картах в отдельных транзакциях или партиях, и данные могут быть получены с помощью клавиш MAP в SQL.
нравиться:
private void savePersonRiskinfo (String Batno, PersonRiskinfo PersonRiskinfo) бросает исключение {map <string, object> map = new Hashmap <> (); map.put ("batno", batno); // одноручная map.put ("item", personRiskinfo); pymapper.savepersonriskinfo (map); if (! listutil.isempty (personRiskinfo.getallist ())) {// pactor map.put ("list", personRiskinfo.getallist ()); pymapper.savealinfolist (map); }SQL:
<!-Личная запись риска-> // Single <INSERT ID = "SavePersonRiskinfo" parameterType = "java.util.map"> insert в table_person_risk_info (batno, totlecount, alcount, zxcount, sxcount, swcount, cqggcount, wdyqcount) ( #{batno, jdbctype = varchar}, #{item.totlecount, jdbctype = numeric}, #{item.alcount, jdbctype = numeric},#{item.zxcount, jdbctype = numeric},#{item.sxcount, jdbctype = numeric},#{ item.swcount, jdbctype = numeric},#{item.cqggcount, jdbctype = numeric},#{item.wdyqcount, jdbctype = numeric}) </insert> <!-Подробная запись о рассмотрении-> // batch <insert id = "savemicronearlythreeyearsoverdueinfolist" parametertype = "java.util.map"> insert in table_mntyoi (batno, viredueamount, overdedays, uperducount) <foreeach collection = "item iteal" itement "item stemtemount". #{batno, jdbctype = varchar}, #{item.overdueamount, jdbctype = varchar}, #{item.overdudays, jdbctype = varchar}, #{item.overduecount, jdbctype = numeric} from dual) </foreach> </insertitrttritrtritrtritr Invokepy (pyquerybean pyquerybean) бросает исключение {pyquerybean.setQueryFrompy (Query_from_py); // Позвоните в SERVICE CISREPORTROOT CISREPORTROOT = QUERYCISROPORTFROMPYSERVER (PYQUERYBEAN); cisreportroot.getCisReportChild (). getReportElement (). SetPhone (pyquerybean.getphone ()); //cacheservice.save(cisreportroot); // (1) Сохранить данные SaveCisReport (cisreportroot); вернуть cisreportroot; }(1) Сохранить данные
@TransActional (ROLLACKFOR = EXCENCE.CLASS) @Override public cisreportroot savecisreport (cisreportroot cisreportroot) выбрасывает исключение {try {reportelement = cisreportroot.getCisReportChild (). GetReportElement (); PersonRiskinfo PersonRiskinfo = ReportElement.getPersonRiskinfo (); // (2) Основная таблица, сохраните всю информацию о узлах XML (за исключением информации о личном риске), сохранить отдельные данные pymapper.savecisreport (cisreportroot); if (success.equals (cisreportroot.getCisReportChild (). getReportElement (). getPersonRiskinfo (). getTreaTreSult ())) {savePersonRiskinfo (cisreportroot.getbatno (), personRiskinfo); } if (cisreportroot.getCisReportChild (). getReportElement (). gethistorySimpleQueryInfo (). getTreatResult (). equals (успех)) {map <string> map = new hashmap <> (); // (3) Сохранить пакетную карту данных.put ("batno", cisreportroot.getbatno ()); if (! listutil.isempty (cisreportroot.getCisReportChild (). getReportElement (). GethistorySimpleQueryInfo (). getItemList ())) {map.put ("list", cisreportroot.getCisReportChild (). getReportElement (). GethistorySimpleQueryInfo (). getItemList ()); pymapper.savehistorysimpleQueryInfist (MAP); } if (! listutil.isempty (cisreportroot.getCisReportChild (). getReportElement (). getMicroneArlyThreeArseverDueInfo (). getList ())) {map.put ("list", cisreportroot.getCisReportChild (). getReportElement (). getMicroneArlyTheReyEarsOverdueInfo (). getList ()); pymapper.savemanearlythreeyearsoverdueinfolist (map); }} вернуть cisreportroot; } catch (Exception e) {logger.error ("saveCisReport@pyserviceimpl_exception", e); бросить E; }}(2) Сохранить основную таблицу
<INSERT ID = "SaveCisReport" parameterType = "java.util.map"> вставьте в table_cisreport (batno, buildendtime, isfrozen, MCI_NAMECHRESULT, MCI_AREAINFO, MCI_DOCUMENTOCHECKRESULT, MCI_OPERATO Ms_areainfo, ms_canceltime, ms_operator, ms_phonestatus, ms_timelength, econnoisserur, rushrisk, pra_checkresult, mntyoi_overdueamount, mntyoi_overduecount, mntyoi_overduecount, mntyoi_overday Hs_last1month, hs_last3month, hs_last6month, hs_last12month, hs_last18month, hs_last24month, телефон, xmlid) значения (#{batno, jdbctype = varchar}, to_date (#{cisreportchild.build.build. HH24: Mi: SS '), #{cisreportChild.isfrozen, jdbctype = varchar}, #{cisreportchild.reportelement.mobilecheckinfo.namecheckresult, jdbctype = varchar}, #{cisreportchild.reportelement.mobilecheckinfo.areainfo, jdbctype = varchar}, #{cisreportchild.reportelement.mobilecheckinfo.documentnocheckresult, jdbctype = varchar}, #{cisreportchild.reportelement.mobilecheckinfo.operator, jdbctype = numeric}, #{cisreportchild.reportelement.mobilecheckinfo.phonecheckresult, jdbctype = varchar}, #{cisreportchild.reportelement.policeCheckinfo.documentno, jdbctype = varchar}, #{cisreportchild.reportelement.policecheckinfo.result, jdbctype = numeric}, #{cisreportchild.reportelement.personantispoofingdescinfo.personantispoofingdesc, jdbctype = varchar}, #{cisreportChild.ReportElement.personantispingInfo.hittypes, jdbctype = varchar}, #{cisreportChild.ReportElement.personAntispoofinginfo.risklevel, jdbctype = varchar}, #{cisreportChild.ReportElement.personAspoofingInfo.Riskscore, jdbctype = varchar}, #{cisreportchild.reportelement.personantispoofinginfo.suggest, jdbctype = varchar}, #{cisreportchild.reportelement.mobilestatusinfo.areainfo, jdbctype = varchar}, #{cisreportchild.reportelement.mobilestatusinfo.canceltime, jdbctype = varchar}, #{cisreportchild.reportelement.mobilestatusinfo.operator, jdbctype = numeric}, #{cisreportchild.reportelement.mobilestatusinfo.phonestatus, jdbctype = numeric}, #{cisreportchild.reportelement.mobilestatusinfo.timelength, jdbctype = varchar}, #{cisreportchild.reportelement.econnoisserurinfo.state, jdbctype = numeric}, #{cisreportchild.reportelement.fraudriskinfo.state, jdbctype = numeric}, #{cisreportchild.reportelement.personriskassess.checkresult, jdbctype = numeric}, #{cisreportchild.reportelement.micronearlythreyearsoverdueinfo.overdueamount, jdbctype = varchar}, #{cisreportchild.reportelement.micronearlythreyearyearsoverdueinfo.overduecount, jdbctype = numeric}, #{cisreportchild.reportelement.micronearlythreyearsoverdueinfo.Overdudeadays, jdbctype = varcharh}, #{cisreportchild.reportelement.historysimplequeryinfo.totalcount.last1month, jdbctype = numeric}, #{cisreportchild.reportelement.historysimplequeryinfo.totalcount.last3month, jdbccype = numeric} #{cisreportchild.reportelement.historysimplequeryinfo.totalcount.last6month, jdbctype = numeric}, #{cisreportchild.reportelement.historysimplequeryinfo.totalcount.last12month, jdbctype = numbery. #{cisreportchild.reportelement.historysimplequeryinfo.totalcount.last18month, jdbctype = numeric}, #{cisreportchild.reportelement.historysimplequeryinfo.totalcount.last24month, jdbcct #{cisreportchild.reportelement.phone, jdbctype = varchar}, #{xmlid, jdbctype = varchar})(3) Сохранить пакетные данные (основные ключи не генерируются автоматически)
<!-Личная историческая запись запроса за последние два года-> <insert id = "savehistorysimplequeryinfist" parametertype = "java.util.map"> вставка в table_history_simple_query (batno, unit_member, last1month, last3month, last6-month, last12mondth, last2-nth-month, for last2-nth-month, last2-nth, last2-nth, for the last2-month, последний. collection = "list" item = "item" sepreator = "union"> (select #{batno, jdbctype = varchar}, #{item.unitmember, jdbctype = varchar}, #{item.last1month, jdbctype = numeric}, #{item.last3month, jdbcte #{item.last6month, jdbctype = numeric}, #{item.last12month, jdbctype = numeric}, #{item.last18month, jdbctype = numeric}, #{item.last24month, jdbctype = numeric} из dual) </teach> </teach> </teach> </teach> </teach> </teach> </teach> </teach> </teach> </teach> </teach> </teach> </teach> </teach> </teach <2> Одиночный ход, партия должна быть вставлена в первичный ключ
Единый ход содержит первичный ключ
DataServiceTailResult DataServiceDetAileResult = tdservice.getDataServiceTetailResult (tdreportroot); int n = tddataServicemapper.insertDataServiceDetAileResult (dataServiceTeTailResult); <!-Интерфейс проверки информации-> <!-DataService-> <INSERT ID = "INSERTDATASERVIUDETAILRESULT" PARAMETERTYPE = "DATASERVICEDETAILRESULT"> <selectKey KeyProperty = "id" resultType = "BigDecimal" order = "> select_ics_td_dataService. nextvale. nextvale. nextvale. nextvale. nextvale. nextvale. nextvale. nextvale. nextvale. Ics_td_dataservice (id, recordid, anouse_desc, anage_code, uccess) values ( #{id, jdbctype = decimal}, #{recordid, jdbctype = decimal}, #{recondesc, jdbctepe = varchar}, #{desearcode, jdbctype = varChar}, varchar #{успех, jdbctype = decimal}) </insert>Пакетное сохранение содержит первичный ключ
if (! listutil.isempty (interfaceslist)) {map.put ("recordid", id); map.put ("list", interfaceslist); tddataServiceMapper.addbatchInterfaces (map); }SQL:
<!-PATCH SAVE Интерфейсы-> <INSERT ID = "ADDBATCHINTERFACES" PARAMETERTYPE = "java.util.list"> <!-Комментарий-это метод вставки MySQL. Это может быть вставлено, но данные не могут быть откатываны. Ниже приведен метод вставки Oracle: Обратите внимание, что параметрический тип: java.util.list или java.util.map может быть начал <foreach collection = "list" item = "item" index = "index" sepreator = "> insert int intd_interfaces (id, recordid, type) values. #{recordid, jdbctype = decimal}, #{item.type, jdbctype = varchar}); </foreach> Commit; End;-> insert в ics_td_interfaces (id, recordid, type) select seq_ics_td_interfaces.nextval id, a.* from (<foreach collection = "list" item = "index =" index "sepreator =" union "> select #{recordid, jdbctepe = decimal}, #{item.ty.type, jdbctepe = decimal}, #{item.ty.type, jdbctepe = decimal}, lectype. Двойной </foreach>) a </insert>Суммировать
Приведенное выше метод сохранения физических данных в одной партии редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!