Algunos problemas y soluciones encontrados en el desarrollo full-stack

        En el proceso de desarrollo de Simple Grid , se requieren tanto el desarrollo del lado del servidor como el desarrollo de múltiples dispositivos. El lado del servicio se divide en el lado del servicio JAVA, el lado del servicio de Android y el lado del terminal se divide en Android y Windows. La tecnología es complicada y se encuentran muchos problemas básicos. Todos se registran aquí para una fácil referencia en el futuro.

        Por cierto, como un pequeño anuncio, Zhijian Grid es un marco de desarrollo que combina el dispositivo y la nube, lo que simplifica enormemente el desarrollo del lado del servidor y del lado del dispositivo. Usando una configuración json simple y scripts sql y js en el lado del servidor, se pueden manejar más del 95% de los escenarios comerciales; el lado del dispositivo es compatible con Android y Windows. Implementé varios códigos comerciales, como CRM, membresía, etc., que han sido de código abierto en Code Cloud y CSDN . El proyecto aún está en mejora continua, bienvenido a usar.

Tabla de contenido

1. Cuestiones ambientales

1.1. Estudio Android

1.1.1 Cómo agregar jar y aar:

1.1.2 Permisos de ruta del simulador

1.1.3 instalación gradle

1.1.4 problemas gradle

1.1.5. kotlin, el complemento gradle está deshabilitado

1.1.6 Error de Kotlin-android no encontrado

1.1.7 Modificar la configuración de gradle

1.1.8 Abrir logcat para ver registros

1.1.9 Eliminar importaciones redundantes

1.1.10 Modificar las reglas de checkstyle

1.1.11 Modificar nombre del proyecto

1.1.12 Instalación de superposición adb

1.1.13 Qué se debe modificar al importar el proyecto de muestra

1.1.14 Modificar ID de aplicación del proyecto

1.2 Simulador

1.2.1 IP del simulador y acceso externo

1.2.2 Ingrese la línea de comando del emulador

1.3 Red

1.3.1 La red entre el teléfono móvil y la PC está desconectada

1.3.2 La PC no puede hacer ping al teléfono móvil

1.3.3 PC de acceso de teléfono móvil bajo la misma LAN

1.4 Mi teléfono

1.4.1 Teléfono móvil Xiaomi, no se puede abrir la instalación usb

1.4.2 El dispositivo real entra en modo desarrollador

1.5 Teléfono móvil Huawei o Honor

1.5.1 Abrir registro de nivel de depuración

1.6. iOS

1.6.1 Notas del servidor web de iPhone

1.7. Eclipse

1.7.1 Cambiar el nombre del paquete

1.8. gradle

1.8.1. Se ignora el directorio debajo del activo que comienza con un guión bajo "_"

1.9. Java

1.9.1 Instalar GraalVM en Windows

1.9.2 Instalar GraalVm bajo Linux

1.10 Entorno Linux

1.10.1 Crear usuario

1.10.2 Reenvío de puertos

​​​​​1.10.3. El código de verificación de imagen necesita instalar fuentes

2. Problemas de desarrollo de Android

2.1 Permisos

2.1.1 Configuración de permisos de la aplicación

2.2 Capa inferior

2.2.1 Carga dinámica de complementos dex

2.2.2 Darse cuenta de la prohibición de eliminación manual de datos

2.2.3 Definir política de seguridad

2.2.4 Depende de librerías escritas en kotlin

2.3 Seguridad

2.3.1 Cifrado y descifrado de raíz de confianza

2.3.2 Agregar certificado raíz autofirmado

2.4 Prueba JUnit

2.4.1 No se pueden escribir archivos en Android-Unit

2.4.2 Preparación y limpieza de la prueba

2.5 Registros de inicio de sesión

2.5.1 Propiedades en configuración

2.5.2 Las propiedades integradas, como DATA_DIR, no están definidas

2.6 Publicación de la versión

2.6.1 Firma de la solicitud

2.6.2 El icono no se actualiza

3. Problema de desarrollo de C#

3.1 Permisos de directorio

3.2 Ruta del archivo de salida de Log4net

3.3 Incrustar archivos de recursos

3.4 Pruebas unitarias

3.5 configuración del proyecto de instalación

3.6 Ofuscación

4. Híbrido

4.1 Marco

4.2 Deshabilitar la selección de texto

4.3 Componente de referencia

4.4 Generar código QR

5. Sentido común

5.1 Reglas de codificación y verificación del código de crédito unificado

5.2 Número de división administrativa

5.3 Conjunto de comandos Git


1. Cuestiones ambientales

1.1. Estudio Android

1.1.1 Cómo agregar jar y aar:

a) Crear bibliotecas de directorio en la aplicación

b) Agregue el árbol de archivos de implementación (dir: 'libs', incluya: ['*.jar','*.aar']) en app\build.grale

c) Copie los archivos jar y aar a lo siguiente;

d) Si AndroidStudio no puede reconocerlo, haga clic en el menú Archivo->Invalidar cachés/Reiniciar y luego reinícielo;

1.1.2 Permisos de ruta del simulador

Si crea manualmente rutas y archivos en Device File Explore de AndroidStudio, se producirá un acceso no autorizado en la aplicación y deberá crearlos usted mismo en la aplicación.

1.1.3 instalación gradle

  1.       Descomprimir en la ruta especificada;
  2.      Configure GRADLE_HOME para apuntar a esta ruta;
  3.       Cree un directorio de usuarios en la ruta y configure GRADLE_USER_HOME como %GRADLE_HOME%\user para almacenar archivos temporales;
  4.      Agregue %GRADLE_HOME%\bin a la variable PATH
  5.       Busque Gradle en Archivo->Configuración de AndroidStudio, configure la ruta de Gradle y la ruta de GradleUser;
  6.        Si actualiza gradle, se recomienda descomprimirlo en la misma ruta después de la descarga, para que no sea necesario cambiar la configuración de todas las aplicaciones.

1.1.4 problemas gradle

El build.gradle en el directorio del proyecto especifica la versión gradle de AndroidStudio, que puede ser un adaptador, intente no cambiarlo o cámbielo a la versión de AndroidStudio;

gradle\wrapper\gradle-wrapper.properties especifica la versión de gradle, y la ruta se puede escribir como un archivo zip descargado localmente, como archivo\:///ruta local, por lo que el archivo zip de gradle en este directorio no se puede eliminar. Esto puede evitar descargar diferentes proyectos de nuevo.

1.1.5. kotlin, el complemento gradle está deshabilitado

Estos dos complementos no se pueden deshabilitar. Si se deshabilitan, AndroidStudio se iniciará de manera anormal.

En este momento, puede eliminar el registro correspondiente en disabled_plugins.txt, la ubicación es la siguiente:

C:\Users\用户名\AppData\Roaming\Google\AndroidStudio4.1\disabled_plugins.txt

1.1.6 Error de Kotlin-android no encontrado

Elimine la línea que causa el error en el proyecto build.gradle y luego elija ejecutar Config Kotlin en Project en Tools-Kotlin.

1.1.7 Modificar la configuración de gradle

Cada vez que se modifica el archivo gradle, el proyecto no se puede compilar ni ejecutar. En este caso, seleccione Archivo->Sincronizar proyecto con archivos Gradle.

1.1.8 Abrir logcat para ver registros

En el menú View-Tool Windows, abra logcat para ver el registro.

Hay algunas otras funciones también en este directorio;

1.1.9 Eliminar importaciones redundantes

El menú Code-Optimize Imports puede eliminar automáticamente todas las importaciones redundantes o usar la tecla de acceso rápido ctrl+alt+'o'.

1.1.10 Modificar las reglas de checkstyle

Busque las palabras clave sugeridas en Configuración-Inspecciones, encuentre las reglas y márquelas o desmárquelas

1.1.11 Modificar nombre del proyecto

Por ejemplo, para modificar el proyecto de muestra al nombre del proyecto final, siga los pasos a continuación para completar:

1. Cierra Android Studio;

2. Modificar el nombre de la carpeta del proyecto;

3. Modifique el nombre del archivo OldProjectName.iml (en el directorio .idea del directorio raíz del proyecto) al nuevo nombre del elemento, es decir, cambie OldProjectName.iml a NewProjectName.iml;

4. Modifique el nombre correspondiente en .idea/workspace.xml;

5. Modifique applicationId en app/build.gradle;

6. Luego establezca el valor de external.linked.project.id en el archivo con el nombre del nuevo proyecto, es decir, external.linked.project.id="NewProjectName";

7. Simplemente abra AndroidStudio nuevamente.

1.1.12 Instalación de superposición adb

adb install xxx.apk Si ya está instalado, se le pedirá

Falla [INSTALL_FAILED_ALREADY_EXISTS: Intento de reinstalar xxx sin desinstalar primero.]

Con adb install -r xxx.apk, puede sobrescribirlo e instalarlo, pero aún conserva los datos anteriores.

1.1.13 Qué se debe modificar al importar el proyecto de muestra

  1. Modifique la URL de distribución en gradle/wrapper/gradle-wrapper.properties en el directorio del proyecto y cambie la versión a la versión existente en gradle, o descargue una anterior;
  2. Modifique build.gradle en el directorio del proyecto y cambie ext.kotlin_version a la versión actual.La versión de kotlin se puede ver en file-settings-plugins;
  3. Modifique app/build.gradle en el directorio del proyecto, elimine buildSdkVersion, use la versión existente actual, modifique compileSdk y targetSdk a la última versión de AndroidStudio y modifique minSdk a una versión adecuada. Tenga en cuenta que los nombres de estos tres elementos de configuración están en la nueva versión de gradle, y la versión no se puede agregar al final;

1.1.14 Modificar ID de aplicación del proyecto

        Las siguientes operaciones se realizan en "Android Studio Flamingo | 2022.2.1 Parche 2", otras versiones pueden ser diferentes.

        Modifique applicationId en build.gradle en el directorio raíz del proyecto.Si necesita cambiar el nombre del paquete generado, también debe modificar el espacio de nombres en build.gradle. Luego seleccione "Limpiar proyecto" en el menú de compilación, luego seleccione "Sincronizar proyecto con archivos Gradle" en el menú Archivo y ejecútelo varias veces si no funciona una vez. Si aún no funciona, seleccione "Invalidar cachés" en el menú Archivo, reinicie y luego sincronice varias veces hasta que aparezca el directorio generado.

1.2 Simulador

1.2.1 IP del simulador y acceso externo

Dentro del simulador, la IP de la máquina host es 10.0.0.2 y la IP del simulador en sí es 10.0.2.15/127.0.0.1/localhost

Si necesita acceder directamente al puerto TCP dentro del emulador en el host, primero debe realizar la asignación.

adb adelante tcp: 8081 tcp: 8080

De esta forma, se puede acceder  a http://localhost:8081/xxxxx y la solicitud se reenviará al puerto 8080 de la máquina virtual.

1.2.2 Ingrese la línea de comando del emulador

adb -s emulador-5554 shell

1.3 Red

1.3.1 La red entre el teléfono móvil y la PC está desconectada

Por lo general, hay un problema con la configuración del enrutador. Es posible que el aislamiento AP esté habilitado en la configuración inalámbrica del enrutador, de modo que los nodos del mismo enrutador no puedan comunicarse entre sí.

1.3.2 La PC no puede hacer ping al teléfono móvil

El firewall de la red no deshabilita las solicitudes salientes de forma predeterminada, pero si 360 está instalado, en el centro de protección de seguridad de 360 ​​-> sistema de protección de entrada, si se selecciona la protección LAN, la PC no puede comunicarse con el teléfono móvil.

1.3.3 PC de acceso de teléfono móvil bajo la misma LAN

Primero, el servicio web debe iniciarse en la PC;

En segundo lugar, en la configuración avanzada del firewall del sistema, agregue reglas de entrada para abrir los puertos correspondientes, como el puerto 8080 de TCP;

Finalmente, si 360 está instalado, debe desactivar la protección contra incendios de seguridad de la red en el centro de protección de seguridad -> sistema de protección del sistema.

1.4 Mi teléfono

1.4.1 Teléfono móvil Xiaomi, no se puede abrir la instalación usb

Inserte una tarjeta Sim, la tarjeta Sim inútil también está bien

1.4.2 El dispositivo real entra en modo desarrollador

Diferentes modelos de teléfonos móviles, incluidos Huawei, Xiaomi, etc., pueden ingresar al modo de desarrollador haciendo clic varias veces en la versión de Android establecida. Después de ingresar al modo de desarrollador, puede habilitar la depuración de USB.

1.5 Teléfono móvil Huawei o Honor

1.5.1 Abrir registro de nivel de depuración

El nivel de registro predeterminado de los teléfonos móviles Huawei es información, sin importar lo que esté configurado en AndroidStudio, si desea abrir el nivel de depuración, siga los pasos a continuación para configurarlo.

1. Marque *#*#2846579#*#* en la interfaz de marcación para ver el menú del proyecto;

2. Seleccione la configuración de fondo para ingresar;

3. Abra la configuración de REGISTRO, seleccione el registro AP;

4. Regrese a AndroidStudio, cambie el nivel de registro y podrá ver la depuración;

5. Si aún no se puede mostrar, pero se puede ver adb logcat -d, reinicie AndroidStudio de la siguiente manera.

1.6. iOS

1.6.1 Notas del servidor web de iPhone

Desarrolle un servidor web basado en SwiftNio, que es netty en iOS.

https://www.5axxw.com/wiki/content/zdz096https://www.5axxw.com/wiki/content/zdz096

Otros como GCDWebServer y CocoaHttpServer hace tiempo que no se actualizan

1.7. Eclipse

1.7.1 Cambiar el nombre del paquete

Haga clic derecho en el paquete, seleccione Refactorizar, aparece una ventana de cambio de nombre, ingrese un nuevo nombre, asegúrese de seleccionar Cambiar nombre de subpaquetes, de lo contrario, solo creará un paquete vacío

1.8. gradle

1.8.1. Se ignora el directorio debajo del activo que comienza con un guión bajo "_"

Agregue la siguiente configuración en android en el archivo gradle del proyecto para desactivar esta función

aaptOptions{     ignoreAssetsPattern '!._' }

1.9. Java

1.9.1 Instalar GraalVM en Windows

Descargue e instale: exactamente igual que la configuración de Java, después de la descompresión, configure JAVA_HOME y configure bin en la ruta de la variable del sistema

Anso imagen nativa: gu install imagen nativa

安装llvm:gu install llvm-toolchain

Instale el motor js: gu install js

Comando de compilación nativo: imagen nativa

1.9.2  Instalar GraalVm bajo Linux

  1. Descargue los dos archivos siguientes y cárguelos en el servicio de Linux;

graalvm-ce-java11-linux-amd64-22.3.1.tar.gz

js-instalable-svm-java11-linux-amd64-22.3.1.jar

  1. descomprimir graalvm;

tar xfz graalvm-ce-java11-linux-amd64-22.3.1.tar.gz

[Nota] No lo descomprima bajo /root, porque este directorio es el directorio raíz del usuario raíz y otros usuarios no pueden acceder a él.

  1. Y agregue la siguiente configuración en /etc/profile

export JAVA_HOME=Ruta de descompresión

exportar JRE_HOME=${JAVA_HOME}/jre

exportar CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

exportar RUTA=${JAVA_HOME}/bin:$RUTA

  1. Instale el soporte js, seleccione la instalación local a través de la opción -L.

gu install -L js-instalable-svm-java11-linux-amd64-22.3.1.jar

No use gu install js, porque el acceso doméstico a github no es sencillo y la instalación es extremadamente difícil de realizar, así que descárguelo con una herramienta de descarga (como Thunder) e instálelo localmente.

1.10 Entorno Linux


1.10.1 Crear usuario


Es un mal hábito usar el usuario raíz para instalar servicios, especialmente para servicios que retienen interfaces externas.Una vez que hay una laguna, los piratas informáticos pueden obtener privilegios de raíz, por lo que se crea otro servicio de instalación de usuario.
El parámetro useradd -m mesh
-m requiere que el sistema cree automáticamente un directorio de usuario en /home, mesh es el nombre de usuario
passwd mesh
es el usuario para establecer una contraseña


1.10.2 Reenvío de puertos


El programa de servicio se ejecuta en el puerto 8523, y tanto el 80 como el 443 deben reenviarse a este puerto, lo que se puede realizar agregando reglas de reenvío con iptables.


1. Primero instale iptables, si ya está instalado, ábralo
//systemctl stop firewalld # Cierre el firewall
yum -y install iptables-services # Instale el servicio de iptables
systemctl enable iptables # Configure el servicio de iptables boot
systemctl start iptables # Inicie el servicio de iptables service
iptables save # Guarde el servicio de configuración de iptables
iptables restart # Reinicie el servicio de iptables

2. Abrir puertos:
después de iniciar el servicio iptables, los puertos superiores a 1024 están deshabilitados de forma predeterminada, por lo que debe abrir
iptables -I INPUT -p tcp --dport 8523 -j ACCEPT

3. A continuación, agregue las reglas de reenvío de puertos:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8523
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8523

4. Ver las reglas de reenvío de un puerto
iptables -t nat -L -n | grep 80

5. Elimine la regla de reenvío de puertos
iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8523

6. Finalmente, guarde la regla.
servicio iptables guardar

De esta forma, se puede acceder a ambos puertos, el 80 y el 443.

​​​​​1.10.3. El código de verificación de imagen necesita instalar fuentes

El código de verificación de imágenes se genera en Linux y se produce una excepción en FontManagerFactory porque la fuente no está instalada. Instalar con el siguiente comando:

yum -y instalar fontconfig

fc-list ver fuentes instaladas

2. Problemas de desarrollo de Android

2.1 Permisos

2.1.1 Configuración de permisos de la aplicación

Establecido en AndroidMenifest.xml, mismo nivel que la aplicación

<usos-permiso android:name="android.permiso.INTERNET" />

<usos-permiso android:name="android.permission.ACCESS_WIFI_STATE" />

<usos-permiso android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Al mismo tiempo, configura android:requestLegacyExternalStorage="true" en la aplicación

2.2 Capa inferior

2.2.1 Carga dinámica de complementos dex

  1. Use el cargador de clases PathClassLoader para cargar dinámicamente el complemento dex;
  2. Antes de cargar, debe llamar al comando dex para convertir el archivo jar en un archivo dex, y el archivo dex se puede descargar desde el exterior;
  3. Debido a las reglas cargadas por ClassLoader, los diferentes complementos no pueden acceder entre sí, pero los complementos pueden acceder a las clases en apk;

2.2.2 Darse cuenta de la prohibición de eliminación manual de datos

Implemente una actividad que elimine datos y haga referencia a esta actividad en AndroidMenifest.xml-application-android:manageSpaceActivity e implemente una interfaz de administración de datos de eliminación personalizada Aquí, solo se pueden eliminar los datos eliminables, o no eliminarlos en absoluto, como prohibir la eliminación de bases de datos sqlite, etc.

La definición de esta Actividad no es diferente de la de una Actividad normal.

2.2.3 Definir política de seguridad

Las políticas de seguridad se pueden personalizar en AndroidMenifest.xml-application-android:networkSecurityConfig, como certificados raíz autofirmados preinstalados, etc.

2.2.4 Depende de librerías escritas en kotlin

Por ejemplo, okhttp4.x indica Resolución fallida de: Lkotlin/jvm/internal/Intrinsics,

Kotlin no tiene ventajas especiales, por lo que se recomienda no utilizarlo. Restringir OkHttp4 para confiar en Kotlin también es inútil.

2.3 Seguridad

2.3.1 Cifrado y descifrado de raíz de confianza

Use KeyStore para el cifrado y descifrado, y la capa inferior de KeyStore usa Tee.

El problema es que no se puede usar cuando la pantalla está en negro.

EncryptedSharedPreferences también usa KeyStore.

https://source.android.google.cn/security/keystore?hl=zh-cn

2.3.2 Agregar certificado raíz autofirmado

El costo de usar una CA para emitir un certificado suele ser alto y no es necesario para una aplicación de prueba. Por lo tanto, genere un certificado raíz autofirmado usted mismo; luego use el certificado raíz para generar un certificado secundario; finalmente use el certificado secundario para generar su propio certificado de usuario. Esto forma una cadena de certificados. Preestablezca el certificado raíz en el programa y confíe en su propio certificado raíz.

La cadena de certificados autofirmados puede hacer referencia al siguiente enlace:

KeyTool genera una cadena de certificados y utiliza el Blog-CSDN de it_flyinmind

El enlace anterior presenta todo el proceso de uso de keytool para generar un certificado raíz, un certificado secundario y un certificado terciario.

2.4 Prueba JUnit

2.4.1 No se pueden escribir archivos en Android-Unit

Use ApplicationProvider.getApplicationContext para obtener el contexto. La ruta obtenida en este contexto se puede leer y escribir, y el contenido escrito existirá en la aplicación oficial, no en la aplicación de prueba.

2.4.2 Preparación y limpieza de la prueba

Agregar anotaciones @Before y @After antes de la función de prueba puede controlar la ejecución al principio y al final, y usarlas para preparar y limpiar.

2.5 Registros de inicio de sesión

2.5.1 Propiedades en configuración

Cuando logback lee el archivo de configuración, ${propertyName} hace referencia a las propiedades utilizadas en él. Las propiedades deben establecerse en el Contexto inicializado, como especificar la ruta raíz. Este contexto no se puede restablecer, de lo contrario, la propiedad se perderá.

LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
lc.putProperty("loggerHome", outputDir);
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(lc);
//lc.reset(); //reset会清除property
configurator.doConfigure(cfgFile);
StatusPrinter.printInCaseOfErrorsOrWarnings(lc);

2.5.2 Las propiedades integradas, como DATA_DIR, no están definidas

En algunos ejemplos, aparecen atributos como DATA_DIR y PACKAGE_NAME, pero no se pueden usar. Al observar el código, se adivina que el método de inicio de sesión para obtener el contexto de la aplicación puede ser incorrecto. Por lo tanto, debe establecer propiedades personalizadas antes de cargar la configuración en el programa y luego hacer referencia a ellas en logback.xml.

2.6 Publicación de la versión

2.6.1 Firma de la solicitud

El lanzamiento de la versión requiere que se firme un certificado, este certificado puede usar EC o RSA, y se puede firmar con una cadena de certificados. En el caso de Debug, se genera un certificado predeterminado, pero no lo use al publicar.

Durante el lanzamiento, seleccione el menú Build->Generate Signed Bundle/APK, seleccione un certificado existente o cree uno nuevo.Este certificado debe acompañar a la aplicación de por vida, por lo que debe conservarse bien y recordar la contraseña clave y la contraseña de almacenamiento.

También puede utilizar un certificado autofirmado. Para conocer el método de generación, consulte el siguiente enlace:

KeyTool genera una cadena de certificados y utiliza el Blog-CSDN de it_flyinmind

2.6.2 El icono no se actualiza

Los íconos creados en "nuevo->recurso de imagen" pueden proporcionar diferentes íconos en diferentes resoluciones para garantizar la claridad adecuada. Pero el ícono creado por el recurso de imagen es independiente del proyecto de la aplicación, debe copiarlos en el directorio res principal y no olvide copiar el directorio mipmap-anydpi-v26 o mipmap-anydpi-v24 y valores, estos dos directorios no son salsa de soja, si no los copia, el ícono no se actualizará, porque Android usa mipmap-anydpi-vxx.xml, que distingue diferentes resoluciones y selecciona diferentes íconos.

3. Problema de desarrollo de C#

3.1 Permisos de directorio

Cuando la aplicación está instalada en el directorio de programas, el programa no tiene permiso para escribir la ruta actual, puede pasar

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Obtenga la ruta en la que la aplicación puede escribir, como C:\Users\Account\AppData\Roaming\Application Name. Los registros, los archivos de tiempo de ejecución, etc. se pueden escribir en esta ruta.

3.2 Ruta del archivo de salida de Log4net

En relación con los permisos de directorio, debe configurar la ruta raíz de la salida del registro de acuerdo con la situación del tiempo de ejecución, puede configurar GlobalContext.Properties["loggerHome"] = outputDir;

Luego consulte loggerHome en appender.file de log4net.xml de la siguiente forma:

<file type="log4net.Util.PatternString" value="%property{loggerHome}\\logs\\mesh\\run.log" />

Tenga en cuenta que el tipo debe establecerse en log4net.Util.PatternString; de lo contrario, %property{loggerHome} se analizará como una cadena normal

3.3 Incrustar archivos de recursos

Se recomienda incrustar los recursos en forma de archivos, de modo que sea conveniente modificar los archivos directamente en la carpeta, sin tener que actualizar a Resources.resx después de cada modificación de archivos.

Haga clic con el botón derecho en el proyecto, seleccione Agregar -> Nueva carpeta, cree un directorio de recursos y luego agregue varios archivos en él. Tenga en cuenta que la operación de generación de recursos debe seleccionar "recursos incrustados".

Luego, en el programa, use el siguiente método para abrir la secuencia del archivo de recursos:

Asamblea assm = Asamblea.GetExecutingAssembly();

Stream s = assm.GetManifestResourceStream("Nombre del proyecto.Recursos." + nombre del archivo);

El nombre de archivo aquí incluye la extensión.

3.4 Pruebas unitarias

Primero escriba la función de prueba unitaria, escriba [TestClass] en la clase, escriba [TestMethod] en la función de prueba y confirme a través de Assert.xxx.

A continuación, abra el "Explorador de pruebas" en el menú Ver, asegúrese de que el icono con forma de matraz esté seleccionado y ejecute todas las pruebas.

3.5 configuración del proyecto de instalación

        La herramienta de empaquetado que viene con .net es muy incómoda y no se ha mejorado después de tantos años de desarrollo. Por lo tanto, el proyecto usa inno setup para crear archivos de instalación, que deben incluir el dll en el directorio de lanzamiento. En el caso de usar webview2, se debe incluir runtimes\win-x64\native\WebView2Loader.dll.

        Si está empaquetado en chino, al agregar ChineseSimplified.isl, debe convertirse al formato utf8-with-BOM (se puede modificar con notepad++), de lo contrario, la interfaz mostrará caracteres ilegibles; si es necesario especificar la licencia y otros archivos, también debe cambiarse al formato utf8-with-BOM.

3.6 Ofuscación

        Use .Net reactor, seleccione el programa principal exe bajo lanzamiento y luego seleccione ofuscación para confundir el programa. Después de la confusión, use inno setup para generar el paquete de instalación.

4. Híbrido

4.1 Marco

Use vue+vue-router+quasar para desarrollar, mostrar la interfaz en el navegador y llamar a la interfaz subyacente.

Nota: vue necesita usar la versión vue.global.prod.js en lugar de vue.runtime.global.prod.js .

Se puede descargar desde https://cdn.jsdelivr.net/npm/vue@next/dist/.

Descargue quasar desde https://quasar.dev/start/umd, incluidos quasar.umd.prod.js y quasar.prod.css. En este sentido, css se puede fusionar con quasar.prod.css. Las fuentes utilizadas también deben descargarse una por una y colocarse localmente. El enlace es:

https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Iconos

4.2 Deshabilitar la selección de texto

En la escena del juego, a menudo se usa arrastrar, y es fácil hacer que se seleccione el texto. En este momento, puede agregar user-select: none; al CSS para prohibir que se seleccione el texto.

4.3 Componente de referencia

1) Importar archivo de componente

importar AlertDialog desde "/assets/v3/components/alert_dialog.js"

2) Registrar el componente

app.component('componente-alerta-diálogo', AlertDialog);

El registro debe colocarse antes de app.mount; de lo contrario, llamar al método en el componente indicará que xxx no es una función

3) Introducir el componente en la plantilla

<component-alert-dialog :title="tags.failToCall" :close="tags.close" ref="errDlg"></component-alert-dialog>

4) Componente de llamada en js

this.$refs.errDlg.show(“xxxx”);

4.4 Generar código QR

Debido a que no está desarrollado en nodejs, qrcodejs2 no se puede introducir mediante importación, por lo que solo se puede incluir directamente en index.html:

<secuencia de comandos src="/ruta js/qrcode.js"></secuencia de comandos>

Luego, agregue un div a la plantilla para acomodar el código QR. El ancho relativo vw se usa aquí, por lo que debe calcularse al generarlo.

<div ref="qrCodeUrl" style="ancho:60vw; alto:60vw;"></div>

Finalmente, llame cuando necesite mostrar:

nuevo QRCode(this.$refs.qrCodeUrl, {

    texto: 'https://www.baidu.com',

    ancho: documento.documentElement.clientWidth * 0.6,

    altura: documento.documentElement.clientWidth * 0.6,

    color oscuro: '#000000',

    luz de color: '#ffffff',

    NivelCorrecto: Código QR.NivelCorrecto.H

});

Si se usa en un cuadro de diálogo, debe llamarse para mostrar el código QR en el @show del cuadro de diálogo. Si es demasiado pronto, el elemento del cuadro de diálogo no se ha creado y la pantalla fallará en este momento.

5. Sentido común

5.1 Reglas de codificación y verificación del código de crédito unificado

Reglas: [Popularización de microciencias] Enseñarle a comprender el código de crédito social unificado_Organización

Implementación de Java: Verificación del Código de Crédito Social UnificadoJAVA

5.2 Número de división administrativa

https://www.mca.gov.cn/article/sj/xzqh/1980/202105/20210500033655.shtml

5.3 Conjunto de comandos Git

Consulte este artículo Notas de la operación de Git_blog de flyinmind-blog de CSDN

Supongo que te gusta

Origin blog.csdn.net/flyinmind/article/details/126965194
Recomendado
Clasificación