织梦js如何获取当前登录用户id?

99ANYc3cd6
预计阅读时长 19 分钟
位置: 首页 织梦建站 正文

由于JavaScript在浏览器端运行,无法直接访问PHP的$_SESSION或数据库,所以必须有一个“桥梁”来传递数据,以下是几种常用且可靠的方法,从最推荐到备选方案排列。


通过全局变量传递(最推荐、最简单)

这是最常用和最直接的方法,在PHP模板文件中,当用户已登录时,将用户ID等信息输出为JavaScript的全局变量。

步骤 1:修改PHP模板文件

打开你需要获取用户ID的PHP模板文件(index.php, article_article.php 等),在 <head> 标签内或 <body> 标签的开始位置,添加以下PHP代码:

<?php
    // 引入会员系统所需文件
    require_once(DEDEMEMBER.'/config.php');
    // 检查用户是否登录
    if($cfg_ml->IsLogin()) {
        // 如果已登录,获取用户ID和用户名
        $uid = $cfg_ml->M_ID; // 获取当前登录用户的ID
        $uname = $cfg_ml->M_UserName; // 获取当前登录用户的用户名
        // 将PHP变量输出为JavaScript全局变量
        // 注意:为了安全,对用户名进行HTML转义
        echo "<script>var currentUserId = {$uid};</script>";
        echo "<script>var currentUserName = '" . htmlspecialchars($uname) . "';</script>";
    } else {
        // 如果用户未登录,可以设置一个默认值或null
        echo "<script>var currentUserId = null;</script>";
    }
?>

代码解释:

  • require_once(DEDEMEMBER.'/config.php');:这是织梦会员系统初始化的关键文件,必须引入才能使用$cfg_ml对象。
  • $cfg_ml->IsLogin():检查当前用户是否处于登录状态,返回 truefalse
  • $cfg_ml->M_ID:如果用户已登录,这个属性就存储了用户的ID。
  • echo "<script>...";:将PHP的值嵌入到<script>标签中,创建JavaScript变量。
  • htmlspecialchars($uname):这是一个重要的安全措施,可以防止用户名中包含的恶意JS代码被执行,导致XSS攻击。

步骤 2:在JavaScript文件或<script>标签中获取

你可以在任何地方的JavaScript代码中直接使用这个全局变量了。

示例 1:在HTML文件的内联JS中

<div id="user-info">欢迎您,游客!</div>
<button id="getUidBtn">获取用户ID</button>
<script>
    // 检查全局变量是否存在(即用户是否已登录)
    if (typeof currentUserId !== 'undefined') {
        document.getElementById('user-info').innerHTML = '欢迎您,' + currentUserName + '!';
        document.getElementById('getUidBtn').addEventListener('click', function() {
            alert('您的用户ID是: ' + currentUserId);
        });
    } else {
        alert('您尚未登录,请先登录!');
    }
</script>

示例 2:在外部JS文件中

如果你的JavaScript代码在外部文件(static/js/main.js)中,你同样可以访问这些全局变量。

// static/js/main.js
function checkUserId() {
    if (currentUserId) {
        console.log('User is logged in with ID:', currentUserId);
        // 执行需要用户ID的操作,比如AJAX请求
        // fetchSomeData(currentUserId);
    } else {
        console.log('User is not logged in.');
        // 执行未登录时的操作,比如跳转到登录页
        // window.location.href = '/member/login.php';
    }
}
// 页面加载完成后执行
document.addEventListener('DOMContentLoaded', checkUserId);

通过AJAX动态获取(更灵活、更现代)

如果你的页面是SPA(单页应用)或者你不想在页面加载时就输出全局变量,可以使用AJAX在需要时从服务器获取用户信息。

步骤 1:创建一个API接口

在织梦的根目录下创建一个新的PHP文件,api/get_user_info.php,用于返回用户信息(通常是JSON格式)。

<?php
// api/get_user_info.php
header('Content-Type: application/json; charset=utf-8');
// 引入会员系统所需文件
require_once '../include/common.inc.php';
require_once DEDEMEMBER.'/config.php';
// 定义返回数据
$response = ['isLoggedIn' => false, 'uid' => 0, 'uname' => ''];
// 检查用户是否登录
if ($cfg_ml->IsLogin()) {
    $response['isLoggedIn'] = true;
    $response['uid'] = $cfg_ml->M_ID;
    $response['uname'] = $cfg_ml->M_UserName;
}
// 输出JSON数据
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
?>

步骤 2:在前端JavaScript中调用AJAX

使用fetch API(现代浏览器推荐)或jQuery$.ajax来调用这个接口。

使用原生 Fetch API

// 在需要获取用户ID的地方调用
async function fetchUserId() {
    try {
        const response = await fetch('/api/get_user_info.php');
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        const data = await response.json();
        if (data.isLoggedIn) {
            console.log('用户ID:', data.uid);
            console.log('用户名:', data.uname);
            // 在这里使用 data.uid
        } else {
            console.log('用户未登录');
            // 在这里处理未登录逻辑
        }
    } catch (error) {
        console.error('获取用户信息失败:', error);
    }
}
// 在某个按钮点击时触发
document.getElementById('getUidBtn').addEventListener('click', fetchUserId);

使用 jQuery (如果你的项目依赖jQuery)

$.ajax({
    url: '/api/get_user_info.php',
    type: 'GET',
    dataType: 'json',
    success: function(data) {
        if (data.isLoggedIn) {
            console.log('用户ID:', data.uid);
            console.log('用户名:', data.uname);
        } else {
            console.log('用户未登录');
        }
    },
    error: function(xhr, status, error) {
        console.error('获取用户信息失败:', error);
    }
});

总结与对比

特性 全局变量 AJAX接口
实现难度 非常简单,只需在模板中加几行PHP代码。 稍复杂,需要创建额外的API文件。
性能 页面加载时数据就已就绪,获取速度快。 需要额外的网络请求,有延迟。
灵活性 较低,数据在页面加载时就确定了。 非常高,可以在任何需要的时候动态获取,适合SPA。
适用场景 大多数传统页面,如文章详情页、首页,需要根据登录状态显示不同内容时。 单页应用、需要频繁与服务器交互、或不想污染全局作用域的场景。

对于绝大多数织梦CMS的二次开发需求,方法一(全局变量)是首选,因为它简单、直接且高效,只有在非常特殊的情况下,才需要考虑使用方法二。

-- 展开阅读全文 --
头像
织梦猫登录密码忘记了
« 上一篇 今天
c语言 buildpath
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]