朋友的单位有一个小型的图书室,图书室中摆放了很多的书,每本书都被编号放在对应的区域,为了让大家更快、更容易找到这些书,他联系我,让我帮他弄一个图书查询系统,通过用户输入能模糊匹配到对应的结果,并且提供书籍对应的地点。
功能设计
让朋友把书籍整理并存储到一个 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 框架和部分服务器软件的安装和使用、维护等。这个例子非常小,但却是一个有趣的小工具,除了图书查询之外,我们还可以继续拓展构建其它系统,例如成绩查询等。
更多内容推荐
09|语义检索,利用 Embedding 优化你的搜索功能
语义检索,利用Embedding优化你的搜索功能
2023-04-03
矿机挖矿 APP 系统模式开发平台
矿机挖矿APP系统模式开发平台;166-2986-6266微、电、矿机挖矿APP定制开发、矿机挖矿APP平台开发、矿机挖矿APP模式开发、矿机挖矿APP软件开发、矿机挖矿APP系统定制开发
2021-01-15
03|初识 Web:学习 Web 最好的方式是什么?
想要学习网页前端开发,就需要学习一些前端相关的技术和知识。
2023-04-28
Go-Excelize API 源码阅读(九)——SetSheetBackground(sheet, picture string)
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带
2022-08-13
3. ORM 框架概览:GORM 和 Ent 分析
2023-09-26
15|网页端快速完成 PPT 制作
2023-09-03
zookeeper- 集群 leader 选举
zookeeper-集群leader选举
2022-07-20
架构师特刊:人人都能学会的 Serverless 实践
本系列从Serverless的概念介绍出发,重点讲述了Serverless在监控告警、人工智能、大数据等众多领域的实际应用。没有“高大上的宏伟蓝图”,都是人人可上手的实际案例,希望读者看完之后都可以自己完成一些Serverless小应用。
14. Session:基于 Cookie 的实现
2023-09-26
Apache Pulsar 社区周报:08-08 ~ 08-14
Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储
2020-08-19
兆骑科创高层次人才引进服务平台,创业大赛,云路演
兆骑科创高层次人才引进服务平台,创业大赛,云路演
2022-08-24
【愚公系列】2022 年 05 月 二十三种设计模式 (十七)- 中介者模式 (Mediator Pattern)
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化
2022-05-29
《Python 数据科学入门》PDF 免费下载
《Python数据科学入门》以Python 语言讲解数据科学基础知识,涵盖了数据采集、清洗、存储、检索、转换、可视化、数据分析(网络分析)、统计和机器学习等内容。具体内容包括:数据科学的Python 核心特性,文本数据、数据库、表格形式的数值数据、series 和fr
2020-11-29
一文看懂 OAuth2
开放授权(OAuth)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。 —— 维基百科
2020-07-10
测试开发之系统篇 -Docker 常用操作
Docker容器(Container)的运行基于镜像(image),您可以在Docker Hub上检索,或通过Dockerfile文件自己构建镜像。
2021-08-19
java 零基础入门 -java8 新特性 (下篇)
哈喽,各位小伙伴们好,我是喵手。day15
2022-07-20
07- 热门技术栈 SpringCloud
2023-09-25
利用原生 Serverless 与 Flask 框架开发一个博客系统
本文通过原生 Serverless 项目开发和 Flask 框架部署实现了一个基于 Python 语言的博客系统,在这个系统实现了文章发布、自动撰写文章的关键词和摘要,还可以进行留言评论的管理。
推荐阅读
04. 懂战略 - 战略的制定
2023-10-17
fastposter v2.10.0 简单易用的海报生成器
2022-11-10
第四节 目标计划管理“三九”说明书之三——做推演
2023-10-17
TiDB x 汉口银行丨分布式数据库应用实践
2023-10-30
Apache Doris 用户案例集
1. 复杂查询:JOIN 查询简介
2023-09-26
2022-11-15:这里有 n 个航班,它们分别从 1 到 n 进行编号。 有一份航班预订表 bookings , 表中第 i 条预订记录 bookings[i] = [firsti, lasti,
2022-11-15
电子书
大厂实战PPT下载
换一换 余炜强 | 火山引擎 云原生计算架构师
姚兴 | 京东集团 信息安全部 总监
赵钰莹 | 极客邦科技 InfoQ 极客传媒 副总经理
评论