Yii 2.0 从 1.1 版本升级指南:核心差异、重构要点与迁移实战
后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本篇升级指南以当前仓库GitHub 加速计划 / yi / yii2中的 docs/guide-uk/intro-upgrade-from-v1.md乌克兰语版与 英文原版 docs/guide/intro-upgrade-from-v1.md 内容一致为核心骨架系统梳理 Yii 从 1.1 全面重写为 2.0 后的所有重大差异。你将掌握命名空间与类体系的对应关系、对象配置与事件机制的迁移写法、模型/控制器/视图/组件层的重构要点以及 Active Record、URL 管理、资源包等模块的新旧对比。文中所有类名、方法名与默认行为均以当前仓库源码为佐证并标注了可深入阅读的源码路径与官方指南章节链接。提示如果你从未使用过 Yii 1.1可以安全跳过本指南直接阅读 开始安装 Yii。本指南只覆盖两代版本之间的差异摘要Yii 2.0 实际引入的新功能远不止于此强烈建议完整阅读整套权威指南——你过去需要自行开发的一些功能很可能已经成为框架核心的一部分。安装方式全面拥抱 ComposerYii 2.0 完全转向 ComposerPHP 事实上的包管理器。核心框架与所有扩展的安装、依赖解析与自动加载都通过 Composer 完成不再像 1.1 那样手动下载解压。安装步骤请参阅 安装 Yii如果你要为新框架编写扩展或将已有的 1.1 扩展适配为 2.0 兼容扩展请参阅 创建扩展 一节。从仓库根目录的 composer.json 可以看到当前仓库自身的依赖声明、PSR-4 自动加载配置autoload中yii\\前缀映射到framework/目录均遵循 Composer 生态标准这与你项目中使用composer require安装 Yii 的流程完全一致。PHP 版本要求从 5.2 到 5.4 以上的语言红利Yii 2.0 要求PHP 5.4 或更高版本作为对比1.1 要求 PHP 5.2。版本跃迁带来了一大批现代语言特性升级代码时需要在脑海中时刻保留以下清单PHP 新特性对 Yii 2.0 的意义命名空间Namespaces框架所有类都位于yii\*命名空间中匿名函数Anonymous Functions事件处理器、回调配置的常用写法短数组语法[...]取代 1.1 时代的array(...)写法短输出标签?视图中安全可用的输出写法PHP 5.4 起无需配置SPL 类与接口标准库的迭代器、异常体系支持后期静态绑定LSB支撑static::调用与Yii::createObject()的实例化机制日期时间类框架日期时间格式化基于DateTime系列Trait代码复用手段框架内部亦有使用intl 扩展Yii 2.0 的国际化i18n功能依赖该 PHP 扩展关于 intl 的依赖在源码中也有体现framework/i18n/目录下的Formatter、IntlFormatter等类均基于 PHP intl 扩展实现数字与日期格式化具体可参考 framework/i18n。命名空间去掉 C 前缀类名即目录结构Yii 2.0 最明显的变化是全面使用命名空间。几乎所有核心类都有命名空间例如yii\web\Request类名中的 C 前缀1.1 时代的CController、CWidget等被彻底移除。新的命名规范与目录结构一一对应yii\web\Request→ 类文件位于框架目录下的web/Request.phpyii\db\ActiveRecord→ 类文件位于db/ActiveRecord.phpyii\base\Component→ 类文件位于base/Component.php。得益于 Yii 的类加载器class loader你可以直接使用任意核心类而无需手动require对应文件。命名空间与目录的对应关系由自动加载规则保证这也是下一节“路径别名”能与命名空间联动的基础。Component 与 Object一个 CComponent 拆成两个基类1.1 中的CComponent在 2.0 中被拆分为两个类yii\base\BaseObject轻量级基类只提供基于 getter/setter 的对象属性property机制yii\base\Component继承自 BaseObject额外支持事件events与行为behaviors。选型建议如果类不需要事件和行为功能典型场景是纯数据结构类应直接继承BaseObject避免不必要的开销需要事件、行为或注入式扩展能力的类应用组件、控制器、模型等才继承Component。在源码中BaseObject实现了Configurable接口其构造函数BaseObject.php#L105-L111统一执行“应用配置数组 → 调用init()”两步Component则在此之上实现了on()/off()/trigger()与行为挂载逻辑Component.php#L534 起的on、off、trigger方法。对象配置统一的配置数组约定BaseObject为所有对象提供了一套统一的对象配置方式。任何继承自它的类如果重写构造函数都应遵循如下约定——最后一个参数必须是配置数组$config且构造函数末尾必须调用parent::__construct($config)class MyClass extends \yii\base\BaseObject { public function __construct($param1, $param2, $config []) { // ... 配置应用之前的初始化 parent::__construct($config); } public function init() { parent::init(); // ... 配置应用之后的初始化 } }其中init()方法用于在配置应用完成后再执行初始化逻辑例如校验属性组合、填充默认值。BaseObject构造函数内部通过Yii::configure($this, $config)将配置数组中的键值对逐一写入对应属性然后调用init()见 BaseObject.php#L105-L111。遵循此约定后就可以用配置数组创建并配置新对象$object Yii::createObject([ class MyClass, property1 abc, property2 cde, ], [$param1, $param2]);这里的Yii::createObject()实现见 framework/BaseYii.php#L348-L375内部委托给依赖注入容器static::$container-get()在解析class键后通过构造器注入其余参数并应用配置——这也是 Yii 2.0 中服务定位器与依赖注入容器能够无缝衔接对象配置的原因。更多细节见 配置Configurations 章节。事件从固定命名到任意事件名 通配符1.1 中事件通过声明形如onBeforeSave的专用方法实现2.0 中可以使用任意事件名并通过trigger()触发$event new \yii\base\Event; $component-trigger($eventName, $event);绑定处理器使用on()移除处理器使用off()$component-on($eventName, $handler); // 移除处理器 // $component-off($eventName, $handler);2.0 对事件功能做了大量增强详见 事件 章节处理器可以是匿名函数、对象方法、静态方法或全局函数on()支持第三个参数$data在处理器中通过$event-data访问附加数据事件名支持*通配符匹配源码见 Component.php#L534-L545 与trigger()中的通配符处理逻辑可以在配置数组中通过on 事件名 回调的键直接为组件绑定事件见 Component.php 类注释。路径别名必须带 前缀并与命名空间联动2.0 将路径别名的使用范围从文件/目录扩展到 URL并且强制要求别名以开头以便与普通文件路径或 URL 区分。例如别名yii指向 Yii 的安装目录。路径别名在框架核心代码中广泛被支持例如yii\caching\FileCache的cachePath属性既可以接收路径别名也可以接收普通目录路径。更多用法见 别名Aliases 章节。关键联动路径别名与类命名空间关系密切。建议为每个根命名空间定义一个路径别名这样 Yii 类加载器无需额外配置即可自动加载该类。例如yii指向 Yii 安装目录因此yii\web\Request可被自动加载若使用 Zend Framework 等第三方库可以定义别名Zend指向其安装目录之后 Yii 就能自动加载 Zend 中的任意类。视图$this 不再代表控制器渲染必须显式 echo2.0 视图最重大的变化是视图中特殊变量$this不再指向当前控制器或小部件而是指向一个新的view对象其类型为 yii\web\View代表 MVC 模式中的视图部分。若想在视图中访问控制器或小部件请使用$this-context。渲染局部视图的方法由renderPartial()改为render()且由于render()现在返回渲染结果而非直接输出调用时必须显式echoecho $this-render(_item, [item $item]);模板引擎方面PHP 依然是主要模板语言2.0 官方支持 Smarty 和 Twig 两种流行模板引擎Prado 模板引擎不再支持。使用 Smarty/Twig 需要在应用配置中为view组件设置renderers属性即 yii\base\View::$renderers。详见 模板引擎 章节。模型scenarios() 取代 unsafe 验证器CFormModel 被取消2.0 以 yii\base\Model 作为基础模型类对应 1.1 的CModelCFormModel类被彻底移除表单模型需要直接继承yii\base\Model。新增的scenarios()方法用于声明支持的场景并标记每个场景中哪些属性需要验证、哪些是安全的可批量赋值public function scenarios() { return [ backend [email, role], frontend [email, !role], ]; }上述示例声明了两个场景backendemail和role都是安全的可以被批量赋值frontendemail可以批量赋值role不可以!前缀标记为 unsafe两个场景中email与role都应通过rules()中的规则进行验证。rules()方法依然用于声明验证规则。注意由于scenarios()的出现unsafe验证器已不再支持。源码层面Model::scenarios()的默认实现会遍历所有验证器的on/except属性自动生成场景列表而safeAttributes()依据当前场景过滤出可批量赋值的属性见 Model.php#L201-L230 与 Model.php#L809。多数情况下如果rules()已经完整指定了所有场景且没有不安全属性需要声明就无需重写scenarios()。详见 模型 章节。控制器动作必须返回内容而非直接输出2.0 的基类控制器是 yii\web\Controller对应 1.1 的CController所有动作类的基类是 yii\base\Action。对你的代码最直接的影响是控制器动作应当返回要渲染的内容而不是直接echopublic function actionView($id) { $model \app\models\Post::findOne($id); if ($model) { return $this-render(view, [model $model]); } else { throw new \yii\web\NotFoundHttpException; } }同时注意路由命名约定的变化控制器与动作的驼峰命名会被转换为小写并用连字符分隔例如CamelCaseController对应的控制器 ID 为camel-case详见 控制器 ID 与 动作 ID。更多内容见 控制器 章节。小部件静态方法 begin() / end() / widget() 新语法2.0 以小部件基类 yii\base\Widget 替代 1.1 的CWidget。为了获得更好的 IDE 支持引入了一组新的静态方法调用语法use yii\widgets\Menu; use yii\widgets\ActiveForm; // 注意必须 echo 结果才能显示 echo Menu::widget([items $items]); // 传入数组来初始化对象属性 $form ActiveForm::begin([ options [class form-horizontal], fieldConfig [inputOptions [class input-xlarge]], ]); ... 表单字段 ... ActiveForm::end();widget()静态方法内部通过输出缓冲ob_start()捕获内容并返回渲染结果Widget.php#L138-L141begin()/end()则通过静态栈管理嵌套小部件的生命周期。详见 小部件Widgets 章节。主题路径映射机制取代 CThemeManager2.0 的主题机制完全改变基于路径映射将源视图文件路径映射到主题化视图文件路径。例如主题路径映射为[/web/views /web/themes/basic]时视图文件/web/views/site/index.php的主题化版本位于/web/themes/basic/site/index.php。正因如此主题可以作用于任何视图文件甚至包括在控制器或小部件上下文之外渲染的视图。同时不再有CThemeManager组件取而代之的是view应用组件上一个可配置的theme属性。详见 主题化Theming 章节。控制台应用控制器化 路由参数解析 自动帮助控制台应用现在与 Web 应用一样按控制器组织。控制台控制器需继承 yii\console\Controller对应 1.1 的CConsoleCommand。执行控制台命令的格式为yii 路由其中路由是控制器路由例如sitemap/index。额外的匿名参数会作为对应控制器动作方法的参数传入命名参数则按照yii\console\Controller::options()中的声明解析。仓库根目录提供了可执行的入口脚本 yii 与 yii.bat框架控制台应用代码位于 framework/console。2.0 还支持从注释块自动生成命令帮助信息。详见 控制台命令 章节。I18N内置格式化器移除改用 PHP intl 与 i18n 组件2.0 移除了内置的日期与数字格式化器改用 PECL intl PHP 模块即 PHP 的intl扩展。消息翻译改由i18n应用组件完成。该组件管理一组消息源message sources允许你根据消息类别使用不同的消息来源。相关实现位于 framework/i18n包含I18N、MessageSource、Formatter等类。详见 国际化Internationalization 章节。动作过滤器用行为实现继承 ActionFilter动作过滤器现在通过**行为behaviors**机制实现。自定义过滤器需继承 yii\base\ActionFilter使用过滤器时将它作为行为附加到控制器上。例如使用 yii\filters\AccessControl 过滤器public function behaviors() { return [ access [ class yii\filters\AccessControl, rules [ [allow true, actions [admin], roles []], ], ], ]; }上述规则的含义是仅允许已认证用户roles []访问admin动作。详见 过滤器Filters 章节。资源AssetBundle 取代脚本包script packages2.0 引入了新概念资源包asset bundle取代 1.1 的脚本包script package机制。资源包是某个目录下资源文件JavaScript、CSS、图片等的集合每个资源包由一个继承 yii\web\AssetBundle 的类表示例如namespace app\assets; use yii\web\AssetBundle; class AppAsset extends AssetBundle { public $sourcePath app/assets; // 或使用 $basePath/$baseUrl 指定已发布资源 public $css [css/site.css]; public $js [js/app.js]; public $depends [yii\web\YiiAsset]; }通过AssetBundle::register()AssetBundle.php#L128-L134注册资源包即可让其中资源通过 Web 访问。与 1.1 不同注册资源包的页面会自动包含该包声明的 JavaScript 与 CSS 文件引用无需手工输出script/link标签。类中sourcePath、basePath、baseUrl、css、js、depends等属性的语义见 AssetBundle.php 的属性声明。详见 资源管理Managing Assets 章节。辅助类一批常用静态类开箱即用2.0 内置了大量常用的静态辅助类包括但不限于yii\helpers\Htmlyii\helpers\ArrayHelperyii\helpers\StringHelperyii\helpers\FileHelperyii\helpers\Json这些类的源码全部位于 framework/helpers 目录。详见 辅助类概述 章节。表单ActiveField 字段概念让表单构建更简洁2.0 通过 yii\widgets\ActiveForm 引入字段field概念。字段是包含标签、输入框、错误消息和/或提示文本的容器由 yii\widgets\ActiveField 对象表示。使用字段可以比 1.1 更简洁地构建表单?php $form yii\widgets\ActiveForm::begin(); ? ? $form-field($model, username) ? ? $form-field($model, password)-passwordInput() ? div classform-group ? Html::submitButton(Login) ? /div ?php yii\widgets\ActiveForm::end(); ?一行$form-field()即可生成标签、输入控件与错误提示的完整组合并支持链式调用passwordInput()等方法改变输入类型。详见 创建表单 章节。查询构造器CDbCommand/CDbCriteria 合并为 Query 对象1.1 中查询构建逻辑分散在CDbCommand、CDbCriteria、CDbCommandBuilder等多个类中。2.0 将数据库查询统一表示为 yii\db\Query 对象在幕后借助 yii\db\QueryBuilder 转换为 SQL$query new \yii\db\Query(); $query-select(id, name) -from(user) -limit(10); $command $query-createCommand(); $sql $command-sql; $rows $command-queryAll();这些查询构建方法同样可用于 Active Record 场景ActiveQuery 继承自 Query。详见 查询构造器 章节。Active RecordActiveQuery 取代 CDbCriteria关系用 getter 声明2.0 对 Active Record 做了大量改动最明显的两点是查询构建与关系查询。查询构建find() 返回 ActiveQuery1.1 的CDbCriteria被 yii\db\ActiveQuery 取代后者继承自yii\db\Query因而继承了全部查询构建方法。调用 yii\db\ActiveRecord::find() 开始构建查询该方法通过Yii::createObject(ActiveQuery::className(), [get_called_class()])创建查询对象// 获取所有 *active* 状态的客户并按 ID 排序 $customers Customer::find() -where([status $active]) -orderBy(id) -all();关系声明getter 方法即关系名声明关系只需定义一个返回ActiveQuery对象的 getter 方法getter 对应的属性名即为关系名。例如声明orders关系1.1 时代必须在集中的relations()中声明class Customer extends \yii\db\ActiveRecord { public function getOrders() { return $this-hasMany(Order, [customer_id id]); } }现在可以用$customer-orders访问客户的所有订单也可以“即时”附加查询条件$orders $customer-getOrders()-andWhere(status1)-all();预加载两次查询取代 JOIN2.0 的预加载eager loading实现方式与 1.1 不同1.1 用一条 JOIN 查询同时选取主表与关联表数据2.0 则执行两条不带 JOIN 的 SQL——第一条返回主表记录第二条以主表主键为过滤条件返回关联表记录。该行为可避免大数据量 JOIN 带来的重复列与开销。大数据量asArray() 返回数组当需要返回大量记录时可在查询链上调用ActiveQuery::asArray()ActiveQuery.php使查询结果以纯数组形式返回而非 AR 对象能显著降低 CPU 与内存开销$customers Customer::find()-asArray()-all();默认属性init() 中设置而非 public 属性另一个变化是不能再通过 public 属性定义属性默认值。如有需要请在记录类的init()方法中设置public function init() { parent::init(); $this-status self::STATUS_NEW; }1.1 中重写 ActiveRecord 构造函数存在一些已知问题2.0 中已解决。注意为构造函数添加参数时可能需要重写ActiveRecord::instantiate()如果参数带默认值如null则通常无需重写。Active Record 还有大量其他改动与增强详见 Active Record 章节。Active Record 行为直接继承 Behavior用 events() 绑定2.0 移除了CActiveRecordBehavior基类。创建 Active Record 行为需直接继承yii\base\Behavior若行为需要响应 owner 的某些事件需重写events()方法namespace app\components; use yii\db\ActiveRecord; use yii\base\Behavior; class MyBehavior extends Behavior { // ... public function events() { return [ ActiveRecord::EVENT_BEFORE_VALIDATE beforeValidate, ]; } public function beforeValidate($event) { // ... } }用户与 IdentityInterfaceCWebUser/CUserIdentity 退出历史舞台1.1 的CWebUser被 yii\web\User 取代CUserIdentity类也不复存在。取而代之的是实现 yii\web\IdentityInterface 接口——该接口只需实现findIdentity()、getId()、getAuthKey()、validateAuthKey()等少量方法使用起来更加直接高级项目模板Advanced Project Template提供了现成的实现示例。详见 认证Authentication、授权Authorization 章节。URL 管理支持可选参数一个规则顶两条2.0 的 URL 管理与 1.1 类似主要增强是支持可选参数。例如下面的规则可以同时匹配post/popular与post/1/popular——在 1.1 中你需要两条规则才能达到同样效果[ pattern post/page:\d/tag, route post/index, defaults [page 1], ]当page缺省时自动使用defaults中的值1。详见 URL 管理器文档。新旧版本共存Yii 1.1 与 2.x 一起使用如果你有希望与 Yii 2.0 共存的旧 Yii 1.1 代码例如迁移过渡期同时运行两套框架请参阅 使用 Yii 1.1 与 2.0 协同工作英文原版章节与中文指南中的 集成 Yii 1.1 与 2.0 相关内容其中说明了如何在同一应用中加载两代框架并共享会话等状态。迁移清单速查将以上要点整理为一份可直接对照的检查清单维度Yii 1.1Yii 2.0安装手动下载ComposerPHP5.25.4intl 扩展类命名C前缀命名空间 目录结构基类CComponentBaseObject/Component对象配置分散统一配置数组 init()事件on方法trigger()/on()/off()视图$this控制器/小部件View对象$this-context局部视图renderPartial()$this-render()echo模型CModel/CFormModelyii\base\Modelscenarios()控制器CControlleryii\web\Controller动作返回结果小部件CWidgetyii\base\Widget静态方法主题CThemeManagerview组件theme属性 路径映射控制台CConsoleCommandyii\console\Controller过滤器专用机制ActionFilter行为资源脚本包AssetBundle表单手写字段ActiveFormActiveField查询CDbCommand/CDbCriteriayii\db\QueryQueryBuilderAR 关系relations()getter 返回ActiveQueryAR 预加载JOIN 查询两条独立 SQL用户CWebUser/CUserIdentityyii\web\UserIdentityInterfaceURL 规则不支持可选参数defaults可选参数深入阅读英文权威指南Upgrading from Version 1.1本文的英文母本乌克兰语版Оновлення із версії 1.1框架核心源码framework/base/BaseObject.php、framework/base/Component.php、framework/db/ActiveRecord.php相关主题章节配置、事件、Active Record、控制器、模板引擎赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Yii 2.0 从 1.1 升级完全指南Yii 2 框架核心差异、重构要点与迁移实战Yii 2.0 从 1.1 升级完全指南Yii 2 框架核心差异、重构要点与迁移实战 Yii 框架为 2.0 版本进行了彻底重写因此 1.1 与 2.0 之后端Web框架Yii 2.0 升级指南从 1.1 迁移到 Yii 2 的核心差异与实践要点Yii 2.0 升级指南从 1.1 迁移到 Yii 2 的核心差异与实践要点 本文以 docs/guide id/intro upgrade from v1.后端Web框架Yii 2 升级完全指南从 1.1 迁移到 2.0 的核心差异与实战要点Yii 2 升级完全指南从 1.1 迁移到 2.0 的核心差异与实战要点 Yii 2.0 是一次对框架的完全重写它与 1.1 之间的差异远大于普通的小版本升后端Web框架创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

118、构建可扩展的Agent基础架构

118、构建可扩展的Agent基础架构

118、构建可扩展的Agent基础架构 那天晚上十一点,线上的Agent实例突然开始集体超时,日志里刷满了TooManyRequests,但我们的API配额明明还有余量。查了一整夜,最后发现根因不在模型服务,也不在业务代码,而在我们引以为傲的“灵活”的Agent调度层——每个请求进来都会动态…

2026/9/23 22:20:25 阅读更多 →
旅游景点情感分析:细粒度属性级建模与BERT微调实践

旅游景点情感分析:细粒度属性级建模与BERT微调实践

简介:本资源是一套面向计算机专业本科生的毕业设计实战项目,聚焦旅游景点评论的细粒度情感分析任务,适用于Python Web开发、自然语言处理与数据库应用等课程实践或毕设选题参考。项目基于Django框架构建Web系统,集成RNCC情感分析模…

2026/9/23 22:20:25 阅读更多 →
117 Kubernetes部署Agent服务

117 Kubernetes部署Agent服务

117 Kubernetes部署Agent服务 那晚的告警到现在还记得,新上线的采集Agent在测试集群里一会儿Running一会儿CrashLoopBackOff,kubectl logs抓出来就一行“Failed to create Kubernetes client: can’t create rest client: dial tcp: lookup kube-apiserver on 10.96.0.10:53…

2026/9/23 22:20:25 阅读更多 →

最新新闻

信号分析与处理实验全链路:从采样到滤波器设计的MATLAB实现

信号分析与处理实验全链路:从采样到滤波器设计的MATLAB实现

简介:这份资源是南京邮电大学「信号分析与处理实验」课程的完整实验报告,面向正在修读数字信号处理、信号与系统相关课程的高校学生,以及需要借助 MATLAB 完成实验与课程设计的自学者。报告覆盖信号的产生和运算、连续时间信号的频域分析、信…

2026/9/23 23:38:58 阅读更多 →
三款智能颈椎与腰部牵引理疗仪硬件横评:仿生揉捏与气压热敷实测

三款智能颈椎与腰部牵引理疗仪硬件横评:仿生揉捏与气压热敷实测

三款智能颈椎与腰部牵引理疗仪硬件横评:仿生揉捏与气压热敷实测秋分过后气温骤降,长期坐在电脑前写代码的开发者与上了年纪的长辈,最容易遭遇颈椎僵硬、肩背酸痛与腰椎间盘劳损的集中爆发: 老爸年轻时当老师落下了颈椎病&#xff…

2026/9/23 23:38:58 阅读更多 →
南山一经深度拆解:从异兽到祭祀,读懂山海经的博物志密码

南山一经深度拆解:从异兽到祭祀,读懂山海经的博物志密码

1. 为什么我要逐字啃完南山一经《山海经》第一卷南山经里的南山一经,全文不过几百字,却藏着四十多座山、十几种异兽、一堆矿产和祭祀规矩。很多人翻《山海经》都是跳着看,专挑九尾狐、凤凰这些网红神兽,但真正想把这本书读透的人&…

2026/9/23 23:38:58 阅读更多 →
大模型并不是真正的记忆:从神经元突触重塑看权重的冷热之分

大模型并不是真正的记忆:从神经元突触重塑看权重的冷热之分

大模型并不是真正的记忆:从神经元突触重塑看权重的冷热之分昨天老妈在厨房里找东西时,发生了一幕全家人都极其熟悉的生活小插曲:老妈站在调料架前,拍了拍脑门:"哎呀!我刚才明明记得把新买的白胡椒粉放…

2026/9/23 23:38:58 阅读更多 →
长辈友好型节气动态插画工程:纯 SVG 矢量绘制与轻量 CSS 路径动画

长辈友好型节气动态插画工程:纯 SVG 矢量绘制与轻量 CSS 路径动画

长辈友好型节气动态插画工程:纯 SVG 矢量绘制与轻量 CSS 路径动画在很多针对长辈的节气提醒与家庭生活看板中,工程师为了展示节气氛围,常常直接在页面中嵌入体积庞大的 GIF 动图或 MP4 短视频。 但在家庭低功耗平板、电子相框或老式电视盒子上…

2026/9/23 23:38:58 阅读更多 →
OK交易所Python API封装实战:现货、杠杆与历史数据调用指南

OK交易所Python API封装实战:现货、杠杆与历史数据调用指南

简介:这份Python资源包围绕OKEx交易所Web API的调用展开,面向希望用代码接入加密货币市场的开发者与量化交易初学者。内容覆盖杠杆交易、现货交易、历史记录与历史数据获取等核心场景,并涉及MVC架构下的应用组织方式,适合具备Pyth…

2026/9/23 23:37:58 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →