
朋友的单位有一个小型的图书室,图书室中摆放了很多的书,每本书都被编号放在对应的区域,为了让大家更快、更容易找到这些书,他联系我,让我帮他弄一个图书查询系统,通过用户输入能模糊匹配到对应的结果,并且提供书籍对应的地点。
功能设计
让朋友把书籍整理并存储到一个 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> </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 框架和部分服务器软件的安装和使用、维护等。这个例子非常小,但却是一个有趣的小工具,除了图书查询之外,我们还可以继续拓展构建其它系统,例如成绩查询等。
更多内容推荐
21|用户注册和登录:如何结合 Vue 3 和 Koa.js 实现注册登录?
在全栈项目的常规开发流程中,第一步设计功能逻辑,不一定是程序员的职责,但是程序员必须要掌握第一步的功能逻辑的设计能力,有了这个能力,你可以突破技术职责的边界,锻炼出独当一面的项目管理软实力。
2023-01-11
21|DID 和 PaddleGAN:表情生动的数字人播报员
DID和PaddleGAN
2023-04-24
Java 并发 JUC(java.util.concurrent)线程池
Java并发JUC(java.util.concurrent)线程池
2022-05-04
Day180
[root@izbp1h9ynqgizuhp85e2xkz dockerfile]# docker build -f myDockerFile-centos -t mycentos:0.1 .
2022-04-29
【译】什么是测试驱动开发
原文链接: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
2022 年最新 Java 小白学习路线总结,从零基础跟着学习不掉队(PDF+ 视频分享篇)
三更灯火五更鸡,正是男儿读书时。 黑发不知勤学早,白首方悔读书迟。
2021-10-13
104|再回首:“Web 开发”单元小结
2023-02-01
Python 字体反爬之乐居字体反爬,一文看懂,一文学会
你正在阅读 【梦想橡皮擦】 的博客 阅读完毕,可以点点小手赞一下 发现错误,直接评论区中指正吧 橡皮擦的第 <font color=red>672</font> 篇原创博客
2022-08-02
24|后台搭建数据源:如何设计运营搭建页面的数据结构?
物料数据源(也就是页面数据结构)的设计与实现,我们主要学习三个要点“物料数据源”“JSON Schema”和“物料预览功能的实现”。
2023-02-03
09|语义检索,利用 Embedding 优化你的搜索功能
语义检索,利用Embedding优化你的搜索功能
2023-04-03
关于读书的随想
愿每个平常的日子里,我们都能捡拾起读书的习惯,让那个捧着书的你,能遇见更好的你吧。
2021-04-23
什么是 JVM?深入解析 JVM 原理!
2021-07-27
13|基于关键词的召回:如何使用关键词吸引用户?
在讲解了基于时间的召回和基于热度的召回后,今天我们进入到基于规则召回的最后一种——基于关键词的召回。
2023-05-15
基于 SSM 开发实现中药制剂网站系统
VX: baozai_7788
2021-11-11
java 虚拟机 GC :G1 学习笔记
java 虚拟机常见 GC: G1 GC.
2021-09-27
网易云课堂 Service Worker 运用与实践
通过对Service Worker的理解和Workbox的应用,可以进一步提升产品的性能和弱网情况下的体验。
2021-05-20
购买小间距 LED 显示屏前需要了解什么?
LED显示屏是现代化体育场馆必备的配套神器,在赛事中肩负着赛况展示、比分展示、赞助展示等重要功能。
2022-09-02
Es6 新特性——箭头函数
箭头函数是Es6新增的一种定义函数表达式的语法,它简化了我们之前写的函数书写方式,箭头函数实例化的函数对象与我们Es5之前创建的函数表达式的创建函数行为是相同的。在任何使用函数表达式的地方,都可以使用箭头函数。但箭头函数有些地方与传统书写方式还有
2022-06-11
爆款国民冰淇淋原来是这样“凝冻”出来的
3月31日,蒙牛乳业(2319.HK)首次在呼和浩特中国乳业产业园召开年度业绩说明会。公告显示,2021年,蒙牛收入达881.415亿元,同比增长15.9%,归母净利润为50.255亿元,同比增42.6%。其中,凭借与环球影城联名推出的“小黄人”冰淇淋、面世即爆火成为现
2022-04-02
推荐阅读
32. 商品中心 (1)
2023-09-30
35. 商品中心 (4)
2023-09-30
第 12 讲 锁定目标,制定计划
2023-10-17
实战案例,个个是经典,不愧是阿里 P7 私传“并发编程核心讲义”,竟能讲的如此通透
2022-09-28
git 拉取分支后不想合并了
2023-10-27
Python 初学者必备!适合新手阅读的 Github 开源代码。。。
2022-12-02
贾斯特里尼 & 布鲁克斯为何被称为葡萄酒典范?
2022-12-24
电子书

大厂实战PPT下载
换一换 
曹铭斌 | 美的 风控交付中心负责人
常高伟 | ANP开源技术社区发起人
杨学锐 | 阶跃星辰 语音模型负责人






评论