
朋友的单位有一个小型的图书室,图书室中摆放了很多的书,每本书都被编号放在对应的区域,为了让大家更快、更容易找到这些书,他联系我,让我帮他弄一个图书查询系统,通过用户输入能模糊匹配到对应的结果,并且提供书籍对应的地点。
功能设计
让朋友把书籍整理并存储到一个 Excel 表格中;
将 Excel 表放到对象存储中,云函数读取这个文件并解析;
根据词语的相似寻找相似的图书;
前端页面通过 MUI 制作,放在对象存储中,并且使用对象存储的 Website 功能;
整体实现
数据形态
Excel 样式主要包括书名和编号,同时下面包括分类的 tab:

基于函数的搜索功能
核心代码实现:
import jieba
import openpyxl
from gensim import corpora, models, similarities
from collections import defaultdict
import 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.sheetnames
for 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>
</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 框架和部分服务器软件的安装和使用、维护等。这个例子非常小,但却是一个有趣的小工具,除了图书查询之外,我们还可以继续拓展构建其它系统,例如成绩查询等。
更多内容推荐
实现 pipe-filter framework
2019 年 4 月 9 日
搜狗信息流推荐算法实践
本文主要介绍搜狗的推荐系统架构,文章NLP,召回算法,个性化排序四个方面的实践经验。
Index Template 和 Dynamic Template
2019 年 7 月 9 日
利用原生 Serverless 与 Flask 框架开发一个博客系统
本文通过原生 Serverless 项目开发和 Flask 框架部署实现了一个基于 Python 语言的博客系统,在这个系统实现了文章发布、自动撰写文章的关键词和摘要,还可以进行留言评论的管理。
常用特殊符号大全
常用特殊符号大全
2021 年 9 月 11 日
Serverless 实战:如何结合 NLP 实现文本摘要和关键词提取?
对文本进行自动摘要的提取和关键词的提取,属于自然语言处理的范畴。提取摘要的一个好处是可以让阅读者通过最少的信息判断出这个文章对自己是否有意义或者价值,是否需要进行更加详细的阅读;而提取关键词的好处是可以让文章与文章之间产生关联,同时也可以让读者通过关键词快速定位到和该关键词相关的文章内容。
ChaosBlade: 云原生架构下的混沌工程探索和实践
2019 年 11 月 21 日
对象及 Nested 对象
2019 年 8 月 14 日
Serverless 实战:如何为你的头像增加点装饰?
每到大型节假日,我们常会发现社交平台都会提供生成头像装饰的小工具,很是新奇好玩。
浏览器 API(小实验):动手整理全部 API
浏览器的API数目繁多,但我们没法把课程变成API参考手册,所以这一节课,我设计了一个实验,一起来给API分分类。
2019 年 4 月 18 日
《计算机网络 PDF》搞起!
Hey guys ,这里是程序员cxuan,欢迎你收看我最新一期文章。
2021 年 7 月 16 日
标题
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddaaaaaaaaaaaaa
2020 年 6 月 9 日
Serverless 实战:3 分钟实现文本敏感词过滤
敏感词过滤是随着互联网社区一起发展起来的一种阻止网络犯罪和网络暴力的技术手段,通过对可能存在犯罪或网络暴力的关键词进行有针对性的筛查和屏蔽,能够防患于未然,将后果严重的犯罪行为扼杀于萌芽之中。
Windows Server 2019 安装提要 (及 VS 2019 Build Tool)
Windows Server 2019 (Core, Desktop Expirience, …) 安装提要,以及 Visual Studio 2019 Build Tool 安装提要…
2021 年 8 月 18 日
微信小程序画布组件 canvas
无
2018 年 4 月 11 日
基于 Serverless 重构编程学习小工具
基于 Serverless 架构重构项目,主要有两大优势,一是会让个人开发者的运维工作变得简单,不用再关心服务器健康、不用关心流量洪峰;二是 Serverless 架构是按量付费,虽然在一定程度上,Serverless 架构会让所依赖的产品维度变多,但只要控制、评估得好,成本节约效果是非常显著的。
如何在 Serverless 架构下优雅上传文件?
Serverless可以看作是一个新的技术、新的架构。我们在接触新鲜事物的时候,或多或少都要有一个适应期,如何在Serverless架构下上传文件,就是需要适应的部分。
推荐阅读
嗯,挺全乎儿的,Spring Boot 多环境配置都在这里了,你喜欢哪种?
2020 年 11 月 13 日
面试题:二维网格中的单词搜索问题
2018 年 11 月 9 日
测试开发之系统篇 -Docker 常用操作
2021 年 8 月 19 日
“查询关键字理解”三部曲之扩展
2017 年 12 月 1 日
史上最全的 Java 面试题库宝典,Github 上标星 200k,太香了!
2021 年 4 月 6 日
博客推荐系统——物料准备 (第一部分)
文档的父子关系
2019 年 8 月 21 日
电子书

大厂实战PPT下载
换一换 
何亦凡 | 红枣科技 创始人&CEO、BSN发展联盟常务理事
马晓宇 | PingCAP 实时分析产品负责人
魏伟 | 华为 毕昇编译器架构师
评论