基于MemFireCloud的电子图书馆开发指南(三)

Curve+ 5.0.2:新一代色彩校准工具如何革新印刷行业标准 Curve+ 5.0.2作为新一代色彩校准工具,通过G7+校准算法和SCTV技术革新了印刷行业的色彩管理标准。该工具显著提升色彩精准度,减少打样时间和材料浪费,支持专色处理,实现跨材质色彩一致性,为印刷企业带来效率与质量的全面提升。 阅读详情

TL;DR

上一篇教程讲解了获取并使用MemFireCloud基于表结构生成的CRUD接口,同时演示了其云存储的基本使用方式。
到目前为止,应用数据、业务接口、界面设计均已准备完毕,本篇将介绍如何进行界面开发,并最终利用MemFireCloud提供的静态托管能力。

仓库地址

https://github.com/key7men/e-bookshelf

开发依赖

  • next.js 核心开发框架
  • mui 组件库
  • react-reader epub在线阅读组件

核心组件开发

针对功能界面进行分析,判定需要开发的组件主要如图:

在这里插入图片描述

业务接口代码

import { createClient } from '@supabase/supabase-js'

export const url = 'your_memfire_application_url';
const key = 'your_memfire_application_anon_key';
const client = createClient(url, key);

export interface BookItem {
    id: string;
    title: string;
    link: string;
    cover_link: string;
    date: string;
    publisher: string;
}

export interface ISearchParam {
    page: number;
    search?: string;
}

export const queryBooks = async (param: ISearchParam) => {
    const {data, error, count} = await client.from('book')
        .select('*', {count: 'exact'})
        .range((param.page - 1) * 24, param.page * 23)
        .ilike('title', `%${param.search}%`)

    if (!error) {
        return {
            data,
            count
        }
    } else {
        return {
            data: [],
            count: 0
        }
    }

}

export const queryIds = async () => {
    const {data, error} = await client.from('book')
        .select('id')
    if (!error) {
        return data || [];
    } else {
        return []
    }
}

export const queryBookLink = async (id: string | string[] | undefined) => {
    const {data, error } = await client.from('book')
        .select('title, link')
        .eq('id', id)
        .single()

    if (!error) {
        return data
    } else {
        return {
            title: '',
            link: ''
        }
    }
}

组件代码示例

以搜索组件和首页列表布局为样例,具体可执行代码请查看Github仓库

搜索组件

const Navbar: FC = () => {

    const router = useRouter();

    // 防抖
    const doSearch = debounce(async (event: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => {
        const {value} = event.target;
        const query = router.query;
        if (value === '') {
            delete query.search;
        } else {
            query.search = value;
        }
        await router.push({query, pathname: '/'});
    }, 200);

    return (
        <AppBar position='sticky' color='transparent'
                sx={{backgroundColor: 'white', borderBottom: '1px solid rgba(0, 0, 0, .12)', boxShadow: 'none'}}>
            <Container maxWidth='xl'>
                <Toolbar disableGutters>

                    {/* icon与应用名称,在小屏幕下隐藏 */}
                    <SvgIcon sx={{mr: 1}} viewBox="0 0 490 490">
                        <g>
                            <g>
                                <g>
                                    <path d='M415,0H75c-5.523,0-10,4.478-10,10v420c0,5.523,4.477,10,10,10h10v40c0,5.523,4.477,10,10,10h40c5.523,0,10-4.477,10-10
                                v-40h200v40c0,5.523,4.477,10,10,10h40c5.523,0,10-4.477,10-10v-40h10c5.523,0,10-4.477,10-10V10C425,4.478,420.523,0,415,0z
                                 M125,470h-20v-30h20V470z M235,420H85V315h150V420z M385,470h-20v-30h20V470z M405,420H255V315h150V420z M405,295H85v-60h320
                                V295z M405,215H85v-10h320V215z M405,185H85v-60h320V185z M405,105H85V95h320V105z M405,75H85V20h320V75z' />
                                    <rect x='270' y='355' width='30' height='20' />
                                    <rect x='190' y='355' width='30' height='20' />
                                </g>
                            </g>
                        </g>
                    </SvgIcon>
                    <Typography
                        variant='h6'
                        noWrap
                        component='a'
                        href='/'
                        sx={{
                            mr: 2,
                            display: {xs: 'none', md: 'flex'},
                            fontWeight: 300,
                            letterSpacing: '.1rem',
                            color: 'black',
                            textDecoration: 'none',
                        }}
                    >
                        E-BookShelf
                    </Typography>

                    {/* 搜索框 */}
                    <Search sx={{flexGrow: 1}}>
                        <SearchIconWrapper>
                            <SearchIcon />
                        </SearchIconWrapper>
                        <StyledInputBase
                            placeholder='书籍名称关键字'
                            inputProps={{'aria-label': 'search'}}
                            onChange={(e) => doSearch(e)}
                        />
                    </Search>

                </Toolbar>
            </Container>
        </AppBar>
    );
};

首页布局

const Home: NextPage = ({}) => {

    const router = useRouter();

    const [dataList, setDataList] = useState<BookItem[]>([]);
    const [total, setTotal] = useState(0);
    const [page, setPage] = useState(1);
    const [search, setSearch] = useState('');

    useEffect(() => {
        const params: ISearchParam = {
            page: 1,
            search: ''
        };


        if (router.query.page) {
            params.page = Number(router.query.page);
            setPage(Number(router.query.page));
        } else {
            setPage(1);
        }

        if (router.query.search) {
            params.search = String(router.query.search);
            setSearch(String(router.query.search));
        } else {
            setSearch('');
        }

        queryBooks(params).then(res => {
            setDataList(res.data || []);
            setTotal(Math.ceil(Number(res.count) / 24));
        })
    }, [router.query.search, router.query.page]);

    // 进入内页
    const goToDetail = (id: string) => {
        router.push(`/book/${id}`);
    }

    // 翻页
    const handlePageChange = (e: ChangeEvent<unknown>, pageIndex: number) => {
        const query = router.query;
        query.page = String(pageIndex);
        router.push({query});
    }

    // 下载
    const downloadBook = (link: string) => {
        window.open(`${url}/storage/v1/object/public/books/${link}`, '_blank');
    }

    // 在线阅读
    const readBook = (id: string) => {
        router.push(`/book/${id}`);
    }

    return (
        <>
            <Head>
                <title>首页</title>
            </Head>
            <Grid container sx={{p: 2}} spacing={4}>
                {/* 数据列表 */}
                {dataList.map((item: BookItem, index: number) =>
                    <Grid item key={item.id} xs={12} sm={4} lg={3} xl={2}>
                        <Card sx={{boxShadow: '0 0 6px 1px rgba(0,0,0,.2)'}} >
                            <CardActionArea onClick={() => goToDetail(item.id)}>
                                <CardHeader
                                    avatar={<Avatar sx={{backgroundColor: '#333', fontSize: '0.8rem'}} aria-label='format'>epub</Avatar>} />
                                <CardMedia component='img' image={`${url}/storage/v1/object/public/covers/${item.cover_link}`} alt={item.title}
                                           sx={{height: {xs: 320, sm: 240, lg: 320}}} />
                                <CardContent>
                                    <Typography variant='body2' color='text.primary' sx={{
                                        whiteSpace: 'nowrap',
                                        width: '100%',
                                        overflow: 'hidden',
                                        textOverflow: 'ellipsis'
                                    }}>{item.title}</Typography>
                                    <Divider sx={{my: 1}} />
                                    <Typography variant='body2' color='text.secondary' sx={{
                                        whiteSpace: 'nowrap',
                                        width: '100%',
                                        overflow: 'hidden',
                                        textOverflow: 'ellipsis'
                                    }}>出版单位: {item.publisher || '未知'}</Typography>
                                    <Typography variant='body2' color='text.secondary' sx={{
                                        whiteSpace: 'nowrap',
                                        width: '100%',
                                        overflow: 'hidden',
                                        textOverflow: 'ellipsis'
                                    }}>发布时间: {item.date || '未知'}</Typography>
                                </CardContent>
                            </CardActionArea>
                            <CardActions sx={{float: 'right'}}>
                                <Button aria-label='download' sx={{color: '#000', borderColor: '#000', ':hover': 'red'}}
                                        startIcon={<DownloadForOfflineOutlined />} onClick={(e) => {
                                    downloadBook(item.link)
                                }}>直接下载
                                </Button>
                                <Button aria-label='read online' sx={{color: '#000', borderColor: '#000'}}
                                        startIcon={<AutoStoriesOutlined />} onClick={(e) => {
                                    readBook(item.id)
                                }}>在线阅读
                                </Button>
                            </CardActions>
                        </Card>
                    </Grid>
                )}
            </Grid>
            <Box sx={{textAlign: 'center', my: 2, width: '100%', display: 'flex', justifyContent: 'center'}}>
                { total > 0 ? <Pagination count={total} page={page} shape='rounded' variant='outlined' onChange={handlePageChange} /> : null }
            </Box>
        </>
    )
}

如何部署

由于我使用MemFireBase生成的接口来完成应用的全部功能,所以是不需要部署后端服务的。
但前端打包后的页面仍然需要找个服务器部署啊!好在,MemFireCloud一并提供了静态托管服务,可以直接将前端部署上去。

step1 前端页面本地打包

在这里插入图片描述

step2 压缩zip的技巧

这里千万要注意,必须保证index.html在压缩根目录
这里千万要注意,必须保证index.html在压缩根目录
这里千万要注意,必须保证index.html在压缩根目录
笔者在这里卡了1个小时才弄明白:压缩的zip文件必须能够直接解压得到index.html,不然MemFireCloud找不到入口,说实话,我个人觉得这里不好理解,MemFireCloud的产品还有待改进。
我的压缩方式是这样的:右键框选所有我需要打包的内容,然后直接压缩

在这里插入图片描述

step3 上传即是部署

上传压缩包后,会自动解压,解压完成后,即可得到访问地址

在这里插入图片描述

小结

整个电子图书馆的开发部署,我个人的开发体验就一个字儿:快。
当然这得益于MemFire提供的服务,整个开发过程,不用安装数据库,不用学习ORM,不用写接口,不用买OSS,不用找服务器部署静态页面。 省下来的时间都够我上王者了。
话又说回来,其实我很早就知道国外的开发者用Google FireBase一把梭了,奈何国内的开发者无法使用。现在流行的低代码平台、CloudBase、MemFireCloud、Apifox都值得去体验,去使用,只有这样才能让国内开发者的工具链更完善,毕竟中国人不骗中国人,中国人了解中国人。

69、SAP数据库归档重做日志备份策略与工具详解 本文详细解析了SAP数据库归档重做日志备份的重要性及策略,介绍了SAP提供的备份工具brarchive及其配置和使用方法,探讨了BRBACKUP与BRARCHIVE的联合运行、一致在线备份、备用数据库备份场景以及备份策略的综合应用与优化。此外,还分析了备份过程中常见问题的解决方法、备份监控与评估流程、与第三方备份解决方案的集成方式,以及未来备份技术的发展趋势和应对策略。通过合理运用这些策略和工具,可以有效保障SAP数据库的安全性和可恢复性。 阅读详情

相关推荐

工程师必看:如何用功率谱密度搞定随机振动测试(附Grms计算实例)

本文为工程师详解如何通过功率谱密度(PSD)曲线计算Grms(总均方根加速度),从而量化随机振动测试的强度。文章拆解了平直谱、斜谱的计算公式,提供了完整的Grms计算实例,并指出了单位换算、对数坐标等常见工程陷阱,帮助工程师精准完成测试准备与设备推力评估。

3c4x5z6v7b的博客 626

不用搭建服务?MemFire Cloud让开发更简单

如果你是一个想专注于前端开发,或者希望以最快的速度交付项目的开发者,无疑是一个理想的选择。它省去了繁杂的后端开发和维护工作,让你专注于应用的功能和用户体验,尤其适合那些没有资源和时间搭建后端服务的独立开发者、小团队甚至个人项目。不需要搭建服务、不需要开发API、还可以免费使用各种认证服务和云功能,无疑是一款能够大幅提升开发效率的神器。对于开发者来说,省时、省力就是王道,而正是这样一个让开发更简单的好工具。快去试试吧!

weixin_44957042的博客 1400

【课程设计】TCP/IP 应用环境中服务器的部署与实现

本项目旨在通过搭建一个虚拟网络环境,实现软路由系统的配置和服务器的搭建与测试。具体包括安装虚拟机 VMWare Workstation,安装 Windows Server 2003 操作系统,配置软路由系统(包括双网卡安装、协议配置和测试),以及搭建并测试 DHCP 服务、DNS 服务、WWW 服务、FTP 服务和 SMTP/POP3 服务。

weixin_74907236的博客 1524

开发者不再焦虑:MemFire Cloud如何帮你减少工作量

是一款国产的后端即服务(BaaS)工具,已经稳定运行三年。第三方认证服务:支持二十多种认证方式,包括微信登录,让用户快速登录你的应用。对象存储:文件、图片、视频上传和管理,从未如此简单。云函数:复杂逻辑?一个云函数帮你搞定。静态部署:直接托管前端资源,无需操心配置。最佳实践源码:提供微信小程序、Web 应用等十几种应用模板,下载后直接运行,效率翻倍!开发不应该是一件让人焦虑的事,而是一次创造的旅程。用最简单的方式,帮助开发者减少工作量,专注于实现自己的创意。

weixin_44957042的博客 1002

Java 网络编程(超级详细)

1. 网络编程 1.1 网络编程概述 计算机网络 是指将地理位置相同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及通信协议的管理和协调下,实现资源共享和信息传递的计算机系统 1.2 网络编程三要素 1、IP地址 要想让网络中的计算机能够互相通信,必须为计算机指定一个标识号,通过这个标识号来指定要接受数据的计算机和识别发送的计算机,而IP地址就是这个标识号,也就是设备的标识。 2、端口 网络的通信,本质上是两个应用程序的通信。每台计算机都有很多的应用程

imByte的博客 3万+

经典损失函数——均方误差(MSE)和交叉熵误差(CEE)的python实现

损失函数(loss function)用来表示当前的神经网络对训练数据不拟合的程度。这个损失函数有很多,但是一般使用均方误差和交叉熵误差等。 1.均方误差(mean squared error) 先来看一下表达式: 用于将的求导结果变成,是神经网络的输出,是训练数据的标签值,k表示数据的维度。 用python实现: def MS...

Answer3664的博客 1万+

和后端吵架后,发现了一个神器——MemFire Cloud

简单来说,就是一款为懒人开发者准备的“一站式开发应用的神器”。它不仅提供了免费的云数据库,还可以帮助你免去搭建服务、开发接口API的烦恼。你还可以使用各种免费第三方认证服务(包括微信登录在内的20多种认证方式)、对象存储、云函数和静态部署等功能,完全不需要依赖后端开发者的帮助。听起来是不是很诱人?

weixin_44957042的博客 1322

Simulink标定工作流优化:当A2L文件遇到ELF,如何用Matlab脚本打通‘最后一公里’?

本文探讨了Simulink标定工作流中A2L与ELF文件处理的自动化解决方案。通过Matlab脚本实现A2L文件智能合并与ELF文件自动匹配,解决了传统手动操作效率低下和易出错的问题,显著提升汽车ECU开发效率。重点介绍了脚本实现细节及持续集成系统集成方案。

weixin_30564785的博客 338

高效全栈开发,MemFire Cloud让项目快人一步!

是一款专为懒人开发者设计的全栈开发工具,简化了开发过程中最复杂的部分,让开发者可以专注于核心功能的实现。它提供了一站式的解决方案,从后端服务到前端功能,甚至包括云数据库第三方认证服务云函数对象存储等,无论是个人项目还是商业产品,都能轻松实现。这款国产工具已经稳定运行了三年,是开发者们信赖的BaaS(Backend as a Service)平台,特别适合那些想快速启动项目、减少繁琐开发工作的开发者。

weixin_44957042的博客 952

Autosar_MCAL_Port

PORT Driver就是对微控制器(MCU)的整个PORT模块进行初始化配置。很多端口和管脚被分配有多种不同的功能,即可以进行引脚功能复用,比如通用I/O、adc、pwm、spi等功能。因此,对PORT必须有一个整体的配置和初始化,对各管脚的具体配置和使用取决于微控制器和ECU的引脚功能分配。PORT初始化数据应当尽可能高效地写到每个端口。DIO驱动中所用到的端口的配置和初始化都是在PORT驱动模块中完成的。因此,在使用DIO功能之前,应先进行PORT的初始化。1、PortContainer说明。

不断debug,优化中…… 239

史上最全!研究生科研必备科研工具(含AI科研工具),附使用说明和示例

这些工具在科研中的应用非常广泛,可以帮助研究生更高效地完成研究任务。为了更好地利用这些工具,建议深入学习它们的官方文档和教程,或者参加相关的工作坊和培训。

智能AI让学术科研更容易 3944

解锁开发新技能:用MemFire Cloud轻松搞定全栈!

简单来说,就是一款为懒人开发者量身定制的BaaS(后端即服务)平台。免费的云数据库、云函数、对象存储、静态部署等。你不再需要自己写后端代码,也不用为搭建复杂的服务器环境而发愁,所有这些工作都为你搞定。你不仅能使用多种服务,还能享受免费的第三方认证,包括微信登录等二十多种集成服务。你省下时间、金钱和精力,让开发变得更简单、更轻松。总之,作为一款为开发者量身打造的工具,能帮助你轻松解锁全栈开发技能。不再为后端琐事苦恼,不再为服务器配置烦恼,让你专注于创造和创新。

weixin_44957042的博客 884

AI Agent驱动的多模态情感分析方法:从BERT到Vision Transformer的探索

情感分析(Sentiment Analysis)是自然语言处理(NLP)与计算机视觉(CV)中一项重要任务。传统的情感分析主要依赖于文本数据,但在现实应用中,情感往往通过 语言、语音、表情、姿态 等多模态信号共同传达。因此,结合 多模态深度学习 的 AI Agent 在情感理解中具有广阔的前景。

一键难忘的博客 738

基于MemFireCloud的电子图书馆开发指南(二)

中已经实现了从epub文件中提取元数据并写入数据库,本篇内容会基于业务需求,利用MemFire Cloud快速生成业务接口,并利用其云存储的能力,实现文件静态托管。

NimbleX_的博客 301

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

网友案例|基于MemFireCloud的电子图书馆开发指南(一)

本系列文章将介绍如何从epub格式文件中提取结构化数据,并存入在线数据库(MemFireDB),进而利用该数据库自带的接口生成能力,在无需后端编码的情况下,完成自用电子图书馆的开发。

NimbleX_的博客 526

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Supabase国内版,MemFire Cloud应用开发

MemFire Cloud应用开发服务,采用开源的Supabase,兼容国内开发生态,内置通用服务,简单易学,加速小程序/移动APP/WEB应用的开发,降低开发/运维成本。

whdxlxl的专栏 3193

如何不花钱也能拥有一个属于自己的小程序、app

是一款专为懒人开发者准备的一站式开发应用的神器。对于独立开发者来说,它简直就是福音。不需要你搭建服务器,也不需要你开发接口API,所有的基础设施都已经为你准备好了。这款国产工具采用了国内的服务和开发习惯,已经稳定运行了三年,是一款可靠的BaaS(Backend as a Service)服务。总的来说,为开发者提供了一种全新的开发方式,让你不再为后端服务烦恼,可以把全部精力投入到应用的核心功能和用户体验上。如果你是一名独立开发者,正在寻找一种高效、稳定的开发解决方案,那么绝对是你的不二选择。

weixin_44957042的博客 1574

Memfire Cloud使用技巧:让开发更简单,更高效

这个名字可能对你来说还很陌生,但它所代表的便捷和强大,绝对值得你一试。它不仅仅是一个工具,更是你开发路上的得力助手,让你能够更加专注于创意和设计,而不是被技术细节所困扰。现在就访问,开启你的高效开发之旅吧!的使用技巧还有很多,这里只是冰山一角。随着你对的深入了解,你会发现更多高效、便捷的开发方式。让我们一起期待,在未来的日子里,会给我们带来更多的惊喜和便利。

weixin_44957042的博客 888

颠覆开发方式:MemFire Cloud 让你轻松上云!

的对象存储让你可以直接存放和管理图片、文件、视频等资源,同时支持云函数处理业务逻辑,让你不用再去搭建复杂的服务器,只需要写几行代码,就能完成数据存储和调用。,包括微信小程序和 Web 应用,你可以直接下载运行,看看别人是怎么做的,甚至可以在此基础上修改、优化,打造属于自己的产品。有时候,独立开发者的最大困境不是“技术问题”,而是“灵感枯竭”——想做点东西,但不知道做什么,也不知道从何入手。,甚至还能绑定自己的域名,让你的产品更专业。,大幅降低开发成本,让你的创意更快变成现实。

weixin_44957042的博客 1173

2024年,最新前端趋势来袭:MemFire Cloud,懒人开发者的福音!

2024年的前端开发,已经不仅仅是关于代码的编写,更多的是关于如何高效地利用工具,如何快速地实现创意。正是在这样的趋势下应运而生,它让前端开发变得更加简单、高效,让每一个开发者都能成为创造者。所以,如果你是一名追求效率、渴望创新的开发者,不妨试试。它可能会成为你开发路上的得力助手,让你的开发之旅更加轻松愉快。让我们一起迎接这个最新前端趋势,开启开发新篇章!

weixin_44957042的博客 626

MemFire Cloud,让Coding更丝滑

简单说,它是一款一站式开发神器,特别为懒人开发者设计。它帮你搞定繁琐的后端工作,省去了你手动搭建服务器、开发接口API的麻烦。而且最吸引人的地方是,它还有免费的云数据库供你使用,不花一分钱,就可以轻松完成项目开发。对于独立开发者来说,绝对是一个宝藏工具,让你的开发之路变得简单高效。更棒的是,还为你集成了超过20种第三方认证服务,包括常见的微信、QQ等,让用户登录更加方便。不仅如此,它还支持对象存储、云函数、静态部署等功能,这让整个开发过程变得极为轻松。

weixin_44957042的博客 970

轻松搭建,一键开发,MemFire Cloud:懒人开发者的创意神器

但是,要想快速开发一个应用,却需要花费大量时间搭建服务、开发接口、集成认证等等,这无疑增加了开发者的工作负担。它告别了繁琐的搭建过程和复杂的接口开发,让开发者能够专注于应用的创意和功能实现上,而无需花费精力在底层架构上。在这里,你可以免费使用包括微信登录等二十多种认证服务,轻松实现用户身份验证,让你的应用更加安全可靠。它提供了十几种类型应用的最佳实践的源代码,包括微信小程序和web应用等,让你轻松借鉴他人的经验,快速实现你的创意。如果你是一名懒人开发者,如果你想要轻松快速地开发应用,那么,

weixin_44957042的博客 416

MemFire Cloud:免费云数据库、快速创建应用的超强神器!

又或者,你想为应用添加身份认证功能,MemFire Cloud内置的邮箱、短信、小程序和微信二维码登录认证体系,开箱即用,无需自己开发。我最近也用了MemFire Cloud,开发了几个小程序示例,确实很省事,很多接口都不用开发了,微信认证也跟你写好了,也可以用这个来接单。同时,MemFire Cloud内置了邮箱、短信、小程序和微信二维码登录认证体系,开箱即用,无需自己开发,大大减轻了开发者的负担。它不仅大幅提升了开发效率,降低了开发和运维成本,而且还完全兼容国内的开发生态,让开发变得更加简单和高效。

weixin_44957042的博客 1062

免费云函数神器推荐

如今,云函数开发平台已成为开发者必备利器,它可以帮助开发者快速构建和部署无服务器应用程序。然而,市面上大多数云函数平台都并非免费,尤其是国外服务器,对国内开发人员来说使用起来并不方便。云函数,是运行在云端(服务器端)的、无关联、可重复使用的函数代码。使用云函数,您无需购买、管理服务器等基础设施,只需编写和上传代码。MemFire Cloud云函数为您准备好了计算资源,可以弹性、可靠的运行任务,从而可轻松构建任何类型的应用和服务。

weixin_44957042的博客 3097

零基础也能轻松开发,MemFire Cloud一站式搞定!

是一款为懒人开发者量身打造的神器,不管你是编程小白,还是接私活的老手,它都能显著提升你的开发效率。免搭建服务、免费的云数据库、多种登录方式和静态部署功能,让开发变得简单、直接。如果你想快速上手开发自己的小程序、Web 应用,或者只是在寻找一款能省时省力的工具,那么。

weixin_44957042的博客 861

java计算机毕业设计小程序网上图书馆【附源码+远程部署+程序+mysql】

传统的实体图书馆虽然拥有悠久的历史和文化价值,但在快节奏的现代生活中,其局限性逐渐显现。随着智能手机和移动互联网的普及,小程序网上图书馆应运而生,它打破了时间和空间的界限,让阅读资源触手可及。它以其独特的优势,满足了现代人对知识获取方式的新需求,成为连接知识与读者的桥梁,其发展背景和深远意义值得我们深入思考和积极拥抱。后端由Spring Boot提供支持,前端由Vue.js构建,数据存储和管理通过MySQL和Navicat实现,整个开发流程由Maven进行管理,并在Tomcat服务器上运行。

and867的博客 286

快速入门|使用MemFire Cloud构建Next.js应用程序

MemFire Cloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专注于编写前端应用程序代码,加速WEB或APP应用开发。快速入门|使用MemFire Cloud构建Next.js应用程序此示例提供了使用 MemFire Cloud 和 Next.js构建简单用户管理应用程序(从头开始)的步骤。

NimbleX_的博客 684
上一篇: 1024丨祝所有程序员码到之处皆成功!
下一篇: 活动公告|万圣节惊喜派对~
NimbleX_
博客等级 码龄6年 241粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值