thinkphp做社区系统核心是管好用户、公告、报修、门禁四类数据,并配好rbac权限与redis缓存;卡点在路由配置(需检查重写规则)、模型关联写法(统一用db::name或model)、缓存键设计(须加业务前缀并显式设过期)。

直接上手 ThinkPHP 做社区系统,别被“智慧”“物联网”这些词绕晕——核心就是把 用户、公告、报修工单、门禁记录 这几类数据管清楚,再配好权限和缓存。框架本身不难,卡点全在路由配置、模型关联写法、以及 Redis 缓存键设计这三块。
ThinkPHP 6/8 路由没生效?先查 public/index.php 和重写规则
常见现象:访问 /admin/login 报 404,但 /index.php/admin/login 能进。这不是代码写错了,是服务器没转发请求到入口文件。
- Apache 环境下确保
.htaccess文件存在且未被注释掉,关键行是RewriteRule ^(.*)$ index.php [L] - Nginx 用户必须手动改
server块里的location /段,用 ThinkPHP 官方推荐的写法:if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; },别套 Laravel 的try_files - 用
php think run启动内置服务器时,路由默认全通,但上线前务必切回真实 Web 服务器验证
db() 和 Db::name() 混用导致事务失效
社区系统里报修提交、扣费、发通知要一并成功或回滚,但很多人在控制器里混用两种数据库调用方式,结果 Db::transaction() 根本包不住 db('repair')->insert() 这种写法。
-
db('table')是快速查询封装,底层走的是独立连接,不参与当前事务上下文 - 事务内所有操作必须统一用
Db::name('repair')或继承Model类的实例(如RepairModel::create()) - 门禁记录这类高频写入场景,建议关掉模型事件(
protected $event = [];),否则每次save()都触发before_insert可能拖慢响应
RBAC 权限控制别硬写 SQL,用 Auth 类配合中间件
社区系统至少有居民、物业、管理员三类角色,如果每个控制器方法都 if ($user->role !== 'admin') die();,后期改权限策略会疯掉。
- ThinkPHP 6+ 自带
think\facade\Auth,初始化后直接调用Auth::check('admin')或Auth::hasRole('property') - 把权限校验抽成中间件(如
CheckRole),在app/middleware.php里按分组绑定:'admin' => [CheckRole::class] - 注意:
Auth默认从 session 读用户信息,如果用了 JWT 或 Redis 存 token,得重写Auth::setUser()方法注入当前用户对象
Redis 缓存键命名不带业务前缀,上线后键冲突炸库
公告列表、热门报修、用户头像 URL 这些都适合缓存,但新手常写 Cache::set('list', $data),结果不同模块的 list 相互覆盖。
- 强制加业务域前缀,比如公告用
notice:list:hot,门禁记录用access:log:today - 涉及用户私有数据的缓存(如个人缴费记录),必须拼上
$user->id:fee:record:20260514:{$uid} - 别依赖
Cache::remember()的默认过期时间,社区系统里公告可能要缓存 2 小时,而实时门禁状态必须设为 30 秒,显式传1800或30
最易被忽略的是模型时间自动填充字段——created_at 和 updated_at 在 ThinkPHP 里默认只对 datetime 类型生效,如果数据库字段是 int 存时间戳,得手动在模型里加 protected $type = ['created_at' => 'integer'];,否则新建报修单时这个字段永远是 0。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











