手把手教你写项目之个人云盘系统全栈开发---第6篇:“让界面活起来”——前端模板与交互魔法

Sqribble模板驱动文档自动化:出版级PDF流水线解析 文档自动化并非简单排版,而是将内容转化为符合印刷规范、可审计、可复用的交付资产。其核心在于模板驱动(Template-Driven)机制——以结构化骨架替代自由设计,通过预设封面规则、章节模块链、目录层级绑定等确定性逻辑,实现零误差批量生成。该技术融合出版标准(如PDF/X-1a、GB/T 9704)、云原生架构与组件化继承,显著提升内容运营、培训交付、合规报告等场景的工程化水平。Sqribble正是这一范式的典型代表,将文档生产从‘人肉校验’升级为‘规则即法律’的工业化流水线。 阅读详情

阅读前请先下载项目源码,边读边看源码以加深理解和实操,
源码地址已放于文章末尾!

在这里插入图片描述
在这里插入图片描述

第6篇:“让界面活起来”——前端模板与交互魔法

嘿,各位“全栈艺术家”们,欢迎来到我们的“精装修”课堂!

在过去的几篇文章里,我们像硬核的工程师一样,专注于构建云盘强大的后端功能——从认证系统到文件操作,再到批量处理。我们的云盘现在拥有了强健的“筋骨”和深厚的“内力”。但是,如果一个武林高手看起来邋里邋遢,招式毫无美感,那也称不上一代宗师,对吧?

今天,我们就从后端工程师的角色中暂时跳脱出来,戴上“用户体验设计师”和“前端艺术家”的帽子,来一次彻头彻尾的“视觉革命”。我们将深入项目唯一的“皮肤”——template.php,去揭秘那些让界面变得漂亮、灵动、讨人喜欢的“前端魔法”!

核心探秘:三大“魔法”撑起颜值与交互

我们的云盘前端,虽然代码都在一个 template.php 文件里,但其背后是由三大“魔法”支撑的:

  1. PHP 模板引擎 (原生): 这是一种将“骨架”(HTML)和“血肉”(PHP动态数据)完美融合的古老魔法。template.php 就是我们的魔法卷轴,上面同时写着HTML的结构咒语和PHP的数据咒语。当服务器念诵这个卷轴时,一个动态的、充满数据的页面就诞生了。
  2. Tailwind CSS (颜值魔法): 传统的CSS好比是给房子刷墙,得先调好一整桶“红色油漆”(定义一个 .red-wall class),再去刷。而Tailwind CSS则像是给了你无数个乐高积木块,比如 bg-red-500 (红色背景)、rounded-lg (大圆角)、shadow-xl (超大阴影)。你不需要去想该给一个东西起什么class名字,而是直接用这些“积木块”把它拼出来。这种“原子化”或“功能类优先”的理念,极大地提升了开发效率和灵活性。
  3. JavaScript (灵魂魔法): 如果说HTML是骨架,CSS是皮肉,那么JavaScript就是赋予我们云盘“灵魂”的魔法。页面上所有的“动感”,比如点击按钮弹出一个漂亮的模态框、选中文件后按钮自动激活、文件上传时平滑滚动的进度条,全都是JS在背后“作法”。

接下来,我们就深入 template.php,看看这三大魔法是如何具体施展的。

代码实战:“四位一体”解剖前端核心模块


1. 数据与视图的联姻 - 列表渲染

这是PHP原生模板引擎最经典的表演。

a. 文件路径定位: template.php (文件列表 <tbody> 部分,约 535行)

b. 全面讲解引用:

  • <?php foreach ($paginatedFiles as $file): ?> ... <?php endforeach; ?>: 这是PHP嵌入HTML的循环语法。index.php 准备好的 $paginatedFiles 数组在这里被“解包”,数组里有几个文件,这个循环就会执行几次,生成几行 <tr> 表格。
  • <?php echo htmlspecialchars($file['name']); ?>: echo 是PHP的输出指令。htmlspecialchars 是我们的老朋友了,防止XSS攻击。这里就是把文件名、文件大小等动态数据“焊接”到HTML模板里的具体位置。
  • 三元运算符 (condition) ? 'A' : 'B': 在 template.php 中被广泛使用,用于根据条件输出不同的class或文本。例如,根据文件扩展名判断并显示不同的小图标。

c. 逐行注释与结构化分析:

<!-- 文件路径: template.php -->

<tbody class="bg-white divide-y divide-gray-100">
    <!-- ... 循环渲染文件夹 ... -->
    
    <!-- 循环渲染文件列表 -->
    <?php foreach ($paginatedFiles as $file): ?>
        <tr class="hover:bg-gray-50 transition-colors">
            <td class="px-6 py-4 whitespace-nowrap">
                <div class="flex items-center">
                    <!-- ... (多选框) ... -->
                    <div class="flex-shrink-0 h-8 w-8 ...">
                        <?php
                            // PHP逻辑:根据文件扩展名,决定使用哪个Font Awesome图标
                            $fileExt = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
                            $fileIcon = 'file-o'; // 默认图标
                            if (in_array($fileExt, ['jpg', 'jpeg', 'png', 'gif'])) {
                                $fileIcon = 'file-image-o';
                            } // ... 其他类型的判断
                        ?>
                        <!-- 输出最终计算出的图标class -->
                        <i class="fa fa-<?php echo $fileIcon; ?> text-gray-500"></i>
                    </div>
                    <div class="ml-3">
                        <!-- 输出文件名 -->
                        <a href="..." class="text-gray-900 hover:underline">
                            <?php echo htmlspecialchars($file['name']); ?>
                        </a>
                    </div>
                </div>
            </td>
            <!-- ... 其他列,同样使用 echo 输出文件大小、类型、时间 ... -->
        </tr>
    <?php endforeach; ?>
</tbody>

d. 上下文关联:
template.php 的这段代码是整个数据流的“终点站”。index.php 辛辛苦苦从文件系统里读取、整理、分页好的数据,最终在这里被 foreach 循环和 echo 语句赋予了视觉形态。这种后端准备数据、前端只管渲染的模式,就是最朴素的MVC(模型-视图-控制器)思想的体现,index.php 扮演了控制器和模型的角色,而 template.php 就是纯粹的视图。


2. “积木”的艺术 - Tailwind CSS 快速塑形

让我们看看,那些漂亮的按钮和卡片是怎么用Tailwind“拼”出来的。

a. 文件路径定位: template.php (例如,上传按钮,约 249行)

c. 逐行注释与结构化分析:

<!-- 文件路径: template.php -->

<!-- 上传按钮 -->
<button id="uploadBtn" class="
    px-4 py-2           <!-- 内边距:水平4,垂直2 -->
    bg-primary          <!-- 背景色:我们在配置中定义的主题色 -->
    text-white          <!-- 文字颜色:白色 -->
    rounded-lg          <!-- 圆角:大尺寸 -->
    hover:bg-primary/90 <!-- 鼠标悬浮时:背景色变为主题色的90%透明度 -->
    transition-colors   <!-- 过渡效果:颜色变化时有动画 -->
    flex items-center   <!-- 使用Flex布局,并让内部元素垂直居中 -->
">
    <i class="fa fa-upload mr-2"></i> <!-- 图标,右边距为2 -->
    <span>上传文件</span>
</button>

逻辑拆解:
看到这一长串的 class 了吗?这就是Tailwind的魔法!我们没有去 style.css 文件里写一个 .upload-button { ... },而是直接把样式“原子”组合起来,应用到元素上。

  • px-4 py-2 控制了按钮的大小感。
  • bg-primary text-white 定义了它的配色。
  • rounded-lg 让它看起来更柔和。
  • hover:bg-primary/90 transition-colors 赋予了它灵动的交互反馈。

这种方式的好处是,你不需要在HTML和CSS文件之间来回切换,并且能保证整个项目样式的高度统一和可维护性。


3. 灵魂注入 - JavaScript 交互魔法

以“新建文件夹”的模态框为例,看看JS是如何串起整个交互流程的。

a. 文件路径定位: template.php (JS部分,约 1426行)

b. 全面讲解引用:

  • document.getElementById('newFolderBtn'): 获取页面上ID为 newFolderBtn 的那个按钮元素。
  • addEventListener('click', ...): 老朋友了,给按钮绑定一个点击事件的“监听器”。
  • 模板字符串 (`): 使用反引号包裹的字符串,可以在其中方便地插入变量 ${...} 和换行,非常适合用来动态构建HTML片段。
  • openModal(content): 这是我们在JS里自定义的一个函数,专门用来显示模态框。

c. 逐行注释与结构化分析:

// 文件路径: template.php

// -------------------
// 核心逻辑:封装一个打开模态框的通用函数
// -------------------
function openModal(content) {
    const modal = document.getElementById('actionModal');
    const modalContent = document.getElementById('actionModalContent');
    
    // 步骤1:将传入的HTML内容填充到模态框的容器里
    modalContent.innerHTML = content;
    
    // 步骤2:移除 'hidden' class,让模态框的遮罩层显示出来
    modal.classList.remove('hidden');
    
    // 步骤3:通过一点延时和class切换,实现优雅的淡入放大动画
    setTimeout(() => {
        modalContent.classList.remove('scale-95', 'opacity-0');
        modalContent.classList.add('scale-100', 'opacity-100');
    }, 10);
}

// -------------------
// 核心逻辑:为“新建文件夹”按钮绑定事件
// -------------------
const newFolderBtn = document.getElementById('newFolderBtn');
if (newFolderBtn) {
    newFolderBtn.addEventListener('click', function() {
        // 步骤A:使用模板字符串,动态构建出“新建文件夹”模态框的HTML内容
        const modalContentHTML = `
            <div class="p-6">
                <h3 class="text-lg ...">新建文件夹</h3>
                <form method="POST" id="newFolderForm">
                    <input type="hidden" name="create_folder" value="1">
                    <div class="mb-4">
                        <label for="folder_name" class="...">文件夹名称</label>
                        <input type="text" id="folder_name" name="folder_name" class="..." required>
                    </div>
                    <div class="flex justify-end ...">
                        <button type="button" onclick="closeModal()">取消</button>
                        <button type="submit" name="create_folder">创建</button>
                    </div>
                </form>
            </div>
        `;
        
        // 步骤B:调用我们封装好的函数,把构建好的HTML塞进去并显示出来
        openModal(modalContentHTML);
    });
}

d. 上下文关联:
这就是一个完整的前端交互闭环。

  1. 监听用户行为:通过 addEventListener 等待用户点击。
  2. 动态生成UI:用户点击后,不跳转页面,而是用JS在当前页面上动态创建出新的交互界面(模态框)。
  3. 收集用户输入:模态框本质上是一个小型的HTML form,用于收集用户输入的新文件夹名。
  4. 与后端通信:用户点击“创建”按钮,这个 form 就会被提交,将指令和数据发送给 index.php 的相应逻辑块(我们在第四章分析过的)。
  5. 后续流程:index.php 处理完毕后刷新页面,用户就能看到新的文件夹。closeModal() 函数则负责在取消或完成后,以动画形式优雅地关闭模态框。

项目中的重命名、删除、移动等所有需要用户输入的交互,都复用了这套 openModal/closeModal 的逻辑,极大地提高了代码的复用性和维护性。

总结与预告

今天,我们为云盘披上了华丽的“外衣”,并注入了灵动的“灵魂”。我们学习了如何将PHP的动态数据与HTML模板无缝结合,领略了Tailwind CSS“化整为零”的样式构建魅力,并剖析了JavaScript是如何通过DOM操作和事件监听,创造出流畅、现代的前端交互体验。

至此,我们的个人云盘项目,从前端到后端,从功能到体验,已经可以说是一个非常完整的作品了。它已经可以在我们的本地电脑上稳定、高效地运行。

但是,一个只能在自己电脑上“孤芳自赏”的项目,就像一把藏在剑鞘里的绝世好剑,未免有些遗憾。

在我们的最终篇章中,我们将完成这趟旅程的最后一步,也是最激动人心的一步——部署上线:让你的云盘在云端翱翔! 我将带你走过将项目从本地部署到真实云服务器的全过程,让全世界的朋友都能通过一个网址来访问你的杰作!

准备好,向世界展示你的作品了吗?我们终点线见!

源码下载地址:
https://thmail.lanzouu.com/if4Yn34b31cf

地图打印与 GeoTIFF 导出:框选区域、矢量标绘、一键出图 空间智能实验室 Vol.19:地图打印与 GeoTIFF 导出:框选区域、矢量标绘、一键出图 「把这块区域导成一张带地理坐标的高清图」是个很朴素的需求,但朴素不等于简单。你要在浏览器里框一个框、画几个箭头标个文字、叠一层 阅读详情

相关推荐

保姆级教程:用Python+MM-Agent搭建自己的数学建模AI助手(支持GPT-4o/DeepSeek)

本文提供了一份详细的教程,教你如何使用Python和MM-Agent框架搭建数学建模AI助手,支持GPT-4o和DeepSeek-R1等LLM后端。从环境配置、HMML知识库集成到多LLM适配和建模流程实现,手把手教你构建智能建模系统,提升数学建模效率。

k6l7m8n9的博客 452

【项目推荐】基于 SpringBoot3 + Spring AI 的游泳馆管理系统:Agent + RAG + Function Calling 一次学全

它不是玩具 Demo,而是一个「业务 + AI」双主线交织的真实系统——预约业务在跑,AI 客服在旁边实时查库作答,两条线通过 Function Calling、RAG、站内消息串成一体。面试官问「你做过什么 AI 项目」时,你能从业务场景讲到架构取舍,从 RAG 切分参数讲到降级兜底——这和「我调了一下 ChatGPT 的 API」是完全不同的两个段位。项目已包含完整的建表 SQL、初始化数据、部署文档,克隆下来就能跑。获取方式:见文末说明 / 后台回复关键词获取。—— 完 ——

深耕开发,专注编程实战。分享源码解析、项目搭建、问题排查笔记,沉淀技术,持续更新。 347

IAR使用教程:如何导入现有工程并成功编译

详细介绍如何在IAR中导入现有工程项目并完成编译配置,解决常见报错问题。通过清晰的操作指引,帮助开发者快速上手iar使用教程中的关键环节,提升开发效率。

weixin_42437253的博客 883

Web 版翻译者资料库

本项目是桌面版《翻译者资料库》的 Web 移植版,基于 Spring Boot 3.3、Thymeleaf、Bootstrap 5.3 与 MySQL 8.0 构建。它面向翻译写作提供资料、词汇、句库、文本工具、对照制作、查找、备份恢复及旧库迁移等功能,完整继承桌面版核心业务规则,支持一键启动与离线访问。

howard2005的专栏 137

Coze HTTP请求节点实战:5分钟搞定天气API对接(含动态参数技巧)

本文通过一个天气预报API对接的实战案例,详细讲解了如何在Coze平台使用HTTP请求节点实现外部数据交互。文章重点演示了动态参数传递、JSON响应解析与错误处理等核心技巧,帮助开发者在5分钟内快速构建稳定可靠的智能体外部服务调用能力。

weixin_29233333的博客 675

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

很多情况下是没有现成的VS Code Server程序的,需要手动下载。记住上面的Commit ID,可以通过下面的链接下载 vscode-server-linux-x64.tar.gz。然后将vscode-server-linux-x64.tar.gz上传在服务器上的$HOME/.vscode-server/bin文件夹中,解压。在wsl中下载不了 vscode 的核心。运行下面两行命令,建立空的$HOME/.vscode-server/bin文件夹。重新运行 wsl与vs的链接即可。

点云算法工程师 3790

2026小红书小工具怎么制作:纯前端 ZIP 打包、沙箱限制与笔记挂载流程

小红书小工具制作的核心不是复杂开发,而是把需求压缩成纯前端轻交互,并按平台要求完成 ZIP 交付。适合做的方向是测试、计算器、生成器、学习小测和记录工具;不适合做的方向是账号体系、云端数据、支付和远程接口。制作时先确认沙箱限制,再整理输入、计算、输出链路,最后通过 Builder Hub 提交审核并挂载笔记。在需求简单、素材较少的情况下,十几分钟做出一个可用的小工具是现实路径,袋马就是一个选择。

qq_39308835的博客 284

【2026最新版】python点云处理算法汇总(长期更新版)

python点云处理算法整理。博客长期更新,最近一次更新时间为:2026年10月4日。

点云侠的博客 42万+

Agent 的 ReAct、Plan、Execute、Reflection 模式

本文系统解析 Agent 的 ReAct、Plan、Execute、Reflection 四模式,揭示其核心为“下一步谁定”与“错了怎么发现”两大问题。ReAct 逐步决策,适合动态环境但易冗余;Plan 一次性规划,高效却惧变化;Execute 严格落地,需明确判据与失败策略;Reflection 事后校验,强化纠错闭环。四者协同:外层规划,执行中嵌入思考,每步后反思,连续失败才重规划,构建稳定可控的智能体工作流。

2401_89855466的博客 325

星载SAR的各项指标解读(史上最全)

一、系统指标 系统指标主要指雷达系统的通用的指标,以及和卫星整星相关的指标,主要有一下几项: 工作频段: 雷达体制: 极化方式: 设计s

9271

Claude Code(1):手把手教你安装配置 Claude Code

Claude Code 是一款强大的 AI 编程助手工具,能够帮助开发者提升编码效率。本文将详细介绍如何在不同操作系统上安装和配置 Claude Code,让你快速上手这款工具。

blues_C的博客 752

海外平台频繁弹验证?从 DNS、WebRTC 到浏览器指纹的环境异常排查清单

在运营多地区海外平台账号时,即使代理节点通畅、TCP 握手成功,仍可能遇到频繁人机验证、地区限制、播放失败等异常。核心结论是:这类问题往往不在网络传输层,而在浏览器环境参数与网络出口之间的逻辑自洽性。本文从 DNS 泄漏、WebRTC 穿透、时区与语言匹配、Canvas/WebGL 指纹、TLS 特征五个维度,给出一份可复现的环境异常排查清单,并对比个人手动配置与工程化环境管理方案的适用边界。适用于跨境运营、多账号运维团队。

P1Browser【p1指纹浏览器】的博客 182

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

信号链电路怎么选运放?奥特四款信号链运放解析【选型参考】

在模拟电路设计中,运放作为信号链的“第一道门槛”,其微小误差往往决定了整个系统的成败。

naNa_1120的博客 191

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

智能问诊的流程

本文介绍基于FastAPI构建的医疗多Agent系统MediAgent,通过症状分析、诊断推理与治疗建议等模块协同,实现从问诊到报告生成的完整工作流。系统采用前后端分离架构,结合MySQL、RabbitMQ与Docker实现工程化部署,支持异步化验结果接入。虽当前状态暂存于内存,但已具备可扩展性,未来可通过Redis持久化、消息队列联动及医疗安全机制完善,应用于慢病管理、辅助决策等场景,推动AI在医疗流程中的落地应用。

Joey 的工作空间~ 670

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

流式输出 SSE:实现 AI 对话打字机效果后端开发

摘要解决传统 HTTP 请求在 LLM 长文本生成时导致的客户端长时间阻塞与 TTFT 极高的问题。适用于需为 AI 应用提供打字机效果、优化交互体验的后端开发工程师。读完可获得基于 FastAPI 与 SSE(Server-Sent Events)技术的流式响应实现代码、协议规范及生产环境避坑指南。关键词SSE、流式输出、FastAPI、打字机效果、TTFT、大模型推理背景与问题大模型(LLM)生成完整回复通常耗时数秒至数十秒,传统请求-响应模型导致用户界面长时间无响应,体验极差。

2402_85729970的博客 178

Vue-Router

本文详解前端路由原理与实现,以网易云音乐为例,介绍通过 vue-router 实现页面无刷新切换。核心步骤包括:安装模块、创建路由实例、注册应用、配置页面组件与路由出口。使用 router-link 实现声明式导航,结合 query 和 params 传参,支持模糊与精确匹配激活状态。强调 useRoute(读取参数)与 useRouter(执行跳转)的区别,帮助开发者掌握单页应用路由的核心机制。

2301_79245606的博客 340

基于 YOLOv8 的森林火灾检测系统(Web 版)

本项目面向林区早期火情识别场景,使用YOLOv8完成火焰(Fire)与烟雾(Smoke)两类目标的检测模型训练,并以FastAPI构建 Web 检测平台,把模型能力封装为可直接登录使用的系统。平台除常规的图片、批量、视频、摄像头检测外,还提供同图多权重对比、数据集浏览与标注核对、模型热切换,以及把训练搬到网页上的能力:可在浏览器配置超参数发起真实训练,训练中在线调整学习率、查看进度与动态曲线,训练完成后下载产物或直接应用到检测。

Michael_Jay的博客 59

身份验证漏洞专题(三):持久登录、密码重置与密码修改中的凭据绑定缺陷

密码登录与双因素认证是身份验证的主干流程,但一个完整的认证体系还依赖三类辅助机制:持久登录("记住我")、密码重置、密码修改。这三类机制的共同特征是:它们同样携带或验证凭据,同样直接决定认证状态的归属,但实现时获得的防护强度往往远低于登录页面本身。攻击者绕不开登录接口时,常常可以从这些辅助入口进入。

2401_85321170的博客 629

二进制木马免杀-Python 分离免杀与 Web 挂马

二进制木马免杀-Python 分离免杀与 Web 挂马

2503_94637398的博客 268

Vue 前端开发 AI 对话页面:流式消息渲染、文件上传

关键点是不能手动设置 Content-Type 为 multipart/form-data,必须由浏览器自动生成带有 boundary 的请求头,否则后端无法解析。思路:将对象序列化为 JSON 字符串,作为 FormData 的一个普通字段(如 formData.append(‘payload’, JSON.stringify(data))),后端接收该字段后再反序列化。若上传大文件(>10MB),需实现独立的分片上传接口,在提交对话前先获取文件 id 或 url,再随文本发送引用。移除输入框的禁用态;

2402_85729970的博客 387

在Open-WebUI中提升向量化速度

让Open-WebUI AI聊天的向量化过程不超过10秒,而不是默认的20+分钟……

xyzzklk的博客 573

Writeup 4 0xGame 2021 · command (WEB)

前端限制不可信:永远不要相信前端的任何限制(如disabled按钮、JS 验证等)。攻击者可以直接构造 HTTP 数据包绕过前端校验,所有的安全限制必须在后端实现。命令执行/注入(RCE):Web 应用如果直接调用系统命令且未对输入进行严格过滤,攻击者可以利用;||等符号拼接恶意命令。绕过技巧:在 CTF 中,如果遇到命令执行被过滤,常见的绕过方式包括:${IFS}$IFS$9等。。cat /fla?或cat /fl*。Linux 基础。

hengdonghui的博客 131

vue3 markdown编辑框与压缩包文件上传及预览

el-input v-model="form.author" placeholder="作者/组织" maxlength="50" clearable /><el-select v-model="form.category" placeholder="请选择标签" class="full-width"><el-select v-model="form.license" placeholder="请选择" class="full-width">'编辑技能' : '新建技能' }}</div>

每一篇博客都是对自己技术的沉淀 173

使用HTML+CSS+JavaScript实现文件上传弹窗

使用HTML+CSS+JavaScript实现文件上传弹窗

bjzhang75的博客 199

ArkWeb 混合开发的内存清理与桥接陷阱

起初我以为是 H5 内部的定时器没有清理,结果接了 DevEco Studio 的 Profiler 一看,全是 ArkTS 侧的原生对象没有释放。改用 RESIZE 后,键盘弹出只会压缩窗口高度,底部的输入框会自适应滚动到可视区域,页面顶部的元素则岿然不动。综上所述,混合开发绝不是简单的拼接,管好桥接的生命周期,做好跨域兜底,才是稳定运行的前提。如果不去主动干预,它会把你的原生内存吃得连骨头都不剩。在 H5 的输入框打字时,软键盘一弹出来,整个 Web 页面就被顶得飞起,连顶部的原生导航栏都不见了。

2502_91284977的博客 235
上一篇: 手把手教你写项目之个人云盘系统全栈开发---第5篇:“一键打包带走!”——批量操作与下载功能的实现
下一篇: 手把手教你写项目之个人云盘系统全栈开发---第七篇:部署上线——让你的云盘在云端翱翔!
THMAIL
博客等级 码龄10年 2434粉丝 432原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值