写点什么

基于 Serverless 快速实现简单版查询工具

  • 2020-06-28
  • 本文字数:7777 字

    阅读完需:约 26 分钟

基于Serverless快速实现简单版查询工具

朋友的单位有一个小型的图书室,图书室中摆放了很多的书,每本书都被编号放在对应的区域,为了让大家更快、更容易找到这些书,他联系我,让我帮他弄一个图书查询系统,通过用户输入能模糊匹配到对应的结果,并且提供书籍对应的地点。

功能设计

  • 让朋友把书籍整理并存储到一个 Excel 表格中;

  • 将 Excel 表放到对象存储中,云函数读取这个文件并解析;

  • 根据词语的相似寻找相似的图书;

  • 前端页面通过 MUI 制作,放在对象存储中,并且使用对象存储的 Website 功能;

整体实现

数据形态

Excel 样式主要包括书名和编号,同时下面包括分类的 tab:


基于函数的搜索功能

核心代码实现:


import jiebaimport openpyxlfrom gensim import corpora, models, similaritiesfrom collections import defaultdictimport urllib.request
with open("/tmp/book.xlsx", "wb") as f: f.write( urllib.request.urlopen("https://********").read() )

top_str = "abcdefghijklmn"book_dict = {}book_list = []wb = openpyxl.load_workbook('/tmp/book.xlsx')sheets = wb.sheetnamesfor eve_sheet in sheets: print(eve_sheet) sheet = wb.get_sheet_by_name(eve_sheet) this_book_name_index = None this_book_number_index = None for eve_header in top_str: if sheet[eve_header][0].value == "书名": this_book_name_index = eve_header if sheet[eve_header][0].value == "编号": this_book_number_index = eve_header print(this_book_name_index, this_book_number_index) if this_book_name_index and this_book_number_index: this_book_list_len = len(sheet[this_book_name_index]) for i in range(1, this_book_list_len): add_key = "%s_%s_%s" % ( sheet[this_book_name_index][i].value, eve_sheet, sheet[this_book_number_index][i].value) add_value = { "category": eve_sheet, "name": sheet[this_book_name_index][i].value, "number": sheet[this_book_number_index][i].value } book_dict[add_key] = add_value book_list.append(add_key)

def getBookList(book, book_list): documents = [] for eve_sentence in book_list: tempData = " ".join(jieba.cut(eve_sentence)) documents.append(tempData) texts = [[word for word in document.split()] for document in documents] frequency = defaultdict(int) for text in texts: for word in text: frequency[word] += 1 dictionary = corpora.Dictionary(texts) new_xs = dictionary.doc2bow(jieba.cut(book)) corpus = [dictionary.doc2bow(text) for text in texts] tfidf = models.TfidfModel(corpus) featurenum = len(dictionary.token2id.keys()) sim = similarities.SparseMatrixSimilarity( tfidf[corpus], num_features=featurenum )[tfidf[new_xs]] book_result_list = [(sim[i], book_list[i]) for i in range(0, len(book_list))] book_result_list.sort(key=lambda x: x[0], reverse=True) result = [] for eve in book_result_list: if eve[0] >= 0.25: result.append(eve) return result

def main_handler(event, context): try: print(event) name = event["body"] print(name) base_html = '''<div class='mui-card'><div class='mui-card-header'>{{book_name}}</div><div class='mui-card-content'><div class='mui-card-content-inner'>分类:{{book_category}}<br>编号:{{book_number}}</div></div></div>''' result_str = "" for eve_book in getBookList(name, book_list): book_infor = book_dict[eve_book[1]] result_str = result_str + base_html.replace("{{book_name}}", book_infor['name']) \ .replace("{{book_category}}", book_infor['category']) \ .replace("{{book_number}}", book_infor['number'] if book_infor['number'] else "") if result_str: return result_str except Exception as e: print(e) return '''<div class='mui-card' style='margin-top: 25px'><div class='mui-card-content'><div class='mui-card-content-inner'>未找到图书信息,请您重新搜索。</div></div></div>'''
复制代码


同时配置 APIGW:


功能页面

<!DOCTYPE html><html><head>    <meta charset="utf-8">    <title>图书检索系统</title>    <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">    <meta name="apple-mobile-web-app-capable" content="yes">    <meta name="apple-mobile-web-app-status-bar-style" content="black">
<link rel="stylesheet" href="https://others-1256773370.cos.ap-chengdu.myqcloud.com/booksearch/css/mui.min.css"> <style> html, body { background-color: #efeff4; } </style> <script> function getResult() { var UTFTranslate = { Change: function (pValue) { return pValue.replace(/[^\u0000-\u00FF]/g, function ($0) { return escape($0).replace(/(%u)(\w{4})/gi, "&#x$2;") }); }, ReChange: function (pValue) { return unescape(pValue.replace(/&#x/g, '%u').replace(/\\u/g, '%u').replace(/;/g, '')); } };
var xmlhttp; if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, Opera, Safari 浏览器执行代码 xmlhttp = new XMLHttpRequest(); } else { // IE6, IE5 浏览器执行代码 xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4 && xmlhttp.status == 200 && xmlhttp.responseText) { document.getElementById("result").innerHTML = UTFTranslate.ReChange(xmlhttp.responseText).slice(1, -1).replace("\"",'"'); } } xmlhttp.open("POST", "https://********", true); xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlhttp.send(document.getElementById("book").value); } </script></head><body><div class="mui-content" style="margin-top: 50px"> <h3 style="text-align: center">图书检索系统</h3> <div class="mui-content-padded" style="margin: 10px; margin-top: 20px"> <div class="mui-input-row mui-search"> <input type="search" class="mui-input-clear" placeholder="请输入图书名" id="book"> </div> <div class="mui-button-row"> <button type="button" class="mui-btn mui-btn-numbox-plus" style="width: 100%" onclick="getResult()">检索 </button>&nbsp;&nbsp; </div> </div> <div id="result"> <div class="mui-card" style="margin-top: 25px"> <div class="mui-card-content"> <div class="mui-card-content-inner"> 可以在搜索框内输入书籍的全称,或者书籍的简称,系统支持智能检索功能。 </div> </div> </div> </div></div><script src="https://others-1256773370.cos.ap-chengdu.myqcloud.com/booksearch/js/mui.min.js"></script></body></html>
复制代码

效果展示

为了便于朋友使用,我将这个页面用 Webview 封装成一个 APP,整体效果如下:


总结

这是一个低频使用的 APP,如果是构建在传统服务器上,不是一个明智的选择,而云函数的按量付费,对象存储与 APIGW 的融合,完美解决了资源浪费的问题,同时借用云函数的 APIGW 触发器,可以很简单轻松的替代传统的 Web 框架和部分服务器软件的安装和使用、维护等。这个例子非常小,但却是一个有趣的小工具,除了图书查询之外,我们还可以继续拓展构建其它系统,例如成绩查询等。


2020-06-28 16:341691

评论

发布
暂无评论
发现更多内容

不懂源码可以去面试?阿里P7:Spring源码解析整套笔记分享

Java架构师迁哥

三位阿里P8大牛精心整理的笔记《并发编程核心讲义》37个知识点全析,4个经典实战案例剖析,归纳总结。

Java架构师迁哥

带你厘清事务一致性(中篇)

小舰

4月日更

Javascript词法结构你懂吗?

前端树洞

JavaScript ecmascript 大前端 4月日更

计算机原理学习笔记Day1

穿过生命散发芬芳

计算机原理 4月日更

Linux内核的进程负载均衡机制

赖猫

Linux Linux内核 linux学习

Java运算符

ベ布小禅

4月日更

潮汐交替,价值重组:2021数字化转型看什么?

脑极体

COBIT2019中核心模型(目标)、设计因素、治理系统和系统组件的关系

ming_hgm

cobit

电商/零售行业速入!开启个性化推荐,让新品购买率无限 up~

亚马逊云科技 (Amazon Web Services)

架构训练营模块 1 作业 - 张动动

张大彪

架构训练营

架构实战营模块一作业

刁寿钧

架构实战营

我们帮助 IoTeX 实现万物可信互联,用区块链连接世界 | 精选案例

亚马逊云科技 (Amazon Web Services)

智能小车系列-树莓派UPS-X750电源

波叽波叽啵😮一口盐汽水喷死你

树莓派 nodejs X750 树莓派UPS I2C

黄金圈法则 - 识别真伪需求的神器

石云升

思维模型 28天写作 职场经验 4月日更

一文搞定数据响应式原理

执鸢者

Vue 数据响应式原理

领域驱动设计101 - 分层

luojiahu

领域驱动设计 DDD

【LeetCode】丑数Java题解

Albert

算法 LeetCode 4月日更

华米科技与亚马逊云科技宣布战略合作,加速覆盖全球“芯端云”战略布局

亚马逊云科技 (Amazon Web Services)

亚马逊云科技宣布为 Amazon EFS 提供低成本存储级别!

亚马逊云科技 (Amazon Web Services)

Spring Boot Admin 2.1.0 全攻略

学Java关注我

Java 程序员 架构 互联网 技术宅

自考答题卡识别初级解决方案,基于 Python OpenCV

梦想橡皮擦

Python OpenCV 4月日更

C++ 虚函数表剖析

赖猫

c++ C/C++ 封装、继承、多态

亚马逊云科技 x 外研在线 | 将科技融入教育,用 AI 点亮数字化创新!

亚马逊云科技 (Amazon Web Services)

瞬间爆炸,凭借阿里P9的Java 核心技能精讲,直接让我在三月斩获了21个offer

Java架构师迁哥

平面设计之PS(后)

空城机

PhotoShop ps 4月日更

Nocode 进阶 | 迎接 Amazon Honeycode,敲开 NoCode 开发大门(上)

亚马逊云科技 (Amazon Web Services)

大神,膜拜!SpringMVC高能笔记分享,从头到尾,都是精华

Java架构师迁哥

不是吧,都2021年了你还不知道有面试全真宝典这个东西吧!

Java架构师迁哥

有点东西,《阿里内部Redis学习笔记》这本笔记还融入了大量高并发系统的设计、开发及运维调优经验

Java架构师迁哥

智慧城市应该装上怎样的“大脑”,“学霸”海淀分享了一些心得

脑极体

基于Serverless快速实现简单版查询工具_服务革新_刘宇_InfoQ精选文章