Entrée petit résumé de l'élaboration du programme

Cet article a paru dans mon numéro public micro-canal: petite eau au long du mois

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

Demain est l'examen annuel d'entrée au collège, entrée au collège examen , le nombre de candidats cette année a atteint un nouveau sommet de 10,31 millions, il y a trois ans comme une référence à l'entrée du programme quasi-singe, à temps pour l'entrée au collège examen, les heures supplémentaires fait un des points de contrôle d'entrée de zéro applets peuvent être considérés comme un mentor vétéran à la cérémonie d'entrée du collège bénédictin Campus de Shanghai. A propos de cette applet, vous pouvez vous référer à mon article précédent,
https://mp.weixin.qq.com/s/f78npxbhNrwjmtUzX5VhTQ
aujourd'hui principalement à parler des principes et des détails de mise en œuvre technique.

# Source

fond Applet inclus un total de près 30w de données, contenant 2008-2017 Division d'admission Arts de chaque lot de tous les grands collèges et universités, ainsi que l'utilisation des nouvelles normes du curriculum pour tous les rouleaux 2008-2018, Völs nouvelles normes pédagogiques, les nouvelles normes du curriculum en trois volumes provinces autonomes et des propositions de Tiqian Pi à un lot professionnel spécialiste de l'admission, de sortes d'information.

Insérer ici l'image Description

Toutes les données ont été recueillies auprès de diverses institutions d'enseignement supérieur et des sites connexes chaque entrée, à cause de l'énorme quantité de données, afin d'améliorer la vitesse, utiliser les concurrent.futures (requis Python3.5 +) du module dans le ThreadPoolExecutor de construction pool de threads pour effectuer plusieurs tâches simultanément.

Base de données en utilisant le PgSQL, un connu comme la plupart des produits puissants de base de données open source du monde, toutes les données sont présentes nouvelle base de données gaokao, en vertu de laquelle un lot de deux tables, universitaires (points d'admission des collèges) et province (provinces de la seconde ligne)

spectacles de table universitaires

terrain explication
Nom Nom de l'école
stu_loc Les nouveaux étudiants
stu_wl Bunrika
ordinateur personnel lot d'admission
année ans
But admission moyenne

Table province montre

terrain explication
année ans
stu_loc Les candidats emplacement
stu_wl Bunrika
ordinateur personnel lot
contrôle Ce lot ligne de commande minimum

30w quantité de données, une pluralité de sites, rampement simultanée, une collision de données est inévitable, avant l'insertion, les données incomplètes d'abord filtré, tels que lors de l'insertion d'une table de données manquantes champ pc universitaire, cette fiche il doit être jeté, le plus grave est la duplication des données, la solution que je utilise est: d'abord, si la requête à insérer dans les données existent déjà, la table universitaire clé primaire (nom, STU, stu_wl, pc, année), en raison des contraintes pratiques un collège seulement un an dans un lot peut être une seule catégorie admission moyenne, sinon, avant la mise en œuvre de la dernière insertion et engager à valider la transaction.

contexte construction

Après 30w des données pour obtenir, je compte fond en utilisant le modèle Flask + PgSQL pour atteindre, même en arrière-plan déployé au serveur cloud Ali, un petit bout de programme après les outils de développement par le FBI, sur l'applet à une ligne a rencontré de gros problèmes parce que le programme nécessite une petite ligne qui traverse l'adresse IP ne peut pas accéder à l'arrière-plan, doit être accessible par l'enregistrement du nom de domaine, vous pouvez acheter un nom de domaine est pas tout à fait gênant, mais le nom de domaine pour le compte rendu relativement beaucoup de temps, nécessite plus d'une semaine, et il y avait aussi moins de 5 de l'entrée jour, sans défense, a vu par hasard un petit programme de développement des nuages, sur le développement des nuages ​​applet, l'introduction site officiel est:

Les développeurs peuvent utiliser le nuage pour développer petit programme pour développer des micro-lettres, des jeux, sans avoir à configurer le serveur, vous pouvez utiliser les fonctionnalités de cloud.

le développement Cloud pour fournir des informations complètes pour les développeurs de soutien nuage natif et le soutien des services de micro-canal, ce qui affaiblit le concept de maintenance back-end et le fonctionnement, sans la nécessité de construire un serveur, API en utilisant la plate-forme fournie par le développement des activités de base, nous pouvons obtenir rapidement en ligne et l'itération, et cette capacité , avec les développeurs de services cloud utilisent déjà compatibles les uns avec les autres, ils ne sont pas mutuellement exclusifs.

En d'autres termes, tant que les données dans un petit programme qui vient avec l'arrière-plan, vous pouvez accéder grâce à un petit programme API de la plate-forme à ces données, compris auparavant le nuage nuage LeanCloud bombe tiers et ne vous attendez pas à un petit programme intègre désormais ces fonctions, Tencent doivent l'admirer.

C'est, la tâche suivante consiste principalement à des données de base à l'importation pour les petits programmes connus dans les coulisses, le soutien de back-office JSON d'importation de données ou csv. J'ai donc écrit un script pour exporter des données à partir d'une base de données locale vers un fichier 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))

Il est également nécessaire d'expliquer il y a une fosse, applet backstage requis format JSON et JSON peu de différence entre nous sur le sens ordinaire du format, tout d'abord, tout le contenu de JSON ne peut pas être [et] les inclure, et chacun est {la} y compris l'incapacité d'obtenir des virgules les éléments de données.

Insérer ici l'image Description

Sélection notepad ++ JSON ouvrir le fichier d'origine, utilisez la fonction Remplacer peut être résolu, le [et] remplacer les espaces, mettre}} peut être remplacé.

Après modification, le petit programme de base en important le fichier JSON, l'arrière-plan est complet et essentiellement.

Ecrire petit bout de programmes

A propos de l'écriture petite fin des programmes, je parle surtout de deux expériences, la première page est écrite, comme l'interface suivante.

Dans un premier temps veulent obtenir cet effet, pas d'idées, et enfin de la coutume popups modales qui a été pensé, au début de cette liste déroulante correspondant collèges de la région de mise en page sont cachés dans le contrôle du fichier par wxml caché = true , une région de clic / déroulante case collège, mettez le jeu caché false, s'il y a d'autres menu déroulant correspondant au début de la mise en page de l'attribut caché est faux, alors que l'attribut caché est configuré pour effectuer toutes ces dispositions à vrai pour cacher d'autres dispositions, bien sûr, où la nécessité de vrai ou faux par js li setData () modifié dynamiquement, les données modifiées de la couche de données pour rendre la couche de vue.

Le second est un petit programme sur le développement du cloud-Bug natif, une requête d'arrière-plan uniquement interroger les données jusqu'à 20 pour atteindre une fois pour obtenir tous les résultats correspondants, vous devez résoudre deux problèmes, la première question était naturellement capable de penser, après la première donnée trouvée en 20, avant le second sauté 20 et prendre la 20, 40 et ensuite prendre avant de sauter le troisième 20, et ainsi de suite, il y a un problème plus mortel, requête arrière-plan asynchrone API de rappel pour obtenir des résultats, qui est, afin d'assurer une complète des données, la deuxième besoin de requête pour écrire la première requête de rappel, le troisième besoin de requête pour écrire le rappel deuxième requête , mais vous ne pouvez pas savoir explicitement combien de fois vous voulez interroger, donc combien de couches de imbriquées, et la nécessité ennuyeux d'écrire les mêmes variables sont les problèmes de couverture, on appelle cela l'enfer asynchrone. Pour résoudre ce problème, nous devons écrire du code pour la transformer en une méthode asynchrone de synchronisation, qui serait:

Pour ajouter au fichier de page de js fonction d'importation et le fichier dans le dossier approprié runtime.js
;
const = regeneratorRuntime require ( « ... / Runtime »);

runtime.js Télécharger: https://github.com/inspurer/CampusPunchcard/blob/master/runtime.js

L'exemple suivant également émulé le code logique métier d'achèvement:

// 查询可能较慢,最好加入加载动画​
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()

Ce sont quelques-unes des idées que j'ai développé cette expérience, la critique bienvenue.

Publié 84 articles originaux · louange 250 won · Vues 150 000 +

Je suppose que tu aimes

Origine blog.csdn.net/ygdxt/article/details/92011679
conseillé
Classement