使用.Net core3.0 开发斗图小程序后端+斗图小程序

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 使用.Net core3.0 开发斗图小程序后端+斗图小程序

为啥要写这么一个小程序?

作为互联网的原住民。

90后程序员的我,从高中开始发QQ小表情。

 

到之后的熊猫头,蘑菇头。

 

 

可以说表情包陪伴我从学校到社会,从青少年到中年。。

多年来,混迹于各个qq群,收集表情包多达三千多个,终于,在去年的某个工地跑路的时候,忘了带走我的表情包。。。然后就再也找不到之前的经典表情了。。

虽然QQ里面提成了斗图的功能,但是微信没有提成QQ那种怼图的功能。而且对我来说,QQ提供的表情都太高清了。。不如模糊的小标签有灵魂。。。

于是决定自己做一个这样的斗图小程序。自用,也给其他的朋友们提供方便。


 

需要用到的技术栈

服务器端:

  • 阿里云ubuntu1804最低配的的ECS一台
  • MySQL8.0社区版数据库
  • .Net Core 3.0
  • Dapper
  • HtmlAgilityPack
  • Lucene+jieba.net
  • 阿里云对象存储+阿里云CDN

小程序端:

  • 直接使用微信官方的那一套就行,客户端没啥复杂的,我使用的是uniapp开发的小程序。

 

选好技术类型后,就开始我们的斗图小程序开发过程

 


 

1.爬取图片数据

百度搜搜表情包,会出现N个专门做表情包的网站。

我们使用HtmlAgilityPack来抓取图片地址和alt描述文字。

具体可以参考我的另一篇博文 【.Net Core下使用HtmlAgilityPack解析采集互联网数据

爬取拿到图片地址后,使用HttpClient来下载图片,并上传到对象存储空间去,这里可以自己选择阿里云或者七牛云【不是广告,因为我最熟悉的就是阿里云和七牛云】

下载图片代码

var result = await new HttpClient().GetStreamAsync(imgUrl);

拿到流就可以直接下载了,然后上传了。

上传成功后,保存图片地址和图片的描述文字。

2.开发web服务器接口

在抓取完图片存到数据库后,我们手上已经有N多图片了。

然后就开发搜索图片的api。

第一步的时候,我们存储了图片地址和图片描述文字。我们搜索的就是这个描述文字。把搜索结果对应的图片列响应出去就好了。

假如你图片采集到几十万张。你单纯用like来搜索。一是慢的要死。二是搜索结果不尽人意。

有大佬估计会说直接上ElasticSearch或者Solr啊。。。

我的内心:服务器费用你给我出啊。我阿里云1h1g的机器,跑得起那玩意儿就怪了。。

这里我使用的是Lucene.Net 4.8+jieba.Net分词插件。

使用方式非常简单。把数据直接导入到Lucene就行了。【用Lucene的专业词语说叫添加到索引】

var AppLuceneVersion = LuceneVersion.LUCENE_48;
            var indexLocation = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Indexs");
 if (!System.IO.Directory.Exists(indexLocation))
            {
                System.IO.Directory.CreateDirectory(indexLocation);
            }
            var dir = FSDirectory.Open(indexLocation);
            //create an analyzer to process the text
            var analyzer = new JieBaAnalyzer(TokenizerMode.Search); //new StandardAnalyzer(AppLuceneVersion);
            //create an index writer
            var indexConfig = new IndexWriterConfig(AppLuceneVersion, analyzer);
using (var writer = new IndexWriter(dir, indexConfig))
            {
               //todo 加载数据过来var list = mysql.Query<BiaoQingSearchModel>(sql, new { time, now = nowTime }).ToList();
                for (int i = 0; i < list.Count(); i++)
                {
                    var item = list[i];
                    var doc = new Document();
                    doc.Add(new StringField("url", item.Url, Field.Store.YES));
                    doc.Add(new TextField("Imgexplain", item.Imgexplain, Field.Store.YES));
                    writer.AddDocument(doc);
                }
                writer.Flush(triggerMerge: false, applyAllDeletes: false);
                writer.Commit();       }

然后创建好索引之后,就可以在Indexs下看到一堆文件了。

 

 

大概就是如上图所示的样子。

然后就是搜索表情包的数据,数据搜索的时候,我们只搜索Lucene里面的图片描述列。

var AppLuceneVersion = LuceneVersion.LUCENE_48;
            var indexLocation = Path.Combine(System.IO.Directory.GetCurrentDirectory(), "Indexs");
            if (!System.IO.Directory.Exists(indexLocation))
            {
                System.IO.Directory.CreateDirectory(indexLocation);
            }
            var dir = FSDirectory.Open(indexLocation);
            var analyzer = new JieBaAnalyzer(TokenizerMode.Search);
            QueryParser qp = new QueryParser(AppLuceneVersion, "Imgexplain", analyzer);
            Query query = qp.Parse(key);
            BooleanQuery b = new BooleanQuery();
            b.Add(query, Occur.MUST);
            using (IndexReader reader = DirectoryReader.Open(dir))
            {
                var searcher = new IndexSearcher(reader);
                TopDocs hits = searcher.Search(query, Size);
                Console.WriteLine("一共:" + hits.TotalHits);
                Count = hits.TotalHits;
                var list = new List<BiaoQingSearchModel>();
                foreach (var hit in hits.ScoreDocs)
                {
                    var foundDoc = searcher.Doc(hit.Doc);
                    var model = new BiaoQingSearchModel();
                    model.Url = foundDoc.Get("url");
                    model.Imgexplain = foundDoc.Get("Imgexplain");
                    list.Add(model);
                }
                return list;
            }

然后就能正确的搜索出我们需要的表情包了。

做好这一堆事情,基本上我们的服务器端开发工作完成了80%。

然后就是用asp.net core写一个简单的api然后调用Lucene的搜索方法,就完成了。

服务器部署工作

我使用的是Ubuntu1804,也推荐大家使用Ubuntu server。ubuntu比centos好用几条街。。有人说centos稳定,同样是Linux,为啥ubuntu server就不稳定了?

1. 在ubuntu服务器上使用apt命令安装好nginx,mysql,Supervisor三个软件

迁移本地采集的数据到ubuntu上的数据库。【迁移数据可以直接使用mysqldump出sql,然后到服务器上执行就行了】

2.申请域名和SSL证书,因为微信小程序要求必须https。【阿里云可以一条龙服务】

3.在nginx中绑定域名和https证书

server {
        listen 443 ssl;
        server_name 你的域名
        ssl on;
        ssl_certificate /var/ssl/xxx.pem;
        ssl_certificate_key /var/ssl/xxx.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
        location / {
                proxy_pass http://localhost:5000;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection keep-alive;
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
                }
        }

4.使用Supervisor以守护进程的模式启用.net core开发的webapi站点。

[program:doutuapp]
command=dotnet xxx.dll
directory=/var/www/
user=root
autostart=true
autorestart=true
startsecs=1
stderr_logfile=/usr/log/doutu/err.log
stdout_logfile=/usr/log/doutu/out.log

5.启动站点服务

  启用supervisor,使用supervisorctl reload 然后supervisorctl status查看守护进程状态

 

  然后启动nginx,正常情况下,就可以通过你绑定的域名访问到你的webapi了。

6.性能优化建议【不是必须】

  因为我们穷,买不起高配的服务器。所以只能通过做更多的功课来加速访问,提高我们的小水管服务器的性能。

  把图片上传到oss去,保证我们的webapi只响应webapi的文本数据,这样1m的小水管,撑住20个人同时访问,压力还是不大的。

  使用cdn加速访问。cdn是内容分发网络的简称。简单的理解就是用户访问距离他最近的节点就能获取到数据。举个栗子:你服务器在上海,你用户在新疆,如果你用户通过网线来找你的服务器上的图片,

  如果不是直连的话,需要经过n个路由器和交换鸡。中间可能会找不到你的服务器,然后也许你就丢失了一个用户了!cdn就是帮我们分发图片到全国各大节点。然后无死角让你提升用户体验。

  开启nginx的gzip,压缩你的数据包。之前10k一个数据包,压缩后2k,你服务器的并发性能瞬间提高几个档次【当然压缩需要消耗cpu,cpu不行就算求了】


以上内容虽然只是短短一篇文章,但是实际上消耗了我近两周的业余时间【还不算上备案域名的时间】,因为中间关于全文检索的知识点我也不太了解,踩了很多坑才爬上岸。


相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
目录
相关文章
|
6天前
|
人工智能 小程序
【一步步开发AI运动小程序】十五、AI运动识别中,如何判断人体站位的远近?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,无需后台支持,具有快速、体验好、易集成等特点。本文介绍如何利用插件判断人体与摄像头的远近,确保人体图像在帧内的比例适中,以优化识别效果。通过`whole`检测规则,分别实现人体过近和过远的判断,并给出相应示例代码。
|
4天前
|
人工智能 小程序 UED
【一步步开发AI运动小程序】十六、AI运动识别中,如何判断人体站位?
【云智AI运动识别小程序插件】提供人体、运动及姿态检测的AI能力,本地引擎无需后台支持,具备快速、体验好、易集成等优势。本文介绍如何利用插件的`camera-view`功能,通过检测人体站位视角(前、后、左、右),确保运动时的最佳识别率和用户体验。代码示例展示了如何实现视角检查,确保用户正或背对摄像头,为后续运动检测打下基础。
|
10天前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十三、自定义一个运动分析器,实现计时计数02
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,详细解析了俯卧撑动作的检测规则构建与执行流程,涵盖卧撑和撑卧两个姿态的识别规则,以及如何通过继承`sports.SportBase`类实现运动分析器,适用于小程序开发者。
|
10天前
|
人工智能 小程序 API
【一步步开发AI运动小程序】十二、自定义一个运动分析器,实现计时计数01
随着AI技术的发展,AI运动APP如雨后春笋般涌现,如“乐动力”、“天天跳绳”等,推动了云上运动会、线上健身等热潮。本文将指导你从零开始开发一个AI运动小程序,利用“云智AI运动识别小程序插件”,介绍运动识别原理、计量方式及运动分析器基类的使用,帮助你在小程序中实现运动计时和计数功能。下篇将继续探讨运动姿态检测规则的编写。
|
4天前
|
移动开发 小程序 PHP
校园圈子论坛系统采取的PHP语音和uni账号开发的小程序APP公众号H5是否只需要4800元?是的,就是只需要4800元
关于校园圈子论坛系统采用PHP语言和uni-app开发的小程序、APP、公众号和H5是否仅需4800元这个问题,实际上很难给出一个确定的答案。这个价格可能受到多种因素的影响
|
6天前
|
人工智能 小程序 JavaScript
【一步步开发AI运动小程序】十四、主包超出2M大小限制,如何将插件分包发布?
本文介绍了如何从零开始开发一个AI运动小程序,重点讲解了通过分包技术解决程序包超过2M限制的问题。详细步骤包括在uni-app中创建分包、配置`manifest.json`和`pages.json`文件,并提供了分包前后代码大小对比,帮助开发者高效实现AI运动功能。
|
11天前
|
人工智能 小程序 开发者
【一步步开发AI运动小程序】十一、人体关键点跳跃追踪
本文介绍如何利用“云智AI运动识别小程序插件”开发AI运动小程序,涵盖云上运动会、健身打卡等热门应用场景。通过示例代码展示如何调用插件功能,实现动作追踪与分析,助力开发者快速上手。
|
7天前
|
存储 缓存 负载均衡
后端开发中的性能优化策略
本文将探讨几种常见的后端性能优化策略,包括代码层面的优化、数据库查询优化、缓存机制的应用以及负载均衡的实现。通过这些方法,开发者可以显著提升系统的响应速度和处理能力,从而提供更好的用户体验。
32 4
|
13天前
|
存储 前端开发 Java
深入理解后端开发:从基础到高级
本文将带你走进后端开发的神秘世界,从基础概念到高级应用,一步步揭示后端开发的全貌。我们将通过代码示例,让你更好地理解和掌握后端开发的核心技能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的信息和启示。
|
16天前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####

热门文章

最新文章