如何從零開始擼個高考查分小程序?

2021-03-02 程序人生

作者 | 月小水長

責編 | 伍杏玲

剛高考完的學生們,心情並未放鬆下來,畢竟分數還沒下來。

今年的高考報名人數達到了 1031 萬的新高,作為一名三年前參考高考的準程序猿,加班加點從零開始做了一款高考查分小程序,算是一名老學長送給學弟學妹們的高考禮。關於小程序的介紹,可以參考我上一篇文章 歷年高考錄取分數線查詢,今天主要談談技術原理和實現細節。

數據來源

小程序後臺共收錄近 30萬條數據,包含 2008-2017 年所有重點高校的各個批次的文理分科錄取分數線以及 2008-2018 所有採用新課標一卷、新課標二卷、新課標三卷以及部分自主命題省份的從提前批到高職專科批的錄取分數線,勉強稱得上內容翔實。

所有數據均採集自各大院校和各高考相關網站,由於數據量巨大,為提高速度,使用了 concurrent.futures (需要 Python3.5+) 模塊裡的 ThreadPoolExecutor 來構建線程池來並發執行多任務。

資料庫採用的是 PgSQL,一款號稱世界上最強大的開源資料庫產品,所有數據均存在新建的 gaokao 資料庫中,其下有兩個表:university (院校的錄取分)和 province (省份的批次線)

university 表:

province 表:

30萬的數據量,多個站點,並發爬取,數據衝突是不可避免地,在執行插入之前,首先過濾掉殘缺不全的數據,比如在插入 university 表時某條數據缺少 pc 欄位,那麼這條記錄就應該被捨棄。

最嚴重的是數據重複,我採用的解決辦法是:先查詢待插入的數據是否已經存在, university 表的主碼是(name,stu,stu_wl,pc,year),因為現實約束一個院校只能在一個年份在一個類別一個批次只能有一個錄取平均分,如果不存在,才執行最後的插入,並 commit 提交事務。

後臺搭建

在 30w  條數據拿到後,我打算後臺採用 Flask+PgSQL 的模式實現,甚至在後臺在阿里雲伺服器部署好,小程序端在開發者工具聯調通過之後,小程序上線遇到到一個大麻煩,因為小程序要求線上運行不能通過 IP 地址訪問後臺,必須通過備案的域名訪問,域名購買一個倒不麻煩,只是域名備案比較耗時間,需要一周多時間,而當時距離高考也就不到 5 天,在手足無措之時,無意間看到小程序雲開發,關於小程序雲開發,官網的介紹是:

開發者可以使用雲開發開發微信小程序、小遊戲,無需搭建伺服器,即可使用雲端能力。

雲開發為開發者提供完整的原生雲端支持和微信服務支持,弱化後端和運維概念,無需搭建伺服器,使用平臺提供的 API 進行核心業務開發,即可實現快速上線和迭代,同時這一能力,同開發者已經使用的雲服務相互兼容,並不互斥。

也就是說,只要把數據導入小程序自帶的後臺,就能通過小程序平臺的 API 訪問到這些數據,以前了解過第三方的 LeanCloud 雲 和 Bomb 雲,沒想到小程序現在集成了這些功能,不得不佩服一下騰訊。

也就是,接下來的後臺的工作是主要是導入數據,查詢小程序後臺可知,後臺支持導入 JSON 或者 CSV 格式的數據。於是我就寫了個腳本,把數據從本地資料庫導出到 JSON 文件中:

import psycopg2
import json


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)


with open("province.json", 'w', encoding="utf-8") as f:
    f.write(json.dumps(result, indent=2, ensure_ascii=False))

這裡還有個坑需要說明一下,小程序後臺要求的 JSON 格式和我們平常意義上的 JSON 格式還有點區別,首先,JSON 的所有內容不能被 [ 和 ] 包括起來,而且每個被 {} 所包括得數據項之間不能有逗號。

選用 NotePad++ 打開原來的 JSON 文件,使用替換功能就能解決,把 [ 和 ] 替換成空格,把 },替換成 } 即可。

修改之後,在小程序後臺通過導入該 JSON 文件,後臺搭建就基本完成了。

小程序端編寫

關於小程序端的編寫,我主要談談兩點經驗,第一是頁面的編寫,比如下面這個界面。

最開始想實現這樣的效果,完全沒有思路,最後在從自定義模態彈窗那得到了思路,一開始地區院校這個下拉框對應的布局是隱藏的,在 WXML文件中通過 hidden=true 控制,一點擊 地區/院校 下拉框,就把 hidden 置為 false,如果開始有其他下拉框對應的布局的 hidden 屬性是 false 的話,同時要把這些布局的 hidden 屬性置為 true 來隱藏其他布局。

當然,這裡的 true or false 需要在 JS 文件裡通過 setData() 動態修改,把修改後的數據從數據層渲染到視圖層。

第二是關於小程序雲開發的原生 Bug,查詢後臺時一次只能最多只能查詢到 20 條數據,要實現一次得到所有匹配的結果,需要解決兩個問題:

第一個問題很自然而然就能想到,第一次查到 20 條數據後,第二次跳過前 20 條再取 20 條,第三次跳過前 40 條再取 20 條,以此類推。

還有一個更為致命的問題,查詢後臺的 API 獲取結果的回調函數的異步,也就是說,為了保證獲得完整數據,第二次查詢需要寫在第一次查詢的回調裡,第三次查詢需要寫在第二次查詢的回調裡,而且你還不能顯式地知道要查詢多少次,需要寫多少層這樣的嵌套,以及煩人的同名變量覆蓋問題,這就是所謂的異步地獄。為了解決這個問題,需要我們編寫代碼把這個異步方法轉成同步的,具體做法是:

先在所要添加功能的JS頁面中導入 runtime.js 文件,同時把runtime.js文件放入相應文件夾:

const regeneratorRuntime = require("../runtime");

runtime.js 下載地址:

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

同時模仿下例代碼完成業務邏輯:


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)
        
        
        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()
          
          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()

以上就是我本次開發的一些心得體會,歡迎批評指正。

作者簡介:月小水長(ID:inspurer),某 985 計算機學院在校生,熟悉 C++、Java、Python 等多種語言,有大型軟體項目開發經驗,致力於安卓、計算機視覺、爬蟲、數據可視化開發,同時也是業餘的前端愛好者。

6月29-30日,2019以太坊技術及應用大會特邀以太坊創始人V神與以太坊基金會核心成員,以及海內外知名專家齊聚北京,聚焦前沿技術,把握時代機遇,深耕行業應用,共話以太坊2.0新生態。掃描下方二維碼,即享優惠購票!

 熱 文 推 薦 

戳他了解更多↓↓↓

☞邊緣計算將吞掉雲計算!

☞程式設計師代碼排錯的正確姿勢,竟是從老中醫學的?

☞漫畫:Java 那麼多鎖,能鎖住滅霸嗎?

☞開源「大地震」下,華為如何複製 Google 模式?

☞回報率850%? 這個用Python優化的比特幣交易機器人簡直太燒腦了...

☞谷歌用1.2萬個模型「推翻」現有無監督研究成果!斬獲ICML 2019最佳論文

☞24式,加速你的Python

☞17 歲的程式設計師告訴你關於編程的 7 個重要教訓!

☞「是!網際網路從此沒有 BAT!」

相關焦點

  • 高考查分即將開始,分享幾種查分渠道!
    近日起,2020年高考成績開始放榜,各地分數線陸續公布。接下來給大家提供幾種查分渠道:1、支付寶上支付寶平臺搜索「高考」即可進行分數查詢。2、微信搜一搜中搜索「國家政務服務平臺」小程序,進入高考成績查詢。還未開放成績查詢的城市,可訂閱高考成績查詢時間通知。
  • 2020高考成績開始放榜!各地分數線陸續公布:高考查分攻略在此
    今日起,2020高考成績開始放榜,各地分數線陸續公布。據央視新聞報導,目前,內蒙古、廣西、江西、重慶、安徽、湖南、寧夏等地已公布高考分數線。支付寶、微信、百度等各大平臺也紛紛推出查分渠道。查分渠道:1、支付寶上支付寶平臺搜索「高考」即可進行分數查詢。2、微信微信搜一搜搜索「國家政務服務平臺」小程序,進入高考成績查詢。還未開放成績查詢的城市,可訂閱高考成績查詢時間通知。
  • 部分地區高考日語查分正式開始!(附全國查分時間表)
    廣東、重慶、四川、湖南、廣西、湖北、江西、雲南、甘肅、內蒙古、寧夏、上海、安徽等10餘省份的考生可以正式查詢自己的高考成績。高考查分、報志願時間具體如下↓圖片來源:高考快訊需要提醒的是,查詢信息時,要通過官網認證的連結或學校、教育部門官方發布的網址進入,防止誤入釣魚網站!
  • 2020年高考成績開始放榜 21省份可查 內附高考查分網站
    核心提示:今天起,全國各地將陸續進入高考「放榜」時間。將近兩周的等待後,考生們終於盼到了成績出爐。高考成績公布後,接下來考生將進入到志願填報的關鍵環節。
  • 2020高考成績開始放榜 10餘省份考生今日可查分
    中新網客戶端北京7月23日電 今天起,全國各地將陸續進入高考「放榜」時間。將近兩周的等待後,考生們終於盼到了成績出爐。各省份的查分日期是哪天?都有哪些便捷的查分途徑?成績有異議又該怎麼辦?這些核心信息一起來了解!
  • 2020高考成績查詢開始,超20省份學生可上支付寶查分
    投中教育7月23日訊,據中國教育在線官網,7月23日0時起正式拉開高考查分序幕。據悉,今年能在支付寶上查高考成績的省份大幅增加,共計超過20個省(直轄市)考生可以通過支付寶查詢高考成績。 同時,支付寶還提供查分訂閱服務,提前訂閱自己的所屬省份,發榜後即可收到小程序的查分提醒推送。
  • 「收藏」微信+支付寶高考查分教程
    今天開始,各地高考成績陸續開始可以查詢了,「2020高考成績開始放榜」和「高考查分」都登上了熱搜榜!「事兒哥」還記得當年高考查分的時候,歡迎留言區聊聊哦~文字版教程: 1、打開微信,在小程序裡搜索「國家政務服務平臺」,進入後可以看到
  • 2020北京高考查分時間是幾月幾號幾點?
    2020年全國高考報名人數為1071萬人,比去年增加40萬人。從7月23日開始,全國各地將陸續公布2020年高考成績和各批次錄取分數線。  2020北京高考查分時間:7月25日12時  2020北京高考查分渠道:  1、北京教育考試院網站(www.bjeea.cn,www.bjeea.edu.cn)  2、國家政務服務平臺北京旗艦店  3
  • 高考即將放榜!各地查分時間看這裡
    按照各地此前公布的日程,明天開始,全國各地將陸續開始公布2020高考成績,各批次錄取分數線也將出爐。今天開始至28日,教育部「2020年高考網上諮詢周」活動將在「陽光高考信息平臺」正式啟動。2020高考成績即將放榜!
  • 廣東高考查分小技巧:這樣查成績,快人一步
    7月23日17點45分,廣東省教育考試院將舉行廣東省2020年普通高校招生新聞發布會,第一時間權威發布今年廣東高考各批次錄取最低控制分數線,進行政策解讀。這就意味著比原定放榜時間提前了兩天!不過每年高考放榜都會造成網站大塞車,讓學生和家長只能坐在電腦面前苦苦等待。不過不用怕,培優君教你一招,喜訊早知道!
  • 2020高考成績今日開始放榜 百度App等可查分
    來源:TechWeb.com.cn【TechWeb】7月23日消息,今日起全國多地2020年高考成績開始陸續放榜,考生也可以開始查詢分數。為方便考生和家長及時查詢成績,除了各地教育考試院官網外,百度App、支付寶、微信等均開通了查分入口。
  • 如何開發一個微信查成績小程序?微信查成績小程序要怎麼做?
    為此微信查成績小程序也就成了不少老師們的剛需;那麼微信查成績小程序叫什麼?  回答這個問題之前,我們需要先了解一下查成績系統的製作流程,其實常規的查成績系統的製作成本高昂,需要專門定製化,自定義配置也較低、實現方式複雜繁瑣、用戶操作性較低,很多時候也只能PC端使用;當然,我們這裡提到的是傳統的查詢系統的製作方式了!對於技術高度發達的當代,自然也是有解決上述問題的方法了!
  • 明天凌晨開始,高考成績可以陸續查分啦
    7月23號凌晨0點開始,也就是明天,就可以查詢高考成績了,分數即將出爐,高考考生們,此時你是什麼感受?成績還沒出來之前,心裡都在想高考成績,每天的心情都是七上八下,說不出的焦慮與不安吧。其實,大家對自己的實力是很清楚的,冷靜預估,分數其實相差不會很大,無非就是個別科目和題目抱有一定的僥倖心理吧。好了,不多說了,讓我們平復下心情,選擇去接受明天的成績吧!不論分數結果如何,我還是希望所有同學都能考上自己的理想大學。分數不是很重要,選擇好大學和專業才最重要不是嗎?
  • 高考即將放榜!黑龍江考生上支付寶可查分查錄取
    7月23日起,2020 高考查分正式開始,黑龍江考生今年能用支付寶查高考成績的省份大幅增加,共計超過20個省(直轄市)考生可以通過支付寶查詢高考成績。此外,支付寶還提供查分訂閱服務,提前訂閱自己的所屬省份,發榜後即可收到小程序的查分提醒推送。根據公告,從7月23日開始,全國各地的高考成績將陸續公布,首批上海、湖北、四川、河北、廣東等省市將在23日當天開放查詢。
  • 高考即將放榜 陝西考生可上支付寶查分查錄取
    記者從支付寶了解到,今年能用支付寶查高考成績的省份大幅增加,包括陝西等20個省(直轄市)。 7月24日,陝西考生可以通過支付寶查詢高考成績,考生可提前訂閱,發榜後即可收到小程序的查分提醒推送。根據公告,從7月23日開始,全國各地的高考成績將陸續公布,陝西省7月24日放榜開放查詢。屆時,考生或家長上支付寶平臺搜索「高考」即可進行分數查詢。此外,今年支付寶繼續與教育部中國教育在線合作,並在去年基礎上推出了查分和查錄取的一站式服務。考生和家長可以獲取包括學校名單查詢、專業查詢在內的五大類服務。
  • 明起(23日)開始高考查分,附31省市查分時間和渠道。記得收藏
    不知道高考完的孩子現在緊不緊張,從明天開始就可以查到自己的考試成績了!高考成績查到後,立馬就是緊張的志願填報、學校選擇、謝師宴、同學聚會等等一系列的事情,那麼具體每個省市的查分時間和方式有哪些呢?我們一起來看:7月23日:可在7月23日(即明天)查分的有河北、內蒙古、上海、安徽、江西、湖北、廣西、四川、雲南、甘肅、寧夏等省市自治區;7月24日:可在7月24日查分的有山西、黑龍江、江蘇、福建、重慶、貴州、西藏、陝西、新疆等省市自治區;7月25日:可在7月25日查分的有
  • 高考查分的那天……心情五味雜陳
    高考查成績的心情我記得我高考查分的那天,上午十點出成績,提前登錄查分網站就已經卡得不行,很多同學也登錄不進去,這對著急查分數的我們的來說,更增添了焦慮的心態。高考查分攻略很多年前高考查成績還是由學校粘貼考試榜單,後來出現了簡訊發送成績單和電話查詢;網絡發達的現在可以由當地考試院網站登錄查詢成績,還有微信、支付寶等多個快捷入口,方便同學們在第一時間查到自己的分數。
  • 高考即將放榜!江蘇考生查分時間…
    按照各地此前公布的日程,明天開始,全國各地將陸續開始公布2020高考成績,各批次錄取分數線也將出爐。今天開始至28日,教育部「2020年高考網上諮詢周」活動將在「陽光高考信息平臺」正式啟動。7月9日,江蘇省南通中學考點,考生陸續走出考場。
  • 2020高考分數查詢官網地址 微信小程序、微信搜一搜高考分數查詢入口
    2020年7月23日起,全國各地高考成績陸續放榜。各地放榜後,考生可通過國家政務服務平臺微信小程序、微信搜一搜、城市服務等入口在微信裡進行高考成績查詢。在微信裡,高考分數查詢可以通過以下三種方式——首先,考生可通過微信搜一搜(打開微信-發現-搜一搜)搜索「國家政務服務平臺」小程序,在首頁找到「高考成績查詢」服務進行查詢,該平臺在高考成績未公布前提供「訂閱服務」功能,考生根據提示輸入信息後可及時收到成績查詢通知。
  • 從零開始:微信小程序新手入門寶典
    為了方便大家了解併入門微信小程序,我將一些可能會需要的知識,列在這裡,讓大家方便的從零開始學習;首先感謝幾位給予建議的同學