用flutter 写一个专属于儿子的听书的app

背景:

儿子最近喜欢上了用儿童手表听故事,但是手表边里的应用免费内容很少,会员一年要300多,这么一笔巨款,怎能承担的起,所以打算自己开发一个专属于儿子的听书app。

最终效果:

架构:

后端由两个服务组成,一个文件服务用于预览图片和在线听故事。一个接口服务用于 获取故事列表和某个故事的详细内容。

前端app用flutter开发,一共三个页面。故事列表页,详细故事页,和播放页面。

服务端代码:

 

#include "crow.h"
#include <crow/json.h>
#include <iostream>
#include <dirent.h>
#include <string>
#include <vector>
#include <initializer_list>using namespace std;// 获取文件后缀名
std::string getFileExtension(const std::string& filename) {size_t lastDot = filename.find_last_of(".");if (lastDot != std::string::npos) {return filename.substr(lastDot + 1);}return ""; // 如果没有后缀,返回空字符串或其他你认为合适的默认值
}//遍历文件夹
std::vector<string> scanDir(const char* dir, initializer_list<string> subStrinList){DIR* directory;struct dirent* entry;//获取所有后缀string suffixList("");for(auto beg=subStrinList.begin(); beg!=subStrinList.end(); ++beg)suffixList += *beg;std::cout<<"后缀 "<<suffixList<<std::endl;std::vector<std::string> allFile;directory = opendir(dir);if(directory!=nullptr){while((entry=readdir(directory))!=nullptr){std::string filename = entry->d_name;std::string fileSuffix = getFileExtension(filename);if(filename!="."&&filename!=".."&&fileSuffix.length()>0&&suffixList.find(fileSuffix)!=std::string::npos){allFile.push_back(filename);}}closedir(directory);}else{std::cerr << "Failed to open directory." << std::endl;}return allFile;
}std::string url_decode(const std::string &str) {std::string result;std::istringstream iss(str);char ch;int i;while (iss >> std::noskipws >> ch) {if (ch == '%') {if (!(iss >> std::hex >> i)) {break;}result += static_cast<char>(i);} else if (ch == '+') {result += ' ';} else {result += ch;}}return result;
}int main(int argc, char **argv)
{crow::SimpleApp app;CROW_ROUTE(app, "/")([](){crow::response res;res.set_header("Content-Type", "text/plain; charset=utf-8");res.body = "你好啊,小朋友!";return res;});// 获取所有条目CROW_ROUTE(app, "/getAllEntry")([](){crow::response res;res.set_header("Content-Type", "text/plain; charset=utf-8");crow::json::wvalue j;std::vector<std::string> allEntry = scanDir("./data",{"jpg"});for(int i=0;i<allEntry.size();i++){j[i]=allEntry.at(i);}std::cout<<"allEntry "<<crow::json::dump(j)<<std::endl;res.body = crow::json::dump(j);return res; });//获取某个条目的所有内容CROW_ROUTE(app, "/getDetailEntry/<string>")([](string name){std::string decodedQuery = url_decode(name);std::cout<<"getDetailEntry "<<decodedQuery<<std::endl;crow::response res;res.set_header("Content-Type", "text/plain; charset=utf-8");std::string dir=std::string("./data/")+decodedQuery;crow::json::wvalue j;std::vector<std::string> allFile = scanDir(dir.data(),{"mp3","m4a"});for(int i=0;i<allFile.size();i++){j[i]=allFile.at(i);}std::cout<<"allFile "<<crow::json::dump(j)<<std::endl;res.body = crow::json::dump(j);return res; });app.port(18080).multithreaded().run();
}

内容:

当有了新的故事后,只需要准备一张故事的预览图,然后一起放到服务器上即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/230834.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python工具Anaconda+Pycharm安装教程详解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、介绍二、Anaconda的安装三、Pycharm的安装四、环境配置五、python库文安装件——以opencv为例关于Python技术储备一、Python所有方向的学习路线二、Python基础学…

ChatGPT成了背锅侠:利用AI做蹭热点视频

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 在抖音\视频号上已经有很多人利用ChatGPT做热点视频的案例了&#xff0c;视频都是点赞大几千、几万。看完本文&#xff0c;你会略知一二&#xff0c;如下图所示&#xff1a; 这个视频&#xff0c…

Elk:filebeat 日志收集工具和logstash

Elk:filebeat 日志收集工具和logstash Filebeat是一个轻量级的日志手机工具,所使用的系统资源比logstash部署和启动时使用的资源要小得多 Filebeat可以在非java环境使用&#xff0c;他可以代理logstash在非java环境上收集日志 缺点 Filebeat无法实现数据的过滤,一般是结合l…

建立健全涉密测绘外业安全保密管理制度,落实监管人员和保密责任,外业所用涉密计算机纳入涉密单机进行管理

建立健全涉密测绘外业安全保密管理制度&#xff0c;落实监管人员和保密责任&#xff0c;外业所用涉密计算机纳入涉密单机进行管理 1.涉密测绘外业安全保密管理制度 2.外业人员及设备清单&#xff08;包括&#xff1a;外业从业人员名单、工作岗位&#xff0c;外业设备名称、密…

MNIST手写数字识别

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在Pytorch&#xff…

k8s中Pod控制器简介,ReplicaSet、Deployment、HPA三种处理无状态pod应用的控制器介绍

目录 一.Pod控制器简介 二.ReplicaSet&#xff08;简写rs&#xff09; 1.简介 &#xff08;1&#xff09;主要功能 &#xff08;2&#xff09;rs较完整参数解释 2.创建和删除 &#xff08;1&#xff09;创建 &#xff08;2&#xff09;删除 3.扩容和缩容 &#xff08…

Python异常处理:try语句的应用与技巧

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 异常处理在Python中是至关重要的。try-except是用于捕获和处理异常的核心机制之一。让我们深入了解如何使用try-except&#xff0c;处理各种异常情况。 try-except语句 在编程中&#xff0c;异常是指运行时发生…

注解(概念、分类、自定义注解)

注解基本概念 注解(元数据)为我们在代码中添加信息提供一种形式化的方法&#xff0c;我们可以在某个时刻非常方便的使用这些数据。将的通俗一点&#xff0c;就是为这个方法增加的说明或功能。 作用&#xff1a; 编写文档&#xff1a;通过代码里标识的注解生成文档【生成doc文…

uniapp 页面回退逻辑梳理

在uniapp 开发项目&#xff0c;有时在同一个页面 回退 会有不同的要求&#xff0c;无法通用的用navigaBack去解决 因此 这时候 就可以使用onBackPress方法&#xff0c;根据不同的参数条件来控制回退的页面

【软件测试学习】—软件测试模型(二)

【软件测试学习】—软件测试模型&#xff08;二&#xff09; 我 | 在这里 &#x1f469;‍&#x1f9b0;&#x1f469;‍&#x1f9b0; 读书 | 长沙 ⭐计算机科学与技术 ⭐ 本科 【2024届】 &#x1f383;&#x1f383; 爱好 | 旅游、跑步、网易云、美食、摄影 &#x1f396;️…

【MYSQL】表的基本查询

目录 前言 一、Create&#xff08;增&#xff09; 1.单行数据 全列插入 2.多行数据 指定列插入 3.插入否则更新 4.替换 二、Retrieve&#xff08;查&#xff09; 1.select列 1.1全列查询 1.2指定列查询 1.3查询字段为表达式 1.4为查询结果指定别名 1.5结果去重 …

C++基础 -18-继承中类继承的区别

无论使用公有&#xff0c;保护&#xff0c;私有继承 都无法访问基类私有成员 在多级继承中 使用公有继承 派生的派生可以访问基类的公有&#xff0c;保护成员 在多级继承中 使用保护继承 派生的派生可以访问基类的公有&#xff0c;保护成员 在多级继承中 使用私有继承 派生的派…