• Как отдавать приложение на Vue.js клиенту?

    mylp
    @mylp
    php + js = site + crm
    После сборки папка dist содержит файлы для размещения в корень серверной папки сайта. Самый простой способ пробросить симлинк с папки сайта на папку dist, то есть папка www (или htdocs) должна быть не папкой, а ссылкой на dist. Либо в северных настройках указать DocumentRoot на dist
    Ответ написан
    Комментировать
  • Как отправить событие gtm vue?

    mylp
    @mylp
    php + js = site + crm
    Создай переменную в объекте виндоу с указателем на функцию обработчик типа такого: mounted() {
    window.vuehookfunction = this.someMethod.bind(this);
    }

    И потом вызывай в gtag:

    gtag() {... window.vuehookfunction && window.vuehookfunction(params) ;}
    Ответ написан
    Комментировать
  • Как закрыть модалку кликом вне окна?

    mylp
    @mylp
    php + js = site + crm
    npm install clickaway
    Ответ написан
    Комментировать
  • Как в Vue + Framework7 вызвать метод из main.js?

    mylp
    @mylp
    php + js = site + crm
    попробуйте подключить этот модуль к Vue:
    Vue.use(Framework7)
    Ответ написан
    Комментировать
  • Объясните, почему не срабатывает await?

    mylp
    @mylp
    php + js = site + crm
    потому что setTimeout это не асинхронная функция и консолька тож. Посмотрите EventLoop JS
    Ответ написан
    Комментировать
  • Как скрывать выпадающий список при выборе какого-либо его пункта?

    mylp
    @mylp
    php + js = site + crm
    <template>
        <div class="sidebar">
            <button class="sidebar__button sidebar__button_info">данные о контакте</button>
            <div class="sidebar__button_status" :class="{'open-list': show}" @click="show = !show">
                {{ status}}
            </div>
            <ul class="sidebar__button_list_item">
                <li class="sidebar__button sidebar__button_list"
                    v-for="item in items"
                    :key="item"
                    @click="status = item">
                    {{item}}
                </li>
            </ul>
        </div>
    </template>
    
    <script>
    const items = ['в сети', 'занят', 'отсутсвую', 'в самолете', 'в пути'];
    export default {
      name: 'sidebar',
      data () {
        return {
          show: false, // для реактивности
          items,
          status: 'статус'
        }
      }
    }
    </script>
    Ответ написан
    Комментировать
  • Как в Delphi через WinSock получить страницу по SSL?

    mylp
    @mylp
    php + js = site + crm
    В нашем случае мы работали без Winsock с использованием компонента THTTPRIO, он включает поддержку SSL.
    Ответ написан
    Комментировать
  • Как использовать ЭЦП в файле .p12 в Delphi?

    mylp
    @mylp
    php + js = site + crm
    Решал похожую задачу используя CryptoCSP от компании CryptoPro (документация по теме). Это обертка на работу с сертификатами, можно попробовать поработать через CryptoAPI от Майкрософта, если разберетесь.

    Даю пару примеров, чтобы Вы поняли, в каком направлении двигаться:

    Пример 1.

    // Пример работы с сертификатами. Поиск по номеру сертификата.
    // В дельфи номер пишется в обратном порядке!
    class function TDigitalSigner.GetCertificateBySerialNumber(const aSerialNumber: string): PCCERT_CONTEXT;
    var
    	hStore: hcertstore;
    begin
    	hStore := CertOpenSystemStore(0, 'MY');
    	Result := CertFindCertificateInStore(hStore, X509_ASN_ENCODING or PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, PChar(aSerialNumber), nil);
    end;


    Пример 2.

    function EncryptAndSign(ASignCertContent: string; AEncCerts: TStringList; FileName, OutFileName: string; out ErrText: string): Boolean;
    var
    	hProv       : HCRYPTPROV;
    	hStoreHandle: hcertstore;
    	pSignerCert : jwawincrypt.PCCERT_CONTEXT;
    	encCert     : jwawincrypt.CRYPT_DATA_BLOB;
    	SigParams   : jwawincrypt.CRYPT_SIGN_MESSAGE_PARA;
    	pCertContext: PCCERT_CONTEXT;
    	Stream      : TMemoryStream;
    	Certificates: array [0 .. 100] of PCCERT_CONTEXT;
    	EncParams   : CRYPT_ENCRYPT_MESSAGE_PARA;
    	cbEncrypted : DWORD;
    	i           : integer;
    	pszObjId    : LPSTR;
    const
    	PROV_GOST_2001_DH = 75;
    begin
    	Result := false;
    	for i := 0 to 100 do
    		Certificates[i] := nil;
    
    	if not jwawincrypt.CryptAcquireContext(hProv, nil, nil, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT) then
    		exit;
    
    	hStoreHandle := CertOpenSystemStore(hProv, 'MY');
    	if (hStoreHandle = nil) then
    	begin
    		ErrText := 'ErrorOpenStore';
    		exit;
    	end;
    
    	for i := 0 to AEncCerts.Count - 1 do
    	begin
    		try
    			encCert := GetCertContent(FileToStr(AEncCerts.Strings[i]));
    		except
    			ErrText := 'ErrorCertLoad';
    			Continue;
    		end;
    
    		pCertContext := jwawincrypt.CertCreateCertificateContext(MYTYPE, encCert.pbData, encCert.cbData);
    		pCertContext := jwawincrypt.CertFindCertificateInStore(hStoreHandle, MYTYPE, 0, CERT_FIND_EXISTING, pCertContext, nil);
    		if (pCertContext = nil) then
    		begin
    			ErrText := 'ErrorCertInStoreNotFound';
    			Continue;
    		end;
    		Certificates[i] := pCertContext;
    	end;
    
    	encCert := GetCertContent(FileToStr(ASignCertContent));
    	// Открываем хранилище сертификатов
    	pSignerCert := nil;
    	pSignerCert := jwawincrypt.CertCreateCertificateContext(MYTYPE, encCert.pbData, encCert.cbData);
    	pSignerCert := jwawincrypt.CertFindCertificateInStore(hStoreHandle, MYTYPE, 0, CERT_FIND_EXISTING, pSignerCert, nil);
    	if (pSignerCert = nil) then
    	begin
    		exit;
    	end;
    
    	with TMemoryStream.Create do
    		try
    			LoadFromFile(FileName);
    			try
    				try
    					// Инициализация структуры, необходимой для цифровой подписи
    					pszObjId := szOID_RSA_MD5; // получение алгоритма сертификата
    					FillChar(SigParams, Sizeof(CRYPT_SIGN_MESSAGE_PARA), #0);
    					SigParams.cbSize := Sizeof(CRYPT_SIGN_MESSAGE_PARA);
    					SigParams.dwMsgEncodingType := MYTYPE;
    					SigParams.pSigningCert := pSignerCert;
    					SigParams.HashAlgorithm.pszObjId := pszObjId;
    					// для Сигнал - Com szOID_RSA_MD5;//  1.2.643.2.2.21
    					SigParams.HashAlgorithm.Parameters.cbData := 0;
    					SigParams.cMsgCert := 1;
    					SigParams.rgpMsgCert := @pSignerCert;
    					SigParams.cAuthAttr := 0;
    					SigParams.dwInnerContentType := 0;
    					SigParams.cMsgCrl := 0;
    					SigParams.cUnauthAttr := 0;
    					SigParams.dwFlags := 0;
    					SigParams.pvHashAuxInfo := nil;
    					SigParams.rgAuthAttr := nil;
    
    					ZeroMemory(@EncParams, Sizeof(CRYPT_ENCRYPT_MESSAGE_PARA));
    					EncParams.cbSize := Sizeof(CRYPT_ENCRYPT_MESSAGE_PARA);
    					EncParams.dwMsgEncodingType := MYTYPE;
    					EncParams.HCRYPTPROV := hProv;
    					EncParams.ContentEncryptionAlgorithm.pszObjId := szOID_CP_GOST_28147;
    					// Алгоритм шифрования ГОСТ 28147-89 1.2.643.2.2.21
    					if CryptSignAndEncryptMessage(@SigParams, @EncParams, AEncCerts.Count, @Certificates, Memory, Size, nil, cbEncrypted) then
    					begin
    						Stream := TMemoryStream.Create;
    						try
    							Stream.SetSize(cbEncrypted);
    							if CryptSignAndEncryptMessage(@SigParams, @EncParams, AEncCerts.Count, @Certificates, Memory, Size, Stream.Memory, cbEncrypted) then
    							begin
    								Stream.SetSize(cbEncrypted);
    								Stream.SaveToFile(OutFileName);
    								Result := True;
    							end
    							else
    								ErrText := SysErrorMessage(GetLastError);
    						finally
    							FreeAndNil(Stream);
    						end;
    					end
    					else
    						ErrText := SysErrorMessage(GetLastError);
    				except
    					ErrText := SysErrorMessage(GetLastError);
    				end;
    			finally
    				CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG);
    			end;
    		finally
    			Free;
    		end;
    end;
    Ответ написан