Entrada Resumen pequeño programa de desarrollo

Este artículo apareció por primera vez en mi número de micro-canales públicos: agua pequeña meses de duración

fuente original: https://mp.weixin.qq.com/s/dIn1YsM_i-o76BVAIrPAhA

Mañana es el examen anual de ingreso a la universidad, examen de ingreso el número de solicitantes de este año alcanzó un nuevo máximo de 10.31 millones de dólares, hace tres años como una referencia a la entrada del programa cuasi-mono, a tiempo para el examen de ingreso, las horas extraordinarias hecho unos puntos de control de entrada cero applets pueden ser considerados como un veterano mentor para la ceremonia de entrada de Benedictine College Campus Shanghai. Acerca de este subprograma, se puede hacer referencia a mi artículo anterior,
https://mp.weixin.qq.com/s/f78npxbhNrwjmtUzX5VhTQ
hoy principalmente para hablar de los principios y detalles de implementación técnica.

# Fuente

fondo del applet incluyó un total de casi 30w de datos, que contiene 2008-2017 División de admisión Artes de cada lote de todos los principales colegios y universidades, así como el uso de las nuevas normas del plan de estudios para todos rollo 2008-2018, Vols nuevos estándares curriculares, nuevos estándares curriculares en tres volúmenes provincias autónomas y algunas proposiciones de Tiqian Pi a un lote profesional especializada de la admisión, de tipo informativo.

Aquí Insertar imagen Descripción

Todos los datos se obtuvieron de diversas instituciones terciarias y sitios relacionados cada entrada, debido a la enorme cantidad de datos, con el fin de mejorar la velocidad, utilizar los concurrent.futures módulo (requerido Python3.5 +) en el ThreadPoolExecutor a grupo de subprocesos constructo para realizar múltiples tareas al mismo tiempo.

Base de datos utilizando la PgSQL, una conocida como la mayoría de los productos de base de datos de código abierto poderosos del mundo, todos los datos están presentes base de datos nueva gaokao, en virtud del cual un lote de dos tablas, universitarios (puntos de admisión a la universidad) y provincia (provincias de segunda línea)

muestra la tabla universitarios

campo explicación
nombre Nombre de la escuela
stu_loc Los nuevos estudiantes
stu_wl Bunrika
ordenador personal lotes de admisión
año años
Puntuación Promedio de admisión

muestra la tabla provincia

campo explicación
año años
stu_loc Los candidatos ubicación
stu_wl Bunrika
ordenador personal lote
controlar Esta línea de control mínimo lote

30w cantidad de datos, una pluralidad de sitios, rastreo concurrente, colisión de datos es inevitable, antes de la inserción, los datos incompletos primera filtrados, tales como cuando se inserta una tabla de datos de campo universitario pc encuentra, entonces este registro debe desecharse, lo más grave es la duplicación de datos, el uso de la solución I es: en primer lugar, si la consulta que se inserta en los datos ya existe, la mesa de la universidad clave principal es (nombre, Stu, stu_wl, PC, año), debido a las limitaciones prácticas un colegio sólo un año en un lote puede ser sólo una categoría ingreso promedio, si no, antes de la aplicación de la última inserción, y comprometerse a confirmar la transacción.

antecedentes de construcción

Después de 30w de los datos a obtener, tengo la intención de fondo utilizando el modelo Frasco + PgSQL de conseguir, incluso en el fondo desplegado en el servidor de la nube Ali, un extremo pequeño programa después de las herramientas de desarrollo por el FBI, en el aplique a una línea encontró un gran problema debido a que el programa requiere una pequeña línea que va a través de la dirección IP no puede acceder al fondo, debe ser accesible a través del registro de nombres de dominio, comprar un nombre de dominio no es problemático es, pero el nombre de dominio para el registro relativamente mucho tiempo, requiere más de una semana, y también menos de 5 era de la entrada día, cuando el impotente, vio accidentalmente un pequeño programa de desarrollo de las nubes, en el desarrollo de las nubes applet, introducción sitio web oficial es:

Los desarrolladores pueden utilizar la nube para desarrollar pequeño programa para el desarrollo de micro-cartas, juegos, sin tener que configurar el servidor, puede utilizar las capacidades de la nube.

desarrollo de las nubes para proporcionar completa para los desarrolladores de apoyo nube nativo y soporte de servicio de micro-canales, lo que debilita el concepto de mantenimiento de servicios de fondo y operación, sin la necesidad de construir un servidor, API utilizando la plataforma proporcionada por el desarrollo de negocio principal, podemos lograr una rápida en línea y la iteración, y esta capacidad , con los desarrolladores de servicios de nube ya utilizan compatibles entre sí, que no son mutuamente excluyentes.

En otras palabras, siempre y cuando los datos en el pequeño programa que viene con el fondo, se puede acceder a través de un pequeño programa de API de la plataforma a estos datos, previamente comprendido los terceros LeanCloud nube nube de la bomba y no esperaba un pequeño programa se integra ahora estas funciones, Tencent tiene que admirarlo.

Es decir, la siguiente tarea es principalmente a los datos de importación de fondo para pequeños programas conocidos entre bastidores, de back-office de datos JSON apoyo importación o formato csv. Así que escribí un script para exportar datos desde una base de datos local para archivo JSON:

import psycopg2
import json

# 连接 pgsql 数据库,为保证隐私,密码已隐藏
conn = psycopg2.connect(database="gaokao", user="postgres", password="*******", host="127.0.0.1", port="5432")
cur = conn.cursor()

cur.execute('select stu_loc,year,stu_wl,pc,control from province')
result = []
query_res = cur.fetchall()
for i in query_res:
	item = {}
	item['stu_loc'] = i[0]
	item['year'] = i[1]
	item['wl'] = i[2]
	item['pc'] = i[3]
	item['score'] = i[4]
	result.append(item)
# indent=2 控制 json 格式的缩进
# ensure_ascii 控制中文的正常显示
with open("province.json", 'w', encoding="utf-8") as f:
	f.write(json.dumps(result, indent=2, ensure_ascii=False))

También hay una necesidad de explicar que hay un pozo, entre bastidores applet de formato JSON requerida y JSON diferencia pequeña entre nosotros en el sentido corriente del formato, en primer lugar, todo el contenido de JSON no pueden ser [y] incluirlos, y cada uno es {el} incluyendo la incapacidad de obtener artículos de datos comas.

Aquí Insertar imagen Descripción

notepad ++ selección JSON abrir el archivo original, utilice la función Reemplazar se puede resolver, la [e] sustituir los espacios, puesto}} puede ser reemplazado.

Después de la modificación, el pequeño programa en segundo plano importando el archivo JSON, el fondo para construir básicamente completado.

Escribe extremo pequeño programas

Acerca de cómo escribir programas extremo pequeño, hablo principalmente de dos experiencias, la primera página se escribe, como la siguiente interfaz.

Inicialmente desee conseguir este efecto, sin ideas, y finalmente desde las ventanas emergentes modales personalizados que se ha pensado, a principios de este cuadro desplegable universidades del área de diseño correspondientes están ocultos en el control de archivos ocultos por wxml = true , una región clic / universidad desplegable caja, poner el conjunto escondido en false, si hay otros desplegable cuadro correspondiente al inicio de la disposición del atributo oculto es falso, entonces, mientras que el atributo oculto está listo para hacer todos estos diseños en true para ocultar otros diseños, por supuesto, , donde la necesidad de setData verdadera o falsa por js li () modifica dinámicamente, los datos modificados de la capa de datos para hacer que la capa de vista.

El segundo es un pequeño programa en el desarrollo de la nube-Bug nativo, una consulta fondo solamente consultar los datos a un máximo de 20 para conseguir una vez para obtener todos los resultados coinciden, es necesario resolver dos problemas, la primera pregunta fue, naturalmente, capaz de pensar, después de la primera datos encontrados en 20, antes de la segunda saltado 20 y luego tomar la 20, 40 y luego tomar antes de saltar el tercero 20, y así sucesivamente; hay un problema más mortal, consulta fondo de la API de devolución de llamada asincrónica para obtener resultados, es decir, con el fin de asegurar una completa de los datos, la segunda consulta necesidad de escribir la primera consulta de devolución de llamada, la tercera necesidad consulta a escribir la segunda consulta de devolución de llamada adentro, pero puede no explícitamente saber cuántas veces se desea consultar, así que ¿cómo anidar muchas capas de, y la necesidad molesto para escribir las mismas variables son los problemas de cobertura, esto se llama el infierno asíncrona. Para resolver este problema, tenemos que escribir el código para convertir esto en un método de sincronización asíncrona, lo que sería:

Para ser incluido en el js función de importación runtime.js archivo de página, y el archivo en la carpeta correspondiente runtime.js
;
const = regeneratorRuntime la require ( "... / Runtime");

runtime.js Descargar: https://github.com/inspurer/CampusPunchcard/blob/master/runtime.js

El siguiente ejemplo también emuló código de lógica de negocio finalización:

// 查询可能较慢,最好加入加载动画​
wx.showLoading({
		  title: '加载中',
		})
		const countResult = await db.collection('province').where({
		  stu_loc: name,
		  pc: pici,

		}).count()
		const total = countResult.total
		//计算需分几次取
		const batchTimes = Math.ceil(total / MAX_LIMIT)
		// 承载所有读操作的 promise 的数组
		//初次循环获取云端数据库的分次数的promise数组
		for (let i = 0; i < batchTimes; i++) {
		  const promise = await db.collection('province').where({
			stu_loc: name,
			pc: pici,
		  }).skip(i * MAX_LIMIT).limit(MAX_LIMIT).get()
		  //二次循环根据​获取的promise数组的数据长度获取全部数据push到newResult数组中
		  for (let j = 0; j < promise.data.length; j++) {
			var item = {};
			item.code = i * MAX_LIMIT + j;
			item.name = promise.data[j].stu_loc;
			item.year = promise.data[j].year;
			item.wl = promise.data[j].wl;
			item.pc = promise.data[j].pc;
			item.score = promise.data[j].score;
			console.table(promise.data)
			newResult.push(item)
		  }
		}
		if (newResult.length != 0) {
		  that.setData({
			hasdataFlag: true,
			resultData: newResult
		  })
		} else {
		  that.setData({
			hasdataFlag: false,
			resultData: newResult
		  })
		}
		// 隐藏加载动画
		wx.hideLoading()

Estas son algunas de las ideas que he desarrollado esta experiencia, la bienvenida a la crítica.

Publicado 84 artículos originales · ganado elogios 250 · Vistas de 150.000 +

Supongo que te gusta

Origin blog.csdn.net/ygdxt/article/details/92011679
Recomendado
Clasificación