起因

前些日子听到运营反馈:从管理后台生成的内容因没有妥善保存,造成丢失,事后查找起来麻烦。所以这里需要制作表单功能,提交生成的内容以及相关信息。并在前台以列表形式展示出来,类似于网站留言板功能。

先前按照视频学习过 Laravel ,这次将通过实战,重新复习部分内容,并记录下来。相关开发环境和新项目手脚架,可以在 初尝 Laravel 5.8 文中找到,这里不再累述。

创建数据库迁移文件

应充分考虑数据表结构,简单来说要保存有用字段。从前端界面来说,有:

  • 链接名称;
  • 链接实体,包含原链接、短链接、重定向链接三种;
  • 链接的类型,依用途区分不同类型;
  • 链接打开后的页面,这里简单地用 id 表示;

用表格表示所有数据库字段:

字段名字段类型描述
idint自增 ID
titlestring链接名称
typestring链接类型
short_urlstring经过短链接处理后的链接
page_idstring打开后的页面 id
long_urltextURL 可能会很长,使用 text 字段类型
redirect_urltext同 long_url

定义该数据表名称为 links ,并创建对应的 Model 和 数据库迁移文件

php artisan make:model Link -m

// created file in
// app/Link.php
// database/migrations/2020_04_12_131409_create_links_table.php

接下来将上面填写好的表格,以配置的形式写入迁移文件中,Artisan 助手已为我们补全了 idtimestamps 基础字段:

// database/migrations/2020_04_12_131409_create_links_table.php

class CreateLinksTable extends Migration
{
    public function up()
    {
        Schema::create('links', function (Blueprint $table) {
            $table->bigIncrements('id');
            // add table field start
            $table->string('title');
            $table->string('type');
            $table->string('short_url');
            $table->string('page_id');
            $table->TEXT('long_url');
            $table->TEXT('redirect_url');
            // add table field end
            $table->timestamps();
        });
    }

   public function down()
    {
        Schema::dropIfExists('links');
    }
}

定义完数据表结构和字段类型后,无需在数据库中手动创建这张表,将工作交给 artisan 助手来实现。

使用 php artisan migrate 即可将迁移文件应用到数据库中,它会在数据库中创建 links 数据表。

Migrating: 2020_04_12_131409_create_links_table
Migrated:  2020_04_12_131409_create_links_table (0.02 seconds)

数据库交互模型

经典 MVC 模型中使用 Model 层处理数据库读写,Laravel 提供了名叫 Eloquent ORM 的功能,使得我们在代码中可以简洁高效地操作数据库。

在先前创建迁移文件时,Links Model 已经存在,中指定空的 guarded 属性,表示无黑名单,任何数据经过这里都会被保留下来,进入数据库操作:

// app/Link.php

class Link extends Model
{
    protected $guarded = [];
}

就算使用无黑名单的配置,我们还是要在接口请求时做表单验证,确保数据准确性。

定义 Web API 接口

Web API 接口用于对接前端,也可简单地将所有字段映射为接口内容,当参数和关联字段过多时,会显得十分臃肿。

Laraval 框架路由默认在 routes 文件夹中, routes/api.php 定义非模板渲染的页面请求,在此定义一个 POST 请求,将它指向 LinkController 控制器里的 store 方法;

同时定义请求路径上的必填参数 linkType,用于区分数据中的链接类型

Route::post('link/{linkType}', 'LinkController@store');

最后框架将此路由解析为路径 //my.domain.name/api/link/deeplink

表单验证

继续创建路由中定义的 LinkController ,它会处理请求中的内容:

php artisan make:controller LinkController

Requests 类可以非常方便地助我们验证请求中的表单字段,所以创建名为 StoreLink 的类:

php artisan make:request StoreLink

接下来可以真正地开始编写逻辑代码,在 LinkController 中定义 store 函数:

use App\Http\Requests\StoreLink;
use App\Link;
use Illuminate\Http\Request;

class LinkController extends Controller
{

    public function store(StoreLink $request)
    {
        $data = $this->validate(request(), $request -> rules());
        $link = Link::create($data);
    }

}
注意 store 函数的参数 StoreLink $request ,并不需要给 store 传递任何参数,只需要知名方法参数类型,框架会自动查找相关依赖自动注入。

别忘了我们还有 StoreLink ,只需要指定字段类型和期望值,它可以帮我们验证表单字段:

class StoreLink extends FormRequest
{
    public function rules()
    {
        return [
            'page_id'      => 'required',
            'title'        => 'required',
            'type'         => 'required',
            'long_url'     => 'required',
            'short_url'    => 'string|nullable',
            'redirect_url' => 'string|nullable',
        ];
    }
}

还记得 Web API 定义的 link/{linkType} 请求路径吗?这里的链接类型是附属在路径名称中的,这样做的好处是减少一些请求字段。

由于 type 字段是依附在请求路径中的,表单验证只会获取请求实体的内容,由于缺少type 字段,则会出现校检错误的提示:

{
    "message": "The given data was invalid.",
    "errors": {
        "type": [
            "The type field is required."
        ]
    }
}

必须先把请求路径中的 linkType 取出并赋值到 $request 实体中的 type 字段,才能通过 FormRequest 的验证:

class StoreLink extends FormRequest
{
    public function prepareForValidation()
    {
        $this -> merge(['type' => $this -> linkType]);
    }
}

测试接口

使用 Postman 发出模拟 POST 请求,什么都不发送,提示表单验证不通过

{
    "message": "The given data was invalid.",
    "errors": {
        "page_id": [
            "The page id field is required."
        ],
        "title": [
            "The title field is required."
        ],
        "long_url": [
            "The long url field is required."
        ]
    }
}

但是某些值虽然通过校检,但是因为数据库设计错误,导致报错

"short_url": "",
'short_url'    => 'string|nullable',
SQLSTATE[23000]: Integrity constraint violation: 

1048 Column 'short_url' cannot be null 

(SQL: insert into `links` (`page_id`, `title`, `type`, `long_url`, `short_url`, `redirect_url`, `updated_at`, `created_at`) values (1, 测试, openpage, 1, ?, 重定向链接, 2020-05-16 20:03:06, 2020-05-16 20:03:06))

改进数据库

因为初期设计数据表时,没有考虑到 short_url 可能为空值,导致插入数据失败。

那么现在来修改数据表,Laravel 不建议我们直接操作数据库,像创建数据表一样,创建迁移文件

artisan make:migration modify_links_table

在里头重新声明我们要修改的数据表字段类型和附加值

Schema::table('links', function (Blueprint $table) {

    $table->TEXT('long_url')->nullable()->change();
    $table->string('short_url')->nullable()->change();
    $table->TEXT('redirect_url')->nullable()->change();
    
});

使用 php artisan migrate 应用到数据库中,现在 short_url 字段为空时,也能保存到数据表。

+----+-------+----------+----------+-----------+--------------+---------+---------------------+---------------------+
| id | title | type     | long_url | short_url | redirect_url | page_id | created_at          | updated_at          |
+----+-------+----------+----------+-----------+--------------+---------+---------------------+---------------------+
|  1 | 测试  | openpage | 1        | NULL      | 重定向链接   | 1       | 2020-05-16 20:33:47 | 2020-05-16 20:33:47 |
+----+-------+----------+----------+-----------+--------------+---------+---------------------+---------------------+
1 row in set (0.02 sec)

获取所有数据

除了把数据记录起来,还得有个展示的功能。

提供路由

Route::get('link/{linkType}', 'LinkController@index');

在控制器中可查询数据表内容,并按照时间倒序排列

public function index($linkType = '')
{
    $lists = DB::table('links')
        ->where('type', '=', $linkType)
        ->orderBy('created_at', 'desc')
        ->paginate(100);

    return $lists;
}

以 JSON 的形式输出

{
    "current_page": 1,
    "data": [
        {
            "id": 1,
            "title": "测试",
            "type": "openpage",
            "long_url": "1",
            "short_url": null,
            "redirect_url": "重定向链接",
            "page_id": "1",
            "created_at": "2020-05-16 20:33:47",
            "updated_at": "2020-05-16 20:33:47"
        }
    ],
    "first_page_url": "http://api.misaka.im/api/link/openpage?page=1",
    "from": 1,
    "last_page": 1,
    "last_page_url": "http://api.misaka.im/api/link/openpage?page=1",
    "next_page_url": null,
    "path": "http://api.misaka.im/api/link/openpage",
    "per_page": 100,
    "prev_page_url": null,
    "to": 1,
    "total": 1
}

总结

在岗位上只做自身技术范围的事情,显得太被动。在 Web 应用开发的过程中,前后端技术紧密关联。

制定开发方案前,需要充分了解用户需求,在有限的时间内选择最优的解决方案。

本文适用于 :

  1. 新系统中 Web 开发环境丢失的情况
  2. 更新开发环境中的 PHP/Mysql 版本

恢复开发环境

自发布篇文章大半年后,又因为手贱弄坏了 Windows 系统。现在重写这个章节,修改疏漏的地方。

PHP/Mysql

首先 phpstudy 是已存在硬盘上,管理员权限打开,以系统服务的模式运行。

php-cgi.exe 提示缺少 VCRUNTIME140.dll

mysqld.exe 提示缺少 MSVCR120.dll

使用 3DM GAME 游戏运行库把所有 Microsoft Visual C++ 和 Microsoft .NET Framework 安装一遍。

windows 10 也会提示你需要安装以下 Windows 功能:.NET Framework 3.5 ,选择下载安装,完成后无需重启,也能使用。

命令行环境

不清楚 phpstudy 是怎么处理切换版本后动态切换环境变量的,长期使用一个版本的 PHP 话可以设置成环境变量 E:\phpStudy\php\php-7.2.21-nts

>php -v
PHP 7.2.21 (cli) (built: Jul 30 2019 13:09:38) ( NTS MSVC15 (Visual C++ 2017) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

临时解决方式是打开 phpstudy - cmd 命令行,这里可以执行 php 命令,切换到项目下使用。

Composer

使用Composer-Setup.exe 重新安装一遍 Composer 到 PHP 目录

在项目下设置好 composer 的加速镜像

cd E:\phpStudy\WWW\laravel-simple

composer config repo.packagist composer https://mirrors.aliyun.com/composer/
#composer config --unset repos.packagist

composer update

新配置

PHP

从官网下载 windows 版本的 PHP ,目前是 PHP 7.2.21

解压到 phpStudy\php 目录下,复制一份 php.ini-development 作为 php.ini

打开 php.ini ,取消 On windows 下面的 extension_dir 的注释

; Directory in which the loadable extensions (modules) reside.
; http://php.net/extension-dir
;extension_dir = "./"
; On windows:
extension_dir = "ext"

并搜索 extension= 开启一些常用的扩展

PHP 7.3.8 存在向下不兼容的问题:

composer 里的 swith 语句瞬间爆炸,使用 composer self-update 来解决。

保险起见选择了 7.2

Composer

这个家伙简直就像 npm 一样难缠

这里下载一个 PEM 证书,免得使用 composer 时候会出现安全报错的问题

The openssl extension is required for SSL/TLS protection but is not available. 
If you can not enable the openssl exension, you can disable this error,
at your own risk, by setting the 'disable-tls' option to true.

开启 openssl 并指定证书的绝对地址

composer config -g -- disable-tls true
extension=openssl
[openssl]
; The location of a Certificate Authority (CA) file on the local filesystem
; to use when verifying the identity of SSL/TLS peers. Most users should
; not specify a value for this directive as PHP will attempt to use the
; OS-managed cert stores in its absence. If specified, this value may still
; be overridden on a per-stream basis via the "cafile" SSL stream context
; option.
openssl.cafile=E:\phpStudy\php\php-7.2.21-nts\cacert.pem

self-update 出现证书验证失败的问题,干脆自己来升级好了

  [RuntimeException]
  SHA384 is not supported by your openssl extension, could not verify the phar file integrity

根据文档描述粘贴几行代码就安装好最新的 composer,要什么 self-update !

MySQL

开启 PHP 模块:

extension=pdo_firebird
extension=pdo_mysql

连接数据库时报错:

ERROR 1146 (42S02): Table 'performance_schema.session_variables' doesn't exist
参考 Windows 下更新 MySQL 至 5.7.22 中再配置环境变量

修改 mysql ini ,添加下面几行得以连接数据库。

#cannot select database
show_compatibility_56 = ON
performance_schema

这里没有做重新安装的流程,先备份数据再可以重做配置。

参考

PHP

https://www.php.net/manual/en/migration73.incompatible.php

https://stackoverflow.com/questions/54184707/warning-continue-targeting-switch-is-equivalent-to-break-did-you-mean-to-u

https://www.jianshu.com/p/dea53f940169

https://curl.haxx.se/docs/caextract.html

composer

https://getcomposer.org/download/

https://laravelacademy.org/post/19806.html

https://developer.aliyun.com/composer

https://www.jianshu.com/p/181719a291ae

MySQL

https://blog.csdn.net/qq1069006993/article/details/77814816

https://stackoverflow.com/questions/31967527/table-performance-schema-session-variables-doesnt-exist

https://www.cnblogs.com/Bccd/p/5987426.html

若干年后又从咸鱼淘来了一个 Newifi mini ,价格已经掉到了 40 多块钱

收回来后发现卖家已经刷入了 Breed 和 Padavan,但是版本比较旧,重新找到新编译版本刷入。

准备工作

下载 Bootloader

Newifi mini 使用 联发科的 MT7620A 主控方案,主频为580MHz。是16年主流的路由器使用的主控

AR/QCA/MTK Breed,功能强大的多线程 Bootloader

file namemark
RT-AC54U_GPIO_11_newifimini_128M联想Y1(newifi mini),复位键GPIO#11,16M闪存,128M内存,2.4/5GWi-Fi,USB

https://breed.hackpascal.net/ 找到对应的固件 breed-mt7620-lenovo-y1.bin

下载 Padavan

基于 OpenWrt 改进而来,原来 Padavan 是 ASUS 华硕 RT-N56U 定制的路由固件。后来国人改进可用于 MT7620A/N 等主控的路由。

Padavan 固件下载地址

RT-AC54U-GPIO-11-newifimini-128M_3.4.3.9-099.trx

刷机

刷入 Bootloader

如果 Bootloader 控制台出现 「文件未找到」 的错误,建议用IE 浏览器进行访问

image

  1. 网线连入 WAN 口,另一端连接电脑;
  2. 长按 RESET 键,插入 POWER 电源,5秒后松开 RESET 键;
  3. 电源指示灯两短交替闪烁,表示进入恢复模式
    image
  4. 进入网络连接查看以太网对应的 IP 段,默认网关和DHCP 服务器指示了主机地址
    image
  5. 浏览器键入主机地址 192.168.1.1 ,进入 Breed Web 恢复控制台
    image
  6. 进入固件更新 - 勾选 Bootloader - 选择预先下载好的 breed-mt7620-lenovo-y1.bin,最后提示操作。待回到主页后,断电重新进入恢复模式,显示了新固件信息
    image

刷入 Padavan

如果不想保留先前固件的配置,可以在 恢复出厂设置,选择原厂,清除掉固件配置。
  1. 进入 Breed Web 恢复控制台 - 固件更新 - 勾选固件 - 选择预先下载好的固件 RT-AC54U-GPIO-11-newifimini-128M_3.4.3.9-099.trx
    image
  2. 等待提示 “更新完成” 后,断电。
  3. 重新插入电源,等待设备正常启动。查得设备 IP 为 192.168.2.1
  4. 浏览器键入键入主机地址 192.168.2.1 ,见固件版本 3.4.3.9
    image

总结

Padavan 比传统路由固件有更加丰富的功能,犹如一台 ARM 架构的电脑。

充分发挥了 MT7620 主控的性能,不再止步于原厂固件弱鸡的设计,带来更多 DIY 的可能性,如 VPN 客户端、Web 服务器 甚至 NAS 主机。

2019 眨眼即逝,是平淡也是矛盾的一年。渴望技术进步的同时,公司的创新氛围却十分低迷;渴望拥有伴侣的同时,却疲于深入的沟通;生活过得懒散的同时,却感叹时间匆匆。

随着年龄的增长,对面的问题愈多,考虑的方向也愈多。肩上的担子也愈重。“成家立业” 一词在 90后身上有了新的理解。

生活节奏无限加快,网上的瓜永远吃不完;形形色色的行为冲击每个人的身心;除了“梗”和“热词”,还有哪些是喜闻乐见的呢?浮躁的心态或多或少地出现在当代人的生活中。

想要沉下心来读一本书,成了年轻人拼搏在人生路上的一种奢侈。

在有限的时间内,多去尝试理解形形色色的各种行为,多去经历一些,反而是件好事。

工作

花了很多时间在做公司基础建设,让我从技术岗转移了注意力,从技术实现到需求产生。

除了编码,我们应该跳出自身的岗位,了解问题产生是如何产生的。从而改善我们对编码的理解。

通过若干项目的提炼,从需求到提出方案,落地到验收,这些环节都至关重要:

  1. 与运营小组沟通,分析需求产生的原因;
  2. 收集实际需求,列出系统功能点;
  3. 制定可行性方案,及其优缺点,扩展性;
  4. 根据工期与人力成本,选取方案,规划开发时间表;
  5. 分派给开发者开发系统功能,及时跟进开发进度;
  6. 开发系统功能的同时,编写系统接口文档,对接文档;
  7. 测试人员根据方案验收最终项目功能;
  8. 交付产品组

需求出现

往往运营小组需制定出激进的手段来完成当月的任务,使他们过少关注业务流程的问题,从而产生大堆逻辑问题。

提早介入

技术人员提早接入,提出可行性方案,有助于运营小组改善原有的业务流程,修补当前推广活动的业务漏洞。

制定时间表

远见也是解决问题的利器。

项目管理人员善于编排开发流程,在人手紧缺的时候,开发者也需谨记时间节点,完成对接任务,以免因功能缺失造成更多的成本开销。

编写文档

文档便是项目流程下的产物,应以图文、流程图等方式呈现。简要说明项目是如何产生、落地和运行的。

不同岗位应从不同角度编写文档

职位工作
产品/项目经理项目文档、页面交互原型图、业务流程图
系统架构师系统框架图、外部接口实现文档、最小系统 Demo
系统工程师程序代码注释、执行流程图
测试工程师测试案例、项目验收文档

同时文档能降低系统故障和人员流动带来的损失。以下是我在工作中产出的一些文档:

H5 支付解决方案

APP 中 Webview 调起支付解决方案

H5 支付前端对接文档

编程

项目实战

Duel-living

按照 《实战 ES2015》 第五章 案例进行实战。

通过学习 koa2 作为后端开发框架,结合 WebSocketP2P 技术开发文字直播产品,部署在 LeanCloud 云服务上。

Laravel-simple

初尝 Laravel 5.8

作为前端开发者,同时因为公司使用 Laravel 作为技术栈,使用这个契机,体验了一把后端开发。

阅读

书籍封面
《实战 ES2015:深入现代JavaScript 应用开发》第五章 title=
《学习 Javascript 数据结构与算法(第二版)》 title=
《产品逻辑之美:打造复杂的产品系统》 title=
《Docker技术入门与实战(第二版)》 title=

考试

  • 参加 《2019年下半年计算机技术与软件专业技术资格考试》 程序员资格(初级)

报名的时候没想什么,发现这些软工的证书是本科院校自带的,软工高级证有些用处。下回考虑报 《全国计算机等级考试》

兴趣

电脑 DIY

从大学到现在,经手组装了不下二十台电脑。装机过程是拍几张照片,没有完整地记录下来,今年意识到应该将细节总结起来。从需求分析配件挑选开箱装机等几个方面记录电脑 DIY 的步骤。

电影

科幻片超级英雄二次元动作片其他
流浪地球雷霆沙赞!命运之夜 天之杯II 迷失之蝶速度与激情:特别行动大侦探皮卡丘
大黄蜂天气之子终结者:黑暗命运最好的我们
复仇者联盟4:终局之战 哪吒之魔童降世
蜘蛛侠:英雄远征 决战中途岛
廉政风云

运动

达成超过 100天慢跑 3公里。

作为程序员在经常久坐,时间一长腿脚都不利索。坚持慢跑后有较好的精神面貌,解题时思路也清晰许多。

感情

很高兴认识你,这段时间我过得很充实;正如我们一起看的《最好的我们》,你准备好了,但我没有。想要从喜欢到爱一个人,付出的远不止一点。

让我认识到,自身有哪些不足,需往哪个方向努力;如何跟异性相处,怎么做到关心对方。

理想很丰满,现实很骨感。漫漫长路还需独自前行。愿大家都能有一颗钢铁的心。

19 Todo List

  • 存钱 ?W
  • 阅读 2 本技术书籍
  • 每月一篇博文
  • 通过一阶段专升本考试
  • 更新旧项目(如果有时间)果然没有
  • 增重到 110斤 撑死 100斤,并没有达到QAQ

2020 Todo List

  • 100天慢跑
  • 每月博文
  • 读完 5本书
  • 增重到 110斤
  • 参与一次计算机等级考试
  • 规划一次国内旅行
  • 探索学习测试、后端技术

农民翻身把歌唱

3rd_gen_amd_ryzen_available_july_7

AMD 的锐龙处理经历了两代的更新,于今年 7月7日正式发布了 第三代锐龙处理器,率先到来的是 R7 3700X、R7 3800X、R7 3900X 三款高端型号。紧跟着是 R5 3600X 和 R5 3600。

自速龙战胜酷睿家族之后,AMD 在家用市场再也没有战胜过 Intel 。十年过去了,终于咸鱼翻身,以较低的价格和卓越的性能一举超越超越了的 Intel 。消费者可是拍掌叫好啊。

需求分析

现在使用的是七代 i5-7500 ,多开 JetBrains IDE 感觉有些卡顿,性能甚至比不上多年前 Haswell 架构的 E3。

下面是性能的对比图:

跑分成绩是几年以前的2倍,光看纸面数据就让人兴奋。

平时使用电脑的需求是:

  • Web 编程开发、多开网页、时而观看直播
  • 至少需要双屏输出(两个显示器)
  • 每天超过 12小时开机运作
  • 较小的占地面积

不需要选购显示器和其余外设

选取配件

配件型号价格
处理器AMD 锐龙5 3600 处理器 6核12线程 3.6GHz0
散热FrostWind 6热管 双塔侧吹散热器44.9
主板微星(MSI)B450M MORTAR 迫击炮1749
内存微绅(Visenta)16G DDR4 2666MHz294
SSD三星(Samsung)PM981 256G PCIE M.2263
显卡蓝宝石(SAPPHIRE)R7 270 2G GDDR5 白金版 OC200
机箱台科中电 小幻影 M-ATX39.9
电源海韵(Seasonic)X850 850W电源 金牌全模组300
合计 ¥2890.8

选套装(处理器和主板搭配售出)原因还是价格较低,至少便宜 100 元。

选择 B450 芯片组的原因

其实是不选其他的芯片组的原因:

  • X470 X570 套装太贵
  • 几乎所有 A320/B350/X370 主板,需更新 BIOS 才能支持锐龙 3000 处理器
  • 几乎无店家售卖 3600 搭配 A320/B350 套装
  • A320 供电方案堪忧,供电管无散热,处理器高负荷达不到原有的性能
  • 厂家会积极改善在售主板 BIOS 的兼容性,而停产的旧产品则完全看心情

为什么选择微星迫击炮

迫击炮算是卖得比较好的型号,较新的 BIOS 改善了先前的内存兼容问题。

国外网友 Cr1318 给出结论,迫击炮直接支持默频的 3950X。2x SM4337 2x SM4503 MOSFET ,4相 CPU VDD 核心供电 配合散热片,2上2下拥有额定 300W 输出。

其中 B450 系列还有其他产品,比不上迫击炮也有其原因

  • 没有供电散热片的 B450M-PRO-M2-V2 要便宜 100元,太热了这样不好
  • 同价的 B450M-PRO-VDH-V2 没迫击炮好看,无 RGB 背光 无性能加成

为什么要有 NVMe 固态

  • NVMe 固态 比 SATA 固态体积要小 3/4 ,安装在主板上,省去供电线和数据线
  • 小文件读写性能稍好些
  • 近期市场较少推出 SATA 盘,能选的只有 三星 860 EVO,浦科特 M8V,英睿达 MX500 以及一些服务器淘汰的企业盘

但较小的体积导致发热量集中,必须配备散热片。

逛了一圈,M.2 的盘有 Intel 760P ,海康威视 C2000 ,西数 SN750,三星 PM981,HP EX920。

显卡

这里没有游戏需求,在咸鱼搜刮了 200 元内的卡,没想到以低功耗出名的 GTX750Ti 已经被炒到 300 元,果断选择 R9 270 (毕竟有 800W 电供,可以任性),性能对标 GTX660 :

蓝宝石 R9 270 有 HDMI DP 和 DVI 接口输出 ,支持 双屏没问题。

对比 N卡缺点就是功耗较大,发热量也大。到手需要清尘,并给散热器换上新硅脂。

电源

这个二手电源从朋友手中购入,几乎没什么槽点。

300 预算全新可以选 酷冷的 GX450、振华冰山金蝶 450W 、全汉蓝暴经典,或较好的二手电源,预算可以降低到 200。

同样的预算,买到的全新电比二手点瓦数要低。全新买到的是电商的保修和体验,二手不代表就是垃圾,高端电源有它的输出品质优势,但故障率看人品。

内存、机箱

便宜,能用就行。

主流 16G 内存价格在 400 左右

较小的机箱,不占地。勉强能塞下 mATX 板型的迫击炮。

不支持 12CM 规格的散热方案,3.5寸硬盘都较难塞下。

容积较小,夏天难免会成为小闷罐。

实物开箱

Ryzen 5 3600

Ryzen 5 3600 正面包装设计采用了类凯夫拉的材质,看起来非常有质感,中间有代表 ZEN 的红圈,右下角的 5 字,表示这颗处理器属于锐龙 5 家族。

处理器实体放在包装侧面,配备的幽灵散热占据了大部分位置。

开箱后清单如下:

必读说明卡片告诉我们,锐龙 3000 处理器是完全兼容在 500 系列主板上的,若果是 400 系列主板,则需要用户升级 BIOS 才能获得支持。

B450M MORTAR MAX

BIOS

B450M MORTAR MAX 先前版本是 B450M MORTAR,差别只是 CMOS 更换了较大的 Nor Flash memory。

B450M MORTAR 就因为 BIOS 存储只有 16Mb ,使得扩充支持锐龙3000 处理器微码后,装不下 BIOS UI ,只有经典的键盘操作方式。

(左上角为 MXIC MX25U25673G Nor Flash memory 芯片,用于存储 BIOS )

由台湾旺宏电子提供的 MXIC MX25U25673G ,256Mb 空间,足够装下 BIOS UI 和 AMD CPU 微码。

集成芯片

左一 Realtek ALC892 集成声卡。听个响就行。

左二 Realtek 8111H 集成网卡。相比 8111E、8111F 要差些,后期可更换好些的降低 CPU 占用率。

左下 Realtek RT8894A 4相+2相 PWM 电源控制芯片,双通道分别控制 CPU VCC 和 SOC VCC

右 RT8894 分出来的两相控制 2x SM4337(H) 2x4503NH(L) MOSFET ,负责外围电路 SOC VCC 供电

贴片元件散热

分别给上面的芯片和 MOSFET 管贴上散热片,包括内存、SATA 、PCI-E 相关电路的供电 MOSFET。总比没有散热片的情况要好。

PM981

很早就想用上 M.2 固态,体积比内存条还要精致。

散热方面也是必不可少,卖家赠送的 M.2 散热片简直像没送一样。翻出了压仓底的巨型散热片,希望能压得住这个发热巨兽。

6热管散热器

3600 纸面数据 65W TDP ,但拥有 6核心12线程 标准频率 3.6GHz,睿频高达 4.2GHz。考虑到实际发热量还是挺大的,原盒 “幽灵 Stealth” 散热器肯定压不住。

45元 6热管 9CM 的散热器,要啥自行车?

安装到位

我一般按照这个顺序安装配件

  1. 将 CPU 安装在主板上,并涂上 散热硅脂
  2. 安装散热器,连接风扇接头
  3. 安装 M.2 固态,靠近 CPU 侧的接口
  4. 安装内存

写于 2019年10月

2020/07/26

买了一根微绅 16G内存,两根微绅,给宿舍的电脑用。之前买的四根 16G酷兽内存,换到公司电脑上,一共 64G。

2020/08/19

海韵 850W电源突然坏掉,开机一段时间会断电,无奈只好更换二手的酷冷 GX450,咸鱼148元不包邮。

2020/12/04

多开项目和网页的时候还会小卡,看了很久 3900X 的价格,一直在走低,2499元包邮秒了一件。

2021/1/5

咸鱼 340包邮秒了 SN550 500G,换下 PM981 256G

2021/1/8

四根酷兽内存经常会导致系统蓝屏,而且默认频率运行都会蓝屏,卸下两根后稳定了不少,210块钱包邮出了一根给群友。两条内存超频到 2933 使用

2021/5/24

入手 WD西部数据SN730 256G