写点什么

基于 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:341659

评论

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

PMC必须要懂的四个关键流程:生产、库存、交期全过程解析!

积木链小链

制造业 智能制造 中小企业 生产管理

什么是DDoS攻击?

天翼云开发者社区

安全 DDoS

什么是AI大模型?看deepseek用通俗易懂的语言解释

我再BUG界嘎嘎乱杀

人工智能 AI AI大模型 大模型 大语言模型

用 CodyBuddy 帮我写自动化运维脚本

悟空聊架构

AI 悟空聊架构 CodeBuddy首席试玩官

连锁药店如何安全访问总部运营系统?贝锐花生壳带来解决方案

贝锐

内网穿透 ERP

YashanDB 知识库|STATISTICS_LEVEL 设置为 ALL,性能掉到冰点?一条参数搞清楚根因

数据库砖家

数据库

需求分析不好做?这门华为新课免费试听!

YG科技

这款AI助手竟能自动生成行程+前端代码?

VyrnSynx

CodeBuddy首席试玩官

闺蜜机行业市场销量涨超42%,小度科技持续领跑行业

科技大数据

手动开发?给我一条提示词,CodeBuddy能做的你都做不到!

VyrnSynx

CodeBuddy首席试玩官

uniapp开发HarmonyOS NEXT应用之项目结构详细解读

幽蓝计划

TikTok直播卡顿怎么解决?教你几个方法!

Ogcloud

SD-WAN tiktok直播 tiktok直播网络 tiktok网络 sd-wan专线

Ava:6 分钟语音聊天免费生成 MBTI 报告;字节发布图像理解与生成统一模型 Mogao丨日报

声网

AI工具如何一键生成图表?5个流行的图表生成软件盘点!

职场工具箱

人工智能 图表 AI软件 AIGC 可视化工具

室内LED全彩显示屏P3与P5

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家 户内led显示屏 规格说明

城市感知网络体系,构筑全域数字化新基石

脑极体

AI

阿里云 SLS 多云日志接入最佳实践:链路、成本与高可用性优化

阿里巴巴云原生

阿里云 云原生

Apollo 可观测性最佳实践

观测云

Apollo

11.多用组合和少继承

杨充

常见应用层DDoS攻击

天翼云开发者社区

安全 DDoS

从0到上线,CodeBuddy 如何帮我快速构建旅游 App?

VyrnSynx

CodeBuddy首席试玩官

莫想到有一天得重新写个 etcd client

八苦-瞿昙

阿里Java开发手册:编程规约、异常日志、单元测试、安全规 约、MySQL 数据库、工程结构、设计规约!

程序员高级码农

Java 程序员 java 技术提升

使用LLaMA-Factory快速训练自己的专用大模型

我再BUG界嘎嘎乱杀

人工智能 AI 大模型

现代框架对SEO的深度影响

溪抱鱼

国际化 SEO SEO工具

AI实践探索:辅助生成测试用例

巫山老妖

测试用例 AI编程

100台电脑局域网搭建攻略和设备配置指南

Ogcloud

局域网 企业组网 局域网组建 局域网搭建 企业网络搭建

越来越多企业为AI焦虑,联想的“超级智能体”来得正是时候

Alter

uniapp跨平台开发HarmonyOS NEXT应用初体验

幽蓝计划

鸿蒙跨平台开发

《算法导论(第4版)》阅读笔记:p14-p16

codists

算法

从AI助手到个性化数字分身:WeClone & Second Me打造本地化、私有化的个性化AI代理系统

汀丶人工智能

人工智能

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