使用微信公眾號開發模擬面試功能


最近在整理我在大廠面試以及平時工作中遇到的問題,記錄在 shfshanyue/Daily-Question 中,但覺得對於時時回顧,常常復習仍然做的不夠。

於是在微信公眾號中開發了隨機生成模擬面試的功能,由於覺得比較簡單且有趣,於是分享了出來

需求

先來談一談需求點:

  1. 在公眾號中回復面試,隨機生成 N 道大廠面試題
  2. 每道面試題指向一個超鏈接,可以查看答案

需求很簡單,如圖下所示。你也可以去我的公眾號 全棧成長之路 查看實現效果

內容

在大部分行業中,內容是至為重要的,有內容才會有好的服務,而技術只是整合內容的一種手段。

在本次功能開發中也是如此:一個面試題庫才是至關重要

為此,我在 github 上新建了一個倉庫,使用 Issue 來記錄我在大廠面試中所遇到的面試題及答案

每天一道面試題,有關前端,后端,devops以及軟技能,促進職業成長,敲開大廠之門。

到此一步,我擁有了自己的內容,並且擁有了開箱即用的后台管理系統: github issues

數據

此時我們已經擁有了一個特殊的后台管理系統,但很遺憾,由於該管理系統的特殊性,我們並不是數據映射管理系統,而需要根據 Github Issues 來生成結構化的數據,好在我們可以使用 Github API。

Github API 現在已經全部變成了 GraphQL 接口,看來大家又需要學習一門新的技術了。關於 Github API 的文檔可以在這里找到: Github API Explorer

以下 Query 就是我們所需要的數據

query ISSUES ($after: String) { 
  repository (name: "Daily-Question", owner: "shfshanyue") {
    id
    issues (first: 100, after: $after, states: OPEN) {
      pageInfo {
        hasNextPage
        endCursor
      }
      nodes {
        id
        number
        title
        body
        comments (first: 10) {
          nodes {
            id
            body
            star: reactions (content: THUMBS_UP) {
              totalCount
            }
            author {
              login
              url
            }
          }
        }
        labels (first: 5) {
          nodes {
            id
            name
          }
        }
      }
    }
  }
}

微信開發

在微信開發中,定義一條路由,用來處理對關鍵字 面試 的回復

const routes = [{
  default: true,
  handle: handleDefault
}, {
  text: /面試/,
  handle: handleInterview,
}]

根據封裝好的 Issue SDK 隨機選取八個問題,更多代碼可以前往 shfshanyue/wechat

function handleInterview () {
  return issue.randomIssues(8).map((issue, i) =>
    `<a href="https://github.com/shfshanyue/Daily-Question/issues/${issue.number}">${i+1}. ${issue.title.slice(6)}</a>`
  ).join('\n\n')
}

自此微信開發結束,開始部署項目

部署

開發完成之后使用 dockerdocker-compose 部署,traefik 做服務發現及負載均衡。

如果你對它們不夠了解,可以查看我的系列文章 個人服務器運維指南 的案例篇,關於 dockercomposetraefik 等基礎設施的搭建均在本系列中有所介紹。

在生產環境中,通過 https://we.shanyue.tech 暴露服務。

在測試環境中,需要監聽文件重啟。在測試環境通過掛載目錄的方式在 https://we.dev.shanyue.tech 暴露服務。

Dockerfile 較為簡單,配置文件如下

FROM node:10-alpine

WORKDIR /code

ADD package.json /code
RUN npm install --production

ADD . /code

CMD npm start

docker-compose.yaml 配置文件如下

version: '3'

services:
  wechat:
    build: .
    restart: always
    labels:
      - traefik.http.routers.wechat.rule=Host(`we.shanyue.tech`)
      - traefik.http.routers.wechat.tls=true
      - traefik.http.routers.wechat.tls.certresolver=le
    expose:
      - 3000

networks:
  default:
    external:
      name: traefik_default

測試環境與生產環境

當我們需要測試微信公眾號時,直接使用自己的公眾號不太合適,特別是當已有上線內容時。微信官方提供了測試公眾號,我們可以重新填寫 域名 以及 token。在測試環境使用域名 https://we.dev.shanyue.tech

我們在 docker-compose 中使用 service 中的 wechat 代表生產環境,wechat-dev 代表測試環境

wechat-dev 通過文件掛載提供服務,可以更新重啟應用,便可以做到實時更新代碼,並實時在測試公眾號中看到效果。

docker-compose.yaml 配置文件如下

version: '3'

services:
  wechat:
    build: .
    restart: always
    labels:
      - traefik.http.routers.wechat.rule=Host(`we.shanyue.tech`)
      - traefik.http.routers.wechat.tls=true
      - traefik.http.routers.wechat.tls.certresolver=le
    expose:
      - 3000

  wechat-dev:
    image: 'node:10-alpine'
    restart: always
    volumes:
      - .:/code
    working_dir: /code
    command: npm run dev
    labels:
      - traefik.http.routers.wechat-dev.rule=Host(`we.dev.shanyue.tech`)
      - traefik.http.routers.wechat-dev.tls=true
      - traefik.http.routers.wechat-dev.tls.certresolver=le
    expose:
      - 3000

networks:
  default:
    external:
      name: traefik_default

關於后端代碼,托管在 shfshanyue/wechat


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM