【实战】使用 uniapp 开发一个面试刷题小程序

简介: 直至 5 月也依然是互联网寒冬,大厂裁员的消息在微信群漫天飞舞,而招聘网站上的 HC 也越来也少,因此不少小厂也开始纷纷内卷,压低员工绩效,本应该晋级加薪的时间,也变成了杳无音信。难道我们就束手无策了

highlight: monokai

我正在参加跨端技术专题征文活动,详情查看

前言

Hello,大家好,我是小马,受疫情影响,2022 年,我觉得是互联网最难的一年,直至 5 月也依然是互联网寒冬,大厂裁员的消息在微信群漫天飞舞,而招聘网站上的 HC 也越来也少,因此不少小厂也开始纷纷内卷,压低员工绩效,本应该晋级加薪的时间,也变成了杳无音信。难道我们就束手无策了吗?有句话说的好,“机会永远是留给有准备的人”,话虽不错,但有的人会说,“每天上班忙的要死,能完成任务就不错了,哪有时间准备面试刷题呢?”,因此我决定开发一个面试刷题小程序,让我们可以充分利用一些空闲时间提高自己,比如上班挤地铁的时候,排队做核酸的时候,都可以。

项目体验

微信小程序搜索面试狗或扫码体验。

为什么取名“面试狗”呢?取名模仿自鱼皮大佬的"面试鸭"网站,鸭是谐音,但狗却是“狗头保命”。

功能结构

  • 面试刷题

    • 选择题
    • 简答题
  • 文章

    • 面试技巧
    • 面试经验
  • 视频

    • 视频解析
    • 模拟面试

因为视频都会有版权,个人也不能上架视频类小程序,所以放弃。

技术架构图

面试刷题小程序架构图

技术栈选择

关于跨端开发或者多端开发,一般会使用 Taro 或者 Uniapp

  • 如果是 React 技术栈一般会选择 Taro
  • 如果是 Vue 技术栈一般会选择 Uniapp

我个人本来爱好 react 技术栈,但由于 Uniapp 开发可以有免费的云开发环境(阿里云 50 个,腾讯云 1 个),果断选择 Uniapp。

初始化项目

在开始之前请先

hbuilderX 是 dcloud 开发的代码编辑器,集成了便捷的云开发环境,可以方便我们调试。
如果喜欢使用 vscode 的同学可以参考下面这篇文章。

使用 VSCode 开发 uni-app 教程

新建项目

新建一个空白项目,选择开启 unicloud,选择阿里云。

关联云服务空间

然后关联云服务空间,至此项目初始化完成。

表结构设计

uniCloud 提供了一个 JSON 格式的文档型数据库。顾名思义,数据库中的每条记录都是一个 JSON 格式的文档。所以只需要保存 JSON 格式的数据就会自动往数据库里面插入一条记录。
既然是文档形数据数据库,那么我们为什么要设计数据结构呢,别着急,这个在后面有大用处,我们先按关系形数据库设计表结构。

云数据库控制台

打开云数据库控制台,新建一张表, 取名为 fe-question, 在表结构中输入以下 json,

{
  "bsonType": "object",
  "required": [],
  "permission": {
    "read": true,
    "create": true,
    "update": true,
    "delete": true
  },
  "properties": {
    "_id": {
      "description": "ID,系统自动生成"
    },
    "title": {
      "bsonType": "string",
      "title": "标题",
      "description": "标题",
      "label": "标题",
      "trim": "both"
    },
    "desc": {
      "bsonType": "string",
      "title": "描述",
      "description": "描述",
      "label": "描述",
      "trim": "both"
    },
    "explanation": {
      "bsonType": "string",
      "title": "解析",
      "description": "解析",
      "label": "解析",
      "trim": "both"
    },
    "tagId": {
      "bsonType": "number",
      "title": "tag",
      "description": "标签",
      "label": "标签",
      "trim": "both"
    }
  }
}

这里我就罗列了几个重要字段。表结构创建完成了,接下来我们需要收集下面试题。

数据收集

题目来源

建完表后我们要往表中添加一些数据,这里可以大家可以自行整理,当然也可以使用 node 爬虫,
这里就列几个可能用到的 JS 库

  • axios 用于爬取网页内容
  • cheerio 是服务端的 jquery api,用于获取 dom 节点数据
  • turndown 将 html 转化为 markdown

比如牛客网只需要直接爬接口就可以了

const axios = require("axios");
const fs = require("fs");
const _ = require("lodash");

function sleep(time) {
  return new Promise((reslove) => setTimeout(reslove, time));
}

const headers = {
  "content-type": "application/json; charset=utf-8",
  "user-agent":
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36",
};
const listUrl =
  "https://www.nowcoder.com/api/questiontraining/interview/jobQuestionList";

const detailUrl =
  "https://www.nowcoder.com/api/questiontraining/interview/jobQuestionDetail";

let result = [];

const fetchList = async (page = 1) => {
  console.log("请求第" + page + "页");
  const res = await axios
    .get(listUrl, {
      params: {
        questionJobId: 156,
        questionClassifyId: 0,
        size: 50,
        page,
        _: new Date().getTime(),
      },
      headers,
    })
    .then((res) => {
      return res.data;
    });
  if (res.data.subjectList.length > 0) {
    await fetchDetail(res.data.subjectList);
    await fetchList(page + 1);
  } else {
    console.log("爬完了");
    fs.writeFileSync("fe-question.json", JSON.stringify(result));
  }
};

const fetchDetail = async (data) => {
  for (let index = 0; index < data.length; index++) {
    const item = data[index];
    //await sleep(1000);
    const res = await axios
      .get(detailUrl, {
        params: {
          questionId: item.questionId,
          questionJobId: item.questionJobId,
          questionClassifyId: 0,
          _: new Date().getTime(),
        },
        headers,
      })
      .then((res) => {
        return res.data;
      });
    if (res && res.data) {
      console.log("正在保存:" + res.data.title);

      result.push({
        explanation: res.data.referenceAnswer,
        title: res.data.title,
        desc: res.data.content,
        tag: _.get(res.data.questionTags, "[0].name"),
      });
    }
  }
};
fetchList();

上面代码,可以用于很多类似网站,先爬列表再爬详情这样的接口数据, sleep函数可以自行控制,这样可以防止服务端阻止爬虫,如有些网站需要登录,可以将cookie复制出来,保存在headers
爬虫截图

云函数获取数据

有了数据,接下来我们就需要实现后端逻辑,也就是接口部分。
新建云函数
新建云函数
在 hbuilderX 中选择 cloudFunctions,右键新建云函数,输入函数名称 question-detail
新建完成后,会在 index.js 中生成最简单的云函数代码。

'use strict';
exports.main = async (event, context) => {
    //event为客户端上传的参数
    console.log('event : ', event)

    //返回数据给客户端
    return event
};

event 为客户端上传的参数 ,return 返回数据给客户端,我们修改成如下代码

'use strict';
exports.main = async (event, context) => {
    const db = uniCloud.database();
    const res = await db.collection('fe-question').doc(event.id).get()
    //返回数据给客户端
    return res.data[0]
};

这样就可以根据 id 查询面试题详情了。
那么要如何调试呢,hbuilderX 可以直接配置请求参数,输入请求参数为 JSON 格式
配置测试参数
然后点击运行本地云函数,这样就可以直接运行云函数,拿到返回的 JSON 数据。
云函数运行结果

数据请求

前端页面遵循 vue 语法,只不过数据请求我们必须用 uniCloud 帮我封装好的函数请求数据,

假设我们现在要调用下刚才的面试题详情的云函数,那么前端可以通过如下方式调用这个云函数。

// promise方式
uniCloud.callFunction({
    name: 'fe-question',
    data: { id: 1 }
  })
  .then(res => {
    this.detail=res.result
  });

// callback方式
uniCloud.callFunction({
    name: 'fe-question',
    data: { id: 1 },
    success(){},
    fail(){},
    complete(){}
});

云函数执行结果会存在 result 中,一般会在 onLoad 生命周期中请求数据。

到此,我们的面试小程序前后端可以联调啦。

Markdown 解析

Towxml 是一个可将 HTML、Markdown 转为微信小程序 WXML(WeiXin Markup Language)的渲染库。用于解决在微信小程序中 Markdown、HTML 不能直接渲染的问题。并且在有详情的文档,如何在 uniapp 中使用?可以参考这份文档,这里我不过多赘述。大家若有相关需求,可以参考文档进行开发。

后台管理

按照上面步骤,相信有前端基础的同学,肯定可以开发出类似的功能,但对于云开发来说,我认为最麻烦的是后台管理,刷题小程序开发好了,总需要一个后台维护的地方,虽然 uniapp 有 uni-admin 模板,也可以快速开发出一个后台管理系统,但对于个人开发者来说,需要投入不少成本。

得益于 hbuilderX 中的 schema2code 功能,可以直接根据数据模型直接生成管理页面代码,所以我们可以直接在小程序端管理数据了。

下面我就贴一下文章模块的管理页面的步骤:

首先根据数据字段写好 schema。我这边直接使用了系统自带的 opendb,在 unicloud web 控制台中新建表,选中文章表和类别表,大家可以根据自己的需求增减字段。

unicloud web 控制台中新建表 news 表

在 unicloud web 控制台中表创建完成后,然后在 hbuilderX 中下载所有 DB Schema。

将云端的Schema下载到本地

选中 news 表,右键 schema2code

右键 schema2code 生成代码

勾选需要管理的字段
接着会弹出字段选择页面,我们可以根据需求勾选需要管理的数据字段,点击确定就会自动生成 关于 news 表的增删查改的页面啦。
一起来看下效果
文章列表
新建文章
文章编辑

权限设计

并不能让所有用户都有后台管理权限,所以我们可以根据微信小程序的提供的 openid 来建立用户系统。

下面介绍下主要步骤:

  • 第一步:使用 uni.getUserProfile 来获取头像昵称等信息
  • 第二步:通过微信小程序端 API uni.login获得 code
  • 第三步:在服务端通过 API auth.code2session 就可以获取到用户的 openid 了,
  • 第四步:新建一张表wx_user,将 openId 和用户信息存入云数据库中。

云数据库把自己设置成admin

最后直接把自己的信息设置成 admin, 在小程序端根据 admin 展示后台管理菜单。

根据admin字段显示管理菜单

红色部分并不是对所有人展示,根据 admin 字段显示管理字段。

打包发布

至此我们的面试刷题小程序开发结束了,点击菜单上的发布按钮,我们可以打包成 App、H5 和各种应用的小程序。

hbuilderX 可以发布的小程序列表

我这边发布的是微信小程序,要先打开微信小程序开发者工具,点击发布后,微信小程序开发者会自动运行,点击上传,最后在微信后台发布提交审核即可。
微信小程序发布

小结

一起来总结下

  • 使用 uniApp 和云开发我们可以免费白嫖一个跨端的小程序。
  • 可以利用爬虫抓取一些资源,来丰富我们的内容。
  • 使用 schema2code 可以自动生成后台管理页面
  • 通过用户权限控制,可以在小程序端管理数据,PC 端也可以(用微信客户端打开小程序即可)

以上就是本文全部内容,希望这篇文章对大家有所帮助,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端。

本文首发掘金平台,来源小马博客

相关文章
|
2月前
|
缓存 Java API
Java 面试实操指南与最新技术结合的实战攻略
本指南涵盖Java 17+新特性、Spring Boot 3微服务、响应式编程、容器化部署与数据缓存实操,结合代码案例解析高频面试技术点,助你掌握最新Java技术栈,提升实战能力,轻松应对Java中高级岗位面试。
318 0
|
6月前
|
API 开发者 Windows
uniapp 极速上手鸿蒙开发
uniapp 自版本 `4.28.2024092502` 起支持鸿蒙应用开发,现版本 `4.36.2024112817` 同时支持鸿蒙应用和元服务开发。本文介绍使用 HBuilderX 4.24+ 和 DevEco Studio 进行环境配置、项目创建及运行的详细步骤,涵盖从 AGC 平台新建项目、配置证书到最终运行项目的全流程,帮助开发者快速上手鸿蒙开发。注意:HBuilderX 4.31+ 构建的鸿蒙运行包不支持 x86_64 平台,需使用真机调试。
598 85
uniapp 极速上手鸿蒙开发
|
4月前
|
JavaScript 小程序 API
UniApp X:鸿蒙原生开发的机会与DCloud的崛起之路·优雅草卓伊凡
UniApp X:鸿蒙原生开发的机会与DCloud的崛起之路·优雅草卓伊凡
191 12
UniApp X:鸿蒙原生开发的机会与DCloud的崛起之路·优雅草卓伊凡
|
3月前
|
NoSQL Java 微服务
2025 年最新 Java 面试从基础到微服务实战指南全解析
《Java面试实战指南:高并发与微服务架构解析》 本文针对Java开发者提供2025版面试技术要点,涵盖高并发电商系统设计、微服务架构实现及性能优化方案。核心内容包括:1)基于Spring Cloud和云原生技术的系统架构设计;2)JWT认证、Seata分布式事务等核心模块代码实现;3)数据库查询优化与高并发处理方案,响应时间从500ms优化至80ms;4)微服务调用可靠性保障方案。文章通过实战案例展现Java最新技术栈(Java 17/Spring Boot 3.2)的应用.
197 9
|
3月前
|
缓存 算法 NoSQL
校招 Java 面试高频常见知识点深度解析与实战案例详细分享
《2025校招Java面试核心指南》总结了Java技术栈的最新考点,涵盖基础语法、并发编程和云原生技术三大维度: 现代Java特性:重点解析Java 17密封类、Record类型及响应式Stream API,通过电商案例演示函数式数据处理 并发革命:对比传统线程池与Java 21虚拟线程,详解Reactor模式在秒杀系统中的应用及背压机制 云原生实践:提供Spring Boot容器化部署方案,分析Spring WebFlux响应式编程和Redis Cluster缓存策略。
78 1
|
6月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
276 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
3月前
|
缓存 NoSQL Java
校招 Java 面试常见知识点及实战案例全解析
本文全面解析了Java校招面试中的常见知识点,涵盖Java新特性(如Lambda表达式、、Optional类)、集合框架高级应用(线程安全集合、Map性能优化)、多线程与并发编程(线程池配置)、JVM性能调优(内存溢出排查、垃圾回收器选择)、Spring与微服务实战(Spring Boot自动配置)、数据库与ORM框架(MyBatis高级用法、索引优化)、分布式系统(分布式事务、缓存应用)、性能优化(接口优化、高并发限流)、单元测试与代码质量(JUnit 5、Mockito、JaCoCo)以及项目实战案例(电商秒杀系统、社交消息推送)。资源地址: [https://pan.quark.cn/s
139 4
|
4月前
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
424 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
5月前
|
监控 前端开发 小程序
陪练,代练,护航,代打小程序源码/前端UNIAPP-VUE2.0开发 后端Thinkphp6管理/具备家政服务的综合型平台
这款APP通过技术创新,将代练、家政、娱乐社交等场景融合,打造“全能型生活服务生态圈”。以代练为切入点,提供模块化代码支持快速搭建平台,结合智能匹配与技能审核机制,拓展家政服务和商业管理功能。技术架构具备高安全性和扩展性,支持多业务复用,如押金冻结、录屏监控等功能跨领域应用。商业模式多元,包括交易抽成、增值服务及广告联名,同时设计跨领域积分体系提升用户粘性,实现生态共生与B端赋能。
427 12
|
8月前
|
缓存 架构师 Java
Maven实战进阶(01)面试官:Maven怎么解决依赖冲突?| 有几种解决方式
本文介绍了Maven的核心功能和依赖管理技巧。Maven是基于项目对象模型(POM)的构建工具,具备跨平台、标准化、自动化等特性。其三大核心功能为依赖管理、仓库管理和项目构建。依赖管理通过pom.xml文件引入第三方组件并自动下载;仓库管理涉及中央仓库、私服和本地仓库;项目构建则通过生命周期管理编译、测试、打包等流程。文章还详细讲解了依赖冲突的解决方法,包括默认规则、手工排除和版本指定等策略。

热门文章

最新文章