 2019-2021 美团技术年货 前端篇FlutterWeb 性能优化探索与实践 36 设计稿(UI 视图)自动生成代码方案的探索 56 美团外卖终端容器无关化研发框架 74 一款可以让大型 iOS 工程编译速度提升 50% 的工具 96 从预编译的角度理解 Swift 与 Objective-C 及混编机制 108 美团民宿跨端复用框架设计与实践 165 美团跨端一体化富文本管理技术实践 186 前端 | 2020 互形式,也意味着新的机遇。如果能够利用好鸿蒙的开发生态及其特性能力,可以让 应用覆盖更多的交互场景和设备类型,从而带来新的增长点。 与面临的机遇相比,适配鸿蒙系统带来的挑战同样巨大。当前手机端,尽管鸿蒙系统 仍然支持安卓 APK 安装及运行,但长期来看,华为势必会抛弃 AOSP,逐步发展出 自己的生态,这意味着现有安卓应用在鸿蒙设备上将会逐渐变成“二等公民”。然而, 如果在 iOS 及 Android 之外再重新开发和维护一套鸿蒙应用,在如今业界越来越注 编写插件包。 下面分别对这两种类型 Package 中如何分平台编程进行介绍。 (1) Dart Package Dart Package 是纯 Dart 编写,因此大部分代码均可由 dart2js 直接编译出 Web 平 台可运行的代码,但某些涉及 Native 能力的库 (如 dart:io)是无法被转译的,因此 前端 < 19 需要有对平台进行兼容的方法,下面介绍两种在 Dart Package0 码力 | 738 页 | 50.29 MB | 1 年前3 2019-2021 美团技术年货 前端篇FlutterWeb 性能优化探索与实践 36 设计稿(UI 视图)自动生成代码方案的探索 56 美团外卖终端容器无关化研发框架 74 一款可以让大型 iOS 工程编译速度提升 50% 的工具 96 从预编译的角度理解 Swift 与 Objective-C 及混编机制 108 美团民宿跨端复用框架设计与实践 165 美团跨端一体化富文本管理技术实践 186 前端 | 2020 互形式,也意味着新的机遇。如果能够利用好鸿蒙的开发生态及其特性能力,可以让 应用覆盖更多的交互场景和设备类型,从而带来新的增长点。 与面临的机遇相比,适配鸿蒙系统带来的挑战同样巨大。当前手机端,尽管鸿蒙系统 仍然支持安卓 APK 安装及运行,但长期来看,华为势必会抛弃 AOSP,逐步发展出 自己的生态,这意味着现有安卓应用在鸿蒙设备上将会逐渐变成“二等公民”。然而, 如果在 iOS 及 Android 之外再重新开发和维护一套鸿蒙应用,在如今业界越来越注 编写插件包。 下面分别对这两种类型 Package 中如何分平台编程进行介绍。 (1) Dart Package Dart Package 是纯 Dart 编写,因此大部分代码均可由 dart2js 直接编译出 Web 平 台可运行的代码,但某些涉及 Native 能力的库 (如 dart:io)是无法被转译的,因此 前端 < 19 需要有对平台进行兼容的方法,下面介绍两种在 Dart Package0 码力 | 738 页 | 50.29 MB | 1 年前3
 阮一峰 《ECMAScript 6入门》 第三版{ "presets": [], "plugins": [] } ECMAScript 6简介 11 presets 字段设定转码规则,官方提供以下的规则集,你可以根据需要安装。 # 最新转码规则 $ npm install --save-dev babel-preset-latest # react 转码规则 $ npm install --save-dev babel-preset-react } 注意,以下所有 Babel工具和模块的使用,都必须先写好 .babelrc 。 命令行转码 babel-cli Babel提供 babel-cli 工具,用于命令行转码。 它的安装命令如下。 $ npm install --global babel-cli 基本用法如下。 ECMAScript 6简介 12 # 转码结果输出到标准输出 $ babel example 转码。这意味着,如果项目要运行,全局环 境必须有 Babel,也就是说项目产生了对环境的依赖。另一方面,这样做也无法支 持不同项目使用不同版本的 Babel。 一个解决办法是将 babel-cli 安装在项目之中。 # 安装 $ npm install --save-dev babel-cli 然后,改写 package.json 。 ECMAScript 6简介 13 { // ...0 码力 | 679 页 | 2.66 MB | 1 年前3 阮一峰 《ECMAScript 6入门》 第三版{ "presets": [], "plugins": [] } ECMAScript 6简介 11 presets 字段设定转码规则,官方提供以下的规则集,你可以根据需要安装。 # 最新转码规则 $ npm install --save-dev babel-preset-latest # react 转码规则 $ npm install --save-dev babel-preset-react } 注意,以下所有 Babel工具和模块的使用,都必须先写好 .babelrc 。 命令行转码 babel-cli Babel提供 babel-cli 工具,用于命令行转码。 它的安装命令如下。 $ npm install --global babel-cli 基本用法如下。 ECMAScript 6简介 12 # 转码结果输出到标准输出 $ babel example 转码。这意味着,如果项目要运行,全局环 境必须有 Babel,也就是说项目产生了对环境的依赖。另一方面,这样做也无法支 持不同项目使用不同版本的 Babel。 一个解决办法是将 babel-cli 安装在项目之中。 # 安装 $ npm install --save-dev babel-cli 然后,改写 package.json 。 ECMAScript 6简介 13 { // ...0 码力 | 679 页 | 2.66 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 JavaScript 版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 第 16 章 附录 362 16.1 编程环境安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 16.2 一起参与创作 . . . . 章 前言 www.hello‑algo.com 6 图 0‑3 运行代码示例 运行代码的前置工作主要分为三步。 第一步:安装本地编程环境。请参照附录所示的教程进行安装,如果已安装,则可跳过此步骤。 第二步:克隆或下载代码仓库。前往 GitHub 仓库。如果已经安装 Git ,可以通过以下命令克隆本仓库: git clone https://github.com/krahets/hello-algo 24 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下0 码力 | 379 页 | 18.47 MB | 10 月前3 Hello 算法 1.2.0 简体中文 JavaScript 版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 第 16 章 附录 362 16.1 编程环境安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 16.2 一起参与创作 . . . . 章 前言 www.hello‑algo.com 6 图 0‑3 运行代码示例 运行代码的前置工作主要分为三步。 第一步:安装本地编程环境。请参照附录所示的教程进行安装,如果已安装,则可跳过此步骤。 第二步:克隆或下载代码仓库。前往 GitHub 仓库。如果已经安装 Git ,可以通过以下命令克隆本仓库: git clone https://github.com/krahets/hello-algo 24 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下0 码力 | 379 页 | 18.47 MB | 10 月前3
 Hello 算法 1.1.0 JavaScript版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 第 16 章 附录 362 16.1 编程环境安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 16.2 一起参与创作 . . . . 第 0 章 前言 hello‑algo.com 6 图 0‑3 运行代码示例 运行代码的前置工作主要分为三步。 第一步:安装本地编程环境。请参照附录所示的教程进行安装,如果已安装,则可跳过此步骤。 第二步:克隆或下载代码仓库。前往 GitHub 仓库。如果已经安装 Git ,可以通过以下命令克隆本仓库: git clone https://github.com/krahets/hello-algo 24 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下0 码力 | 379 页 | 18.46 MB | 1 年前3 Hello 算法 1.1.0 JavaScript版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 第 16 章 附录 362 16.1 编程环境安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 16.2 一起参与创作 . . . . 第 0 章 前言 hello‑algo.com 6 图 0‑3 运行代码示例 运行代码的前置工作主要分为三步。 第一步:安装本地编程环境。请参照附录所示的教程进行安装,如果已安装,则可跳过此步骤。 第二步:克隆或下载代码仓库。前往 GitHub 仓库。如果已经安装 Git ,可以通过以下命令克隆本仓库: git clone https://github.com/krahets/hello-algo 24 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下0 码力 | 379 页 | 18.46 MB | 1 年前3
 Hello 算法 1.0.0 JavaScript版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 第 16 章 附录 362 16.1 编程环境安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 16.2 一起参与创作 . . . . 第 0 章 前言 hello‑algo.com 6 图 0‑3 运行代码示例 运行代码的前置工作主要分为三步。 第一步:安装本地编程环境。请参照附录所示的教程进行安装,如果已安装,则可跳过此步骤。 第二步:克隆或下载代码仓库。前往 GitHub 仓库。如果已经安装 Git ,可以通过以下命令克隆本仓库: git clone https://github.com/krahets/hello-algo 24 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下0 码力 | 376 页 | 17.57 MB | 1 年前3 Hello 算法 1.0.0 JavaScript版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 第 16 章 附录 362 16.1 编程环境安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 16.2 一起参与创作 . . . . 第 0 章 前言 hello‑algo.com 6 图 0‑3 运行代码示例 运行代码的前置工作主要分为三步。 第一步:安装本地编程环境。请参照附录所示的教程进行安装,如果已安装,则可跳过此步骤。 第二步:克隆或下载代码仓库。前往 GitHub 仓库。如果已经安装 Git ,可以通过以下命令克隆本仓库: git clone https://github.com/krahets/hello-algo 24 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下0 码力 | 376 页 | 17.57 MB | 1 年前3
 Hello 算法 1.0.0b5 JavaScript版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 第 16 章 附录 366 16.1 编程环境安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 16.2 一起参与创作 . . . . 与阅读代码相比,编写代码的过程往往能带来更多收获。动手学,才是真的学。 图 0‑3 运行代码示例 运行代码的前置工作主要分为三步。 第一步:安装本地编程环境。请参照附录教程进行安装,如果已安装则可跳过此步骤。 第二步:下载代码仓。如果已经安装 Git ,可以通过以下命令克隆本仓库。 git clone https://github.com/krahets/hello-algo.git 23 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出报错。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下0 码力 | 375 页 | 30.68 MB | 1 年前3 Hello 算法 1.0.0b5 JavaScript版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 第 16 章 附录 366 16.1 编程环境安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 16.2 一起参与创作 . . . . 与阅读代码相比,编写代码的过程往往能带来更多收获。动手学,才是真的学。 图 0‑3 运行代码示例 运行代码的前置工作主要分为三步。 第一步:安装本地编程环境。请参照附录教程进行安装,如果已安装则可跳过此步骤。 第二步:下载代码仓。如果已经安装 Git ,可以通过以下命令克隆本仓库。 git clone https://github.com/krahets/hello-algo.git 23 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出报错。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下0 码力 | 375 页 | 30.68 MB | 1 年前3
 阮一峰 JavaScript 教程(2)Node Node 项目使得 JavaScript 可以用于开发服务器端的大型项目,网 站的前后端都用 JavaScript 开发已经成为了现实。有些嵌入式平台 (Raspberry Pi)能够安装 Node,于是 JavaScript 就能为这 些平台开发应用程序。 (3)数据库操作 JavaScript 甚至也可以用来操作数据库。NoSQL 数据库这个概念, 本身就是在 JSON(JavaScript JavaScript 和 HTML5 打包在一个容器之 中,使得它能同时在 iOS 和安卓上运行。Facebook 公司的 React Native 项目则是将 JavaScript 写的组件,编译成原生组件,从 而使它们具备优秀的性能。 Mozilla 基金会的手机操作系统 Firefox OS,更是直接将 JavaScript 作为操作系统的平台语言,但是很可惜这个项目没有成 导论 只要有浏览器,就能运行 JavaScript 程序;只要有文本编辑器,就 能编写 JavaScript 程序。这意味着,几乎所有电脑都原生提供 JavaScript 学习环境,不用另行安装复杂的 IDE(集成开发环境) 和编译器。 (2)简单性 相比其他脚本语言(比如 Python 或 Ruby),JavaScript 的语 法相对简单一些,本身的语法特性并不是特别多。而且,那些语法中的 复杂0 码力 | 540 页 | 3.32 MB | 10 月前3 阮一峰 JavaScript 教程(2)Node Node 项目使得 JavaScript 可以用于开发服务器端的大型项目,网 站的前后端都用 JavaScript 开发已经成为了现实。有些嵌入式平台 (Raspberry Pi)能够安装 Node,于是 JavaScript 就能为这 些平台开发应用程序。 (3)数据库操作 JavaScript 甚至也可以用来操作数据库。NoSQL 数据库这个概念, 本身就是在 JSON(JavaScript JavaScript 和 HTML5 打包在一个容器之 中,使得它能同时在 iOS 和安卓上运行。Facebook 公司的 React Native 项目则是将 JavaScript 写的组件,编译成原生组件,从 而使它们具备优秀的性能。 Mozilla 基金会的手机操作系统 Firefox OS,更是直接将 JavaScript 作为操作系统的平台语言,但是很可惜这个项目没有成 导论 只要有浏览器,就能运行 JavaScript 程序;只要有文本编辑器,就 能编写 JavaScript 程序。这意味着,几乎所有电脑都原生提供 JavaScript 学习环境,不用另行安装复杂的 IDE(集成开发环境) 和编译器。 (2)简单性 相比其他脚本语言(比如 Python 或 Ruby),JavaScript 的语 法相对简单一些,本身的语法特性并不是特别多。而且,那些语法中的 复杂0 码力 | 540 页 | 3.32 MB | 10 月前3
 前端开发者指南(2017)的时候,每个网页浏览器的 设置都霸道地控制了字体和样式。直到 1995 年,网景引入了 标签,才有机制 来控制单网页的字体显示,HTML 3.2 标准随即规范了这一行为。然而,使用者必须在电 脑上安装标签声明的字体或有降级字体, 例如浏览器默认的 sans-serif 或单空格字型, 会被替代使用。1996 年,第一个 CSS 规范发布,也提供了相同的功能。 1998 年, CSS2 规范发 service worker 的注册作用域。 可再次唤起 - 经由一些特性(比如推送通知),让再次唤起变得更简单。 可安装 - 用户可以无需借助 app store,而直接将他们觉得最有用的应用“保留”在屏 幕首页上。 可链接 - 可以通过 URL 进行分享,无需复杂的安装过程。 — 维基百科 渐进式 Web 应用 [阅读] 新手的渐进式 Web 应用指南 [阅读] 渐进式 Web 应用 Webpack, Rollup, 或者 SystemJS 而已。 学习模块加载和打包工具 83 关于包管理工具的学习 包管理工具或者包管理系统,是一些以一致的风格对计算机操作系统中的软件包进行自 动化安装、升级、配置以及删除的软件工具。它通常维护着一个关于软件依赖性和版本 信息的数据库,用以解决软件之间的配对和依赖问题。 — 维基百科 综合学习: Javascript 包管理工具的工作原理入门0 码力 | 164 页 | 6.43 MB | 1 年前3 前端开发者指南(2017)的时候,每个网页浏览器的 设置都霸道地控制了字体和样式。直到 1995 年,网景引入了 标签,才有机制 来控制单网页的字体显示,HTML 3.2 标准随即规范了这一行为。然而,使用者必须在电 脑上安装标签声明的字体或有降级字体, 例如浏览器默认的 sans-serif 或单空格字型, 会被替代使用。1996 年,第一个 CSS 规范发布,也提供了相同的功能。 1998 年, CSS2 规范发 service worker 的注册作用域。 可再次唤起 - 经由一些特性(比如推送通知),让再次唤起变得更简单。 可安装 - 用户可以无需借助 app store,而直接将他们觉得最有用的应用“保留”在屏 幕首页上。 可链接 - 可以通过 URL 进行分享,无需复杂的安装过程。 — 维基百科 渐进式 Web 应用 [阅读] 新手的渐进式 Web 应用指南 [阅读] 渐进式 Web 应用 Webpack, Rollup, 或者 SystemJS 而已。 学习模块加载和打包工具 83 关于包管理工具的学习 包管理工具或者包管理系统,是一些以一致的风格对计算机操作系统中的软件包进行自 动化安装、升级、配置以及删除的软件工具。它通常维护着一个关于软件依赖性和版本 信息的数据库,用以解决软件之间的配对和依赖问题。 — 维基百科 综合学习: Javascript 包管理工具的工作原理入门0 码力 | 164 页 | 6.43 MB | 1 年前3
 Hello 算法 1.0.0b1 JavaScript版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 12. 附录 178 12.1. 编程环境安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 12.2. 一起参与创作 . . 若时间允许,强烈建议对照着代码自己敲一遍。相比于读代码,写代码的过程往往能带来新的收获。 0. 写在前面 hello‑algo.com 5 Figure 0‑4. 运行代码示例 第一步:安装本地编程环境。参照附录教程,如果已有可直接跳过。 第二步:下载代码仓。如果已经安装 Git ,可以通过命令行来克隆代码仓。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以点击“Download ‧「暂存数据」用于保存算法运行中的各种 常量、变量、对象 等。 ‧「栈帧空间」用于保存调用函数的上下文数据。系统每次调用函数都会在栈的顶部创建一个栈帧,函数返 回时,栈帧空间会被释放。 ‧「指令空间」用于保存编译后的程序指令,在实际统计中一般忽略不计。 Figure 2‑9. 算法使用的相关空间 /* 类 */ class Node { 2. 复杂度分析 hello‑algo.com 28 val;0 码力 | 185 页 | 14.70 MB | 1 年前3 Hello 算法 1.0.0b1 JavaScript版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 12. 附录 178 12.1. 编程环境安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 12.2. 一起参与创作 . . 若时间允许,强烈建议对照着代码自己敲一遍。相比于读代码,写代码的过程往往能带来新的收获。 0. 写在前面 hello‑algo.com 5 Figure 0‑4. 运行代码示例 第一步:安装本地编程环境。参照附录教程,如果已有可直接跳过。 第二步:下载代码仓。如果已经安装 Git ,可以通过命令行来克隆代码仓。 git clone https://github.com/krahets/hello-algo.git 当然,你也可以点击“Download ‧「暂存数据」用于保存算法运行中的各种 常量、变量、对象 等。 ‧「栈帧空间」用于保存调用函数的上下文数据。系统每次调用函数都会在栈的顶部创建一个栈帧,函数返 回时,栈帧空间会被释放。 ‧「指令空间」用于保存编译后的程序指令,在实际统计中一般忽略不计。 Figure 2‑9. 算法使用的相关空间 /* 类 */ class Node { 2. 复杂度分析 hello‑algo.com 28 val;0 码力 | 185 页 | 14.70 MB | 1 年前3
 Web 开发技术-JavaScriptI/O(如网络、存储和图形),但可以由宿主环境(如浏览器)提供支持。 脚本语言(Scripting language) 是为了缩短传统的“编写、编译、链接、运行”(edit-compile-link-run)过程而创建的计算 机编程语言。 可直接用任何的文本编辑器开发完成。是一种不必事先编译,只要利用适当的解释器 (Interpreter)就可以执行的简单的解释式程序 JavaScript 功能、脚本语言 50 码力 | 21 页 | 1.02 MB | 1 年前3 Web 开发技术-JavaScriptI/O(如网络、存储和图形),但可以由宿主环境(如浏览器)提供支持。 脚本语言(Scripting language) 是为了缩短传统的“编写、编译、链接、运行”(edit-compile-link-run)过程而创建的计算 机编程语言。 可直接用任何的文本编辑器开发完成。是一种不必事先编译,只要利用适当的解释器 (Interpreter)就可以执行的简单的解释式程序 JavaScript 功能、脚本语言 50 码力 | 21 页 | 1.02 MB | 1 年前3
共 17 条
- 1
- 2













