你打的“湖画皮爱到”我猜是打字打岔了,八成说的是文章列表。网站重新改版,不管是前台展示还是后台管理,文章列表都是绕不开的一块。我前后做过几个站,这块坑不少,今天就把经验倒出来,你照着捋一遍基本能少走弯路。
先想清楚列表给谁看。前台用户看,重点是找文章、读文章;后台编辑看,重点是管文章、改文章。两边的设计逻辑完全不一样,别混在一起做。
前台文章列表,第一眼要让人知道这儿有什么。标题、摘要、封面图、发布时间、分类标签,这几样基本够用。摘要别自动截取前100个字,那样经常断句,手动填或者用智能摘要更好。封面图用缩略图,宽度600像素左右就行,别直接加载原图,不然手机用户流量哗哗掉。分页别搞“上一页下一页”就完事,页码数字要显示出来,用户想跳第5页得能点。URL结构尽量静态化,比如 /list/tech/2.html 或者 /category/tech?page=2,前者对搜索引擎更友好。如果网站靠搜索流量吃饭,最好用服务端渲染,别等JS加载完才出内容。每页条数控制在10到20条,太多了滚动累,太少了翻页烦。
后台文章列表,核心是效率。表格布局最实在,列可以自定义显示隐藏。标题列宽一点,状态列用颜色区分,草稿灰色、已发布绿色、待审核橙色。操作列放编辑、删除、预览,删除一定要二次确认,别问为什么,都是泪。搜索框支持按标题和作者搜,别只搜标题。筛选条件加上分类、状态、时间范围。排序默认按发布时间倒序,但也要允许按浏览量、评论数排。批量操作很关键,批量删除、批量改状态、批量移动分类,勾选框放在第一列。分页组件要有每页条数选择,20、50、100,编辑们习惯不一样。
数据库这块,文章主表至少要有id、title、content、category_id、author_id、status、created_at、updated_at、views。索引加在status、created_at、category_id上,别等数据上了十万才想起来。列表查询千万别select *,把content字段排除掉,那玩意儿大。分页用limit offset,数据量大了就改用where id > 上一页最后一条的id,性能差好几倍。搜索如果用like ''%关键词%'',索引直接废掉,小站可以忍,大站上全文索引或者Elasticsearch。分类和标签用关联表,别在文章表里存逗号分隔的字符串,后期查询能把你逼疯。

接口设计走RESTful风格,GET /api/articles?page=1&pageSize=20&keyword=&status=&category_id=&sort=created_at desc。返回JSON里带上total总数,前端分页组件需要。每篇文章返回的字段按需给,后台列表不需要content,前台列表不需要作者邮箱。权限校验必须在接口层做,普通作者只能看自己的文章,管理员看全部,别只在前端藏按钮,那叫掩耳盗铃。
前端展示,后台直接用现成的组件库,Element UI的Table或者Ant Design的Table,分页、排序、筛选都封装好了,省得自己造轮子。前台列表如果不用框架,手写分页也不难,注意移动端适配,表格在手机上变成卡片流。加载状态用骨架屏,别让用户盯着白屏。空状态给个提示,比如“暂无文章,去发布一篇”,别就留一片空白。
改版迁移的时候,旧文章的URL要301重定向到新URL,不然搜索引擎收录全丢。旧分类要映射到新分类,别直接删。用户收藏的链接、外部引用的链接,能兼容就兼容。测试的时候拿生产环境的数据量测,别拿几十条数据测,那测不出性能问题。
最后说句实在的,文章列表看着简单,做起来细节一堆。先把需求聊透,谁用、怎么用、数据量多大、要不要SEO,这几个问题答清楚了再动手。上线后看用户点击热图,哪个筛选条件没人用就砍掉,哪个操作频繁就提到前面。列表页的核心就一句话:让用户最快找到想要的那篇文章。其他的,都是为这个目标服务。