资讯动态

基于Laravel框架的响应式网站开发全流程指南

发布时间:2026/10/21 7:19:15 来源:尧图企业网站定制
最近帮某位同学的计算机毕业设计做技术审阅题目写的是“基于laraver框架开发响应式网站的设计与实现”一眼就看出是Laravel手滑打错了拼写。不过这不影响项目的定位——这就是一套典型的PHP技术栈、前后端不分离但面向多终端适配的响应式网站附带完整源码适合拿来作为毕设、课程设计或者个人练手项目。Laravel在国内外的使用率一直不低文档成熟、生态完整尤其是做中大型网站的后台管理、内容发布、用户权限这类功能效率比手写原生PHP高得多。再加上响应式设计一套代码同时兼容桌面端、平板和手机既照顾了用户体验也避免了单独开发移动端接口的额外成本。这篇内容围绕这个项目展开从需求拆解、环境搭建、数据库规划、后台逻辑到前端响应式实现、安全加固和部署交付把整个开发过程应该考虑到的点都过一遍。无论你是准备复现这个毕设还是想照着思路做一个类似的内容管理系统都可以把下面的内容当作一份实操笔记来看。文里的代码片段和目录结构基于个人经验整理具体项目如有差异以你的实际代码为准。1. 项目概述与需求拆解1.1 这个项目到底要解决什么问题“响应式网站”这个关键词决定了产品的核心形态用户在手机浏览器、平板或者电脑上打开同一个网址页面布局会根据屏幕宽度自动调整不会出现横向滚动条、文字溢出、按钮点不到这些问题。从“设计”和“实现”两个词看它不只是一个静态页面而是一个具备数据存储、后台管理、内容展示等能力的动态网站。毕设场景下这类项目通常需要回答三个问题网站给谁用、网站承载什么内容、网站需要哪些管理功能。最常见的设计是做一个通用型企业展示站或者内容资讯站前台包含首页、列表页、详情页、关于我们、联系方式等模块后台则支持管理员登录、文章发布、栏目分类、图片上传、用户留言等操作。这套需求恰好覆盖了Laravel最擅长的领域数据库迁移、ORM模型、路由分配、Blade模板渲染、表单验证、权限中间件。1.2 为什么选Laravel而不是ThinkPHP、Spring Boot或者Node.js选型是毕设答辩时老师必问的问题也是项目最开始就该想清楚的事。Laravel的优势主要有几个方面开发效率高自带ORM、迁移、Seeder、Artisan命令行工具代码生成器能快速搭出CRUD模块。社区和文档成熟遇到问题基本都能搜到答案官方文档讲解得很细适合学生快速上手。MVC分层清晰控制器、模型、视图分离代码结构一眼能看懂答辩讲起来也有逻辑可循。安全性有保障参数绑定防SQL注入、CSRF防护、密码加密、XSS过滤兜底不用我再重复造轮子。对比ThinkPHPLaravel在面试和继续深入学习方面更有优势因为Laravel的很多设计思想依赖注入、服务容器、中间件、事件机制跟现代开发模式接轨对比Spring BootLaravel的入门曲线更低不需要Java环境配置和构建工具一台电脑就能跑起来对比Node.js生态Laravel有完整的Web全栈解决方案特别是如果你后端逻辑复杂、想省心PHP的同步模型更直观。1.3 响应式网站的几个硬指标响应式不是“能缩能放”就算完。从验收角度看下面这几条是必须做到的布局断点正确手机端、平板端、桌面端的布局在三档宽度下不破版常用断点通常参考Bootstrap576、768、992、1200或者Tailwind640、768、1024、1280。图片自适应大图在窄屏下不能撑破父容器要设置max-width: 100%必要时用懒加载提升首屏速度。导航可切换桌面端横向导航移动端收起为汉堡菜单点击展开。字体和点击区域移动端正文字号不小于14px按钮点击区域不小于44x44像素。这些指标看起来基础但很多毕设项目就是倒在这几处小细节上。后面我会具体讲如何在Laravel的Blade模板里组织这些响应式结构。2. 环境准备与项目初始化2.1 开发环境选择本地集成环境还是Docker做Laravel项目第一步是搭建运行环境。最省事的是用PHPStudy、XAMPP、WampServer这类集成环境一键启动Apache/Nginx和MySQL适合新手。如果你想更贴近真实生产环境、也愿意多花一点时间推荐用Docker Compose把PHP、Nginx、MySQL三个容器拉起来环境隔离不污染本机。个人建议是如果这台电脑只是写毕设用集成环境足够如果后续还打算做别的项目Docker会更干净。实际操作中用Docker主要注意端口冲突和容器内文件权限的问题容器里PHP进程跑的是www-data用户宿主机目录挂载过去后经常出现“没权限写文件”的报错解决方式是容器启动脚本里设置user: $(id -u):$(id -g)或者在宿主机递归授权。2.2 Composer创建项目与版本锁定拿到源码后第一件事是确认PHP版本。Laravel版本有一定的最小PHP版本要求比如Laravel 10要求PHP 8.1Laravel 11要求PHP 8.2这个在源码的composer.json里能看到。创建新项目用命令composer create-project laravel/laravel responsive-site composer install如果你是复现别人给的源码根目录下已经有composer.json和composer.lock直接运行composer install不要手动改依赖版本以lock文件为准这样能避免本机安装出来的依赖跟作者不一致导致各种诡异问题。安装完成后检查一下storage和bootstrap/cache目录有没有写权限没有的话运行chmod -R 775 storage bootstrap/cache2.3 基础配置.env 文件与本地域名调试环境变量配置文件是Laravel的核心设置入口。源码交付时通常不包含.env文件因为每个人本机的数据库密码和调试开关都不一样。复制根目录下的.env.example为.env然后重点改这几项APP_NAMEResponsiveSite APP_ENVlocal APP_DEBUGtrue APP_URLhttp://responsive-site.test DB_CONNECTIONmysql DB_HOST127.0.0.1 DB_PORT3306 DB_DATABASEresponsive_site DB_USERNAMEroot DB_PASSWORDyourpassword SESSION_DRIVERfile本地调试记得APP_DEBUG保持true这样报错时能看到详细堆栈。真正部署到服务器时要改成false防止敏感信息泄露。如果你想本地用比较“真实”的域名访问在Windows下修改C:\Windows\System32\drivers\etc\hosts加入一行127.0.0.1 responsive-site.test然后配置Nginx或者Apache虚拟主机指向项目的public目录。如果只是想快速跑起来直接在集成环境里把项目放进网站根目录用http://localhost/responsive-site/public访问也能行只是URL里带着public不太好看。3. 数据库设计与核心业务模块3.1 数据表规划从业务倒推表结构响应式网站的数据量通常不大但表关系设计仍然要规范。以最典型的内容资讯站为例我建议至少拆出以下几张表users管理员表字段为name、email、password等。categories栏目分类表字段为name、slug、sort_order。articles文章表字段为title、slug、category_id、author_id、content、cover_image、status、published_at。tags标签表以及article_tag中间表用于多对多关系。messages留言表字段为name、content、contact、created_at。这张表设计有两点需要强调第一article.categor_id用外键关联categories表不要在文章表里直接存栏目名否则后面改栏目名时要全表更新第二slug字段是URL友好的标识符比如“about-us”、“laravel-tips”比直接在URL里传id更利于SEO同时也需要一个唯一索引。设计表时用Laravel的迁移文件维护结构而不是直接去数据库工具里建表。迁移文件最大的好处是可版本化部署时运行php artisan migrate就能在服务器上生成相同的表结构不需要手动导出SQL。以文章表迁移为例简化后的内容类似Schema::create(articles, function (Blueprint $table) { $table-id(); $table-string(title); $table-string(slug)-unique(); $table-foreignId(category_id)-constrained()-onDelete(cascade); $table-foreignId(author_id)-constrained(users)-onDelete(cascade); $table-longText(content); $table-string(cover_image)-nullable(); $table-boolean(status)-default(false); $table-timestamp(published_at)-nullable(); $table-timestamps(); });这里有一个关键的细节onDelete(cascade)表示删除栏目时属于该栏目的文章会一并删除。这在内容管理里可能是好事也可能造成误删。实际项目里我更推荐onDelete(restrict)不允许删除还有文章归属的栏目必须先把分类下的文章转移或删除降低事故率。3.2 模型关系ORM让查表像写口语Laravel的Eloquent模型把关系定义得非常直观。在Article模型中声明public function category() { return $this-belongsTo(Category::class); } public function author() { return $this-belongsTo(User::class, author_id); } public function tags() { return $this-belongsToMany(Tag::class); }有了这些关系前端模板里取文章栏目名就变成$article-category-name取文章所有标签就是foreach($article-tags as $tag)底层自动帮你执行关联查询。需要注意的是不要在里面写双重循环去逐条执行查询避免N1问题。列表页应该用with预加载提前把关联模型取出来$articles Article::with([category, author, tags])-get();这样只执行一条主查询加几条关联查询性能上比每个文章单独查一次好太多。毕设答辩时如果能讲出这个优化点还是比较加分的。3.3 数据填充器与假数据一个空网站看不出效果所以Seeder是展示演示数据的关键。Laravel的DatabaseSeeder可以调用模型工厂生成假数据。比如用User::factory()-count(10)-create()再配合自定义工厂。对于文章我建议不要完全依赖随机句子至少准备几篇有实际内容的“演示文章”标题、正文、摘要都要像模像样这样前台页面看起来完整。在项目交付的源码里Seeder通常是调料包的一部分。运行php artisan migrate --seed就相当于把表结构、基础管理员、演示数据全部准备好。这个命令我在很多同学的电脑上跑出过问题最常见的是字段类型不匹配、中文编码错误下面章节会单独讲排查方式。4. 后端逻辑开发路由、控制器与中间件4.1 路由设计RESTful风格还是功能式Laravel里的routes/web.php定义了前端所有URL的入口。对于内容站我的习惯是把公开页面和后台管理分开公开页面用简洁的功能式路由后台用路由前缀。可能有这样一种命名逻辑Route::get(/, [HomeController::class, index])-name(home); Route::get(/category/{category}, [ArticleController::class, category])-name(category.show); Route::get(/article/{article:slug}, [ArticleController::class, show])-name(article.show); Route::post(/message, [MessageController::class, store])-name(message.store); Route::prefix(admin)-middleware(auth)-group(function () { Route::resource(articles, AdminArticleController::class); });重点看一下/article/{article:slug}这个写法。它表示路由里的参数直接绑定模型对应的slug字段URL看起来就是/article/php-advanced-tips而不是/article/5。这样做对用户和SEO都更友好。对于后台资源管理Route::resource会一次性生成7个标准RESTful路由index、create、store、show、edit、update、destroy。这些路由对应AdminArticleController里的七个方法命名和职责固定后面维护起来非常方便。4.2 控制器分层别把代码全塞进去如果所有逻辑都写在控制器里几十行的查询、验证、文件上传、日志记录混在一起代码维护成本会很糟糕。更合理的做法是引入Service类来承载业务逻辑控制器保持“薄”的状态。目录结构可以是app/ ├── Controllers/ │ ├── HomeController.php │ └── Admin/ │ └── ArticleController.php ├── Services/ │ ├── ArticleService.php │ └── FileUploadService.php └── Models/比如ArticleService负责文章查询和保存public function create(array $data, $coverFile null) { if ($coverFile) { $data[cover_image] $this-uploadService-upload($coverFile); } return Article::create($data); }控制器里只需要接收请求、调用Service、返回响应。答辩时讲代码分层面试官会觉得你不只是在写堆代码而是有工程化思路。4.3 身份认证与角色权限管理后台不能裸奔登录认证是必须的。Laravel自带Auth常规做法是使用php artisan make:auth这种老套件生成登录脚手架但新版本更推荐用Laravel Breeze或者Fortify。如果你不想引入额外组件手动实现登录逻辑也行if (Auth::attempt([email $request-email, password $request-password], $request-remember)) { $request-session()-regenerate(); return redirect()-intended(/admin); }登录之后的权限控制最简单的方案是给users表加一个role字段用枚举值区分普通管理员和超级管理员。然后在访问后台的路由中间件里判断public function handle(Request $request, Closure $next) { if (auth()-user()-role ! admin) { abort(403); } return $next($request); }用中间件的优势是逻辑集中不会被散落在各个控制器里。如果你的角色很多用现成的spatie/laravel-permission包也行功能强大但对毕设来说可能显得有点重。4.4 表单验证与异常处理表单验证建议写在FormRequest类里而不是直接在控制器里写一堆if。比如AdminArticleRequestpublic function rules() { return [ title required|max:200, category_id required|exists:categories,id, content required|min:20, cover_image nullable|image|mimes:jpg,jpeg,png|max:2048, ]; }这样验证逻辑跟控制器解耦代码更整洁。当你提交的请求通过了验证Laravel才会进入控制器方法没通过时会把错误信息带回表单配合error指令在Blade里高亮提示。异常处理方面要区分404和500。前台文章详情页文章不存在时控制器可以抛出404异常并搭配自定义错误页resources/views/errors/404.blade.php显示“内容不存在”这比默认的报错页面体验好很多。5. 前端响应式实现Blade模板与CSS方案5.1 Blade组件化布局继承减少重复代码响应式网站的前端结构如果每个页面都写一遍头部和底部会累死而且修改一个导航链接就得到每个页面去更新。Blade布局继承是解决这个问题的标准姿势。最基础的写法是定义一个layouts/app.blade.php!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleyield(title, 默认标题)/title vite([resources/css/app.css, resources/js/app.js]) /head body include(partials.navbar) main yield(content) /main include(partials.footer) /body /html然后每个页面继承它extends(layouts.app) section(title, 首页 - 响应式网站) section(content) div classcontainer h1首页内容/h1 /div endsection从Laravel 9开始还支持Blade组件语法比如定义x-navbar :items$navItems /。组件化比简单的include更合理因为可以通过参数传递数据组件内部也能有自己的逻辑。我建议毕设项目使用include或者组件都行只要代码不要页面之间互相复制。这里有一个很容易被忽略的head问题响应式网站必须写viewport meta标签没有它手机浏览器会默认用980px宽度渲染页面然后用户手动缩放体验非常差。检查源码时第一眼就看这个标签是否存在。5.2 响应式方案Bootstrap还是Tailwind这两个是Laravel项目最常用的CSS方案也是团队里经常争论的话题。Bootstrap的栅格系统是老牌解决方案优点是好上手class语义明确比如col-md-6就代表中等屏幕以上占6列自带组件丰富下拉菜单、轮播、导航栏都有现成样式。缺点是几乎所有用Bootstrap的网站看起来都差不多定制化时需要覆盖大量样式。Tailwind则是原子化CSS的激进派模板里全是flex justify-between这种样式类没有预设组件。优点是自由度极高可以设计出完全独特的界面缺点是对新手来说写一个按钮需要组合一堆class如果完全没用过会有点懵。从毕设角度考虑如果你更关注功能实现和代码可读性建议选择Bootstrap因为文档非常容易查出问题也好解决。如果你想在页面视觉上拔尖一点可以用Tailwind配合自己写少量组件样式。但不要混用两者CSS框架混在一起会是灾难。5.3 响应式断点与栅格系统的实战心得我比较推荐的一种做法是“移动优先”。先写手机端样式再用media min-width逐级增强。比如一个文章列表卡片移动端一列显示平板两列桌面三列div classrow div classcol-12 col-md-6 col-lg-4 !-- 卡片内容 -- /div /div这行的意思很直白最小屏占12列整行md及以上占6列一行两个lg及以上占4列一行三个。写代码时不用去记一堆CSS hack栅格系统已经帮你处理好了。如果自己写媒体查询常见断点建议为屏幕档位最小宽度用途手机竖屏0px基准样式手机横屏/大手机576px导航折叠平板768px两列布局笔记本992px三列布局大屏桌面1200px定宽容器导航的移动端适配是最容易出问题的地方。最简单的做法是使用Bootstrap自带的navbar-toggler或者用Tailwind写一个汉堡按钮加SlideOver面板点击时用一个JavaScript类切换隐藏菜单。不用过度设计保持可用、美观、代码清楚即可。5.4 前端构建工具Mix和Vite怎么选Laravel 9以前默认使用Laravel MixWebpack9以后默认切到Vite。Vite构建速度更快配置也简单。在模板里引用编译后的资源vite([resources/css/app.css, resources/js/app.js])这个指令会自动处理开发环境下的热更新和线上环境的版本文件映射。开发时如果需要实时刷新运行npm run dev上线前跑npm run build生成带哈希的静态资源。在复现源码时最容易碰到的问题就是“页面样式乱七八糟”。原因通常是node_modules没有安装或没有编译。解决办法是在项目根目录运行npm install npm run build注意如果你的源码模板里没有使用vite而是直接引用了public/css/app.css那编译方式又不一样。一定要先看源码里怎么引用资源再决定要不要跑npm。6. 核心功能实现细节6.1 文章管理模块从后台到前台的一条链路完整的文章管理链路是“后台增删改查 前台列表展示 详情页渲染”。后台AdminArticleController包含7个方法核心保存逻辑前面已经给过。前台展示时要注意状态过滤只显示status为true且published_at小于等于当前时间的文章public function index() { $articles Article::with([category, author]) -where(status, true) -where(published_at, , now()) -orderBy(published_at, desc) -paginate(10); return view(article.index, compact(articles)); }分页展示用Laravel自带的paginate比一次性取全部数据好数据库压力小前端自动生成分页链接Blade里加一句$articles-links()就能输出分页导航。移动端分页样式可能不好看可以自己写一个简单的前后翻页。6.2 站内关键词搜索功能内容站的搜索引擎不应该太复杂简单的LIKE查询就够用。在Article模型中加一个局部作用域publ?ic function scopeSearch($query, $keyword) { return $query-where(title, like, %{$keyword}%) -orWhere(content, like, %{$keyword}%); }但要注意一个陷阱当搜索条件跟其他constraints连用时orWhere会把整个查询条件变成OR组合导致状态筛选失效。解决办法是用where闭包把搜索归组$articles Article::where(status, true) -where(function ($query) use ($keyword) { $query-where(title, like, %{$keyword}%) -orWhere(content, like, %{$keyword}%); }) -paginate(10);这个坑我见过不止一次搜索出来一堆未发布的文章得注意。6.3 文件上传与图片处理文章封面、用户头像都会涉及文件上传。一个稳妥的上传逻辑包括校验文件类型和大小生成唯一的文件名按照日期目录存储保存相对路径到数据库。用Laravel的Storage驱动可以实现第三点$path $request-file(cover_image)-store(covers, public);store方法会自动生成唯一文件名并把文件放到storage/app/public/covers下。然后运行php artisan storage:link创建从public/storage指向storage/app/public的软链接前端就能通过/storage/covers/xxx.jpg访问到图片。如果要压缩图片可以用intervention/image这个第三方包它是PHP处理图片比较常用的方案。但要注意该包的升级版本API有所调整老代码在最新版可能运行不了。如果只是毕设需求不压缩也行只要注意上传时限制2MB以内不会占用太大空间。7. 测试、安全加固与部署上线7.1 写几个基础测试保护核心功能很多毕设项目不写测试这其实有点可惜。Laravel对测试支持很好你至少应该为最核心的用户流程写几个功能测试比如“访客可以访问首页并看到文章列表”“已登录管理员可以创建文章”“未登录用户访问后台被重定向到登录页”。一个简单的功能测试示例public function test_home_page_contains_articles() { $article Article::factory()-create([status true]); $response $this-get(/); $response-assertStatus(200); $response-assertSee($article-title); }运行php artisan test绿色的输出看着踏实。答辩时老师问怎么保证系统功能正常你拿出测试结果比空口解释强很多。7.2 安全要点防注入、防XSS、防CSRF、防上传Laravel在安全性上已经做了大量工作但使用者也得遵循规则SQL注入不要用DB::statement拼接查询使用查询构建器和ORM会自动参数绑定。XSSBlade的{{ }}语法会自动转义HTML标签但如果一不小心用了{!! !!}内容就原样输出。除非你确定内容是可信富文本否则尽量少用不转义输出。富文本文章内容如果要保留HTML建议引入白名单过滤。CSRF所有POST、PUT、PATCH、DELETE表单都要加csrfLaravel会自动校验token漏掉就报419错误。文件上传不要信任文件扩展名最好同时校验MIME类型并且对上传目录设置禁止执行PHP脚本。关于419错误这是新手最常见的问题看到这个数字第一反应就是CSRF token没带上。排查方式看表单里有没有csrf看AJAX请求是否设置了X-CSRF-TOKEN请求头。7.3 部署到服务器从本地到线上的完整路径毕设答辩可能需要现场演示如果能在服务器上跑起来会比本地更正式。部署步骤可以压缩为四个阶段第一阶段准备服务器环境。安装PHP 8.2、Composer、MySQL/Nginx创建站点配置root指向项目的public目录。第二阶段代码上线。用Git拉取代码到服务器或者上传压缩包并解压。然后执行composer install --no-dev只安装生产依赖。第三阶段配置数据库和版本信息。服务器上创建数据库配置.env为生产环境APP_ENVproduction APP_DEBUGfalse APP_URLhttps://yourdomain.com再执行php artisan migrate --force迁移数据。别忘了php artisan config:cache和php artisan route:cache这样不用每次请求都重新解析配置。第四阶段给目录设置好权限。重点是storage和bootstrap/cache的写权限。设置完测试一下访问首页、后台登录、上传图片这三条链路基本就算上线成功。如果预算便宜也可以用内网穿透工具把本地服务映射到临时公网地址演示但那只能应付演示不能算真正部署。7.4 源码交付与文档整理这个项目标题里有“附源码”所以源码交付质量直接影响评分或项目评价。交付时至少包含完整源码包含app、routes、resources、database目录.env.example而不是你的个人.env里面可能有你的数据库密码composer.json和composer.lock数据库初始化文件或迁移说明README.md写明环境要求、安装步骤、默认管理员账号密码如果有如果用了第三方前端资源需要写明npm install和npm run build的操作。我见过一些源码包把node_modules也打包进去又大又乱完全没有必要。真正的源码交付是让一个完全没接触过项目的人按照README能独立跑起来才算合格。8. 常见问题与排查技巧实录8.1 环境相关PHP版本不兼容安装依赖时报错“Composer detected issues in your platform”常见于composer.lock里指定的PHP版本跟本机不一致。不要盲目降低依赖版本先想想项目本来需要什么版本。升级本机PHP版本之后再重新运行composer install。如果PHP版本跨度大还需要手动修改composer.json里的platform配置但这种情况极少。8.2 页面白屏或报错“Target [X] class not found”这种错误多数是自动生成的类没有正确引入运行一下composer dump-autoload让Composer重新扫描并生成类映射文件。另外不要在控制器里new了一个不存在的业务类先确认类名和命名空间一致。8.3 前端资源不生效或样式丢失按之前提到的顺序排查是否安装node_modules是否运行过npm run build模板里是引用vite还是直接引用public目录的CSS如果是在虚拟主机上部署public之外的目录不能被访问只能把网站根目录指向public。最快速验证方法浏览器打开页面的CSS链接看是否能加载能加载但样式不对看是不是CSS缓存问题不能加载则检查构建产物路径。8.4 数据库迁移失败提示字段重复或者表已存在开发过程中改过表结构再次迁移容易冲突。常用两个解决手段如果是某个字段重复定义检查迁移文件里是否写了两个相同的Schema::table(articles, ...)操作合并到一个迁移里。如果你还在开发早期可以运行php artisan migrate:fresh --seed强制重建全部表重新填充数据。但生产环境千万不能这么做会清空数据。8.5 管理员登录后后台跳转死循环最常见原因是redirect()传错了地址。例如登录成功后又重定向回需要认证的页面而该页面又要求认证形成循环。解决办法是明确后台首页路由登录后直接return redirect()-route(admin.dashboard)不要用redirect()-to(/admin)这样能避免解析到相同的登录页。8.6 移动端菜单无法展开或点击失效通常不是Laravel的问题而是JS资源没有被加载。排查要点页面底部有没有引入app.js如果模板里忘了vite加上JS文件菜单交互自然失效。是否引入了两个版本的jQuery多个JS库冲突会导致某一个事件不生效。用浏览器开发者工具看Console有没有报错如果报错是“Bootstrap is not defined”说明加载顺序错了先引库再引组件。除此之外还要检查汉堡按钮的aria属性是否完整虽然对功能没有致命影响但这是响应式页面细节考核的一部分。写在最后的一点经验如果让我给这个项目提几个最实际的建议我的顺序是先把响应式这个“骨架”搭对再谈Laravel代码花活。很多同学第一个版本全是JS特效和CSS动画结果页面一缩放到手机端就崩得稀烂这是本末倒置。我个人的做法是写任何前端模块时默认先用手机宽度调试手机端没问题了再把浏览器窗口拖宽观察布局递进而不是反过来。数据库设计和迁移文件要趁早固定后面频繁改表会非常痛苦。文章表和分类表的关联关系一改你的控制器、表单、前端展示全都要跟着动所以第一步想清楚数据模型后面工作量能省一半。如果时间紧优先保证核心链路后台能登录、能发布文章、前台能看到内容、手机端不破版。这四个环节顺畅了项目的基本盘就稳了。剩下的数据分析、邮件通知、多语言、API接口这些都属于加分项有余力再做也不迟。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑