会员
登录状态、昵称、角色,以及「正文要登录才能看」时的登录引导怎么写。
适用范围:页头(登录入口)、详情页(会员门槛)。
{naicha:user}
只有 logged / id / username / role / nickname 这几个字段
(来自登录时写进会话的那一份)。未登录时 logged='0'、nickname='访客'。
<!-- [页头] 登录入口 -->
{naicha:user}
{naicha:if var="user.logged" eq="1"}
<a href="/user">{user.nickname}</a>
<a href="/user/logout">退出</a>
{naicha:else}
<a href="/user/login">登录</a>
<a href="/user/register">注册</a>
{/naicha:if}
{/naicha:user}
⚠️ 判断登录必须用
eq="1":写成 notempty 的话,未登录时 logged 是字符串 '0' ——
非空,判断永远为真,于是访客也会看到「我的账户」。
会员门槛
门槛有两档,是两件事,别混:
need_login = 1—— 仅登录可见:登录就行,不要求任何等级。内容的「发布设置 → 访问门槛」里选「仅登录用户可见」。need_level > 0—— 某等级及以上:隐含要求登录。选「任意会员可见」会把门槛设成最低的那一档。
⚠️ 为什么不做成「一个数字同时表达两种意思」(比如 need_level = -1 表示仅登录):
那种哨兵值列上没有任何约束能拦住,而读它的地方有好几处,漏改一处就会出现「某些入口能看、某些不能」。
两个语义两个列,判据则只有 Member::gate() 一个入口。
<!-- [详情] 正文要会员才能看时,服务端已经把正文摘掉了;这里只需给个出口 -->
{naicha:include file="member_gate.html"}
⚠️ 未达门槛时正文是在服务端被摘掉的,不是前端隐藏 ——
模板拿到的 detail.content 就是空的,所以右键看源码也拿不到。
内容输出接口用的是同一个判据,并额外带出 locked / need_login / lock_why 三个字段。
