朋友的单位有一个小型的图书室,图书室中摆放了很多的书,每本书都被编号放在对应的区域,为了让大家更快、更容易找到这些书,他联系我,让我帮他弄一个图书查询系统,通过用户输入能模糊匹配到对应的结果,并且提供书籍对应的地点。
功能设计
让朋友把书籍整理并存储到一个 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 框架和部分服务器软件的安装和使用、维护等。这个例子非常小,但却是一个有趣的小工具,除了图书查询之外,我们还可以继续拓展构建其它系统,例如成绩查询等。
更多内容推荐
导师一对一带赚钱联系方式——玩家经验分享
导师一对一带赚钱联系方式✅郑凯<企鵝 Q>⎝5310129⎠ ✅「網」⎝37qy.cc⎠✅自 带 邀 请 码 ✅输入惘芷主彻来微聊好友找我✅行业第一✅疯狂彩金天天派送✅2 顶级信誉✅顶级体验✅平台微`聊✅联.系郑荖溮✅ “十年经验,都是专业的指导/规划/技巧✅没有做不到
2023-09-05
盲盒商城 APP 系统开发的软件特点和盲盒功能介绍
1.购买到的商品都是以盲盒的形式邮寄的,让我们的购物充满了期待和惊喜。
2022-06-10
刘德华在线演唱会,火山引擎边缘云助力打造极致视频直播体验
9月3日晚8点,「把我唱给你听-刘德华抖音直播」开启,刘德华重新唱响经典原创歌曲,用音乐带领歌迷走进他的故事。公开数据显示,开播不到5分钟,在线人数突破5000万,整场线上演唱会观看人数超3亿,成为国内线上演唱会收看之最。
2022-12-02
09|语义检索,利用 Embedding 优化你的搜索功能
语义检索,利用Embedding优化你的搜索功能
2023-04-03
09|彻底搞懂 PPT 中的母版与版式
2023-09-03
Linux 之 kill 命令
【Linux常用命令速查手册】关注【入门小站】,后台回复 「1001」 自取。
2022-01-30
CRM 系统开发要多少钱 _CRM 管理系统开发报价
据了解,收费的crm系统一般有按年收费或一次性收费两种,按年收费相当于租用,每年按使用人数交费;一次性收费则是买断的,一次付费,终身使用。如果需要定制开发crm系统的话,价格更贵,有的甚至要十几万、几十万元,具体价格要看定制需求搭建【可看我昵称】
2023-09-22
40. 购物车 (3)
2023-09-30
路由树:通配符匹配之路由注册
2023-09-26
Python 网页解析库:用 requests-html 爬取网页
Python 中可以进行网页解析的库有很多,常见的有 BeautifulSoup 和 lxml 等。在网上玩爬虫的文章通常都是介绍 BeautifulSoup 这个库,我平常也是常用这个库,最近用 Xpath 用得比较多,使用 BeautifulSoup 就不大习惯,很久之前就知道 Reitz 大神出了一个叫
2022-07-19
创新生产力的新引擎
随着科技的飞速发展,人工智能(AI)已成为当今时代的一大热点。近年来,生成式AI的崛起,特别是在自然语言处理(NLP)领域的突破,对传统搜索引擎、推荐系统、语言翻译等领域产生了深远的影响。
2023-09-15
691 页,41 个版块!终于有阿里大佬可以带我吃透 Spring 源码了
Spring源码的相关问题可以说是现在Java面试必问的一些问题,同时如果你没有好好的阅读过源码的话,同时又觉得源码晦涩难懂的话,只想去取其精华去其糟粕的话,那么接下来这份spring源码学习宝典你一定要好好仔仔细细的看和多刷 ,帮助非常大!
2022-05-06
21. 负载均衡与降级案例搭建
2023-09-29
小程序助力本地生活服务
互联网本地生活服务,就是将当地、线下、具有实体店铺的餐饮、生活服务、休闲娱乐等商家服务信息,以一种“网店”的方式呈现给网民,旨在给用户提供便捷、全面的商户信息,给线下商户提供免费的推广渠道。随着互联网和移动支付的普及,互联网本地服务逐渐走进
2022-10-18
【译】什么是测试驱动开发
原文链接:https://www.agilealliance.org/glossary/tdd/#q=~(infinite~false~filters~(postType~(~'page~'post~'aa_book~'aa_event_session~'aa_experience_report~'aa_glossary~'aa_research_paper~'aa_video)~tags~(~'tdd))~searchTerm~'~sort~false~sort
2022-01-25
35. 商品中心 (4)
2023-09-30
腾讯云大神亲码“redis 深度笔记”,不讲一句废话,全是精华
作为这个时代码代码的秃头人员,对Redis肯定是不陌生的,如果连Redis都没用过,还真不好意思出去面试,指不定被面试官吊打多少次。
2022-11-22
【愚公系列】2022 年 10 月 Go 教学课程 028- 函数小结案例(通讯录)
通讯录的信息可以涵盖多项内容比如:姓名、电话号码、单位电话、移动电话、传真号、电子邮件、QQ、MSN、个人主页、公司、街道、邮编、生日、大头贴、车牌、银行账号、俱乐部名称、爱好等等。
2022-10-14
es 单机安装及配置其系统服务
es安装及系统服务配置
2021-12-08
低代码无代码区别在哪?通过这 5 点来区别准没错
低代码无代码区别在哪?个人认为这二者之间的区别主要在这5个方面:概念、面向人群、集成能力、扩展能力等。虽说低代码和无代码概念接近,技术相似、产品形态相似。然而,低代码无代码本质上是区别的。具体哪些不同,下面给你整理好了。
2022-10-24
推荐阅读
11|分类算法:非常广泛的 AI 应用场景
2023-11-20
Apache Doris 3.0.3 版本正式发布
2024-12-09
6.9 版式设计六大原则(六)留白
2023-10-17
2023 中国 Serverless 用户调查,邀您填写!
2023-11-27
23. 倾听之痛:不被倾听是对客户极大的伤害(下)
2023-10-17
软件测试 / 人工智能|Python 运算符:初学者指南
2023-12-05
好用的图书阅读器 OmniReader Pro 激活中文版
2023-10-09
电子书
大厂实战PPT下载
换一换 任龙飞 | 去哪儿 酒店大前端团队负责人
吴迪 | 火山引擎 基础架构服务框架⼯程师
熊刚 | 快手 基础平台部系统软件中心/系统软件负责人
评论