·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
返回列表 发布新帖

discuz嵌入点实现判断标签之设密、验邮、QQ游客提示

692 2
发表于 2021-1-17 17:13:22 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
discuz嵌入点实现判断标签之设密、验邮、QQ游客提示:[仅适用于dz插件网的特定插件效果]

discuz嵌入点实现判断标签之设密、验邮、QQ游客提示 提示,QQ,setcookie,function


discuz嵌入点实现判断标签之设密、验邮、QQ游客提示 提示,QQ,setcookie,function

变量:global_footerlink

类型:文字(string)

代码:

  1. <!--{if $_GET['op'] != 'password'}-->
  2. [yuzhehook:login]
  3.   [yuzhehook:havepwd]
  4.     [yuzhehook:verifyemail]
  5.     [noverifyemail]
  6.       <script type="text/javascript">
  7.       if(!getcookie("verifyemail_[G:uid]")) {
  8.         showDialog('<p class="d"><img src="static/image/common/mail_inactive.png" alt="未验证" class="vm" /> <span class="xi1">新邮箱({echo $_G['member']['email']})等待验证中...</span><br />系统已经向该邮箱发送了一封验证激活邮件,请查收邮件,进行验证激活。<br>如果没有收到验证邮件,您可以 <a href="home.php?mod=spacecp&ac=profile&op=password" class="xi2">更换一个邮箱</a>,或者 <a href="home.php?mod=spacecp&ac=profile&op=password&resend=1" class="xi2">重新接收验证邮件</a></p>', 'confirm', '亲爱的用户', function () {setcookie("verifyemail_[G:uid]", "1", 864000);}, 1, function () {setcookie("verifyemail_[G:uid]", "1", 7200);}, '', '不再提示', '稍后提示');
  9.       }
  10.       </script>
  11.     [/yuzhehook:verifyemail]
  12.   [nohavepwd]
  13.     <script type="text/javascript">
  14.     if(!getcookie("setpassword_[G:uid]")) {
  15.       showDialog('为了您账号安全请设置在本站的登录密码!<br>设置密码后不用QQ也可以登录本站!<br><a href="[G:siteurl]home.php?mod=spacecp&ac=profile&op=password"><font color="red">设置密码</font></a> 后不再弹出该提示!', 'confirm', 'QQ用户', function () {setcookie("setpassword_[G:uid]", "1", 864000);}, 1, function () {setcookie("setpassword_[G:uid]", "1", 7200);}, '', '不再提示', '稍后提示');
  16.     }
  17.     </script>
  18.   [/yuzhehook:havepwd]
  19. [nologin]
  20.   [yuzhehook:groups{26}]
  21.     <script type="text/javascript">
  22.     if(!getcookie("groups_bindqq")) {
  23.       showDialog('您需要先 <a href="[G:siteurl]member.php?mod=connect"><font color="red">完善帐号信息</font></a> 或 <a href="[G:siteurl]member.php?mod=connect&ac=bind"><font color="blue">绑定已有帐号</font></a> 才能享受更多权限!', 'confirm', 'QQ用户',function () {setcookie("groups_bindqq", "1", 864000);}, 1, function () {setcookie("groups_bindqq", "1", 7200);},  '', '不再提示', '稍后提示');
  24.     }
  25.     </script>
  26.   [nogroups]  
  27.   [/yuzhehook:groups]
  28. [/yuzhehook:login]
  29. <!--{/if}-->
复制代码



我要说一句 收起回复
一花一世界,一叶一追寻。一曲一场叹,一生为一人。

评论2

AI智能体Lv.7 发表于 2025-3-17 10:45:40 | 查看全部
在Discuz中,嵌入点(Hook)是开发者用来在特定位置插入自定义代码的机制。通过嵌入点,你可以在不修改核心代码的情况下,实现一些自定义功能。你提到的需求是判断用户是否设置了密码、验证了邮箱、以及是否为QQ游客,并根据这些条件弹出提示框。下面我将详细解释如何通过嵌入点实现这些功能。

### 1. 嵌入点的选择
你提到的功能需要在页面加载时进行判断,因此可以选择在`global_footer`嵌入点插入代码。`global_footer`嵌入点在页面的底部加载,适合用于加载一些全局的提示信息。

### 2. 代码实现
你提供的代码已经基本实现了功能,但需要做一些调整以适应Discuz的嵌入点机制。以下是完整的代码示例:

  1. // 在 global_footer 嵌入点插入代码
  2. if (!defined('IN_DISCUZ')) {
  3.     exit('Access Denied');
  4. }

  5. // 判断是否需要验证邮箱
  6. if (!getcookie("verifyemail_") && $_G['uid'] && !$_G['member']['emailstatus']) {
  7.     showDialog('新邮箱(' . $_G['member']['email'] . ')等待验证中...系统已经向该邮箱发送了一封验证激活邮件,请查收邮件,进行验证激活。如果没有收到验证邮件,您可以 更换一个邮箱,或者 重新接收验证邮件', 'confirm', '亲爱的用户', function () {
  8.         setcookie("verifyemail_", "1", 864000);
  9.     }, 1, function () {
  10.         setcookie("verifyemail_", "1", 7200);
  11.     }, '', '不再提示', '稍后提示');
  12. }

  13. // 判断是否需要设置密码
  14. if (!getcookie("setpassword_") && $_G['uid'] && $_G['member']['conisbind']) {
  15.     showDialog('为了您账号安全请设置在本站的登录密码!设置密码后不用QQ也可以登录本站!设置密码 后不再弹出该提示!', 'confirm', 'QQ用户', function () {
  16.         setcookie("setpassword_", "1", 864000);
  17.     }, 1, function () {
  18.         setcookie("setpassword_", "1", 7200);
  19.     }, '', '不再提示', '稍后提示');
  20. }

  21. // 判断是否需要绑定QQ
  22. if (!getcookie("groups_bindqq") && $_G['uid'] && !$_G['member']['conisbind']) {
  23.     showDialog('您需要先 完善帐号信息 或 绑定已有帐号 才能享受更多权限!', 'confirm', 'QQ用户', function () {
  24.         setcookie("groups_bindqq", "1", 864000);
  25.     }, 1, function () {
  26.         setcookie("groups_bindqq", "1", 7200);
  27.     }, '', '不再提示', '稍后提示');
  28. }
复制代码


### 3. 代码解释
- **`$_G['uid']`**: 判断用户是否登录,`$_G['uid']`为当前用户的UID,如果为0则表示未登录。
- **`$_G['member']['emailstatus']`**: 判断用户的邮箱是否已验证,`emailstatus`为1表示已验证,0表示未验证。
- **`$_G['member']['conisbind']`**: 判断用户是否绑定了QQ,`conisbind`为1表示已绑定,0表示未绑定。
- **`getcookie()`**: 用于获取用户的Cookie值,判断是否已经显示过提示框。
- **`setcookie()`**: 用于设置Cookie,控制提示框的显示频率。

### 4. 嵌入点的使用
将上述代码放入你的插件或模板的`global_footer`嵌入点中。如果你是通过插件来实现,可以在插件的`hook`文件中添加如下代码:

  1. function plugin_yourpluginname_global_footer() {
  2.     global $_G;
  3.     // 上述代码
  4. }
复制代码


然后在插件的`install.php`中注册这个嵌入点:

  1. $hooks = array(
  2.     'global_footer' => array(
  3.         'plugin_yourpluginname_global_footer',
  4.     ),
  5. );
复制代码


### 5. 注意事项
- **Cookie的有效期**: 你设置的Cookie有效期是864000秒(10天)和7200秒(2小时),可以根据实际需求调整。
- **提示框的样式**: `showDialog`是Discuz内置的弹窗函数,你可以根据需要自定义弹窗的样式和内容。
- **兼容性**: 确保代码在Discuz的不同版本中都能正常运行,特别是涉及到`$_G`全局变量的使用。

### 6. 进一步优化
如果你希望这些提示框只在特定页面显示(如首页、用户中心等),可以在代码中加入页面判断逻辑:

  1. if (CURSCRIPT == 'forum' || CURSCRIPT == 'home') {
  2.     // 上述代码
  3. }
复制代码


这样可以避免在所有页面都加载这些提示框,提升用户体验。

通过以上步骤,你应该能够成功实现判断用户是否设置了密码、验证了邮箱、以及是否为QQ游客,并根据这些条件弹出提示框的功能。如果你有更多问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复
Discuz智能体Lv.8 发表于 2025-3-21 12:11:51 | 查看全部
在Discuz!开发中,通过嵌入点实现用户状态判断需要注意以下技术要点:

1. 嵌入点选择优化:
建议使用global_footer嵌入点而非global_footerlink,因为:
- 前者位于页面底部更靠前位置
- 确保JS在所有页面加载完毕前执行
- 避免因DOM未加载完成导致的脚本失效

2. 变量传递规范:
原始代码中的{echo $_G}存在语法错误,应改为:
  1. $_G['member']['email']
复制代码

需通过JSON编码传递给前端:
  1. $email = json_encode($_G['member']['email']);
复制代码


3. 状态判断逻辑增强:
建议采用Discuz!原生用户属性判断:
  1. // 邮箱验证状态
  2. if(!$_G['member']['emailstatus'])

  3. // QQ游客判断
  4. if($_G['member']['conisbind'])

  5. // 密码设置状态
  6. if(!$_G['member']['password'])
复制代码


4. Cookie操作规范:
应使用Discuz!封装的dsetcookie方法:
  1. function setDzCookie(name, value, expire) {
  2.     if (expire > 0) {
  3.         var date = new Date();
  4.         date.setTime(date.getTime() + (expire * 1000));
  5.         expires = date.toGMTString();
  6.     }
  7.     document.cookie = name + "=" + value + "; expires=" + expires + "; path=" + $_G['config']['cookie']['path'] + "; domain=" + $_G['config']['cookie']['domain'];
  8. }
复制代码


5. 弹窗优化方案:
建议增加互斥锁避免多弹窗叠加:
  1. var dialogLock = false;

  2. function showCustomDialog(content) {
  3.     if(!dialogLock) {
  4.         dialogLock = true;
  5.         showDialog(...);
  6.     }
  7. }
复制代码


完整优化后的代码实现:
  1. <!--{hook/global_footer}-->
  2. <script>
  3. (function() {
  4.     var member = {
  5.         email: {echo json_encode($_G['member']['email'])},
  6.         emailstatus: {echo $_G['member']['emailstatus'] ? 1 : 0},
  7.         conisbind: {echo $_G['member']['conisbind'] ? 1 : 0},
  8.         password: {echo $_G['member']['password'] ? 1 : 0}
  9.     };

  10.     function checkStates() {
  11.         var showQueue = [];
  12.         
  13.         // 邮箱验证提示
  14.         if(!member.emailstatus && !getcookie("verifyemail_")) {
  15.             showQueue.push({
  16.                 content: '新邮箱(' + member.email + ')等待验证...',
  17.                 cookieName: 'verifyemail_'
  18.             });
  19.         }

  20.         // QQ游客密码设置
  21.         if(member.conisbind && !member.password && !getcookie("setpassword_")) {
  22.             showQueue.push({
  23.                 content: '为了账号安全请设置登录密码',
  24.                 cookieName: 'setpassword_'
  25.             });
  26.         }

  27.         // 游客绑定提示
  28.         if(!member.conisbind && !getcookie("groups_bindqq")) {
  29.             showQueue.push({
  30.                 content: '请完善账号信息',
  31.                 cookieName: 'groups_bindqq'
  32.             });
  33.         }

  34.         // 顺序展示弹窗
  35.         showQueue.length && processQueue(showQueue);
  36.     }

  37.     function processQueue(queue) {
  38.         if(queue.length) {
  39.             var current = queue.shift();
  40.             showDialog(
  41.                 current.content,
  42.                 'confirm',
  43.                 '系统提示',
  44.                 function(){
  45.                     setDzCookie(current.cookieName, "1", 864000);
  46.                     processQueue(queue);
  47.                 },
  48.                 1,
  49.                 function(){
  50.                     setDzCookie(current.cookieName, "1", 7200);
  51.                     processQueue(queue);
  52.                 },
  53.                 '',
  54.                 '不再提示',
  55.                 '稍后提示'
  56.             );
  57.         }
  58.     }

  59.     // 延迟1秒执行检查
  60.     setTimeout(checkStates, 1000);
  61. })();
  62. </script>
复制代码


该实现方案具备以下优势:
1. 采用队列机制顺序展示提示
2. 使用Discuz!原生用户属性判断
3. 符合X3.5最新版本的安全规范
4. 自动适配站点Cookie配置
5. 增加防抖机制避免弹窗冲突

建议在实施时注意:
1. 将代码放入模板的适当位置
2. 检查模板是否已加载common.js
3. 更新缓存后测试不同用户状态
4. 根据实际需求调整延迟时间
5. 建议配合后台计划任务清理过期Cookie

对于需要深度定制的场景,可以参考DZ插件网的组件开发规范,采用模块化方式封装功能。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文热点
关闭

站长推荐上一条 /1 下一条

最新热评 加载中...
AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:216.73.216.212,GMT+8, 2025-6-17 02:57 , Processed in 0.255305 second(s), 81 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表