前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >看世界论坛个人主页头像设置逻辑

看世界论坛个人主页头像设置逻辑

原创
作者头像
半夜喝可乐
修改2023-11-08 22:33:08
2321
修改2023-11-08 22:33:08
举报
文章被收录于专栏:小轻论坛小轻论坛

在设计个人主页时,我加入了用户头像的功能,这样能让整个论坛更加人性化。

这里在用户注册会员时,我会在表单中加入头像的上传功能,用户可以选择性上传头像,但我没有标注可以不上传。这样的话,不明所以的人都会选择直接上传,以免后期让用户再去上传会让人疲倦。

因为我使用了这个表单中相同的图片处理功能,所以在讲个人主页头像设置时,需要额外去讲下这个逻辑怎么完成的。

首先,我们要明白头像一般是正方形的,所以我们需要设置它的大小为一定值,且一定要是正方形,我们不能规定用户一定要上传正方形头像,但是我们要让用户上传后被处理出来的照片是张方形的。

这里的我设置最大宽度为200px,如果不是方形头像则填充白色让其变成方形,以下是相关代码:

代码语言:javascript
复制
// 压缩图片
$maxWidth = 200; // 设置最大宽度
$maxHeight = 200; // 设置最大高度
代码语言:javascript
复制
// 创建新的图像资源
$compressedImage = imagecreatetruecolor($maxWidth, $maxHeight);

// 填充背景色为白色
$white = imagecolorallocate($compressedImage, 255, 255, 255);
imagefill($compressedImage, 0, 0, $white);

整体的对图片进行处理的代码为:

代码语言:javascript
复制
<?php
// 获取上传的图片信息
$imageInfo = getimagesize($file['tmp_name']);
$imageType = $imageInfo[2];

// 根据图片类型创建对应的图像资源
switch ($imageType) {
    case IMAGETYPE_JPEG:
        $source = imagecreatefromjpeg($file['tmp_name']);
        break;
    case IMAGETYPE_PNG:
        $source = imagecreatefrompng($file['tmp_name']);
        break;
    case IMAGETYPE_GIF:
        $source = imagecreatefromgif($file['tmp_name']);
        break;
    default:
        // 不支持的图片类型
        break;
}

// 压缩图片
$maxWidth = 200; // 设置最大宽度
$maxHeight = 200; // 设置最大高度
$width = imagesx($source);
$height = imagesy($source);

// 计算剪切后的宽度和高度
if ($width > $height) {
    $newWidth = $maxWidth;
    $newHeight = $height * ($maxWidth / $width);
} else {
    $newWidth = $width * ($maxHeight / $height);
    $newHeight = $maxHeight;
}

// 创建新的图像资源
$compressedImage = imagecreatetruecolor($maxWidth, $maxHeight);

// 填充背景色为白色
$white = imagecolorallocate($compressedImage, 255, 255, 255);
imagefill($compressedImage, 0, 0, $white);

// 计算剪切的起始坐标
$offsetX = ($maxWidth - $newWidth) / 2;
$offsetY = ($maxHeight - $newHeight) / 2;

// 剪切并压缩图片
imagecopyresampled($compressedImage, $source, $offsetX, $offsetY, 0, 0, $newWidth, $newHeight, $width, $height);

// 保存压缩后的图片
imagejpeg($compressedImage, $uploadFile, 80); // 第三个参数是压缩质量,可以根据需要进行调整

// 释放资源
imagedestroy($source);
imagedestroy($compressedImage);

这个代码被我保存成了yasuo.php引用,因为我需要在个人主页也要去调用,避免重复,大家也可以像我一样调用。

所以在表单中上传头像,我是这样引用处理的:

代码语言:javascript
复制
// 检查是否选择了要上传的头像文件
if (isset($_FILES['avatar']) && $_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
    $file = $_FILES['avatar'];
    $uploadDir = 'img/userhead/';
    $uploadFile = $uploadDir . $userId . '.' . pathinfo($file['name'], PATHINFO_EXTENSION); // 使用原始文件名作为头像文件名
    require_once 'yasuo.php';
    // 更新用户数据中的头像字段
    $updateSql = "UPDATE users SET avatar = '$uploadFile' WHERE id = $userId";
    $conn->query($updateSql);
}

用户上传的头像保存在了img/userhead/,并使用了yasuo.php中相应代码进行压缩处理。

现在我们明白了处理逻辑,现在就是需要去设计个人主页的样式和编辑方式。

我的方法是,在个人主页中做一个圆形的头像展示,用户头像就展示在这里,但是如果用户没有上传头像,则使用昵称的第一个字作为头像,如果是汉字就展示汉字,字母就展示字母,这很简单。

相应代码为:

代码语言:javascript
复制
<?php
// 检查用户是否有头像
if (!empty($userData['avatar'])) {
    $avatarPath = $userData['avatar'];
    echo "<img src='$avatarPath' alt='用户头像' class='img-thumbnail rounded-circle img-fluid' style='max-width: 100px;'>";
} else {
    $nickname = $userData['nickname'];
    $initial = mb_strtoupper(mb_substr($nickname, 0, 1));
    echo "<div class='rounded-circle bg-secondary text-light d-flex align-items-center justify-content-center' style='width: 100px; height: 100px; font-size: 60px;'>$initial</div>";
}
?>

然后我们需要在点击的时候对头像进行编辑,需要知道的是,应该是用户本人或者管理员是有这个权限进行编辑的,其他人是没有编辑入口的,甚至无法点击。

从这个逻辑出发,我们需要做的就是,要校验用户的权限并且对上传头像的逻辑进行设计。

因为我在用户表中加入了role的权限值,这样就能获取用户是否是管理员。细心的人就能看到,用户主页后面是有相应用户组的徽标显示的,我是这样设置的:

代码语言:javascript
复制
function getUserRoleName($role) {
    switch ($role) {
        case 1:
            return '创始人';
        case 2:
            return '管理员';
        case 3:
            return '创作者';
        case 4:
            return '粉丝';
        default:
            return '未知角色';
    }
}

所以我要保证登录用户ID与当前用户ID相同或者role值小于等于2即可修改头像,否则只显示头像,而无法进行编辑操作。

这里编辑的功能就是使用form表单使用post方式提交,然后绑定上传的js事件和后端提交代码。

php:

代码语言:javascript
复制
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['avatar']) && $_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
    $file = $_FILES['avatar'];
    $uploadDir = 'img/userhead/';
    $userID = isset($_GET['user_id']) ? $_GET['user_id'] : $userId;
    $uploadFile = $uploadDir . $userID . '.' . pathinfo($file['name'], PATHINFO_EXTENSION);
    require_once 'yasuo.php';

    // 更新用户数据中的头像字段
    $updateSql = "UPDATE users SET avatar = '$uploadFile' WHERE id = $userID";
    $conn->query($updateSql);

    // 返回上传成功的响应
    $response = [
        'success' => true,
        'avatarPath' => $uploadFile
    ];
    
    // 将用户重定向到原页面
    header('Location: ' . $_SERVER['HTTP_REFERER']);
    exit();
} else {
    // 返回上传失败的响应
    $response = [
        'success' => false
    ];
}

html:

代码语言:javascript
复制
<?php if ($loginUserRole <= 2 || $userData['id'] === $userId) : ?>
    <form id="avatarUploadForm" method="POST" enctype="multipart/form-data" action="">
        <?php if (!empty($userData['avatar'])) : ?>
            <img src="<?php echo $userData['avatar']; ?>" title="点击可以修改头像" alt="用户头像" class="img-thumbnail rounded-circle img-fluid" style="max-width: 100px; cursor: pointer;" onclick="uploadAvatar()">
        <?php else : ?>
            <div class="rounded-circle bg-secondary text-light d-flex align-items-center justify-content-center" style="width: 100px; height: 100px; font-size: 60px; cursor: pointer;" onclick="uploadAvatar()">
                <?php echo mb_strtoupper(mb_substr($userData['nickname'], 0, 1)); ?>
            </div>
        <?php endif; ?>
        <input type="file" id="avatarInput" name="avatar" style="display: none;">
    </form>
<?php else : ?>
    <?php if (!empty($userData['avatar'])) : ?>
        <img src="<?php echo $userData['avatar']; ?>" title="用户头像" alt="用户头像" class="img-thumbnail rounded-circle img-fluid" style="max-width: 100px;">
    <?php else : ?>
        <div class="rounded-circle bg-secondary text-light d-flex align-items-center justify-content-center" style="width: 100px; height: 100px; font-size: 60px;">
            <?php echo mb_strtoupper(mb_substr($userData['nickname'], 0, 1)); ?>
        </div>
    <?php endif; ?>
<?php endif; ?>

js:

代码语言:javascript
复制
<script>
    function uploadAvatar() {
        document.getElementById('avatarInput').click();
    }

    document.getElementById('avatarInput').addEventListener('change', function() {
        document.getElementById('avatarUploadForm').submit();
    });
</script>

是的,在这里后端我也用了yasuo.php用于压缩头像和修改成正方形。

现在整个权限来看逻辑就是对的,如果是普通用户访问别人的主页,如center.php?user_id=4,无法点击用户头像进行编辑,但是访问自己的页面center.php就可以编辑头像;管理员和创始人是可以访问任何人页面进行编辑头像的,因为管理员基本都是信得过的人,所以我没有加入管理员不能相互修改,甚至修改创始人头像的限制。

点击头像后可以直接上传头像
点击头像后可以直接上传头像

好了,今天的分享就到这里了,希望对大家有所帮助!

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图片处理
图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档