干这行第八年了,苹果CMS从V8一路用到V10,中间还自己接过二次开发,别的功能都好说,就这个“收藏”功能,看着是个小爱心,实际坑起来真要命,今天不整虚头巴脑的SEO和采集,就专门说说苹果CMS收藏功能怎么少走弯路、省时间省预算。
先说踩的第一次坑:换模板把收藏换没了,当时图好看,用了套第三方影视模板,模板演示站里收藏点一下马上红心,也弹“收藏成功”,结果用户注册登录后再点收藏,后台数据库里愣是没记录,后来一查,模板里的收藏按钮写了data-id,没写data-mid,提交的URL走的是通用接口,导致苹果CMS不知道你收藏的是影片、文章还是演员,直接把请求扔到一个不存在的模块里,苹果CMS收藏按钮的标准代码大概长这样:<a class="mac_ulog" data-id="{$obj.vod_id}" data-mid="1" data-type="1">收藏</a>。mid=1代表视频模块,type=1是收藏,type=2是点赞,不是所有模板都给你写全,所以换完模板第一件事,打开浏览器F12看Network,点收藏后看POST到哪个接口、带没带mid和type。
第二个坑是伪静态,服务器用的Nginx,一开始只配了首页和列表的rewrite规则,没给ajax/fav接口配,结果就是前台页面能开、详情页能开,一收藏就404,别上来就怪模板,先检查伪静态规则,苹果CMS装在根目录,Nginx至少要把官方文档里的nginx.conf那几行加上;如果装在子目录,接口路径要用动态生成的{:url('ajax/fav')},别在前端写死/index.php/ajax/fav.html,写死的话,以后改目录、上HTTPS、挂CDN,你还要一个个改JS,纯属自找麻烦。

苹果CMS收藏功能别只图前端好看,踩坑、填坑、长期维护一次说明白
更常见的是登录用户收藏后,进“我的收藏”页面却是空的,这个问题九成出在缓存,苹果CMS默认开了模板缓存和Redis的话,收藏动作虽然写进了数据库,但用户中心读的可能是旧缓存,我当时在宝塔里装了Redis,然后苹果CMS后台缓存驱动也选了Redis,但PHP的session没有单独指向Redis,导致登录态和收藏数据不同步,解决办法:要么统一用Redis存session且PHP启动参数里把session.save_handler改成redis,要么干脆把苹果CMS的缓存驱动设为File,别混着来,混着用,今天丢,明天错,后天全空,改完清一下runtime目录,再重启PHP,基本能恢复。
数据层面的坑,更阴,用户看到收藏按钮觉得好玩,会反复点击,苹果CMS原版没有做防重复判断,连点两下,第三方模板的JS又没有锁按钮,结果同一用户同一影片产生了N条收藏记录,后台收藏列表加载越来越慢,还有更恶心的:用户被删或者注销后,收藏表里残留一堆垃圾数据;影片下架后,收藏记录还指向已经不存在的视频ID,查询的时候带出一堆空内容,这种问题别去后台一条条删,用SQL就能搞定,操作前先备份数据库,以V10的mac_ulog表为例,思路是:
-- 先查重复记录 SELECT user_id, ulog_mid, ulog_rid, ulog_type, COUNT(*) FROM mac_ulog GROUP BY user_id, ulog_mid, ulog_rid, ulog_type HAVING COUNT(*) > 1;
确认无误后,保留每组最小的ulog_id,删掉其余重复项,具体SQL写法会根据你的MySQL版本略有区别,别在网上复制就梭哈,先跑SELECT验证,再改DELETE。
再讲一下推荐配置和插件,我现在的环境是Nginx + PHP 8.0 + MySQL 5.7,收藏接口响应稳定,如果你要装插件,优先去苹果CMS官方应用中心找“用户中心增强”或者“会员收藏同步”这类东西,别从路边下载,官方那套收藏同步插件,能解决游客cookie收藏导入会员账号的问题,这个功能很有必要,很多访客不注册直接点收藏,收藏其实存在cookie里,一清理浏览器就全没了,你装个同步插件,用户下次登录时自动把cookie里的收藏写入账号,体验会好很多,收藏数据留存率也高。
还有,给收藏表加上索引,查询速度能快一倍,如果没有索引,用户一多,每次“我的收藏”都是全表扫描,在后台数据库操作里执行:
ALTER TABLE mac_ulog ADD INDEX idx_user_type_rid (user_id, ulog_type, ulog_rid);
注意你的表前缀,如果不是mac_,改成自己站点的前缀,加索引会锁表,尽量选凌晨访客少的时候操作,或者在站维护期间做。
长期维护的话,建议每季度清理一次无效收藏,删除已经不存在的影片和已注销用户的收藏记录,控制表体积,后台日志里如果频繁出现ajax/fav请求报错,别只看一眼就关掉,那可能是有人在刷接口,苹果CMS的收藏接口没有做频率限制,有人用脚本批量点收藏,能把你一个普通用户的收藏列表刷爆,防护也比较简单:在Nginx里对ajax/fav接口做单IP限速,每分钟同一个IP最多允许20次请求,正常用户根本感知不到,脚本直接会被拦下。
最后说句实在话:苹果CMS的收藏功能,表面上是前端一点红心,实际上是登录态、数据库、缓存、伪静态、防刷五件事,你把这五件事理顺了,后面基本不用再操心,别为了一时好看用花哨模板,先把官方默认模板的收藏逻辑吃透,再在上面改样式,这样不管以后换主题还是升级版本,收藏都不会出大乱子,省下的时间,去优化片源、搞内容,比什么都划算。
发表评论